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
40 lines
874 B
Text
40 lines
874 B
Text
set_option linter.unusedSimpArgs false
|
|
|
|
/-!
|
|
Checks that `simp` removes the `binderNameHint` in the pre-phase, and does not spend time looking
|
|
at its arguments.
|
|
|
|
The following traces should show no rewriting of `x` or `y`, only `z`.
|
|
-/
|
|
|
|
def x : Nat := 0
|
|
def y : Nat := 0
|
|
def z : Nat := 0
|
|
|
|
set_option trace.Meta.Tactic.simp.rewrite true
|
|
|
|
/--
|
|
trace: [Meta.Tactic.simp.rewrite] ↓ binderNameHint.eq_1:1000:
|
|
binderNameHint x y z
|
|
==>
|
|
z
|
|
[Meta.Tactic.simp.rewrite] unfold z, z ==> 0
|
|
[Meta.Tactic.simp.rewrite] eq_self:1000:
|
|
0 = 0
|
|
==>
|
|
True
|
|
-/
|
|
#guard_msgs in
|
|
example : binderNameHint x y z = 0 := by
|
|
simp [x, y, z]
|
|
|
|
/--
|
|
trace: [Meta.Tactic.simp.rewrite] ↓ binderNameHint.eq_1:1000:
|
|
binderNameHint x y z
|
|
==>
|
|
z
|
|
[Meta.Tactic.simp.rewrite] unfold z, z ==> 0
|
|
-/
|
|
#guard_msgs in
|
|
example : binderNameHint x y z = 0 := by
|
|
dsimp [x, y, z]
|