wesl 0.6.0-pre2

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.
Files changed (110) hide show
  1. package/dist/index.cjs +2617 -0
  2. package/dist/index.cjs.map +1 -0
  3. package/dist/index.js +2617 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/linker/packages/linker/src/AbstractElems.d.ts +104 -0
  6. package/dist/linker/packages/linker/src/BindIdents.d.ts +16 -0
  7. package/dist/linker/packages/linker/src/CommentsGrammar.d.ts +6 -0
  8. package/dist/linker/packages/linker/src/FlattenTreeImport.d.ts +11 -0
  9. package/dist/linker/packages/linker/src/ImportGrammar.d.ts +13 -0
  10. package/dist/linker/packages/linker/src/ImportTree.d.ts +17 -0
  11. package/dist/linker/packages/linker/src/Linker.d.ts +26 -0
  12. package/dist/linker/packages/linker/src/LowerAndEmit.d.ts +25 -0
  13. package/dist/linker/packages/linker/src/ParseWESL.d.ts +36 -0
  14. package/dist/linker/packages/linker/src/ParsedRegistry.d.ts +26 -0
  15. package/dist/linker/packages/linker/src/PathUtil.d.ts +9 -0
  16. package/dist/linker/packages/linker/src/Scope.d.ts +55 -0
  17. package/dist/linker/packages/linker/src/Slicer.d.ts +26 -0
  18. package/dist/linker/packages/linker/src/StandardTypes.d.ts +6 -0
  19. package/dist/linker/packages/linker/src/Util.d.ts +26 -0
  20. package/dist/linker/packages/linker/src/WESLCollect.d.ts +29 -0
  21. package/dist/linker/packages/linker/src/WESLGrammar.d.ts +23 -0
  22. package/dist/linker/packages/linker/src/WESLTokens.d.ts +42 -0
  23. package/dist/linker/packages/linker/src/WgslBundle.d.ts +13 -0
  24. package/dist/linker/packages/linker/src/debug/ASTtoString.d.ts +3 -0
  25. package/dist/linker/packages/linker/src/debug/ImportToString.d.ts +2 -0
  26. package/dist/linker/packages/linker/src/debug/LineWrapper.d.ts +21 -0
  27. package/dist/linker/packages/linker/src/debug/ScopeToString.d.ts +4 -0
  28. package/dist/linker/packages/linker/src/index.d.ts +7 -0
  29. package/dist/linker/packages/linker/src/test/ErrorLogging.test.d.ts +1 -0
  30. package/dist/linker/packages/linker/src/test/Expression.test.d.ts +1 -0
  31. package/dist/linker/packages/linker/src/test/FlattenTreeImport.test.d.ts +1 -0
  32. package/dist/linker/packages/linker/src/test/ImportCases.test.d.ts +1 -0
  33. package/dist/linker/packages/linker/src/test/ImportSyntaxCases.test.d.ts +1 -0
  34. package/dist/linker/packages/linker/src/test/LinkGlob.test.d.ts +1 -0
  35. package/dist/linker/packages/linker/src/test/LinkPackage.test.d.ts +1 -0
  36. package/dist/linker/packages/linker/src/test/Linker.test.d.ts +1 -0
  37. package/dist/linker/packages/linker/src/test/MatchWgslD.test.d.ts +1 -0
  38. package/dist/linker/packages/linker/src/test/ParseComments.test.d.ts +1 -0
  39. package/dist/linker/packages/linker/src/test/ParseWESL.test.d.ts +1 -0
  40. package/dist/linker/packages/linker/src/test/PathUtil.test.d.ts +1 -0
  41. package/dist/linker/packages/linker/src/test/PrettyGrammar.test.d.ts +1 -0
  42. package/dist/linker/packages/linker/src/test/ScopeWESL.test.d.ts +1 -0
  43. package/dist/linker/packages/linker/src/test/Slicer.test.d.ts +1 -0
  44. package/dist/linker/packages/linker/src/test/TestSetup.d.ts +1 -0
  45. package/dist/linker/packages/linker/src/test/TestUtil.d.ts +15 -0
  46. package/dist/linker/packages/linker/src/test/Util.test.d.ts +1 -0
  47. package/dist/linker/packages/linker/src/test/WgslTests.d.ts +0 -0
  48. package/dist/linker/packages/linker/src/test/shared/StringUtil.d.ts +8 -0
  49. package/dist/linker/packages/linker/src/test/shared/test/StringUtil.test.d.ts +1 -0
  50. package/dist/minified.cjs +2 -0
  51. package/dist/minified.cjs.map +1 -0
  52. package/dist/minified.js +2617 -0
  53. package/dist/minified.js.map +1 -0
  54. package/dist/wesl-testsuite/src/test-cases/BulkTests.d.ts +4 -0
  55. package/dist/wesl-testsuite/src/test-cases/ImportCases.d.ts +3 -0
  56. package/dist/wesl-testsuite/src/test-cases/ImportSyntaxCases.d.ts +3 -0
  57. package/package.json +45 -0
  58. package/src/AbstractElems.ts +148 -0
  59. package/src/BindIdents.ts +277 -0
  60. package/src/CommentsGrammar.ts +44 -0
  61. package/src/FlattenTreeImport.ts +59 -0
  62. package/src/ImportGrammar.ts +142 -0
  63. package/src/ImportTree.ts +19 -0
  64. package/src/Linker.ts +151 -0
  65. package/src/LowerAndEmit.ts +143 -0
  66. package/src/ParseWESL.ts +106 -0
  67. package/src/ParsedRegistry.ts +97 -0
  68. package/src/PathUtil.ts +52 -0
  69. package/src/Scope.ts +100 -0
  70. package/src/Slicer.ts +127 -0
  71. package/src/StandardTypes.ts +66 -0
  72. package/src/Util.ts +112 -0
  73. package/src/WESLCollect.ts +336 -0
  74. package/src/WESLGrammar.ts +538 -0
  75. package/src/WESLTokens.ts +97 -0
  76. package/src/WgslBundle.ts +16 -0
  77. package/src/debug/ASTtoString.ts +149 -0
  78. package/src/debug/ImportToString.ts +21 -0
  79. package/src/debug/LineWrapper.ts +65 -0
  80. package/src/debug/ScopeToString.ts +51 -0
  81. package/src/index.ts +7 -0
  82. package/src/test/ErrorLogging.test.ts +14 -0
  83. package/src/test/Expression.test.ts +22 -0
  84. package/src/test/FlattenTreeImport.test.ts +56 -0
  85. package/src/test/ImportCases.test.ts +440 -0
  86. package/src/test/ImportSyntaxCases.test.ts +22 -0
  87. package/src/test/LinkGlob.test.ts +25 -0
  88. package/src/test/LinkPackage.test.ts +26 -0
  89. package/src/test/Linker.test.ts +120 -0
  90. package/src/test/MatchWgslD.test.ts +16 -0
  91. package/src/test/ParseComments.test.ts +74 -0
  92. package/src/test/ParseWESL.test.ts +902 -0
  93. package/src/test/PathUtil.test.ts +34 -0
  94. package/src/test/PrettyGrammar.test.ts +21 -0
  95. package/src/test/ScopeWESL.test.ts +272 -0
  96. package/src/test/Slicer.test.ts +103 -0
  97. package/src/test/TestSetup.ts +4 -0
  98. package/src/test/TestUtil.ts +52 -0
  99. package/src/test/Util.test.ts +22 -0
  100. package/src/test/WgslTests.ts +0 -0
  101. package/src/test/__snapshots__/ParseDirectives.test.ts.snap +25 -0
  102. package/src/test/__snapshots__/ParseWESL.test.ts.snap +119 -0
  103. package/src/test/__snapshots__/ParseWESL2.test.ts.snap +67 -0
  104. package/src/test/__snapshots__/RustDirective.test.ts.snap +359 -0
  105. package/src/test/shared/StringUtil.ts +59 -0
  106. package/src/test/shared/test/StringUtil.test.ts +32 -0
  107. package/src/test/wgsl_1/main.wgsl +3 -0
  108. package/src/test/wgsl_1/util.wgsl +1 -0
  109. package/src/test/wgsl_2/main2.wgsl +3 -0
  110. package/src/test/wgsl_2/util2.wgsl +1 -0
