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 +193 -0
- package/package.json +43 -0
- package/src/Highlight.ts +64 -0
- package/src/Tokens.ts +47 -0
- package/src/index.ts +2 -0
- package/src/parser.js +23 -0
- package/src/parser.terms.js +65 -0
- package/src/test/CompareAst.ts +106 -0
- package/src/test/ErrorFree.ts +17 -0
- package/src/test/ExternalShaders.test.ts +71 -0
- package/src/test/Highlight.test.ts +184 -0
- package/src/test/HighlightCheck.ts +51 -0
- package/src/test/Validate.test.ts +8 -0
- package/src/test/ValidateFixture.ts +60 -0
- package/src/test/WalkAst.ts +41 -0
- package/src/test/fixtures/compute.wgsl +21 -0
- package/src/test/fixtures/conditional.wesl +30 -0
- package/src/test/fixtures/imports.wesl +9 -0
- package/src/test/fixtures/render.wgsl +42 -0
- package/src/test/fixtures/statements.wgsl +89 -0
- package/src/wesl.grammar +457 -0
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!ZfQP)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!`~!Qy!_!`*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 => 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
|
+
}
|
package/src/Highlight.ts
ADDED
|
@@ -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
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!ZfQP)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!`~!Qy!_!`*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 => (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
|
+
}
|