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
35 lines
1,017 B
Text
35 lines
1,017 B
Text
set_option linter.unusedSimpArgs false
|
||
|
||
variable (n v₁ v₂) (hv₁: v₁ < n + 1) (hv₂: v₂ < n + 1)
|
||
|
||
theorem foo (_: ¬ Fin.mk v₂ hv₂ = Fin.mk v₁ hv₁ ): True := trivial
|
||
|
||
/--
|
||
trace: [Meta.Tactic.simp.unify] eq_self:1000, failed to unify
|
||
?a = ?a
|
||
with
|
||
⟨v₂, hv₂⟩ = ⟨v₁, hv₁⟩
|
||
[Meta.Tactic.simp.rewrite] Fin.mk.injEq:1000:
|
||
⟨v₂, hv₂⟩ = ⟨v₁, hv₁⟩
|
||
==>
|
||
v₂ = v₁
|
||
[Meta.Tactic.simp.unify] eq_self:1000, failed to unify
|
||
?a = ?a
|
||
with
|
||
v₂ = v₁
|
||
[Meta.Tactic.simp.discharge] Nat.ne_of_gt discharge ✅️
|
||
v₁ < v₂
|
||
[Meta.Tactic.simp.rewrite] hv:1000:
|
||
v₁ < v₂
|
||
==>
|
||
True
|
||
[Meta.Tactic.simp.rewrite] Nat.ne_of_gt:1000:
|
||
v₂ = v₁
|
||
==>
|
||
False
|
||
-/
|
||
#guard_msgs in
|
||
set_option trace.Meta.Tactic.simp true in
|
||
example (hv: v₁ < v₂) : True := foo n v₁ v₂ ‹_› ‹_› (by simp (config := { decide := true }) only [hv, Fin.mk.injEq, Nat.ne_of_gt, Nat.lt_succ_iff])
|
||
|
||
#check Fin.mk.injEq
|