@@ -0,0 +1,67 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`parse unicode ident 1`] = `
4
+ "module
5
+ text '
6
+ '
7
+ fn Δέλτα()
8
+ text 'fn '
9
+ decl %Δέλτα
10
+ text '(){}'
11
+ text '
12
+ '
13
+ fn réflexion()
14
+ text 'fn '
15
+ decl %réflexion
16
+ text '(){}'
17
+ text '
18
+ '
19
+ fn Кызыл()
20
+ text 'fn '
21
+ decl %Кызыл
22
+ text '(){}'
23
+ text '
24
+ '
25
+ fn 𐰓𐰏𐰇()
26
+ text 'fn '
27
+ decl %𐰓𐰏𐰇
28
+ text '(){}'
29
+ text '
30
+ '
31
+ fn 朝焼け()
32
+ text 'fn '
33
+ decl %朝焼け
34
+ text '(){}'
35
+ text '
36
+ '
37
+ fn سلام()
38
+ text 'fn '
39
+ decl %سلام
40
+ text '(){}'
41
+ text '
42
+ '
43
+ fn 검정()
44
+ text 'fn '
45
+ decl %검정
46
+ text '(){}'
47
+ text '
48
+ '
49
+ fn שָׁלוֹם()
50
+ text 'fn '
51
+ decl %שָׁלוֹם
52
+ text '(){}'
53
+ text '
54
+ '
55
+ fn गुलाबी()
56
+ text 'fn '
57
+ decl %गुलाबी
58
+ text '(){}'
59
+ text '
60
+ '
61
+ fn փիրուզ()
62
+ text 'fn '
63
+ decl %փիրուզ
64
+ text '(){}'
65
+ text '
66
+ '"
67
+ `;
@@ -0,0 +1,359 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`import a 1`] = `
4
+ [
5
+ {
6
+ "end": 8,
7
+ "imports": ImportTree {
8
+ "segments": [
9
+ SimpleSegment {
10
+ "args": undefined,
11
+ "as": undefined,
12
+ "name": "a",
13
+ },
14
+ ],
15
+ },
16
+ "kind": "treeImport",
17
+ "start": 0,
18
+ },
19
+ ]
20
+ `;
21
+
22
+ exports[`import a::* 1`] = `
23
+ [
24
+ {
25
+ "end": 11,
26
+ "imports": ImportTree {
27
+ "segments": [
28
+ SimpleSegment {
29
+ "args": undefined,
30
+ "as": undefined,
31
+ "name": "a",
32
+ },
33
+ Wildcard {
34
+ "wildcard": "*",
35
+ },
36
+ ],
37
+ },
38
+ "kind": "treeImport",
39
+ "start": 0,
40
+ },
41
+ ]
42
+ `;
43
+
44
+ exports[`import a::{b, c}::* 1`] = `
45
+ [
46
+ {
47
+ "end": 19,
48
+ "imports": ImportTree {
49
+ "segments": [
50
+ SimpleSegment {
51
+ "args": undefined,
52
+ "as": undefined,
53
+ "name": "a",
54
+ },
55
+ SegmentList {
56
+ "list": [
57
+ ImportTree {
58
+ "segments": [
59
+ SimpleSegment {
60
+ "args": undefined,
61
+ "as": undefined,
62
+ "name": "b",
63
+ },
64
+ ],
65
+ },
66
+ ImportTree {
67
+ "segments": [
68
+ SimpleSegment {
69
+ "args": undefined,
70
+ "as": undefined,
71
+ "name": "c",
72
+ },
73
+ ],
74
+ },
75
+ ],
76
+ },
77
+ Wildcard {
78
+ "wildcard": "*",
79
+ },
80
+ ],
81
+ },
82
+ "kind": "treeImport",
83
+ "start": 0,
84
+ },
85
+ ]
86
+ `;
87
+
88
+ exports[`import a::b::c 1`] = `
89
+ [
90
+ {
91
+ "end": 14,
92
+ "imports": ImportTree {
93
+ "segments": [
94
+ SimpleSegment {
95
+ "args": undefined,
96
+ "as": undefined,
97
+ "name": "a",
98
+ },
99
+ SimpleSegment {
100
+ "args": undefined,
101
+ "as": undefined,
102
+ "name": "b",
103
+ },
104
+ SimpleSegment {
105
+ "args": undefined,
106
+ "as": undefined,
107
+ "name": "c",
108
+ },
109
+ ],
110
+ },
111
+ "kind": "treeImport",
112
+ "start": 0,
113
+ },
114
+ ]
115
+ `;
116
+
117
+ exports[`import my::lighting::{ pbr }; 1`] = `
118
+ [
119
+ {
120
+ "end": 29,
121
+ "imports": ImportTree {
122
+ "segments": [
123
+ SimpleSegment {
124
+ "args": undefined,
125
+ "as": undefined,
126
+ "name": "my",
127
+ },
128
+ SimpleSegment {
129
+ "args": undefined,
130
+ "as": undefined,
131
+ "name": "lighting",
132
+ },
133
+ SegmentList {
134
+ "list": [
135
+ ImportTree {
136
+ "segments": [
137
+ SimpleSegment {
138
+ "args": undefined,
139
+ "as": undefined,
140
+ "name": "pbr",
141
+ },
142
+ ],
143
+ },
144
+ ],
145
+ },
146
+ ],
147
+ },
148
+ "kind": "treeImport",
149
+ "start": 0,
150
+ },
151
+ ]
152
+ `;
153
+
154
+ exports[`import my::lighting::{ pbr as lights } 1`] = `
155
+ [
156
+ {
157
+ "end": 38,
158
+ "imports": ImportTree {
159
+ "segments": [
160
+ SimpleSegment {
161
+ "args": undefined,
162
+ "as": undefined,
163
+ "name": "my",
164
+ },
165
+ SimpleSegment {
166
+ "args": undefined,
167
+ "as": undefined,
168
+ "name": "lighting",
169
+ },
170
+ SegmentList {
171
+ "list": [
172
+ ImportTree {
173
+ "segments": [
174
+ SimpleSegment {
175
+ "args": undefined,
176
+ "as": "lights",
177
+ "name": "pbr",
178
+ },
179
+ ],
180
+ },
181
+ ],
182
+ },
183
+ ],
184
+ },
185
+ "kind": "treeImport",
186
+ "start": 0,
187
+ },
188
+ ]
189
+ `;
190
+
191
+ exports[`import my::lighting::{ pbr, jelly }; 1`] = `
192
+ [
193
+ {
194
+ "end": 36,
195
+ "imports": ImportTree {
196
+ "segments": [
197
+ SimpleSegment {
198
+ "args": undefined,
199
+ "as": undefined,
200
+ "name": "my",
201
+ },
202
+ SimpleSegment {
203
+ "args": undefined,
204
+ "as": undefined,
205
+ "name": "lighting",
206
+ },
207
+ SegmentList {
208
+ "list": [
209
+ ImportTree {
210
+ "segments": [
211
+ SimpleSegment {
212
+ "args": undefined,
213
+ "as": undefined,
214
+ "name": "pbr",
215
+ },
216
+ ],
217
+ },
218
+ ImportTree {
219
+ "segments": [
220
+ SimpleSegment {
221
+ "args": undefined,
222
+ "as": undefined,
223
+ "name": "jelly",
224
+ },
225
+ ],
226
+ },
227
+ ],
228
+ },
229
+ ],
230
+ },
231
+ "kind": "treeImport",
232
+ "start": 0,
233
+ },
234
+ ]
235
+ `;
236
+
237
+ exports[`import my::lighting::{ pbr, jelly::jam }; 1`] = `
238
+ [
239
+ {
240
+ "end": 41,
241
+ "imports": ImportTree {
242
+ "segments": [
243
+ SimpleSegment {
244
+ "args": undefined,
245
+ "as": undefined,
246
+ "name": "my",
247
+ },
248
+ SimpleSegment {
249
+ "args": undefined,
250
+ "as": undefined,
251
+ "name": "lighting",
252
+ },
253
+ SegmentList {
254
+ "list": [
255
+ ImportTree {
256
+ "segments": [
257
+ SimpleSegment {
258
+ "args": undefined,
259
+ "as": undefined,
260
+ "name": "pbr",
261
+ },
262
+ ],
263
+ },
264
+ ImportTree {
265
+ "segments": [
266
+ SimpleSegment {
267
+ "args": undefined,
268
+ "as": undefined,
269
+ "name": "jelly",
270
+ },
271
+ SimpleSegment {
272
+ "args": undefined,
273
+ "as": undefined,
274
+ "name": "jam",
275
+ },
276
+ ],
277
+ },
278
+ ],
279
+ },
280
+ ],
281
+ },
282
+ "kind": "treeImport",
283
+ "start": 0,
284
+ },
285
+ ]
286
+ `;
287
+
288
+ exports[`import my::lighting::pbr; 1`] = `
289
+ [
290
+ {
291
+ "end": 25,
292
+ "imports": ImportTree {
293
+ "segments": [
294
+ SimpleSegment {
295
+ "args": undefined,
296
+ "as": undefined,
297
+ "name": "my",
298
+ },
299
+ SimpleSegment {
300
+ "args": undefined,
301
+ "as": undefined,
302
+ "name": "lighting",
303
+ },
304
+ SimpleSegment {
305
+ "args": undefined,
306
+ "as": undefined,
307
+ "name": "pbr",
308
+ },
309
+ ],
310
+ },
311
+ "kind": "treeImport",
312
+ "start": 0,
313
+ },
314
+ ]
315
+ `;
316
+
317
+ exports[`multiline import 1`] = `
318
+ [
319
+ {
320
+ "end": 29,
321
+ "imports": ImportTree {
322
+ "segments": [
323
+ SimpleSegment {
324
+ "args": undefined,
325
+ "as": undefined,
326
+ "name": "a",
327
+ },
328
+ SegmentList {
329
+ "list": [
330
+ ImportTree {
331
+ "segments": [
332
+ SimpleSegment {
333
+ "args": undefined,
334
+ "as": undefined,
335
+ "name": "b",
336
+ },
337
+ ],
338
+ },
339
+ ImportTree {
340
+ "segments": [
341
+ SimpleSegment {
342
+ "args": undefined,
343
+ "as": undefined,
344
+ "name": "c",
345
+ },
346
+ ],
347
+ },
348
+ ],
349
+ },
350
+ Wildcard {
351
+ "wildcard": "*",
352
+ },
353
+ ],
354
+ },
355
+ "kind": "treeImport",
356
+ "start": 0,
357
+ },
358
+ ]
359
+ `;
@@ -0,0 +1,59 @@
1
+ import { expect } from "vitest";
2
+
3
+ /** trim source for test comparisons
4
+ * rm blank lines
5
+ * rm leading indent consistently across remaining lines
6
+ * rm trailing spaces from each line */
7
+ export function trimSrc(src: string): string {
8
+ const rawLines = src.split("\n");
9
+ const nonBlankLines = rawLines.filter(l => l.trim() !== "");
10
+ const indents = nonBlankLines.map(l => l.match(/^[ \t]*/)?.[0].length ?? 0);
11
+ if (indents.length === 0) return src;
12
+
13
+ const minIndent = indents.reduce((min, i) => Math.min(min, i));
14
+
15
+ const indentTrimmed = nonBlankLines.map(l => l.slice(minIndent));
16
+ const noTrailingSpaces = indentTrimmed.map(l => l.trimEnd());
17
+
18
+ return noTrailingSpaces.join("\n");
19
+ }
20
+
21
+ export function dropWhile<T>(a: T[], fn: (el: T) => boolean): T[] {
22
+ let skip = 0;
23
+ while (skip < a.length && fn(a[skip])) skip++;
24
+
25
+ return a.slice(skip);
26
+ }
27
+
28
+ export function dropRightWhile<T>(a: T[], fn: (el: T) => boolean): T[] {
29
+ let skip = a.length - 1;
30
+ while (skip >= 0 && fn(a[skip])) skip--;
31
+
32
+ return a.slice(0, skip + 1);
33
+ }
34
+
35
+ export function matchTrimmed(result: string, expected: string): void {
36
+ const resultTrimmed = trimSrc(result);
37
+ const expectTrimmed = trimSrc(expected);
38
+ if (resultTrimmed !== expectTrimmed) {
39
+ const expectLines = expectTrimmed.split("\n");
40
+ const resultLines = resultTrimmed.split("\n");
41
+ const len = Math.max(expectLines.length, resultLines.length);
42
+ for (let i = 0; i < len; i++) {
43
+ const diff = expectLines[i] !== resultLines[i];
44
+ if (diff) {
45
+ console.log(`...failed. Line ${i + 1} differs:
46
+ expected: ${expectLines[i]}
47
+ actual: ${resultLines[i] ?? ""}`);
48
+ break;
49
+ }
50
+ }
51
+ console.log(
52
+ `\ntrimmed result:\n${resultTrimmed}\n\ntrimmed expected:\n${expectTrimmed}\n`,
53
+ );
54
+ // console.log(
55
+ // `\nresult:\n${result}\n\nexpected:\n${expected}\n`,
56
+ // );
57
+ }
58
+ expect(resultTrimmed).toBe(expectTrimmed);
59
+ }
@@ -0,0 +1,32 @@
1
+ import { expect, test } from "vitest";
2
+ import { trimSrc } from "../StringUtil.js";
3
+
4
+ test("trimSrc on blank", () => {
5
+ const trimmed = trimSrc(``);
6
+ expect(trimmed).toBe("");
7
+ });
8
+
9
+ test("trimSrc with leading blank lines", () => {
10
+ const trimmed = trimSrc(`
11
+
12
+ fn foo() {
13
+ // bar
14
+ }`);
15
+ expect(trimmed).toBe("fn foo() {\n // bar\n}");
16
+ });
17
+
18
+ test("trimSrc with blank line in the middle and at end", () => {
19
+ const trimmed = trimSrc(
20
+ `
21
+ foo
22
+
23
+ bar
24
+ `,
25
+ );
26
+ expect(trimmed).toBe("foo\nbar");
27
+ });
28
+
29
+ test("trimSrc with trailing spaces", () => {
30
+ const trimmed = trimSrc(` foo `);
31
+ expect(trimmed).toBe("foo");
32
+ });
@@ -0,0 +1,3 @@
1
+ import ./wgsl_1/util/bar;
2
+
3
+ fn main() { bar(); }
@@ -0,0 +1 @@
1
+ fn bar() { }
@@ -0,0 +1,3 @@
1
+ import ./wgsl_2/util2/bar
2
+
3
+ fn main() { bar(); }
@@ -0,0 +1 @@
1
+ fn bar() { }