fix: cdot parser error message range (#4528)

as #4527 describes there is inconsistency between `by`, `case` and
`next` on the one hand who, if the goal isn’t closed, put squiggly
underlines on the first line, and `.`, which so far only squiggled the
dot (which is a very short symbol!)

With this change the same mechanism as used by `case`, namely
`withCaseRef`, is also used for `.`.

There is an argument for the status quo: The `.` tactic is more commonly
used
with further tactics on the same line, and thus there is now a higher
risk that
the user might think that the first tactic is broken. But 

* the same argument does apply to `by` and `case` where there was an
intentional
  choice to do it this way
* consistency and
* a squiggly line just under the short `.` is easy to miss, so it is
actually
better to underlining more here (at least until we have a better way to
  indicate incomplete proofs, which I have hopes for)

Fixes #4527, at least most of it.
This commit is contained in:
Joachim Breitner 2024-06-21 17:06:07 +02:00 committed by GitHub
parent 84e46162b5
commit 073b2cfc83
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 21 additions and 6 deletions

View file

@ -199,7 +199,7 @@ def evalTacticCDot : Tactic := fun stx => do
-- but the token antiquotation does not copy trailing whitespace, leading to
-- differences in the goal display (#2153)
let initInfo ← mkInitialTacticInfo stx[0]
withRef stx[0] <| closeUsingOrAdmit do
withCaseRef stx[0] stx[1] <| closeUsingOrAdmit do
-- save state before/after entering focus on `·`
withInfoContext (pure ()) initInfo
Term.withNarrowedArgTacticReuse (argIdx := 1) evalTactic stx

View file

@ -0,0 +1,5 @@
example : True := by
. skip
--^ collectDiagnostics
skip
-- foo

View file

@ -0,0 +1,10 @@
{"version": 1,
"uri": "file:///issue4527.lean",
"diagnostics":
[{"source": "Lean 4",
"severity": 1,
"range":
{"start": {"line": 1, "character": 2}, "end": {"line": 2, "character": 0}},
"message": "unsolved goals\n⊢ True",
"fullRange":
{"start": {"line": 1, "character": 2}, "end": {"line": 3, "character": 8}}}]}

View file

@ -9,12 +9,12 @@ h : Type
case a
⊢ Type
refineFiltersOldMVars.lean:66:4-66:11: error: no goals to be solved
refineFiltersOldMVars.lean:101:2-101:3: error: unsolved goals
refineFiltersOldMVars.lean:101:2-101:13: error: unsolved goals
case d
⊢ Bool
refineFiltersOldMVars.lean:102:2-102:3: error: unsolved goals
refineFiltersOldMVars.lean:102:2-102:13: error: unsolved goals
case e
⊢ Nat
refineFiltersOldMVars.lean:109:2-109:3: error: unsolved goals
refineFiltersOldMVars.lean:109:2-109:13: error: unsolved goals
case e
⊢ Bool

View file

@ -32,13 +32,13 @@ p q r : Prop
h2 : p → q
h✝ : q
⊢ q
tacUnsolvedGoalsErrors.lean:26:2-26:3: error: unsolved goals
tacUnsolvedGoalsErrors.lean:26:2-27:8: error: unsolved goals
case inl
p q r : Prop
h2 : p → q
h✝ : p
⊢ q
tacUnsolvedGoalsErrors.lean:28:2-28:3: error: unsolved goals
tacUnsolvedGoalsErrors.lean:28:2-29:8: error: unsolved goals
case inr
p q r : Prop
h2 : p → q