Skip to content

Commit 280438f

Browse files
committed
chore: longer parser category names
1 parent 212dc30 commit 280438f

File tree

1 file changed

+53
-50
lines changed

1 file changed

+53
-50
lines changed

ProofWidgets/Data/Html.lean

Lines changed: 53 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -44,20 +44,22 @@ inductive LayoutKind where
4444
namespace Jsx
4545
open Parser PrettyPrinter
4646

47-
declare_syntax_cat jsxElement
48-
declare_syntax_cat jsxChild
49-
declare_syntax_cat jsxAttr
50-
declare_syntax_cat jsxAttrVal
51-
52-
scoped syntax str : jsxAttrVal
47+
-- Verbose names to avoid conflicts with other packages that define HTML syntax
48+
-- (parser categories are not scoped).
49+
declare_syntax_cat proofWidgetsJsxElement
50+
declare_syntax_cat proofWidgetsJsxChild
51+
declare_syntax_cat proofWidgetsJsxAttr
52+
declare_syntax_cat proofWidgetsJsxAttrVal
53+
54+
scoped syntax str : proofWidgetsJsxAttrVal
5355
/-- Interpolates an expression into a JSX attribute literal. -/
54-
scoped syntax group("{" term "}") : jsxAttrVal
55-
scoped syntax ident "=" jsxAttrVal : jsxAttr
56+
scoped syntax group("{" term "}") : proofWidgetsJsxAttrVal
57+
scoped syntax ident "=" proofWidgetsJsxAttrVal : proofWidgetsJsxAttr
5658
/-- Interpolates a collection into a JSX attribute literal.
5759
For HTML tags, this should have type `Array (String × Json)`.
5860
For `ProofWidgets.Component`s, it can be any structure `$t` whatsoever:
5961
it is interpolated into the component's props using `{ $t with ... }` notation. -/
60-
scoped syntax group(" {..." term "}") : jsxAttr
62+
scoped syntax group(" {..." term "}") : proofWidgetsJsxAttr
6163

6264
/-- Characters not allowed inside JSX plain text. -/
6365
def jsxTextForbidden : String := "{<>}$"
@@ -66,7 +68,7 @@ def jsxText : Parser :=
6668
withAntiquot (mkAntiquot "jsxText" `ProofWidgets.Jsx.jsxText) {
6769
fn := fun c s =>
6870
let startPos := s.pos
69-
let s := takeWhile1Fn (not ∘ (fun c => jsxTextForbidden.contains c)) "expected JSX text" c s
71+
let s := takeWhile1Fn (fun c => !jsxTextForbidden.contains c) "expected JSX text" c s
7072
mkNodeToken `ProofWidgets.Jsx.jsxText startPos true c s }
7173

7274
def getJsxText : TSyntax ``jsxText → String
@@ -79,20 +81,21 @@ def jsxText.formatter : Formatter :=
7981
def jsxText.parenthesizer : Parenthesizer :=
8082
Parenthesizer.visitToken
8183

82-
scoped syntax "<" ident jsxAttr* "/>" : jsxElement
83-
scoped syntax "<" ident jsxAttr* ">" jsxChild* "</" ident ">" : jsxElement
84+
scoped syntax "<" ident proofWidgetsJsxAttr* "/>" : proofWidgetsJsxElement
85+
scoped syntax "<" ident proofWidgetsJsxAttr* ">" proofWidgetsJsxChild* "</" ident ">" :
86+
proofWidgetsJsxElement
8487

85-
scoped syntax jsxText : jsxChild
88+
scoped syntax jsxText : proofWidgetsJsxChild
8689
/-- Interpolates an array of elements into a JSX literal -/
87-
scoped syntax "{..." term "}" : jsxChild
90+
scoped syntax "{..." term "}" : proofWidgetsJsxChild
8891
/-- Interpolates an expression into a JSX literal -/
89-
scoped syntax "{" term "}" : jsxChild
90-
scoped syntax jsxElement : jsxChild
92+
scoped syntax "{" term "}" : proofWidgetsJsxChild
93+
scoped syntax proofWidgetsJsxElement : proofWidgetsJsxChild
9194

92-
scoped syntax:max jsxElement : term
95+
scoped syntax:max proofWidgetsJsxElement : term
9396

