Skip to content

Commit fecfd30

Browse files
feat: support docstrings/hovers for sorts (#79)
This allows hovers to pop up for Sort, Type, and Prop.
1 parent 3b784b7 commit fecfd30

File tree

2 files changed

+56
-13
lines changed

2 files changed

+56
-13
lines changed

src/highlighting/SubVerso/Highlighting/Code.lean

+14-8
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ partial def Token.Kind.priority : Token.Kind → Nat
3333
| .const .. => 5
3434
| .anonCtor .. => 6
3535
| .option .. => 4
36-
| .sort => 4
36+
| .sort .. => 4
3737
| .keyword _ _ _ => 3
3838
| .docComment | .withType .. => 1
3939
| .unknown => 0
@@ -154,7 +154,7 @@ where
154154
go more
155155

156156
def exprKind [Monad m] [MonadLiftT IO m] [MonadMCtx m] [MonadEnv m]
157-
(ci : ContextInfo) (lctx : LocalContext) (expr : Expr)
157+
(ci : ContextInfo) (lctx : LocalContext) (stx? : Option Syntax) (expr : Expr)
158158
(allowUnknownTyped : Bool := false)
159159
: ReaderT Context m (Option Token.Kind) := do
160160
let runMeta {α} (act : MetaM α) (lctx := lctx) : m α := ci.runMetaM lctx act
@@ -190,7 +190,13 @@ def exprKind [Monad m] [MonadLiftT IO m] [MonadMCtx m] [MonadEnv m]
190190

191191
let sig ← ppSig name
192192
return some <| .const name sig docs false
193-
| Expr.sort .. => return some .sort
193+
| Expr.sort u =>
194+
if let some stx := stx? then
195+
let k := stx.getKind
196+
dbg_trace stx
197+
let docs? ← findDocString? (← getEnv) k
198+
return some (.sort u docs?)
199+
else return some (.sort u none)
194200
| Expr.lit (.strVal s) => return some <| .str s
195201
| Expr.mdata _ e =>
196202
findKind e
@@ -228,7 +234,7 @@ def isDefinition [Monad m] [MonadEnv m] [MonadLiftT IO m] [MonadFileMap m] (name
228234
def termInfoKind [Monad m] [MonadLiftT IO m] [MonadMCtx m] [MonadEnv m] [MonadFileMap m]
229235
(ci : ContextInfo) (termInfo : TermInfo) (allowUnknownTyped : Bool := false)
230236
: ReaderT Context m (Option Token.Kind) := do
231-
let k ← exprKind ci termInfo.lctx termInfo.expr (allowUnknownTyped := allowUnknownTyped)
237+
let k ← exprKind ci termInfo.lctx termInfo.stx termInfo.expr (allowUnknownTyped := allowUnknownTyped)
232238
if (← read).definitionsPossible then
233239
if let some (.const name sig docs _isDef) := k then
234240
(some ∘ .const name sig docs) <$> (fun _ctxt => isDefinition name termInfo.stx)
@@ -660,11 +666,11 @@ def highlightGoals
660666
if decl.isAuxDecl || decl.isImplementationDetail then continue
661667
match decl with
662668
| .cdecl _index fvar name type _ _ =>
663-
let nk ← exprKind ci lctx (.fvar fvar)
669+
let nk ← exprKind ci lctx none (.fvar fvar)
664670
let tyStr ← renderTagged none (← runMeta (ppExprTagged =<< instantiateMVars type))
665671
hyps := hyps.push (name, nk.getD .unknown, tyStr)
666672
| .ldecl _index fvar name type val _ _ =>
667-
let nk ← exprKind ci lctx (.fvar fvar)
673+
let nk ← exprKind ci lctx none (.fvar fvar)
668674
let tyDoc ← runMeta (ppExprTagged =<< instantiateMVars type)
669675
let valDoc ← runMeta (ppExprTagged =<< instantiateMVars val)
670676
let tyValStr ← renderTagged none <| .append <| #[tyDoc].append <|
@@ -819,9 +825,9 @@ partial def highlight'
819825
| some (n, _) => findDocString? (← getEnv) n
820826
let name := lookingAt.map (·.1)
821827
let occ := lookingAt.map fun (n, pos) => s!"{n}-{pos}"
822-
if let .sort ← identKind trees ⟨stx⟩ then
828+
if let .sort u docs? ← identKind trees ⟨stx⟩ then
823829
withTraceNode `SubVerso.Highlighting.Code (fun _ => pure m!"Sort") do
824-
emitToken i ⟨.sort, x⟩
830+
emitToken i ⟨.sort u docs?, x⟩
825831
return
826832
else
827833
emitToken i <| (⟨ ·, x⟩) <|

src/highlighting/SubVerso/Highlighting/Highlighted.lean

+42-5
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,31 @@ private def altNameUnJson (json : Json) : Except String Name := do
3535
| other => .error s!"Expected a string or number as a name component, got '{other}'"
3636
pure n
3737

38-
private local instance : ToJson Name := ⟨altNameJson⟩
39-
private local instance : FromJson Name := ⟨altNameUnJson⟩
38+
private local instance nameToJson : ToJson Name := ⟨altNameJson⟩
39+
private local instance nameFromJson : FromJson Name := ⟨altNameUnJson⟩
4040

41+
private partial local instance : ToJson Level where
42+
toJson := go
43+
where
44+
go
45+
| .zero => .arr #["zero"]
46+
| .succ l => .arr #["succ", go l]
47+
| .param n => .arr #["param", nameToJson.toJson n]
48+
| .max l l' => .arr #["max", go l, go l']
49+
| .imax l l' => .arr #["imax", go l, go l']
50+
| .mvar ⟨m⟩ => .arr #["mvar", nameToJson.toJson m]
51+
52+
private partial local instance : FromJson Level where
53+
fromJson? v := go v
54+
where
55+
go
56+
| .arr #["zero"] => pure .zero
57+
| .arr #["succ", l] => .succ <$> go l
58+
| .arr #["param", n] => .param <$> nameFromJson.fromJson? n
59+
| .arr #["max", l, l'] => .max <$> go l <*> go l'
60+
| .arr #["imax", l, l'] => .imax <$> go l <*> go l'
61+
| .arr #["mvar", m] => (.mvar ⟨·⟩) <$> nameFromJson.fromJson? m
62+
| other => throw s!"Failed to decode {other} as a level"
4163

4264
inductive Token.Kind where
4365
| /-- `occurrence` is a unique identifier that unites the various keyword tokens from a given production -/
@@ -48,15 +70,30 @@ inductive Token.Kind where
4870
| str (string : String)
4971
| option (name : Name) (declName : Name) (docs : Option String)
5072
| docComment
51-
| sort
73+
| sort (level : Level) (doc? : Option String)
5274
| /-- The token represents some otherwise-undescribed Expr whose type is known -/
5375
withType (type : String)
5476
| unknown
5577
deriving Repr, Inhabited, BEq, Hashable, ToJson, FromJson
5678

79+
open Lean.Syntax in
80+
instance : Quote LevelMVarId where
81+
quote | ⟨m⟩ => mkCApp ``LevelMVarId.mk #[quote m]
82+
83+
open Lean.Syntax in
84+
private partial def quoteLevel : Level → Term
85+
| .zero => mkCApp ``Level.zero #[]
86+
| .succ l => mkCApp ``Level.succ #[quoteLevel l]
87+
| .param n => mkCApp ``Level.param #[quote n]
88+
| .max l l' => mkCApp ``Level.max #[quoteLevel l, quoteLevel l']
89+
| .imax l l' => mkCApp ``Level.imax #[quoteLevel l, quoteLevel l']
90+
| .mvar mv => mkCApp ``Level.mvar #[quote mv]
91+
92+
instance : Quote Level := ⟨quoteLevel⟩
93+
5794
open Token.Kind in
5895
open Syntax (mkCApp) in
59-
instance : Quote Token.Kind where
96+
partial instance : Quote Token.Kind where
6097
quote
6198
| .keyword n occ docs => mkCApp ``keyword #[quote n, quote occ, quote docs]
6299
| .const n sig docs isDef => mkCApp ``const #[quote n, quote sig, quote docs, quote isDef]
@@ -65,7 +102,7 @@ instance : Quote Token.Kind where
65102
| .var (.mk n) type => mkCApp ``var #[mkCApp ``FVarId.mk #[quote n], quote type]
66103
| .str s => mkCApp ``str #[quote s]
67104
| .docComment => mkCApp ``docComment #[]
68-
| .sort => mkCApp ``sort #[]
105+
| .sort l doc? => mkCApp ``sort #[quote l, quote doc?]
69106
| .withType t => mkCApp ``withType #[quote t]
70107
| .unknown => mkCApp ``unknown #[]
71108

0 commit comments

Comments
 (0)