wesl 0.6.0-pre10

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 (141) hide show
  1. package/README.md +31 -0
  2. package/dist/index.js +4468 -0
  3. package/dist/index.js.map +1 -0
  4. package/dist/minified.js +3426 -0
  5. package/dist/minified.js.map +1 -0
  6. package/dist/tools/packages/wesl/src/AbstractElems.d.ts +322 -0
  7. package/dist/tools/packages/wesl/src/Assertions.d.ts +27 -0
  8. package/dist/tools/packages/wesl/src/BindIdents.d.ts +70 -0
  9. package/dist/tools/packages/wesl/src/Conditions.d.ts +6 -0
  10. package/dist/tools/packages/wesl/src/FlattenTreeImport.d.ts +11 -0
  11. package/dist/tools/packages/wesl/src/LinkedWesl.d.ts +50 -0
  12. package/dist/tools/packages/wesl/src/Linker.d.ts +87 -0
  13. package/dist/tools/packages/wesl/src/LinkerUtil.d.ts +3 -0
  14. package/dist/tools/packages/wesl/src/LiveDeclarations.d.ts +12 -0
  15. package/dist/tools/packages/wesl/src/LowerAndEmit.d.ts +31 -0
  16. package/dist/tools/packages/wesl/src/Mangler.d.ts +39 -0
  17. package/dist/tools/packages/wesl/src/ParseWESL.d.ts +60 -0
  18. package/dist/tools/packages/wesl/src/ParsedRegistry.d.ts +29 -0
  19. package/dist/tools/packages/wesl/src/PathUtil.d.ts +6 -0
  20. package/dist/tools/packages/wesl/src/RawEmit.d.ts +6 -0
  21. package/dist/tools/packages/wesl/src/Reflection.d.ts +45 -0
  22. package/dist/tools/packages/wesl/src/Scope.d.ts +81 -0
  23. package/dist/tools/packages/wesl/src/StandardTypes.d.ts +13 -0
  24. package/dist/tools/packages/wesl/src/TransformBindingStructs.d.ts +52 -0
  25. package/dist/tools/packages/wesl/src/Util.d.ts +43 -0
  26. package/dist/tools/packages/wesl/src/WESLCollect.d.ts +94 -0
  27. package/dist/tools/packages/wesl/src/WeslBundle.d.ts +13 -0
  28. package/dist/tools/packages/wesl/src/WeslDevice.d.ts +25 -0
  29. package/dist/tools/packages/wesl/src/debug/ASTtoString.d.ts +5 -0
  30. package/dist/tools/packages/wesl/src/debug/ImportToString.d.ts +2 -0
  31. package/dist/tools/packages/wesl/src/debug/LineWrapper.d.ts +21 -0
  32. package/dist/tools/packages/wesl/src/debug/ScopeToString.d.ts +6 -0
  33. package/dist/tools/packages/wesl/src/index.d.ts +11 -0
  34. package/dist/tools/packages/wesl/src/parse/ImportGrammar.d.ts +5 -0
  35. package/dist/tools/packages/wesl/src/parse/Keywords.d.ts +4 -0
  36. package/dist/tools/packages/wesl/src/parse/WeslBaseGrammar.d.ts +5 -0
  37. package/dist/tools/packages/wesl/src/parse/WeslExpression.d.ts +13 -0
  38. package/dist/tools/packages/wesl/src/parse/WeslGrammar.d.ts +80 -0
  39. package/dist/tools/packages/wesl/src/parse/WeslStream.d.ts +44 -0
  40. package/dist/tools/packages/wesl/src/test/BindWESL.test.d.ts +1 -0
  41. package/dist/tools/packages/wesl/src/test/ConditionLinking.test.d.ts +1 -0
  42. package/dist/tools/packages/wesl/src/test/ConditionalTranslationCases.test.d.ts +1 -0
  43. package/dist/tools/packages/wesl/src/test/ErrorLogging.test.d.ts +1 -0
  44. package/dist/tools/packages/wesl/src/test/Expression.test.d.ts +1 -0
  45. package/dist/tools/packages/wesl/src/test/FlattenTreeImport.test.d.ts +1 -0
  46. package/dist/tools/packages/wesl/src/test/ImportCases.test.d.ts +1 -0
  47. package/dist/tools/packages/wesl/src/test/ImportSyntaxCases.test.d.ts +1 -0
  48. package/dist/tools/packages/wesl/src/test/LinkGlob.test.d.ts +1 -0
  49. package/dist/tools/packages/wesl/src/test/LinkPackage.test.d.ts +1 -0
  50. package/dist/tools/packages/wesl/src/test/Linker.test.d.ts +1 -0
  51. package/dist/tools/packages/wesl/src/test/Mangling.test.d.ts +1 -0
  52. package/dist/tools/packages/wesl/src/test/ParseComments.test.d.ts +1 -0
  53. package/dist/tools/packages/wesl/src/test/ParseConditions.test.d.ts +1 -0
  54. package/dist/tools/packages/wesl/src/test/ParseError.test.d.ts +1 -0
  55. package/dist/tools/packages/wesl/src/test/ParseWESL.test.d.ts +1 -0
  56. package/dist/tools/packages/wesl/src/test/PathUtil.test.d.ts +1 -0
  57. package/dist/tools/packages/wesl/src/test/PrettyGrammar.test.d.ts +1 -0
  58. package/dist/tools/packages/wesl/src/test/Reflection.test.d.ts +1 -0
  59. package/dist/tools/packages/wesl/src/test/ScopeWESL.test.d.ts +1 -0
  60. package/dist/tools/packages/wesl/src/test/TestLink.d.ts +21 -0
  61. package/dist/tools/packages/wesl/src/test/TestSetup.d.ts +1 -0
  62. package/dist/tools/packages/wesl/src/test/TestUtil.d.ts +40 -0
  63. package/dist/tools/packages/wesl/src/test/Tokenizer.test.d.ts +1 -0
  64. package/dist/tools/packages/wesl/src/test/TransformBindingStructs.test.d.ts +1 -0
  65. package/dist/tools/packages/wesl/src/test/Util.test.d.ts +1 -0
  66. package/dist/tools/packages/wesl/src/test/VirtualModules.test.d.ts +1 -0
  67. package/dist/tools/packages/wesl/src/test/WeslDevice.test.d.ts +1 -0
  68. package/dist/tools/packages/wesl/src/test/WgslTests.d.ts +0 -0
  69. package/dist/tools/packages/wesl/src/vlq/vlq.d.ts +11 -0
  70. package/package.json +46 -0
  71. package/src/AbstractElems.ts +446 -0
  72. package/src/Assertions.ts +51 -0
  73. package/src/BindIdents.ts +523 -0
  74. package/src/Conditions.ts +74 -0
  75. package/src/FlattenTreeImport.ts +55 -0
  76. package/src/LinkedWesl.ts +184 -0
  77. package/src/Linker.ts +284 -0
  78. package/src/LinkerUtil.ts +29 -0
  79. package/src/LiveDeclarations.ts +31 -0
  80. package/src/LowerAndEmit.ts +413 -0
  81. package/src/Mangler.ts +94 -0
  82. package/src/ParseWESL.ts +157 -0
  83. package/src/ParsedRegistry.ts +120 -0
  84. package/src/PathUtil.ts +31 -0
  85. package/src/RawEmit.ts +102 -0
  86. package/src/Reflection.ts +334 -0
  87. package/src/Scope.ts +162 -0
  88. package/src/StandardTypes.ts +97 -0
  89. package/src/TransformBindingStructs.ts +319 -0
  90. package/src/Util.ts +194 -0
  91. package/src/WESLCollect.ts +614 -0
  92. package/src/WeslBundle.ts +16 -0
  93. package/src/WeslDevice.ts +209 -0
  94. package/src/debug/ASTtoString.ts +290 -0
  95. package/src/debug/ImportToString.ts +29 -0
  96. package/src/debug/LineWrapper.ts +70 -0
  97. package/src/debug/ScopeToString.ts +79 -0
  98. package/src/index.ts +11 -0
  99. package/src/parse/ImportGrammar.ts +157 -0
  100. package/src/parse/Keywords.ts +26 -0
  101. package/src/parse/WeslBaseGrammar.ts +8 -0
  102. package/src/parse/WeslExpression.ts +207 -0
  103. package/src/parse/WeslGrammar.ts +856 -0
  104. package/src/parse/WeslStream.ts +279 -0
  105. package/src/test/BindWESL.test.ts +57 -0
  106. package/src/test/ConditionLinking.test.ts +91 -0
  107. package/src/test/ConditionalTranslationCases.test.ts +56 -0
  108. package/src/test/ErrorLogging.test.ts +30 -0
  109. package/src/test/Expression.test.ts +22 -0
  110. package/src/test/FlattenTreeImport.test.ts +74 -0
  111. package/src/test/ImportCases.test.ts +56 -0
  112. package/src/test/ImportSyntaxCases.test.ts +24 -0
  113. package/src/test/LinkGlob.test.ts +25 -0
  114. package/src/test/LinkPackage.test.ts +26 -0
  115. package/src/test/Linker.test.ts +125 -0
  116. package/src/test/Mangling.test.ts +45 -0
  117. package/src/test/ParseComments.test.ts +36 -0
  118. package/src/test/ParseConditions.test.ts +183 -0
  119. package/src/test/ParseError.test.ts +36 -0
  120. package/src/test/ParseWESL.test.ts +1572 -0
  121. package/src/test/PathUtil.test.ts +34 -0
  122. package/src/test/PrettyGrammar.test.ts +20 -0
  123. package/src/test/Reflection.test.ts +172 -0
  124. package/src/test/ScopeWESL.test.ts +462 -0
  125. package/src/test/TestLink.ts +82 -0
  126. package/src/test/TestSetup.ts +4 -0
  127. package/src/test/TestUtil.ts +126 -0
  128. package/src/test/Tokenizer.test.ts +135 -0
  129. package/src/test/TransformBindingStructs.test.ts +230 -0
  130. package/src/test/Util.test.ts +22 -0
  131. package/src/test/VirtualModules.test.ts +37 -0
  132. package/src/test/WeslDevice.test.ts +265 -0
  133. package/src/test/WgslTests.ts +0 -0
  134. package/src/test/__snapshots__/ParseDirectives.test.ts.snap +25 -0
  135. package/src/test/__snapshots__/ParseWESL.test.ts.snap +119 -0
  136. package/src/test/__snapshots__/RustDirective.test.ts.snap +359 -0
  137. package/src/test/wgsl_1/main.wgsl +3 -0
  138. package/src/test/wgsl_1/util.wgsl +1 -0
  139. package/src/test/wgsl_2/main2.wgsl +3 -0
  140. package/src/test/wgsl_2/util2.wgsl +1 -0
  141. package/src/vlq/vlq.ts +94 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../mini-parse/src/Assertions.ts","../../mini-parse/src/WrappedLog.ts","../../mini-parse/src/ParserLogging.ts","../../mini-parse/src/Stream.ts","../../mini-parse/src/ParserCombinator.ts","../../mini-parse/src/ParserCollect.ts","../../mini-parse/src/Parser.ts","../../mini-parse/src/SrcMap.ts","../../mini-parse/src/SrcMapBuilder.ts","../../mini-parse/src/stream/CachingStream.ts","../../mini-parse/src/stream/RegexHelpers.ts","../../mini-parse/src/stream/MatchersStream.ts","../src/Assertions.ts","../src/Util.ts","../src/Conditions.ts","../src/Scope.ts","../src/debug/LineWrapper.ts","../src/debug/ScopeToString.ts","../src/LiveDeclarations.ts","../src/Mangler.ts","../src/FlattenTreeImport.ts","../../../node_modules/.pnpm/berry-pretty@0.0.5/node_modules/berry-pretty/dist/index.js","../src/WESLCollect.ts","../src/parse/WeslBaseGrammar.ts","../src/parse/ImportGrammar.ts","../src/parse/Keywords.ts","../src/parse/WeslStream.ts","../src/parse/WeslExpression.ts","../src/parse/WeslGrammar.ts","../src/vlq/vlq.ts","../src/WeslDevice.ts","../src/ParseWESL.ts","../src/StandardTypes.ts","../src/BindIdents.ts","../src/LowerAndEmit.ts","../src/debug/ImportToString.ts","../src/debug/ASTtoString.ts","../src/LinkedWesl.ts","../src/PathUtil.ts","../src/ParsedRegistry.ts","../src/Linker.ts","../src/LinkerUtil.ts","../src/RawEmit.ts","../src/Reflection.ts","../src/TransformBindingStructs.ts"],"sourcesContent":["/** checks whether a condition is true, otherwise throws */\nexport function assertThat(condition: any, msg?: string): asserts condition {\n if (!condition) {\n throw new Error(msg);\n }\n}\nexport function assertUnreachable(value: never): never {\n throw new ErrorWithData(\"Unreachable value\", { data: value });\n}\n\nexport interface ErrorWithDataOptions extends ErrorOptions {\n data: any;\n}\n\nexport class ErrorWithData extends Error {\n data: any;\n constructor(message?: string, options?: ErrorWithDataOptions) {\n super(message, options);\n this.data = options?.data;\n }\n}\n","/** base logger. (can be overriden to a capturing logger for tests) */\nexport let log = console.log;\n\n/** use temporary logger for tests */\nexport function withLogger<T>(logFn: typeof console.log, fn: () => T): T {\n const orig = log;\n try {\n log = logFn;\n return fn();\n } finally {\n log = orig;\n }\n}\n\n/** use temporary logger for tests */\nexport async function withLoggerAsync<T>(\n logFn: typeof console.log,\n fn: () => Promise<T>,\n): Promise<T> {\n const orig = log;\n try {\n log = logFn;\n return await fn();\n } finally {\n log = orig;\n }\n}\n","import { ParserContext } from \"./Parser.js\";\nimport { parserLog, tracePos, tracing } from \"./ParserTracing.js\";\nimport { SrcMap, SrcWithPath } from \"./SrcMap.js\";\nimport { log } from \"./WrappedLog.js\";\n\n/** log an message along with the source line and a caret indicating the error position in the line\n * @param pos is the position the source string, or if src is a SrcMap, then\n * pos is the position in the dest (e.g. preprocessed) text\n */\nexport function srcLog(\n src: string | SrcMap,\n pos: number | [number, number],\n ...msgs: any[]\n): void {\n logInternal(log, src, pos, ...msgs);\n}\n\nexport function quotedText(text?: string): string {\n return text ? `'${text.replace(/\\n/g, \"\\\\n\")}'` : \"\";\n}\n\n/** log a message along with src line, but only if tracing is active in the current parser */\nexport function srcTrace(\n src: string | SrcMap,\n pos: number | [number, number],\n ...msgs: any[]\n): void {\n logInternal(parserLog, src, pos, ...msgs);\n}\n\nexport function ctxLog(ctx: ParserContext, ...msgs: any[]): void {\n const src = ctx.stream.src;\n srcLog(src, ctx.stream.checkpoint(), ...msgs);\n}\n\n/**\n * @param destPos - position in the dest (e.g. preprocessed) text\n */\nfunction logInternal(\n log: typeof console.log,\n srcOrSrcMap: string | SrcMap,\n destPos: number | [number, number],\n ...msgs: any[]\n): void {\n if (typeof srcOrSrcMap === \"string\") {\n logInternalSrc(log, srcOrSrcMap, destPos, ...msgs);\n return;\n }\n const { src, positions } = mapSrcPositions(srcOrSrcMap, destPos);\n\n logInternalSrc(log, src.text, positions, ...msgs);\n}\n\ninterface SrcPositions {\n positions: number | [number, number];\n src: SrcWithPath;\n}\n\nfunction mapSrcPositions(\n srcMap: SrcMap,\n destPos: number | [number, number],\n): SrcPositions {\n const srcPos = srcMap.mapPositions(...[destPos].flat());\n const { src } = srcPos[0];\n\n let positions: [number, number] | number;\n if (srcPos[1]?.src?.path === src.path && srcPos[1]?.src?.text === src.text) {\n positions = srcPos.map(p => p.position) as [number, number];\n } else {\n positions = srcPos[0].position;\n }\n\n return { src, positions };\n}\n\nfunction logInternalSrc(\n log: typeof console.log,\n src: string,\n pos: number | [number, number],\n ...msgs: any[]\n): void {\n log(...msgs);\n const { line, lineNum, linePos, linePos2 } = srcLine(src, pos);\n if (tracing && tracePos) {\n // removed on production build\n const posStr = tracePos ? ` Pos ${pos}` : \"\";\n log(line, ` Ln ${lineNum}${posStr}`);\n } else {\n log(line, ` Ln ${lineNum}`);\n }\n const caret = carets(linePos, linePos2);\n log(caret);\n}\n\nfunction carets(linePos: number, linePos2?: number): string {\n const firstCaret = \" \".repeat(linePos) + \"^\";\n let secondCaret = \"\";\n if (linePos2 && linePos2 > linePos) {\n // LATER maybe a continuous line of carets would look nicer?\n secondCaret = \" \".repeat(linePos2 - linePos - 1) + \"^\";\n }\n return firstCaret + secondCaret;\n}\n\n// map from src strings to line start positions\nconst startCache = new Map<string, number[]>();\n\ninterface SrcLine {\n /** src line w/o newline */\n line: string;\n\n /** requested position relative to line start */\n linePos: number;\n\n /** requested position2 relative to line start */\n linePos2?: number;\n\n /** line number in the src (first line is #1) */\n lineNum: number;\n}\n\n/** return the line in the src containing a given character postion */\nexport function srcLine(\n src: string,\n position: number | [number, number],\n): SrcLine {\n let pos: number;\n let pos2: number | undefined;\n if (typeof position === \"number\") {\n pos = position;\n } else {\n [pos, pos2] = position;\n }\n const starts = getStarts(src);\n\n let start = 0;\n let end = starts.length - 1;\n\n // short circuit search if pos is after last line start\n if (pos >= starts[end]) {\n start = end;\n }\n\n // binary search to find start,end positions that surround provided pos\n while (start + 1 < end) {\n const mid = (start + end) >> 1;\n if (pos >= starts[mid]) {\n start = mid;\n } else {\n end = mid;\n }\n }\n\n let linePos2: number | undefined;\n if (pos2 !== undefined && pos2 >= starts[start] && pos2 < starts[end]) {\n linePos2 = pos2 - starts[start];\n }\n\n // get line with possible trailing newline\n const lineNl = src.slice(starts[start], starts[start + 1] || src.length);\n\n // return line without trailing newline\n const line = lineNl.slice(-1) === \"\\n\" ? lineNl.slice(0, -1) : lineNl;\n\n return { line, linePos: pos - starts[start], linePos2, lineNum: start + 1 };\n}\n\n/** return an array of the character positions of the start of each line in the src.\n * cached to avoid recomputation */\nfunction getStarts(src: string): number[] {\n const found = startCache.get(src);\n if (found) return found;\n const starts = [...src.matchAll(/\\n/g)].map(m => m.index! + 1);\n starts.unshift(0);\n startCache.set(src, starts);\n\n return starts;\n}\n","import { Span } from \"./Span.ts\";\n\n/**\n * An interface for a tokenizer. Returns a \"next token\", and can be reset to previously saved positions (checkpoints).\n * Based on https://docs.rs/winnow/latest/winnow/stream/trait.Stream.html\n */\nexport interface Stream<T extends Token> {\n /** Returns the current position */\n checkpoint(): number;\n /** Restores a position */\n reset(position: number): void;\n /**\n * Returns the next token, or `null` if the end of the stream has been reached.\n * Always leaves `checkpoint` right after the token.\n */\n nextToken(): T | null;\n\n /** src text\n *\n * LATER Remove this (move it into an extended stream type)\n */\n src: string;\n}\n\n/** A text token */\nexport interface Token {\n kind: string;\n text: string; // Could be extended to handle other data types as well.\n span: Span;\n}\n\nexport interface TypedToken<Kind extends string> extends Token {\n kind: Kind;\n}\n\nexport function peekToken<T extends Token>(stream: Stream<T>): T | null {\n const start = stream.checkpoint();\n const token = stream.nextToken();\n stream.reset(start);\n return token;\n}\n","import {\n CombinatorArg,\n InputFromArg,\n OrParser,\n ParserFromArg,\n ParserFromRepeatArg,\n ResultFromArg,\n SeqObjParser,\n SeqParser,\n SeqValues,\n} from \"./CombinatorTypes.js\";\nimport {\n OptParserResult,\n ParseError,\n Parser,\n parser,\n ParserContext,\n ParserResult,\n ParserStream,\n runExtended,\n simpleParser,\n trackChildren,\n} from \"./Parser.js\";\nimport { closeArray, pushOpenArray } from \"./ParserCollect.js\";\nimport { quotedText, srcTrace } from \"./ParserLogging.js\";\nimport { tracing } from \"./ParserTracing.js\";\nimport { Span } from \"./Span.js\";\nimport { peekToken, Stream, Token, TypedToken } from \"./Stream.js\";\n\n/** Parsing Combinators\n *\n * The basic idea is that parsers are contructed heirarchically from other parsers.\n * Each parser is independently testable and reusable with combinators like or() and seq().\n *\n * Each parser is a function that recognizes tokens produced by a lexer\n * and returns a result.\n * Returning null indicate failure. Tokens are not consumed on failure.\n *\n * Built in parsers and combinators are available:\n * kind() recognizes tokens of a particular type.\n * or(), seq(), opt(), map() and repeat() combine other stages.\n *\n * Users construct their own parsers by combining other parser stages\n * and typically use map() to report results. Results can be stored\n * in the array app[], which is provided by the user and available for\n * all user constructed parsers.\n */\n\n/** Parse for a particular kind of token,\n * @return the matching text */\nexport function token<const Kind extends string>(\n kindStr: Kind,\n value: string,\n): Parser<Stream<TypedToken<Kind>>, TypedToken<Kind>> {\n return simpleParser(\n `token '${kindStr}' ${quotedText(value)}`,\n function _token(\n state: ParserContext,\n ): ParserResult<TypedToken<Kind>> | null {\n const start = state.stream.checkpoint();\n const next = state.stream.nextToken();\n if (next === null) return null;\n if (tracing) {\n const text = quotedText(next.text);\n srcTrace(state.stream.src, start, `: ${text} (${next.kind})`);\n }\n if (next.kind !== kindStr || next.text !== value) {\n state.stream.reset(start);\n return null;\n }\n return { value: next as TypedToken<Kind> };\n },\n );\n}\n\n/** Parse for a particular kind of token,\n * @return the matching text */\nexport function tokenOf<const Kind extends string>(\n kindStr: Kind,\n values: string[],\n): Parser<Stream<TypedToken<Kind>>, TypedToken<Kind>> {\n return simpleParser(\n `tokenOf '${kindStr}'`,\n function _tokenOf(\n state: ParserContext,\n ): ParserResult<TypedToken<Kind>> | null {\n const start = state.stream.checkpoint();\n const next = state.stream.nextToken();\n if (next === null) return null;\n if (tracing) {\n const text = quotedText(next.text);\n srcTrace(state.stream.src, start, `: ${text} (${next.kind})`);\n }\n if (next.kind !== kindStr || !values.includes(next.text)) {\n state.stream.reset(start);\n return null;\n }\n return { value: next as TypedToken<Kind> };\n },\n );\n}\n\n/** Parse for a particular kind of token,\n * @return the matching text */\nexport function tokenKind<const Kind extends string>(\n kindStr: Kind,\n): Parser<Stream<TypedToken<Kind>>, TypedToken<Kind>> {\n return simpleParser(\n `tokenKind '${kindStr}'`,\n function _tokenKind(\n state: ParserContext,\n ): ParserResult<TypedToken<Kind>> | null {\n const start = state.stream.checkpoint();\n const next = state.stream.nextToken();\n if (next === null) return null;\n if (tracing) {\n const text = quotedText(next.text);\n srcTrace(state.stream.src, start, `: ${text} (${next.kind})`);\n }\n if (next.kind !== kindStr) {\n state.stream.reset(start);\n return null;\n }\n return { value: next as TypedToken<Kind> };\n },\n );\n}\n\n/** Parse for a particular kind of token,\n * @return the matching text */\nexport function kind<const Kind extends string>(\n kindStr: Kind,\n): Parser<Stream<TypedToken<Kind>>, string> {\n return simpleParser(\n `kind '${kindStr}'`,\n function _kind(state: ParserContext): ParserResult<string> | null {\n const start = state.stream.checkpoint();\n const next = state.stream.nextToken();\n if (next === null) return null;\n if (tracing) {\n const text = quotedText(next.text);\n srcTrace(state.stream.src, start, `: ${text} (${next.kind})`);\n }\n if (next.kind !== kindStr) {\n state.stream.reset(start);\n return null;\n }\n return { value: next.text };\n },\n );\n}\n\n// export class KindParser<I, const Kind extends string> extends Parser<\n// Stream<TypedToken<Kind>>,\n// string\n// > {}\n\n/** Parse for a token containing a text value\n * @return the kind of token that matched */\nexport function text(value: string): Parser<ParserStream, string> {\n return simpleParser(\n `${quotedText(value)}`,\n function _text(state: ParserContext): ParserResult<string> | null {\n const start = state.stream.checkpoint();\n const next = state.stream.nextToken();\n if (next === null) return null;\n if (tracing) {\n const text = quotedText(next.text);\n srcTrace(state.stream.src, start, `: ${text} (${next.kind})`);\n }\n if (next.text !== value) {\n state.stream.reset(start);\n return null;\n }\n return { value: next.text };\n },\n );\n}\n\n/** Parse a sequence of parsers\n * @return an array of all parsed results, or null if any parser fails */\nexport function seq<P extends CombinatorArg[]>(...args: P): SeqParser<P> {\n const parsers = args.map(parserArg);\n const seqParser = parser(\"seq\", function _seq(ctx: ParserContext) {\n const values = [];\n for (const p of parsers) {\n const result = p._run(ctx);\n if (result === null) {\n return null;\n }\n values.push(result.value);\n }\n return { value: values };\n });\n\n trackChildren(seqParser, ...parsers);\n\n return seqParser as SeqParser<P>;\n}\n\n/** Parse a sequence of parsers. Each named parser will be executed, and place its result in an equally named output.\n * @return an object of all parsed results, or null if any parser fails */\nexport function seqObj<P extends { [key: string]: CombinatorArg }>(\n args: P,\n): SeqObjParser<P> {\n const parsers = Object.entries(args).map(\n ([name, arg]) => [name as keyof P, parserArg(arg)] as const,\n );\n const seqObjParser = parser(\"seqObj\", function _seqObj(ctx: ParserContext) {\n const values: Partial<Record<keyof P, any>> = {};\n for (const [name, p] of parsers) {\n const result = p._run(ctx);\n if (result === null) {\n return null;\n }\n\n values[name] = result.value;\n }\n return { value: values };\n });\n\n trackChildren(seqObjParser, ...parsers.map(v => v[1]));\n\n return seqObjParser as SeqObjParser<P>;\n}\n\nexport function collectArray<I, O>(p: Parser<I, O>): Parser<I, O> {\n return p.collect({ before: pushOpenArray, after: closeArray });\n}\n\n/** Parse two values, and discard the first value\n * @return the second value, or null if any parser fails */\nexport function preceded<\n Ignored extends CombinatorArg,\n P extends CombinatorArg,\n>(\n ignoredArg: Ignored,\n arg: P,\n): Parser<InputFromArg<Ignored> | InputFromArg<P>, ResultFromArg<P>> {\n const ignored = parserArg(ignoredArg);\n const p = parserArg(arg);\n const precededParser: ParserFromArg<P> = parser(\n \"preceded\",\n function _preceded(ctx: ParserContext) {\n const ignoredResult = ignored._run(ctx);\n if (ignoredResult === null) return null;\n const result = p._run(ctx);\n return result;\n },\n );\n\n trackChildren(precededParser, ignored, p);\n\n return precededParser;\n}\n\n/** Parse two values, and discard the second value\n * @return the first value, or null if any parser fails */\nexport function terminated<\n P extends CombinatorArg,\n Ignored extends CombinatorArg,\n>(\n arg: P,\n ignoredArg: Ignored,\n): Parser<InputFromArg<P> | InputFromArg<Ignored>, ResultFromArg<P>> {\n const p = parserArg(arg);\n const ignored = parserArg(ignoredArg);\n const terminatedParser: ParserFromArg<P> = parser(\n \"terminated\",\n function _terminated(ctx: ParserContext) {\n const result = p._run(ctx);\n if (result === null) return null;\n const ignoredResult = ignored._run(ctx);\n if (ignoredResult === null) return null;\n return result;\n },\n );\n\n trackChildren(terminatedParser, ignored, p);\n\n return terminatedParser;\n}\n\n/** Parse three values, and only keep the middle value\n * @return the second value, or null if any parser fails */\nexport function delimited<\n Ignored1 extends CombinatorArg,\n P extends CombinatorArg,\n Ignored2 extends CombinatorArg,\n>(\n ignoredArg1: Ignored1,\n arg: P,\n ignoredArg2: Ignored2,\n): Parser<\n InputFromArg<Ignored1> | InputFromArg<P> | InputFromArg<Ignored2>,\n ResultFromArg<P>\n> {\n const ignored1 = parserArg(ignoredArg1);\n const p = parserArg(arg);\n const ignored2 = parserArg(ignoredArg2);\n const delimitedParser: ParserFromArg<P> = parser(\n \"delimited\",\n function _delimited(ctx: ParserContext) {\n const ignoredResult1 = ignored1._run(ctx);\n if (ignoredResult1 === null) return null;\n const result = p._run(ctx);\n if (result === null) return null;\n const ignoredResult2 = ignored2._run(ctx);\n if (ignoredResult2 === null) return null;\n return result;\n },\n );\n\n trackChildren(delimitedParser, ignored1, p, ignored2);\n\n return delimitedParser;\n}\n\n/** Parse two values, and discard the second value\n * @return the first value, or null if any parser fails */\nexport function separated_pair<\n P1 extends CombinatorArg,\n Ignored extends CombinatorArg,\n P2 extends CombinatorArg,\n>(\n arg1: P1,\n ignoredArg: Ignored,\n arg2: P2,\n): Parser<\n InputFromArg<P1> | InputFromArg<Ignored> | InputFromArg<P2>,\n [ResultFromArg<P1>, ResultFromArg<P2>]\n> {\n const p1 = parserArg(arg1);\n const ignored = parserArg(ignoredArg);\n const p2 = parserArg(arg2);\n const terminatedParser = parser(\n \"terminated\",\n function _terminated(\n ctx: ParserContext,\n ): OptParserResult<[ResultFromArg<P1>, ResultFromArg<P2>]> {\n const result1 = p1._run(ctx);\n if (result1 === null) return null;\n const ignoredResult = ignored._run(ctx);\n if (ignoredResult === null) return null;\n const result2 = p2._run(ctx);\n if (result2 === null) return null;\n return { value: [result1.value, result2.value] };\n },\n );\n\n trackChildren(terminatedParser, p1, ignored, p2);\n\n return terminatedParser;\n}\n\n/** Try parsing with one or more parsers,\n * @return the first successful parse */\nexport function or<P extends CombinatorArg[]>(...args: P): OrParser<P> {\n const parsers = args.map(parserArg);\n const orParser = parser(\"or\", function _or(state: ParserContext) {\n const start = state.stream.checkpoint();\n for (const p of parsers) {\n state.stream.reset(start);\n const result = p._run(state);\n if (result !== null) {\n return result;\n }\n }\n return null;\n });\n\n trackChildren(orParser, ...parsers);\n\n return orParser as OrParser<P>;\n}\n\n/** Try a parser.\n *\n * If the parse succeeds, return the result.\n * If the parser fails, return false and don't advance the input. Returning false\n * indicates a successful parse, so combinators like seq() will succeed.\n */\nexport function opt<P extends CombinatorArg>(\n arg: P,\n): Parser<InputFromArg<P>, ResultFromArg<P> | null> {\n const p = parserArg(arg);\n const optParser = parser(\n \"opt\",\n function _opt(state: ParserContext): ParserResult<ResultFromArg<P> | null> {\n const start = state.stream.checkpoint();\n const result = p._run(state);\n if (result === null) {\n state.stream.reset(start);\n return { value: null };\n } else {\n return result;\n }\n },\n );\n trackChildren(optParser, p);\n return optParser;\n}\n\n/** return true if the provided parser _doesn't_ match\n * does not consume any tokens */\nexport function not<P extends CombinatorArg>(\n arg: P,\n): Parser<InputFromArg<P>, true> {\n const p = parserArg(arg);\n const notParser: Parser<InputFromArg<P>, true> = parser(\n \"not\",\n function _not(state: ParserContext) {\n const pos = state.stream.checkpoint();\n const result = p._run(state);\n if (result === null) {\n return { value: true };\n }\n state.stream.reset(pos);\n return null;\n },\n );\n trackChildren(notParser, p);\n\n return notParser;\n}\n\n/** yield next token, any token */\nexport function any(): Parser<ParserStream, Token> {\n return simpleParser(\n \"any\",\n function _any(state: ParserContext): ParserResult<Token> | null {\n const value = state.stream.nextToken();\n if (value === null) return null;\n return { value };\n },\n );\n}\n\n/** yield next token if the provided parser doesn't match */\nexport function anyNot<P extends CombinatorArg>(\n arg: P,\n): Parser<InputFromArg<P>, Token> {\n return seq(not(arg), any())\n .map(r => r[1])\n .setTraceName(\"anyNot\");\n}\n\n/** match everything until a terminator (and the terminator too) */\nexport function anyThrough<A extends CombinatorArg>(\n arg: A,\n): Parser<InputFromArg<A>, [Token[], ResultFromArg<A>]> {\n const p = parserArg<A>(arg);\n const anyParser = seq(repeat(anyNot(p)), p).setTraceName(\n `anyThrough ${p.debugName}`,\n );\n trackChildren(anyParser, p);\n return anyParser;\n}\n\n/** match zero or more instances of a parser */\nexport function repeat<A extends CombinatorArg>(\n arg: A,\n): ParserFromRepeatArg<A> {\n const p = parserArg(arg);\n const repeatParser = parser(\"repeat\", repeatWhileFilter(p));\n trackChildren(repeatParser, p);\n return repeatParser;\n}\n\n/** match one or more instances of a parser */\nexport function repeatPlus<A extends CombinatorArg>(\n arg: A,\n): ParserFromRepeatArg<A> {\n const p = parserArg(arg);\n const repeatParser = seq(p, repeat(p))\n .map(r => [r[0], ...r[1]])\n .setTraceName(\"repeatPlus\");\n trackChildren(repeatParser, p);\n return repeatParser;\n}\n\ntype ResultFilterFn<T> = (result: ParserResult<T>) => boolean;\n\nexport function repeatWhile<A extends CombinatorArg>(\n arg: A,\n filterFn: ResultFilterFn<ResultFromArg<A>>,\n): ParserFromRepeatArg<A> {\n const p = parserArg(arg);\n const result = parser(\"repeatWhile\", repeatWhileFilter(p, filterFn));\n trackChildren(result, p);\n return result;\n}\n\ntype RepeatWhileResult<A extends CombinatorArg> = OptParserResult<\n SeqValues<A[]>\n>;\n\nfunction repeatWhileFilter<T, A extends CombinatorArg>(\n p: ParserFromArg<A>,\n filterFn: ResultFilterFn<ResultFromArg<A>> = () => true,\n): (ctx: ParserContext) => RepeatWhileResult<A> {\n return function _repeatWhileFilter(ctx: ParserContext): RepeatWhileResult<A> {\n const values: ResultFromArg<A>[] = [];\n for (;;) {\n const before = ctx.stream.checkpoint();\n const result = runExtended<InputFromArg<A>, ResultFromArg<A>>(ctx, p);\n if (result === null) {\n ctx.stream.reset(before);\n return { value: values };\n }\n // LATER that's not a filter!\n if (!filterFn(result)) {\n return { value: values };\n }\n\n if (tracing) {\n const after = ctx.stream.checkpoint();\n if (before === after) {\n throw new ParseError(\n \"infinite loop, parser passed to repeat must always make progress\",\n ctx.stream.checkpoint(),\n );\n }\n }\n\n // continue acccumulating until we get a null or the filter tells us to stop\n values.push(result.value);\n }\n };\n}\n\nexport function span<A extends CombinatorArg>(\n arg: A,\n): Parser<InputFromArg<A>, { value: ResultFromArg<A>; span: Span }> {\n const p = parserArg(arg);\n const result = parser(\"span\", function _span(ctx: ParserContext) {\n const start = peekToken(ctx.stream)?.span?.[0] ?? null;\n const result = p._run(ctx);\n if (result === null) return null;\n const end = ctx.stream.checkpoint();\n return {\n value: {\n value: result.value,\n span: [start ?? end, end] as const,\n },\n };\n });\n trackChildren(result, arg);\n return result;\n}\n\n/** yields true if parsing has reached the end of input */\nexport function eof(): Parser<ParserStream, true> {\n return simpleParser(\"eof\", function _eof(state: ParserContext) {\n const start = state.stream.checkpoint();\n const result = state.stream.nextToken();\n if (result !== null) {\n state.stream.reset(start);\n return null;\n }\n return { value: true };\n });\n}\n\n/**\n * if parsing fails, throw an error and abort parsing\n * @param arg inner parser\n * @param msg a message in the style of `invalid ___, expected ___`, like `invalid number, expected 0-9`\n * @returns\n */\nexport function req<A extends CombinatorArg>(\n arg: A,\n msg: string,\n): ParserFromArg<A> {\n const p = parserArg(arg);\n const reqParser = parser(\"req\", function _req(ctx: ParserContext) {\n const result = p._run(ctx);\n if (result === null) {\n throw new ParseError(msg, ctx.stream.checkpoint());\n }\n return result;\n });\n trackChildren(reqParser, p);\n return reqParser;\n}\n\n/** always succeeds, does not consume any tokens */\nexport function yes(): Parser<ParserStream, null> {\n return simpleParser(\"yes\", function _yes() {\n return { value: null };\n });\n}\n\n/** always fails, does not consume any tokens */\nexport function no(): Parser<ParserStream, null> {\n return simpleParser(\"no\", function _no() {\n return null;\n });\n}\n\nexport interface WithSepOptions {\n /** if true, allow an optional trailing separator (default true) */\n trailing?: boolean;\n /** if true, require at least one element (default false) */\n requireOne?: boolean;\n}\n\n/** match an optional series of elements separated by a delimiter (e.g. a comma) */\nexport function withSep<Sep extends CombinatorArg, P extends CombinatorArg>(\n sep: Sep,\n p: P,\n opts: WithSepOptions = {},\n): Parser<InputFromArg<Sep> | InputFromArg<P>, ResultFromArg<P>[]> {\n const { trailing = true, requireOne = false } = opts;\n const elementParser = parserArg(p);\n const sepParser = parserArg(sep);\n return parser(\"withSep\", function _withSep(ctx: ParserContext) {\n const results: ResultFromArg<P>[] = [];\n const startPosition = ctx.stream.checkpoint();\n const result = elementParser._run(ctx);\n if (result === null) {\n ctx.stream.reset(startPosition);\n if (requireOne) {\n return null;\n } else {\n return {\n value: results,\n };\n }\n }\n results.push(result.value);\n while (true) {\n const beforeSeparator = ctx.stream.checkpoint();\n const resultSeparator = sepParser._run(ctx);\n if (resultSeparator === null) {\n ctx.stream.reset(beforeSeparator);\n break;\n }\n const beforeElement = ctx.stream.checkpoint();\n const resultElement = elementParser._run(ctx);\n if (resultElement === null) {\n if (trailing) {\n ctx.stream.reset(beforeElement);\n } else {\n ctx.stream.reset(beforeSeparator);\n }\n break;\n }\n results.push(resultElement.value);\n }\n return {\n value: results,\n };\n });\n}\n\n/** match an series of one or more elements separated by a delimiter (e.g. a comma) */\nexport function withSepPlus<Sep extends CombinatorArg, P extends CombinatorArg>(\n sep: Sep,\n p: P,\n): Parser<InputFromArg<Sep> | InputFromArg<P>, ResultFromArg<P>[]> {\n return withSep(sep, p, { requireOne: true }).setTraceName(\"withSepPlus\");\n}\n\n/** run a parser with a provided token matcher (i.e. use a temporary lexing mode) */\nexport function withStreamAction<U>(\n action: (stream: Stream<Token>) => U | null,\n): Parser<ParserStream, U> {\n return simpleParser(\n `withStreamAction`,\n function _withStreamAction(state: ParserContext) {\n const result = action(state.stream);\n if (result === null) return null;\n return { value: result };\n },\n );\n}\n\n/** convert naked string arguments into text() parsers and functions into fn() parsers */\nexport function parserArg<A extends CombinatorArg>(arg: A): ParserFromArg<A> {\n if (typeof arg === \"string\") {\n return text(arg) as ParserFromArg<A>; // LATER fix cast\n } else if (arg instanceof Parser) {\n return arg as Parser<InputFromArg<A>, ResultFromArg<A>>;\n }\n return fn(arg as () => ParserFromArg<A>);\n}\n\n/** A delayed parser definition, for making recursive parser definitions. */\nexport function fn<I, T>(fn: () => Parser<I, T>): Parser<I, T> {\n const fp = parser(\n \"fn()\",\n function _fn(state: ParserContext): OptParserResult<T> {\n if (!fn) {\n throw new ParseError(\n `fn parser called before definition`,\n state.stream.checkpoint(),\n );\n }\n const stage = fn();\n return stage._run(state);\n },\n );\n if (tracing) (fp as any)._fn = fn; // tricksy hack for pretty printing contained fns\n return fp;\n}\n","import { CombinatorArg, ResultFromArg } from \"./CombinatorTypes.js\";\nimport {\n AppState,\n OptParserResult,\n parser,\n Parser,\n ParserContext,\n ParserStream,\n trackChildren,\n} from \"./Parser.js\";\nimport { parserArg } from \"./ParserCombinator.js\";\nimport { Stream, Token } from \"./Stream.js\";\n\nexport type TagRecord = Record<string | symbol, any[] | undefined>;\nexport type NoTags = Record<string | symbol, never>;\n\n/** an entry in the table of deferred functions for collect() and tag() */\nexport interface CollectFnEntry<V> {\n collectFn: CollectFn<V>;\n srcPosition: CollectPosition;\n debugName?: string;\n}\n\n/** location in the source where a collection occurred */\nexport interface CollectPosition {\n start: number;\n end: number;\n}\n\n/** info passed to the collect fn */\nexport interface CollectContext extends CollectPosition {\n tags: TagRecord;\n src: string;\n app: AppState<any, any>;\n _values: CollectValue[];\n}\n\n/** a stack of collected values */\ninterface CollectValue {\n value: any;\n openArray: any[] | undefined;\n}\n\n/** a user supplied function for collecting info from the parse */\nexport type CollectFn<V> = (ctx: CollectContext) => V | null;\n\n/** a user supplied pair functions for collecting info from the parse */\nexport interface CollectPair<V> {\n before: CollectFn<void>;\n after: CollectFn<V>;\n}\n\n/** Queue a collection function that runs later, when a commit() is parsed.\n * Collection functions are dropped with parser backtracking, so\n * only succsessful parses are collected.\n *\n * optionally tag the collection results\n * */\nexport function collect<I, T, V>(\n p: Parser<I, T>,\n collectFn: CollectFn<V> | CollectPair<V>,\n ctag?: string,\n): Parser<I, T> {\n const origAfter: CollectFn<V> =\n (collectFn as CollectPair<V>).after ?? collectFn;\n const beforeFn = (collectFn as Partial<CollectPair<V>>).before;\n\n let afterFn = origAfter;\n if (ctag) {\n afterFn = (cc: CollectContext) => {\n const result = origAfter(cc);\n if (result !== undefined && result !== null) {\n addTagValue(cc.tags, ctag, result);\n }\n return result;\n };\n }\n\n const debugName = ctag ? `${p.debugName}-${ctag}` : `${p.debugName}`;\n\n const collectParser = parser(\n `collect`,\n function _collect(ctx: ParserContext): OptParserResult<T> {\n // if (tracing && ctx._trace) {\n // const deepName = ctx._debugNames.join(\" > \");\n // ctxLog(ctx, `collect ${deepName}`);\n // }\n const origStart = ctx.stream.checkpoint();\n if (beforeFn) {\n queueCollectFn(ctx, origStart, beforeFn, `${debugName}.before`);\n }\n\n return runAndCollectAfter(p, ctx, afterFn, debugName);\n },\n );\n trackChildren(collectParser, p);\n return collectParser;\n}\n\nexport function tagScope<A extends CombinatorArg>(\n arg: A,\n): Parser<ParserStream, ResultFromArg<A>> {\n const p = parserArg(arg);\n const sp = parser(\n `tagScope`,\n function _tagScope(ctx: ParserContext): OptParserResult<ResultFromArg<A>> {\n const origStart = ctx.stream.checkpoint();\n let origTags: TagRecord;\n queueCollectFn(\n ctx,\n origStart,\n (cc: CollectContext) => {\n origTags = cloneTags(cc.tags);\n cc.tags = {};\n },\n `scope.before ${p.debugName}`,\n );\n return runAndCollectAfter(\n p,\n ctx,\n (cc: CollectContext) => {\n cc.tags = origTags;\n },\n `tagScope`,\n );\n },\n );\n trackChildren(sp, p);\n return sp;\n}\n\n/** duplicate a tags record */\nfunction cloneTags(tags: TagRecord): TagRecord {\n const cloned = Object.entries(tags).map(([tag, values]) => {\n return [tag, [...values!]];\n });\n return Object.fromEntries(cloned);\n}\n\n/** tag most recent collect result with a name that can be\n * referenced in later collection. */\nexport function ctag<I, T>(p: Parser<I, T>, name: string): Parser<I, T> {\n const cp = parser(\n `ctag`,\n function _ctag(ctx: ParserContext): OptParserResult<T> {\n return runAndCollectAfter(\n p,\n ctx,\n (cc: CollectContext) => {\n const valueEntry = last(cc._values);\n addTagValue(cc.tags, name, valueEntry.value);\n },\n `ctag ${name}`,\n );\n },\n );\n trackChildren(cp, p);\n return cp;\n}\n\n/** run the parser and if it succeeds, queue a provided function to run\n * during commit() */\nfunction runAndCollectAfter<I, T>(\n p: Parser<I, T>,\n ctx: ParserContext,\n collectFn: CollectFn<any>,\n debugName: string = \"\",\n): OptParserResult<T> {\n const origStart = ctx.stream.checkpoint();\n const result = p._run(ctx);\n if (result) {\n queueCollectFn(ctx, origStart, collectFn, debugName);\n }\n return result;\n}\n\nfunction queueCollectFn<T>(\n ctx: ParserContext,\n origStart: number,\n collectFn: CollectFn<any>,\n debugName: string,\n) {\n const srcPosition = refinePosition(ctx.stream, origStart);\n ctx._collect.push({\n srcPosition,\n collectFn,\n debugName,\n });\n}\n\nexport function pushOpenArray(cc: CollectContext): void {\n cc._values.push({ value: null, openArray: [] });\n}\n\nexport function closeArray(cc: CollectContext): void {\n const lastValue = last(cc._values);\n if (lastValue.openArray === undefined)\n console.log(\"---closeArray: no open array\");\n cc._values.pop();\n saveCollectValue(cc, lastValue.openArray);\n}\n\n/** tag parse results results with a name that can be\n * referenced in later collection. */\nexport function ptag<I, T>(p: Parser<I, T>, name: string): Parser<I, T> {\n const cp = parser(\n `ptag`,\n function _ptag(ctx: ParserContext): OptParserResult<T> {\n const origStart = ctx.stream.checkpoint();\n const result = p._run(ctx);\n\n // tag the parser resuts\n if (result) {\n const tagFn = (ctx: CollectContext) =>\n addTagValue(ctx.tags, name, result.value);\n queueCollectFn(ctx, origStart, tagFn, `ptag ${name}`);\n }\n return result;\n },\n );\n trackChildren(cp, p);\n return cp;\n}\n\n/** add a tagged value to a TagRecord */\nfunction addTagValue(tags: TagRecord, name: string, value: any) {\n if (tags[name] === undefined) {\n tags[name] = [];\n }\n tags[name].push(value);\n}\n\n/** When the provided parser succeeds,\n * run any pending collect() fns */\nexport function runCollection(\n _collect: CollectFnEntry<any>[],\n app: AppState<any, any>,\n stream: Stream<Token>,\n) {\n const tags: Record<string, any> = {};\n const { src } = stream;\n const _values: CollectValue[] = [{ value: null, openArray: undefined }];\n // ctx._collect.forEach(entry => {\n // dlog(\"collect-list\", entry.debugName)\n // });\n const collectContext: CollectContext = {\n tags,\n src,\n start: -1,\n end: -1,\n app,\n _values,\n };\n _collect.forEach(entry => {\n // dlog(\"commit\", {\n // entryName: entry.debugName,\n // entryFn: entry.collectFn,\n // });\n const { collectFn, srcPosition } = entry;\n collectContext.start = srcPosition.start;\n collectContext.end = srcPosition.end;\n const collectResult = collectFn(collectContext);\n saveCollectValue(collectContext, collectResult);\n });\n}\n\nfunction saveCollectValue(cc: CollectContext, value: any) {\n if (value !== undefined) {\n const valueEntry = last(cc._values);\n if (!valueEntry) console.log(\"----saveCollectValue: no valueEntry\");\n if (valueEntry) valueEntry.value = value;\n if (valueEntry?.openArray !== undefined) {\n valueEntry.openArray.push(value);\n }\n }\n}\n\nfunction last<T>(elems: T[]): T {\n return elems[elems.length - 1];\n}\n\n/** We've succeeded in a parse, so refine the start position to skip past ws\n * (we don't consume ws earlier, in case an inner parser wants to use different ws skipping)\n */\nfunction refinePosition(\n stream: Stream<Token>,\n origStart: number,\n): CollectPosition {\n const end = stream.checkpoint();\n stream.reset(origStart);\n const start = skipIgnored(stream);\n stream.reset(end);\n return { start: start, end };\n}\n\nfunction skipIgnored(stream: Stream<Token>): number {\n const result = stream.nextToken();\n if (result === null) {\n // Position of EOF\n return stream.checkpoint();\n } else {\n stream.reset(result.span[0]);\n return stream.checkpoint();\n }\n}\n","import { assertThat } from \"./Assertions.js\";\nimport { CombinatorArg } from \"./CombinatorTypes.js\";\nimport {\n collect,\n CollectFn,\n CollectFnEntry,\n CollectPair,\n ctag,\n ptag,\n runCollection,\n} from \"./ParserCollect.js\";\nimport { parserArg } from \"./ParserCombinator.js\";\nimport {\n parserLog,\n TraceContext,\n TraceOptions,\n tracing,\n withTraceLogging,\n} from \"./ParserTracing.js\";\nimport { Stream, Token, TypedToken } from \"./Stream.js\";\n\nexport interface AppState<C, S> {\n /**\n * Context for user written parsers while parsing. e.g. for nested #if state\n * The context value is reset to its original value if the parser fails.\n * Set context to a new immutable value to update (don't internally mutate context)\n */\n context: C;\n\n /** typical place for user written parsers to accumulate results, e.g. syntax tree */\n stable: S;\n}\n\nexport interface ParserInit<C = any, S = any> {\n /** supply tokens to the parser*/\n stream: Stream<Token>;\n\n /** application specific context and result storage, shared with every parser */\n appState?: AppState<C, S>;\n}\n\n// LATER Try merging this into the stream\n/* Information passed to the parsers during parsing */\nexport interface ParserContext<C = any, S = any> {\n stream: Stream<Token>;\n\n app: AppState<C, S>;\n\n /** during execution, debug trace logging */\n _trace?: TraceContext;\n\n _collect: CollectFnEntry<any>[];\n}\n\n/** Result from a parser */\nexport interface ParserResult<T> {\n /** result from this stage */\n value: T;\n}\n\nexport interface ExtendedResult<T, C = any, S = any> extends ParserResult<T> {\n app: AppState<C, S>;\n}\n\n/** parsers return null if they don't match */\nexport type OptParserResult<T> = ParserResult<T> | null;\n\n/** Internal parsing functions return a value and also a set of tagged results from contained parser */\ntype ParseFn<T> = (context: ParserContext) => OptParserResult<T>;\n\n/** options for creating a core parser */\nexport interface ParserArgs {\n /** name to use for trace logging */\n traceName?: string;\n\n /** enable trace logging */\n trace?: TraceOptions;\n\n /** true for elements without children like kind(), and text(),\n * (to avoid intro log statement while tracing) */\n terminal?: boolean;\n\n /** set if the collection results are tagged */\n _children?: AnyParser[];\n}\n\ninterface ConstructArgs<T> extends ParserArgs {\n fn: ParseFn<T>;\n}\n\nexport type AnyParser = Parser<any, any>;\n\nexport class ParserTraceInfo {\n constructor(\n /** name to use for trace logging */\n public traceName: string | undefined = undefined,\n public traceChildren: AnyParser[] = [],\n public traceEnabled: TraceOptions | undefined = undefined,\n ) {}\n /** true for elements without children like kind(), and text(),\n * (to avoid intro log statement while tracing) */\n traceIsTerminal: boolean = false;\n}\n\n/** A parser with no requirements, a bottom type. */\nexport type ParserStream = Stream<TypedToken<never>>;\n\nexport class ParseError extends Error {\n position: number;\n constructor(msg: string, position: number) {\n super(msg);\n this.position = position;\n }\n}\n\n/**\n * a composable parsing element\n *\n * I = input stream *requirements*. For example `seq(token(\"keyword\"), token(\"word\"), yes())` would\n * - Require \"keyword\" to be a part of the token kinds\n * - Require \"word\" to be a part of the token kinds\n * - Not require anything for the yes() parser\n * - Inherit the \"keyword\" requirement and the \"word\" requirement for the seq parser\n *\n * These requirements are then validated when `.parseNext()` is called\n */\nexport class Parser<I, T> {\n /** If tracing is enabled, this exists. Otherwise it does not exist. */\n _traceInfo?: ParserTraceInfo;\n fn: ParseFn<T>;\n\n constructor(args: ConstructArgs<T>) {\n this.fn = args.fn;\n if (tracing) {\n this._traceInfo = new ParserTraceInfo(\n args.traceName,\n args._children,\n args.trace,\n );\n if (args.terminal) {\n this._traceInfo.traceIsTerminal = true;\n }\n }\n }\n\n /** run the parser given an already created parsing context\n *\n * Execute a parser by running the core parsing fn given the parsing context\n * also:\n * . log if tracing is enabled\n * . backtrack on failure\n * . rollback context on failure\n */\n _run(context: ParserContext): OptParserResult<T> {\n if (tracing) {\n return runParserWithTracing(\n this.debugName,\n this.fn,\n context,\n this._traceInfo,\n );\n } else {\n const origAppContext = context.app.context;\n const origCollectLength = context._collect.length;\n const result = this.fn(context);\n if (result === null) {\n context.app.context = origAppContext;\n context._collect.length = origCollectLength;\n }\n\n return result;\n }\n }\n\n /** tag parse results */\n ptag<K extends string>(name: K): Parser<I, T> {\n return ptag(this, name) as Parser<I, T>;\n }\n\n /** tag collect results */\n ctag<K extends string>(name: K): Parser<I, T> {\n return ctag(this, name) as Parser<I, T>;\n }\n\n /** record a name for debug tracing */\n setTraceName(name: string): Parser<I, T> {\n if (tracing) {\n assertThat(this._traceInfo);\n this._traceInfo.traceName = name;\n }\n return this;\n }\n\n /** trigger tracing for this parser (and by default also this parsers descendants) */\n setTrace(opts: TraceOptions = {}): Parser<I, T> {\n if (tracing) {\n assertThat(this._traceInfo);\n this._traceInfo.traceEnabled = opts;\n }\n return this;\n }\n\n /** map results to a new value, or add to app state as a side effect.\n * Return null to cause the parser to fail.\n * SAFETY: Side-effects should not be done if backtracking could occur!\n */\n mapExtended<U>(fn: ParserMapFn<T, U>): Parser<I, U> {\n return mapExtended(this, fn);\n }\n\n /** map results to a new value.\n */\n map<U>(fn: (value: T) => U): Parser<I, U> {\n return map(this, fn);\n }\n\n /** Queue a function that runs later, typically to collect AST elements from the parse.\n * when a commit() is parsed.\n * Collection functions are dropped with parser backtracking, so\n * only succsessful parses are collected. */\n collect<U>(fn: CollectFn<U> | CollectPair<U>, ctag?: string): Parser<I, T> {\n return collect(this, fn, ctag);\n }\n\n /** switch next parser based on results */\n toParser<U>(fn: ToParserFn<I, T, U>): Parser<I, T | U> {\n return toParser(this, fn);\n }\n\n /**\n * start parsing\n *\n * @throws {ParseError} when a combinator like `req` fails\n */\n parse(init: ParserInit): OptParserResult<T> {\n const { stream, appState: app = { context: {}, stable: [] } } = init;\n const _collect: CollectFnEntry<any>[] = [];\n const result = this._run({\n stream,\n app,\n _collect,\n });\n if (result) runCollection(_collect, app, stream);\n return result;\n }\n\n /** name of this parser for debugging/tracing */\n get debugName(): string {\n if (tracing) {\n return this._traceInfo?.traceName ?? \"parser\";\n }\n return \"parser\";\n }\n}\n\n/** Create a Parser from a ParseFn\n * @param fn the parser function\n * @param args static arguments provided by the user as the parser is constructed\n */\nexport function parser<I, T>(\n traceName: string,\n fn: ParseFn<T>,\n terminal?: boolean,\n): Parser<I, T> {\n return new Parser<I, T>({ fn, traceName, terminal: terminal });\n}\n\n/** Create a Parser from a function that parses and returns a value (w/no child parsers) */\nexport function simpleParser<T>(\n traceName: string,\n parserFn: ParseFn<T>,\n): Parser<ParserStream, T> {\n return parser(traceName, parserFn, true);\n}\n\nfunction runParserWithTracing<I, T>(\n debugName: string,\n fn: ParseFn<T>,\n context: ParserContext,\n traceInfo: ParserTraceInfo | undefined,\n): OptParserResult<T> {\n assertThat(tracing);\n const origAppContext = context.app.context;\n\n // setup trace logging if enabled and active for this parser\n const result = withTraceLogging<OptParserResult<T>>(\n context,\n traceInfo,\n runInContext,\n );\n\n return result;\n\n function runInContext(ctx: ParserContext): OptParserResult<T> {\n const origCollectLength = ctx._collect.length;\n\n if (tracing) {\n const traceSuccessOnly = ctx._trace?.successOnly;\n if (!traceInfo?.traceIsTerminal && !traceSuccessOnly) {\n parserLog(`..${debugName}`);\n }\n }\n\n // run the parser function for this stage\n let result = fn(ctx);\n\n if (result === null) {\n // parser failed\n if (tracing) {\n const traceSuccessOnly = ctx._trace?.successOnly;\n if (!traceSuccessOnly) {\n parserLog(`x ${debugName}`);\n }\n }\n context.app.context = origAppContext;\n ctx._collect.length = origCollectLength;\n } else {\n // parser succeeded\n if (tracing) parserLog(`✓ ${debugName}`);\n }\n\n return result;\n }\n}\n\ntype ParserMapFn<T, U> = (results: ExtendedResult<T>) => U | null;\n\n/** return a parser that maps the current results */\nfunction mapExtended<I, T, U>(\n p: Parser<I, T>,\n fn: ParserMapFn<T, U>,\n): Parser<I, U> {\n const mapParser = parser(\n `mapExtended`,\n function _mapExtended(ctx: ParserContext): OptParserResult<U> {\n const extended = runExtended(ctx, p);\n if (!extended) return null;\n\n const mappedValue = fn(extended);\n if (mappedValue === null) return null;\n\n return { value: mappedValue };\n },\n );\n\n trackChildren(mapParser, p);\n return mapParser;\n}\n\n/** return a parser that maps the current results */\nfunction map<I, T, U>(p: Parser<I, T>, fn: (value: T) => U): Parser<I, U> {\n const mapParser = parser(\n `map`,\n function _map(ctx: ParserContext): OptParserResult<U> {\n const result = p._run(ctx);\n if (result === null) return null;\n return { value: fn(result.value) };\n },\n );\n\n trackChildren(mapParser, p);\n return mapParser;\n}\n\ntype ToParserFn<I, T, X> = (results: ParserResult<T>) => Parser<I, X> | null;\n\nfunction toParser<I, T, O>(\n p: Parser<I, T>,\n toParserFn: ToParserFn<I, T, O>,\n): Parser<I, T | O> {\n const newParser: Parser<I, T | O> = parser(\n \"toParser\",\n function _toParser(ctx: ParserContext): OptParserResult<T | O> {\n const result = p._run(ctx);\n if (result === null) return null;\n\n // run the supplied function to get a parser\n const newParser = toParserFn(result);\n\n if (newParser === null) {\n return result;\n }\n\n // run the parser returned by the supplied function\n const nextResult = newParser._run(ctx);\n return nextResult;\n },\n );\n trackChildren(newParser, p);\n return newParser;\n}\n\n/** run parser, return enriched results (to support map(), toParser()) */\nexport function runExtended<I, T>(\n ctx: ParserContext,\n p: Parser<I, T>,\n): ExtendedResult<T> | null {\n const origStart = ctx.stream.checkpoint();\n\n const origResults = p._run(ctx);\n if (origResults === null) {\n ctx.stream.reset(origStart);\n return null;\n }\n const { app } = ctx;\n return { ...origResults, app };\n}\n\n/** for pretty printing, track subsidiary parsers */\nexport function trackChildren(p: AnyParser, ...args: CombinatorArg[]) {\n if (tracing) {\n assertThat(p._traceInfo);\n const kids = args.map(parserArg);\n p._traceInfo.traceChildren = kids;\n }\n}\n","/** A source map file, and a path for debug purposes. */\nexport interface SrcWithPath {\n /** User friendly path */\n path?: string;\n text: string;\n}\n\nexport interface SrcMapEntry {\n src: SrcWithPath;\n srcStart: number;\n srcEnd: number;\n destStart: number;\n destEnd: number;\n}\n\nexport interface SrcPosition {\n src: SrcWithPath;\n position: number;\n}\n\n/** map text ranges in multiple src texts to a single dest text */\nexport class SrcMap {\n entries: SrcMapEntry[];\n dest: SrcWithPath;\n\n constructor(dest: SrcWithPath, entries: SrcMapEntry[] = []) {\n this.dest = dest;\n this.entries = entries;\n }\n\n /** add a new mapping from src to dest ranges.\n * entries must be non-overlapping in the destination\n */\n addEntries(newEntries: SrcMapEntry[]): void {\n this.entries.push(...newEntries);\n }\n\n /** given positions in the dest string,\n * @return corresponding positions in the src strings */\n mapPositions(...positions: number[]): SrcPosition[] {\n return positions.map(p => this.destToSrc(p));\n }\n\n /** internally compress adjacent entries where possible */\n compact(): void {\n if (!this.entries.length) return;\n let prev = this.entries[0];\n const newEntries: SrcMapEntry[] = [prev];\n\n for (let i = 1; i < this.entries.length; i++) {\n const e = this.entries[i];\n if (\n e.src.path === prev.src.path &&\n e.src.text === prev.src.text &&\n prev.destEnd === e.destStart &&\n prev.srcEnd === e.srcStart\n ) {\n // combine adjacent range entries into one\n prev.destEnd = e.destEnd;\n prev.srcEnd = e.srcEnd;\n } else {\n newEntries.push(e);\n prev = e;\n }\n }\n this.entries = newEntries;\n }\n\n /** sort in destination order */\n sort(): void {\n this.entries.sort((a, b) => a.destStart - b.destStart);\n }\n\n /** This SrcMap's destination is a src for the other srcmap,\n * so combine the two and return the result.\n */\n merge(other: SrcMap): SrcMap {\n if (other === this) return this;\n\n const mappedEntries = other.entries.filter(\n e => e.src.path === this.dest.path && e.src.text === this.dest.text,\n );\n if (mappedEntries.length === 0) {\n console.log(\"other source map does not link to this one\");\n // dlog({ this: this });\n // dlog({ other });\n return other;\n }\n sortSrc(mappedEntries);\n const newEntries = mappedEntries.map(e => {\n const { src, position: srcStart } = this.destToSrc(e.srcStart);\n const { src: endSrc, position: srcEnd } = this.destToSrc(e.srcEnd);\n if (endSrc !== src) throw new Error(\"NYI, need to split\");\n const newEntry: SrcMapEntry = {\n src,\n srcStart,\n srcEnd,\n destStart: e.destStart,\n destEnd: e.destEnd,\n };\n // dlog({ newEntry });\n return newEntry;\n });\n\n const otherSources = other.entries.filter(\n e => e.src.path !== this.dest.path || e.src.text !== this.dest.text,\n );\n\n const newMap = new SrcMap(other.dest, [...otherSources, ...newEntries]);\n newMap.sort();\n return newMap;\n }\n\n /**\n * @param entries should be sorted in destStart order\n * @return the source position corresponding to a provided destination position\n *\n */\n destToSrc(destPos: number): SrcPosition {\n const entry = this.entries.find(\n e => e.destStart <= destPos && e.destEnd >= destPos,\n );\n if (!entry) {\n /* LATER: @stefnotch will replace with the reworked version\n Original error:\n this console.log triggers during debugging, now that preprocessing doesn't produce a real srcMap. \n remove the warning or fix the reason for the warning?\n */\n\n // console.log(`no SrcMapEntry for dest position: ${destPos}`);\n return {\n src: this.dest,\n position: destPos,\n };\n }\n return {\n src: entry.src,\n position: entry.srcStart + destPos - entry.destStart,\n };\n }\n}\n\n/** sort entries in place by src start position */\nfunction sortSrc(entries: SrcMapEntry[]): void {\n entries.sort((a, b) => a.srcStart - b.srcStart);\n}\n","import { SrcMap, SrcMapEntry, SrcWithPath } from \"./SrcMap.js\";\n\n/**\n * Incrementally append to a string, tracking source references\n */\nexport class SrcMapBuilder {\n #fragments: string[] = [];\n #destLength = 0;\n #entries: SrcMapEntry[] = [];\n\n constructor(public source: SrcWithPath) {}\n\n /** append a string fragment to the destination string */\n add(fragment: string, srcStart: number, srcEnd: number): void {\n // dlog({fragment})\n const destStart = this.#destLength;\n this.#destLength += fragment.length;\n const destEnd = this.#destLength;\n\n this.#fragments.push(fragment);\n this.#entries.push({\n src: this.source,\n srcStart,\n srcEnd,\n destStart,\n destEnd,\n });\n }\n\n /**\n * Append a fragment to the destination string,\n * mapping source to the pervious,\n * and guessing that the source fragment is just as long as the the dest fragment.\n * (LATER we plan to drop or make optional src end positions)\n */\n appendNext(fragment: string): void {\n const lastEnd = this.#entries.at(-1)?.destEnd ?? 0;\n this.add(fragment, lastEnd, lastEnd + fragment.length);\n }\n\n addSynthetic(\n fragment: string,\n syntheticSource: string,\n srcStart: number,\n srcEnd: number,\n ): void {\n // dlog({fragment})\n const destStart = this.#destLength;\n this.#destLength += fragment.length;\n const destEnd = this.#destLength;\n\n this.#fragments.push(fragment);\n this.#entries.push({\n src: { text: syntheticSource },\n srcStart,\n srcEnd,\n destStart,\n destEnd,\n });\n }\n\n /** append a synthetic newline, mapped to previous source location */\n addNl(): void {\n const lastEntry = this.#entries.at(-1) ?? { srcStart: 0, srcEnd: 0 };\n const { srcStart, srcEnd } = lastEntry;\n this.add(\"\\n\", srcStart, srcEnd);\n }\n\n /** copy a string fragment from the src to the destination string */\n addCopy(srcStart: number, srcEnd: number): void {\n const fragment = this.source.text.slice(srcStart, srcEnd);\n this.add(fragment, srcStart, srcEnd);\n }\n\n /** return a SrcMap */\n static build(builders: SrcMapBuilder[]): SrcMap {\n const map = new SrcMap(\n { text: builders.map(b => b.#fragments.join(\"\")).join(\"\") },\n builders.flatMap(b => b.#entries),\n );\n map.compact();\n return map;\n }\n}\n","import { Stream, Token } from \"../Stream.ts\";\n\nexport class CachingStream<T extends Token> implements Stream<T> {\n private cache = new Cache<number, { token: T | null; checkpoint: number }>(5);\n constructor(private inner: Stream<T>) {}\n checkpoint(): number {\n return this.inner.checkpoint();\n }\n reset(position: number): void {\n this.inner.reset(position);\n }\n nextToken(): T | null {\n const startPos = this.checkpoint();\n const cachedValue = this.cache.get(startPos);\n if (cachedValue !== undefined) {\n this.reset(cachedValue.checkpoint);\n return cachedValue.token;\n } else {\n const token = this.inner.nextToken();\n const checkpoint = this.checkpoint();\n this.cache.set(startPos, { token, checkpoint });\n return token;\n }\n }\n get src(): string {\n return this.inner.src;\n }\n}\n\n/** size limited key value cache */\nclass Cache<K, V> extends Map<K, V> {\n constructor(private readonly max: number) {\n super();\n }\n\n set(k: K, v: V): this {\n if (this.size > this.max) {\n const first = this.keys().next().value;\n if (first) this.delete(first);\n }\n return super.set(k, v);\n }\n}\n","export function toRegexSource(nameExp: [string, RegExp | string]): string {\n const [name, e] = nameExp;\n if (typeof e === \"string\") {\n const expSrc = `(${escapeRegex(e)})`;\n verifyNonCapturing(name, new RegExp(expSrc));\n return expSrc;\n } else {\n verifyNonCapturing(name, e);\n return `(${e.source})`;\n }\n}\n\nexport function verifyNonCapturing(name: string, exp: RegExp): void {\n const willMatch = new RegExp(\"|\" + exp.source);\n const result = willMatch.exec(\"\")!;\n if (result.length > 1) {\n throw new Error(\n `match expression groups must be non-capturing: ${name}: /${exp.source}/. Use (?:...) instead.`,\n );\n }\n}\n\nconst regexSpecials = /[$+*.?|(){}[\\]\\\\/^]/g;\n\nexport function escapeRegex(s: string): string {\n return s.replace(regexSpecials, \"\\\\$&\");\n}\n\n/** @return a regexp to match any of the space separated tokens in the provided string.\n *\n * regex special characters are escaped in strings are escaped, and the matchers\n * are sorted by length so that longer matches are preferred.\n */\nexport function matchOneOf(syms: string): RegExp {\n const symbolList = syms.split(/\\s+/).sort((a, b) => b.length - a.length);\n const escaped = symbolList.filter(s => s).map(escapeRegex);\n return new RegExp(escaped.join(\"|\"));\n}\n","import { Span } from \"../Span.ts\";\nimport { Stream, TypedToken } from \"../Stream.ts\";\nimport { toRegexSource } from \"./RegexHelpers.ts\";\n\n/**\n * Runs a `RegexMatchers` on an input string\n */\nexport class MatchersStream<Kind extends string>\n implements Stream<TypedToken<Kind>>\n{\n private position: number = 0;\n constructor(\n public text: string,\n private matchers: RegexMatchers<Kind>,\n ) {}\n checkpoint(): number {\n return this.position;\n }\n reset(position: number): void {\n this.position = position;\n }\n nextToken(): TypedToken<Kind> | null {\n const result = this.matchers.execAt(this.text, this.position);\n if (result === null) return null;\n this.position = result.span[1];\n return result;\n }\n get src(): string {\n return this.text;\n }\n}\n\n/**\n * The matchers passed to this object must follow certain rules\n * - They must use non-capturing groups. `(?:...)`\n * - They must NOT use `^` or `$`\n */\nexport class RegexMatchers<Kind extends string> {\n private groups: Kind[];\n private exp: RegExp;\n constructor(matchers: Record<Kind, string | RegExp>) {\n this.groups = Object.keys(matchers) as Kind[];\n const expParts = Object.entries(matchers as Record<string, string | RegExp>)\n .map(toRegexSource)\n .join(\"|\");\n // d = return substrings of each match\n // y = sticky, only match at the start of the string\n // u = unicode aware\n this.exp = new RegExp(expParts, \"dyu\");\n }\n\n execAt(text: string, position: number): TypedToken<Kind> | null {\n this.exp.lastIndex = position;\n const matches = this.exp.exec(text);\n const matchedIndex = findGroupDex(matches?.indices);\n\n if (matchedIndex) {\n const { span, groupDex } = matchedIndex;\n const kind = this.groups[groupDex];\n return {\n kind,\n span,\n text: text.slice(span[0], span[1]),\n };\n } else {\n return null;\n }\n }\n}\n\ninterface MatchedIndex {\n span: Span;\n groupDex: number;\n}\n\nfunction findGroupDex(\n indices: RegExpIndicesArray | undefined,\n): MatchedIndex | undefined {\n if (indices !== undefined) {\n for (let i = 1; i < indices.length; i++) {\n const span = indices[i];\n if (span !== undefined) {\n return { span, groupDex: i - 1 };\n }\n }\n }\n}\n","import { tracing } from \"mini-parse\";\n\n/** checks whether a condition is true, otherwise throws */\nexport function assertThat(condition: any, msg?: string): asserts condition {\n if (!condition) {\n throw new Error(msg);\n }\n}\n\n/** when debug testing is enabled, checks whether a condition is true, otherwise throws */\nexport function assertThatDebug(\n condition: any,\n msg?: string,\n): asserts condition {\n tracing && assertThat(condition, msg);\n}\n\n/** when debug testing is enabled throw an error */\nexport function failDebug(msg = \"FAIL\"): void {\n if (tracing) throw new Error(msg);\n}\n\n/**\n * Typescript will complain at compile time if it thinks this could be executed.\n * Useful to validate that all cases are handled.\n *\n * Does nothing at runtime.\n */\nexport function assertUnreachableSilent(_value: never): void {}\n\n/**\n * Useful to validate that all cases are handled,\n * TypeScript should complain if this statement could possibly be executed.\n *\n * If this is somehow executed at runtime, throw an exception.\n */\nexport function assertUnreachable(value: never): never {\n throw new ErrorWithData(\"Unreachable value\", { data: value }); // LATER optimize code size by reporting less in non debug builds\n}\n\nexport interface ErrorWithDataOptions extends ErrorOptions {\n data: any;\n}\n\nexport class ErrorWithData extends Error {\n data: any;\n constructor(message?: string, options?: ErrorWithDataOptions) {\n super(message, options);\n this.data = options?.data;\n }\n}\n","import { Span } from \"mini-parse\";\n\nexport function multiKeySet<A, B, V>(\n m: Map<A, Map<B, V>>,\n a: A,\n b: B,\n v: V,\n): void {\n const bMap = m.get(a) || new Map();\n m.set(a, bMap);\n bMap.set(b, v);\n}\n\nconst tokenRegex = /\\b(\\w+)\\b/gi;\n/** replace strings in a text according to a relacement map\n * replaced strings must be 'tokens', surrounded by spaces or punctuation\n */\nexport function replaceWords(\n text: string,\n replace: Record<string, string>,\n): string {\n return text.replaceAll(tokenRegex, s => (s in replace ? replace[s] : s));\n}\n\n/** return an array partitioned into possibly overlapping groups */\nexport function grouped<T>(a: T[], size: number, stride = size): T[][] {\n const groups = [];\n for (let i = 0; i < a.length; i += stride) {\n groups.push(a.slice(i, i + size));\n }\n return groups;\n}\n\n/** group an array into subarrays by a key function */\nexport function groupBy<T, K>(a: T[], key: (t: T) => K): Map<K, T[]> {\n const groups = new Map<K, T[]>();\n for (const t of a) {\n const k = key(t);\n const group = groups.get(k) || [];\n group.push(t);\n groups.set(k, group);\n }\n return groups;\n}\n\n/** partition an array into two parts by a discriminator function */\nexport function partition<T>(a: T[], partFn: (t: T) => boolean): [T[], T[]] {\n const yesPart: T[] = [];\n const noPart: T[] = [];\n for (const t of a) {\n if (partFn(t)) yesPart.push(t);\n else noPart.push(t);\n }\n return [yesPart, noPart];\n}\n\n/** run an carrying function over every element in an array,\n * i.e. an inclusive prefix scan */\nexport function scan<T, U>(array: T[], fn: (a: T, b: U) => U, zero: U): U[] {\n const result = [zero];\n\n let current = zero;\n for (let i = 0; i < array.length; i++) {\n current = fn(array[i], current);\n result.push(current);\n }\n return result;\n}\n\n/** return a new record by replacing values in 'a' with 'b' as a map.\n * values in 'a' that are not in 'b' are unchanged.\n * e.g. {a: \"b\", x: 9}, {b: 1} yields {a: 1, x: 9}\n */\nexport function mapForward(\n a: Record<string, string>,\n b: Record<string, any>,\n): Record<string, any> {\n const combined = Object.entries(a).map(([key, value]) => {\n const mappedValue = value in b ? b[value] : value;\n return [key, mappedValue];\n });\n return Object.fromEntries(combined);\n}\n\n/** return the last element of an array or undefined */\nexport function last<T>(a: T[]): T | undefined {\n return a[a.length - 1];\n}\n\n/**\n * Overlap two arrays, returning the tail of b if a is a prefix of b.\n * Otherwise, return undefined.\n */\nexport function overlapTail<T>(a: T[], b: T[]): T[] | undefined {\n let overlapSize = Math.min(a.length, b.length);\n\n while (overlapSize > 0) {\n const suffix = a.slice(-overlapSize);\n const prefix = b.slice(0, overlapSize);\n if (arrayEquals(suffix, prefix)) {\n break;\n } else {\n overlapSize--;\n }\n }\n\n if (overlapSize) {\n return b.slice(overlapSize);\n }\n}\n\nfunction arrayEquals(a: any[], b: any[]): boolean {\n return a.length === b.length && a.every((val, index) => val === b[index]);\n}\n\n/** filter an array, returning the truthy results of the filter function */\nexport function filterMap<T, U>(arr: T[], fn: (t: T) => U | undefined): U[] {\n const out: U[] = [];\n for (const t of arr) {\n const u = fn(t);\n if (u) out.push(u);\n }\n return out;\n}\n\n/** filters an array, returns the first truthy result of the filter function */\nexport function findMap<T, U>(\n arr: T[],\n fn: (t: T) => U | undefined,\n): U | undefined {\n for (const t of arr) {\n const u = fn(t);\n if (u) return u;\n }\n return undefined;\n}\n\n/** Run a function over the values in a Record\n * @return a new Record with mapped values. */\nexport function mapValues<T, U>(\n obj: Record<string, T>,\n fn: (v: T) => U,\n): Record<string, U> {\n return Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, fn(v)]));\n}\n\n/**\n * Maps an index to a 1-indexed line number, and 1-indexed column.\n */\nexport function offsetToLineNumber(\n offset: number,\n text: string,\n): [lineNum: number, linePos: number] {\n offset = Math.min(text.length, Math.max(0, offset));\n let lineStartOffset = 0;\n let lineNum = 1;\n while (true) {\n // LATER: Does this \"line break\" actually match the spec? I think not\n const lineEnd = text.indexOf(\"\\n\", lineStartOffset);\n if (lineEnd === -1 || offset <= lineEnd) {\n // Last relevant line\n const linePos = 1 + (offset - lineStartOffset);\n return [lineNum, linePos];\n } else {\n // Go to the next line\n lineStartOffset = lineEnd + 1;\n lineNum += 1;\n }\n }\n}\n\n/** Highlights an error.\n *\n * Returns a string with the line, and a string with the ^^^^ carets\n */\nexport function errorHighlight(source: string, span: Span): [string, string] {\n let lineStartOffset = source.lastIndexOf(\"\\n\", span[0]);\n if (lineStartOffset === -1) {\n lineStartOffset = 0;\n }\n let lineEndOffset = source.indexOf(\"\\n\", span[0]);\n if (lineEndOffset === -1) {\n lineEndOffset = source.length;\n }\n\n // LATER Handle multiline spans\n const errorLength = span[1] - span[0];\n const caretCount = Math.max(1, errorLength);\n const linePos = span[0] - lineStartOffset;\n return [\n source.slice(lineStartOffset, lineEndOffset),\n \" \".repeat(linePos) + \"^\".repeat(caretCount),\n ];\n}\n","import {\n AttributeElem,\n ElemWithAttributes,\n ExpressionElem,\n IfAttribute,\n} from \"./AbstractElems.ts\";\nimport { assertThatDebug, assertUnreachable } from \"./Assertions.ts\";\nimport { Conditions, Scope } from \"./Scope.ts\";\nimport { findMap } from \"./Util.ts\";\n\n/** @return true if the element is valid under current Conditions */\nexport function elementValid(\n elem: ElemWithAttributes,\n conditions: Conditions,\n): boolean {\n const attributes = elem.attributes;\n if (!attributes) return true;\n const ifAttr = findMap(attributes, extractIfAttribute);\n return !ifAttr || evaluateIfAttribute(ifAttr, conditions);\n}\n\n/** @return true if the scope is valid under current conditions */\nexport function scopeValid(scope: Scope, conditions: Conditions): boolean {\n const { ifAttribute } = scope;\n if (!ifAttribute) return true;\n const result = evaluateIfAttribute(ifAttribute, conditions); // LATER cache?\n return result;\n}\n\n/** @return return IfAttribute if AttributeElem contains an IfAttribute */\nfunction extractIfAttribute(elem: AttributeElem): IfAttribute | undefined {\n const { attribute } = elem;\n return attribute.kind === \"@if\" ? attribute : undefined;\n}\n\n/** @return true if the @if attribute is valid with current Conditions */\nfunction evaluateIfAttribute(\n ifAttribute: IfAttribute,\n conditions: Conditions,\n): boolean {\n return evaluateIfExpression(ifAttribute.param.expression, conditions);\n}\n\n/** Evaluate an @if expression based on current runtime Conditions\n * @return true if the expression is true */\nfunction evaluateIfExpression(\n expression: ExpressionElem,\n conditions: Conditions,\n): boolean {\n const { kind } = expression;\n if (kind == \"unary-expression\") {\n assertThatDebug(expression.operator.value === \"!\");\n return !evaluateIfExpression(expression.expression, conditions);\n } else if (kind == \"binary-expression\") {\n const op = expression.operator.value;\n assertThatDebug(op === \"||\" || op === \"&&\");\n const leftResult = evaluateIfExpression(expression.left, conditions);\n if (op === \"||\") {\n return leftResult || evaluateIfExpression(expression.right, conditions);\n } else if (op === \"&&\") {\n return leftResult && evaluateIfExpression(expression.right, conditions);\n } else {\n assertUnreachable(op);\n }\n } else if (kind == \"literal\") {\n const { value } = expression;\n assertThatDebug(value === \"true\" || value === \"false\");\n return value === \"true\";\n } else if (kind == \"parenthesized-expression\") {\n return evaluateIfExpression(expression.expression, conditions);\n } else {\n throw new Error(\"unexpected @if expression ${expression}\");\n }\n}\n","import { DeclarationElem, IfAttribute, RefIdentElem } from \"./AbstractElems.ts\";\nimport { assertThatDebug } from \"./Assertions.ts\";\nimport { scopeValid } from \"./Conditions.ts\";\nimport { WeslAST } from \"./ParseWESL.ts\";\n\nexport interface SrcModule {\n /** module path \"rand_pkg::sub::foo\", or \"package::main\" */\n modulePath: string;\n\n /** file path to the module for user error reporting e.g \"rand_pkg:sub/foo.wesl\", or \"./sub/foo.wesl\" */\n debugFilePath: string;\n\n /** original src for module */\n src: string;\n}\n\n/** a src declaration or reference to an ident */\nexport type Ident = DeclIdent | RefIdent;\n\n/** LATER change this to a Map, so that `toString` isn't accidentally a condition */\nexport type Conditions = Record<string, boolean>;\n\ninterface IdentBase {\n originalName: string; // name in the source code for ident matching (may be mangled in the output)\n id?: number; // for debugging\n}\n\nexport interface RefIdent extends IdentBase {\n kind: \"ref\";\n\n // LATER these fields are set during binding, not parsing. Make a naming scheme _refersTo or a separate interface (BindingRefIdent) to make that clear\n refersTo?: Ident; // import or decl ident in scope to which this ident refers. undefined before binding\n std?: true; // true if this is a standard wgsl identifier (like sin, or u32)\n\n // TODO consider tracking the current ast in BindIdents so that this field is unnecessary\n ast: WeslAST; // AST from module that contains this ident (to find imports during decl binding)\n\n refIdentElem: RefIdentElem; // for error reporting and mangling\n}\n\nexport interface DeclIdent extends IdentBase {\n kind: \"decl\";\n mangledName?: string; // name in the output code\n declElem?: DeclarationElem; // link to AST so that we can traverse scopes and know what elems to emit // LATER make separate GlobalDecl kind with this required\n scope: Scope; // scope for the references within this declaration\n isGlobal: boolean; // true if this is a global declaration (e.g. not a local variable)\n srcModule: SrcModule; // To figure out which module this declaration is from.\n}\n\n/** tree of ident references, organized by lexical scope and partialScope . */\nexport type Scope = LexicalScope | PartialScope;\n\n/** A wgsl scope */\nexport interface LexicalScope extends ScopeBase {\n kind: \"scope\";\n\n /** @if condition for conditionally translating this scope */\n ifAttribute?: IfAttribute;\n\n /**\n * Efficient access to declarations in this scope.\n * constructed on demand, for module root scopes only */ // LATER consider make a special kind for root scopes\n scopeDecls?: Map<string, DeclIdent>;\n}\n\n/** A synthetic partial scope to contain @if conditioned idents.\n * PartialScope idents are considered to be in the wgsl lexical scope of their parent. */\nexport interface PartialScope extends ScopeBase {\n kind: \"partial\";\n\n /** @if condition for conditionally translating this scope */\n ifAttribute?: IfAttribute; // LATER this is required, consider changing type to reflect that\n}\n\n/** common scope elements */\ninterface ScopeBase {\n /** id for debugging */\n id: number;\n\n /** null for root scope in a module */\n parent: Scope | null;\n\n /* Child scopes and idents in lexical order */\n contents: (Ident | Scope)[];\n\n /** @if conditions for conditionally translating this scope */\n ifAttribute?: IfAttribute;\n}\n\n/** Combine two scope siblings.\n * The first scope is mutated to append the contents of the second. */\nexport function mergeScope(a: Scope, b: Scope): void {\n assertThatDebug(a.kind === b.kind);\n assertThatDebug(a.parent === b.parent);\n assertThatDebug(!b.ifAttribute);\n a.contents = a.contents.concat(b.contents);\n}\n\n/** reset scope and ident debugging ids */\nexport function resetScopeIds() {\n scopeId = 0;\n identId = 0;\n}\n\nlet scopeId = 0;\nlet identId = 0;\n\nexport function nextIdentId(): number {\n return identId++;\n}\n\n/** make a new Scope object */\nexport function emptyScope(\n parent: Scope | null,\n kind: Scope[\"kind\"] = \"scope\",\n): Omit<Scope, \"ifAttribute\"> {\n const id = scopeId++;\n return { id, kind, parent, contents: [] };\n}\n\n/** For debugging,\n * @return true if a scope is in the rootScope tree somewhere */\nexport function containsScope(rootScope: Scope, scope: Scope): boolean {\n if (scope === rootScope) {\n return true;\n }\n for (const child of rootScope.contents) {\n if (childScope(child) && containsScope(child, scope)) {\n return true;\n }\n }\n return false;\n}\n\n/** @returns true if the provided element of a Scope\n * is itself a Scope (and not an Ident) */\nexport function childScope(child: Scope | Ident): child is Scope {\n const { kind } = child;\n return kind === \"partial\" || kind === \"scope\";\n}\n\n/** @returns true if the provided element of a Scope\n * is an Ident (and not a child Scope) */\nexport function childIdent(child: Scope | Ident): child is Ident {\n return !childScope(child);\n}\n\n/** find a public declaration with the given original name */\nexport function publicDecl(\n scope: Scope,\n name: string,\n conditions: Conditions,\n): DeclIdent | undefined {\n for (const elem of scope.contents) {\n if (elem.kind === \"decl\" && elem.originalName === name) {\n return elem;\n } else if (elem.kind === \"partial\" && scopeValid(elem, conditions)) {\n const found = publicDecl(elem, name, conditions);\n if (found) return found;\n }\n }\n}\n","/** debug utility for constructing strings that wrap at a fixed column width\n * text beyond the column width is wrapped to start on the next line\n */\nexport class LineWrapper {\n #fragments: string[] = [];\n #column = 0;\n #spc: string;\n #oneLine = true;\n #isHanging = false;\n #hangingSpc: string;\n\n constructor(\n readonly indent = 0,\n readonly maxWidth = 60,\n readonly hangingIndent = 2,\n ) {\n this.#spc = \" \".repeat(indent);\n this.#hangingSpc = \" \".repeat(hangingIndent);\n }\n\n /** add a new line to the constructed string */\n nl() {\n this.#fragments.push(\"\\n\");\n this.#column = 0;\n this.#oneLine = false;\n this.#isHanging = false;\n }\n\n /** add a string, wrapping to the next line if necessary */\n add(s: string) {\n if (this.#column + firstLineLength(s) > this.maxWidth) {\n this.hangingNl();\n }\n if (this.#column === 0) {\n this.#fragments.push(this.#spc);\n if (this.#isHanging) {\n this.#fragments.push(this.#hangingSpc);\n }\n this.#column = this.indent;\n }\n this.#fragments.push(s);\n this.#column += s.length;\n }\n\n /** add a raw block of text with no wrapping */\n addBlock(s: string, andNewLine = true) {\n this.#fragments.push(s);\n if (andNewLine) this.nl();\n }\n\n /** @return the constructed string */\n get result(): string {\n return this.#fragments.join(\"\");\n }\n\n /** true if the result contains no newlines */\n get oneLine(): boolean {\n return this.#oneLine;\n }\n\n private hangingNl() {\n this.nl();\n this.#isHanging = true;\n }\n}\n\nfunction firstLineLength(s: string): number {\n const i = s.indexOf(\"\\n\");\n return i === -1 ? s.length : i;\n}\n","import { childScope, Ident, Scope } from \"../Scope.ts\";\nimport { attributeToString } from \"./ASTtoString.ts\";\nimport { LineWrapper } from \"./LineWrapper.ts\";\n\n/** A debugging print of the scope tree with identifiers in nested brackets */\nexport function scopeToString(\n scope: Scope,\n indent = 0,\n shortIdents = true,\n): string {\n const { contents, kind, ifAttribute } = scope;\n\n const str = new LineWrapper(indent);\n const attrStrings = ifAttribute && attributeToString(ifAttribute);\n if (attrStrings) str.add(attrStrings + \" \");\n if (kind === \"partial\") str.add(\"-\");\n str.add(\"{ \");\n\n const last = contents.length - 1;\n let lastWasScope = false;\n let hasBlock = false;\n contents.forEach((elem, i) => {\n if (childScope(elem)) {\n const childScope: Scope = elem;\n const childBlock = scopeToString(childScope, indent + 2, shortIdents);\n !lastWasScope && str.nl();\n str.addBlock(childBlock);\n lastWasScope = true;\n hasBlock = true;\n } else {\n lastWasScope && str.add(\" \");\n lastWasScope = false;\n const ident: Ident = elem;\n if (shortIdents) {\n str.add(identShortString(ident));\n } else {\n str.add(identToString(ident));\n }\n if (i < last) str.add(\" \");\n }\n });\n\n if (!hasBlock && str.oneLine) {\n str.add(\" }\");\n } else {\n if (hasBlock && !lastWasScope) str.nl();\n str.add(\"}\");\n }\n\n str.add(` #${scope.id}`);\n\n return str.result;\n}\n\n/** A debug print of the scope tree with identifiers in long form in nested brackets */\nexport function scopeToStringLong(scope: Scope): string {\n return scopeToString(scope, 0, false);\n}\n\n/** name of an identifier, with decls prefixed with '%' */\nfunction identShortString(ident: Ident): string {\n const { kind, originalName } = ident;\n const prefix = kind === \"decl\" ? \"%\" : \"\";\n return `${prefix}${originalName}`;\n}\n\nexport function identToString(ident?: Ident): string {\n if (!ident) return JSON.stringify(ident);\n const { kind, originalName } = ident;\n const idStr = ident.id ? `#${ident.id}` : \"\";\n if (kind === \"ref\") {\n const ref = identToString(ident.refersTo!);\n return `${originalName} ${idStr} -> ${ref}`;\n } else {\n const { mangledName } = ident;\n const mangled = mangledName ? `(${mangledName})` : \"\";\n return `%${originalName}${mangled} ${idStr} `;\n }\n}\n","import { identToString } from \"./debug/ScopeToString.ts\";\nimport { DeclIdent } from \"./Scope.ts\";\n\n/** decls currently visible in this scope */\nexport interface LiveDecls {\n /** decls currently visible in this scope */\n decls: Map<string, DeclIdent>;\n\n /** live decls in the parent scope. null for the modue root scope */\n parent?: LiveDecls | null;\n}\n\n/** create a LiveDecls */\nexport function makeLiveDecls(parent: LiveDecls | null = null): LiveDecls {\n return { decls: new Map<string, DeclIdent>(), parent };\n}\n\n/** debug routine for logging LiveDecls */\nexport function liveDeclsToString(liveDecls: LiveDecls): string {\n const { decls, parent } = liveDecls;\n const declsStr = Array.from(decls.entries())\n .map(([name, decl]) => `${name}:${identToString(decl)}`)\n .join(\", \");\n const parentStr = parent ? liveDeclsToString(parent) : \"null\";\n return `decls: { ${declsStr} }, parent: ${parentStr}`;\n}\n\n/*\nLATER try not creating a map for small scopes. \nInstead just track the current live index in the scope array.\n*/\n","import { DeclIdent, SrcModule } from \"./Scope.ts\";\n/**\n * A function for constructing a unique identifier name for a global declaration.\n * Global names must be unique in the linked wgsl.\n *\n * Three manglers are currently available:\n * . minimalMangle preserves original source names where possible\n * . underscoreMangle constructs long but predictable names for every declaration\n * . lengthPrefixMangle constructs long but predictable names for every declaration\n */\nexport type ManglerFn = (\n /** global declaration that needs a name */\n decl: DeclIdent,\n\n /** module that contains the declaration */\n srcModule: SrcModule,\n\n /** name at use site (possibly import as renamed from declaration) */\n proposedName: string,\n\n /** current set of mangled root level names for the linked result (read only) */\n globalNames: Set<string>,\n) => string;\n\n/**\n * Construct a globally unique name based on the declaration\n * module path separated by underscores.\n * Corresponds to \"Underscore-count mangling\" from [NameMangling.md](https://github.com/wgsl-tooling-wg/wesl-spec/blob/main/NameMangling.md)\n */\nexport function underscoreMangle(\n decl: DeclIdent,\n srcModule: SrcModule,\n): string {\n const { modulePath } = srcModule;\n return [...modulePath.split(\"::\"), decl.originalName]\n .map(v => {\n const underscoreCount = (v.match(/_/g) ?? []).length;\n if (underscoreCount > 0) {\n return \"_\" + underscoreCount + v;\n } else {\n return v;\n }\n })\n .join(\"_\");\n}\n\n/**\n * Construct a globally unique name based on the declaration\n */\nexport function lengthPrefixMangle(\n decl: DeclIdent,\n srcModule: SrcModule,\n): string {\n function codepointCount(text: string): number {\n return [...text].length;\n }\n const qualifiedIdent = [\n ...srcModule.modulePath.split(\"::\"),\n decl.originalName,\n ];\n return \"_\" + qualifiedIdent.map(v => codepointCount(v) + v).join(\"\");\n}\n\n/**\n * ManglerFn to construct a globally unique name\n * using the requested name plus a uniquing number suffix if necessary\n */\nexport function minimalMangle(\n _d: DeclIdent,\n _s: SrcModule,\n proposedName: string,\n globalNames: Set<string>,\n): string {\n return minimallyMangledName(proposedName, globalNames);\n}\n\n/**\n * Construct a globally unique name by using the requested name if possible\n * and appending a number suffix necessary\n */\nexport function minimallyMangledName(\n proposedName: string,\n globalNames: Set<string>,\n): string {\n let renamed = proposedName;\n let conflicts = 0;\n\n // create a unique name\n while (globalNames.has(renamed)) {\n renamed = proposedName + conflicts++;\n }\n\n return renamed;\n}\n","import {\n ImportCollection,\n ImportItem,\n ImportSegment,\n ImportStatement,\n} from \"./AbstractElems\";\nimport { assertUnreachable } from \"./Assertions\";\n\nexport interface FlatImport {\n importPath: string[];\n modulePath: string[];\n}\n\n/**\n * Simplify importTree into a flattened map from import paths to module paths.\n *\n * @return map from import path (with 'as' renaming) to module Path\n */\nexport function flattenTreeImport(imp: ImportStatement): FlatImport[] {\n return recursiveResolve([], [], imp.segments, imp.finalSegment);\n\n /** recurse through segments of path, producing */\n function recursiveResolve(\n resolvedImportPath: string[],\n resolvedExportPath: string[],\n remainingPath: ImportSegment[],\n finalSegment: ImportCollection | ImportItem,\n ): FlatImport[] {\n if (remainingPath.length > 0) {\n const [segment, ...rest] = remainingPath;\n const importPath = [...resolvedImportPath, segment.name];\n const modulePath = [...resolvedExportPath, segment.name];\n return recursiveResolve(importPath, modulePath, rest, finalSegment);\n } else if (finalSegment.kind === \"import-collection\") {\n // resolve path with each element in the list\n return finalSegment.subtrees.flatMap(elem => {\n return recursiveResolve(\n resolvedImportPath,\n resolvedExportPath,\n elem.segments,\n elem.finalSegment,\n );\n });\n } else if (finalSegment.kind === \"import-item\") {\n const importPath = [\n ...resolvedImportPath,\n finalSegment.as ?? finalSegment.name,\n ];\n const modulePath = [...resolvedExportPath, finalSegment.name];\n return [{ importPath, modulePath }];\n } else {\n assertUnreachable(finalSegment);\n }\n }\n}\n","// src/BerryStringUtil.ts\nvar spaces = memoize((nesting) => {\n return \" \".repeat(nesting);\n});\nvar defaultCallerSize = 20;\nvar multiLinePad = \"\\n\" + spaces(defaultCallerSize + 3);\nfunction indentMultiLine(messages) {\n return messages.map(indentString);\n}\nfunction padTrimCaller(caller, callerSize = defaultCallerSize) {\n return (caller + spaces(callerSize)).slice(0, callerSize);\n}\nfunction indentString(m) {\n if (typeof m === \"string\") {\n return m.replace(/\\n/g, multiLinePad);\n } else {\n return m;\n }\n}\nfunction memoize(fn) {\n const cache = /* @__PURE__ */ new Map();\n return function(...args) {\n const key = JSON.stringify(args);\n if (cache.has(key)) {\n return cache.get(key);\n } else {\n const value = fn(...args);\n cache.set(key, value);\n return value;\n }\n };\n}\n\n// src/ReplaceUndefined.ts\nfunction replaceUndefined(obj, defaults) {\n const result = { ...defaults, ...removeUndefined(obj) };\n return result;\n}\nfunction removeUndefined(obj) {\n const result = { ...obj };\n for (const key in result) {\n if (result[key] === void 0) {\n delete result[key];\n }\n }\n return result;\n}\n\n// src/BerryPretty.ts\nvar defaultOptions = {\n compact: true,\n wrapLength: 40,\n maxDepth: 6,\n maxArray: 24,\n prototypes: false,\n precision: 4\n};\nvar circularRef = {\n iAmCircular: true\n};\nif (typeof DOMRect === \"undefined\") {\n globalThis.DOMRect = function() {\n };\n}\nfunction pretty(value, options = {}) {\n const opts = replaceUndefined(options, defaultOptions);\n const { wrapLength, compact } = opts;\n const iterated = /* @__PURE__ */ new Map();\n let result = prettyToString(value, opts, iterated);\n if (compact && result.length > wrapLength) {\n result = prettyToString(value, { ...opts, compact: false }, iterated);\n }\n return result;\n}\nfunction prettyToString(value, opts, iterated = /* @__PURE__ */ new Map()) {\n const state = { nesting: 0, depth: 0, seen: /* @__PURE__ */ new Set(), iterated };\n if (isObject(value)) {\n state.seen.add(value);\n }\n return prettyRecursive(value, opts, state);\n}\nfunction prettyRecursive(value, options, state) {\n let result;\n if (state.depth++ >= options.maxDepth) {\n result = \"...\";\n } else if (isInteger(value)) {\n result = value.toFixed();\n } else if (typeof value === \"number\") {\n result = prettyFloat(value, options.precision);\n } else if (typeof value === \"string\") {\n result = `\"${replaceSpecials(value)}\"`;\n } else if (arrayIsh(value)) {\n result = arrayToString(value, options, state);\n } else if (value instanceof Date) {\n result = value.toLocaleString();\n } else if (value instanceof Function) {\n result = \"function \" + value.name + \"()\";\n } else if (isDomElement(value)) {\n result = value;\n } else if (value === circularRef) {\n result = \"<circular reference>\";\n } else if (value instanceof DOMRect) {\n const { top, left, height, width } = value;\n result = prettyRecursive({ top, left, height, width }, options, state);\n } else if (typeof value === \"symbol\") {\n result = value.toString();\n } else if (value instanceof Error) {\n result = errorToString(value, options, state);\n } else if (value instanceof Map || value && value.constructor === Map) {\n result = mapToString(value, options, state);\n } else if (value instanceof Set || value && value.constructor === Set) {\n result = setToString(value, options, state);\n } else if (value && value[Symbol.iterator]) {\n result = iterableToString(value, options, state);\n } else if (isInstance(value)) {\n result = instanceToString(value, options, state);\n } else if (isObject(value)) {\n result = objectToString(value, options, state);\n } else if (value === true) {\n result = \"true\";\n } else if (value === false) {\n result = \"false\";\n } else if (value === null) {\n result = \"null\";\n } else if (value === void 0) {\n result = \"undefined\";\n } else {\n result = value;\n }\n state.depth--;\n return result;\n}\nvar specials = /* @__PURE__ */ new Map([\n [\"\t\", \"\\\\t\"],\n [\"\\r\", \"\\\\r\"],\n [\"\\n\", \"\\\\n\"],\n ['\"', '\\\\\"']\n]);\nfunction replaceSpecials(s) {\n return [...s].map((c) => specials.get(c) || c).join(\"\");\n}\nfunction replaceCircular(keyValues, seen) {\n return keyValues.map(([key, value]) => {\n if (testCircular(value, seen)) {\n return [key, circularRef];\n } else {\n return [key, value];\n }\n });\n}\nfunction testCircular(value, seen) {\n if (isObject(value)) {\n if (seen.has(value)) {\n return true;\n } else {\n seen.add(value);\n }\n }\n return false;\n}\nfunction isObject(value) {\n const valueType = typeof value;\n return value != null && (valueType === \"object\" || valueType === \"function\");\n}\nfunction arrayIsh(value) {\n return Array.isArray(value) || ArrayBuffer.isView(value);\n}\nfunction arrayToString(values, options, state) {\n if (options.compact || values.length <= 1) {\n return oneLineArray(values, options, state);\n } else {\n return multiLineArray(values, options, state);\n }\n}\nfunction oneLineArray(value, options, state) {\n const expanded = [...value];\n const values = expanded.slice(0, options.maxArray).map((v) => prettyRecursive(v, options, state));\n if (expanded.length > options.maxArray) {\n values.push(\"...\");\n }\n return \"[\" + values.join(\", \") + \"]\";\n}\nfunction multiLineArray(value, options, state) {\n const bracketIndent = spaces(state.nesting);\n state.nesting++;\n const values = [...value].slice(0, options.maxArray).map((v) => prettyRecursive(v, options, state));\n if (value.length > options.maxArray) {\n values.push(\"...\");\n }\n const indent = spaces(state.nesting * 2);\n state.nesting--;\n const lastDex = values.length - 1;\n const indentedLines = values.map((v, i) => {\n const comma = i === lastDex ? \"\" : \",\";\n return indent + v + comma + \"\\n\";\n });\n const linesTogether = indentedLines.join(\"\");\n const open = bracketIndent + \"[\\n\";\n const close = bracketIndent + \"]\";\n return open + linesTogether + close;\n}\nfunction isClass(v) {\n return typeof v === \"function\" && /^class\\s/.test(Function.prototype.toString.call(v));\n}\nfunction isInstance(value) {\n return value && isClass(value.constructor);\n}\nfunction instanceToString(value, options, state) {\n const record = objectToString(value, options, state);\n return `${value.constructor.name} ${record}`;\n}\nfunction objectToString(value, options, state) {\n const { compact, prototypes } = options;\n const rawKeyValues = prototypes ? allEntries(value) : Object.entries(value);\n const keyValues = replaceCircular(rawKeyValues, state.seen);\n if (compact) {\n return oneLineObj(keyValues, options, state);\n } else {\n return multiLineKV(keyValues, options, state);\n }\n}\nfunction oneLineObj(keyValues, options, state) {\n const kvStrings = keyValues.map(\n ([k, v]) => k + \": \" + prettyRecursive(v, options, state)\n );\n return \"{\" + kvStrings.join(\", \") + \"}\";\n}\nfunction multiLineKV(keyValues, opts, state, separator = \": \") {\n if (keyValues.length === 0) {\n return \"{ }\";\n }\n const braceNesting = state.nesting, braceIndent = spaces(braceNesting * 2), indent = braceIndent + \" \";\n state.nesting++;\n const kvStrings = keyValues.map(\n ([k, v]) => k + separator + prettyRecursive(v, opts, state)\n );\n state.nesting--;\n return formatKVs(kvStrings, braceIndent, indent);\n}\nfunction formatKVs(kvStrings, braceIndent, indent) {\n let indentedStrings;\n let firstLine;\n if (braceIndent === \"\") {\n firstLine = \"{ \";\n const first = kvStrings[0];\n indentedStrings = kvStrings.slice(1).map((kv) => indent + kv) || [];\n indentedStrings.unshift(first);\n } else {\n firstLine = \"{\\n\";\n indentedStrings = kvStrings.map((kv) => indent + kv);\n }\n return firstLine + indentedStrings.join(\",\\n\") + \"\\n\" + braceIndent + \"}\";\n}\nfunction allEntries(obj) {\n const keyValues = [];\n for (const key in obj) {\n const value = obj[key];\n keyValues.push([key, value]);\n }\n return keyValues;\n}\nfunction prettyFloat(value, precision = 4) {\n const str = value.toPrecision(precision);\n if (str.indexOf(\".\") === -1) {\n return str;\n }\n let last = str.length - 1;\n while (str[last] === \"0\") {\n last -= 1;\n }\n if (str[last] === \".\") {\n last -= 1;\n }\n return str.slice(0, last + 1);\n}\nfunction isInteger(value) {\n if (typeof value !== \"number\") {\n return false;\n }\n if (Number.isInteger(value)) {\n return true;\n }\n return isFinite(value) && Math.floor(value) === value;\n}\nfunction errorToString(err, options, state) {\n const stack = err.stack?.split(\"\\n\").slice(1, 2)[0];\n return prettyRecursive(\n { err: err.name, message: err.message, stack },\n options,\n state\n );\n}\nfunction mapToString(map, options, state) {\n const rawKeyValues = [...map.entries()].map(([key, value]) => {\n const keyString = prettyRecursive(key, options, state);\n return [keyString, value];\n });\n const keyValues = replaceCircular(rawKeyValues, state.seen);\n return multiLineKV(keyValues, options, state, \" -> \");\n}\nfunction setToString(set, options, state) {\n const values = [...set.values()].map((value) => {\n return prettyRecursive(value, options, state);\n });\n return \"{\" + values.join(\", \") + \"}\";\n}\nfunction iterableToString(iterable, options, state) {\n let expanded = state.iterated.get(iterable);\n if (!expanded) {\n expanded = [...iterable];\n state.iterated.set(iterable, expanded);\n }\n return arrayToString(expanded, options, state);\n}\nfunction isDomElement(value) {\n if (typeof Element === \"undefined\") {\n return false;\n } else {\n return value instanceof Element || value instanceof Text;\n }\n}\n\n// src/BerryStack.ts\nfunction callerName(stack, level = 1, showFile = false) {\n const lines = stack.split(\"\\n\");\n if (lines.length && lines[0].startsWith(\"Error\")) {\n return callerFromChromeStack(lines, level, showFile);\n } else {\n return callerFromFirefoxStack(lines, level, showFile);\n }\n}\nfunction callerFromFirefoxStack(stackLines, level = 1, showFile = false) {\n showFile;\n if (stackLines.length < level) {\n return \"\";\n }\n const line = stackLines[level];\n const atDex = line.indexOf(\"@\");\n if (atDex === -1) {\n return \"\";\n }\n return line.slice(0, atDex);\n}\nfunction callerFromChromeStack(stackLines, level = 1, showFile = false) {\n if (stackLines.length < level + 1) {\n return \"\";\n }\n const line = stackLines[level + 1];\n const afterAt = startAfterAt(line);\n if (!afterAt) {\n return \"\";\n }\n const paren = afterAt.indexOf(\" (\");\n if (paren > 0) {\n const fullFunctionName = afterAt.slice(0, paren);\n const functionName = afterDot(fullFunctionName);\n if (showFile) {\n const fileName = fileFromUrlLine(afterAt);\n return `${fileName}.${functionName}`;\n } else {\n return functionName;\n }\n } else {\n return fileFromUrlLine(afterAt);\n }\n}\nfunction fileFromUrlLine(text) {\n let start = 0;\n let end = text.length;\n const slash = text.lastIndexOf(\"/\");\n if (slash > 0) {\n start = slash + 1;\n const lastColon = text.lastIndexOf(\":\");\n if (lastColon > 0) {\n const secondColon = text.lastIndexOf(\":\", lastColon - 1);\n if (secondColon > 0) {\n end = secondColon;\n } else {\n end = lastColon;\n }\n }\n }\n const fileWithSuffix = text.slice(start, end);\n return beforeDot(fileWithSuffix);\n}\nvar at = \"at \";\nfunction startAfterAt(line) {\n const atDex = line.indexOf(at);\n if (atDex === -1) {\n return void 0;\n }\n const start = atDex + at.length;\n return line.slice(start);\n}\nfunction beforeDot(text) {\n const dot = text.lastIndexOf(\".\");\n if (dot > 0) {\n return text.slice(0, dot);\n } else {\n return text;\n }\n}\nfunction afterDot(text) {\n const dot = text.indexOf(\".\");\n if (dot > 0) {\n return text.slice(dot + 1);\n } else {\n return text;\n }\n}\n\n// src/DebugLog.ts\nvar dLog = dlog;\nvar dErr = derr;\nvar dWarn = dwarn;\nvar defaultOptions2 = {\n stackLevel: 0,\n showFile: false,\n nameSize: 20,\n compact: true,\n wrapLength: 40,\n maxDepth: 6,\n maxArray: 24,\n prototypes: false,\n precision: 4\n};\nfunction dlog(...items) {\n console.log(...dLogMessages({}, ...items));\n}\nfunction dlogOpt(options, ...items) {\n console.log(...dLogMessages(options, ...items));\n}\nfunction dsert(test, ...items) {\n if (!test) {\n const messages = dLogMessages({}, ...items);\n console.assert(test, messages);\n }\n}\nfunction derr(...items) {\n console.error(...dLogMessages({}, ...items));\n}\nfunction dwarn(...items) {\n console.warn(...dLogMessages({}, ...items));\n}\nfunction dLogDefaultOptions(options) {\n Object.assign(defaultOptions2, options);\n}\nfunction dlogMessagesTest(options, ...items) {\n return dLogMessages(options, ...items);\n}\nfunction dLogMessages(options, ...items) {\n const opts = replaceUndefined(options, defaultOptions2);\n const level = opts.stackLevel + 2;\n const messages = items.map((item) => {\n if (item != null && typeof item == \"object\") {\n return debugVars(item, opts);\n } else {\n return item;\n }\n });\n const caller = callerName(new Error().stack || \"\", level, opts.showFile);\n const fixedWidthCaller = padTrimCaller(caller, opts.nameSize);\n messages.unshift(`${fixedWidthCaller} |`);\n return indentMultiLine(messages);\n}\nfunction debugVars(vars, options) {\n const strings = Object.entries(vars).map(\n ([key, value]) => `${key}: ${pretty(value, options)}`\n );\n const multiline = strings.find((s) => s.includes(\"\\n\"));\n if (multiline) {\n return strings.join(\"\\n\");\n } else {\n return strings.join(\" \");\n }\n}\nexport {\n callerName,\n dErr,\n dLog,\n dLogDefaultOptions,\n dWarn,\n derr,\n dlog,\n dlogMessagesTest,\n dlogOpt,\n dsert,\n dwarn,\n pretty,\n prettyFloat\n};\n//# sourceMappingURL=index.js.map\n","import { dlog } from \"berry-pretty\";\nimport { CollectContext, CollectPair, srcLog, tracing } from \"mini-parse\";\nimport {\n AbstractElem,\n AliasElem,\n Attribute,\n AttributeElem,\n ConstAssertElem,\n ConstElem,\n ContainerElem,\n DeclarationElem,\n DeclIdentElem,\n DirectiveElem,\n DirectiveVariant,\n FnElem,\n FnParamElem,\n GlobalVarElem,\n GrammarElem,\n HasAttributes,\n IfAttribute,\n ImportElem,\n LetElem,\n ModuleElem,\n NameElem,\n OverrideElem,\n RefIdentElem,\n SimpleMemberRef,\n StandardAttribute,\n StatementElem,\n StructElem,\n StructMemberElem,\n StuffElem,\n SwitchClauseElem,\n TextElem,\n TypedDeclElem,\n TypeRefElem,\n UnknownExpressionElem,\n VarElem,\n} from \"./AbstractElems.ts\";\nimport {\n StableState,\n WeslAST,\n WeslParseContext,\n WeslParseState,\n} from \"./ParseWESL.ts\";\nimport {\n DeclIdent,\n emptyScope,\n Ident,\n mergeScope,\n nextIdentId,\n PartialScope,\n RefIdent,\n Scope,\n} from \"./Scope.ts\";\nimport { filterMap } from \"./Util.ts\";\n\nexport function importElem(cc: CollectContext) {\n const importElems = cc.tags.owo?.[0] as ImportElem[]; // LATER ts typing\n for (const importElem of importElems) {\n (cc.app.stable as StableState).imports.push(importElem.imports);\n addToOpenElem(cc, importElem as AbstractElem);\n }\n}\n\n/** add an elem to the .contents array of the currently containing element */\nfunction addToOpenElem(cc: CollectContext, elem: AbstractElem): void {\n const weslContext: WeslParseContext = cc.app.context;\n const { openElems } = weslContext;\n if (openElems && openElems.length) {\n const open = openElems[openElems.length - 1];\n open.contents.push(elem);\n }\n}\n\n/** create reference Ident and add to context */\nexport function refIdent(cc: CollectContext): RefIdentElem {\n const { src, start, end } = cc;\n const app = cc.app as WeslParseState;\n const { srcModule } = app.stable;\n const originalName = src.slice(start, end);\n\n const kind = \"ref\";\n const ident: RefIdent = {\n kind,\n originalName,\n ast: cc.app.stable,\n id: nextIdentId(),\n refIdentElem: null as any, // set below\n };\n const identElem: RefIdentElem = { kind, start, end, srcModule, ident };\n ident.refIdentElem = identElem;\n\n saveIdent(cc, identElem);\n addToOpenElem(cc, identElem);\n return identElem;\n}\n\n/** create declaration Ident and add to context */\nexport function declCollect(cc: CollectContext): DeclIdentElem {\n return declCollectInternal(cc, false);\n}\n\n/** create global declaration Ident and add to context */\nexport function globalDeclCollect(cc: CollectContext): DeclIdentElem {\n return declCollectInternal(cc, true);\n}\n\nfunction declCollectInternal(\n cc: CollectContext,\n isGlobal: boolean,\n): DeclIdentElem {\n const { src, start, end } = cc;\n const app = cc.app as WeslParseState;\n const { scope } = app.context;\n const { srcModule } = app.stable;\n const originalName = src.slice(start, end);\n\n const kind = \"decl\";\n const declElem = null as any; // we'll set declElem later\n const ident: DeclIdent = {\n declElem,\n kind,\n originalName,\n scope,\n isGlobal,\n id: nextIdentId(),\n srcModule,\n };\n const identElem: DeclIdentElem = { kind, start, end, srcModule, ident };\n\n saveIdent(cc, identElem);\n addToOpenElem(cc, identElem);\n return identElem;\n}\n\nexport const typedDecl = collectElem(\n \"typeDecl\",\n (cc: CollectContext, openElem: PartElem<TypedDeclElem>) => {\n const decl = cc.tags.decl_elem?.[0] as DeclIdentElem;\n const typeRef = cc.tags.typeRefElem?.[0] as TypeRefElem | undefined;\n const partial: TypedDeclElem = { ...openElem, decl, typeRef };\n const elem = withTextCover(partial, cc);\n\n return elem;\n },\n);\n\n/** add Ident to current open scope, add IdentElem to current open element */\nfunction saveIdent(\n cc: CollectContext,\n identElem: RefIdentElem | DeclIdentElem,\n) {\n const { ident } = identElem;\n ident.id = nextIdentId();\n const weslContext: WeslParseContext = cc.app.context;\n weslContext.scope.contents.push(ident);\n}\n\n/** start a new child lexical Scope */\nfunction startScope(cc: CollectContext) {\n startSomeScope(\"scope\", cc);\n}\n\n/** start a new child partial Scope */\nfunction startPartialScope(cc: CollectContext) {\n startSomeScope(\"partial\", cc);\n}\n\n/** start a new lexical or partial scope */\nfunction startSomeScope(kind: Scope[\"kind\"], cc: CollectContext): void {\n const { scope } = cc.app.context as WeslParseContext;\n const newScope = emptyScope(scope, kind);\n\n scope.contents.push(newScope);\n cc.app.context.scope = newScope;\n}\n\n/* close current Scope and set current scope to parent */\nfunction completeScope(cc: CollectContext): Scope {\n const weslContext = cc.app.context as WeslParseContext;\n const completedScope = weslContext.scope;\n const ifAttributes = collectIfAttributes(cc);\n\n const { parent } = completedScope;\n if (parent) {\n weslContext.scope = parent;\n } else if (tracing) {\n console.log(\"ERR: completeScope, no parent scope\", completedScope.contents);\n }\n completedScope.ifAttribute = ifAttributes?.[0];\n return completedScope;\n}\n\n/** return @if attributes from the 'attribute' tag */\nfunction collectIfAttributes(cc: CollectContext): IfAttribute[] | undefined {\n const attributes = cc.tags.attribute as AttributeElem[] | undefined;\n return filterIfAttributes(attributes);\n}\n\nfunction filterIfAttributes(\n attributes?: AttributeElem[],\n): IfAttribute[] | undefined {\n if (!attributes) return;\n return filterMap(attributes, a =>\n a.attribute.kind === \"@if\" ? a.attribute : undefined,\n );\n}\n\n// prettier-ignore\nexport type OpenElem<T extends ContainerElem = ContainerElem> = \n Pick< T, \"kind\" | \"contents\">;\n\n// prettier-ignore\nexport type PartElem<T extends ContainerElem = ContainerElem > = \n Pick< T, \"kind\" | \"start\" | \"end\" | \"contents\"> ;\n\n// prettier-ignore\ntype VarLikeElem =\n | GlobalVarElem\n | VarElem\n | LetElem\n | ConstElem\n | OverrideElem;\n\nexport function collectVarLike<E extends VarLikeElem>(\n kind: E[\"kind\"],\n): CollectPair<E> {\n return collectElem(kind, (cc: CollectContext, openElem: PartElem<E>) => {\n const name = cc.tags.var_name?.[0] as TypedDeclElem;\n const decl_scope = cc.tags.decl_scope?.[0] as Scope;\n const attributes = cc.tags.attribute as AttributeElem[] | undefined;\n const partElem = { ...openElem, name, attributes } as E;\n const varElem = withTextCover(partElem, cc);\n (name.decl.ident as DeclIdent).declElem = varElem as DeclarationElem;\n name.decl.ident.scope = decl_scope;\n return varElem;\n });\n}\n\nexport const aliasCollect = collectElem(\n \"alias\",\n (cc: CollectContext, openElem: PartElem<AliasElem>) => {\n const name = cc.tags.alias_name?.[0] as DeclIdentElem;\n const alias_scope = cc.tags.alias_scope?.[0] as Scope;\n const typeRef = cc.tags.typeRefElem?.[0] as TypeRefElem;\n const attributes: AttributeElem[] = cc.tags.attributes?.flat() ?? [];\n const partElem: AliasElem = { ...openElem, name, attributes, typeRef };\n const aliasElem = withTextCover(partElem, cc);\n name.ident.scope = alias_scope;\n name.ident.declElem = aliasElem;\n return aliasElem;\n },\n);\n\n/**\n * Collect a FnElem and associated scopes.\n *\n * Scope definition is a bit complicated in wgsl and wesl for fns.\n * Here's what we collect for scopes for this example function:\n * @if(true) fn foo(a: u32) -> @location(x) R { let y = a; }\n *\n * -{ // partial scope in case the whole shebang is prefixed by an `@if`\n * %foo\n *\n * {<=%foo // foo decl references this header+returnType+body scope (for tracing dependencies from decls)\n * x // for @location(x) (contains no decls, so ok to merge for tracing)\n * %a u32 // merged from header scope\n * R // merged from return type (contains no decls, so ok to merge for tracing)\n * %y a // merged body scope\n * }\n * }\n */\nexport const fnCollect = collectElem(\n \"fn\",\n (cc: CollectContext, openElem: PartElem<FnElem>) => {\n // extract tags we care about\n const ourTags = fnTags(cc);\n const { name, headerScope, returnScope, bodyScope, body, params } = ourTags;\n const { attributes, returnAttributes, returnType, fnScope } = ourTags;\n\n // create the fn element\n const fnElem: FnElem = {\n ...openElem,\n ...{ name, attributes, params, returnAttributes, body, returnType },\n };\n\n // --- setup the various scopes --\n\n // attach ifAttributes to outermost partial scope\n fnScope.ifAttribute = filterIfAttributes(attributes)?.[0];\n\n // merge the header, return and body scopes into the one scope\n const mergedScope = headerScope;\n returnScope && mergeScope(mergedScope, returnScope);\n mergeScope(mergedScope, bodyScope);\n\n // rewrite scope contents to remove old scopes and add merged scope\n const filtered: (Ident | Scope)[] = [];\n for (const e of fnScope.contents) {\n if (e === headerScope || e == returnScope) {\n continue;\n } else if (e === bodyScope) {\n filtered.push(mergedScope);\n } else {\n filtered.push(e);\n }\n }\n fnScope.contents = filtered;\n\n name.ident.declElem = fnElem;\n name.ident.scope = mergedScope;\n\n return fnElem;\n },\n);\n\n/** Fetch and cast the collection tags for fnCollect\n * LATER typechecking for collect! */\nfunction fnTags(cc: CollectContext) {\n const { fn_attributes, fn_name, fn_param, return_attributes } = cc.tags;\n const { return_type } = cc.tags;\n const { header_scope, return_scope, body_scope, body_statement } = cc.tags;\n const { fn_partial_scope } = cc.tags;\n\n const name = fn_name?.[0] as DeclIdentElem;\n const headerScope = header_scope?.[0] as Scope;\n const returnScope = return_scope?.[0] as Scope | undefined;\n const bodyScope = body_scope?.[0] as Scope;\n const body = body_statement?.[0] as StatementElem;\n const params: FnParamElem[] = fn_param?.flat(3) ?? [];\n const attributes: AttributeElem[] | undefined = fn_attributes?.flat();\n const returnAttributes: AttributeElem[] | undefined =\n return_attributes?.flat();\n const returnType: TypeRefElem | undefined = return_type?.flat(3)[0];\n const fnScope = fn_partial_scope?.[0] as PartialScope;\n\n return {\n ...{ name, headerScope, returnScope, bodyScope, body, params },\n ...{ attributes, returnAttributes, returnType, fnScope },\n };\n}\n\nexport const collectFnParam = collectElem(\n \"param\",\n (cc: CollectContext, openElem: PartElem<FnParamElem>) => {\n const name = cc.tags.param_name?.[0]! as TypedDeclElem;\n const attributes: AttributeElem[] = cc.tags.attributes?.flat() ?? [];\n const elem: FnParamElem = { ...openElem, name, attributes };\n const paramElem = withTextCover(elem, cc);\n name.decl.ident.declElem = paramElem; // TODO is this right?\n\n return paramElem;\n },\n);\n\nexport const collectStruct = collectElem(\n \"struct\",\n (cc: CollectContext, openElem: PartElem<StructElem>) => {\n const name = cc.tags.type_name?.[0] as DeclIdentElem;\n const members = cc.tags.members as StructMemberElem[];\n const attributes: AttributeElem[] = cc.tags.attributes?.flat() ?? [];\n name.ident.scope = cc.tags.struct_scope?.[0] as Scope;\n const structElem = { ...openElem, name, attributes, members };\n const elem = withTextCover(structElem, cc);\n (name.ident as DeclIdent).declElem = elem as DeclarationElem;\n\n return elem;\n },\n);\n\nexport const collectStructMember = collectElem(\n \"member\",\n (cc: CollectContext, openElem: PartElem<StructMemberElem>) => {\n const name = cc.tags.nameElem?.[0]!;\n const typeRef = cc.tags.typeRefElem?.[0];\n const attributes = cc.tags.attribute?.flat(3) as AttributeElem[];\n const partElem = { ...openElem, name, attributes, typeRef };\n return withTextCover(partElem, cc);\n },\n);\n\nexport const specialAttribute = collectElem(\n \"attribute\",\n (cc: CollectContext, openElem: PartElem<AttributeElem>) => {\n const attribute = cc.tags.attr_variant?.[0] as Attribute;\n const attrElem: AttributeElem = { ...openElem, attribute };\n return attrElem;\n },\n);\n\n/** debug routine to log tags at collect() */\nexport function logCollect(msg?: string): (cc: CollectContext) => void {\n return function _log(cc: CollectContext) {\n dlog(msg ?? \"log\", { tags: [...Object.keys(cc.tags)] });\n };\n}\n\nexport const assertCollect = attrElemCollect<ConstAssertElem>(\"assert\");\nexport const statementCollect = attrElemCollect<StatementElem>(\"statement\");\nexport const switchClauseCollect =\n attrElemCollect<SwitchClauseElem>(\"switch-clause\");\n\n/** @return a collector for container elem types that have only an attributes field */\nfunction attrElemCollect<T extends ContainerElem & HasAttributes>(\n kind: T[\"kind\"],\n): CollectPair<T> {\n return collectElem(kind, (cc: CollectContext, openElem: PartElem<T>) => {\n const attributes = cc.tags.attribute?.flat(3) as AttributeElem[];\n const partElem = { ...openElem, attributes };\n return withTextCover(partElem as T, cc);\n });\n}\n\nexport const collectAttribute = collectElem(\n \"attribute\",\n (cc: CollectContext, openElem: PartElem<AttributeElem>) => {\n const params = cc.tags.attrParam as UnknownExpressionElem[] | undefined;\n const name = cc.tags.name?.[0]! as string;\n const kind = \"@attribute\";\n const stdAttribute: StandardAttribute = { kind, name, params };\n const attrElem: AttributeElem = { ...openElem, attribute: stdAttribute };\n return attrElem;\n },\n);\n\nexport const typeRefCollect = collectElem(\n \"type\",\n // @ts-ignore\n (cc: CollectContext, openElem: PartElem<TypeRefElem>) => {\n let templateParamsTemp: any[] | undefined = cc.tags.templateParam?.flat(3);\n\n const typeRef = cc.tags.typeRefName?.[0] as string | RefIdentElem;\n const name = typeof typeRef === \"string\" ? typeRef : typeRef.ident;\n const partElem = {\n ...openElem,\n name,\n templateParams: templateParamsTemp as any[],\n };\n // @ts-ignore\n return withTextCover(partElem, cc);\n },\n);\n\n// LATER This creates useless unknown-expression elements\nexport const expressionCollect = collectElem(\n \"expression\",\n (cc: CollectContext, openElem: PartElem<UnknownExpressionElem>) => {\n const partElem = { ...openElem };\n return withTextCover(partElem, cc);\n },\n);\n\nexport function globalAssertCollect(cc: CollectContext): void {\n const globalAssert = cc.tags.const_assert?.flat()[0];\n const ast = cc.app.stable as WeslAST;\n if (!ast.moduleAsserts) ast.moduleAsserts = [];\n ast.moduleAsserts.push(globalAssert);\n}\n\nexport const stuffCollect = collectElem(\n \"stuff\",\n (cc: CollectContext, openElem: PartElem<StuffElem>) => {\n const partElem = { ...openElem };\n return withTextCover(partElem, cc);\n },\n);\n\nexport const memberRefCollect = collectElem(\n \"memberRef\",\n (cc: CollectContext, openElem: PartElem<SimpleMemberRef>) => {\n const { component, structRef, extra_components } = cc.tags;\n const member = component![0] as NameElem;\n const name = structRef?.flat()[0] as RefIdentElem;\n const extraComponents = extra_components?.flat()[0] as StuffElem;\n\n const partElem: SimpleMemberRef = {\n ...openElem,\n name,\n member,\n extraComponents,\n };\n return withTextCover(partElem, cc) as any;\n },\n);\n\nexport function nameCollect(cc: CollectContext): NameElem {\n const { start, end, src, app } = cc;\n const name = src.slice(start, end);\n const elem: NameElem = { kind: \"name\", start, end, name };\n addToOpenElem(cc, elem);\n return elem;\n}\n\nexport const collectModule = collectElem(\n \"module\",\n (cc: CollectContext, openElem: PartElem<ModuleElem>) => {\n const ccComplete = { ...cc, start: 0, end: cc.src.length }; // force module to cover entire source despite ws skipping\n const moduleElem: ModuleElem = withTextCover(openElem, ccComplete);\n const weslState: StableState = cc.app.stable;\n weslState.moduleElem = moduleElem;\n return moduleElem;\n },\n);\n\nexport function directiveCollect(cc: CollectContext): DirectiveElem {\n const { start, end } = cc;\n const directive: DirectiveVariant = cc.tags.directive?.flat()[0];\n const attributes: AttributeElem[] | undefined = cc.tags.attribute?.flat();\n\n const kind = \"directive\";\n const elem: DirectiveElem = { kind, attributes, start, end, directive };\n addToOpenElem(cc, elem);\n return elem;\n}\n\n/**\n * Collect a LexicalScope.\n *\n * The scope starts encloses all idents and subscopes inside the parser to which\n * .collect is attached\n */\nexport const scopeCollect: CollectPair<Scope> = {\n before: startScope,\n after: completeScope,\n};\n\n/**\n * Collect a PartialScope.\n *\n * The scope starts encloses all idents and subscopes inside the parser to which\n * .collect is attached\n */\nexport const partialScopeCollect: CollectPair<Scope> = {\n before: startPartialScope,\n after: completeScope,\n};\n\n/** utility to collect an ElemWithContents\n * starts the new element as the collection point corresponding\n * to the start of the attached grammar and completes\n * the element in the at the end of the grammar.\n *\n * In between the start and the end, the new element is available\n * as an 'open' element in the collection context. While this element\n * is 'open', other collected are added to the 'contents' field of this\n * open element.\n */\nfunction collectElem<V extends ContainerElem>(\n kind: V[\"kind\"],\n fn: (cc: CollectContext, partialElem: PartElem<V>) => V,\n): CollectPair<V> {\n return {\n before: (cc: CollectContext) => {\n const partialElem = { kind, contents: [] };\n const weslContext: WeslParseContext = cc.app.context;\n weslContext.openElems.push(partialElem);\n },\n after: (cc: CollectContext) => {\n // TODO refine start?\n const weslContext: WeslParseContext = cc.app.context;\n const partialElem = weslContext.openElems.pop()!;\n console.assert(partialElem && partialElem.kind === kind);\n const elem = fn(cc, { ...partialElem, start: cc.start, end: cc.end });\n if (elem) addToOpenElem(cc, elem as AbstractElem);\n return elem;\n },\n };\n}\n\n/**\n * @return a copy of the element with contents extended\n * to include TextElems to cover the entire range.\n */\nfunction withTextCover<T extends ContainerElem>(\n elem: T,\n cc: CollectContext,\n): T {\n const contents = coverWithText(cc, elem);\n return { ...elem, contents };\n}\n\n/** cover the entire source range with Elems by creating TextElems to\n * cover any parts of the source that are not covered by other elems\n * @returns the existing elems combined with any new TextElems, in src order */\nfunction coverWithText(cc: CollectContext, elem: ContainerElem): GrammarElem[] {\n let { start: pos } = cc;\n const ast: WeslAST = cc.app.stable;\n const { contents, end } = elem;\n const sorted = (contents as GrammarElem[]).sort((a, b) => a.start - b.start);\n\n const elems: GrammarElem[] = [];\n for (const elem of sorted) {\n if (pos < elem.start) {\n elems.push(makeTextElem(elem.start));\n }\n elems.push(elem);\n pos = elem.end;\n }\n if (pos < end) {\n elems.push(makeTextElem(end));\n }\n\n return elems;\n\n function makeTextElem(end: number): TextElem {\n return { kind: \"text\", start: pos, end, srcModule: ast.srcModule };\n }\n}\n\nfunction collectLog(cc: CollectContext, ...messages: any[]): void {\n const { src, start, end } = cc;\n srcLog(src, [start, end], ...messages);\n}\n","import { kind, or, withSepPlus } from \"mini-parse\";\nimport { WeslTokenKind } from \"./WeslStream\";\n\nexport const word = kind<WeslTokenKind>(\"word\");\nexport const keyword = kind<WeslTokenKind>(\"keyword\");\n\nexport const qualified_ident = withSepPlus(\"::\", or(word, \"package\", \"super\")); // LATER consider efficiency (it's a pretty hot area of the grammar.)\nexport const number = kind<WeslTokenKind>(\"number\");\n","import {\n delimited,\n fn,\n opt,\n or,\n Parser,\n preceded,\n repeat,\n repeatPlus,\n req,\n seq,\n seqObj,\n span,\n Stream,\n tagScope,\n terminated,\n tracing,\n withSepPlus,\n yes,\n} from \"mini-parse\";\nimport type {\n ImportCollection,\n ImportElem,\n ImportItem,\n ImportSegment,\n ImportStatement,\n} from \"../AbstractElems.js\";\nimport { assertUnreachable } from \"../Assertions.js\";\nimport { importElem } from \"../WESLCollect.js\";\nimport { word } from \"./WeslBaseGrammar.js\";\nimport { WeslToken } from \"./WeslStream.js\";\n\nfunction makeStatement(\n segments: ImportSegment[],\n finalSegment: ImportCollection | ImportItem,\n): ImportStatement {\n return { kind: \"import-statement\", segments, finalSegment };\n}\nfunction makeSegment(name: string): ImportSegment {\n return { kind: \"import-segment\", name };\n}\nfunction makeCollection(subtrees: ImportStatement[]): ImportCollection {\n return {\n kind: \"import-collection\",\n subtrees,\n };\n}\nfunction makeItem(name: string, as?: string): ImportItem {\n return { kind: \"import-item\", name, as };\n}\nfunction prependSegments(\n segments: ImportSegment[],\n statement: ImportStatement,\n): ImportStatement {\n statement.segments = segments.concat(statement.segments);\n return statement;\n}\n\n// forward references for mutual recursion\nlet import_collection: Parser<\n Stream<WeslToken>,\n ImportCollection\n> = null as any;\n\nconst import_path_or_item: Parser<Stream<WeslToken>, ImportStatement> = seq(\n word,\n or(\n preceded(\n \"::\",\n req(\n or(\n fn(() => import_collection),\n fn(() => import_path_or_item),\n ),\n \"invalid import, expected '{' or name\",\n ),\n ),\n preceded(\"as\", req(word, \"invalid alias, expected name\")).map(v =>\n makeItem(\"\", v),\n ),\n yes().map(() => makeItem(\"\")), // Optional\n ),\n).map(([name, next]): ImportStatement => {\n if (next.kind === \"import-collection\") {\n return makeStatement([makeSegment(name)], next);\n } else if (next.kind === \"import-statement\") {\n return prependSegments([makeSegment(name)], next);\n } else if (next.kind === \"import-item\") {\n next.name = name;\n return makeStatement([], next);\n } else {\n assertUnreachable(next);\n }\n});\n\nimport_collection = delimited(\n \"{\",\n withSepPlus(\",\", () => import_path_or_item).map(makeCollection),\n req(\"}\", \"invalid import collection, expected }\"),\n);\n\nconst import_relative = or(\n terminated(\"package\", req(\"::\", \"invalid import, expected '::'\")).map(v => [\n makeSegment(v),\n ]),\n repeatPlus(\n terminated(\"super\", req(\"::\", \"invalid import, expected '::'\")).map(\n makeSegment,\n ),\n ),\n);\n\nconst import_statement = span(\n delimited(\n \"import\",\n seqObj({\n relative: opt(import_relative),\n collection_or_statement: req(\n or(import_collection, import_path_or_item),\n \"invalid import, expected { or name\",\n ),\n }).map(({ relative, collection_or_statement }): ImportStatement => {\n if (collection_or_statement.kind === \"import-statement\") {\n return prependSegments(relative ?? [], collection_or_statement);\n } else {\n return makeStatement(relative ?? [], collection_or_statement);\n }\n }),\n req(\";\", \"invalid import, expected ';'\"),\n ),\n).map(\n (v): ImportElem => ({\n kind: \"import\",\n imports: v.value,\n start: v.span[0],\n end: v.span[1],\n }),\n);\n\n/** parse a WESL style wgsl import statement. */\nexport const weslImports: Parser<Stream<WeslToken>, ImportElem[]> = tagScope(\n repeat(import_statement).ptag(\"owo\").collect(importElem),\n);\n\nif (tracing) {\n const names: Record<string, Parser<Stream<WeslToken>, unknown>> = {\n import_collection,\n import_path_or_item,\n import_relative,\n import_statement,\n weslImports,\n };\n\n Object.entries(names).forEach(([name, parser]) => {\n parser.setTraceName(name);\n });\n}\n","// Use https://github.com/wgsl-tooling-wg/wgsl-spec to check this list in the future\n// I recommend checking whether a new list and the current list are equal\n\n/** https://www.w3.org/TR/WGSL/#keyword-summary */\nexport const keywords =\n `alias break case const const_assert continue continuing \n default diagnostic discard else enable false fn for if \n let loop override requires return struct switch true var while`.split(/\\s+/);\n\n/** https://www.w3.org/TR/WGSL/#reserved-words */\nexport const reservedWords =\n `NULL Self abstract active alignas alignof as asm asm_fragment async attribute auto await \n become binding_array cast catch class co_await co_return co_yield coherent column_major \n common compile compile_fragment concept const_cast consteval constexpr constinit crate \n debugger decltype delete demote demote_to_helper do dynamic_cast \n enum explicit export extends extern external fallthrough filter final finally friend from fxgroup \n get goto groupshared highp impl implements import inline instanceof interface layout lowp \n macro macro_rules match mediump meta mod module move mut mutable \n namespace new nil noexcept noinline nointerpolation non_coherent noncoherent noperspective null nullptr \n of operator package packoffset partition pass patch pixelfragment precise precision premerge \n priv protected pub public readonly ref regardless register reinterpret_cast require resource restrict \n self set shared sizeof smooth snorm static static_assert static_cast std subroutine super \n target template this thread_local throw trait try type typedef typeid typename typeof \n union unless unorm unsafe unsized use using varying virtual volatile wgsl where with writeonly yield`.split(\n /\\s+/,\n );\n","import {\n CachingStream,\n MatchersStream,\n matchOneOf,\n ParseError,\n RegexMatchers,\n Stream,\n TypedToken,\n withStreamAction,\n} from \"mini-parse\";\nimport { keywords, reservedWords } from \"./Keywords\";\nexport type WeslTokenKind = \"word\" | \"keyword\" | \"number\" | \"symbol\";\n\nexport type WeslToken<Kind extends WeslTokenKind = WeslTokenKind> =\n TypedToken<Kind>;\n\n// https://www.w3.org/TR/WGSL/#blankspace-and-line-breaks\n/** Whitespaces including new lines */\nconst blankspaces = /[ \\t\\n\\v\\f\\r\\u{0085}\\u{200E}\\u{200F}\\u{2028}\\u{2029}]+/u;\nconst symbolSet =\n \"& && -> @ / ! [ ] { } :: : , == = != >>= >> >= > <<= << <= < % - --\" +\n \" . + ++ | || ( ) ; * ~ ^ // /* */ += -= *= /= %= &= |= ^=\" +\n // For the _ = expr; syntax\n \" _\";\n\nconst ident =\n /(?:(?:[_\\p{XID_Start}][\\p{XID_Continue}]+)|(?:[\\p{XID_Start}]))/u;\n\n/** Checks if a word is a valid WGSL ident, and not a keyword */\nexport function isIdent(text: string): boolean {\n if (text.match(ident)?.[0] !== text) {\n return false;\n }\n if (keywordOrReserved.has(text)) {\n return false;\n }\n return true;\n}\n\nconst keywordOrReserved = new Set(keywords.concat(reservedWords));\n\nconst digits = new RegExp(\n // decimal_float_literal\n /(?:0[fh])|(?:[1-9][0-9]*[fh])/.source +\n /|(?:[0-9]*\\.[0-9]+(?:[eE][+-]?[0-9]+)?[fh]?)/.source +\n /|(?:[0-9]+\\.[0-9]*(?:[eE][+-]?[0-9]+)?[fh]?)/.source +\n /|(?:[0-9]+[eE][+-]?[0-9]+[fh]?)/.source +\n // hex_float_literal\n /|(?:0[xX][0-9a-fA-F]*\\.[0-9a-fA-F]+(?:[pP][+-]?[0-9]+[fh]?)?)/.source +\n /|(?:0[xX][0-9a-fA-F]+\\.[0-9a-fA-F]*(?:[pP][+-]?[0-9]+[fh]?)?)/.source +\n /|(?:0[xX][0-9a-fA-F]+[pP][+-]?[0-9]+[fh]?)/.source +\n // hex_int_literal\n /|(?:0[xX][0-9a-fA-F]+[iu]?)/.source +\n // decimal_int_literal\n /|(?:0[iu]?)|(?:[1-9][0-9]*[iu]?)/.source,\n);\n\nconst commentStart = /\\/\\/|\\/\\*/;\n\ntype InternalTokenKind =\n | \"word\"\n | \"number\"\n | \"blankspaces\"\n | \"commentStart\"\n | \"symbol\"\n | \"invalid\";\nconst weslMatcher = new RegexMatchers<InternalTokenKind>({\n word: ident,\n number: digits,\n blankspaces,\n commentStart,\n symbol: matchOneOf(symbolSet),\n invalid: /[^]/,\n});\n\n/** To mark parts of the grammar implementation that are WESL specific extensions */\nexport function weslExtension<T>(combinator: T): T {\n return combinator;\n}\n\nexport class WeslStream implements Stream<WeslToken> {\n private stream: Stream<TypedToken<InternalTokenKind>>;\n /** New line */\n private eolPattern = /[\\n\\v\\f\\u{0085}\\u{2028}\\u{2029}]|\\r\\n?/gu;\n /** Block comments */\n private blockCommentPattern = /\\/\\*|\\*\\//g;\n constructor(public src: string) {\n this.stream = new CachingStream(new MatchersStream(src, weslMatcher));\n }\n checkpoint(): number {\n return this.stream.checkpoint();\n }\n reset(position: number): void {\n this.stream.reset(position);\n }\n nextToken(): WeslToken | null {\n while (true) {\n const token = this.stream.nextToken();\n if (token === null) return null;\n\n const kind = token.kind;\n if (kind === \"blankspaces\") {\n continue;\n } else if (kind === \"commentStart\") {\n // SAFETY: The underlying streams can be seeked to any position\n if (token.text === \"//\") {\n this.stream.reset(this.skipToEol(token.span[1]));\n } else {\n this.stream.reset(this.skipBlockComment(token.span[1]));\n }\n } else if (kind === \"word\") {\n let returnToken = token as TypedToken<typeof kind | \"keyword\">;\n if (keywordOrReserved.has(token.text)) {\n returnToken.kind = \"keyword\";\n }\n return returnToken;\n } else if (kind === \"invalid\") {\n throw new ParseError(\n \"Invalid token \" + token.text,\n this.stream.checkpoint(),\n );\n } else {\n return token as TypedToken<typeof kind>;\n }\n }\n }\n\n private skipToEol(position: number): number {\n this.eolPattern.lastIndex = position;\n const result = this.eolPattern.exec(this.src);\n if (result === null) {\n // We reached the end of the file\n return this.src.length;\n } else {\n // Move forward\n return this.eolPattern.lastIndex;\n }\n }\n\n private skipBlockComment(position: number): number {\n while (true) {\n this.blockCommentPattern.lastIndex = position;\n const result = this.blockCommentPattern.exec(this.src);\n if (result === null) {\n throw new ParseError(\"Unclosed block comment!\", position);\n } else if (result[0] === \"*/\") {\n // Close block\n return this.blockCommentPattern.lastIndex;\n } else if (result[0] === \"/*\") {\n // Open block\n position = this.skipBlockComment(this.blockCommentPattern.lastIndex);\n } else {\n throw new Error(\"Unreachable, invalid block comment pattern\");\n }\n }\n }\n\n /**\n * Only matches the `<` token if it is a template\n * Precondition: An ident was parsed right before this.\n * Runs the [template list discovery algorithm](https://www.w3.org/TR/WGSL/#template-list-discovery).\n */\n nextTemplateStartToken(): (WeslToken & { kind: \"symbol\" }) | null {\n const startPosition = this.stream.checkpoint();\n const token: WeslToken | null = this.nextToken();\n this.stream.reset(startPosition);\n if (token === null) return null;\n\n if (token.kind !== \"symbol\") {\n return null;\n }\n\n //<<= << <= cannot be templates, so we match the entire token text\n if (token.text === \"<\") {\n if (this.isTemplateStart(token.span[1])) {\n this.stream.reset(token.span[1]);\n return token as WeslToken & { kind: typeof token.kind };\n } else {\n this.stream.reset(startPosition);\n return null;\n }\n } else {\n return null;\n }\n }\n\n nextTemplateEndToken(): (WeslToken & { kind: \"symbol\" }) | null {\n const startPosition = this.stream.checkpoint();\n const token: WeslToken | null = this.nextToken();\n this.stream.reset(startPosition);\n if (token === null) return null;\n\n // template closing can also match a >= or >>, so we split the token\n if (token.kind === \"symbol\" && token.text[0] === \">\") {\n // SAFETY: The underlying streams implementations can be reset to any position.\n const tokenPosition = token.span[0];\n this.stream.reset(tokenPosition + 1);\n return {\n kind: \"symbol\",\n span: [tokenPosition, tokenPosition + 1],\n text: \">\",\n };\n } else {\n return null;\n }\n }\n\n isTemplateStart(afterToken: number): boolean {\n // Skip over <\n this.stream.reset(afterToken);\n // We start with a < token\n let pendingCounter = 1;\n while (true) {\n const nextToken = this.stream.nextToken();\n if (nextToken === null) return false;\n if (nextToken.kind !== \"symbol\") continue;\n if (nextToken.text === \"<\") {\n // Start a nested template\n pendingCounter += 1;\n } else if (nextToken.text[0] === \">\") {\n if (nextToken.text === \">\" || nextToken.text == \">=\") {\n pendingCounter -= 1;\n } else if (nextToken.text === \">>=\" || nextToken.text === \">>\") {\n pendingCounter -= 2;\n } else {\n throw new Error(\n \"This case should never be reached, looks like we forgot one of the tokens that start with >\",\n );\n }\n if (pendingCounter <= 0) {\n return true;\n }\n } else if (nextToken.text === \"(\") {\n this.skipBracketsTo(\")\");\n } else if (nextToken.text === \"[\") {\n this.skipBracketsTo(\"]\");\n } else if (\n nextToken.text === \"==\" ||\n nextToken.text === \"!=\" ||\n nextToken.text === \";\" ||\n nextToken.text === \"{\" ||\n nextToken.text === \":\" ||\n nextToken.text === \"&&\" ||\n nextToken.text === \"||\"\n ) {\n return false;\n }\n }\n }\n\n /**\n * Call this after consuming an opening bracket.\n * Skips until a closing bracket. This also consumes the closing bracket.\n */\n skipBracketsTo(closingBracket: string) {\n while (true) {\n const nextToken = this.stream.nextToken();\n if (nextToken === null)\n throw new ParseError(\"Unclosed bracket!\", this.stream.checkpoint());\n\n if (nextToken.kind !== \"symbol\") continue;\n if (nextToken.text === \"(\") {\n this.skipBracketsTo(\")\");\n } else if (nextToken.text === \"[\") {\n this.skipBracketsTo(\"]\");\n } else if (nextToken.text === closingBracket) {\n // We're done!\n return;\n }\n }\n }\n}\n\nexport const templateOpen = withStreamAction(stream => {\n return (stream as WeslStream).nextTemplateStartToken();\n});\nexport const templateClose = withStreamAction(stream => {\n return (stream as WeslStream).nextTemplateEndToken();\n});\n","import {\n collectArray,\n delimited,\n fn,\n opt,\n or,\n Parser,\n preceded,\n repeat,\n repeatPlus,\n req,\n seq,\n Stream,\n tagScope,\n tokenOf,\n tracing,\n withSep,\n withSepPlus,\n yes,\n} from \"mini-parse\";\nimport {\n expressionCollect,\n memberRefCollect,\n nameCollect,\n refIdent,\n stuffCollect,\n typeRefCollect,\n} from \"../WESLCollect\";\nimport { number, qualified_ident, word } from \"./WeslBaseGrammar\";\nimport { templateClose, templateOpen, WeslToken } from \"./WeslStream\";\n\nexport const opt_template_list = opt(\n seq(\n templateOpen,\n withSepPlus(\",\", () => template_parameter),\n req(templateClose, \"invalid template, expected '>'\"),\n ),\n);\n\n// prettier-ignore\nconst template_elaborated_ident = seq(\n qualified_ident.collect(refIdent),\n opt_template_list\n);\nconst literal = or(\"true\", \"false\", number);\nconst paren_expression = seq(\n \"(\",\n () => expression,\n req(\")\", \"invalid expression, expected ')'\"),\n);\n\nconst primary_expression = or(\n literal,\n paren_expression,\n seq(template_elaborated_ident, opt(fn(() => argument_expression_list))),\n);\nexport const component_or_swizzle = repeatPlus(\n or(\n preceded(\".\", word),\n collectArray(\n delimited(\n \"[\",\n () => expression,\n req(\"]\", \"invalid expression, expected ']'\"),\n ),\n ),\n ),\n);\n// LATER Remove\n// prettier-ignore\n/** parse simple struct.member style references specially, for binding struct lowering */\nexport const simple_component_reference = tagScope(\n seq(\n qualified_ident.collect(refIdent, \"structRef\"),\n seq(\".\", word.collect(nameCollect, \"component\")),\n opt(component_or_swizzle.collect(stuffCollect, \"extra_components\"))\n ).collect(memberRefCollect)\n);\nconst unary_expression: Parser<Stream<WeslToken>, any> = or(\n seq(tokenOf(\"symbol\", [\"!\", \"&\", \"*\", \"-\", \"~\"]), () => unary_expression),\n or(\n simple_component_reference,\n seq(primary_expression, opt(component_or_swizzle)),\n ),\n);\nconst bitwise_post_unary = or(\n // LATER I can skip template list discovery in these cases, because a&b<c cannot be a comparison. Must be a template\n repeatPlus(seq(\"&\", unary_expression)),\n repeatPlus(seq(\"^\", unary_expression)),\n repeatPlus(seq(\"|\", unary_expression)),\n);\nconst multiplicative_operator = or(\"%\", \"*\", \"/\");\nconst additive_operator = or(\"+\", \"-\");\nconst shift_post_unary = (inTemplate: boolean) => {\n const shift_left = seq(\"<<\", unary_expression);\n const shift_right = seq(\">>\", unary_expression);\n const mul_add = seq(\n repeat(seq(multiplicative_operator, unary_expression)),\n repeat(\n seq(\n additive_operator,\n unary_expression,\n repeat(seq(multiplicative_operator, unary_expression)),\n ),\n ),\n );\n return inTemplate ?\n or(shift_left, mul_add)\n : or(shift_left, shift_right, mul_add);\n};\nconst relational_post_unary = (inTemplate: boolean) => {\n return seq(\n shift_post_unary(inTemplate),\n opt(\n seq(\n // '<' is unambiguous, since templates were already caught by the primary expression inside of the previous unary_expression!\n inTemplate ?\n tokenOf(\"symbol\", [\"<\", \"<=\", \"!=\", \"==\"])\n : tokenOf(\"symbol\", [\">\", \">=\", \"<\", \"<=\", \"!=\", \"==\"]),\n // LATER I can skip template list discovery in this cases, because a>=b<c cannot be a comparison. Must be a template\n unary_expression,\n shift_post_unary(inTemplate),\n ),\n ),\n );\n};\n\n/** The expression parser exists in two variants\n * `true` is template-expression: Refuses to parse parse symbols like `&&` and `||`.\n * `false` is maybe-template-expression: Does the template disambiguation.\n */\nconst expressionParser = (\n inTemplate: boolean,\n): Parser<Stream<WeslToken>, any> => {\n return seq(\n unary_expression,\n or(\n bitwise_post_unary,\n seq(\n relational_post_unary(inTemplate),\n inTemplate ?\n // Don't accept || or && in template mode\n yes()\n : or(\n repeatPlus(\n seq(\"||\", seq(unary_expression, relational_post_unary(false))),\n ),\n repeatPlus(\n seq(\"&&\", seq(unary_expression, relational_post_unary(false))),\n ),\n yes().map(() => []),\n ),\n ),\n ),\n );\n};\n\nlet maybe_template = false;\nexport const expression = expressionParser(maybe_template);\nlet is_template = true;\nconst template_arg_expression = expressionParser(is_template);\n\n// prettier-ignore\nconst std_type_specifier = seq(\n qualified_ident .collect(refIdent, \"typeRefName\"),\n () => opt_template_list,\n) .collect(typeRefCollect);\n\n// prettier-ignore\nexport const type_specifier: Parser<Stream<WeslToken>,any> = tagScope(\n std_type_specifier,\n) .ctag(\"typeRefElem\");\n\n/** a template_arg_expression with additional collection for parameters\n * that are types like array<f32> vs. expressions like 1+2 */\n// prettier-ignore\nconst template_parameter = or(\n // LATER Remove this, it's wrong. This should instead be done by inspecting the syntax tree.\n type_specifier.ctag(\"templateParam\"),\n template_arg_expression.collect(expressionCollect, \"templateParam\")\n);\n\nexport const argument_expression_list = seq(\n \"(\",\n withSep(\",\", expression),\n req(\")\", \"invalid fn arguments, expected ')'\"),\n);\n\nif (tracing) {\n const names: Record<string, Parser<Stream<WeslToken>, unknown>> = {\n argument_expression_list,\n type_specifier,\n opt_template_list,\n template_elaborated_ident,\n literal,\n paren_expression,\n primary_expression,\n component_or_swizzle,\n unary_expression,\n expression,\n template_arg_expression,\n };\n\n Object.entries(names).forEach(([name, parser]) => {\n parser.setTraceName(name);\n });\n}\n","import {\n delimited,\n eof,\n fn,\n opt,\n or,\n Parser,\n preceded,\n repeat,\n repeatPlus,\n req,\n separated_pair,\n seq,\n Span,\n span,\n Stream,\n tagScope,\n terminated,\n text,\n token,\n tokenKind,\n tokenOf,\n tracing,\n withSep,\n withSepPlus,\n yes,\n} from \"mini-parse\";\nimport {\n BinaryExpression,\n BinaryOperator,\n BuiltinAttribute,\n DiagnosticAttribute,\n DiagnosticDirective,\n EnableDirective,\n ExpressionElem,\n IfAttribute,\n InterpolateAttribute,\n Literal,\n NameElem,\n ParenthesizedExpression,\n RequiresDirective,\n StandardAttribute,\n TranslateTimeExpressionElem,\n TranslateTimeFeature,\n UnaryExpression,\n UnaryOperator,\n UnknownExpressionElem,\n} from \"../AbstractElems.ts\";\nimport {\n aliasCollect,\n assertCollect,\n collectAttribute,\n collectFnParam,\n collectModule,\n collectStruct,\n collectStructMember,\n collectVarLike,\n declCollect,\n directiveCollect,\n expressionCollect,\n fnCollect,\n globalAssertCollect,\n globalDeclCollect,\n nameCollect,\n partialScopeCollect,\n refIdent,\n scopeCollect,\n specialAttribute,\n statementCollect,\n switchClauseCollect,\n typedDecl,\n} from \"../WESLCollect.ts\";\nimport { weslImports } from \"./ImportGrammar.ts\";\nimport { qualified_ident, word } from \"./WeslBaseGrammar.ts\";\nimport {\n argument_expression_list,\n component_or_swizzle,\n expression,\n opt_template_list,\n simple_component_reference,\n type_specifier,\n} from \"./WeslExpression.ts\";\nimport { weslExtension, WeslToken } from \"./WeslStream.ts\";\n\nconst name = tokenKind(\"word\").map(makeName);\n\nconst diagnostic_rule_name = seq(\n name,\n opt(preceded(\".\", req(name, \"invalid diagnostic rule name, expected name\"))),\n);\nconst diagnostic_control = delimited(\n \"(\",\n req(\n separated_pair(name, \",\", diagnostic_rule_name),\n \"invalid diagnostic control, expected rule name\",\n ),\n seq(opt(\",\"), req(\")\", \"invalid diagnostic control, expected ')'\")),\n);\n\n/** list of words that aren't identifiers (e.g. for @interpolate) */\nconst name_list = withSep(\",\", name, { requireOne: true });\n\n// LATER Add proper error reporting here. e.g. @3 should throw an error pointing at the 3\n// Currently it's not possible, since we neither accumulate the necessary context,\n// nor can we add a `req` parser, since this here relies on backtracking\n// prettier-ignore\nconst special_attribute = tagScope(\n preceded(\"@\", \n or(\n // These attributes have no arguments\n or(\"compute\", \"const\", \"fragment\", \"invariant\", \"must_use\", \"vertex\")\n .map(name => makeStandardAttribute([name, []])),\n\n // These attributes have arguments, but the argument doesn't have any identifiers\n preceded(\"interpolate\", req(delimited(\"(\", name_list, \")\"), \"invalid @interpolate, expected '('\"))\n .map(makeInterpolateAttribute),\n preceded(\"builtin\", req(delimited(\"(\", name, \")\"), \"invalid @builtin, expected '('\"))\n .map(makeBuiltinAttribute),\n preceded(\"diagnostic\", req(diagnostic_control, \"invalid @diagnostic, expected '('\"))\n .map(makeDiagnosticAttribute),\n ) .ptag(\"attr_variant\") \n ) .collect(specialAttribute)\n);\n\n// prettier-ignore\nconst if_attribute = tagScope(\n preceded(seq(\"@\", weslExtension(\"if\")),\n span(\n delimited(\n \"(\",\n fn(() => attribute_if_expression),\n seq(opt(\",\"), \")\"),\n ),\n ) .map(makeTranslateTimeExpressionElem),\n ) .map(makeIfAttribute)\n .ptag(\"attr_variant\")\n .collect(specialAttribute)\n);\n\n// prettier-ignore\nconst normal_attribute = tagScope(\n preceded(\"@\",\n or(\n // These are normal attributes, with required arguments\n seq(\n or(\n \"workgroup_size\",\n \"align\",\n \"binding\",\n \"blend_src\",\n \"group\",\n \"id\",\n \"location\",\n \"size\",\n ) .ptag(\"name\"),\n req(() => attribute_argument_list, \"invalid attribute, expected '('\"),\n ),\n\n // Everything else is also a normal attribute, optional expression list\n seq(\n // we don't want this to interfere with if_attribute, \n // but not(\"if\") isn't necessary for now, since 'if' is a keyword, not a word\n word .ptag(\"name\"),\n opt(() => attribute_argument_list),\n ),\n ),\n ) .collect(collectAttribute),\n);\n\n// prettier-ignore\nconst attribute_argument_list = delimited(\n \"(\",\n withSep(\n \",\",\n span(fn(() => expression)) .collect(expressionCollect, \"attrParam\"), // LATER These unknown expressions have decls inside of them, that's why they're tough to replace!\n ),\n req(\")\", \"invalid attribute arguments, expected ')'\"),\n);\n\n// separate statements with if from statements\n\n// prettier-ignore\nconst attribute_no_if = or(\n special_attribute, \n normal_attribute\n) .ctag(\"attribute\");\n\n// prettier-ignore\nconst attribute_incl_if = or(\n if_attribute,\n special_attribute,\n normal_attribute,\n) .ctag(\"attribute\");\n\nconst opt_attributes = repeat(attribute_incl_if);\n\nconst opt_attributes_no_if = repeat(attribute_no_if);\n\n// prettier-ignore\nconst globalTypeNameDecl = \n req(\n word .collect(globalDeclCollect, \"type_name\"),\n \"invalid type name, expected a name\"\n );\n\n// prettier-ignore\nconst fnNameDecl = \n req(\n word .collect(globalDeclCollect, \"fn_name\"),\n \"missing fn name\",\n );\n\n// prettier-ignore\nconst optionally_typed_ident = tagScope(\n seq(\n word .collect(declCollect, \"decl_elem\"),\n opt(seq(\":\", type_specifier)),\n ) .collect(typedDecl)\n) .ctag(\"var_name\");\n\nconst req_optionally_typed_ident = req(optionally_typed_ident, \"invalid ident\");\n\n// prettier-ignore\nconst global_ident = tagScope(\n req(\n seq(\n word .collect(globalDeclCollect, \"decl_elem\"),\n opt(seq(\":\", type_specifier)),\n ) .collect(typedDecl),\n \"expected identifier\"\n )\n) .ctag(\"var_name\");\n\n// prettier-ignore\nconst struct_member = tagScope(\n seq(\n opt_attributes,\n word .collect(nameCollect, \"nameElem\"),\n req(\":\", \"invalid struct member, expected ':'\"),\n req(type_specifier, \"invalid struct member, expected type specifier\"),\n ) .collect(collectStructMember)\n) .ctag(\"members\");\n\n// prettier-ignore\nconst struct_decl = seq(\n weslExtension(opt_attributes) .collect((cc) => cc.tags.attribute, \"attributes\"),\n \"struct\",\n req(globalTypeNameDecl, \"invalid struct, expected name\"),\n seq(\n req(\"{\", \"invalid struct, expected '{'\"),\n withSepPlus(\",\", struct_member),\n req(\"}\", \"invalid struct, expected '}'\"),\n ) .collect(scopeCollect, \"struct_scope\"),\n) .collect(collectStruct);\n\n/** Also covers func_call_statement.post.ident */\n// prettier-ignore\nconst fn_call = seq(\n qualified_ident .collect(refIdent),\n () => opt_template_list,\n argument_expression_list,\n);\n\n// prettier-ignore\nconst fnParam = tagScope(\n seq(\n opt_attributes .collect((cc) => cc.tags.attribute, \"attributes\"),\n word .collect(declCollect, \"decl_elem\"),\n opt(seq(\":\", req(type_specifier, \"invalid fn parameter, expected type specifier\")))\n .collect(typedDecl, \"param_name\"),\n ) .collect(collectFnParam),\n) .ctag(\"fn_param\");\n\nconst fnParamList = seq(\"(\", withSep(\",\", fnParam), \")\");\n\n// prettier-ignore\nconst local_variable_decl = seq(\n \"var\",\n () => opt_template_list,\n req_optionally_typed_ident,\n opt(seq(\"=\", () => expression)), // no decl_scope, but I think that's ok\n) .collect(collectVarLike(\"var\"));\n\n// prettier-ignore\nconst global_variable_decl = seq(\n \"var\",\n () => opt_template_list,\n global_ident, \n // TODO shouldn't decl_scope include the ident type?\n opt(seq(\"=\", () => expression .collect(scopeCollect, \"decl_scope\"))),\n);\n\nconst attribute_if_primary_expression: Parser<\n Stream<WeslToken>,\n Literal | ParenthesizedExpression | TranslateTimeFeature\n> = or(\n tokenOf(\"keyword\", [\"true\", \"false\"]).map(makeLiteral),\n delimited(\n token(\"symbol\", \"(\"),\n fn(() => attribute_if_expression),\n token(\"symbol\", \")\"),\n ).map(makeParenthesizedExpression),\n tokenKind(\"word\").map(makeTranslateTimeFeature),\n);\n\nconst attribute_if_unary_expression: Parser<\n Stream<WeslToken>,\n ExpressionElem\n> = or(\n seq(\n token(\"symbol\", \"!\").map(makeUnaryOperator),\n fn(() => attribute_if_unary_expression),\n ).map(makeUnaryExpression),\n attribute_if_primary_expression,\n);\n\nconst attribute_if_expression: Parser<\n Stream<WeslToken>,\n ExpressionElem\n> = weslExtension(\n seq(\n attribute_if_unary_expression,\n or(\n repeatPlus(\n seq(\n token(\"symbol\", \"||\").map(makeBinaryOperator),\n req(\n attribute_if_unary_expression,\n \"invalid expression, expected expression\",\n ),\n ),\n ),\n repeatPlus(\n seq(\n token(\"symbol\", \"&&\").map(makeBinaryOperator),\n req(\n attribute_if_unary_expression,\n \"invalid expression, expected expression\",\n ),\n ),\n ),\n yes().map(() => []),\n ),\n ).map(makeRepeatingBinaryExpression),\n);\n\nconst unscoped_compound_statement = seq(\n opt_attributes,\n text(\"{\"),\n repeat(() => statement),\n req(\"}\", \"invalid block, expected }\"),\n).collect(statementCollect);\n\n// prettier-ignore\nconst compound_statement = tagScope(\n seq(\n opt_attributes,\n seq(\n text(\"{\"),\n repeat(() => statement),\n req(\"}\", \"invalid block, expected '}'\"),\n ) .collect(scopeCollect),\n ) .collect(statementCollect)\n);\n\nconst for_init = seq(\n opt_attributes,\n or(\n fn_call,\n () => variable_or_value_statement,\n () => variable_updating_statement,\n ),\n);\n\nconst for_update = seq(\n opt_attributes,\n or(fn_call, () => variable_updating_statement),\n);\n\n// prettier-ignore\nconst for_statement = seq( // LATER consider allowing @if on for_init, expression and for_update\n \"for\",\n seq(\n req(\"(\", \"invalid for loop, expected '('\"),\n opt(for_init),\n req(\";\", \"invalid for loop, expected ';'\"),\n opt(expression),\n req(\";\", \"invalid for loop, expected ';'\"),\n opt(for_update),\n req(\")\", \"invalid for loop, expected ')'\"),\n unscoped_compound_statement,\n ) .collect(scopeCollect),\n);\n\nconst if_statement = seq(\n \"if\",\n req(seq(expression, compound_statement), \"invalid if statement\"),\n repeat(\n seq(\n \"else\",\n \"if\",\n req(seq(expression, compound_statement), \"invalid else if branch\"),\n ),\n ),\n opt(\n seq(\"else\", req(compound_statement, \"invalid else branch, expected '{'\")),\n ),\n);\n\n// prettier-ignore\nconst loop_statement = seq(\n \"loop\",\n opt_attributes_no_if,\n req(\n seq(\n \"{\",\n repeat(() => statement),\n opt(\n tagScope(\n seq(\n opt_attributes,\n \"continuing\",\n opt_attributes_no_if,\n \"{\",\n repeat(() => statement),\n tagScope(\n opt(\n seq(\n opt_attributes, \n seq(\"break\", \"if\", expression, \";\")\n ) .collect(statementCollect) \n )\n ),\n \"}\",\n ) .collect(statementCollect)\n .collect(scopeCollect)\n ),\n ),\n \"}\",\n ),\n \"invalid loop statement\"\n ),\n) .collect(scopeCollect);\n\nconst case_selector = or(\"default\", expression);\n\n// prettier-ignore\nconst switch_clause = tagScope(\n seq(\n opt_attributes,\n or(\n seq(\n \"case\",\n withSep(\",\", case_selector, { requireOne: true }),\n opt(\":\"),\n compound_statement,\n ),\n seq(\"default\", opt(\":\"), compound_statement),\n ). collect(switchClauseCollect),\n )\n);\nconst switch_body = seq(opt_attributes, \"{\", repeatPlus(switch_clause), \"}\");\nconst switch_statement = seq(\"switch\", expression, switch_body);\n\nconst while_statement = seq(\"while\", expression, compound_statement);\n\nconst regular_statement = or(\n for_statement,\n if_statement,\n loop_statement,\n switch_statement,\n while_statement,\n seq(\"break\", \";\"), // ambiguous with break if\n seq(\"continue\", req(\";\", \"invalid statement, expected ';'\")),\n seq(\";\"), // LATER this one cannot have attributes in front of it\n () => const_assert,\n seq(\"discard\", req(\";\", \"invalid statement, expected ';'\")),\n seq(\"return\", opt(expression), req(\";\", \"invalid statement, expected ';'\")),\n seq(fn_call, req(\";\", \"invalid statement, expected ';'\")),\n seq(\n () => variable_or_value_statement,\n req(\";\", \"invalid statement, expected ';'\"),\n ),\n seq(\n () => variable_updating_statement,\n req(\";\", \"invalid statement, expected ';'\"),\n ),\n);\n\n// prettier-ignore\nconst conditional_statement = tagScope(\n seq(\n opt_attributes, \n regular_statement\n ) .collect(statementCollect)\n .collect(partialScopeCollect));\n\n// prettier-ignore\nconst unconditional_statement = tagScope(\n seq(\n opt_attributes_no_if, \n regular_statement,\n )\n);\n\n// prettier-ignore\nconst statement: Parser<Stream<WeslToken>, any> = or(\n compound_statement,\n unconditional_statement,\n conditional_statement\n);\n\n// prettier-ignore\nconst lhs_expression: Parser<Stream<WeslToken>,any> = or(\n simple_component_reference,\n seq(\n qualified_ident .collect(refIdent), \n opt(component_or_swizzle)\n ),\n seq(\n \"(\", \n () => lhs_expression, \n \")\", \n opt(component_or_swizzle) // LATER this doesn't find member references.\n ),\n seq(\"&\", () => lhs_expression),\n seq(\"*\", () => lhs_expression),\n);\n\n// prettier-ignore\nconst variable_or_value_statement = tagScope( // LATER consider collecting these as var elems and scopes\n or(\n // Also covers the = expression case\n local_variable_decl,\n seq(\"const\", req_optionally_typed_ident, req(\"=\", \"invalid const declaration, expected '='\"), expression),\n seq(\n \"let\", \n req_optionally_typed_ident,\n req(\"=\", \"invalid let declaration, expected '='\"),\n expression\n )\n )\n);\n\nconst variable_updating_statement = or(\n seq(\n lhs_expression,\n or(\"=\", \"<<=\", \">>=\", \"%=\", \"&=\", \"*=\", \"+=\", \"-=\", \"/=\", \"^=\", \"|=\"),\n expression,\n ),\n seq(lhs_expression, or(\"++\", \"--\")),\n seq(\"_\", \"=\", expression),\n);\n\n// prettier-ignore\nconst fn_decl = seq(\n tagScope(\n opt_attributes .collect((cc) => cc.tags.attribute || []),\n ) .ctag(\"fn_attributes\"),\n text(\"fn\"),\n req(fnNameDecl, \"invalid fn, expected function name\"),\n seq(\n req(fnParamList, \"invalid fn, expected function parameters\")\n .collect(scopeCollect, \"header_scope\"),\n opt(seq(\n \"->\", \n opt_attributes .collect((cc) => cc.tags.attribute, \"return_attributes\"),\n type_specifier .ctag(\"return_type\")\n .collect(scopeCollect, \"return_scope\")\n )),\n req(\n unscoped_compound_statement, \n \"invalid fn, expected function body\"\n ) .ctag(\"body_statement\") \n .collect(scopeCollect, \"body_scope\"),\n ) \n) .collect(partialScopeCollect, \"fn_partial_scope\")\n .collect(fnCollect);\n\n// prettier-ignore\nconst global_value_decl = or(\n seq(\n opt_attributes,\n \"override\",\n global_ident,\n seq(opt(seq(\"=\", expression .collect(scopeCollect, \"decl_scope\")))), // TODO partial scopes for decl_scopes?\n \";\",\n ) .collect(collectVarLike(\"override\")),\n seq(\n opt_attributes,\n \"const\",\n global_ident,\n \"=\",\n seq(expression) .collect(scopeCollect, \"decl_scope\"),\n \";\",\n ) .collect(collectVarLike(\"const\")),\n);\n\n// prettier-ignore\nconst global_alias = seq(\n weslExtension(opt_attributes) .collect((cc) => cc.tags.attribute, \"attributes\"),\n \"alias\",\n req(word, \"invalid alias, expected name\") .collect(globalDeclCollect, \"alias_name\"),\n req(\"=\", \"invalid alias, expected '='\"),\n req(type_specifier, \"invalid alias, expected type\") .collect(scopeCollect, \"alias_scope\"),\n req(\";\", \"invalid alias, expected ';'\"),\n) .collect(aliasCollect);\n\n// prettier-ignore\nconst const_assert = tagScope(\n seq(\n opt_attributes,\n \"const_assert\", \n req(expression, \"invalid const_assert, expected expression\"), \n req(\";\", \"invalid statement, expected ';'\")\n ) .collect(assertCollect)\n) .ctag(\"const_assert\");\n\n// prettier-ignore\nconst global_directive = tagScope(\n seq(\n opt_attributes,\n terminated(\n or(\n preceded(\"diagnostic\", diagnostic_control) .map(makeDiagnosticDirective),\n preceded(\"enable\", name_list) .map(makeEnableDirective),\n preceded(\"requires\", name_list) .map(makeRequiresDirective),\n ) .ptag(\"directive\"),\n \";\",\n ),\n ) .collect(directiveCollect)\n);\n\n// prettier-ignore\nconst global_decl = tagScope(\n or(\n fn_decl,\n seq(\n opt_attributes,\n global_variable_decl, \n \";\") .collect(collectVarLike(\"gvar\")),\n global_value_decl,\n \";\",\n global_alias,\n const_assert .collect(globalAssertCollect),\n struct_decl,\n ),\n);\n\n// prettier-ignore\nexport const weslRoot = seq(\n weslExtension(weslImports),\n repeat(global_directive),\n repeat(global_decl),\n req(eof(), \"invalid WESL, expected EOF\"),\n ) .collect(collectModule, \"collectModule\");\n\nfunction makeDiagnosticDirective([severity, rule]: readonly [\n NameElem,\n [NameElem, NameElem | null],\n]): DiagnosticDirective {\n return { kind: \"diagnostic\", severity, rule };\n}\n\nfunction makeEnableDirective(extensions: NameElem[]): EnableDirective {\n return { kind: \"enable\", extensions };\n}\n\nfunction makeRequiresDirective(extensions: NameElem[]): RequiresDirective {\n return { kind: \"requires\", extensions };\n}\n\nfunction makeStandardAttribute([name, params]: [\n string,\n UnknownExpressionElem[],\n]): StandardAttribute {\n return {\n kind: \"@attribute\",\n name,\n params,\n };\n}\n\nfunction makeInterpolateAttribute(params: NameElem[]): InterpolateAttribute {\n return {\n kind: \"@interpolate\",\n params,\n };\n}\n\nfunction makeBuiltinAttribute(param: NameElem): BuiltinAttribute {\n return {\n kind: \"@builtin\",\n param,\n };\n}\n\nfunction makeDiagnosticAttribute([severity, rule]: readonly [\n NameElem,\n [NameElem, NameElem | null],\n]): DiagnosticAttribute {\n return {\n kind: \"@diagnostic\",\n severity,\n rule,\n };\n}\n\nfunction makeIfAttribute(param: TranslateTimeExpressionElem): IfAttribute {\n return {\n kind: \"@if\",\n param,\n };\n}\n\nfunction makeTranslateTimeExpressionElem(args: {\n value: ExpressionElem;\n span: Span;\n}): TranslateTimeExpressionElem {\n return {\n kind: \"translate-time-expression\",\n expression: args.value,\n span: args.span,\n };\n}\n\nfunction makeName(token: WeslToken<\"word\">): NameElem {\n return {\n kind: \"name\",\n name: token.text,\n start: token.span[0],\n end: token.span[1],\n };\n}\n\nfunction makeLiteral(token: WeslToken<\"keyword\" | \"number\">): Literal {\n return {\n kind: \"literal\",\n value: token.text,\n span: token.span,\n };\n}\n\nfunction makeTranslateTimeFeature(\n token: WeslToken<\"word\">,\n): TranslateTimeFeature {\n return {\n kind: \"translate-time-feature\",\n name: token.text,\n span: token.span,\n };\n}\n\nfunction makeParenthesizedExpression(\n expression: ExpressionElem,\n): ParenthesizedExpression {\n return {\n kind: \"parenthesized-expression\",\n expression,\n };\n}\n\nfunction makeUnaryOperator(token: WeslToken<\"symbol\">): UnaryOperator {\n return {\n value: token.text as any,\n span: token.span,\n };\n}\n\nfunction makeBinaryOperator(token: WeslToken<\"symbol\">): BinaryOperator {\n return {\n value: token.text as any,\n span: token.span,\n };\n}\n\nfunction makeUnaryExpression([operator, expression]: [\n UnaryOperator,\n ExpressionElem,\n]): UnaryExpression {\n return {\n kind: \"unary-expression\",\n operator,\n expression,\n };\n}\n\n/** A list of left-to-right associative binary expressions */\nfunction makeRepeatingBinaryExpression([start, repeating]: [\n ExpressionElem,\n [BinaryOperator, ExpressionElem][],\n]): ExpressionElem {\n let result: ExpressionElem = start;\n for (const [op, left] of repeating) {\n result = makeBinaryExpression([result, op, left]);\n }\n return result;\n}\n\nfunction makeBinaryExpression([left, operator, right]: [\n ExpressionElem,\n BinaryOperator,\n ExpressionElem,\n]): BinaryExpression {\n return {\n kind: \"binary-expression\",\n operator,\n left,\n right,\n };\n}\n\nif (tracing) {\n const names: Record<string, Parser<Stream<WeslToken>, unknown>> = {\n qualified_ident,\n diagnostic_rule_name,\n diagnostic_control,\n opt_attributes,\n globalTypeNameDecl,\n fnNameDecl,\n optionally_typed_ident,\n struct_member,\n struct_decl,\n fn_call,\n fnParam,\n fnParamList,\n local_variable_decl,\n global_variable_decl,\n compound_statement,\n for_init,\n for_update,\n for_statement,\n if_statement,\n loop_statement,\n case_selector,\n switch_clause,\n switch_body,\n switch_statement,\n while_statement,\n statement,\n lhs_expression,\n variable_or_value_statement,\n variable_updating_statement,\n fn_decl,\n global_value_decl,\n global_alias,\n const_assert,\n global_directive,\n global_decl,\n weslRoot,\n };\n\n Object.entries(names).forEach(([name, parser]) => {\n parser.setTraceName(name);\n });\n}\n","/*!\nCopyright (c) 2017-2021 [these people](https://github.com/Rich-Harris/vlq/graphs/contributors)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n// Copied from https://github.com/Rich-Harris/vlq and adjusted\n\nlet char_to_integer: Record<string, number> = {};\nlet integer_to_char: Record<number, string> = {};\n\n\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\"\n .split(\"\")\n .forEach(function (char, i) {\n char_to_integer[char] = i;\n integer_to_char[i] = char;\n });\n\nexport function decodeVlq(string: string) {\n let result: number[] = [];\n\n let shift = 0;\n let value = 0;\n\n for (let i = 0; i < string.length; i += 1) {\n let integer = char_to_integer[string[i]];\n\n if (integer === undefined) {\n throw new Error(\"Invalid character (\" + string[i] + \")\");\n }\n\n const has_continuation_bit = integer & 32;\n\n integer &= 31;\n value += integer << shift;\n\n if (has_continuation_bit) {\n shift += 5;\n } else {\n const should_negate = value & 1;\n value >>>= 1;\n\n if (should_negate) {\n result.push(value === 0 ? -0x80000000 : -value);\n } else {\n result.push(value);\n }\n\n // reset\n value = shift = 0;\n }\n }\n\n return result;\n}\n\nexport function encodeVlq(value: number | number[]) {\n if (typeof value === \"number\") {\n return encode_integer(value);\n }\n\n let result = \"\";\n for (let i = 0; i < value.length; i += 1) {\n result += encode_integer(value[i]);\n }\n\n return result;\n}\n\nfunction encode_integer(num: number) {\n let result = \"\";\n\n if (num < 0) {\n num = (-num << 1) | 1;\n } else {\n num <<= 1;\n }\n\n do {\n let clamped = num & 31;\n num >>>= 5;\n\n if (num > 0) {\n clamped |= 32;\n }\n\n result += integer_to_char[clamped];\n } while (num > 0);\n\n return result;\n}\n","import { ExtendedGPUValidationError } from \"./LinkedWesl\";\nimport { encodeVlq } from \"./vlq/vlq\";\n\n/**\n * We want the WebGPU compilation errors to point at WESL code.\n * The native facilities are `device.pushErrorScope`, `device.popErrorScope`\n * and `device.addEventListener(\"uncapturederror\", (ev) => {})`\n *\n * So we track the error scopes.\n * Then, when creating a shader module from WESL code, we forcibly capture the errors.\n * And then re-emit them to the nearest validation error scope.\n * If there isn't one, we throw it as an uncapturederror\n */\ntype ErrorScope = {\n filter: GPUErrorFilter;\n errors: Promise<GPUError | null>[];\n};\n\n/**\n * A {@link GPUDevice} with extensions for WESL. Created with {@link makeWeslDevice}.\n * Used to make error reporting point at the orignal WESL sources.\n */\nexport interface WeslDevice extends GPUDevice {\n /**\n * Attaches an error to the current error scope (created by {@link GPUDevice.pushErrorScope}).\n * If there is no error scope, it reports the error as a `'uncapturederror'`\n */\n injectError(type: GPUErrorFilter, error: Promise<GPUError | null>): void;\n}\n\n/**\n * Mutates a {@link GPUDevice} for usage with WESL. Does not impact your existing code, wherever a {@link GPUDevice} can be used, a {@link WeslDevice} is also valid.\n *\n * WESL uses this to display errors pointing at the WESL source instead of pointing at generated code.\n */\nexport function makeWeslDevice(device: GPUDevice): WeslDevice {\n const errorScopeStack: ErrorScope[] = [];\n\n (device as WeslDevice).injectError = (type, error) => {\n const errorScope = errorScopeStack.findLast(v => v.filter === type);\n if (errorScope !== undefined) {\n errorScope.errors.push(error);\n } else {\n error.then(e => {\n if (e !== null) {\n dispatchError(e);\n }\n });\n }\n };\n\n function dispatchError(e: GPUError) {\n // If there's no scope, we throw an error through the WebGPU facilities\n // Only dispatching an error doesn't result in a browser log message, so we implement that ourselves\n // We also make sure to first go through the normal \"uncapturederror\" process. Since this is the last `addEventListener`, it will get called at the very end.\n device.addEventListener(\n \"uncapturederror\",\n ev => {\n if (!ev.defaultPrevented) {\n if (\"compilationInfo\" in ev.error) {\n const error = ev.error as ExtendedGPUValidationError;\n // A custom mode with clickable sources. Uses https://stackoverflow.com/a/79467192/3492994\n if (error.compilationInfo) {\n for (const message of error.compilationInfo.messages) {\n throwClickableError({\n url: message.module.url,\n text: message.module.text ?? null,\n lineNumber: message.lineNum,\n lineColumn: message.linePos,\n length: message.length,\n error: new Error(message.type + \": \" + message.message),\n });\n }\n } else {\n console.error(ev.error.message);\n }\n } else {\n console.error(ev.error.message);\n }\n }\n },\n {\n // This event listener should only happen for this event!\n once: true,\n },\n );\n device.dispatchEvent(\n new GPUUncapturedErrorEvent(\"uncapturederror\", { error: e }),\n );\n }\n\n // Keep track of the error scopes so that we can inject our errors into them\n // Based on https://jsgist.org/?src=e3fb4659a668e00c69b03c82ec8f0ad1 from @greggman\n device.pushErrorScope = ((\n baseFn: GPUDevice[\"pushErrorScope\"],\n ): GPUDevice[\"pushErrorScope\"] => {\n return function (this: GPUDevice, filter: GPUErrorFilter) {\n errorScopeStack.push({\n filter,\n errors: [],\n });\n return baseFn.call(this, filter);\n };\n })(device.pushErrorScope);\n\n device.popErrorScope = ((\n baseFn: GPUDevice[\"popErrorScope\"],\n ): GPUDevice[\"popErrorScope\"] => {\n return function (this: GPUDevice) {\n // Get our custom error scope stack\n const errorScope = errorScopeStack.pop();\n if (errorScope === undefined) {\n // This can also happen when makeWeslDevice was called after a `pushErrorScope`\n throw new DOMException(\n \"popErrorScope called on empty error scope stack\",\n \"OperationError\",\n );\n }\n // Add the real error reporter\n errorScope.errors.push(baseFn.call(this));\n // And get the first error (not null)\n // LATER consider reporting *all* errors, and not just the first\n const errorPromise = Promise.all(errorScope.errors).then(\n values => values.find(v => v !== null) ?? null,\n );\n return errorPromise;\n };\n })(device.popErrorScope);\n\n return device as WeslDevice;\n}\n\n// Based on https://stackoverflow.com/questions/65274147/sourceurl-for-css\nexport function throwClickableError({\n url,\n text,\n lineNumber,\n lineColumn,\n length,\n error,\n}: {\n url: string;\n text: string | null;\n lineNumber: number;\n lineColumn: number;\n length: number;\n error: Error;\n}) {\n // We remap an error directly to where we need it to be\n // The fields are\n // 1. Generated column (aka 0)\n // 2. Index into sources list (aka 0)\n // 3. Original line number (zero based)\n // 4. Original column number (zero based)\n\n // So we need 2 mappings. One to map to the correct spot,\n // and another one to be the \"length\" (terminate the first mapping)\n let mappings =\n encodeVlq([\n 0,\n 0,\n Math.max(0, lineNumber - 1),\n Math.max(0, lineColumn - 1),\n ]) +\n \",\" +\n // Sadly no browser makes use of this info to map the error properly\n encodeVlq([\n 18, // Arbitrary number that is high enough\n 0,\n Math.max(0, lineNumber - 1),\n Math.max(0, lineColumn - 1) + length,\n ]);\n\n // And this is what our source map looks like\n const sourceMap = {\n version: 3,\n file: null,\n sources: [url],\n sourcesContent: [text ?? null],\n names: [],\n mappings,\n };\n\n let generatedCode = `throw new Error(${JSON.stringify(error.message + \"\")})`;\n // And redirect it to WESL\n generatedCode +=\n \"\\n//# sourceMappingURL=data:application/json;base64,\" +\n btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n generatedCode += \"\\n//# sourceURL=\" + sourceMap.sources[0];\n\n let oldLimit = 0;\n // Supported on Chrome https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/stackTraceLimit\n if (\"stackTraceLimit\" in Error) {\n oldLimit = Error.stackTraceLimit;\n Error.stackTraceLimit = 1;\n }\n\n // Run the error-throwing file\n try {\n (0, eval)(generatedCode);\n } catch (e: any) {\n if (\"stackTraceLimit\" in Error) {\n Error.stackTraceLimit = oldLimit;\n }\n error.message = \"\";\n e.cause = error;\n throw e;\n }\n}\n","import { AppState, ParseError, ParserInit, SrcMap } from \"mini-parse\";\nimport {\n ConstAssertElem,\n ImportStatement,\n ModuleElem,\n} from \"./AbstractElems.ts\";\nimport { FlatImport, flattenTreeImport } from \"./FlattenTreeImport.ts\";\nimport { weslRoot } from \"./parse/WeslGrammar.ts\";\nimport { WeslStream } from \"./parse/WeslStream.ts\";\nimport { emptyScope, Scope, SrcModule } from \"./Scope.ts\";\nimport { errorHighlight, offsetToLineNumber } from \"./Util.ts\";\nimport { OpenElem } from \"./WESLCollect.ts\";\nimport { throwClickableError } from \"./WeslDevice.ts\";\n\n/** result of a parse for one wesl module (e.g. one .wesl file)\n *\n * The parser constructs the AST constructed into three sections\n * for convenient access by the binding stage.\n * - import statements\n * - language elements (fn, struct, etc)\n * - scopes\n *\n */\nexport interface WeslAST {\n /** source text for this module */\n srcModule: SrcModule;\n\n /** root module element */\n moduleElem: ModuleElem;\n\n /** root scope for this module */\n rootScope: Scope;\n\n /** imports found in this module */\n imports: ImportStatement[];\n\n /** module level const_assert statements */\n moduleAsserts?: ConstAssertElem[];\n}\n\n/** an extended version of the AST */\nexport interface BindingAST extends WeslAST {\n /* a flattened version of the import statements constructed on demand from import trees, and cached here */\n _flatImports?: FlatImport[];\n}\n\n/** stable and unstable state used during parsing */\nexport interface WeslParseState\n extends AppState<WeslParseContext, StableState> {\n context: WeslParseContext;\n stable: StableState;\n}\n\n/** stable values used or accumulated during parsing */\nexport type StableState = WeslAST;\n\n/** unstable values used during parse collection */\nexport interface WeslParseContext {\n scope: Scope; // current scope (points somewhere in rootScope)\n openElems: OpenElem[]; // elems that are collecting their contents\n}\n\n/**\n * An error when parsing WESL fails. Designed to be human-readable.\n */\nexport class WeslParseError extends Error {\n position: number;\n src: SrcModule;\n constructor(opts: { cause: ParseError; src: SrcModule }) {\n const source = opts.src.src;\n const [lineNum, linePos] = offsetToLineNumber(opts.cause.position, source);\n let message = `${opts.src.debugFilePath}:${lineNum}:${linePos}`;\n message += ` error: ${opts.cause.message}\\n`;\n message += errorHighlight(source, [\n opts.cause.position,\n opts.cause.position + 1,\n ]).join(\"\\n\");\n super(message, {\n cause: opts.cause,\n });\n this.position = opts.cause.position;\n this.src = opts.src;\n }\n}\n\n/** Parse a WESL file. Throws on error. */\nexport function parseSrcModule(srcModule: SrcModule, srcMap?: SrcMap): WeslAST {\n const stream = new WeslStream(srcModule.src);\n\n const appState = blankWeslParseState(srcModule);\n\n const init: ParserInit = { stream, appState };\n try {\n const parseResult = weslRoot.parse(init);\n if (parseResult === null) {\n throw new Error(\"parseWESL failed\");\n }\n } catch (e) {\n if (e instanceof ParseError) {\n const [lineNumber, lineColumn] = offsetToLineNumber(\n e.position,\n srcModule.src,\n );\n const error = new WeslParseError({ cause: e, src: srcModule });\n throwClickableError({\n url: srcModule.debugFilePath,\n text: srcModule.src,\n error,\n lineNumber,\n lineColumn,\n length: 1,\n });\n } else {\n throw e;\n }\n }\n\n return appState.stable as WeslAST;\n}\n\nexport function parseWESL(src: string, srcMap?: SrcMap): WeslAST {\n const srcModule: SrcModule = {\n modulePath: \"package::test\", // TODO this ought not be used outside of tests\n debugFilePath: \"./test.wesl\",\n src,\n };\n\n return parseSrcModule(srcModule, srcMap);\n}\n\nexport function blankWeslParseState(srcModule: SrcModule): WeslParseState {\n const rootScope = emptyScope(null);\n const moduleElem = null as any; // we'll fill this in later\n return {\n context: { scope: rootScope, openElems: [] },\n stable: { srcModule, imports: [], rootScope, moduleElem },\n };\n}\n\nexport function syntheticWeslParseState(): WeslParseState {\n const srcModule: SrcModule = {\n modulePath: \"package::test\",\n debugFilePath: \"./test.wesl\",\n src: \"\",\n };\n\n return blankWeslParseState(srcModule);\n}\n\n/** @return a flattened form of the import tree for convenience in binding idents. */\nexport function flatImports(ast: BindingAST): FlatImport[] {\n if (ast._flatImports) return ast._flatImports;\n\n const flat = ast.imports.flatMap(flattenTreeImport);\n ast._flatImports = flat;\n return flat;\n}\n","// From https://www.w3.org/TR/WGSL/#predeclared\n// Use https://github.com/wgsl-tooling-wg/wgsl-spec to regenerate these list in the future\n\nexport const stdFns = `bitcast all any select arrayLength \n abs acos acosh asin asinh atan atanh atan2 ceil clamp cos cosh \n countLeadingZeros countOneBits countTrailingZeros cross \n degrees determinant distance dot dot4U8Packed dot4I8Packed \n exp exp2 extractBits faceForward firstLeadingBit firstTrailingBit \n floor fma fract frexp insertBits inverseSqrt ldexp length log log2\n max min mix modf normalize pow quantizeToF16 radians reflect refract\n reverseBits round saturate sign sin sinh smoothstep sqrt step tan tanh\n transpose trunc\n dpdx dpdxCoarse dpdxFine dpdy dpdyCoarse dpdyFine fwidth \n fwidthCoarse fwidthFine\n textureDimensions textureGather textureGatherCompare textureLoad\n textureNumLayers textureNumLevels textureNumSamples\n textureSample textureSampleBias textureSampleCompare textureSampleCompareLevel\n textureSampleGrad textureSampleLevel textureSampleBaseClampToEdge\n textureStore\n atomicLoad atomicStore atomicAdd atomicSub atomicMax atomicMin\n atomicAnd atomicOr atomicXor atomicExchange atomicCompareExchangeWeak\n pack4x8snorm pack4x8unorm pack4xI8 pack4xU8 pack4xI8Clamp pack4xU8Clamp\n pack2x16snorm pack2x16unorm pack2x16float\n unpack4x8snorm unpack4x8unorm unpack4xI8 unpack4xU8 \n unpack2x16snorm unpack2x16unorm unpack2x16float\n storageBarrier textureBarrier workgroupBarrier workgroupUniformLoad\n subgroupAdd subgroupAll subgroupAnd subgroupAny subgroupBallot \n subgroupBroadcast subgroupBroadcastFirst subgroupElect \n subgroupExclusiveAdd subgroupExclusiveMul subgroupInclusiveAdd \n subgroupInclusiveMul subgroupMax subgroupMin subgroupMul subgroupOr \n subgroupShuffle subgroupShuffleUp subgroupShuffleXor subgroupXor\n quadBroadcast quadSwapDiagonal quadSwapX quadSwapY`.split(/\\s+/);\n\nexport const sampledTextureTypes = `\n texture_1d texture_2d texture_2d_array texture_3d \n texture_cube texture_cube_array\n`;\n\nexport const multisampledTextureTypes = `\n texture_multisampled_2d texture_depth_multisampled_2d\n`;\n\nexport const textureStorageTypes = `\n texture_storage_1d texture_storage_2d texture_storage_2d_array \n texture_storage_3d\n`;\n\nexport const stdTypes = `array atomic bool f16 f32 i32 \n mat2x2 mat2x3 mat2x4 mat3x2 mat3x3 mat3x4 mat4x2 mat4x3 mat4x4\n mat2x2f mat2x3f mat2x4f mat3x2f mat3x3f mat3x4f\n mat4x2f mat4x3f mat4x4f\n mat2x2h mat2x3h mat2x4h mat3x2h mat3x3h mat3x4h\n mat4x2h mat4x3h mat4x4h\n u32 vec2 vec3 vec4 ptr\n vec2i vec3i vec4i vec2u vec3u vec4u\n vec2f vec3f vec4f vec2h vec3h vec4h\n ${sampledTextureTypes}\n ${multisampledTextureTypes}\n texture_external\n ${textureStorageTypes}\n texture_depth_2d texture_depth_2d_array texture_depth_cube\n texture_depth_cube_array\n sampler sampler_comparison\n rgba8unorm rgba8snorm rgba8uint rgba8sint\n rgba16uint rgba16sint rgba16float \n r32uint r32sint r32float rg32uint rg32sint rg32float\n rgba32uint rgba32sint rgba32float\n bgra8unorm`.split(/\\s+/);\n\n/** https://www.w3.org/TR/WGSL/#predeclared-enumerants */\nexport const stdEnumerants = `read write read_write \n function private workgroup uniform storage\n rgba8unorm rgba8snorm rgba8uint rgba8sint \n rgba16uint rgba16sint rgba16float \n r32uint r32sint r32float rg32uint rg32sint rg32float\n rgba32uint rgba32sint rgba32float bgra8unorm`.split(/\\s+/);\n\n/* Note the texel formats like rgba8unorm are here because they appear in type position\n in <templates> for texture_storage_* types. \n (We could parse texture_storage types specially, but user code is unlikely to alias \n the texture format names with e.g. a 'struct rbga8unorm .)\n*/\n\n/** return true if the name is for a built in type (not a user struct) */\nexport function stdType(name: string): boolean {\n return stdTypes.includes(name);\n}\n\n/** return true if the name is for a built in fn (not a user function) */\nexport function stdFn(name: string): boolean {\n return stdFns.includes(name) || stdType(name);\n}\n\n/** return true if the name is for a built in enumerant */\nexport function stdEnumerant(name: string): boolean {\n return stdEnumerants.includes(name);\n}\n","import { srcLog } from \"mini-parse\";\nimport { AbstractElem } from \"./AbstractElems.ts\";\nimport {\n assertThatDebug,\n assertUnreachableSilent,\n failDebug,\n} from \"./Assertions.ts\";\nimport { elementValid, scopeValid } from \"./Conditions.ts\";\nimport { identToString } from \"./debug/ScopeToString.ts\";\nimport { FlatImport } from \"./FlattenTreeImport.ts\";\nimport { LinkRegistryParams, VirtualLibraryFn } from \"./Linker.ts\";\nimport { LiveDecls, makeLiveDecls } from \"./LiveDeclarations.ts\";\nimport { ManglerFn, minimalMangle } from \"./Mangler.ts\";\nimport { ParsedRegistry } from \"./ParsedRegistry.ts\";\nimport { flatImports, parseSrcModule, WeslAST } from \"./ParseWESL.ts\";\nimport {\n Conditions,\n DeclIdent,\n publicDecl,\n RefIdent,\n Scope,\n SrcModule,\n} from \"./Scope.ts\";\nimport { stdEnumerant, stdFn, stdType } from \"./StandardTypes.ts\";\nimport { last } from \"./Util.ts\";\n\n/**\n BindIdents pass\n\n Goals:\n - link references identifiers to their declaration identifiers. \n - produce a list of declarations that are used (and need to be emitted in the link)\n - create mangled names for global declarations (to avoid name conflicts)\n\n BindIdents proceeds as a recursive tree walk of the scope tree, starting from the root module (e.g. main.wesl).\n It traverses the scope tree depth first (and not the syntax tree). \n - For each ref ident, search prior declarations in the current scope, then \n up the scope tree to find a matching declaration\n - If no local match is found, check for partial matches with import statements\n - combine the ident with import statement to match a decl in an exporting module\n - As global declaration identifies are found, also:\n - mutate their mangled name to be globally unique.\n - collect the declarations (they will be emitted) \n \n When iterating through the idents inside a scope, we maintain a parallel data structure of\n 'liveDecls', the declarations that are visible in the current scope at the currently\n processed ident, along with a link to parent liveDecls for their current decl visibility.\n*/\n\n/** results returned from binding pass */\nexport interface BindResults {\n /** root level names (including names mangled due to conflict with earlier names) */\n globalNames: Set<string>;\n\n /** global declarations that were referenced (these will need to be emitted in the link) */\n decls: DeclIdent[];\n\n /** additional global statements to include in linked results\n * (e.g. for adding module level const_assert statements) */\n newStatements: EmittableElem[];\n}\n\n/** an element that can be directly emitted into the linked result */\nexport interface EmittableElem {\n srcModule: SrcModule;\n elem: AbstractElem;\n}\n\n/** virtual package, generated by code generation function. */\nexport interface VirtualLibrary {\n // LATER rename to VirtualPackage?\n /** function to generate the module */\n fn: VirtualLibraryFn;\n\n /** parsed AST for the module (constructed lazily) */\n ast?: WeslAST;\n}\n\n/** key is virtual module name */\nexport type VirtualLibrarySet = Record<string, VirtualLibrary>;\n\nexport interface BindIdentsParams\n extends Pick<LinkRegistryParams, \"registry\" | \"conditions\" | \"mangler\"> {\n rootAst: WeslAST;\n virtuals?: VirtualLibrarySet;\n}\n\n/**\n * Bind active reference idents to declaration Idents by mutating the refersTo: field\n * Also in this pass, set the mangledName: field for all active global declaration idents.\n *\n * @param parsed\n * @param conditions only bind to/from idents that are valid with the current condition set\n * @return any new declaration elements found (they will need to be emitted)\n */\nexport function bindIdents(params: BindIdentsParams): BindResults {\n const { rootAst, registry, virtuals } = params;\n const { conditions = {}, mangler = minimalMangle } = params;\n const { rootScope } = rootAst;\n\n const globalNames = new Set<string>();\n const knownDecls = new Set<DeclIdent>();\n const validRootDecls = findValidRootDecls(rootScope, conditions);\n\n validRootDecls.forEach(decl => {\n decl.mangledName = decl.originalName;\n globalNames.add(decl.originalName);\n knownDecls.add(decl);\n });\n\n const globalStatements = new Map<AbstractElem, EmittableElem>();\n const bindContext = {\n registry,\n conditions,\n knownDecls,\n foundScopes: new Set<Scope>(),\n globalNames,\n globalStatements,\n virtuals,\n mangler,\n };\n\n // initialize liveDecls with all module level declarations\n // (note that in wgsl module level declarations may appear in any order, incl after their references.)\n const declEntries = validRootDecls.map(d => [d.originalName, d] as const);\n const liveDecls: LiveDecls = { decls: new Map(declEntries), parent: null };\n\n const decls = bindIdentsRecursive(rootScope, bindContext, liveDecls, true);\n const filteredDecls = decls.filter(isGlobal); // TODO is this needed?\n const newStatements = [...globalStatements.values()];\n return { decls: filteredDecls, globalNames, newStatements };\n}\n\n/**\n * @return the list of conditional valid declarations at the root level\n * decls are either in the root scope or in a conditionally valid partial scope\n */\nexport function findValidRootDecls(\n rootScope: Scope,\n conditions: Conditions,\n): DeclIdent[] {\n const found: DeclIdent[] = [];\n for (const e of rootScope.contents) {\n if (e.kind === \"decl\") {\n assertThatDebug(e.declElem);\n if (elementValid(e.declElem!, conditions)) {\n found.push(e);\n }\n } else if (e.kind === \"partial\") {\n found.push(...findValidRootDecls(e, conditions));\n }\n }\n return found;\n}\n\n/** state used during the recursive scope tree walk to bind references to declarations */\ninterface BindContext {\n registry: ParsedRegistry;\n\n /** live runtime conditions currently defined by the user */\n conditions: Record<string, any>;\n\n /** decl idents discovered so far (to avoid re-traversing) */\n knownDecls: Set<DeclIdent>;\n\n /** save work by not processing scopes multiple times */\n foundScopes: Set<Scope>;\n\n /** root level names used so far (so that manglers or ast rewriting plugins can pick unique names) */\n globalNames: Set<string>;\n\n /** additional global statements to include in linked results\n * (e.g. for adding module level const_assert statements)\n * (indexed by elem for uniqueness) */\n globalStatements: Map<AbstractElem, EmittableElem>;\n\n /** construct unique identifer names for global declarations */\n mangler: ManglerFn;\n\n /** virtual libraries provided by the user (e.g. for code generators or constants) */\n virtuals?: VirtualLibrarySet;\n}\n\n/**\n * Recursively bind references to declarations in this scope and\n * any child scopes referenced by these declarations.\n * Uses a hash set of found declarations to avoid duplication\n * @return any new declarations found\n * @param liveDecls current set of live declaration in this scope\n * (empty when traversing to a new scope, possibly non-empty for a partial scope)\n * @param isRoot liveDecls refers to a prepopulated root scope\n * (root scoope declarations may appear in any order)\n */\nfunction bindIdentsRecursive(\n scope: Scope,\n bindContext: BindContext,\n liveDecls: LiveDecls,\n isRoot = false,\n): DeclIdent[] {\n // early exit if we've processed this scope before\n const { conditions, foundScopes } = bindContext;\n if (foundScopes.has(scope)) return [];\n foundScopes.add(scope);\n\n const newGlobals: DeclIdent[] = []; // new decl idents to process for binding (and return for emitting)\n\n // active declarations in this scope\n const newFromChildren: DeclIdent[] = [];\n\n // process all identifiers and subscopes in this scope\n scope.contents.forEach(child => {\n const { kind } = child;\n if (kind === \"decl\") {\n const ident = child;\n if (!isRoot) liveDecls.decls.set(ident.originalName, ident);\n } else if (kind === \"ref\") {\n const newDecl = handleRef(child, liveDecls, bindContext);\n newDecl && newGlobals.push(newDecl);\n } else {\n const fromScope = handleScope(child, liveDecls, bindContext);\n if (fromScope) {\n newFromChildren.push(...fromScope);\n }\n }\n });\n\n // follow references from referenced declarations\n const newFromRefs = newGlobals.flatMap(decl => {\n const foundsScope = decl.scope;\n const rootDecls = globalDeclToRootLiveDecls(decl, conditions);\n if (rootDecls) {\n const rootLive = makeLiveDecls(rootDecls);\n return bindIdentsRecursive(foundsScope, bindContext, rootLive);\n }\n failDebug(`WARNING decl not from root ${identToString(decl)}`);\n return [];\n });\n\n return [newGlobals, newFromChildren, newFromRefs].flat();\n}\n\n/**\n * Trace references to their declarations\n * mutates to:\n * mangle declarations\n * mark references as 'std' if they match a wgsl std function or type\n *\n * @return the found declaration, or undefined if this ref has already been processed\n */\nfunction handleRef(\n ident: RefIdent,\n liveDecls: LiveDecls,\n bindContext: BindContext,\n): DeclIdent | undefined {\n const { registry, conditions } = bindContext;\n const { virtuals } = bindContext;\n if (!ident.refersTo && !ident.std) {\n const foundDecl =\n findDeclInModule(ident, liveDecls) ??\n findQualifiedImport(ident, registry, conditions, virtuals);\n\n if (foundDecl) {\n ident.refersTo = foundDecl.decl;\n return handleNewDecl(ident, foundDecl, bindContext);\n } else if (stdWgsl(ident.originalName)) {\n ident.std = true;\n } else {\n failMissingIdent(ident);\n }\n }\n}\n\n/**\n * If the child scope is conditionally valid,\n * update liveDecls tree and recurse to process the elements in it.\n *\n * @return any new global declarations found\n */\nfunction handleScope(\n childScope: Scope,\n liveDecls: LiveDecls,\n bindContext: BindContext,\n): DeclIdent[] | undefined {\n const { conditions } = bindContext;\n if (!scopeValid(childScope, conditions)) return;\n const { kind } = childScope;\n if (kind === \"scope\") {\n const newLive = makeLiveDecls(liveDecls);\n return bindIdentsRecursive(childScope, bindContext, newLive);\n } else if (kind === \"partial\") {\n return bindIdentsRecursive(childScope, bindContext, liveDecls);\n } else {\n assertUnreachableSilent(kind);\n }\n}\n\n/**\n * If the found declaration is new, mangle its name and update the\n * knownDecls and globalNames sets.\n * If the found declaration is new and also a global declaration, return it\n * for ruther processing (bindident traversing, and emitting to wgsl).\n */\nfunction handleNewDecl(\n refIdent: RefIdent,\n foundDecl: FoundDecl,\n bindContext: BindContext,\n): DeclIdent | undefined {\n const { decl, moduleAst } = foundDecl;\n const { knownDecls, globalNames, mangler, globalStatements } = bindContext;\n if (!knownDecls.has(decl)) {\n knownDecls.add(decl);\n\n const { srcModule } = decl;\n const proposed = refIdent.originalName;\n setMangledName(proposed, decl, globalNames, srcModule, mangler);\n\n if (isGlobal(decl)) {\n const { moduleAsserts } = moduleAst;\n const moduleEmit = moduleAsserts?.map(elem => ({ srcModule, elem }));\n moduleEmit?.forEach(e => globalStatements.set(e.elem, e));\n\n return decl;\n }\n }\n}\n\n/** given a global declIdent, return the liveDecls for its root scope */\nfunction globalDeclToRootLiveDecls(\n decl: DeclIdent,\n conditions: Conditions,\n): LiveDecls | undefined {\n assertThatDebug(decl.isGlobal, identToString(decl));\n let rootScope = decl.scope;\n while (rootScope.parent) {\n rootScope = rootScope.parent;\n }\n\n const rootDecls = findValidRootDecls(rootScope, conditions);\n const entires = rootDecls.map(d => [d.originalName, d] as const);\n const decls = new Map(entires);\n return { decls };\n}\n\n/** warn the user about a missing identifer */\nfunction failMissingIdent(ident: RefIdent): void {\n const { refIdentElem } = ident;\n if (refIdentElem) {\n const { srcModule, start, end } = refIdentElem;\n const { debugFilePath: filePath } = srcModule;\n const msg = `unresolved identifier '${ident.originalName}' in file: ${filePath}`; // TODO make error message clickable\n srcLog(srcModule.src, [start, end], msg);\n throw new Error(msg);\n }\n}\n\n/**\n * Mutate a DeclIdent to set a unique name for global linking\n * using a mangling function to choose a unique name.\n * Also update the set of globally unique names.\n */\nfunction setMangledName(\n proposedName: string,\n decl: DeclIdent,\n globalNames: Set<string>,\n srcModule: SrcModule,\n mangler: ManglerFn,\n): void {\n if (!decl.mangledName) {\n let mangledName: string;\n if (isGlobal(decl)) {\n const sep = proposedName.lastIndexOf(\"::\");\n const name = sep === -1 ? proposedName : proposedName.slice(sep + 2);\n mangledName = mangler(decl, srcModule, name, globalNames);\n } else {\n mangledName = decl.originalName;\n }\n decl.mangledName = mangledName;\n globalNames.add(mangledName);\n }\n}\n\n/** @return true if ident is a standard wgsl type, fn, or enumerant */\nfunction stdWgsl(name: string): boolean {\n return stdType(name) || stdFn(name) || stdEnumerant(name); // TODO add tests for enumerants case (e.g. var x = read;)\n}\n\n/** using the LiveDecls, search earlier in the scope and in parent scopes to find a matching decl ident */\nfunction findDeclInModule(\n ident: RefIdent,\n liveDecls: LiveDecls,\n): FoundDecl | undefined {\n const { originalName } = ident;\n const found = liveDecls.decls.get(originalName);\n if (found) {\n return { decl: found, moduleAst: ident.ast };\n }\n // recurse to check all idents in parent scope\n const { parent } = liveDecls;\n if (parent) {\n return findDeclInModule(ident, parent);\n }\n}\n\n/** Match a reference identifier to a declaration in\n * another module via an import statement\n * or via an inline qualified ident e.g. foo::bar() */\nfunction findQualifiedImport(\n refIdent: RefIdent,\n parsed: ParsedRegistry,\n conditions: Conditions,\n virtuals?: VirtualLibrarySet,\n): FoundDecl | undefined {\n const flatImps = flatImports(refIdent.ast);\n\n const identParts = refIdent.originalName.split(\"::\");\n\n // find module path by combining identifer reference with import statement\n const modulePathParts =\n matchingImport(identParts, flatImps) ?? qualifiedImport(identParts);\n\n if (modulePathParts) {\n const { srcModule } = refIdent.ast;\n return findExport(modulePathParts, srcModule, parsed, conditions, virtuals);\n }\n}\n\nfunction qualifiedImport(identParts: string[]): string[] | undefined {\n if (identParts.length > 1) return identParts;\n}\n\n/** combine and import using the flattened import array, find an import that matches a provided identi*/\nfunction matchingImport(\n identParts: string[],\n flatImports: FlatImport[],\n): string[] | undefined {\n for (const flat of flatImports) {\n if (flat.importPath.at(-1) === identParts.at(0)) {\n return [...flat.modulePath, ...identParts.slice(1)];\n }\n }\n}\n\n/** discovered declaration found during binding */\ninterface FoundDecl {\n decl: DeclIdent;\n /** module containing the decl */\n moduleAst: WeslAST;\n}\n\n/** @return an exported root declIdent for the provided path */\nfunction findExport(\n modulePathParts: string[],\n srcModule: SrcModule,\n parsed: ParsedRegistry,\n conditions: Conditions = {},\n virtuals?: VirtualLibrarySet,\n): FoundDecl | undefined {\n const fqPathParts = absoluteModulePath(modulePathParts, srcModule);\n const modulePath = fqPathParts.slice(0, -1).join(\"::\");\n const moduleAst =\n parsed.modules[modulePath] ??\n virtualModule(modulePathParts[0], conditions, virtuals); // LATER consider virtual modules with submodules\n\n if (!moduleAst) {\n // TODO show error with source location\n console.log(`ident ${modulePathParts.join(\"::\")}, but module not found`);\n return undefined;\n }\n\n const name = last(modulePathParts)!;\n const decl = publicDecl(moduleAst.rootScope, name, conditions);\n if (decl) {\n return { decl, moduleAst };\n }\n}\n\n/** convert a module path with super:: elements to one with no super:: elements */\nfunction absoluteModulePath(\n modulePathParts: string[],\n srcModule: SrcModule,\n): string[] {\n const lastSuper = modulePathParts.findLastIndex(p => p === \"super\");\n if (lastSuper > -1) {\n const srcModuleParts = srcModule.modulePath.split(\"::\");\n const base = srcModuleParts.slice(0, -(lastSuper + 1));\n const noSupers = modulePathParts.slice(lastSuper + 1);\n return [...base, ...noSupers];\n }\n return modulePathParts;\n}\n\n/** @return AST for a virtual module */\nfunction virtualModule(\n moduleName: string,\n conditions: Conditions = {},\n virtuals?: VirtualLibrarySet,\n): WeslAST | undefined {\n if (!virtuals) return undefined;\n const found = virtuals[moduleName];\n if (found) {\n const { ast, fn } = found;\n if (ast) return ast;\n const src = fn(conditions); // generate the virtual module\n const srcModule: SrcModule = {\n modulePath: moduleName,\n debugFilePath: moduleName,\n src,\n };\n found.ast = parseSrcModule(srcModule); // cache parsed virtual module\n return found.ast;\n }\n}\n\n// LATER capture isGlobal in the ident during parsing\n/** @return true if this decl is at the root scope level of a module */\nexport function isGlobal(declIdent: DeclIdent): boolean {\n const { declElem } = declIdent;\n if (!declElem) return false;\n\n return [\"alias\", \"const\", \"override\", \"fn\", \"struct\", \"gvar\"].includes(\n declElem.kind,\n );\n}\n","import { srcLog, SrcMapBuilder } from \"mini-parse\";\nimport {\n AbstractElem,\n AttributeElem,\n ContainerElem,\n DeclIdentElem,\n DirectiveElem,\n ElemWithAttributes,\n ExpressionElem,\n FnElem,\n NameElem,\n RefIdentElem,\n StructElem,\n SyntheticElem,\n TextElem,\n} from \"./AbstractElems.ts\";\nimport {\n assertThatDebug,\n assertUnreachable,\n assertUnreachableSilent,\n} from \"./Assertions.ts\";\nimport { isGlobal } from \"./BindIdents.ts\";\nimport { elementValid } from \"./Conditions.ts\";\nimport { identToString } from \"./debug/ScopeToString.ts\";\nimport { Conditions, DeclIdent, Ident } from \"./Scope.ts\";\n\n/** passed to the emitters */\ninterface EmitContext {\n srcBuilder: SrcMapBuilder; // constructing the linked output\n conditions: Conditions; // settings for conditional compilation\n extracting: boolean; // are we extracting or copying the root module\n}\n\n/** traverse the AST, starting from root elements, emitting wgsl for each */\nexport function lowerAndEmit(\n srcBuilder: SrcMapBuilder,\n rootElems: AbstractElem[],\n conditions: Conditions,\n extracting = true,\n): void {\n const emitContext: EmitContext = { conditions, srcBuilder, extracting };\n // rootElems.forEach(r => console.log(astToString(r) + \"\\n\"));\n rootElems.forEach(e => lowerAndEmitElem(e, emitContext));\n}\n\nexport function lowerAndEmitElem(e: AbstractElem, ctx: EmitContext): void {\n if (!conditionsValid(e, ctx.conditions)) return;\n\n switch (e.kind) {\n // import statements are dropped from from emitted text\n case \"import\":\n return;\n\n // terminal elements copy strings to the output\n case \"text\":\n return emitText(e, ctx);\n case \"name\":\n return emitName(e, ctx);\n case \"synthetic\":\n return emitSynthetic(e, ctx);\n\n // identifiers are copied to the output, but with potentially mangled names\n case \"ref\":\n return emitRefIdent(e, ctx);\n case \"decl\":\n return emitDeclIdent(e, ctx);\n\n // container elements just emit their child elements\n case \"param\":\n case \"var\":\n case \"typeDecl\":\n case \"let\":\n case \"module\":\n case \"member\":\n case \"memberRef\":\n case \"expression\":\n case \"type\":\n case \"statement\":\n case \"stuff\":\n case \"switch-clause\":\n return emitContents(e, ctx);\n\n // root level container elements get some extra newlines to make the output prettier\n case \"override\":\n case \"const\":\n case \"assert\":\n case \"alias\":\n case \"gvar\":\n emitRootElemNl(ctx);\n return emitContents(e, ctx);\n\n case \"fn\":\n emitRootElemNl(ctx);\n return emitFn(e, ctx);\n\n case \"struct\":\n emitRootElemNl(ctx);\n return emitStruct(e, ctx);\n\n case \"attribute\":\n return emitAttribute(e, ctx);\n case \"directive\":\n return emitDirective(e, ctx);\n\n default:\n assertUnreachable(e);\n }\n}\n\n/** emit root elems with a blank line inbetween */\nfunction emitRootElemNl(ctx: EmitContext): void {\n if (ctx.extracting) {\n ctx.srcBuilder.addNl();\n ctx.srcBuilder.addNl();\n }\n}\n\nexport function emitText(e: TextElem, ctx: EmitContext): void {\n ctx.srcBuilder.addCopy(e.start, e.end);\n}\n\nexport function emitName(e: NameElem, ctx: EmitContext): void {\n ctx.srcBuilder.add(e.name, e.start, e.end);\n}\n\n/** emit function explicitly so we can control commas between conditional parameters */\nexport function emitFn(e: FnElem, ctx: EmitContext): void {\n const { attributes, name, params, returnAttributes, returnType, body } = e;\n const { conditions, srcBuilder: builder } = ctx;\n\n emitAttributes(attributes, ctx);\n\n builder.add(\"fn \", name.start - 3, name.start);\n emitDeclIdent(name, ctx);\n\n builder.appendNext(\"(\");\n const validParams = params.filter(p => conditionsValid(p, conditions));\n validParams.forEach((p, i) => {\n emitContentsNoWs(p, ctx);\n if (i < validParams.length - 1) {\n builder.appendNext(\", \");\n }\n });\n builder.appendNext(\") \");\n\n if (returnType) {\n builder.appendNext(\"-> \");\n emitAttributes(returnAttributes, ctx);\n emitContents(returnType, ctx);\n builder.appendNext(\" \");\n }\n\n emitContents(body, ctx);\n}\n\nfunction emitAttributes(\n attributes: AttributeElem[] | undefined,\n ctx: EmitContext,\n): void {\n attributes?.forEach(a => {\n emitAttribute(a, ctx);\n ctx.srcBuilder.add(\" \", a.start, a.end);\n });\n}\n\n/** emit structs explicitly so we can control commas between conditional members */\nexport function emitStruct(e: StructElem, ctx: EmitContext): void {\n const { name, members, start, end } = e;\n const { srcBuilder } = ctx;\n\n const validMembers = members.filter(m => conditionsValid(m, ctx.conditions));\n const validLength = validMembers.length;\n\n if (validLength === 0) {\n warnEmptyStruct(e);\n return;\n }\n\n srcBuilder.add(\"struct \", start, name.start);\n emitDeclIdent(name, ctx);\n\n if (validLength === 1) {\n srcBuilder.add(\" { \", name.end, members[0].start);\n emitContentsNoWs(validMembers[0], ctx);\n srcBuilder.add(\" }\\n\", end - 1, end);\n } else {\n srcBuilder.add(\" {\\n\", name.end, members[0].start);\n\n validMembers.forEach(m => {\n srcBuilder.add(\" \", m.start - 1, m.start);\n emitContentsNoWs(m, ctx);\n srcBuilder.add(\",\", m.end, m.end + 1);\n srcBuilder.addNl();\n });\n\n srcBuilder.add(\"}\\n\", end - 1, end);\n }\n}\n\nfunction warnEmptyStruct(e: StructElem): void {\n const { name, members } = e;\n const condStr = members.length ? \"(with current conditions)\" : \"\";\n const { debugFilePath: filePath } = name.srcModule;\n srcLog(\n name.srcModule.src,\n e.start,\n `struct ${name.ident.originalName} in ${filePath} has no members ${condStr}`,\n );\n}\n\nexport function emitSynthetic(e: SyntheticElem, ctx: EmitContext): void {\n const { text } = e;\n ctx.srcBuilder.addSynthetic(text, text, 0, text.length);\n}\n\nexport function emitContents(elem: ContainerElem, ctx: EmitContext): void {\n elem.contents.forEach(e => lowerAndEmitElem(e, ctx));\n}\n\n/** emit contents w/o white space */\nfunction emitContentsNoWs(elem: ContainerElem, ctx: EmitContext): void {\n elem.contents.forEach(e => {\n if (e.kind === \"text\") {\n const { srcModule, start, end } = e;\n const text = srcModule.src.slice(start, end);\n if (text.trim() === \"\") {\n return;\n }\n }\n lowerAndEmitElem(e, ctx);\n });\n}\n\nexport function emitRefIdent(e: RefIdentElem, ctx: EmitContext): void {\n if (e.ident.std) {\n ctx.srcBuilder.add(e.ident.originalName, e.start, e.end);\n } else {\n const declIdent = findDecl(e.ident);\n const mangledName = displayName(declIdent);\n ctx.srcBuilder.add(mangledName!, e.start, e.end);\n }\n}\n\nexport function emitDeclIdent(e: DeclIdentElem, ctx: EmitContext): void {\n const mangledName = displayName(e.ident);\n ctx.srcBuilder.add(mangledName!, e.start, e.end);\n}\n\nfunction emitAttribute(e: AttributeElem, ctx: EmitContext): void {\n const { kind } = e.attribute;\n // LATER emit more precise source map info by making use of all the spans\n // Like the first case does\n if (kind === \"@attribute\") {\n const { params } = e.attribute;\n if (!params || params.length === 0) {\n ctx.srcBuilder.add(\"@\" + e.attribute.name, e.start, e.end);\n } else {\n ctx.srcBuilder.add(\n \"@\" + e.attribute.name + \"(\",\n e.start,\n params[0].start,\n );\n for (let i = 0; i < params.length; i++) {\n emitContents(params[i], ctx);\n if (i < params.length - 1) {\n ctx.srcBuilder.add(\",\", params[i].end, params[i + 1].start);\n }\n }\n ctx.srcBuilder.add(\")\", params[params.length - 1].end, e.end);\n }\n } else if (kind === \"@builtin\") {\n ctx.srcBuilder.add(\n \"@builtin(\" + e.attribute.param.name + \")\",\n e.start,\n e.end,\n );\n } else if (kind === \"@diagnostic\") {\n ctx.srcBuilder.add(\n \"@diagnostic\" +\n diagnosticControlToString(e.attribute.severity, e.attribute.rule),\n e.start,\n e.end,\n );\n } else if (kind === \"@if\") {\n // (@if is wesl only, dropped from wgsl)\n } else if (kind === \"@interpolate\") {\n ctx.srcBuilder.add(\n `@interpolate(${e.attribute.params.map(v => v.name).join(\", \")})`,\n e.start,\n e.end,\n );\n } else {\n assertUnreachable(kind);\n }\n}\n\nexport function diagnosticControlToString(\n severity: NameElem,\n rule: [NameElem, NameElem | null],\n): string {\n const ruleStr = rule[0].name + (rule[1] !== null ? \".\" + rule[1].name : \"\");\n return `(${severity.name}, ${ruleStr})`;\n}\n\nexport function expressionToString(elem: ExpressionElem): string {\n const { kind } = elem;\n if (kind === \"binary-expression\") {\n return `${expressionToString(elem.left)} ${elem.operator.value} ${expressionToString(elem.right)}`;\n } else if (kind === \"unary-expression\") {\n return `${elem.operator.value}${expressionToString(elem.expression)}`;\n } else if (kind === \"ref\") {\n return elem.ident.originalName;\n } else if (kind === \"literal\") {\n return elem.value;\n } else if (kind === \"translate-time-feature\") {\n return elem.name;\n } else if (kind === \"parenthesized-expression\") {\n return `(${expressionToString(elem.expression)})`;\n } else if (kind === \"component-expression\") {\n return `${expressionToString(elem.base)}[${elem.access}]`;\n } else if (kind === \"component-member-expression\") {\n return `${expressionToString(elem.base)}.${elem.access}`;\n } else if (kind === \"call-expression\") {\n return `${elem.function.ident.originalName}(${elem.arguments.map(expressionToString).join(\", \")})`;\n } else {\n assertUnreachable(kind);\n }\n}\n\nfunction emitDirective(e: DirectiveElem, ctx: EmitContext): void {\n const { directive } = e;\n const { kind } = directive;\n if (kind === \"diagnostic\") {\n ctx.srcBuilder.add(\n `diagnostic${diagnosticControlToString(directive.severity, directive.rule)};`,\n e.start,\n e.end,\n );\n } else if (kind === \"enable\") {\n ctx.srcBuilder.add(\n `enable ${directive.extensions.map(v => v.name).join(\", \")};`,\n e.start,\n e.end,\n );\n } else if (kind === \"requires\") {\n ctx.srcBuilder.add(\n `requires ${directive.extensions.map(v => v.name).join(\", \")};`,\n e.start,\n e.end,\n );\n } else {\n assertUnreachable(kind);\n }\n}\n\nfunction displayName(declIdent: DeclIdent): string {\n if (isGlobal(declIdent)) {\n assertThatDebug(\n declIdent.mangledName,\n `ERR: mangled name not found for decl ident ${identToString(declIdent)}`,\n );\n // mangled name was set in binding step\n return declIdent.mangledName!;\n }\n\n return declIdent.mangledName || declIdent.originalName;\n}\n\n/** trace through refersTo links in reference Idents until we find the declaration\n * expects that bindIdents has filled in all refersTo: links\n */\nexport function findDecl(ident: Ident): DeclIdent {\n let i: Ident | undefined = ident;\n do {\n if (i.kind === \"decl\") {\n return i;\n }\n i = i.refersTo;\n } while (i);\n\n // TODO show source position if this can happen in a non buggy linker.\n throw new Error(`unresolved identifer: ${ident.originalName}`);\n}\n\n/** check if the element is visible with the current current conditional compilation settings */\nexport function conditionsValid(\n elem: AbstractElem,\n conditions: Conditions,\n): true | false | undefined {\n const attrElem = elem as ElemWithAttributes;\n const { kind } = attrElem;\n\n switch (kind) {\n case \"alias\":\n case \"assert\":\n case \"const\":\n case \"directive\":\n case \"member\":\n case \"var\":\n case \"let\":\n case \"statement\":\n case \"switch-clause\":\n case \"override\":\n case \"gvar\":\n case \"fn\":\n case \"struct\":\n case \"param\":\n return elementValid(attrElem, conditions);\n default:\n assertUnreachableSilent(kind);\n }\n return true;\n}\n","import { assertUnreachable } from \"../../../mini-parse/src/Assertions\";\nimport {\n ImportCollection,\n ImportItem,\n ImportStatement,\n} from \"../AbstractElems\";\n\nexport function importToString(tree: ImportStatement): string {\n return importToStringImpl(tree) + \";\";\n}\n\nfunction importToStringImpl(tree: ImportStatement): string {\n return [\n ...tree.segments.map(s => s.name),\n segmentToString(tree.finalSegment),\n ].join(\"::\");\n}\n\nfunction segmentToString(segment: ImportCollection | ImportItem): string {\n if (segment.kind === \"import-item\") {\n const { name, as } = segment;\n const asMsg = as ? ` as ${as}` : \"\";\n return `${name}${asMsg}`;\n } else if (segment.kind === \"import-collection\") {\n return `{${segment.subtrees.map(s => importToStringImpl(s)).join(\", \")}}`;\n } else {\n assertUnreachable(segment);\n }\n}\n","import { assertUnreachable } from \"../../../mini-parse/src/Assertions.ts\";\nimport {\n AbstractElem,\n Attribute,\n AttributeElem,\n DirectiveElem,\n FnElem,\n StuffElem,\n TypedDeclElem,\n TypeRefElem,\n TypeTemplateParameter,\n UnknownExpressionElem,\n} from \"../AbstractElems.ts\";\nimport {\n diagnosticControlToString,\n expressionToString,\n} from \"../LowerAndEmit.ts\";\nimport { importToString } from \"./ImportToString.ts\";\nimport { LineWrapper } from \"./LineWrapper.ts\";\n\nconst maxLineLength = 150;\n\nexport function astToString(elem: AbstractElem, indent = 0): string {\n const { kind } = elem;\n const str = new LineWrapper(indent, maxLineLength);\n str.add(kind);\n addElemFields(elem, str);\n let childStrings: string[] = [];\n if (\"contents\" in elem) {\n childStrings = elem.contents.map(e => astToString(e, indent + 2));\n }\n if (childStrings.length) {\n str.nl();\n str.addBlock(childStrings.join(\"\\n\"), false);\n }\n\n return str.result;\n}\n\n// LATER rewrite to be shorter and easier to read\nfunction addElemFields(elem: AbstractElem, str: LineWrapper): void {\n const { kind } = elem;\n if (kind === \"text\") {\n const { srcModule, start, end } = elem;\n str.add(` '${srcModule.src.slice(start, end)}'`);\n } else if (\n kind === \"var\" ||\n kind === \"let\" ||\n kind === \"gvar\" ||\n kind === \"const\" ||\n kind === \"override\"\n ) {\n addTypedDeclIdent(elem.name, str);\n listAttributeElems(elem.attributes, str);\n } else if (kind === \"struct\") {\n str.add(\" \" + elem.name.ident.originalName);\n } else if (kind === \"member\") {\n const { name, typeRef, attributes } = elem;\n listAttributeElems(attributes, str);\n str.add(\" \" + name.name);\n str.add(\": \" + typeRefElemToString(typeRef));\n } else if (kind === \"name\") {\n str.add(\" \" + elem.name);\n } else if (kind === \"memberRef\") {\n const { extraComponents } = elem;\n const extraText =\n extraComponents ? debugContentsToString(extraComponents) : \"\";\n str.add(` ${elem.name.ident.originalName}.${elem.member.name}${extraText}`);\n } else if (kind === \"fn\") {\n addFnFields(elem, str);\n } else if (kind === \"alias\") {\n const { name, typeRef } = elem;\n const prefix = name.ident.kind === \"decl\" ? \"%\" : \"\";\n str.add(\" \" + prefix + name.ident.originalName);\n str.add(\"=\" + typeRefElemToString(typeRef));\n } else if (kind === \"attribute\") {\n addAttributeFields(elem.attribute, str);\n } else if (kind === \"expression\") {\n const contents = elem.contents\n .map(e => {\n if (e.kind === \"text\") {\n return \"'\" + e.srcModule.src.slice(e.start, e.end) + \"'\";\n } else {\n return astToString(e);\n }\n })\n .join(\" \");\n str.add(\" \" + contents);\n } else if (kind === \"type\") {\n const { name } = elem;\n const nameStr = typeof name === \"string\" ? name : name.originalName;\n str.add(\" \" + nameStr);\n\n if (elem.templateParams !== undefined) {\n const paramStrs = elem.templateParams\n .map(templateParamToString)\n .join(\", \");\n str.add(\"<\" + paramStrs + \">\");\n }\n } else if (kind === \"synthetic\") {\n str.add(` '${elem.text}'`);\n } else if (kind === \"import\") {\n str.add(\" \" + importToString(elem.imports));\n } else if (kind === \"ref\") {\n str.add(\" \" + elem.ident.originalName);\n } else if (kind === \"typeDecl\") {\n addTypedDeclIdent(elem, str);\n } else if (kind === \"decl\") {\n const { ident } = elem;\n str.add(\" %\" + ident.originalName);\n } else if (kind === \"assert\") {\n // Nothing to do for now\n } else if (kind === \"module\") {\n // Ignore this kind of elem\n } else if (kind === \"param\") {\n // LATER This branch shouldn't exist\n } else if (kind === \"stuff\") {\n // Ignore\n } else if (kind === \"directive\") {\n addDirective(elem, str);\n } else if (kind === \"statement\") {\n listAttributeElems(elem.attributes, str);\n } else if (kind === \"switch-clause\") {\n // Nothing to do for now\n } else {\n assertUnreachable(kind);\n }\n}\n\nfunction addAttributeFields(attr: Attribute, str: LineWrapper) {\n const { kind } = attr;\n if (kind === \"@attribute\") {\n const { name, params } = attr;\n str.add(\" @\" + name);\n if (params && params.length > 0) {\n str.add(\"(\");\n str.add(params.map(unknownExpressionToString).join(\", \"));\n str.add(\")\");\n }\n } else if (kind === \"@builtin\") {\n str.add(` @builtin(${attr.param.name})`);\n } else if (kind === \"@diagnostic\") {\n str.add(\n ` @diagnostic${diagnosticControlToString(attr.severity, attr.rule)}`,\n );\n } else if (kind === \"@if\") {\n str.add(\" @if\");\n str.add(\"(\");\n str.add(expressionToString(attr.param.expression));\n str.add(\")\");\n } else if (kind === \"@interpolate\") {\n str.add(` @interpolate(${attr.params.map(v => v.name).join(\", \")})`);\n } else {\n assertUnreachable(kind);\n }\n}\n\n/** @return string representation of an attribute (for test/debug) */\nexport function attributeToString(attr: Attribute): string {\n const str = new LineWrapper(0, maxLineLength);\n addAttributeFields(attr, str);\n return str.result;\n}\n\nfunction addTypedDeclIdent(elem: TypedDeclElem, str: LineWrapper) {\n const { decl, typeRef } = elem;\n str.add(\" %\" + decl.ident.originalName);\n if (typeRef) {\n str.add(\" : \" + typeRefElemToString(typeRef));\n }\n}\n\nfunction addFnFields(elem: FnElem, str: LineWrapper) {\n const { name, params, returnType, attributes } = elem;\n\n str.add(\" \" + name.ident.originalName);\n\n str.add(\"(\");\n const paramStrs = params\n .map(\n (\n p, // LATER DRY\n ) => {\n const { name } = p;\n const { originalName } = name.decl.ident;\n const typeRef = typeRefElemToString(name.typeRef!);\n return originalName + \": \" + typeRef;\n },\n )\n .join(\", \");\n str.add(paramStrs);\n str.add(\")\");\n\n listAttributeElems(attributes, str);\n\n if (returnType) {\n str.add(\" -> \" + typeRefElemToString(returnType));\n }\n}\n\n/** show attribute names in short form to verify collection */\nfunction listAttributeElems(\n attributes: AttributeElem[] | undefined,\n str: LineWrapper,\n) {\n attributes?.forEach(a => str.add(\" \" + attributeName(a.attribute)));\n}\n\nfunction attributeName(attr: Attribute): string {\n const { kind } = attr;\n if (kind === \"@attribute\") {\n return \"@\" + attr.name;\n } else {\n return kind;\n }\n}\n\nfunction addDirective(elem: DirectiveElem, str: LineWrapper) {\n const { directive, attributes } = elem;\n const { kind } = directive;\n if (kind === \"diagnostic\") {\n const { severity, rule } = directive;\n const control = diagnosticControlToString(severity, rule);\n str.add(` diagnostic${control}`);\n } else if (kind === \"enable\" || kind === \"requires\") {\n str.add(` ${kind} ${directive.extensions.map(v => v.name).join(\", \")}`);\n } else {\n assertUnreachable(kind);\n }\n listAttributeElems(attributes, str);\n}\n\nfunction unknownExpressionToString(elem: UnknownExpressionElem): string {\n // LATER Temp hack while I clean up the expression parsing\n if (\"contents\" in elem) {\n // @ts-ignore\n const contents = elem.contents\n // @ts-ignore\n .map(e => {\n if (e.kind === \"text\") {\n return \"'\" + e.srcModule.src.slice(e.start, e.end) + \"'\";\n } else {\n return astToString(e);\n }\n })\n .join(\" \");\n return contents;\n }\n return astToString(elem);\n}\n\nfunction templateParamToString(p: TypeTemplateParameter): string {\n if (typeof p === \"string\") {\n return p;\n } else if (p.kind === \"type\") {\n return typeRefElemToString(p);\n } else if (p.kind === \"expression\") {\n return unknownExpressionToString(p);\n } else {\n console.log(\"unknown template parameter type\", p);\n return \"??\";\n }\n}\n\nfunction typeRefElemToString(elem: TypeRefElem): string {\n if (!elem) return \"?type?\";\n const { name } = elem;\n const nameStr = typeof name === \"string\" ? name : name.originalName;\n\n let params = \"\";\n if (elem.templateParams !== undefined) {\n const paramStrs = elem.templateParams.map(templateParamToString).join(\", \");\n params = \"<\" + paramStrs + \">\";\n }\n return nameStr + params;\n}\n\nexport function debugContentsToString(elem: StuffElem): string {\n const parts = elem.contents.map(c => {\n const { kind } = c;\n if (kind === \"text\") {\n return c.srcModule.src.slice(c.start, c.end);\n } else if (kind === \"ref\") {\n return c.ident.originalName; // not using the mapped to decl name, so this can be used for debug..\n } else {\n return `?${c.kind}?`;\n }\n });\n return parts.join(\" \");\n}\n","import { SrcMap } from \"mini-parse\";\nimport { assertThat } from \"../../mini-parse/src/Assertions\";\nimport { errorHighlight, offsetToLineNumber } from \"./Util\";\nimport type { WeslDevice } from \"./WeslDevice\";\n\n/** Results of shader compilation. Has {@link WeslGPUCompilationMessage}\n * which are aware of the WESL module that an error was thrown from. */\nexport interface WeslGPUCompilationInfo extends GPUCompilationInfo {\n messages: WeslGPUCompilationMessage[];\n}\n\nexport interface WeslGPUCompilationMessage extends GPUCompilationMessage {\n module: {\n // LATER this should be a qualified module path.\n // And something else should map it to a URL that is relative to the correct place.\n url: string;\n // LATER: I don't think that the text should be a part of the compilation message.\n // Instead the module url should be usable as a key.\n text?: string;\n };\n}\n\n/**\n * A {@link GPUValidationError} with an inner error (for a stack trace).\n * Can also point at a WESL source file.\n */\nexport interface ExtendedGPUValidationError extends GPUValidationError {\n cause?: Error;\n compilationInfo?: WeslGPUCompilationInfo;\n}\n\n/**\n * Multiple WESL files that have been linked together to produce WGSL code.\n *\n * Call {@link LinkedWesl.createShaderModule} on a {@link WeslDevice}\n * to make the error reporting aware of the WESL code.\n */\nexport class LinkedWesl {\n constructor(public sourceMap: SrcMap) {}\n\n /**\n * Creates a {@link GPUShaderModule}.\n * When errors occur, they will point at the original WESL source code.\n *\n * The compilation info {@link GPUShaderModule.getCompilationInfo}\n * can be remapped with {@link mapGPUCompilationInfo}\n * @param device GPUDevice. Preferably a {@link WeslDevice} for better error reporting.\n * @param descriptor - Description of the {@link GPUShaderModule} to create.\n */\n createShaderModule(\n device: GPUDevice | WeslDevice,\n descriptor: Omit<GPUShaderModuleDescriptor, \"code\">,\n ): GPUShaderModule {\n // Skip the custom behaviour if we do not have a WESL device.\n if (!(\"injectError\" in device)) {\n return device.createShaderModule({\n ...descriptor,\n code: this.dest,\n });\n }\n\n device.pushErrorScope(\"validation\"); // Suppress the normal error\n const module = device.createShaderModule({\n ...descriptor,\n code: this.dest,\n });\n device.popErrorScope();\n // And report the error!\n let { promise, resolve } = Promise.withResolvers<GPUError | null>();\n device.injectError(\"validation\", promise); // Inject our custom error\n module.getCompilationInfo().then(compilationInfo => {\n if (compilationInfo.messages.length === 0) {\n resolve(null);\n return;\n }\n\n const mappedCompilationInfo = this.mapGPUCompilationInfo(compilationInfo);\n const errorMessage = compilationInfoToErrorMessage(\n mappedCompilationInfo,\n module,\n );\n // Error message cannot be null, since we're passing at least one message to it.\n assertThat(errorMessage !== null);\n const error: ExtendedGPUValidationError = new GPUValidationError(\n errorMessage,\n );\n error.cause = new Error(\"createShaderModule failed\");\n error.compilationInfo = mappedCompilationInfo;\n resolve(error);\n });\n return module;\n }\n\n /**\n * Use {@link LinkedWesl.createShaderModule} for a\n * better error reporting experience.\n */\n get dest() {\n return this.sourceMap.dest.text;\n }\n\n /** Turns raw compilation info into compilation info\n * that points at the WESL sources. */\n public mapGPUCompilationInfo(\n compilationInfo: GPUCompilationInfo,\n ): WeslGPUCompilationInfo {\n return {\n __brand: compilationInfo.__brand,\n messages: compilationInfo.messages.map(v =>\n this.mapGPUCompilationMessage(v),\n ),\n };\n }\n\n private mapGPUCompilationMessage(\n message: GPUCompilationMessage,\n ): WeslGPUCompilationMessage {\n const srcMap = this.sourceMap;\n const srcPosition = srcMap.destToSrc(message.offset);\n // LATER what if this gets mapped to a completely different place?\n const srcEndPosition =\n message.length > 0 ?\n srcMap.destToSrc(message.offset + message.length)\n : srcPosition;\n const length = srcEndPosition.position - srcPosition.position;\n\n let [lineNum, linePos] = offsetToLineNumber(\n srcPosition.position,\n srcPosition.src.text,\n );\n\n return {\n __brand: message.__brand,\n type: message.type,\n message: message.message,\n offset: srcPosition.position,\n length,\n lineNum,\n linePos,\n module: {\n url: srcPosition.src.path ?? \"\",\n text: srcPosition.src.text,\n },\n };\n }\n}\n\n/**\n * Tries to imitate the way the browser logs the compilation info.\n * Does not do the remapping.\n * @returns A string with errors, or `null` if there were no compilation messages.\n */\nfunction compilationInfoToErrorMessage(\n compilationInfo: WeslGPUCompilationInfo,\n shaderModule: GPUShaderModule,\n): string | null {\n if (compilationInfo.messages.length === 0) return null;\n\n let result = `Compilation log for [Invalid ShaderModule (${\n shaderModule.label || \"unlabled\"\n })]:\\n`;\n let errorCount = compilationInfo.messages.filter(\n v => v.type === \"error\",\n ).length;\n if (errorCount > 0) {\n result += `${errorCount} error(s) generated while compiling the shader:\\n`;\n }\n for (const message of compilationInfo.messages) {\n const { lineNum, linePos } = message;\n\n result += `${message.module.url}:${lineNum}:${linePos}`;\n result += ` ${message.type}: ${message.message}\\n`;\n // LATER unmangle code snippets in the message\n\n const source = message.module.text;\n if (source) {\n result += errorHighlight(source, [\n message.offset,\n message.offset + message.length,\n ]).join(\"\\n\");\n }\n }\n return result;\n}\n","/** simplistic path manipulation utilities */\n\n/** return path with ./ and foo/.. elements removed */\nexport function normalize(path: string): string {\n const segments = path.split(\"/\");\n const noDots = segments.filter(s => s !== \".\");\n const noDbl: string[] = [];\n\n noDots.forEach(s => {\n if (s !== \"\") {\n if (s === \"..\" && noDbl.length && noDbl[noDbl.length - 1] !== \"..\") {\n noDbl.pop();\n } else {\n noDbl.push(s);\n }\n }\n });\n\n return noDbl.join(\"/\");\n}\n\n/** return path w/o a suffix.\n * e.g. /foo/bar.wgsl => /foo/bar */\nexport function noSuffix(path: string): string {\n const lastSlash = path.lastIndexOf(\"/\");\n const lastStart = lastSlash === -1 ? 0 : lastSlash + 1;\n\n const suffix = path.indexOf(\".\", lastStart);\n const suffixStart = suffix === -1 ? path.length : suffix;\n return path.slice(0, suffixStart);\n}\n","import { WeslBundle } from \"wesl\";\nimport { parseSrcModule, parseWESL, WeslAST } from \"./ParseWESL.ts\";\nimport { normalize, noSuffix } from \"./PathUtil.ts\";\nimport { resetScopeIds, SrcModule } from \"./Scope.ts\";\n\nexport interface ParsedRegistry {\n modules: Record<string, WeslAST>; // key is module path, e.g. \"rand_pkg::foo::bar\"\n}\n\nexport function parsedRegistry(): ParsedRegistry {\n resetScopeIds(); // for debug\n return { modules: {} };\n}\n\n/** for debug */\nexport function registryToString(registry: ParsedRegistry): string {\n return `modules: ${[...Object.keys(registry.modules)]}`;\n}\n\n/**\n * Parse WESL each src module (file) into AST elements and a Scope tree.\n * @param src keys are module paths, values are wesl src strings\n */\nexport function parseWeslSrc(src: Record<string, string>): ParsedRegistry {\n const parsedEntries = Object.entries(src).map(([path, src]) => {\n const weslAST = parseWESL(src);\n return [path, weslAST];\n });\n return { modules: Object.fromEntries(parsedEntries) };\n}\n\n/** Look up a module with a flexible selector.\n * :: separated module path, package::util\n * / separated file path ./util.wesl (or ./util)\n * - note: a file path should not include a weslRoot prefix, e.g. not ./shaders/util.wesl\n * simpleName util\n */\nexport function selectModule(\n parsed: ParsedRegistry,\n selectPath: string,\n packageName = \"package\",\n): WeslAST | undefined {\n // dlog({reg: [...Object.keys(parsed.modules)]});\n let modulePath: string;\n if (selectPath.includes(\"::\")) {\n modulePath = selectPath;\n } else if (\n selectPath.includes(\"/\") ||\n selectPath.endsWith(\".wesl\") ||\n selectPath.endsWith(\".wgsl\")\n ) {\n modulePath = fileToModulePath(selectPath, packageName);\n } else {\n modulePath = packageName + \"::\" + selectPath;\n }\n\n return parsed.modules[modulePath];\n}\n\n/**\n * @param srcFiles map of source strings by file path\n * key is '/' separated relative path (relative to srcRoot, not absolute file path )\n * value is wesl source string\n * @param registry add parsed modules to this registry\n * @param packageName name of package\n */\nexport function parseIntoRegistry(\n srcFiles: Record<string, string>,\n registry: ParsedRegistry,\n packageName: string = \"package\",\n debugWeslRoot?: string,\n): void {\n if (debugWeslRoot === undefined) {\n debugWeslRoot = \"\";\n } else if (!debugWeslRoot.endsWith(\"/\")) {\n debugWeslRoot += \"/\";\n }\n const srcModules: SrcModule[] = Object.entries(srcFiles).map(\n ([filePath, src]) => {\n const modulePath = fileToModulePath(filePath, packageName);\n return { modulePath, debugFilePath: debugWeslRoot + filePath, src };\n },\n );\n srcModules.forEach(mod => {\n const parsed = parseSrcModule(mod, undefined);\n if (registry.modules[mod.modulePath]) {\n throw new Error(`duplicate module path: '${mod.modulePath}'`);\n }\n registry.modules[mod.modulePath] = parsed;\n });\n}\n\nexport function parseLibsIntoRegistry(\n libs: WeslBundle[],\n registry: ParsedRegistry,\n): void {\n libs.forEach(({ modules, name }) =>\n parseIntoRegistry(modules, registry, name),\n );\n}\n\nconst libRegex = /^lib\\.w[eg]sl$/i;\n\n/** convert a file path (./foo/bar.wesl)\n * to a module path (package::foo::bar) */\nfunction fileToModulePath(filePath: string, packageName: string): string {\n if (filePath.includes(\"::\")) {\n // already a module path\n return filePath;\n }\n if (packageName !== \"package\" && libRegex.test(filePath)) {\n // special case for lib.wesl files in external packages\n return packageName;\n }\n\n const strippedPath = noSuffix(normalize(filePath));\n const moduleSuffix = strippedPath.replaceAll(\"/\", \"::\");\n const modulePath = packageName + \"::\" + moduleSuffix;\n return modulePath;\n}\n","import { SrcMap, SrcMapBuilder, tracing } from \"mini-parse\";\nimport { AbstractElem, ModuleElem } from \"./AbstractElems.ts\";\nimport { bindIdents, EmittableElem } from \"./BindIdents.ts\";\nimport { LinkedWesl } from \"./LinkedWesl.ts\";\nimport { lowerAndEmit } from \"./LowerAndEmit.ts\";\nimport { ManglerFn } from \"./Mangler.ts\";\nimport {\n parsedRegistry,\n ParsedRegistry,\n parseIntoRegistry,\n parseLibsIntoRegistry,\n selectModule,\n} from \"./ParsedRegistry.ts\";\nimport { WeslAST } from \"./ParseWESL.ts\";\nimport { Conditions, DeclIdent, SrcModule } from \"./Scope.ts\";\nimport { filterMap, mapValues } from \"./Util.ts\";\nimport { WeslBundle } from \"./WeslBundle.ts\";\n\ntype LinkerTransform = (boundAST: TransformedAST) => TransformedAST;\n\nexport interface WeslJsPlugin {\n transform?: LinkerTransform;\n}\n\nexport interface TransformedAST\n extends Pick<WeslAST, \"srcModule\" | \"moduleElem\"> {\n globalNames: Set<string>;\n notableElems: Record<string, AbstractElem[]>;\n}\n\nexport interface LinkConfig {\n plugins?: WeslJsPlugin[];\n}\n\nexport interface LinkParams {\n /** record of file paths and wesl text for modules.\n * key is module path or file path\n * `package::foo::bar`, or './foo/bar.wesl', or './foo/bar'\n * value is wesl src\n *\n *\n * Only accepts unix-style, relative filesystem paths that are valid WGSL identifiers\n * - Unix-style: Slashes as separators.\n * - Valid WGSL identifiers: No backslashes, no `..`, or other non-identifier symbols.\n * - Relative paths: They have to be relative to the wesl root.\n */\n weslSrc: Record<string, string>;\n\n /** name of root wesl module\n * for an app, the root module normally contains the '@compute', '@vertex' or '@fragment' entry points\n * for a library, the root module defines the public api fo the library\n * can be specified as file path (./main.wesl), a module path (package::main), or just a module name (main)\n */\n rootModuleName?: string;\n\n /** For debug logging. Will be prepended to file paths. */\n debugWeslRoot?: string;\n\n /** runtime conditions for conditional compiling with @if and friends */\n conditions?: Conditions;\n\n /** libraries available for the link */\n libs?: WeslBundle[];\n\n /** generate wesl from code at runtime */\n virtualLibs?: Record<string, VirtualLibraryFn>;\n\n /** plugins and other configuration to use while linking */\n config?: LinkConfig;\n\n /** Host (ts/js) provided wgsl constants.\n * Users can import the values from wesl code via the `constants' virtual library:\n * `import constants::num_lights;` */\n constants?: Record<string, string | number>;\n\n /** function to construct globally unique wgsl identifiers */\n mangler?: ManglerFn;\n}\n\n/** Generate a virtual WESL module based on a set of conditions. */\nexport type VirtualLibraryFn = (conditions: Conditions) => string;\n\n/**\n * Link a set of WESL source modules (typically the text from .wesl files) into a single WGSL string.\n * Linking starts with a specified 'root' source module, and recursively incorporates code\n * referenced from other modules (in local files or libraries).\n *\n * Unreferenced (dead) code outside the root module is not included in the output WGSL.\n * Additionally the caller can specify conditions for to control conditional compilation.\n * Only code that is valid with the current conditions is included in the output.\n */\nexport async function link(params: LinkParams): Promise<LinkedWesl> {\n const { weslSrc, debugWeslRoot, libs = [] } = params;\n const registry = parsedRegistry();\n parseIntoRegistry(weslSrc, registry, \"package\", debugWeslRoot);\n parseLibsIntoRegistry(libs, registry);\n return new LinkedWesl(linkRegistry({ registry, ...params }));\n}\n\nexport interface LinkRegistryParams\n extends Pick<\n LinkParams,\n | \"rootModuleName\"\n | \"conditions\"\n | \"virtualLibs\"\n | \"config\"\n | \"constants\"\n | \"mangler\"\n > {\n registry: ParsedRegistry;\n}\n\n/** Link wesl from a registry of already parsed modules.\n *\n * This entry point is intended for users who want to link multiple times\n * from the same sources. (e.g. linking with different conditions\n * each time, or perhaps to produce multiple wgsl shaders\n * that share some sources.)\n */\nexport function linkRegistry(params: LinkRegistryParams): SrcMap {\n const bound = bindAndTransform(params);\n const { transformedAst, newDecls, newStatements } = bound;\n\n return SrcMapBuilder.build(\n emitWgsl(\n transformedAst.moduleElem,\n transformedAst.srcModule,\n newDecls,\n newStatements,\n params.conditions,\n ),\n );\n}\n\nexport interface BoundAndTransformed {\n transformedAst: TransformedAST;\n newDecls: DeclIdent[];\n newStatements: EmittableElem[];\n}\n\n/** bind identifers and apply any transform plugins */\nexport function bindAndTransform(\n params: LinkRegistryParams,\n): BoundAndTransformed {\n const { registry, mangler } = params;\n const { rootModuleName = \"main\", conditions = {} } = params;\n const rootAst = getRootModule(registry, rootModuleName);\n\n // setup virtual modules from code generation or host constants provided by the user\n const { constants, config } = params;\n let { virtualLibs } = params;\n if (constants) {\n virtualLibs = { ...virtualLibs, constants: constantsGenerator(constants) };\n }\n let virtuals = virtualLibs && mapValues(virtualLibs, fn => ({ fn }));\n\n /* --- Step #2 Binding Idents --- */\n // link active Ident references to declarations, and uniquify global declarations\n const bindParams = { rootAst, registry, conditions, virtuals, mangler };\n const bindResults = bindIdents(bindParams);\n const { globalNames, decls: newDecls, newStatements } = bindResults;\n\n const transformedAst = applyTransformPlugins(rootAst, globalNames, config);\n return { transformedAst, newDecls, newStatements };\n}\n\nfunction constantsGenerator(\n constants: Record<string, string | number>,\n): () => string {\n return () =>\n Object.entries(constants)\n .map(([name, value]) => `const ${name} = ${value};`)\n .join(\"\\n\");\n}\n\n/** get a reference to the root module, selecting by module name */\nfunction getRootModule(\n parsed: ParsedRegistry,\n rootModuleName: string,\n): WeslAST {\n const rootModule = selectModule(parsed, rootModuleName);\n if (!rootModule) {\n if (tracing) {\n console.log(`parsed modules: ${Object.keys(parsed.modules)}`);\n console.log(`root module not found: ${rootModuleName}`);\n }\n throw new Error(`Root module not found: ${rootModuleName}`);\n }\n return rootModule;\n}\n\n/** run any plugins that transform the AST */\nfunction applyTransformPlugins(\n rootModule: WeslAST,\n globalNames: Set<string>,\n config?: LinkConfig,\n): TransformedAST {\n const { moduleElem, srcModule } = rootModule;\n\n // for now only transform the root module\n const startAst = { moduleElem, srcModule, globalNames, notableElems: {} };\n const plugins = config?.plugins ?? [];\n const transforms = filterMap(plugins, plugin => plugin.transform);\n const transformedAst = transforms.reduce(\n (ast, transform) => transform(ast),\n startAst,\n );\n\n return transformedAst;\n}\n\n/** traverse the AST and emit WGSL */\nfunction emitWgsl(\n rootModuleElem: ModuleElem,\n srcModule: SrcModule,\n newDecls: DeclIdent[],\n newStatements: EmittableElem[],\n conditions: Conditions = {},\n): SrcMapBuilder[] {\n /* --- Step #3 Writing WGSL --- */ // note doesn't require the scope tree anymore\n\n // emit any new statements (module level const asserts)\n const prologueBuilders = newStatements.map(s => {\n const { elem, srcModule } = s;\n const { src: text, debugFilePath: path } = srcModule;\n const builder = new SrcMapBuilder({ text, path });\n lowerAndEmit(builder, [elem], conditions);\n builder.addNl();\n return builder;\n });\n\n const rootBuilder = new SrcMapBuilder({\n text: srcModule.src,\n path: srcModule.debugFilePath,\n });\n lowerAndEmit(rootBuilder, [rootModuleElem], conditions, false); // emit the entire root module\n\n const declBuilders = newDecls.map(decl => {\n const builder = new SrcMapBuilder({\n text: decl.srcModule.src,\n path: decl.srcModule.debugFilePath,\n });\n lowerAndEmit(builder, [decl.declElem!], conditions); // emit referenced declarations from other modules\n return builder;\n });\n\n return [...prologueBuilders, rootBuilder, ...declBuilders];\n}\n\n/* ---- Commentary on present and future features ---- */\n/*\n\nTODO \n- distinguish between global and local declaration idents (only global ones need be uniquified)\n\nConditions\n- conditions are attached to the AST elements where they are defined\n - only conditionally valid elements are emitted\n- consolidated conditions are attached to Idents\n - only conditionally valid ref Idents are bound, and only to conditionaly valid declarations\n - a condition stack (akin to the scope stack) is maintained while parsing to attach consolidated conditions to Idents\n- re-linking with new conditions, conservatively \n - clear all mutated Ident fields (refersTo and mangled links) \n - re-bind Idents, re-emit \n\nGenerics & specialization\n- attach generic parameters to ref and decl Idents, effectively creating a new Ident for each specialization\n- generate specialized elements at emit time, by checking the generic parameters of the decl ident\n\nIncrementally rebuilding\n- unchanged files don't need to be reparsed, only reparse dirty files.\n- support reflection only mode? no need to bind idents or emit for e.g. vite/IDE plugin generating reflection types \n\nParallel Processing (coarse grained via webworkers)\n- Parsing each module can be done in parallel\n- binding could be done partially in parallel? (esbuild doesn't parallelize here though)\n - finding the declaration for each local ident could be done in parallel by module\n - matching \n- Emitting could be easily modified to be done in partially in parallel\n - traversing the AST to list the top level elements to emit could be done serially\n - the text for each top level element could be emitted in parallel (presumably the bulk of the work)\n - the merged text can be assembled serially\n\n*/\n","import { srcLog } from \"mini-parse\";\nimport {\n AbstractElem,\n ContainerElem,\n DeclIdentElem,\n RefIdentElem,\n} from \"./AbstractElems.ts\";\n\nexport function visitAst(\n elem: AbstractElem,\n visitor: (elem: AbstractElem) => void,\n) {\n visitor(elem);\n if ((elem as ContainerElem).contents) {\n const container = elem as ContainerElem;\n container.contents.forEach(child => visitAst(child, visitor));\n }\n}\n\nexport function identElemLog(\n identElem: DeclIdentElem | RefIdentElem,\n ...messages: any[]\n): void {\n srcLog(\n identElem.srcModule.src,\n [identElem.start, identElem.end],\n ...messages,\n );\n}\n","import {\n AttributeElem,\n NameElem,\n StuffElem,\n TranslateTimeExpressionElem,\n TypeRefElem,\n TypeTemplateParameter,\n UnknownExpressionElem,\n} from \"./AbstractElems.ts\";\nimport { assertUnreachable } from \"./Assertions.ts\";\nimport {\n diagnosticControlToString,\n expressionToString,\n findDecl,\n} from \"./LowerAndEmit.ts\";\nimport { RefIdent } from \"./Scope.ts\";\n\n// LATER DRY emitting elements like this with LowerAndEmit?\n\nexport function attributeToString(e: AttributeElem): string {\n const { kind } = e.attribute;\n // LATER emit more precise source map info by making use of all the spans\n // Like the first case does\n if (kind === \"@attribute\") {\n const { params } = e.attribute;\n if (params === undefined || params.length === 0) {\n return \"@\" + e.attribute.name;\n } else {\n return `@${e.attribute.name}(${params\n .map(param => contentsToString(param))\n .join(\", \")})`;\n }\n } else if (kind === \"@builtin\") {\n return \"@builtin(\" + e.attribute.param.name + \")\";\n } else if (kind === \"@diagnostic\") {\n return (\n \"@diagnostic\" +\n diagnosticControlToString(e.attribute.severity, e.attribute.rule)\n );\n } else if (kind === \"@if\") {\n return `@if(${expressionToString(e.attribute.param.expression)})`;\n } else if (kind === \"@interpolate\") {\n return `@interpolate(${e.attribute.params.map(v => v.name).join(\", \")})`;\n } else {\n assertUnreachable(kind);\n }\n}\n\nexport function typeListToString(params: TypeTemplateParameter[]): string {\n return `<${params.map(typeParamToString).join(\", \")}>`;\n}\n\nexport function typeParamToString(param?: TypeTemplateParameter): string {\n if (param === undefined) return \"?\";\n if (typeof param === \"string\") return param;\n\n if (param.kind === \"expression\") return contentsToString(param);\n if (param.kind === \"type\") return typeRefToString(param);\n assertUnreachable(param);\n}\n\nexport function typeRefToString(t?: TypeRefElem): string {\n if (!t) return \"?\";\n const { name, templateParams } = t;\n const params = templateParams ? typeListToString(templateParams) : \"\";\n return `${refToString(name)}${params}`;\n}\n\nfunction refToString(ref: RefIdent | string): string {\n if (typeof ref === \"string\") return ref;\n if (ref.std) return ref.originalName;\n const decl = findDecl(ref);\n return decl.mangledName || decl.originalName;\n}\n\nexport function contentsToString(\n elem:\n | TranslateTimeExpressionElem\n | UnknownExpressionElem\n | NameElem\n | StuffElem,\n): string {\n if (elem.kind === \"translate-time-expression\") {\n throw new Error(\"Not supported\");\n } else if (elem.kind === \"expression\" || elem.kind === \"stuff\") {\n const parts = elem.contents.map(c => {\n const { kind } = c;\n if (kind === \"text\") {\n return c.srcModule.src.slice(c.start, c.end);\n } else if (kind === \"ref\") {\n return refToString(c.ident);\n } else {\n return `?${c.kind}?`;\n }\n });\n return parts.join(\" \");\n } else if (elem.kind === \"name\") {\n return elem.name;\n } else {\n assertUnreachable(elem);\n }\n}\n","import { matchOneOf } from \"mini-parse\";\nimport {\n BindingStructElem,\n NameElem,\n StructMemberElem,\n TextElem,\n TranslateTimeExpressionElem,\n TypeRefElem,\n UnknownExpressionElem,\n} from \"./AbstractElems.ts\";\nimport { assertThat } from \"./Assertions.ts\";\nimport { TransformedAST, WeslJsPlugin } from \"./Linker.ts\";\nimport { identElemLog } from \"./LinkerUtil.ts\";\nimport { RefIdent } from \"./Scope.ts\";\nimport {\n multisampledTextureTypes,\n sampledTextureTypes,\n textureStorageTypes,\n} from \"./StandardTypes.ts\";\nimport { findMap } from \"./Util.ts\";\n\nexport type BindingStructReportFn = (structs: BindingStructElem[]) => void;\nexport const textureStorage = matchOneOf(textureStorageTypes);\n\nexport function reportBindingStructsPlugin(\n fn: BindingStructReportFn,\n): WeslJsPlugin {\n return {\n transform: reportBindingStructs(fn),\n };\n}\n/** \n * Linker plugin that generates TypeScript strings for GPUBindingGroupLayouts\n * based on the binding structs in the WESL source\n * \n * requires the enableBindingStructs() transform to be enabled\n * \n * @param fn a function that will be called with the binding structs\n * (Normally the caller will pass a function that uses bindingGroupLayoutTs() \n * to generate the TypeScript)\n *\n * The generated TypeScript looks looks roughly like this \n\n export function MyBindingLayout(device: GPUDevice): GPUBindGroupLayout {\n return device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: GPUShaderStage.COMPUTE,\n buffer: {\n type: \"storage\",\n },\n },\n ],\n });\n }\n*/\nexport function reportBindingStructs(\n fn: BindingStructReportFn,\n): (ast: TransformedAST) => TransformedAST {\n return (ast: TransformedAST) => {\n const structs = ast.notableElems.bindingStructs as BindingStructElem[];\n fn(structs);\n return ast;\n };\n}\n\nfunction firstLetterLower(s: string): string {\n return s[0].toLowerCase() + s.slice(1);\n}\n\n/**\n * @return a string containing a generated TypeScript function that creates\n * a GPUBindingGroupLayout instance to align with the binding structures\n * in wesl source.\n */\nexport function bindingGroupLayoutTs(\n struct: BindingStructElem,\n typeScript = true,\n): string {\n if (!struct) {\n console.log(\"no struct!???\");\n return \"\";\n }\n const structName = firstLetterLower(struct.name.ident.mangledName!);\n const visibility = shaderVisiblity(struct);\n const entries = struct.members\n .map(m => memberToLayoutEntry(m, visibility))\n .join(\",\");\n\n const fnName = `${structName}Layout`;\n const entriesName = `${structName}Entries`;\n\n const fnParams =\n typeScript ? `(device: GPUDevice): GPUBindGroupLayout` : `(device)`;\n\n const src = `\nconst ${entriesName} = [ ${entries} ];\nfunction ${fnName}${fnParams} {\n return device.createBindGroupLayout({\n entries: ${entriesName} \n });\n}\n\nexport const layoutFunctions = { ${fnName} };\nexport const layoutEntries = { ${entriesName} };\n `;\n return src;\n}\n\n/** return the shader stage visibility for a binding struct, based on\n * the shader entry function that has the binding struct as a parameter.\n *\n * The shader entry function is attached to the binding struct\n * by the enableBindingStructs() transform.\n */\nfunction shaderVisiblity(struct: BindingStructElem): string {\n const { entryFn } = struct;\n if (!entryFn) {\n identElemLog(struct.name, \"missing entry function for binding struct\");\n } else {\n const { attributes = [] } = entryFn;\n if (\n attributes.find(\n ({ attribute: a }) => a.kind === \"@attribute\" && a.name === \"compute\",\n )\n ) {\n return \"GPUShaderStage.COMPUTE\";\n }\n if (\n attributes.find(\n ({ attribute: a }) => a.kind === \"@attribute\" && a.name === \"vertex\",\n )\n ) {\n return \"GPUShaderStage.VERTEX\";\n }\n if (\n attributes.find(\n ({ attribute: a }) => a.kind === \"@attribute\" && a.name === \"fragment\",\n )\n ) {\n return \"GPUShaderStage.FRAGMENT\";\n }\n }\n identElemLog(struct.name, \"unknown entry point type for binding struct\");\n return \"GPUShaderStage.COMPUTE\";\n}\n\n/**\n * @return a GPUBindGroupLayoutEntry corresponding to one member\n * of a WESL binding struct.\n */\nfunction memberToLayoutEntry(\n member: StructMemberElem,\n visibility: string,\n): string {\n const bindingParam = findMap(member.attributes ?? [], ({ attribute: a }) =>\n a.kind === \"@attribute\" && a.name === \"binding\" ? a : undefined,\n )?.params?.[0];\n const binding = bindingParam ? paramText(bindingParam) : \"?\";\n\n const src = `\n {\n binding: ${binding},\n visibility: ${visibility},\n ${layoutEntry(member)}\n }`;\n return src;\n}\n\n/** @return the guts of the GPUBindGroupLayoutEntry for this binding struct member.\n * ptr references to storage arrays become 'buffer' GPUBufferBindingLayout intances,\n * references to WGSL samplers become 'sampler' GPUSamplerBindingLayout instances, etc.\n */\nfunction layoutEntry(member: StructMemberElem): string {\n const { typeRef } = member;\n let entry: string | undefined;\n const { name: typeName } = typeRef;\n entry = ptrLayoutEntry(typeRef) ?? storageTextureLayoutEntry(typeRef);\n if (!entry && typeof typeName !== \"string\" && typeName.std) {\n entry =\n samplerLayoutEntry(typeRef) ??\n textureLayoutEntry(typeRef) ??\n externalTextureLayoutEntry(typeRef);\n }\n if (!entry) {\n console.error(`unhandled type`, typeName);\n entry = `{ }`;\n }\n return entry;\n}\n\nfunction ptrLayoutEntry(typeRef: TypeRefElem): string | undefined {\n if (typeRef.name.originalName === \"ptr\") {\n const param1 = typeRef.templateParams?.[0];\n const param3 = typeRef.templateParams?.[2];\n if (param1?.kind === \"type\" && param1.name.originalName === \"uniform\") {\n return `buffer: { type: \"uniform\" }`;\n } else if (\n param1?.kind === \"type\" &&\n param1.name.originalName === \"storage\"\n ) {\n if (param3?.kind === \"type\" && param3.name.originalName === \"read\") {\n return `buffer: { type: \"read-only-storage\" }`;\n } else {\n return `buffer: { type: \"storage\" }`;\n }\n // LATER what do we do with the element type (2nd parameter)\n // LATER should there be an ability to set hasDynamicOffset?\n }\n }\n}\n\nfunction samplerLayoutEntry(typeRef: TypeRefElem): string | undefined {\n const { originalName } = typeRef.name as RefIdent;\n if (originalName === \"sampler\") {\n // LATER how do we set: type GPUSamplerBindingType = | \"filtering\" | \"non-filtering\";\n // (just assuming filtering as a placeholder for now)\n return `sampler: { type: \"filtering\" }`;\n }\n if (originalName === \"sampler_comparison\") {\n return `sampler: { type: \"comparison\" }`;\n }\n}\n\nconst textureTypes = matchOneOf(sampledTextureTypes);\nconst multiNames = matchOneOf(multisampledTextureTypes);\n\nfunction textureLayoutEntry(typeRef: TypeRefElem): string | undefined {\n const { originalName } = typeRef.name as RefIdent;\n const multisampled =\n multiNames.test(originalName) ? \", multisampled: true, \" : \"\";\n if (multisampled || textureTypes.test(originalName)) {\n // LATER viewDimension\n const sampleType = getSampleType(typeRef);\n return `texture: { sampleType: \"${sampleType}\"${multisampled} }`;\n }\n return undefined;\n\n function getSampleType(typeRef: TypeRefElem): GPUTextureSampleType {\n const firstParam = typeRef.templateParams?.[0] as TypeRefElem;\n const texelType = (firstParam.name as RefIdent)\n .originalName as WgslTexelType;\n const sampleType = texelTypeToSampleType(texelType);\n return sampleType;\n }\n}\n\nfunction storageTextureLayoutEntry(typeRef: TypeRefElem): string | undefined {\n if (textureStorage.test(typeRef.name.originalName)) {\n const firstParam = typeRef.templateParams?.[0];\n const secondParam = typeRef.templateParams?.[1];\n assertThat(firstParam?.kind === \"type\"); // LATER: Temp hack\n assertThat(secondParam?.kind === \"type\"); // LATER: Temp hack\n const sampleType = formatToTextureSampleType(\n firstParam.name.originalName as GPUTextureFormat,\n );\n const access = accessMode(secondParam.name.originalName);\n return `storageTexture: { format: \"${firstParam.name.originalName}\", sampleType: \"${sampleType}\", access: \"${access}\" }`;\n }\n return undefined;\n}\n\nfunction externalTextureLayoutEntry(typeRef: TypeRefElem): string | undefined {\n const { originalName } = typeRef.name as RefIdent;\n if (originalName === \"texture_external\") {\n // LATER. how would we set the required source: HTMLVideoElement or VideoFrame?\n }\n return undefined;\n}\n\nfunction paramText(\n expression: UnknownExpressionElem | NameElem | TranslateTimeExpressionElem,\n): string {\n assertThat(\n expression.kind === \"expression\",\n \"Only expression elements are supported in this position\",\n );\n const text = expression.contents[0] as TextElem;\n return text.srcModule.src.slice(expression.start, expression.end);\n}\n\nexport function formatToTextureSampleType(\n format: GPUTextureFormat,\n float32Filterable = false,\n): GPUTextureSampleType {\n if (format.includes(\"32float\")) {\n return float32Filterable ? \"float\" : \"unfilterable-float\";\n }\n if (format.includes(\"float\") || format.includes(\"unorm\")) {\n return \"float\";\n }\n if (format.includes(\"uint\")) {\n return \"uint\";\n }\n if (format.includes(\"sint\")) {\n return \"sint\";\n }\n throw new Error(`native sample type unknwon for texture format ${format}`);\n}\n\nexport type WgslTexelType = \"f32\" | \"u32\" | \"i32\";\n\n/** return the wgsl element type for a given texture format */\nexport function formatToTexelType(format: GPUTextureFormat): WgslTexelType {\n if (format.includes(\"float\")) return \"f32\";\n if (format.includes(\"unorm\")) return \"f32\";\n if (format.includes(\"uint\")) return \"u32\";\n if (format.includes(\"sint\")) return \"i32\";\n throw new Error(`unknown format ${format}`);\n}\n\n/** @return the webgpu GPUTextureSampleType from the wgsl texel type */\nexport function texelTypeToSampleType(\n type: WgslTexelType,\n): GPUTextureSampleType {\n if (type === \"f32\") return \"float\";\n if (type === \"u32\") return \"uint\";\n if (type === \"i32\") return \"sint\";\n throw new Error(`unknown texel type ${type}`);\n}\n\nexport function accessMode(access: string): GPUStorageTextureAccess {\n if (access === \"read\") {\n return \"read-only\";\n }\n if (access === \"write\") {\n return \"write-only\";\n }\n if (access === \"read_write\") {\n return \"read-write\";\n }\n throw new Error(`unknown access mode: ${access}`);\n}\n","import { tracing } from \"mini-parse\";\nimport {\n AbstractElem,\n AttributeElem,\n BindingStructElem,\n DeclarationElem,\n FnElem,\n ModuleElem,\n SimpleMemberRef,\n StructElem,\n StructMemberElem,\n SyntheticElem,\n TypeTemplateParameter,\n} from \"./AbstractElems.ts\";\nimport { TransformedAST, WeslJsPlugin } from \"./Linker.ts\";\nimport { visitAst } from \"./LinkerUtil.ts\";\nimport { findDecl } from \"./LowerAndEmit.ts\";\nimport { minimallyMangledName } from \"./Mangler.ts\";\nimport {\n attributeToString,\n contentsToString,\n typeListToString,\n typeParamToString,\n} from \"./RawEmit.ts\";\nimport { textureStorage } from \"./Reflection.ts\";\nimport { DeclIdent, RefIdent } from \"./Scope.ts\";\nimport { filterMap } from \"./Util.ts\";\n\nexport function bindingStructsPlugin(): WeslJsPlugin {\n return {\n transform: lowerBindingStructs,\n };\n}\n\n/**\n * Transform binding structures into binding variables by mutating the AST.\n *\n * First we find all the binding structs:\n * . find all the structs in the module by filtering the moduleElem.contents\n * . for each struct:\n * . mark any structs with that contain @group or @binding annotations as 'binding structs' and save them in a list\n * . (later) create reverse links from structs to struct members\n * . (later) visit all the binding structs and traverse to referencing structs, marking the referencing structs as binding structs too\n * Generate synethic AST nodes for binding variables\n *\n * Find all references to binding struct members\n * . find the componound idents by traversing moduleElem.contents\n * . filter to find the compound idents that refer to 'binding structs'\n * . go from each ident to its declaration,\n * . declaration to typeRef reference\n * . typeRef to type declaration\n * . check type declaration to see if it's a binding struct\n * . record the intermediate declaration (e.g. a fn param b:Bindings from 'fn(b:Bindings)' )\n * rewrite references to binding struct members as synthetic elements\n *\n * Remove the binding structs from the AST\n * Remove the intermediate fn param declarations from the AST\n * Add the new binding variables to the AST\n *\n * @return the binding structs and the mutated AST\n */\nexport function lowerBindingStructs(ast: TransformedAST): TransformedAST {\n const clonedAst = structuredClone(ast);\n const { moduleElem, globalNames, notableElems } = clonedAst;\n const bindingStructs = markBindingStructs(moduleElem); // CONSIDER should we only mark bining structs referenced from the entry point?\n markEntryTypes(moduleElem, bindingStructs);\n const newVars = bindingStructs.flatMap(s =>\n transformBindingStruct(s, globalNames),\n );\n const bindingRefs = findRefsToBindingStructs(moduleElem);\n\n // convert references 'b.particles' to references to the synthetic var 'particles'\n bindingRefs.forEach(({ memberRef, struct }) =>\n transformBindingReference(memberRef, struct),\n );\n // remove intermediate fn param declaration b:Bindings from 'fn(b:Bindings)'\n bindingRefs.forEach(({ intermediates }) =>\n intermediates.forEach(e => (e.contents = [])),\n );\n const contents = removeBindingStructs(moduleElem);\n moduleElem.contents = [...newVars, ...contents];\n notableElems.bindingStructs = bindingStructs;\n return { ...clonedAst, moduleElem };\n}\n\nexport function markEntryTypes(\n moduleElem: ModuleElem,\n bindingStructs: BindingStructElem[],\n): void {\n const fns = moduleElem.contents.filter(e => e.kind === \"fn\");\n const fnFound = fnReferencesBindingStruct(fns, bindingStructs);\n if (fnFound) {\n const { fn, struct } = fnFound;\n struct.entryFn = fn;\n }\n}\n\nfunction fnReferencesBindingStruct(\n fns: FnElem[],\n bindingStructs: BindingStructElem[],\n): { fn: FnElem; struct: BindingStructElem } | undefined {\n for (const fn of fns) {\n const { params } = fn;\n for (const p of params) {\n const ref = p.name?.typeRef?.name as RefIdent | undefined;\n const referencedElem = (ref?.refersTo as DeclIdent)\n ?.declElem as StructElem;\n const struct = bindingStructs.find(s => s === referencedElem);\n if (struct) {\n return { fn, struct };\n }\n }\n }\n}\n\nfunction removeBindingStructs(moduleElem: ModuleElem): AbstractElem[] {\n return moduleElem.contents.filter(\n elem => elem.kind !== \"struct\" || !elem.bindingStruct,\n );\n}\n\n/** mutate the AST, marking StructElems as bindingStructs\n * (if they contain ptrs with @group @binding annotations)\n * @return the binding structs\n */\nexport function markBindingStructs(\n moduleElem: ModuleElem,\n): BindingStructElem[] {\n const structs = moduleElem.contents.filter(elem => elem.kind === \"struct\");\n const bindingStructs = structs.filter(containsBinding);\n bindingStructs.forEach(struct => (struct.bindingStruct = true));\n // LATER also mark structs that reference a binding struct..\n return bindingStructs as BindingStructElem[];\n}\n\n/** @return true if this struct contains a member with marked with @binding or @group */\nfunction containsBinding(struct: StructElem): boolean {\n return struct.members.some(({ attributes }) => bindingAttribute(attributes));\n}\n\nfunction bindingAttribute(attributes?: AttributeElem[]): boolean {\n if (!attributes) return false;\n return attributes.some(\n ({ attribute }) =>\n attribute.kind === \"@attribute\" &&\n (attribute.name === \"binding\" || attribute.name === \"group\"),\n );\n}\n\n/** convert each member of the binding struct into a synthetic global variable */\nexport function transformBindingStruct(\n s: StructElem,\n globalNames: Set<string>,\n): SyntheticElem[] {\n return s.members.map(member => {\n const { typeRef, name: memberName } = member;\n const { name: typeName } = typeRef!; // members should always have a typeRef.. TODO fix typing to show this\n const typeParameters = typeRef?.templateParams;\n\n const varName = minimallyMangledName(memberName.name, globalNames);\n member.mangledVarName = varName; // save new name so we can rewrite references to this member later\n globalNames.add(varName);\n\n const attributes =\n member.attributes?.map(attributeToString).join(\" \") ?? \"\";\n const varTypes =\n lowerPtrMember(member, typeName, typeParameters, varName) ??\n lowerStdTypeMember(typeName, typeParameters) ??\n lowerStorageTextureMember(typeName, typeParameters);\n if (!varTypes) {\n console.log(\"unhandled case transforming member\", typeName);\n return syntheticVar(attributes, varName, \"\", \"??\");\n }\n\n const { storage: storageType, varType } = varTypes;\n return syntheticVar(attributes, varName, storageType, varType);\n });\n}\n\ninterface LoweredVarTypes {\n storage: string;\n varType: string;\n}\n\nfunction lowerPtrMember(\n member: StructMemberElem,\n typeName: RefIdent,\n typeParameters: TypeTemplateParameter[] | undefined,\n varName: string,\n): LoweredVarTypes | undefined {\n if (typeName.originalName === \"ptr\") {\n const origParams = typeParameters ?? [];\n const newParams = [origParams[0]];\n if (origParams[2]) newParams.push(origParams[2]);\n const storage = typeListToString(newParams);\n\n const varType = typeParamToString(origParams?.[1]);\n return { storage, varType };\n }\n}\n\nfunction lowerStdTypeMember(\n typeName: RefIdent,\n typeParameters: TypeTemplateParameter[] | undefined,\n): LoweredVarTypes | undefined {\n if (typeof typeName !== \"string\") {\n const varBaseType = typeName.std ? typeName.originalName : \"??\";\n const params = typeParameters ? typeListToString(typeParameters) : \"\";\n const varType = varBaseType + params;\n\n return { varType, storage: \"\" };\n }\n}\n\nfunction lowerStorageTextureMember(\n typeName: RefIdent,\n typeParameters: TypeTemplateParameter[] | undefined,\n): LoweredVarTypes | undefined {\n if (textureStorage.test(typeName.originalName)) {\n const params = typeParameters ? typeListToString(typeParameters) : \"\";\n const varType = typeName + params;\n return { varType, storage: \"\" };\n }\n}\n\nfunction syntheticVar(\n attributes: string,\n varName: string,\n storageTemplate: string,\n varType: string,\n): SyntheticElem {\n const varText = `${attributes} var${storageTemplate} ${varName} : ${varType};\\n`;\n\n const elem: SyntheticElem = {\n kind: \"synthetic\",\n text: varText,\n };\n return elem;\n}\n\ninterface MemberRefToStruct extends StructTrace {\n memberRef: SimpleMemberRef; // e.g. the memberRef 'b.particles'\n}\n\ninterface StructTrace {\n struct: StructElem; // e.g. the struct Bindings\n intermediates: DeclarationElem[]; // e.g. the fn param b:Bindings from 'fn(b:Bindings)'\n}\n\n/** find all simple member references in the module that refer to binding structs */\nexport function findRefsToBindingStructs(\n moduleElem: ModuleElem,\n): MemberRefToStruct[] {\n const members: SimpleMemberRef[] = [];\n visitAst(moduleElem, elem => {\n if (elem.kind === \"memberRef\") members.push(elem);\n });\n return filterMap(members, refersToBindingStruct);\n}\n\n/** @return true if this memberRef refers to a binding struct */\nfunction refersToBindingStruct(\n memberRef: SimpleMemberRef,\n): MemberRefToStruct | undefined {\n const found = traceToStruct(memberRef.name.ident);\n\n if (found && found.struct.bindingStruct) {\n return { memberRef, ...found };\n }\n}\n\n/** If this identifier ultimately refers to a struct type, return the struct declaration */\nfunction traceToStruct(ident: RefIdent): StructTrace | undefined {\n const decl = findDecl(ident);\n const declElem = decl.declElem;\n // for now only handle the case where the reference points at a fn parameter\n if (declElem && declElem.kind === \"param\") {\n const name = declElem.name.typeRef!.name;\n if (typeof name !== \"string\") {\n if (name.std) {\n return undefined;\n }\n\n const paramDecl = findDecl(name);\n const structElem = paramDecl.declElem;\n if (structElem?.kind === \"struct\") {\n return { struct: structElem, intermediates: [declElem] };\n }\n return undefined;\n }\n } else {\n // LATER presumably handle other cases? Should this be more general, e.g. traceToType()?\n // elemLog(\n // ident.refIdentElem!,\n // `unhandled case in traceToStruct: decl ${declElem.kind} not yet implemented`,\n // );\n }\n}\n\n/** Mutate the member reference elem to instead contain synthetic elem text.\n * The new text is the mangled var name of the struct member that the memberRef refers to. */\nexport function transformBindingReference(\n memberRef: SimpleMemberRef,\n struct: StructElem,\n): SyntheticElem {\n const refName = memberRef.member.name;\n const structMember = struct.members.find(m => m.name.name === refName)!;\n if (!structMember || !structMember.mangledVarName) {\n if (tracing) console.log(`missing mangledVarName for ${refName}`);\n return { kind: \"synthetic\", text: refName };\n }\n const { extraComponents } = memberRef;\n const extraText = extraComponents ? contentsToString(extraComponents) : \"\";\n\n const text = structMember.mangledVarName + extraText;\n const synthElem: SyntheticElem = { kind: \"synthetic\", text };\n memberRef.contents = [synthElem];\n return synthElem;\n}\n"],"names":["_fragments","assertUnreachable","ErrorWithData","text","log","token","name","result","fn","ctag","last","ctx","newParser","map","span","kind","expression","attributeToString","childScope","ident","importElem","isGlobal","elem","end","statement","refIdent","flatImports","src","srcModule"],"mappings":"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","x_google_ignoreList":[21]}