@@ -520,51 +520,57 @@ def mkSorry (type : Expr) (synthetic : Bool) : MetaM Expr := do
520
520
let u ← getLevel type
521
521
return mkApp2 (mkConst ``sorryAx [u]) type (toExpr synthetic)
522
522
523
- structure UniqueSorryView where
524
- module? : Option Name := none
525
- range? : Option Lsp.Range := none
523
+ structure SorryLabelView where
524
+ module? : Option (Name × Lsp.Range) := none
526
525
527
- def UniqueSorryView.encode (view : UniqueSorryView) : CoreM Name :=
528
- let name := view.module?.getD .anonymous
526
+ def SorryLabelView.encode (view : SorryLabelView) : CoreM Name :=
529
527
let name :=
530
- if let some range := view.range ? then
531
- name |>.num range.start.line |>.num range.start.character |>.num range.end.line |>.num range.end.character
528
+ if let some (mod, range) := view.module ? then
529
+ mod |>.num range.start.line |>.num range.start.character |>.num range.end.line |>.num range.end.character
532
530
else
533
- name
531
+ .anonymous
534
532
mkFreshUserName (name.str "_unique_sorry" )
535
533
536
- def UniqueSorryView .decode? (name : Name) : Option UniqueSorryView := do
534
+ def SorryLabelView .decode? (name : Name) : Option SorryLabelView := do
537
535
guard <| name.hasMacroScopes
538
536
let .str name "_unique_sorry" := name.eraseMacroScopes | failure
539
537
if let .num (.num (.num (.num name startLine) startChar) endLine) endChar := name then
540
- return { module? := name, range? := some ⟨⟨startLine, startChar⟩, ⟨endLine, endChar⟩⟩ }
541
- else if name.isAnonymous then
542
- return { module? := none, range? := none }
538
+ return { module? := some (name, ⟨⟨startLine, startChar⟩, ⟨endLine, endChar⟩⟩) }
543
539
else
544
540
failure
545
541
546
542
/--
547
- Makes a `sorryAx` that is unique, in the sense that it is not defeq to any other `sorry` created by `mkUniqueSorry`.
548
-
549
- Encodes the source position of the current ref into the term.
543
+ Makes a `sorryAx` that encodes the current ref into the term to support "go to definition" for the `sorry`.
544
+ If `unique` is true, the `sorry` is unique, in the sense that it is not defeq to any other `sorry` created by `mkLabeledSorry`.
550
545
-/
551
- def mkUniqueSorry (type : Expr) (synthetic : Bool) : MetaM Expr := do
546
+ def mkLabeledSorry (type : Expr) (synthetic : Bool) (unique : Bool) : MetaM Expr := do
552
547
let tag ←
553
548
if let (some pos, some endPos) := ((← getRef).getPos?, (← getRef).getTailPos?) then
554
549
let range := (← getFileMap).utf8RangeToLspRange ⟨pos, endPos⟩
555
- UniqueSorryView .encode { module? := (← getMainModule) , range? := range }
550
+ SorryLabelView .encode { module? := (← getMainModule, range) }
556
551
else
557
- UniqueSorryView.encode {}
558
- let e ← mkSorry (mkForall `tag .default (mkConst ``Lean.Name) type) synthetic
559
- return .app e (toExpr tag)
552
+ SorryLabelView.encode {}
553
+ if unique then
554
+ let e ← mkSorry (mkForall `tag .default (mkConst ``Lean.Name) type) synthetic
555
+ return .app e (toExpr tag)
556
+ else
557
+ let e ← mkSorry (mkForall `tag .default (mkConst ``Unit) type) synthetic
558
+ return .app e (mkApp4 (mkConst ``Function.const [levelOne, levelOne])
559
+ (mkConst ``Unit) (mkConst ``Lean.Name) (mkConst ``Unit.unit) (toExpr tag))
560
560
561
561
/--
562
- Returns a `UniqueSorryView ` if `e` is an application of an expression returned by `mkUniqueSorry `.
562
+ Returns a `SorryLabelView ` if `e` is an application of an expression returned by `mkLabeledSorry `.
563
563
-/
564
- def isUniqueSorry ? (e : Expr) : Option UniqueSorryView := do
564
+ def isLabeledSorry ? (e : Expr) : Option SorryLabelView := do
565
565
guard <| e.isAppOf ``sorryAx && e.getAppNumArgs ≥ 3
566
- let some tag := (e.getArg! 2 ).name? | failure
567
- UniqueSorryView.decode? tag
566
+ let arg := e.getArg! 2
567
+ if let some tag := arg.name? then
568
+ SorryLabelView.decode? tag
569
+ else
570
+ guard <| arg.isAppOfArity ``Function.const 4
571
+ guard <| arg.appFn!.appArg!.isAppOfArity ``Unit.unit 0
572
+ let some tag := arg.appArg!.name? | failure
573
+ SorryLabelView.decode? tag
568
574
569
575
/-- Return `Decidable.decide p` -/
570
576
def mkDecide (p : Expr) : MetaM Expr :=
0 commit comments