lezer-wesl 0.6.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,193 @@
1
+ import { styleTags, tags } from "@lezer/highlight";
2
+ import { ExternalTokenizer, LRParser } from "@lezer/lr";
3
+ import { WeslStream, stdFns, stdTypes } from "wesl";
4
+
5
+ //#region src/Highlight.ts
6
+ /** Syntax highlighting for WESL */
7
+ const weslHighlighting = styleTags({
8
+ Number: tags.number,
9
+ Boolean: tags.bool,
10
+ LineComment: tags.lineComment,
11
+ BlockComment: tags.blockComment,
12
+ Import: tags.keyword,
13
+ "import as": tags.keyword,
14
+ "FunctionDeclaration/Kw": tags.controlKeyword,
15
+ "IfStatement/Kw": tags.controlKeyword,
16
+ "SwitchStatement/Kw": tags.controlKeyword,
17
+ "SwitchClause/Kw": tags.controlKeyword,
18
+ "LoopStatement/Kw": tags.controlKeyword,
19
+ "LoopBlock/Kw": tags.controlKeyword,
20
+ "ForStatement/Kw": tags.controlKeyword,
21
+ "WhileStatement/Kw": tags.controlKeyword,
22
+ "Statement/Kw": tags.controlKeyword,
23
+ "GlobalVariableDeclaration/Kw": tags.definitionKeyword,
24
+ "GlobalValueDeclaration/Kw": tags.definitionKeyword,
25
+ "VarStatement/Kw": tags.definitionKeyword,
26
+ "StructDeclaration/Kw": tags.definitionKeyword,
27
+ "TypeAliasDeclaration/Kw": tags.definitionKeyword,
28
+ "DiagnosticDirective/Kw": tags.keyword,
29
+ "EnableDirective/Kw": tags.keyword,
30
+ "RequiresDirective/Kw": tags.keyword,
31
+ "ConstAssert/Kw": tags.keyword,
32
+ "TypeOrExpr/Kw": tags.keyword,
33
+ BuiltinType: tags.keyword,
34
+ BuiltinFn: tags.keyword,
35
+ Identifier: tags.variableName,
36
+ "Type/Identifier": tags.typeName,
37
+ "TypeOrExpr/Identifier": tags.typeName,
38
+ "FunctionDeclaration/Identifier": tags.function(tags.definition(tags.variableName)),
39
+ "StructDeclaration/Identifier": tags.definition(tags.typeName),
40
+ "Param/Identifier": tags.definition(tags.variableName),
41
+ "StructMember/Identifier": tags.propertyName,
42
+ "VarStatement/Identifier": tags.definition(tags.variableName),
43
+ "GlobalVariableDeclaration/Identifier": tags.definition(tags.variableName),
44
+ "GlobalValueDeclaration/Identifier": tags.definition(tags.variableName),
45
+ "FunctionDeclaration/BuiltinFn": tags.function(tags.definition(tags.variableName)),
46
+ "StructDeclaration/BuiltinFn": tags.definition(tags.typeName),
47
+ "Param/BuiltinFn": tags.definition(tags.variableName),
48
+ "StructMember/BuiltinFn": tags.propertyName,
49
+ "VarStatement/BuiltinFn": tags.definition(tags.variableName),
50
+ "GlobalVariableDeclaration/BuiltinFn": tags.definition(tags.variableName),
51
+ "GlobalValueDeclaration/BuiltinFn": tags.definition(tags.variableName),
52
+ "ImportPath/Identifier": tags.namespace,
53
+ "ImportItem/Identifier": tags.namespace,
54
+ "ImportPath/Kw": tags.keyword,
55
+ "PathBase/Identifier": tags.namespace,
56
+ "PathExpression/Identifier": tags.function(tags.variableName),
57
+ "CallExpression/Identifier": tags.typeName,
58
+ "StandardAttribute/Identifier": tags.keyword,
59
+ "\"=\" \"+=\" \"-=\" \"*=\" \"/=\" \"%=\" \"&=\" \"|=\" \"^=\" \"<<=\" \">>=\"": tags.definitionOperator,
60
+ "++ --": tags.updateOperator,
61
+ "( )": tags.paren,
62
+ "[ ]": tags.squareBracket,
63
+ "{ }": tags.brace,
64
+ ". , ; : -> ::": tags.punctuation,
65
+ "< >": tags.angleBracket
66
+ });
67
+
68
+ //#endregion
69
+ //#region src/parser.terms.js
70
+ const templateArgsEndFallback = 1;
71
+ const templateCallStart = 2;
72
+ const BuiltinType = 3;
73
+ const BuiltinFn = 4;
74
+
75
+ //#endregion
76
+ //#region src/Tokens.ts
77
+ /** External tokenizers and specializers referenced by wesl.grammar. */
78
+ /** Fallback tokenizer for nested template closing. Emits single '>' when '>>' seen in template context. */
79
+ const fallback = new ExternalTokenizer((input) => {
80
+ if (input.next === 62 && input.peek(1) === 62) input.acceptToken(templateArgsEndFallback, 1);
81
+ }, { extend: true });
82
+ const builtinTypeSet = new Set(stdTypes);
83
+ const builtinFnSet = new Set(stdFns);
84
+ /** External extend function for template call start. Returns templateCallStart if '<' starts a template. */
85
+ function templateCallExtend(value, stack) {
86
+ if (value !== "<") return -1;
87
+ return new WeslStream(stack.p.input.string.slice(stack.pos)).nextTemplateStartToken() !== null ? templateCallStart : -1;
88
+ }
89
+ /** Specialize identifiers that match WGSL built-in types or functions. */
90
+ function builtinSpecialize(value) {
91
+ if (builtinTypeSet.has(value)) return BuiltinType;
92
+ if (builtinFnSet.has(value)) return BuiltinFn;
93
+ return -1;
94
+ }
95
+
96
+ //#endregion
97
+ //#region src/parser.js
98
+ const spec_identifier = {
99
+ __proto__: null,
100
+ true: 326,
101
+ false: 326,
102
+ uniform: 332,
103
+ storage: 334,
104
+ private: 336,
105
+ workgroup: 338,
106
+ function: 340,
107
+ read: 342,
108
+ write: 344,
109
+ read_write: 346,
110
+ if: 348,
111
+ elif: 352,
112
+ else: 354,
113
+ import: 356,
114
+ package: 358,
115
+ super: 360,
116
+ diagnostic: 370,
117
+ enable: 372,
118
+ requires: 376,
119
+ fn: 380,
120
+ return: 384,
121
+ switch: 386,
122
+ case: 388,
123
+ default: 392,
124
+ loop: 394,
125
+ continuing: 396,
126
+ for: 398,
127
+ var: 400,
128
+ let: 402,
129
+ const: 404,
130
+ while: 406,
131
+ break: 408,
132
+ continue: 410,
133
+ discard: 412,
134
+ struct: 414,
135
+ override: 418,
136
+ alias: 420,
137
+ const_assert: 422
138
+ };
139
+ const parser = LRParser.deserialize({
140
+ version: 14,
141
+ states: "!.lQ]QPOOO!WQPO'#CeOOQO'#Cd'#CdOOQO'#Fc'#FcO!fQPO'#G[OOQO'#Dt'#DtO#^QPO'#FqOOQO'#D}'#D}O#iQPO'#D|OOQO'#EP'#EPO#nQPO'#EOOOQO'#ER'#ERO#nQPO'#EQOOQO'#G['#G[OOQO'#ET'#ETOOQO'#Em'#EmOOQO'#Eo'#EoO#sQPO'#ESOOQO'#FW'#FWO#{QPO'#FVO$TQPO'#FZOOQO'#F]'#F]O$`QPO'#F[OOQO'#F_'#F_O$hQPO'#F^OOQO'#Fa'#FaO$pQPO'#F`OOQO'#Ga'#GaOOQO'#Fb'#FbQ]QPOOOOQS'#Cg'#CgO%eQPO,59PO'zQPO,5:XO(PQPO,5:^OOQO,5:_,5:_OOQO-E9a-E9aO#^QPO,5<]OOQO,5<v,5<vO(UQPO,5:nO(^QPO,5;qO(fQPO,5;uO(qQPO,5;vO(yQPO,5;xO$pQPO,5;zOOQO'#Dv'#DvOOQO'#Dw'#DwO)RQQO'#DuO)^QQO,5<]O#nQPO,5:hO)fQPO'#G_O)nQPO,5:jO)sQPO,5:lO)xQPO,5:nO)}QPO,5;qO*SQTO'#CzO+TQPO,5;uO+`QPO,5;uO+hQPO,5;vO+sQPO,5;xOOQS'#Cn'#CnOOQO'#Cl'#ClO+xQQO'#FtO.nQQO'#DQO.uQPO'#DPOOQO'#Ft'#FtO$pQPO'#FtO$pQPO'#DSO0_QQO,5;zOOQO'#Ck'#CkOOQO-E9`-E9`O0fQPO'#CjOOQO1G.k1G.kO0mQPO1G/sO0mQPO1G/xO0{QQO1G1wO)xQPO1G0YO)}QPO1G1]O1TQPO1G1aO1`QPO1G1aO1hQPO1G1bO1sQPO1G1dO1xQQO1G1fO2PQPO'#FfO2[QQO,5:aOOQO1G1w1G1wO#nQPO1G1wO2gQPO1G0SO2lQPO,5<yO2tQPO,5<yOOQO1G0U1G0UOOQO1G0W1G0WO2|QPO'#EUO3[QPO1G0YO3dQPO'#FXOOQO1G1]1G1]OOQS'#Cr'#CrOOQS'#Cs'#CsOOQS'#Ct'#CtOOQS'#Cu'#CuOOQS'#Cv'#CvOOQS'#Cw'#CwOOQS'#Cx'#CxOOQS'#Cy'#CyOOQS'#Fw'#FwO3oQTO,59fOOQS'#Cq'#CqO3wQTO'#CqO4VQTO'#FvOOQO1G1a1G1aO$pQPO1G1aO4bQPO1G1aOOQO1G1b1G1bO$pQPO1G1bO4bQPO1G1bO4bQPO1G1dO*SQTO'#CpO4mQPO,59ZO4rQPO,59lO4zQQO,5<`O5RQQO,59nO0fQPO'#DOO$pQPO,59tO$pQPO,59tO$pQPO,59tO$pQPO,59tO$pQPO,59tO$pQPO,59tO$pQPO,59tO$pQPO,59tO$pQPO,59tO$pQPO,59tOOQO,5:T,5:TO$pQPO,5:TO7tQPO,5:TOOQO1G1f1G1fO7|QQO'#FsO8WQPO,59UOOQO'#GR'#GRO0mQPO'#GRO0mQPO'#DoO8]QPO7+%_OOQO'#Dn'#DnO8hQPO7+%dOOQO7+'c7+'cO#nQPO7+'cO8sQPO7+%tOOQO7+&w7+&wOOQO7+&{7+&{O$pQPO7+&{O4bQPO7+&{O8{QPO7+&{OOQO7+&|7+&|O$pQPO7+&|O4bQPO7+&|O4bQPO7+'OOOQO7+'Q7+'QO9WQPO'#GXOOQO,5<Q,5<QOOQO-E9d-E9dO9`QPO7+'cO#nQPO7+%nOOQO,5<T,5<TO9eQPO1G2eOOQO-E9g-E9gO9mQPO'#EVO9xQPO'#EVO:TQPO'#GcO:]QPO,5:pO:bQPO'#EZOOQO7+%t7+%tO;hQPO7+%tO;vQPO'#FYO<RQPO'#FYO<WQPO'#GtO<`QPO,5;sOOQS1G/Q1G/QOOQS,59],59]O=`QTO,5<bO=jQTO,5<bO=uQQO7+&{O>eQPO'#DQO>lQPO'#EXO=|QPO'#EXO>qQPO7+&{O>yQQO7+&|O?QQPO7+&|O?YQPO7+'OO?_QTO,59[OOQO1G.u1G.uO?gQQO1G/WOOQO1G1z1G1zOB]QPO,59jOEQQQO1G/`OEXQQO1G/`OHOQQO1G/`OHVQQO1G/`OJyQQO1G/`OKTQQO1G/`OMzQQO1G/`ONUQQO1G/`O!!xQQO1G/`O!#VQQO1G/`O!#dQQO1G/oOOQO1G/o1G/oO!#kQPO,5<_O!#rQPO,5<_OOQO1G.p1G.pO!#zQPO,5<mOOQO,5:Z,5:ZO0mQPO,5:[O0mQPO,5:]OOQO<<Hy<<HyOOQO<<IO<<IOO!$VQPO<<J}OOQO<<I`<<I`O;hQPO<<I`O!$[QQO<<JgO!$cQPO<<JgOOQO<<Jg<<JgO$pQPO<<JgO4bQPO<<JgO!$kQQO<<JhO!$rQPO<<JhO!$zQPO<<JjO!%PQQO'#DyO!%_QPO'#GYO!%gQPO,5<sOOQO<<J}<<J}O!%lQPO<<IYP#nQPO'#FiO!%tQPO,5:qO4bQPO,5:qO!&PQPO,5<}O!&_QPO,5<}OOQO1G0[1G0[O!&gQQO'#FUO!'gQPO'#E[OOQO'#E]'#E]OOQO'#E_'#E_O$pQPO'#E^OOQO'#Eb'#EbO$pQPO'#EaOOQO'#Eg'#EgO!(jQPO'#EfOOQO'#Ek'#EkOOQO'#En'#EnO!(rQPO'#ElO!(}QPO'#ElO!)VQPO'#EjOOQO'#FQ'#FQO$pQPO'#FPOOQO'#FR'#FROOQO'#FS'#FSOOQO'#FT'#FTOOQO'#E['#E[O!)[QPO'#E[O!)cQPO'#E[OOQO'#Fk'#FkO!)hQPO,5:uOOQO,5:u,5:uO;hQPO<<I`O!*nQPO<<I`O!*sQPO,5;tO4bQPO,5;tO!*xQPO,5=`O!+WQPO,5=`OOQO1G1_1G1_OOQS,5<O,5<OO!+`QTO1G1|OOQS-E9b-E9bOOQO,5:s,5:sO!+jQPO,59lOOQO<<Jh<<JhO$pQPO<<JhOOQO<<Jj<<JjOOQO1G.v1G.vOOQO1G/U1G/UOOQO7+%Z7+%ZO!+rQQO,5<PO!,SQPO1G1yOOQO-E9c-E9cOOQO1G2X1G2XOOQO1G/v1G/vO!,ZQPO1G/wOOQOAN@iAN@iO;hQPOAN>zO!*nQPOAN>zOOQOAN@RAN@RO$pQPOAN@RO!,fQQOAN@RO!,mQPOAN@ROOQOAN@SAN@SO$pQPOAN@SOOQOAN@UAN@UO!,uQPO'#FgO!,}QQO,5:eO#nQPO,5:eO!-]QPO,5<tO!-eQPO,5<tOOQO1G2_1G2_O!-mQPOAN>tO#nQPOAN>tO4bQPO1G0]OOQO1G0]1G0]OOQO,5<U,5<UO!-rQPO1G2iOOQO-E9h-E9hOOQO'#Er'#ErOOQO,5;p,5;pO$pQPO,5;pO!.QQPO,5;pOOQO,5:v,5:vO!.VQPO,5:vO!.^QPO,5:vO!.cQQO,5:xO!.jQQO,5:{O!(jQPO,5;QO!.tQPO'#EhOOQO,5;Q,5;QO!/}QPO,5;WO!0YQPO,5;WO!0bQPO,5;UO!.cQQO,5;kO!0rQQO,5:vOOQO-E9i-E9iOOQO1G0a1G0aOOQOAN>zAN>zO4bQPO1G1`OOQO1G1`1G1`OOQO,5<X,5<XO!0yQPO1G2zOOQO-E9k-E9kP<eQPO'#FdO!1XQPO1G/WO!1sQQOAN@SP$pQPO'#FeO!*nQPOG24fOOQOG24fG24fO!1zQQOG25mOOQOG25mG25mO$pQPOG25mO!2RQQOG25nOOQO,5<R,5<ROOQO-E9e-E9eO#nQPO1G0POOQO1G0P1G0POOQO,5<S,5<SO!2YQPO1G2`OOQO-E9f-E9fOOQOG24`G24`O!2bQPOG24`OOQO7+%w7+%wP!2gQPO'#FjO!2rQQO1G1[OOQO1G1[1G1[O!2yQQO1G0bOOQO1G0b1G0bO!3QQPO1G0dO!4}QPO1G0gO!5VQPO1G0gOOQO1G0l1G0lOOQO'#Ei'#EiOOQO,5;S,5;SO!5bQPO,5;SO!5jQPO,5;SO$pQPO1G0rO4bQPO1G0rO!6sQPO1G0rO!7OQQO1G0pO!7VQPO1G0pO!7^QPO1G0pOOQO1G1V1G1VOOQO7+&z7+&zP3dQPO'#FmOOQO7+%y7+%yOOQOG25nG25nOOQOLD*QLD*QOOQOLD+XLD+XO!7cQQOLD+XOOQOLD+YLD+YOOQO7+%k7+%kP#nQPO'#FhO!7jQPOLD)zOOQO7+&v7+&vOOQO7+%|7+%|OOQO'#E`'#E`O!7oQPO7+&OO!5VQPO7+&RO!5VQPO'#EcOOQO'#Ed'#EdOOQO'#Ee'#EeO$pQPO'#EcO!7wQPO'#EcOOQO'#Fl'#FlO!8PQPO7+&RO!5bQPO1G0nO!8_QPO1G0nOOQO1G0n1G0nO!5bQPO1G0nO!8dQQO7+&^O!8kQPO7+&^O$pQPO7+&^O4bQPO7+&^O!8sQPO7+&[O!8zQQO7+&[O!9RQPO7+&[OOQO!$'Ns!$'NsOOQO!$'Mf!$'MfOOQO<<Ij<<IjO!9YQPO<<ImO$pQPO,5:}O!9hQPO,5:}O!9pQQO'#GgOOQO,5:},5:}O!*nQPO,5:}OOQO-E9j-E9jOOQO<<Im<<ImO!9}QPO7+&YOOQO7+&Y7+&YO!5bQPO7+&YO$pQPO<<IxO!:SQQO<<IxO!:ZQPO<<IxO!:cQQO<<IvO!:jQPO<<IvO!:qQQO'#EqO!*nQPO<<IvO!;qQPO<<IvOOQOAN?XAN?XO!;vQPO1G0iOOQO1G0i1G0iO!*nQPO1G0iO!<OQPO,5=RO!<YQPO,5=ROOQO<<It<<ItO!<eQPO<<ItO!<jQQOAN?dO$pQPOAN?dO!<qQPOAN?bO!*nQPOAN?bO!<xQPOAN?bO$pQPO,5;]OOQO,5;],5;]OOQOAN?bAN?bOOQO7+&T7+&TO!*nQPO7+&TO!<}QPO1G2mOOQOAN?`AN?`O!=XQQOG25OO!*nQPOG24|O!=`QPOG24|OOQOG24|G24|O!=eQQO1G0wOOQO<<Io<<IoOOQOLD*hLD*hO!*nQPOLD*hOOQO!$'NS!$'NS",
142
+ stateData: "!>g~O$dOSTOSUOS~OYPO!okO$xTO%PVO%QXO%SZO%U^O%`_O%b`O%gbO%ieO%jgO%kiO~O$fnO$tpO$vqO$wrO~OYPO$xTO%PVO%QXO%SZO%U^O%`_O%b`O%gbO%ieO%jgO%kiO~O$fnO$y|O$z}O~O]!QO~O$fnO~OS!UO$fnO~OS!VO$fnO~OS!XOo!WO$fnO~OS!ZO$fnO~OS![O$fnO~OR!_OS!`O]!cOa!^Ow!dOx!dOy!dOz!dO{!dO$fnO$i!]O~O]!hOYXa$xXa%PXa%QXa%SXa%UXa%`Xa%bXa%gXa%iXa%jXa%kXaSXa$fXaRXaaXawXaxXayXazXa{Xa!lXa!oXa$iXa$tXa%WXa%XXa%]Xa%_Xa%aXa%cXa%dXa%eXa%fXa%YXa%[Xa~O]!jO~O]!kO~OS!mO$fnO~OS!nO$fnO~OS!oOo!WO$fnO~OS!qO$fnO~OS!rO$fnO~Ou!tO!o!iX$}!iX~O!o!vO$}!wO~Oq!yO!o%RX~O!o!{O~O!o!|O~O]!}O~O!l#PO~OR#^OS#^Oa#]O$fnO$i!]O$l#RO$m#SO$n#TO$o#UO$p#VO$q#WO$r#XO$s#YOP$jPp$jP~O!o#`O!z#bO#d#aO~OS!oO$fnO~O!o#cO!z#eO#d#dO~O#d#fO~OQ#gO]$hXo$hXw$hXz$hX{$hX}$hX!O$hX!P$hX!Q$hX!R$hX!S$hX!T$hX!U$hX!V$hX!W$hX!X$hX!Y$hX!Z$hX![$hX!^$hX!`$hX!o$hX[$hXq$hX!_$hX#d$hX#g$hX#h$hX#i$hX#j$hX#k$hX#l$hX#m$hX#n$hX#o$hX#p$hX#q$hX#r$hX!l$hXY$hX!z$hX~OutX~P+xOu#iO~O]#lOo#sOw#uOz#qO{#vO}#mO!O#nO!P#oO!Q#pO!R#rO!S#rO!T#sO!U#sO!V#sO!W#tO!X#tO!Y#uO!Z#vO![#vO!^#xO!`#yO~O!o#zO~P.zO[$gP~P$pO]$OOx$PO$fnO$i!]O~O!o$TO$}$UO~O!o$XO!z$ZO#d$YO~OS$[O$fnO~O!o$]O!z$_O#d$^O~O#d$`O~O!o$aO~P.zO!l$bO$fnO$z}O~Ou!tO!o!ia$}!ia~Oq$fO~O$fnO!o%Ra~Oq$hO!o%Ra~OS$kOYPO$fnO[%VP~O!l$nO!|$pO~OS$rOYPO$fnO~OP$uOp$uO~Oo!WOPeXpeXqeX~Oq$wOP$jXp$jX~OR$|OS$zO$fnO~O]#lO~OS%TO$fnO~O[%UO~P.zO]#lO!^#xO!`#yOovawvazva{va}va!Ova!Pva!Qva!Rva!Sva!Tva!Uva!Vva!Wva!Xva!Yva!Zva![va!ova[vaqva!_va#dva#gva#hva#iva#jva#kva#lva#mva#nva#ova#pva#qva#rva!lvaYva!zva~OS%cO$fnO~Oq%dO[$gX~P.zO[%fO~O[%kO}%jO!O%iO~O[%lO}%jO!O%iO~O!l$nO!|%oO~O!o%rO!z%tO#d%sO~O$fnO!n$|P~O!o%{O~O$fnO!o%Ri~OS&OOYPO$fnO~O!z&PO[!yXq!yX~Oq&QO[%VX~O[&SO~OYPO!l$nO!n&mO!o&hO$t&WO%W&VO%X&YO%]&[O%_&^O%`_O%a&_O%b`O%c&cO%d&eO%e&fO%f&gO~P$pOR$|OS$zOYPO$fnO~OS&pOYPO$fnO~O!z&qO~Oq&rO!n%hX~O!n&tO~OR#^OS#^Oa#]O$fnO$i!]O$l#RO$m#SO$n#TO$o#UO$p#VO$q#WO$r#XO$s#YO~OP$jap$ja~P<eOq&vOP$jap$ja~O!o%rO~P.zOo!WO!o!{X#d!{X!l!{X[!{Xq!{X!n!{X~OutX~P=|Ou&yO~O!o%rO#d%sO~O!o&zO~P.zO!o&zO#d&{O~O!o&|O~OP&}Op&}O~O]siosiutiwsizsi{si}si!Osi!Psi!Qsi!Rsi!Ssi!Tsi!Usi!Vsi!Wsi!Xsi!Ysi!Zsi![si!^si!`si!osi[siqsi!_si#dsi#gsi#hsi#isi#jsi#ksi#lsi#msi#nsi#osi#psi#qsi#rsi!lsiYsi!zsi~O['OO~O]#lOo#sOw#uOz#qO{#vO!P#oO!Q#pO!R#rO!S#rO!T#sO!U#sO!V#sO!W#tO!X#tO!Y#uO!Z#vO![#vO!^#xO!`#yO}|i!o|i[|iq|i!_|i#d|i#g|i#h|i#i|i#j|i#k|i#l|i#m|i#n|i#o|i#p|i#q|i#r|i!l|iY|i!z|i~O!O#nO~PBbO!O|i~PBbO]#lOo#sOw#uOz#qO{#vO!R#rO!S#rO!T#sO!U#sO!V#sO!W#tO!X#tO!Y#uO!Z#vO![#vO!^#xO!`#yO}|i!O|i!P|i!o|i[|iq|i!_|i#d|i#g|i#h|i#i|i#j|i#k|i#l|i#m|i#n|i#o|i#p|i#q|i#r|i!l|iY|i!z|i~O!Q#pO~PE`O!Q|i~PE`O]#lOo#sOw#uO{#vO!T#sO!U#sO!V#sO!W#tO!X#tO!Y#uO!Z#vO![#vO!^#xO!`#yOz|i}|i!O|i!P|i!Q|i!o|i[|iq|i!_|i#d|i#g|i#h|i#i|i#j|i#k|i#l|i#m|i#n|i#o|i#p|i#q|i#r|i!l|iY|i!z|i~O!R#rO!S#rO~PH^O!R|i!S|i~PH^O]#lOw#uO{#vO!Y#uO!Z#vO![#vO!^#xO!`#yOo|iz|i}|i!O|i!P|i!Q|i!R|i!S|i!T|i!U|i!V|i!o|i[|iq|i!_|i#d|i#g|i#h|i#i|i#j|i#k|i#l|i#m|i#n|i#o|i#p|i#q|i#r|i!l|iY|i!z|i~O!W#tO!X#tO~PK_O!W|i!X|i~PK_O]#lO!^#xO!`#yOo|iw|iz|i}|i!O|i!P|i!Q|i!R|i!S|i!T|i!U|i!V|i!W|i!X|i!Y|i!o|i[|iq|i!_|i#d|i#g|i#h|i#i|i#j|i#k|i#l|i#m|i#n|i#o|i#p|i#q|i#r|i!l|iY|i!z|i~O{#vO!Z#vO![#vO~PN`O{|i!Z|i![|i~PN`O!_'PO~P.zO[$ga~P$pOq'RO[$ga~O['TO}%jO!O%iO~O!o'WO~O!o'ZO~P.zO!o'ZO#d'[O~O!o'_O~P.zO!o'_O#d'`O~O!o'aO~Ou'bO$}'dOq!mX!n!mX~Oq'eO!n$|X~O!n'gO~O['hO!`'iO~O!z'jO[!yaq!ya~OS$kOYPO$fnO[%Va~Oq'mO[%Va~O!o'pO#d'oO#g'oO#h'oO#i'oO#j'oO#k'oO#l'oO#m'oO#n'oO#o'oO#p'oO#q'rO#r'rO~P.zOYPO!l$nO!o'sO$t&WO%W&VO%X&YO%]&[O%_&^O%`_O%a&_O%b`O%c&cO%d&eO%e&fO%f&gO~P$pOYPO!l'yO~OS'{Oo!WO$fnO~OS'{O$fnO~O]'}O~O!o'sO~P$pO!o'sO~OYPO!l$nO!n(RO!o&hO$t&WO%W&VO%X&YO%]&[O%_&^O%`_O%a&_O%b`O%c&cO%d&eO%e&fO%f&gO~P$pO!l$nO~O!z(TO~OS$rOYPO$fnO!n%ha~Oq(WO!n%ha~OP$jip$ji~P<eOS(ZO$fnO~O[$Xaq$Xa!l$Xa!z$Xa~P.zO[$gi~P$pO!O%iO[!ei}!ei~O!o(aO~P.zO!o(aO#d(bO~O!l$bO$fnO~Ou'bO$}(fOq!ma!n!ma~O$fnO!n$|a~Oq(iO!n$|a~O!o(kO~OS$kOYPO$fnO[%Vi~O!o(pO~O!o(rO~P$pO!o(rO~O!l$nO~P.zOYPO!l(uO~P.zOYPO!l$nO!n(xO!o&hO$t&WO%W&VO%X&YO%]&[O%^(wO%_&^O%`_O%a&_O%b`O%c&cO%d&eO%e&fO%f&gO~P$pO!z(|O#d({O!o#`a~OS(}O$fnO~O!o)PO%`_O%a&_O%b`O~P$pO!o(rO~P.zOS$rOYPO$fnO!n%hi~Oo!WOuti!o!{i#d!{i!l!{i[!{iq!{i!n!{i~O!o)VO~P.zO!o)XO~P.zO!o)ZO~P.zO$fnO!n$|i~O[)^O~OS$kOYPO$fnO~O!o)_O~P.zO!o)`O~P.zO$w)aOR#QiS#QiY#Qi]#Qia#Qiw#Qix#Qiy#Qiz#Qi{#Qi!l#Qi!n#Qi!o#Qi$f#Qi$i#Qi$t#Qi%W#Qi%X#Qi%]#Qi%_#Qi%`#Qi%a#Qi%b#Qi%c#Qi%d#Qi%e#Qi%f#Qi%^#Qi~OYPO!l)cO~OYPO%Y)eO%[)fO~OYPO!l$nO~OYPO!l$nO!n)mO!o&hO$t&WO%W&VO%X&YO%]&[O%^(wO%_&^O%`_O%a&_O%b`O%c&cO%d&eO%e&fO%f&gO~P$pO!z)rO#d)qO!o#`i~O!o)sO~P.zO!o)uO~P$pO!o)sO~O!o)vO~P.zO!o)wO~O!l$nO$t&WO~O!l$nO!z*OO~OYPO!n*QO%Y)eO%[)fO~O!n*SO~O!o#`q~P.zO#d*UO!o#`q~O!o*YO~P$pO!o*YO~P.zO[*[O~P$pOYPO!n*^O%Y)eO%[)fO~O!l$nO!z*aO~Oq*bO!l%ZX!z%ZX~P.zO!n*dO~O!o#`y~P.zO#d*gO!o#`y~O!o*hO~P.zO[*iO~P$pO#d'oO#g'oO#h'oO#i'oO#j'oO#k'oO#l'oO#m'oO#n'oO#o'oO#p'oO#q*lO#r*lO[#eX~P.zO[*iO~O!l$nO!z*oO~O!l%Za!z%Za~P$pOq*pO!l%Za!z%Za~O!n*qO~O!o#`!R~P.zO[*sO~P$pO[*sO~O!l%Zi!z%Zi~P$pO!o#`!Z~P.zO[*yO~O[#ei~P.zOTUu!z#n!Q#k![#j#i{!Z#q#g!S!Y!R#dx}#m!P!O#lza#p!X!V!U#o!W!To!|#r#h$f!`w~",
143
+ goto: "D[%iPPPPPPPP%j&aP'WPP+p+s.vP0R.v1m1q1z1z1z1z1z1z1z1z2RPPP2f.v3hP5WPPPPP5WPPPPPPPPPPPPPP5WPPP&a6c6u6u6u&a&a6}7U7[7`P7gPP7o7v7o7{7o8Q8V8Z8b8hP8pP9s;[;b;k;w<P<S<]<d<j<s<S<|=T=Z<S=a=h=t>T>]P>l>uPPPPPPPPPPPP<S>{?S?S?S<S8V?]?d?j8V8V?r8V?y8V@Q@X@_AlArA|BSBYB`BfBlBvCQPPPCWPC[5WPCbChPPPPPPPPP6uPPPPPCoCuPCWPPCxPCWPDOPPPDRPPPPPPPPPPPPDX!iROSm!}#P$j$n$p$q%o&Q&U&]&l&n&r'X'm'w'x'y(W(n(t(u(y(z)T)c)d)j)k)n)y*T!iQOSm!}#P$j$n$p$q%o&Q&U&]&l&n&r'X'm'w'x'y(W(n(t(u(y(z)T)c)d)j)k)n)y*TQoPS!OUtS!RY[Q!UaQ!VcQ!XdQ!ZfQ![h#b!`j{!c!d!h#a#d#l#m#n#o#p#q#r#s#t#u#v#x$Y$^$n%d%s&U&X&Z&d&i&l&{'R'['`'q't'y'}(](b(z({)P)g)q)s)u)z*U*Y*b*g*h*k*pQ!mvQ!nwS!ox!YQ!qyQ!rzQ!x!QY#^!W#g$w&v(Y[#}!j!k$O$P%i%jQ$[!pQ$c!tQ$e!wU$g!y$h%}W$k!}&Q'm(nW$r#P&r(W)Tr$z#b#e#f$Z$_$`$p%o%t&P&n&q'X'j(T(|)rQ%T#iQ%c#yQ%m$UW%x$b'e(i)]Q%|$fQ&O$jQ&p$qS'{&`&aQ(Z&yQ(d'bQ(g'dQ(l'iQ(}'|R)[(fR!ioQ!ejQ!s{Q#j!cQ#k!dS#{!h#lQ$y#aQ%O#dQ%W#mQ%X#nQ%Y#oQ%Z#pQ%[#qQ%]#rQ%^#sQ%_#tQ%`#uQ%a#vQ%b#xQ%p$YQ%u$^Y&T$n&U&l'y(zY'Q%d'R(]*b*pQ']%sQ'v&XQ'w&ZQ(O&dQ(P&iQ([&{Q(`'[Q(c'`Q(o'qQ(q'tQ)O'}Q)Y(bQ)o({Q)t)PS)|)g)zQ*V)qQ*X)sU*Z)u*Y*hQ*f*UQ*r*gR*v*k#c!bj{!c!d!h#a#d#l#m#n#o#p#q#r#s#t#u#v#x$Y$^$n%d%s&U&X&Z&d&i&l&{'R'['`'q't'y'}(](b(z({)P)g)q)s)u)z*U*Y*b*g*h*k*p#b!^j{!c!d!h#a#d#l#m#n#o#p#q#r#s#t#u#v#x$Y$^$n%d%s&U&X&Z&d&i&l&{'R'['`'q't'y'}(](b(z({)P)g)q)s)u)z*U*Y*b*g*h*k*pY#]!W#g$w&v(Y]#}!j!k$O$P%i%jT#h!_!`S#_!W#gV&u$w&v(YZ#Z!W#g$w&v(YQ!YdQ!pxQ$v#^S&x$z$|Q'|&`R)U(Z!x#w!e!s#j#k#{$y%O%W%X%Y%Z%[%]%^%_%`%a%b%p%u&T'Q']'v'w(O(P([(`(c(o(q)O)Y)o)t)|*V*X*Z*f*r*vR%S#h#b!aj{!c!d!h#a#d#l#m#n#o#p#q#r#s#t#u#v#x$Y$^$n%d%s&U&X&Z&d&i&l&{'R'['`'q't'y'}(](b(z({)P)g)q)s)u)z*U*Y*b*g*h*k*ps${#b#e#f$Z$_$`$p%o%t&P&n&q'X'j(T(|)r#c!fj{!c!d!h#a#d#l#m#n#o#p#q#r#s#t#u#v#x$Y$^$n%d%s&U&X&Z&d&i&l&{'R'['`'q't'y'}(](b(z({)P)g)q)s)u)z*U*Y*b*g*h*k*pQ$Q!jQ$S!kQ%g$OQ%h$PQ'U%iR'V%j]$R!j!k$O$P%i%jSUOmRtSQ!PUR!ltT!OUtS!OUtR$c!tQ%y$bV(h'e(i)]S]OmRuSVWOSmVYOSmV[OSmTkOmSaOmRvSQ#O!UR$V!mQ$l!}V'l&Q'm(nQ$}#bQ%P#eQ%Q#fQ%q$ZQ%v$_Q%w$`Q&o$pS'Y%o&nQ'^%tQ'k&PQ(U&qQ(^'XQ(m'jQ)S(TQ)p(|R*W)rQ$o#OQ%n$VW&h$n&l'y(zQ's&UQ(S&oQ(_'YQ(s'vQ)R(OQ)W(^Q)l(yQ)x)bQ)})hS*R)k)nS*`){*OQ*e*TQ*m*[S*n*_*aQ*u*iQ*w*oQ*x*sR*z*yX&k$n&l'y(zW&i$n&l'y(zR't&UW&h$n&l'y(zQ's&UR)x)b]&X$n&U&l'y(z)bR)b(sW&h$n&l'y(zR's&UZ&Z$n&U&l'y(zX)i(u)c)j)yW)g(u)c)j)yR)z)dW)h(u)c)j)yR){)dZ&]$n&U&l'y(zQ'z&]R(v'xQ(y'yR)n(zZ&b$n&U&l'y(zW&j$n&l'y(zQ'u&UR)Q'}SdOmQxS]&`$n&U&l'y'}(z]&a$n&U&l'y'}(zSfOmQyS]&a$n&U&l'y'}(zQ*])uQ*j*YR*t*hQ'q&TR*k*ZZ&d$n&U&l'y(zW&j$n&l'y(zR'u&UScOmRwSQ#Q!VR$W!nQ$s#PV(V&r(W)TSfOmRySShOmRzSSjOmR{SQmOR!gmSSOmfsS$j$q&U&n'X'x(t)d)k*TW$j!}&Q'm(nW$q#P&r(W)TW&U$n&l'y(zQ&n$pQ'X%oQ'x&]Q(t'wW)d(u)c)j)yQ)k(yR*T)nQ$x#_R&w$xQ%e#{S'S%e*cR*c)|Q!u!OR$d!uQ'c%xR(e'cQ'f%yR(j'fQ!z!RR$i!zQ&R$lR'n&RQ&l$nS(Q&l(zR(z'yQ)j(uQ)y)cT*P)j)yQ&s$sR(X&sTlOmQ#|!hR%V#lQ#[!WR%R#gZ#]!W#g$w&v(YQ$c!tR(d'bR%z$bQ!SYR!T[R$m!}Q){)gR*_)zR$t#P",
144
+ nodeNames: "⚠ > < BuiltinType BuiltinFn LineComment BlockComment Module Attribute StandardAttribute @ Identifier ) ( AttrArgs Expression Literal Number Boolean CallExpression CallTemplateArgs TypeOrExpr Kw Kw Kw Kw Kw Kw Kw Kw TemplateArgs < > , ArgList PathExpression PathBase :: UnaryExpression - ! ~ & * BinaryExpression || && | ^ == != <= > >= << >> + / % PostfixExpression [ ] . IfAttribute ConditionExpr ConditionNot ConditionAnd ConditionOr ElifAttribute ElseAttribute Import ImportPath Kw Kw { ImportItem } ; DiagnosticDirective Kw EnableDirective Kw RequiresDirective Kw FunctionDeclaration Kw ParamList Param : Type -> Block Statement Kw IfStatement Kw Kw SwitchStatement Kw SwitchClause Kw Kw LoopStatement Kw LoopBlock Kw ForStatement Kw VarStatement Kw Kw Kw = UpdatingExpr AssignOp += -= *= /= %= &= |= ^= <<= >>= ++ -- WhileStatement Kw Kw Kw Kw ExpressionStatement StructDeclaration Kw StructBody StructMember GlobalVariableDeclaration GlobalValueDeclaration Kw TypeAliasDeclaration Kw ConstAssert Kw",
145
+ maxTerm: 211,
146
+ nodeProps: [[
147
+ "openedBy",
148
+ 12,
149
+ "(",
150
+ 76,
151
+ "{"
152
+ ], [
153
+ "closedBy",
154
+ 13,
155
+ ")",
156
+ 74,
157
+ "}"
158
+ ]],
159
+ skippedNodes: [
160
+ 0,
161
+ 5,
162
+ 6
163
+ ],
164
+ repeatNodeCount: 12,
165
+ tokenData: "1a~RxX^#opq#oqr$duv$qvw%Oxy%eyz%jz{%o{|%||}&c}!O&h!O!P'V!P!Q(j!Q!R*g!R![+[![!],q!]!^-O!^!_-T!_!`-r!`!a.P!b!c.p!c!}.u!}#O/W#P#Q/]#Q#R/b#R#S.u#T#U/o#U#o.u#o#p0k#p#q0p#q#r1V#r#s1[#y#z#o$f$g#o#BY#BZ#o$IS$I_#o$I|$JO#o$JT$JU#o$KV$KW#o&FU&FV#o~#tY$d~X^#opq#o#y#z#o$f$g#o#BY#BZ#o$IS$I_#o$I|$JO#o$JT$JU#o$KV$KW#o&FU&FV#o~$iPx~!_!`$l~$qO!S~~$vP![~!_!`$y~%OO#k~~%TQz~vw%Z!_!`%`~%`O!O~~%eO#l~~%jO]~~%oO[~~%tP{~!_!`%w~%|O#i~~&RQ!Y~{|&X!_!`&^~&^O#q~~&cO#g~~&hOq~~&mRw~}!O&v!_!`&{!`!a'Q~&{O#r~~'QO#h~~'VO!|~~'[P!`~!Q!['_~'dTa~!Q!['_!g!h's#X#Y's#Y#Z(e#[#](e~'vR{|(P}!O(P!Q![(V~(SP!Q![(V~([Ra~!Q![(V#Y#Z(e#[#](e~(jOa~~(oR!Z~z{(x!P!Q)y!_!`*b~({TOz(xz{)[{;'S(x;'S;=`)s<%lO(x~)_TO!P(x!P!Q)n!Q;'S(x;'S;=`)s<%lO(x~)sOU~~)vP;=`<%l(x~*OST~OY)yZ;'S)y;'S;=`*[<%lO)y~*_P;=`<%l)y~*gO#j~~*lYa~!O!P'_!Q![+[!g!h's!z!{+y#X#Y's#Y#Z(e#[#](e#]#^(e#i#j(e#l#m+y~+aWa~!O!P'_!Q![+[!g!h's#X#Y's#Y#Z(e#[#](e#]#^(e#i#j(e~+|R!Q![,V!c!i,V#T#Z,V~,[Va~!Q![,V!c!i,V#T#Y,V#Y#Z,V#[#](e#]#^(e#i#j(e~,vP!z~![!],y~-OOu~~-TO!o~~-YQo~!^!_-`!_!`-m~-eP!W~!_!`-h~-mO#o~~-rO!T~~-wP#d~!_!`-z~.PO!R~R.WQpP!UQ!_!`.^!`!a.cQ.cO!VQQ.hP!XQ!_!`.kQ.pO#pQ~.uOY~P.zS$fP!Q![.u!c!}.u#R#S.u#T#o.u~/]O!^~~/bO!_~~/gP!Q~!_!`/j~/oO#n~R/tU$fP!Q![.u!c!}.u#R#S.u#T#g.u#g#h0W#h#o.uR0_S$}Q$fP!Q![.u!c!}.u#R#S.u#T#o.u~0pO!l~~0uQ!P~!_!`0{#p#q1Q~1QO#m~~1VO}~~1[O!n~~1aOy~",
166
+ tokenizers: [
167
+ 0,
168
+ 1,
169
+ fallback
170
+ ],
171
+ topRules: { "Module": [0, 7] },
172
+ specialized: [
173
+ {
174
+ term: 31,
175
+ get: (value, stack) => templateCallExtend(value, stack) << 1 | 1,
176
+ external: templateCallExtend,
177
+ extend: true
178
+ },
179
+ {
180
+ term: 160,
181
+ get: (value, stack) => builtinSpecialize(value, stack) << 1,
182
+ external: builtinSpecialize
183
+ },
184
+ {
185
+ term: 160,
186
+ get: (value) => spec_identifier[value] || -1
187
+ }
188
+ ],
189
+ tokenPrec: 3432
190
+ });
191
+
192
+ //#endregion
193
+ export { parser, weslHighlighting };
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "lezer-wesl",
3
+ "description": "Lezer grammar for WESL (WebGPU Extended Shading Language)",
4
+ "version": "0.6.37",
5
+ "type": "module",
6
+ "files": [
7
+ "dist",
8
+ "src"
9
+ ],
10
+ "repository": "github:wgsl-tooling-wg/wesl-js",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
15
+ }
16
+ },
17
+ "dependencies": {
18
+ "@lezer/common": "^1.2.3",
19
+ "@lezer/highlight": "^1.2.1",
20
+ "@lezer/lr": "^1.4.2",
21
+ "wesl": "0.7.15"
22
+ },
23
+ "devDependencies": {
24
+ "@lezer/generator": "^1.7.2"
25
+ },
26
+ "peerDependencies": {
27
+ "@codemirror/language": "^6.11.2"
28
+ },
29
+ "peerDependenciesMeta": {
30
+ "@codemirror/language": {
31
+ "optional": true
32
+ }
33
+ },
34
+ "scripts": {
35
+ "build": "run-s build:grammar build:ts",
36
+ "build:grammar": "lezer-generator src/wesl.grammar -o src/parser.js",
37
+ "build:ts": "tsdown",
38
+ "test": "vitest --hideSkippedTests",
39
+ "test:once": "vitest run",
40
+ "typecheck": "tsgo"
41
+ },
42
+ "main": "dist/index.js"
43
+ }
@@ -0,0 +1,64 @@
1
+ import { styleTags, tags as t } from "@lezer/highlight";
2
+
3
+ /** Syntax highlighting for WESL */
4
+ export const weslHighlighting = styleTags({
5
+ Number: t.number,
6
+ Boolean: t.bool,
7
+ LineComment: t.lineComment,
8
+ BlockComment: t.blockComment,
9
+ Import: t.keyword,
10
+ "import as": t.keyword,
11
+ "FunctionDeclaration/Kw": t.controlKeyword,
12
+ "IfStatement/Kw": t.controlKeyword,
13
+ "SwitchStatement/Kw": t.controlKeyword,
14
+ "SwitchClause/Kw": t.controlKeyword,
15
+ "LoopStatement/Kw": t.controlKeyword,
16
+ "LoopBlock/Kw": t.controlKeyword,
17
+ "ForStatement/Kw": t.controlKeyword,
18
+ "WhileStatement/Kw": t.controlKeyword,
19
+ "Statement/Kw": t.controlKeyword,
20
+ "GlobalVariableDeclaration/Kw": t.definitionKeyword,
21
+ "GlobalValueDeclaration/Kw": t.definitionKeyword,
22
+ "VarStatement/Kw": t.definitionKeyword,
23
+ "StructDeclaration/Kw": t.definitionKeyword,
24
+ "TypeAliasDeclaration/Kw": t.definitionKeyword,
25
+ "DiagnosticDirective/Kw": t.keyword,
26
+ "EnableDirective/Kw": t.keyword,
27
+ "RequiresDirective/Kw": t.keyword,
28
+ "ConstAssert/Kw": t.keyword,
29
+ "TypeOrExpr/Kw": t.keyword,
30
+ BuiltinType: t.keyword,
31
+ BuiltinFn: t.keyword,
32
+ Identifier: t.variableName,
33
+ "Type/Identifier": t.typeName,
34
+ "TypeOrExpr/Identifier": t.typeName,
35
+ "FunctionDeclaration/Identifier": t.function(t.definition(t.variableName)),
36
+ "StructDeclaration/Identifier": t.definition(t.typeName),
37
+ "Param/Identifier": t.definition(t.variableName),
38
+ "StructMember/Identifier": t.propertyName,
39
+ "VarStatement/Identifier": t.definition(t.variableName),
40
+ "GlobalVariableDeclaration/Identifier": t.definition(t.variableName),
41
+ "GlobalValueDeclaration/Identifier": t.definition(t.variableName),
42
+ "FunctionDeclaration/BuiltinFn": t.function(t.definition(t.variableName)),
43
+ "StructDeclaration/BuiltinFn": t.definition(t.typeName),
44
+ "Param/BuiltinFn": t.definition(t.variableName),
45
+ "StructMember/BuiltinFn": t.propertyName,
46
+ "VarStatement/BuiltinFn": t.definition(t.variableName),
47
+ "GlobalVariableDeclaration/BuiltinFn": t.definition(t.variableName),
48
+ "GlobalValueDeclaration/BuiltinFn": t.definition(t.variableName),
49
+ "ImportPath/Identifier": t.namespace,
50
+ "ImportItem/Identifier": t.namespace,
51
+ "ImportPath/Kw": t.keyword,
52
+ "PathBase/Identifier": t.namespace,
53
+ "PathExpression/Identifier": t.function(t.variableName),
54
+ "CallExpression/Identifier": t.typeName,
55
+ "StandardAttribute/Identifier": t.keyword,
56
+ '"=" "+=" "-=" "*=" "/=" "%=" "&=" "|=" "^=" "<<=" ">>="':
57
+ t.definitionOperator,
58
+ "++ --": t.updateOperator,
59
+ "( )": t.paren,
60
+ "[ ]": t.squareBracket,
61
+ "{ }": t.brace,
62
+ ". , ; : -> ::": t.punctuation,
63
+ "< >": t.angleBracket,
64
+ });
package/src/Tokens.ts ADDED
@@ -0,0 +1,47 @@
1
+ /** External tokenizers and specializers referenced by wesl.grammar. */
2
+
3
+ import { ExternalTokenizer, type Stack } from "@lezer/lr";
4
+ import { stdFns, stdTypes, WeslStream } from "wesl";
5
+ import {
6
+ BuiltinFn,
7
+ BuiltinType,
8
+ templateArgsEndFallback,
9
+ templateCallStart,
10
+ } from "./parser.terms.js";
11
+
12
+ /** Stack with internal parse state for accessing source text. */
13
+ interface StackWithParse extends Stack {
14
+ p: { input: { string: string } };
15
+ }
16
+
17
+ /** Fallback tokenizer for nested template closing. Emits single '>' when '>>' seen in template context. */
18
+ export const fallback = new ExternalTokenizer(
19
+ input => {
20
+ if (input.next === 62 && input.peek(1) === 62) {
21
+ input.acceptToken(templateArgsEndFallback, 1);
22
+ }
23
+ },
24
+ { extend: true },
25
+ );
26
+
27
+ const builtinTypeSet = new Set(stdTypes);
28
+ const builtinFnSet = new Set(stdFns);
29
+
30
+ /** External extend function for template call start. Returns templateCallStart if '<' starts a template. */
31
+ export function templateCallExtend(
32
+ value: string,
33
+ stack: StackWithParse,
34
+ ): number {
35
+ if (value !== "<") return -1;
36
+
37
+ const text = stack.p.input.string.slice(stack.pos);
38
+ const stream = new WeslStream(text);
39
+ return stream.nextTemplateStartToken() !== null ? templateCallStart : -1;
40
+ }
41
+
42
+ /** Specialize identifiers that match WGSL built-in types or functions. */
43
+ export function builtinSpecialize(value: string): number {
44
+ if (builtinTypeSet.has(value)) return BuiltinType;
45
+ if (builtinFnSet.has(value)) return BuiltinFn;
46
+ return -1;
47
+ }
package/src/index.ts ADDED
@@ -0,0 +1,2 @@
1
+ export { weslHighlighting } from "./Highlight.ts";
2
+ export { parser } from "./parser.js";
package/src/parser.js ADDED
@@ -0,0 +1,23 @@
1
+ // This file was generated by lezer-generator. You probably shouldn't edit it.
2
+ import {LRParser} from "@lezer/lr"
3
+ import {fallback, templateCallExtend, builtinSpecialize} from "./Tokens.ts"
4
+ const spec_identifier = {__proto__:null,true:326, false:326, uniform:332, storage:334, private:336, workgroup:338, function:340, read:342, write:344, read_write:346, if:348, elif:352, else:354, import:356, package:358, super:360, diagnostic:370, enable:372, requires:376, fn:380, return:384, switch:386, case:388, default:392, loop:394, continuing:396, for:398, var:400, let:402, const:404, while:406, break:408, continue:410, discard:412, struct:414, override:418, alias:420, const_assert:422}
5
+ export const parser = LRParser.deserialize({
6
+ version: 14,
7
+ states: "!.lQ]QPOOO!WQPO'#CeOOQO'#Cd'#CdOOQO'#Fc'#FcO!fQPO'#G[OOQO'#Dt'#DtO#^QPO'#FqOOQO'#D}'#D}O#iQPO'#D|OOQO'#EP'#EPO#nQPO'#EOOOQO'#ER'#ERO#nQPO'#EQOOQO'#G['#G[OOQO'#ET'#ETOOQO'#Em'#EmOOQO'#Eo'#EoO#sQPO'#ESOOQO'#FW'#FWO#{QPO'#FVO$TQPO'#FZOOQO'#F]'#F]O$`QPO'#F[OOQO'#F_'#F_O$hQPO'#F^OOQO'#Fa'#FaO$pQPO'#F`OOQO'#Ga'#GaOOQO'#Fb'#FbQ]QPOOOOQS'#Cg'#CgO%eQPO,59PO'zQPO,5:XO(PQPO,5:^OOQO,5:_,5:_OOQO-E9a-E9aO#^QPO,5<]OOQO,5<v,5<vO(UQPO,5:nO(^QPO,5;qO(fQPO,5;uO(qQPO,5;vO(yQPO,5;xO$pQPO,5;zOOQO'#Dv'#DvOOQO'#Dw'#DwO)RQQO'#DuO)^QQO,5<]O#nQPO,5:hO)fQPO'#G_O)nQPO,5:jO)sQPO,5:lO)xQPO,5:nO)}QPO,5;qO*SQTO'#CzO+TQPO,5;uO+`QPO,5;uO+hQPO,5;vO+sQPO,5;xOOQS'#Cn'#CnOOQO'#Cl'#ClO+xQQO'#FtO.nQQO'#DQO.uQPO'#DPOOQO'#Ft'#FtO$pQPO'#FtO$pQPO'#DSO0_QQO,5;zOOQO'#Ck'#CkOOQO-E9`-E9`O0fQPO'#CjOOQO1G.k1G.kO0mQPO1G/sO0mQPO1G/xO0{QQO1G1wO)xQPO1G0YO)}QPO1G1]O1TQPO1G1aO1`QPO1G1aO1hQPO1G1bO1sQPO1G1dO1xQQO1G1fO2PQPO'#FfO2[QQO,5:aOOQO1G1w1G1wO#nQPO1G1wO2gQPO1G0SO2lQPO,5<yO2tQPO,5<yOOQO1G0U1G0UOOQO1G0W1G0WO2|QPO'#EUO3[QPO1G0YO3dQPO'#FXOOQO1G1]1G1]OOQS'#Cr'#CrOOQS'#Cs'#CsOOQS'#Ct'#CtOOQS'#Cu'#CuOOQS'#Cv'#CvOOQS'#Cw'#CwOOQS'#Cx'#CxOOQS'#Cy'#CyOOQS'#Fw'#FwO3oQTO,59fOOQS'#Cq'#CqO3wQTO'#CqO4VQTO'#FvOOQO1G1a1G1aO$pQPO1G1aO4bQPO1G1aOOQO1G1b1G1bO$pQPO1G1bO4bQPO1G1bO4bQPO1G1dO*SQTO'#CpO4mQPO,59ZO4rQPO,59lO4zQQO,5<`O5RQQO,59nO0fQPO'#DOO$pQPO,59tO$pQPO,59tO$pQPO,59tO$pQPO,59tO$pQPO,59tO$pQPO,59tO$pQPO,59tO$pQPO,59tO$pQPO,59tO$pQPO,59tOOQO,5:T,5:TO$pQPO,5:TO7tQPO,5:TOOQO1G1f1G1fO7|QQO'#FsO8WQPO,59UOOQO'#GR'#GRO0mQPO'#GRO0mQPO'#DoO8]QPO7+%_OOQO'#Dn'#DnO8hQPO7+%dOOQO7+'c7+'cO#nQPO7+'cO8sQPO7+%tOOQO7+&w7+&wOOQO7+&{7+&{O$pQPO7+&{O4bQPO7+&{O8{QPO7+&{OOQO7+&|7+&|O$pQPO7+&|O4bQPO7+&|O4bQPO7+'OOOQO7+'Q7+'QO9WQPO'#GXOOQO,5<Q,5<QOOQO-E9d-E9dO9`QPO7+'cO#nQPO7+%nOOQO,5<T,5<TO9eQPO1G2eOOQO-E9g-E9gO9mQPO'#EVO9xQPO'#EVO:TQPO'#GcO:]QPO,5:pO:bQPO'#EZOOQO7+%t7+%tO;hQPO7+%tO;vQPO'#FYO<RQPO'#FYO<WQPO'#GtO<`QPO,5;sOOQS1G/Q1G/QOOQS,59],59]O=`QTO,5<bO=jQTO,5<bO=uQQO7+&{O>eQPO'#DQO>lQPO'#EXO=|QPO'#EXO>qQPO7+&{O>yQQO7+&|O?QQPO7+&|O?YQPO7+'OO?_QTO,59[OOQO1G.u1G.uO?gQQO1G/WOOQO1G1z1G1zOB]QPO,59jOEQQQO1G/`OEXQQO1G/`OHOQQO1G/`OHVQQO1G/`OJyQQO1G/`OKTQQO1G/`OMzQQO1G/`ONUQQO1G/`O!!xQQO1G/`O!#VQQO1G/`O!#dQQO1G/oOOQO1G/o1G/oO!#kQPO,5<_O!#rQPO,5<_OOQO1G.p1G.pO!#zQPO,5<mOOQO,5:Z,5:ZO0mQPO,5:[O0mQPO,5:]OOQO<<Hy<<HyOOQO<<IO<<IOO!$VQPO<<J}OOQO<<I`<<I`O;hQPO<<I`O!$[QQO<<JgO!$cQPO<<JgOOQO<<Jg<<JgO$pQPO<<JgO4bQPO<<JgO!$kQQO<<JhO!$rQPO<<JhO!$zQPO<<JjO!%PQQO'#DyO!%_QPO'#GYO!%gQPO,5<sOOQO<<J}<<J}O!%lQPO<<IYP#nQPO'#FiO!%tQPO,5:qO4bQPO,5:qO!&PQPO,5<}O!&_QPO,5<}OOQO1G0[1G0[O!&gQQO'#FUO!'gQPO'#E[OOQO'#E]'#E]OOQO'#E_'#E_O$pQPO'#E^OOQO'#Eb'#EbO$pQPO'#EaOOQO'#Eg'#EgO!(jQPO'#EfOOQO'#Ek'#EkOOQO'#En'#EnO!(rQPO'#ElO!(}QPO'#ElO!)VQPO'#EjOOQO'#FQ'#FQO$pQPO'#FPOOQO'#FR'#FROOQO'#FS'#FSOOQO'#FT'#FTOOQO'#E['#E[O!)[QPO'#E[O!)cQPO'#E[OOQO'#Fk'#FkO!)hQPO,5:uOOQO,5:u,5:uO;hQPO<<I`O!*nQPO<<I`O!*sQPO,5;tO4bQPO,5;tO!*xQPO,5=`O!+WQPO,5=`OOQO1G1_1G1_OOQS,5<O,5<OO!+`QTO1G1|OOQS-E9b-E9bOOQO,5:s,5:sO!+jQPO,59lOOQO<<Jh<<JhO$pQPO<<JhOOQO<<Jj<<JjOOQO1G.v1G.vOOQO1G/U1G/UOOQO7+%Z7+%ZO!+rQQO,5<PO!,SQPO1G1yOOQO-E9c-E9cOOQO1G2X1G2XOOQO1G/v1G/vO!,ZQPO1G/wOOQOAN@iAN@iO;hQPOAN>zO!*nQPOAN>zOOQOAN@RAN@RO$pQPOAN@RO!,fQQOAN@RO!,mQPOAN@ROOQOAN@SAN@SO$pQPOAN@SOOQOAN@UAN@UO!,uQPO'#FgO!,}QQO,5:eO#nQPO,5:eO!-]QPO,5<tO!-eQPO,5<tOOQO1G2_1G2_O!-mQPOAN>tO#nQPOAN>tO4bQPO1G0]OOQO1G0]1G0]OOQO,5<U,5<UO!-rQPO1G2iOOQO-E9h-E9hOOQO'#Er'#ErOOQO,5;p,5;pO$pQPO,5;pO!.QQPO,5;pOOQO,5:v,5:vO!.VQPO,5:vO!.^QPO,5:vO!.cQQO,5:xO!.jQQO,5:{O!(jQPO,5;QO!.tQPO'#EhOOQO,5;Q,5;QO!/}QPO,5;WO!0YQPO,5;WO!0bQPO,5;UO!.cQQO,5;kO!0rQQO,5:vOOQO-E9i-E9iOOQO1G0a1G0aOOQOAN>zAN>zO4bQPO1G1`OOQO1G1`1G1`OOQO,5<X,5<XO!0yQPO1G2zOOQO-E9k-E9kP<eQPO'#FdO!1XQPO1G/WO!1sQQOAN@SP$pQPO'#FeO!*nQPOG24fOOQOG24fG24fO!1zQQOG25mOOQOG25mG25mO$pQPOG25mO!2RQQOG25nOOQO,5<R,5<ROOQO-E9e-E9eO#nQPO1G0POOQO1G0P1G0POOQO,5<S,5<SO!2YQPO1G2`OOQO-E9f-E9fOOQOG24`G24`O!2bQPOG24`OOQO7+%w7+%wP!2gQPO'#FjO!2rQQO1G1[OOQO1G1[1G1[O!2yQQO1G0bOOQO1G0b1G0bO!3QQPO1G0dO!4}QPO1G0gO!5VQPO1G0gOOQO1G0l1G0lOOQO'#Ei'#EiOOQO,5;S,5;SO!5bQPO,5;SO!5jQPO,5;SO$pQPO1G0rO4bQPO1G0rO!6sQPO1G0rO!7OQQO1G0pO!7VQPO1G0pO!7^QPO1G0pOOQO1G1V1G1VOOQO7+&z7+&zP3dQPO'#FmOOQO7+%y7+%yOOQOG25nG25nOOQOLD*QLD*QOOQOLD+XLD+XO!7cQQOLD+XOOQOLD+YLD+YOOQO7+%k7+%kP#nQPO'#FhO!7jQPOLD)zOOQO7+&v7+&vOOQO7+%|7+%|OOQO'#E`'#E`O!7oQPO7+&OO!5VQPO7+&RO!5VQPO'#EcOOQO'#Ed'#EdOOQO'#Ee'#EeO$pQPO'#EcO!7wQPO'#EcOOQO'#Fl'#FlO!8PQPO7+&RO!5bQPO1G0nO!8_QPO1G0nOOQO1G0n1G0nO!5bQPO1G0nO!8dQQO7+&^O!8kQPO7+&^O$pQPO7+&^O4bQPO7+&^O!8sQPO7+&[O!8zQQO7+&[O!9RQPO7+&[OOQO!$'Ns!$'NsOOQO!$'Mf!$'MfOOQO<<Ij<<IjO!9YQPO<<ImO$pQPO,5:}O!9hQPO,5:}O!9pQQO'#GgOOQO,5:},5:}O!*nQPO,5:}OOQO-E9j-E9jOOQO<<Im<<ImO!9}QPO7+&YOOQO7+&Y7+&YO!5bQPO7+&YO$pQPO<<IxO!:SQQO<<IxO!:ZQPO<<IxO!:cQQO<<IvO!:jQPO<<IvO!:qQQO'#EqO!*nQPO<<IvO!;qQPO<<IvOOQOAN?XAN?XO!;vQPO1G0iOOQO1G0i1G0iO!*nQPO1G0iO!<OQPO,5=RO!<YQPO,5=ROOQO<<It<<ItO!<eQPO<<ItO!<jQQOAN?dO$pQPOAN?dO!<qQPOAN?bO!*nQPOAN?bO!<xQPOAN?bO$pQPO,5;]OOQO,5;],5;]OOQOAN?bAN?bOOQO7+&T7+&TO!*nQPO7+&TO!<}QPO1G2mOOQOAN?`AN?`O!=XQQOG25OO!*nQPOG24|O!=`QPOG24|OOQOG24|G24|O!=eQQO1G0wOOQO<<Io<<IoOOQOLD*hLD*hO!*nQPOLD*hOOQO!$'NS!$'NS",
8
+ stateData: "!>g~O$dOSTOSUOS~OYPO!okO$xTO%PVO%QXO%SZO%U^O%`_O%b`O%gbO%ieO%jgO%kiO~O$fnO$tpO$vqO$wrO~OYPO$xTO%PVO%QXO%SZO%U^O%`_O%b`O%gbO%ieO%jgO%kiO~O$fnO$y|O$z}O~O]!QO~O$fnO~OS!UO$fnO~OS!VO$fnO~OS!XOo!WO$fnO~OS!ZO$fnO~OS![O$fnO~OR!_OS!`O]!cOa!^Ow!dOx!dOy!dOz!dO{!dO$fnO$i!]O~O]!hOYXa$xXa%PXa%QXa%SXa%UXa%`Xa%bXa%gXa%iXa%jXa%kXaSXa$fXaRXaaXawXaxXayXazXa{Xa!lXa!oXa$iXa$tXa%WXa%XXa%]Xa%_Xa%aXa%cXa%dXa%eXa%fXa%YXa%[Xa~O]!jO~O]!kO~OS!mO$fnO~OS!nO$fnO~OS!oOo!WO$fnO~OS!qO$fnO~OS!rO$fnO~Ou!tO!o!iX$}!iX~O!o!vO$}!wO~Oq!yO!o%RX~O!o!{O~O!o!|O~O]!}O~O!l#PO~OR#^OS#^Oa#]O$fnO$i!]O$l#RO$m#SO$n#TO$o#UO$p#VO$q#WO$r#XO$s#YOP$jPp$jP~O!o#`O!z#bO#d#aO~OS!oO$fnO~O!o#cO!z#eO#d#dO~O#d#fO~OQ#gO]$hXo$hXw$hXz$hX{$hX}$hX!O$hX!P$hX!Q$hX!R$hX!S$hX!T$hX!U$hX!V$hX!W$hX!X$hX!Y$hX!Z$hX![$hX!^$hX!`$hX!o$hX[$hXq$hX!_$hX#d$hX#g$hX#h$hX#i$hX#j$hX#k$hX#l$hX#m$hX#n$hX#o$hX#p$hX#q$hX#r$hX!l$hXY$hX!z$hX~OutX~P+xOu#iO~O]#lOo#sOw#uOz#qO{#vO}#mO!O#nO!P#oO!Q#pO!R#rO!S#rO!T#sO!U#sO!V#sO!W#tO!X#tO!Y#uO!Z#vO![#vO!^#xO!`#yO~O!o#zO~P.zO[$gP~P$pO]$OOx$PO$fnO$i!]O~O!o$TO$}$UO~O!o$XO!z$ZO#d$YO~OS$[O$fnO~O!o$]O!z$_O#d$^O~O#d$`O~O!o$aO~P.zO!l$bO$fnO$z}O~Ou!tO!o!ia$}!ia~Oq$fO~O$fnO!o%Ra~Oq$hO!o%Ra~OS$kOYPO$fnO[%VP~O!l$nO!|$pO~OS$rOYPO$fnO~OP$uOp$uO~Oo!WOPeXpeXqeX~Oq$wOP$jXp$jX~OR$|OS$zO$fnO~O]#lO~OS%TO$fnO~O[%UO~P.zO]#lO!^#xO!`#yOovawvazva{va}va!Ova!Pva!Qva!Rva!Sva!Tva!Uva!Vva!Wva!Xva!Yva!Zva![va!ova[vaqva!_va#dva#gva#hva#iva#jva#kva#lva#mva#nva#ova#pva#qva#rva!lvaYva!zva~OS%cO$fnO~Oq%dO[$gX~P.zO[%fO~O[%kO}%jO!O%iO~O[%lO}%jO!O%iO~O!l$nO!|%oO~O!o%rO!z%tO#d%sO~O$fnO!n$|P~O!o%{O~O$fnO!o%Ri~OS&OOYPO$fnO~O!z&PO[!yXq!yX~Oq&QO[%VX~O[&SO~OYPO!l$nO!n&mO!o&hO$t&WO%W&VO%X&YO%]&[O%_&^O%`_O%a&_O%b`O%c&cO%d&eO%e&fO%f&gO~P$pOR$|OS$zOYPO$fnO~OS&pOYPO$fnO~O!z&qO~Oq&rO!n%hX~O!n&tO~OR#^OS#^Oa#]O$fnO$i!]O$l#RO$m#SO$n#TO$o#UO$p#VO$q#WO$r#XO$s#YO~OP$jap$ja~P<eOq&vOP$jap$ja~O!o%rO~P.zOo!WO!o!{X#d!{X!l!{X[!{Xq!{X!n!{X~OutX~P=|Ou&yO~O!o%rO#d%sO~O!o&zO~P.zO!o&zO#d&{O~O!o&|O~OP&}Op&}O~O]siosiutiwsizsi{si}si!Osi!Psi!Qsi!Rsi!Ssi!Tsi!Usi!Vsi!Wsi!Xsi!Ysi!Zsi![si!^si!`si!osi[siqsi!_si#dsi#gsi#hsi#isi#jsi#ksi#lsi#msi#nsi#osi#psi#qsi#rsi!lsiYsi!zsi~O['OO~O]#lOo#sOw#uOz#qO{#vO!P#oO!Q#pO!R#rO!S#rO!T#sO!U#sO!V#sO!W#tO!X#tO!Y#uO!Z#vO![#vO!^#xO!`#yO}|i!o|i[|iq|i!_|i#d|i#g|i#h|i#i|i#j|i#k|i#l|i#m|i#n|i#o|i#p|i#q|i#r|i!l|iY|i!z|i~O!O#nO~PBbO!O|i~PBbO]#lOo#sOw#uOz#qO{#vO!R#rO!S#rO!T#sO!U#sO!V#sO!W#tO!X#tO!Y#uO!Z#vO![#vO!^#xO!`#yO}|i!O|i!P|i!o|i[|iq|i!_|i#d|i#g|i#h|i#i|i#j|i#k|i#l|i#m|i#n|i#o|i#p|i#q|i#r|i!l|iY|i!z|i~O!Q#pO~PE`O!Q|i~PE`O]#lOo#sOw#uO{#vO!T#sO!U#sO!V#sO!W#tO!X#tO!Y#uO!Z#vO![#vO!^#xO!`#yOz|i}|i!O|i!P|i!Q|i!o|i[|iq|i!_|i#d|i#g|i#h|i#i|i#j|i#k|i#l|i#m|i#n|i#o|i#p|i#q|i#r|i!l|iY|i!z|i~O!R#rO!S#rO~PH^O!R|i!S|i~PH^O]#lOw#uO{#vO!Y#uO!Z#vO![#vO!^#xO!`#yOo|iz|i}|i!O|i!P|i!Q|i!R|i!S|i!T|i!U|i!V|i!o|i[|iq|i!_|i#d|i#g|i#h|i#i|i#j|i#k|i#l|i#m|i#n|i#o|i#p|i#q|i#r|i!l|iY|i!z|i~O!W#tO!X#tO~PK_O!W|i!X|i~PK_O]#lO!^#xO!`#yOo|iw|iz|i}|i!O|i!P|i!Q|i!R|i!S|i!T|i!U|i!V|i!W|i!X|i!Y|i!o|i[|iq|i!_|i#d|i#g|i#h|i#i|i#j|i#k|i#l|i#m|i#n|i#o|i#p|i#q|i#r|i!l|iY|i!z|i~O{#vO!Z#vO![#vO~PN`O{|i!Z|i![|i~PN`O!_'PO~P.zO[$ga~P$pOq'RO[$ga~O['TO}%jO!O%iO~O!o'WO~O!o'ZO~P.zO!o'ZO#d'[O~O!o'_O~P.zO!o'_O#d'`O~O!o'aO~Ou'bO$}'dOq!mX!n!mX~Oq'eO!n$|X~O!n'gO~O['hO!`'iO~O!z'jO[!yaq!ya~OS$kOYPO$fnO[%Va~Oq'mO[%Va~O!o'pO#d'oO#g'oO#h'oO#i'oO#j'oO#k'oO#l'oO#m'oO#n'oO#o'oO#p'oO#q'rO#r'rO~P.zOYPO!l$nO!o'sO$t&WO%W&VO%X&YO%]&[O%_&^O%`_O%a&_O%b`O%c&cO%d&eO%e&fO%f&gO~P$pOYPO!l'yO~OS'{Oo!WO$fnO~OS'{O$fnO~O]'}O~O!o'sO~P$pO!o'sO~OYPO!l$nO!n(RO!o&hO$t&WO%W&VO%X&YO%]&[O%_&^O%`_O%a&_O%b`O%c&cO%d&eO%e&fO%f&gO~P$pO!l$nO~O!z(TO~OS$rOYPO$fnO!n%ha~Oq(WO!n%ha~OP$jip$ji~P<eOS(ZO$fnO~O[$Xaq$Xa!l$Xa!z$Xa~P.zO[$gi~P$pO!O%iO[!ei}!ei~O!o(aO~P.zO!o(aO#d(bO~O!l$bO$fnO~Ou'bO$}(fOq!ma!n!ma~O$fnO!n$|a~Oq(iO!n$|a~O!o(kO~OS$kOYPO$fnO[%Vi~O!o(pO~O!o(rO~P$pO!o(rO~O!l$nO~P.zOYPO!l(uO~P.zOYPO!l$nO!n(xO!o&hO$t&WO%W&VO%X&YO%]&[O%^(wO%_&^O%`_O%a&_O%b`O%c&cO%d&eO%e&fO%f&gO~P$pO!z(|O#d({O!o#`a~OS(}O$fnO~O!o)PO%`_O%a&_O%b`O~P$pO!o(rO~P.zOS$rOYPO$fnO!n%hi~Oo!WOuti!o!{i#d!{i!l!{i[!{iq!{i!n!{i~O!o)VO~P.zO!o)XO~P.zO!o)ZO~P.zO$fnO!n$|i~O[)^O~OS$kOYPO$fnO~O!o)_O~P.zO!o)`O~P.zO$w)aOR#QiS#QiY#Qi]#Qia#Qiw#Qix#Qiy#Qiz#Qi{#Qi!l#Qi!n#Qi!o#Qi$f#Qi$i#Qi$t#Qi%W#Qi%X#Qi%]#Qi%_#Qi%`#Qi%a#Qi%b#Qi%c#Qi%d#Qi%e#Qi%f#Qi%^#Qi~OYPO!l)cO~OYPO%Y)eO%[)fO~OYPO!l$nO~OYPO!l$nO!n)mO!o&hO$t&WO%W&VO%X&YO%]&[O%^(wO%_&^O%`_O%a&_O%b`O%c&cO%d&eO%e&fO%f&gO~P$pO!z)rO#d)qO!o#`i~O!o)sO~P.zO!o)uO~P$pO!o)sO~O!o)vO~P.zO!o)wO~O!l$nO$t&WO~O!l$nO!z*OO~OYPO!n*QO%Y)eO%[)fO~O!n*SO~O!o#`q~P.zO#d*UO!o#`q~O!o*YO~P$pO!o*YO~P.zO[*[O~P$pOYPO!n*^O%Y)eO%[)fO~O!l$nO!z*aO~Oq*bO!l%ZX!z%ZX~P.zO!n*dO~O!o#`y~P.zO#d*gO!o#`y~O!o*hO~P.zO[*iO~P$pO#d'oO#g'oO#h'oO#i'oO#j'oO#k'oO#l'oO#m'oO#n'oO#o'oO#p'oO#q*lO#r*lO[#eX~P.zO[*iO~O!l$nO!z*oO~O!l%Za!z%Za~P$pOq*pO!l%Za!z%Za~O!n*qO~O!o#`!R~P.zO[*sO~P$pO[*sO~O!l%Zi!z%Zi~P$pO!o#`!Z~P.zO[*yO~O[#ei~P.zOTUu!z#n!Q#k![#j#i{!Z#q#g!S!Y!R#dx}#m!P!O#lza#p!X!V!U#o!W!To!|#r#h$f!`w~",
9
+ goto: "D[%iPPPPPPPP%j&aP'WPP+p+s.vP0R.v1m1q1z1z1z1z1z1z1z1z2RPPP2f.v3hP5WPPPPP5WPPPPPPPPPPPPPP5WPPP&a6c6u6u6u&a&a6}7U7[7`P7gPP7o7v7o7{7o8Q8V8Z8b8hP8pP9s;[;b;k;w<P<S<]<d<j<s<S<|=T=Z<S=a=h=t>T>]P>l>uPPPPPPPPPPPP<S>{?S?S?S<S8V?]?d?j8V8V?r8V?y8V@Q@X@_AlArA|BSBYB`BfBlBvCQPPPCWPC[5WPCbChPPPPPPPPP6uPPPPPCoCuPCWPPCxPCWPDOPPPDRPPPPPPPPPPPPDX!iROSm!}#P$j$n$p$q%o&Q&U&]&l&n&r'X'm'w'x'y(W(n(t(u(y(z)T)c)d)j)k)n)y*T!iQOSm!}#P$j$n$p$q%o&Q&U&]&l&n&r'X'm'w'x'y(W(n(t(u(y(z)T)c)d)j)k)n)y*TQoPS!OUtS!RY[Q!UaQ!VcQ!XdQ!ZfQ![h#b!`j{!c!d!h#a#d#l#m#n#o#p#q#r#s#t#u#v#x$Y$^$n%d%s&U&X&Z&d&i&l&{'R'['`'q't'y'}(](b(z({)P)g)q)s)u)z*U*Y*b*g*h*k*pQ!mvQ!nwS!ox!YQ!qyQ!rzQ!x!QY#^!W#g$w&v(Y[#}!j!k$O$P%i%jQ$[!pQ$c!tQ$e!wU$g!y$h%}W$k!}&Q'm(nW$r#P&r(W)Tr$z#b#e#f$Z$_$`$p%o%t&P&n&q'X'j(T(|)rQ%T#iQ%c#yQ%m$UW%x$b'e(i)]Q%|$fQ&O$jQ&p$qS'{&`&aQ(Z&yQ(d'bQ(g'dQ(l'iQ(}'|R)[(fR!ioQ!ejQ!s{Q#j!cQ#k!dS#{!h#lQ$y#aQ%O#dQ%W#mQ%X#nQ%Y#oQ%Z#pQ%[#qQ%]#rQ%^#sQ%_#tQ%`#uQ%a#vQ%b#xQ%p$YQ%u$^Y&T$n&U&l'y(zY'Q%d'R(]*b*pQ']%sQ'v&XQ'w&ZQ(O&dQ(P&iQ([&{Q(`'[Q(c'`Q(o'qQ(q'tQ)O'}Q)Y(bQ)o({Q)t)PS)|)g)zQ*V)qQ*X)sU*Z)u*Y*hQ*f*UQ*r*gR*v*k#c!bj{!c!d!h#a#d#l#m#n#o#p#q#r#s#t#u#v#x$Y$^$n%d%s&U&X&Z&d&i&l&{'R'['`'q't'y'}(](b(z({)P)g)q)s)u)z*U*Y*b*g*h*k*p#b!^j{!c!d!h#a#d#l#m#n#o#p#q#r#s#t#u#v#x$Y$^$n%d%s&U&X&Z&d&i&l&{'R'['`'q't'y'}(](b(z({)P)g)q)s)u)z*U*Y*b*g*h*k*pY#]!W#g$w&v(Y]#}!j!k$O$P%i%jT#h!_!`S#_!W#gV&u$w&v(YZ#Z!W#g$w&v(YQ!YdQ!pxQ$v#^S&x$z$|Q'|&`R)U(Z!x#w!e!s#j#k#{$y%O%W%X%Y%Z%[%]%^%_%`%a%b%p%u&T'Q']'v'w(O(P([(`(c(o(q)O)Y)o)t)|*V*X*Z*f*r*vR%S#h#b!aj{!c!d!h#a#d#l#m#n#o#p#q#r#s#t#u#v#x$Y$^$n%d%s&U&X&Z&d&i&l&{'R'['`'q't'y'}(](b(z({)P)g)q)s)u)z*U*Y*b*g*h*k*ps${#b#e#f$Z$_$`$p%o%t&P&n&q'X'j(T(|)r#c!fj{!c!d!h#a#d#l#m#n#o#p#q#r#s#t#u#v#x$Y$^$n%d%s&U&X&Z&d&i&l&{'R'['`'q't'y'}(](b(z({)P)g)q)s)u)z*U*Y*b*g*h*k*pQ$Q!jQ$S!kQ%g$OQ%h$PQ'U%iR'V%j]$R!j!k$O$P%i%jSUOmRtSQ!PUR!ltT!OUtS!OUtR$c!tQ%y$bV(h'e(i)]S]OmRuSVWOSmVYOSmV[OSmTkOmSaOmRvSQ#O!UR$V!mQ$l!}V'l&Q'm(nQ$}#bQ%P#eQ%Q#fQ%q$ZQ%v$_Q%w$`Q&o$pS'Y%o&nQ'^%tQ'k&PQ(U&qQ(^'XQ(m'jQ)S(TQ)p(|R*W)rQ$o#OQ%n$VW&h$n&l'y(zQ's&UQ(S&oQ(_'YQ(s'vQ)R(OQ)W(^Q)l(yQ)x)bQ)})hS*R)k)nS*`){*OQ*e*TQ*m*[S*n*_*aQ*u*iQ*w*oQ*x*sR*z*yX&k$n&l'y(zW&i$n&l'y(zR't&UW&h$n&l'y(zQ's&UR)x)b]&X$n&U&l'y(z)bR)b(sW&h$n&l'y(zR's&UZ&Z$n&U&l'y(zX)i(u)c)j)yW)g(u)c)j)yR)z)dW)h(u)c)j)yR){)dZ&]$n&U&l'y(zQ'z&]R(v'xQ(y'yR)n(zZ&b$n&U&l'y(zW&j$n&l'y(zQ'u&UR)Q'}SdOmQxS]&`$n&U&l'y'}(z]&a$n&U&l'y'}(zSfOmQyS]&a$n&U&l'y'}(zQ*])uQ*j*YR*t*hQ'q&TR*k*ZZ&d$n&U&l'y(zW&j$n&l'y(zR'u&UScOmRwSQ#Q!VR$W!nQ$s#PV(V&r(W)TSfOmRySShOmRzSSjOmR{SQmOR!gmSSOmfsS$j$q&U&n'X'x(t)d)k*TW$j!}&Q'm(nW$q#P&r(W)TW&U$n&l'y(zQ&n$pQ'X%oQ'x&]Q(t'wW)d(u)c)j)yQ)k(yR*T)nQ$x#_R&w$xQ%e#{S'S%e*cR*c)|Q!u!OR$d!uQ'c%xR(e'cQ'f%yR(j'fQ!z!RR$i!zQ&R$lR'n&RQ&l$nS(Q&l(zR(z'yQ)j(uQ)y)cT*P)j)yQ&s$sR(X&sTlOmQ#|!hR%V#lQ#[!WR%R#gZ#]!W#g$w&v(YQ$c!tR(d'bR%z$bQ!SYR!T[R$m!}Q){)gR*_)zR$t#P",
10
+ nodeNames: "⚠ > < BuiltinType BuiltinFn LineComment BlockComment Module Attribute StandardAttribute @ Identifier ) ( AttrArgs Expression Literal Number Boolean CallExpression CallTemplateArgs TypeOrExpr Kw Kw Kw Kw Kw Kw Kw Kw TemplateArgs < > , ArgList PathExpression PathBase :: UnaryExpression - ! ~ & * BinaryExpression || && | ^ == != <= > >= << >> + / % PostfixExpression [ ] . IfAttribute ConditionExpr ConditionNot ConditionAnd ConditionOr ElifAttribute ElseAttribute Import ImportPath Kw Kw { ImportItem } ; DiagnosticDirective Kw EnableDirective Kw RequiresDirective Kw FunctionDeclaration Kw ParamList Param : Type -> Block Statement Kw IfStatement Kw Kw SwitchStatement Kw SwitchClause Kw Kw LoopStatement Kw LoopBlock Kw ForStatement Kw VarStatement Kw Kw Kw = UpdatingExpr AssignOp += -= *= /= %= &= |= ^= <<= >>= ++ -- WhileStatement Kw Kw Kw Kw ExpressionStatement StructDeclaration Kw StructBody StructMember GlobalVariableDeclaration GlobalValueDeclaration Kw TypeAliasDeclaration Kw ConstAssert Kw",
11
+ maxTerm: 211,
12
+ nodeProps: [
13
+ ["openedBy", 12,"(",76,"{"],
14
+ ["closedBy", 13,")",74,"}"]
15
+ ],
16
+ skippedNodes: [0,5,6],
17
+ repeatNodeCount: 12,
18
+ tokenData: "1a~RxX^#opq#oqr$duv$qvw%Oxy%eyz%jz{%o{|%||}&c}!O&h!O!P'V!P!Q(j!Q!R*g!R![+[![!],q!]!^-O!^!_-T!_!`-r!`!a.P!b!c.p!c!}.u!}#O/W#P#Q/]#Q#R/b#R#S.u#T#U/o#U#o.u#o#p0k#p#q0p#q#r1V#r#s1[#y#z#o$f$g#o#BY#BZ#o$IS$I_#o$I|$JO#o$JT$JU#o$KV$KW#o&FU&FV#o~#tY$d~X^#opq#o#y#z#o$f$g#o#BY#BZ#o$IS$I_#o$I|$JO#o$JT$JU#o$KV$KW#o&FU&FV#o~$iPx~!_!`$l~$qO!S~~$vP![~!_!`$y~%OO#k~~%TQz~vw%Z!_!`%`~%`O!O~~%eO#l~~%jO]~~%oO[~~%tP{~!_!`%w~%|O#i~~&RQ!Y~{|&X!_!`&^~&^O#q~~&cO#g~~&hOq~~&mRw~}!O&v!_!`&{!`!a'Q~&{O#r~~'QO#h~~'VO!|~~'[P!`~!Q!['_~'dTa~!Q!['_!g!h's#X#Y's#Y#Z(e#[#](e~'vR{|(P}!O(P!Q![(V~(SP!Q![(V~([Ra~!Q![(V#Y#Z(e#[#](e~(jOa~~(oR!Z~z{(x!P!Q)y!_!`*b~({TOz(xz{)[{;'S(x;'S;=`)s<%lO(x~)_TO!P(x!P!Q)n!Q;'S(x;'S;=`)s<%lO(x~)sOU~~)vP;=`<%l(x~*OST~OY)yZ;'S)y;'S;=`*[<%lO)y~*_P;=`<%l)y~*gO#j~~*lYa~!O!P'_!Q![+[!g!h's!z!{+y#X#Y's#Y#Z(e#[#](e#]#^(e#i#j(e#l#m+y~+aWa~!O!P'_!Q![+[!g!h's#X#Y's#Y#Z(e#[#](e#]#^(e#i#j(e~+|R!Q![,V!c!i,V#T#Z,V~,[Va~!Q![,V!c!i,V#T#Y,V#Y#Z,V#[#](e#]#^(e#i#j(e~,vP!z~![!],y~-OOu~~-TO!o~~-YQo~!^!_-`!_!`-m~-eP!W~!_!`-h~-mO#o~~-rO!T~~-wP#d~!_!`-z~.PO!R~R.WQpP!UQ!_!`.^!`!a.cQ.cO!VQQ.hP!XQ!_!`.kQ.pO#pQ~.uOY~P.zS$fP!Q![.u!c!}.u#R#S.u#T#o.u~/]O!^~~/bO!_~~/gP!Q~!_!`/j~/oO#n~R/tU$fP!Q![.u!c!}.u#R#S.u#T#g.u#g#h0W#h#o.uR0_S$}Q$fP!Q![.u!c!}.u#R#S.u#T#o.u~0pO!l~~0uQ!P~!_!`0{#p#q1Q~1QO#m~~1VO}~~1[O!n~~1aOy~",
19
+ tokenizers: [0, 1, fallback],
20
+ topRules: {"Module":[0,7]},
21
+ specialized: [{term: 31, get: (value, stack) => (templateCallExtend(value, stack) << 1) | 1, external: templateCallExtend, extend: true},{term: 160, get: (value, stack) => (builtinSpecialize(value, stack) << 1), external: builtinSpecialize},{term: 160, get: (value) => spec_identifier[value] || -1}],
22
+ tokenPrec: 3432
23
+ })
@@ -0,0 +1,65 @@
1
+ // This file was generated by lezer-generator. You probably shouldn't edit it.
2
+ export const
3
+ templateArgsEndFallback = 1,
4
+ templateCallStart = 2,
5
+ BuiltinType = 3,
6
+ BuiltinFn = 4,
7
+ LineComment = 5,
8
+ BlockComment = 6,
9
+ Module = 7,
10
+ Attribute = 8,
11
+ StandardAttribute = 9,
12
+ Identifier = 11,
13
+ AttrArgs = 14,
14
+ Expression = 15,
15
+ Literal = 16,
16
+ Number = 17,
17
+ Boolean = 18,
18
+ CallExpression = 19,
19
+ CallTemplateArgs = 20,
20
+ TypeOrExpr = 21,
21
+ TemplateArgs = 30,
22
+ templateArgsEnd = 32,
23
+ ArgList = 34,
24
+ PathExpression = 35,
25
+ PathBase = 36,
26
+ UnaryExpression = 38,
27
+ BinaryExpression = 44,
28
+ PostfixExpression = 59,
29
+ IfAttribute = 63,
30
+ ConditionExpr = 64,
31
+ ConditionNot = 65,
32
+ ConditionAnd = 66,
33
+ ConditionOr = 67,
34
+ ElifAttribute = 68,
35
+ ElseAttribute = 69,
36
+ Import = 70,
37
+ ImportPath = 71,
38
+ ImportItem = 75,
39
+ DiagnosticDirective = 78,
40
+ EnableDirective = 80,
41
+ RequiresDirective = 82,
42
+ FunctionDeclaration = 84,
43
+ ParamList = 86,
44
+ Param = 87,
45
+ Type = 89,
46
+ Block = 91,
47
+ Statement = 92,
48
+ IfStatement = 94,
49
+ SwitchStatement = 97,
50
+ SwitchClause = 99,
51
+ LoopStatement = 102,
52
+ LoopBlock = 104,
53
+ ForStatement = 106,
54
+ VarStatement = 108,
55
+ UpdatingExpr = 113,
56
+ AssignOp = 114,
57
+ WhileStatement = 127,
58
+ ExpressionStatement = 132,
59
+ StructDeclaration = 133,
60
+ StructBody = 135,
61
+ StructMember = 136,
62
+ GlobalVariableDeclaration = 137,
63
+ GlobalValueDeclaration = 138,
64
+ TypeAliasDeclaration = 140,
65
+ ConstAssert = 142
@@ -0,0 +1,106 @@
1
+ import type { Tree } from "@lezer/common";
2
+ import { type AbstractElem, groupBy, type WeslAST } from "wesl";
3
+
4
+ export interface NodeInfo {
5
+ type: string;
6
+ start: number;
7
+ }
8
+
9
+ export interface CompareResult {
10
+ matching: number;
11
+ missingInLezer: NodeInfo[];
12
+ missingInWesl: NodeInfo[];
13
+ }
14
+
15
+ // Map wesl AST kinds to lezer node types.
16
+ // Note: call-expression excluded - lezer's CallExpression is only for template calls,
17
+ // while regular calls are PostfixExpression with ArgList.
18
+ const weslToLezer: Record<string, string> = {
19
+ fn: "FunctionDeclaration",
20
+ struct: "StructDeclaration",
21
+ gvar: "GlobalVariableDeclaration",
22
+ const: "GlobalValueDeclaration",
23
+ override: "GlobalValueDeclaration",
24
+ alias: "TypeAliasDeclaration",
25
+ type: "Type",
26
+ import: "Import",
27
+ member: "StructMember",
28
+ param: "Param",
29
+ assert: "ConstAssert",
30
+ };
31
+
32
+ // Local declarations use the same wesl kinds as globals but map to VarStatement in lezer.
33
+ const localDeclKinds = new Set(["var", "let", "const"]);
34
+
35
+ const lezerTypes = new Set(Object.values(weslToLezer));
36
+
37
+ /** @return lezer node type name for a wesl AST kind, or null if not mapped. */
38
+ function mapWeslKind(kind: string): string | null {
39
+ return weslToLezer[kind] ?? null;
40
+ }
41
+
42
+ /** Extract comparable nodes from a lezer parse tree. */
43
+ export function extractLezerNodes(tree: Tree): NodeInfo[] {
44
+ const nodes: NodeInfo[] = [];
45
+ tree.iterate({
46
+ enter(node) {
47
+ if (lezerTypes.has(node.type.name)) {
48
+ nodes.push({ type: node.type.name, start: node.from });
49
+ }
50
+ },
51
+ });
52
+ return nodes;
53
+ }
54
+
55
+ /** Extract comparable nodes from a wesl AST. */
56
+ export function extractWeslNodes(ast: WeslAST): NodeInfo[] {
57
+ const nodes: NodeInfo[] = [];
58
+ collectNodes(ast.moduleElem, false, nodes);
59
+ return nodes;
60
+ }
61
+
62
+ /** Walk container elements only (not expressions), collecting mapped nodes. */
63
+ function collectNodes(
64
+ elem: AbstractElem,
65
+ inFn: boolean,
66
+ nodes: NodeInfo[],
67
+ ): void {
68
+ const isLocalDecl = inFn && localDeclKinds.has(elem.kind);
69
+ const mapped = isLocalDecl ? null : mapWeslKind(elem.kind);
70
+ if (mapped && "start" in elem)
71
+ nodes.push({ type: mapped, start: elem.start });
72
+
73
+ if (!("contents" in elem)) return;
74
+ const childInFn = inFn || elem.kind === "fn";
75
+ for (const child of elem.contents) collectNodes(child, childInFn, nodes);
76
+ }
77
+
78
+ /** Compare nodes from wesl and lezer ASTs, matching by type and start position. */
79
+ export function compareNodes(
80
+ wesl: NodeInfo[],
81
+ lezer: NodeInfo[],
82
+ ): CompareResult {
83
+ let matching = 0;
84
+ const missingInLezer: NodeInfo[] = [];
85
+ const missingInWesl: NodeInfo[] = [];
86
+ const weslByType = groupBy(wesl, n => n.type);
87
+ const lezerByType = groupBy(lezer, n => n.type);
88
+ const allTypes = new Set([...weslByType.keys(), ...lezerByType.keys()]);
89
+
90
+ for (const type of allTypes) {
91
+ const weslNodes = weslByType.get(type) ?? [];
92
+ const lezerNodes = lezerByType.get(type) ?? [];
93
+ const lezerStarts = new Set(lezerNodes.map(n => n.start));
94
+ const weslStarts = new Set(weslNodes.map(n => n.start));
95
+
96
+ for (const wn of weslNodes) {
97
+ if (lezerStarts.has(wn.start)) matching++;
98
+ else missingInLezer.push(wn);
99
+ }
100
+ for (const ln of lezerNodes) {
101
+ if (!weslStarts.has(ln.start)) missingInWesl.push(ln);
102
+ }
103
+ }
104
+
105
+ return { matching, missingInLezer, missingInWesl };
106
+ }
@@ -0,0 +1,17 @@
1
+ import type { Tree } from "@lezer/common";
2
+
3
+ const errorSnippetLength = 40;
4
+
5
+ /** Walk a lezer tree and return snippets around each error node. */
6
+ export function findErrors(tree: Tree, src: string): string[] {
7
+ const errors: string[] = [];
8
+ tree.iterate({
9
+ enter(node) {
10
+ if (node.type.isError) {
11
+ const snippet = src.slice(node.from, node.from + errorSnippetLength);
12
+ errors.push(`${node.from}: "${snippet.replace(/\n/g, "\\n")}"`);
13
+ }
14
+ },
15
+ });
16
+ return errors;
17
+ }