This PR adjusts the "try this" widget to be rendered as a widget message under 'Messages', not a separate widget under a 'Suggestions' section. The main benefit of this is that the message of the widget is not duplicated between 'Messages' and 'Suggestions'. Since widget message suggestions were already implemented by @jrr6 for the new hint infrastructure, this PR replaces the old "try this" implementation with the new hint infrastructure. In doing so, the `style?` field of suggestions is deprecated, since the hint infrastructure highlights hints using diff colors, and `style?` also never saw much use downstream. Additionally, since the message and the suggestion are now the same component, the `messageData?` field of suggestions is deprecated as well. Notably, the "Try this:" message string now also contains a newline and indentation to separate the suggestion from the rest of the message more clearly and the `postInfo?` field of the suggestion is now part of the message. Finally, this PR changes the diff colors used by the hint infrastructure to be more color-blindness-friendly (insertions are now blue, not green, and text that remains unchanged is now using the editor foreground color instead of blue). ### Breaking changes Tests that use `#guard_msgs` to test the "Try this:" message may need to be adjusted for the new formatting of the message.
119 lines
2.4 KiB
Text
119 lines
2.4 KiB
Text
/-!
|
||
# Improve zeta-delta tracking for `simp?`
|
||
|
||
https://github.com/leanprover/lean4/issues/6655 reports issues with `simp?` where
|
||
it would over-report local variables. This comes down to two kinds of issues:
|
||
- zeta-delta tracking wasn't being reset, so previous `simp?`s would contribute variables
|
||
- `simp?` would report variables that weren't explicitly mentioned,
|
||
because `whnf` would be run with different configurations during the tracking.
|
||
(e.g. `withInferTypeConfig` enables `zetaDelta`.)
|
||
|
||
This file tests that it resets the tracking and filters the list.
|
||
-/
|
||
|
||
set_option linter.unusedSimpArgs false
|
||
|
||
/-!
|
||
Example from #6655. This used to suggest `simp only [e, d]`.
|
||
-/
|
||
/--
|
||
info: Try this:
|
||
simp only [e]
|
||
---
|
||
trace: α : Type
|
||
c : α → α
|
||
x : α
|
||
d : α → α := c
|
||
e : α → α := d
|
||
⊢ d x = x
|
||
---
|
||
warning: declaration uses 'sorry'
|
||
-/
|
||
#guard_msgs in
|
||
example {α : Type} (c : α → α) (x : α) : c x = x := by
|
||
let d := c
|
||
let e := d
|
||
change e x = x
|
||
simp? [e]
|
||
trace_state
|
||
sorry
|
||
|
||
/-!
|
||
Example from #6655. This used to suggest `simp only [d]`.
|
||
-/
|
||
/--
|
||
info: Try this:
|
||
simp only
|
||
---
|
||
warning: declaration uses 'sorry'
|
||
-/
|
||
#guard_msgs in
|
||
example {α : Type} (c : α → α) (x : α) : c x = x := by
|
||
let d := c
|
||
change d x = x
|
||
simp [d]
|
||
have : x = x := by
|
||
simp?
|
||
sorry
|
||
|
||
/-!
|
||
Example from comments of #6655. This used to suggest `simp only [Int.add_sub_cancel, p]`.
|
||
(N.B. the goal at that point does not have `p` in it!)
|
||
-/
|
||
/--
|
||
info: Try this:
|
||
simp only [Int.add_sub_cancel]
|
||
-/
|
||
#guard_msgs in
|
||
example (a b : Int) : a + b - b = a := by
|
||
let p := 1
|
||
have h : p = 1 := by
|
||
simp only [p]
|
||
simp?
|
||
|
||
/-!
|
||
Example from https://github.com/leanprover/lean4/pull/7539 by JovanGerb.
|
||
This used to suggest `simp only [a, b] ` and `simp only [a, b]`
|
||
-/
|
||
/--
|
||
info: Try this:
|
||
simp only [a]
|
||
---
|
||
info: Try this:
|
||
simp only
|
||
-/
|
||
#guard_msgs in
|
||
example : True := by
|
||
let a := 1
|
||
let b := 2
|
||
have : b = 2 := by simp [a,b]
|
||
have : a = 1 := by simp? [a]
|
||
have : 1 = 1 := by simp?
|
||
trivial
|
||
|
||
/-!
|
||
Test that there is still a deficiency. This should say `simp only [e]`.
|
||
-/
|
||
/--
|
||
info: Try this:
|
||
simp only [e, c]
|
||
---
|
||
trace: α : Type
|
||
b : α → α
|
||
x : α
|
||
c : α → α := b
|
||
d : α → α := c
|
||
e : α → α := d
|
||
⊢ d x = x
|
||
---
|
||
warning: declaration uses 'sorry'
|
||
-/
|
||
#guard_msgs in
|
||
example {α : Type} (b : α → α) (x : α) : b x = x := by
|
||
let c := b
|
||
let d := c
|
||
let e := d
|
||
change e x = x
|
||
simp? [e, c]
|
||
trace_state
|
||
sorry
|