This PR adds a linter (`linter.unusedSimpArgs`) that complains when a simp argument (`simp [foo]`) is unused. It should do the right thing if the `simp` invocation is run multiple times, e.g. inside `all_goals`. It does not trigger when the `simp` call is inside a macro. The linter message contains a clickable hint to remove the simp argument. I chose to display a separate warning for each unused argument. This means that the user has to click multiple times to remove all of them (and wait for re-elaboration in between). But this just means multiple endorphine kicks, and the main benefit over a single warning that would have to span the whole argument list is that already the squigglies tell the users about unused arguments. This closes #4483. Making Init and Std clean wrt to this linter revealed close to 1000 unused simp args, a pleasant experience for anyone enjoying tidying things: #8905
20 lines
490 B
Text
20 lines
490 B
Text
def foo: {n: Nat} → Fin n → Nat
|
|
| 0, _ => 0
|
|
| n+1, _ => 0
|
|
|
|
-- Local copy to make test more robust against staging issues
|
|
@[simp] theorem Nat.succ_eq_add_one' (n : Nat) : succ n = n + 1 :=
|
|
rfl
|
|
|
|
theorem t3 {f: Fin (n+1)}:
|
|
foo f = 0 := by
|
|
dsimp only [←Nat.succ_eq_add_one' n] at f -- use `dsimp` to ensure we don't copy `f`
|
|
trace_state
|
|
simp only [foo]
|
|
|
|
example {n: Nat} {f: Fin (n+1)}:
|
|
foo f = 0 := by
|
|
revert f
|
|
rw[←Nat.succ_eq_add_one' n]
|
|
intro f
|
|
simp only [foo]
|