94-
def transformTag (tk : Syntax) (n m : Ident) (vs : Array (TSyntax `jsxAttr))
95-
(cs : Array (TSyntax `jsxChild)) : MacroM Term := do
97+
def transformTag (tk : Syntax) (n m : Ident) (vs : Array (TSyntax `proofWidgetsJsxAttr))
98+
(cs : Array (TSyntax `proofWidgetsJsxChild)) : MacroM Term := do
9699
let nId := n.getId.eraseMacroScopes
97100
let mId := m.getId.eraseMacroScopes
98101
if nId != mId then
@@ -105,22 +108,22 @@ def transformTag (tk : Syntax) (n m : Ident) (vs : Array (TSyntax `jsxAttr))
105108

106109
-- Whitespace appearing before the current child.
107110
let mut wsBefore := trailingWs tk
108-
-- This loop transforms (for example) `` `(jsxChild*| {a} text {...cs} {d})``
111+
-- This loop transforms (for example) `` `(proofWidgetsJsxChild*| {a} text {...cs} {d})``
109112
-- into ``children ← `(term| #[a, Html.text " text "] ++ cs ++ #[d])``.
110113
let mut csArrs := #[]
111114
let mut csArr := #[]
112115
for c in cs do
113116
match c with
114-
| `(jsxChild| $t:jsxText) =>
117+
| `(proofWidgetsJsxChild| $t:jsxText) =>
115118
csArr ← csArr.push <$> `(Html.text $(quote <| wsBefore ++ getJsxText t))
116119
wsBefore := ""
117-
| `(jsxChild| { $t }%$tk) =>
120+
| `(proofWidgetsJsxChild| { $t }%$tk) =>
118121
csArr := csArr.push t
119122
wsBefore := trailingWs tk
120-
| `(jsxChild| $e:jsxElement) =>
121-
csArr ← csArr.push <$> `(term| $e:jsxElement)
123+
| `(proofWidgetsJsxChild| $e:proofWidgetsJsxElement) =>
124+
csArr ← csArr.push <$> `(term| $e:proofWidgetsJsxElement)
122125
wsBefore := trailingWs e
123-
| `(jsxChild| {... $t }%$tk) =>
126+
| `(proofWidgetsJsxChild| {... $t }%$tk) =>
124127
if !csArr.isEmpty then
125128
csArrs ← csArrs.push <$> `(term| #[$csArr,*])
126129
csArr := #[]
@@ -132,9 +135,9 @@ def transformTag (tk : Syntax) (n m : Ident) (vs : Array (TSyntax `jsxAttr))
132135
let children ← joinArrays csArrs
133136

134137
let vs : Array ((Ident × Term) ⊕ Term) ← vs.mapM fun
135-
| `(jsxAttr| $attr:ident = $s:str) => Sum.inl <$> pure (attr, s)
136-
| `(jsxAttr| $attr:ident = { $t:term }) => Sum.inl <$> pure (attr, t)
137-
| `(jsxAttr| {... $t:term }) => Sum.inr <$> pure t
138+
| `(proofWidgetsJsxAttr| $attr:ident = $s:str) => Sum.inl <$> pure (attr, s)
139+
| `(proofWidgetsJsxAttr| $attr:ident = { $t:term }) => Sum.inl <$> pure (attr, t)
140+
| `(proofWidgetsJsxAttr| {... $t:term }) => Sum.inr <$> pure t
138141
| stx => Macro.throwErrorAt stx "unknown syntax"
139142
let tag := toString nId
140143

@@ -166,8 +169,8 @@ enabled using `open scoped ProofWidgets.Jsx`.
166169
Lowercase tags are interpreted as standard HTML
167170
whereas uppercase ones are expected to be `ProofWidgets.Component`s. -/
168171
macro_rules
169-
| `(<$n:ident $[$attrs:jsxAttr]* />%$tk) => transformTag tk n n attrs #[]
170-
| `(<$n:ident $[$attrs:jsxAttr]* >%$tk $cs*</$m>) => transformTag tk n m attrs cs
172+
| `(<$n:ident $[$attrs:proofWidgetsJsxAttr]* />%$tk) => transformTag tk n n attrs #[]
173+
| `(<$n:ident $[$attrs:proofWidgetsJsxAttr]* >%$tk $cs*</$m>) => transformTag tk n m attrs cs
171174

172175
section delaborator
173176

@@ -185,7 +188,7 @@ partial def delabHtmlText : DelabM (TSyntax ``jsxText) := do
185188

186189
mutual
187190

188-
partial def delabHtmlElement' : DelabM (TSyntax `jsxElement) := do
191+
partial def delabHtmlElement' : DelabM (TSyntax `proofWidgetsJsxElement) := do
189192
let_expr Html.element tag _attrs _children := ← getExpr | failure
190193

191194
let .lit (.strVal s) := tag | failure
@@ -207,21 +210,21 @@ partial def delabHtmlElement' : DelabM (TSyntax `jsxElement) := do
207210
| .app (.const ``Json.str _) (.lit (.strVal v)) =>
208211
-- TODO: this annotation doesn't seem to work in infoview
209212
let val ← annotateTermLikeInfo <| Syntax.mkStrLit v
210-
`(jsxAttr| $attr:ident=$val:str)
213+
`(proofWidgetsJsxAttr| $attr:ident=$val:str)
211214
| _ =>
212215
let val ← delab
213-
`(jsxAttr| $attr:ident={ $val })
216+
`(proofWidgetsJsxAttr| $attr:ident={ $val })
214217
catch _ =>
215218
let vs ← delab
216-
return #[← `(jsxAttr| {... $vs })]
219+
return #[← `(proofWidgetsJsxAttr| {... $vs })]
217220

218221
let children ← withAppArg delabJsxChildren
219222
if children.isEmpty then
220-
`(jsxElement| < $tag $[$attrs]* />)
223+
`(proofWidgetsJsxElement| < $tag $[$attrs]* />)
221224
else
222-
`(jsxElement| < $tag $[$attrs]* > $[$children]* </ $tag >)
225+
`(proofWidgetsJsxElement| < $tag $[$attrs]* > $[$children]* </ $tag >)
223226

224-
partial def delabHtmlOfComponent' : DelabM (TSyntax `jsxElement) := do
227+
partial def delabHtmlOfComponent' : DelabM (TSyntax `proofWidgetsJsxElement) := do
225228
let_expr Html.ofComponent _Props _inst _c _props _children := ← getExpr | failure
226229
let c ← withNaryArg 2 delab
227230
unless c.raw.isIdent do failure
@@ -230,38 +233,38 @@ partial def delabHtmlOfComponent' : DelabM (TSyntax `jsxElement) := do
230233
-- TODO: handle `Props` that do not delaborate to `{ }`, such as `Prod`, by parsing the `Expr`
231234
-- instead.
232235
let attrDelab ← withNaryArg 3 delab
233-
let attrs : Array (TSyntax `jsxAttr) ← do
236+
let attrs : Array (TSyntax `proofWidgetsJsxAttr) ← do
234237
let `(term| { $[$ns:ident := $vs],* } ) := attrDelab |
235-
pure #[← `(jsxAttr| {...$attrDelab})]
238+
pure #[← `(proofWidgetsJsxAttr| {...$attrDelab})]
236239
ns.zip vs |>.mapM fun (n, v) => do
237-
`(jsxAttr| $n:ident={ $v })
240+
`(proofWidgetsJsxAttr| $n:ident={ $v })
238241
let children ← withNaryArg 4 delabJsxChildren
239242
if children.isEmpty then
240-
`(jsxElement| < $tag $[$attrs]* />)
243+
`(proofWidgetsJsxElement| < $tag $[$attrs]* />)
241244
else
242-
`(jsxElement| < $tag $[$attrs]* > $[$children]* </ $tag >)
245+
`(proofWidgetsJsxElement| < $tag $[$attrs]* > $[$children]* </ $tag >)
243246

244-
partial def delabJsxChildren : DelabM (Array (TSyntax `jsxChild)) := do
247+
partial def delabJsxChildren : DelabM (Array (TSyntax `proofWidgetsJsxChild)) := do
245248
try
246249
delabArrayLiteral (withAnnotateTermLikeInfo do
247250
try
248251
match_expr ← getExpr with
249252
| Html.text _ =>
250253
let html ← delabHtmlText
251-
return ← `(jsxChild| $html:jsxText)
254+
return ← `(proofWidgetsJsxChild| $html:jsxText)
252255
| Html.element _ _ _ =>
253256
let html ← delabHtmlElement'
254-
return ← `(jsxChild| $html:jsxElement)
257+
return ← `(proofWidgetsJsxChild| $html:proofWidgetsJsxElement)
255258
| Html.ofComponent _ _ _ _ _ =>
256259
let comp ← delabHtmlOfComponent'
257-
return ← `(jsxChild| $comp:jsxElement)
260+
return ← `(proofWidgetsJsxChild| $comp:proofWidgetsJsxElement)
258261
| _ => failure
259262
catch _ =>
260263
let fallback ← delab
261-
return ← `(jsxChild| { $fallback }))
264+
return ← `(proofWidgetsJsxChild| { $fallback }))
262265
catch _ =>
263266
let vs ← delab
264-
return #[← `(jsxChild| {... $vs })]
267+
return #[← `(proofWidgetsJsxChild| {... $vs })]
265268

266269
end
267270

@@ -270,12 +273,12 @@ end
270273
@[delab app.ProofWidgets.Html.element]
271274
def delabHtmlElement : Delab := do
272275
let t ← delabHtmlElement'
273-
`(term| $t:jsxElement)
276+
`(term| $t:proofWidgetsJsxElement)
274277

275278
@[delab app.ProofWidgets.Html.ofComponent]
276279
def delabHtmlOfComponent : Delab := do
277280
let t ← delabHtmlOfComponent'
278-
`(term| $t:jsxElement)
281+
`(term| $t:proofWidgetsJsxElement)
279282

280283
end delaborator
281284

0 commit comments

Comments
 (0)