@@ -35,9 +35,31 @@ private def altNameUnJson (json : Json) : Except String Name := do
35
35
| other => .error s! "Expected a string or number as a name component, got '{ other} '"
36
36
pure n
37
37
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⟩
40
40
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"
41
63
42
64
inductive Token.Kind where
43
65
| /-- `occurrence` is a unique identifier that unites the various keyword tokens from a given production -/
@@ -48,15 +70,30 @@ inductive Token.Kind where
48
70
| str (string : String)
49
71
| option (name : Name) (declName : Name) (docs : Option String)
50
72
| docComment
51
- | sort
73
+ | sort (level : Level) (doc? : Option String)
52
74
| /-- The token represents some otherwise-undescribed Expr whose type is known -/
53
75
withType (type : String)
54
76
| unknown
55
77
deriving Repr, Inhabited, BEq, Hashable, ToJson, FromJson
56
78
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
+
57
94
open Token.Kind in
58
95
open Syntax (mkCApp) in
59
- instance : Quote Token.Kind where
96
+ partial instance : Quote Token.Kind where
60
97
quote
61
98
| .keyword n occ docs => mkCApp ``keyword #[quote n, quote occ, quote docs]
62
99
| .const n sig docs isDef => mkCApp ``const #[quote n, quote sig, quote docs, quote isDef]
@@ -65,7 +102,7 @@ instance : Quote Token.Kind where
65
102
| .var (.mk n) type => mkCApp ``var #[mkCApp ``FVarId.mk #[quote n], quote type]
66
103
| .str s => mkCApp ``str #[quote s]
67
104
| .docComment => mkCApp ``docComment #[]
68
- | .sort => mkCApp ``sort #[]
105
+ | .sort l doc? => mkCApp ``sort #[quote l, quote doc? ]
69
106
| .withType t => mkCApp ``withType #[quote t]
70
107
| .unknown => mkCApp ``unknown #[]
71
108
0 commit comments