@poe-platform/safe-js 0.1.721 → 0.1.722

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 (85) hide show
  1. package/README.md +36 -6
  2. package/dist/config-mutations/types.d.ts +3 -1
  3. package/dist/safe-js/chunks/{chunk-B4M6QVUV.js → chunk-3QQYJ4RQ.js} +3 -2
  4. package/dist/safe-js/chunks/chunk-3QQYJ4RQ.js.map +7 -0
  5. package/dist/safe-js/chunks/{chunk-BHYBD6SY.js → chunk-55RIIUGG.js} +23 -7
  6. package/dist/safe-js/chunks/chunk-55RIIUGG.js.map +7 -0
  7. package/dist/safe-js/chunks/{chunk-A4L72WXV.js → chunk-7SBQ7WTV.js} +10 -11
  8. package/dist/safe-js/chunks/chunk-7SBQ7WTV.js.map +7 -0
  9. package/dist/safe-js/chunks/{chunk-DNA7BMBY.js → chunk-BNIEPGDU.js} +8520 -7312
  10. package/dist/safe-js/chunks/{chunk-DNA7BMBY.js.map → chunk-BNIEPGDU.js.map} +4 -4
  11. package/dist/safe-js/chunks/{chunk-HYD4K4HN.js → chunk-D3GC5QPZ.js} +63 -1
  12. package/dist/safe-js/chunks/chunk-D3GC5QPZ.js.map +7 -0
  13. package/dist/safe-js/chunks/{chunk-Q7B6JIMI.js → chunk-EH5A2EQI.js} +404 -117
  14. package/dist/safe-js/chunks/chunk-EH5A2EQI.js.map +7 -0
  15. package/dist/safe-js/chunks/{chunk-4CX3HYRY.js → chunk-FA5CQO6V.js} +2 -2
  16. package/dist/safe-js/chunks/{chunk-LPBTSTDG.js → chunk-GCOLKRMY.js} +4 -4
  17. package/dist/safe-js/chunks/{chunk-GMPZBMPA.js → chunk-K3ZRBAG5.js} +3 -3
  18. package/dist/safe-js/chunks/{chunk-JNLY7IMV.js → chunk-QL2ALAE6.js} +4 -4
  19. package/dist/safe-js/chunks/{chunk-ILYJBA2D.js → chunk-RYVHEOHM.js} +1109 -100
  20. package/dist/safe-js/chunks/chunk-RYVHEOHM.js.map +7 -0
  21. package/dist/safe-js/chunks/{chunk-BEXRQET4.js → chunk-S2GFVXSI.js} +3 -3
  22. package/dist/safe-js/chunks/{chunk-Y4LNCDCP.js → chunk-WF7HYDJ4.js} +4 -5
  23. package/dist/safe-js/chunks/{chunk-Y4LNCDCP.js.map → chunk-WF7HYDJ4.js.map} +2 -2
  24. package/dist/safe-js/chunks/{chunk-IS7YUCOF.js → chunk-XHSOM5CG.js} +2 -2
  25. package/dist/safe-js/chunks/{cli-runtime-YK2WE33M.js → cli-runtime-6QPGM3TX.js} +14 -14
  26. package/dist/safe-js/chunks/{dump-ATWBOZWV.js → dump-TU6SYRFD.js} +4 -4
  27. package/dist/safe-js/chunks/{fs-D72Y52I5.js → fs-HTZT32MQ.js} +4 -4
  28. package/dist/safe-js/chunks/harness-RYAMI444.js +10 -0
  29. package/dist/safe-js/chunks/mcp-DO2IRFGQ.js +11 -0
  30. package/dist/safe-js/chunks/migration-file-K7UH5ZG6.js +12 -0
  31. package/dist/safe-js/chunks/restore-7LRP4BM3.js +13 -0
  32. package/dist/safe-js/chunks/run-6SETM7SV.js +17 -0
  33. package/dist/safe-js/chunks/runtime-modules-MCQS2SHQ.js +10 -0
  34. package/dist/safe-js/cli.js +2 -2
  35. package/dist/safe-js/core.js +7 -7
  36. package/dist/safe-js/index.js +14 -14
  37. package/dist/safe-js/interp/async.d.ts +4 -1
  38. package/dist/safe-js/interp/budget.d.ts +12 -6
  39. package/dist/safe-js/interp/collection-iterator.d.ts +1 -1
  40. package/dist/safe-js/interp/host-bridge.d.ts +1 -0
  41. package/dist/safe-js/interp/host-capabilities.d.ts +13 -4
  42. package/dist/safe-js/interp/interpreter.d.ts +5 -1
  43. package/dist/safe-js/interp/intl-numberformat.d.ts +2 -2
  44. package/dist/safe-js/interp/jobs.d.ts +8 -0
  45. package/dist/safe-js/interp/scope.d.ts +9 -2
  46. package/dist/safe-js/interp/typed-array.d.ts +2 -2
  47. package/dist/safe-js/interp/values.d.ts +1 -0
  48. package/dist/safe-js/modules/registry.d.ts +4 -1
  49. package/dist/safe-js/modules/source-graph.d.ts +19 -1
  50. package/dist/safe-js/parse/compact-spans.d.ts +18 -0
  51. package/dist/safe-js/parse/dynamic-source.d.ts +3 -1
  52. package/dist/safe-js/parse/function-source.d.ts +1 -1
  53. package/dist/safe-js/parse/parser.d.ts +8 -3
  54. package/dist/safe-js/parse/tokenizer.d.ts +4 -0
  55. package/dist/safe-js/realm.d.ts +16 -3
  56. package/dist/safe-js/restore.d.ts +1 -0
  57. package/dist/safe-js/run.d.ts +10 -0
  58. package/package.json +2 -2
  59. package/dist/safe-js/chunks/chunk-A4L72WXV.js.map +0 -7
  60. package/dist/safe-js/chunks/chunk-B4M6QVUV.js.map +0 -7
  61. package/dist/safe-js/chunks/chunk-BHYBD6SY.js.map +0 -7
  62. package/dist/safe-js/chunks/chunk-HYD4K4HN.js.map +0 -7
  63. package/dist/safe-js/chunks/chunk-ILYJBA2D.js.map +0 -7
  64. package/dist/safe-js/chunks/chunk-Q7B6JIMI.js.map +0 -7
  65. package/dist/safe-js/chunks/harness-LUYCGWHZ.js +0 -10
  66. package/dist/safe-js/chunks/mcp-IWKZB2R2.js +0 -11
  67. package/dist/safe-js/chunks/migration-file-IXO5MLP4.js +0 -12
  68. package/dist/safe-js/chunks/restore-SI7HOC6C.js +0 -13
  69. package/dist/safe-js/chunks/run-SHI2PYR6.js +0 -17
  70. package/dist/safe-js/chunks/runtime-modules-OO72HTVF.js +0 -10
  71. /package/dist/safe-js/chunks/{chunk-4CX3HYRY.js.map → chunk-FA5CQO6V.js.map} +0 -0
  72. /package/dist/safe-js/chunks/{chunk-LPBTSTDG.js.map → chunk-GCOLKRMY.js.map} +0 -0
  73. /package/dist/safe-js/chunks/{chunk-GMPZBMPA.js.map → chunk-K3ZRBAG5.js.map} +0 -0
  74. /package/dist/safe-js/chunks/{chunk-JNLY7IMV.js.map → chunk-QL2ALAE6.js.map} +0 -0
  75. /package/dist/safe-js/chunks/{chunk-BEXRQET4.js.map → chunk-S2GFVXSI.js.map} +0 -0
  76. /package/dist/safe-js/chunks/{chunk-IS7YUCOF.js.map → chunk-XHSOM5CG.js.map} +0 -0
  77. /package/dist/safe-js/chunks/{cli-runtime-YK2WE33M.js.map → cli-runtime-6QPGM3TX.js.map} +0 -0
  78. /package/dist/safe-js/chunks/{dump-ATWBOZWV.js.map → dump-TU6SYRFD.js.map} +0 -0
  79. /package/dist/safe-js/chunks/{fs-D72Y52I5.js.map → fs-HTZT32MQ.js.map} +0 -0
  80. /package/dist/safe-js/chunks/{harness-LUYCGWHZ.js.map → harness-RYAMI444.js.map} +0 -0
  81. /package/dist/safe-js/chunks/{mcp-IWKZB2R2.js.map → mcp-DO2IRFGQ.js.map} +0 -0
  82. /package/dist/safe-js/chunks/{migration-file-IXO5MLP4.js.map → migration-file-K7UH5ZG6.js.map} +0 -0
  83. /package/dist/safe-js/chunks/{restore-SI7HOC6C.js.map → restore-7LRP4BM3.js.map} +0 -0
  84. /package/dist/safe-js/chunks/{run-SHI2PYR6.js.map → run-6SETM7SV.js.map} +0 -0
  85. /package/dist/safe-js/chunks/{runtime-modules-OO72HTVF.js.map → runtime-modules-MCQS2SHQ.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/lint/rules/AS001.ts", "../../src/lint/class-elements.ts", "../../src/lint/rules/known-globals.ts", "../../src/lint/rules/AS003.ts", "../../src/lint/rules/module-registry.ts", "../../src/lint/rules/AS004.ts", "../../src/lint/rules/AS005.ts", "../../src/lint/rules/AS006-007.ts", "../../src/lint/rules/AS009.ts", "../../src/lint/rules/AS010.ts", "../../src/lint/rules/AS013.ts", "../../src/lint/rules/AS015.ts", "../../src/lint/rules/AS-async-not-needed.ts", "../../src/lint/rules/AS-destructure-null-default.ts", "../../src/lint/rules/AS-export-import-meta.ts", "../../src/lint/rules/AS-floating-promise.ts", "../../src/lint/rules/AS-frontmatter-field-unused.ts", "../../src/lint/rules/AS-import-cycle.ts", "../../src/lint/rules/AS-jsdoc-type.ts", "../../src/lint/rules/AS-large-literal.ts", "../../src/lint/rules/AS-missing-async.ts", "../../src/lint/rules/AS-mutating-frozen.ts", "../../src/lint/rules/AS-needless-template.ts", "../../src/lint/rules/AS-shadow-global.ts", "../../src/lint/rules/AS-unbounded-loop.ts", "../../src/lint/rules/AS-unreachable.ts", "../../src/lint/rules/AS-unused-import.ts", "../../src/lint/index.ts"],
4
+ "sourcesContent": ["import type { SourceSpan } from \"../../parse/parser.js\";\nimport type { Position } from \"../../parse/tokenizer.js\";\n\nexport type Diagnostic = {\n code: \"AS001\";\n severity: \"error\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n};\n\nexport function AS001(source: string, options: { filename?: string } = {}): Diagnostic[] {\n return new AS001Scanner(source, options.filename ?? \"<input>\").scan();\n}\n\ntype TokenType =\n | \"eof\"\n | \"identifier\"\n | \"keyword\"\n | \"numeric\"\n | \"punctuator\"\n | \"regex\"\n | \"string\"\n | \"template\";\n\ntype Token = {\n type: TokenType;\n value: string;\n start: Position;\n end: Position;\n};\n\ntype GroupingContext = {\n value: \"(\" | \"[\" | \"{\";\n isControlCondition?: boolean;\n};\n\ntype BraceContext = {\n kind: \"class\" | \"object\" | \"statement\";\n};\n\nconst KEYWORDS = new Set([\n \"async\",\n \"await\",\n \"break\",\n \"catch\",\n \"class\",\n \"const\",\n \"continue\",\n \"do\",\n \"else\",\n \"false\",\n \"finally\",\n \"for\",\n \"from\",\n \"if\",\n \"import\",\n \"in\",\n \"let\",\n \"new\",\n \"null\",\n \"of\",\n \"return\",\n \"switch\",\n \"throw\",\n \"this\",\n \"true\",\n \"try\",\n \"undefined\",\n \"var\",\n \"while\",\n \"with\"\n]);\n\nconst EXPRESSION_ENDING_KEYWORDS = new Set([\"false\", \"null\", \"this\", \"true\", \"undefined\"]);\nconst CONTROL_FLOW_PAREN_KEYWORDS = new Set([\"catch\", \"for\", \"if\", \"switch\", \"while\", \"with\"]);\nconst PUNCTUATORS = [\n \">>>=\",\n \"&&=\",\n \"||=\",\n \"??=\",\n \"===\",\n \"!==\",\n \">>>\",\n \"<<=\",\n \">>=\",\n \"**=\",\n \"?.\",\n \"...\",\n \"??\",\n \"&&\",\n \"||\",\n \"==\",\n \"!=\",\n \"<=\",\n \">=\",\n \"=>\",\n \"++\",\n \"--\",\n \"<<\",\n \">>\",\n \"**\",\n \"+=\",\n \"-=\",\n \"*=\",\n \"/=\",\n \"%=\",\n \"&=\",\n \"|=\",\n \"^=\",\n \"{\",\n \"}\",\n \"(\",\n \")\",\n \"[\",\n \"]\",\n \".\",\n \";\",\n \",\",\n \":\",\n \"?\",\n \"~\",\n \"+\",\n \"-\",\n \"*\",\n \"/\",\n \"%\",\n \"&\",\n \"|\",\n \"^\",\n \"!\",\n \"<\",\n \">\",\n \"=\"\n];\n\nclass AS001Scanner {\n private index = 0;\n private line = 1;\n private column = 1;\n private readonly diagnostics: Diagnostic[] = [];\n\n constructor(\n private readonly source: string,\n private readonly filename: string\n ) {}\n\n scan(): Diagnostic[] {\n this.scanCode();\n return this.diagnostics;\n }\n\n private scanCode(stopAtTemplateExpressionEnd = false): void {\n let previousToken: Token | undefined;\n let previousPreviousToken: Token | undefined;\n const groupingStack: GroupingContext[] = [];\n const braceContextStack: BraceContext[] = [];\n let lastClosedControlParenthesis = false;\n let canStartStatement = true;\n let templateExpressionBraceDepth = 0;\n let pendingClassBody = false;\n\n while (!this.isAtEnd()) {\n this.skipTrivia();\n\n if (this.isAtEnd()) {\n return;\n }\n\n const start = this.position();\n const char = this.currentChar();\n\n if (stopAtTemplateExpressionEnd && char === \"}\" && templateExpressionBraceDepth === 0) {\n this.advance();\n return;\n }\n\n let token: Token;\n\n if (isIdentifierStart(char)) {\n token = this.readIdentifierOrKeyword(start);\n } else if (char === \"'\" || char === '\"') {\n token = this.readString(start, char);\n } else if (char === \"`\") {\n token = this.readTemplate(start);\n } else if (isDecimalDigit(char) || (char === \".\" && isDecimalDigit(this.peekChar(1)))) {\n token = this.readNumber(start);\n } else if (\n char === \"/\" &&\n this.peekChar(1) !== \"=\" &&\n shouldRejectRegexLiteral(previousToken, lastClosedControlParenthesis)\n ) {\n token = this.readRegexLiteral(start);\n } else {\n token = this.readPunctuator(start);\n }\n\n if (token.type === \"identifier\" || token.type === \"keyword\") {\n const nextSignificantChar = this.peekNextSignificantChar();\n const isMemberProperty =\n previousToken?.type === \"punctuator\" &&\n (previousToken.value === \".\" || previousToken.value === \"?.\");\n const isPropertyKey = nextSignificantChar === \":\" && !canStartStatement;\n const isMemberName = isMemberNameToken(\n token,\n previousToken,\n previousPreviousToken,\n braceContextStack,\n nextSignificantChar\n );\n\n const isLabel = canStartStatement && nextSignificantChar === \":\" && token.type === \"identifier\";\n if (!isLabel && !isMemberProperty && !isPropertyKey && !isMemberName) {\n this.reportForbiddenIdentifier(token);\n if (token.value === \"class\") {\n pendingClassBody = true;\n }\n }\n }\n\n const isStatementBrace =\n token.type === \"punctuator\" && token.value === \"{\" && canStartStatement;\n\n if (token.type === \"punctuator\" && token.value === \"{\") {\n braceContextStack.push({\n kind:\n pendingClassBody && !canStartStatement\n ? \"class\"\n : isStatementBrace\n ? \"statement\"\n : \"object\"\n });\n pendingClassBody = false;\n if (stopAtTemplateExpressionEnd) {\n templateExpressionBraceDepth += 1;\n }\n } else if (token.type === \"punctuator\" && token.value === \"}\") {\n const closedBraceContext = braceContextStack.pop();\n const closedStatementBrace = closedBraceContext?.kind === \"statement\";\n if (stopAtTemplateExpressionEnd) {\n templateExpressionBraceDepth -= 1;\n }\n lastClosedControlParenthesis =\n token.type === \"punctuator\"\n ? updateGroupingState(groupingStack, previousToken, token.value)\n : false;\n canStartStatement = updateStatementStart(\n token,\n lastClosedControlParenthesis,\n false,\n closedStatementBrace\n );\n previousPreviousToken = previousToken;\n previousToken = token;\n continue;\n }\n\n lastClosedControlParenthesis =\n token.type === \"punctuator\"\n ? updateGroupingState(groupingStack, previousToken, token.value)\n : false;\n canStartStatement = updateStatementStart(\n token,\n lastClosedControlParenthesis,\n isStatementBrace,\n false\n );\n previousPreviousToken = previousToken;\n previousToken = token;\n }\n }\n\n private reportForbiddenIdentifier(token: Token): void {\n switch (token.value) {\n case \"with\":\n this.report(token.value, token.start, token.end);\n return;\n default:\n return;\n }\n }\n\n private report(construct: string, start: Position, end: Position): void {\n this.diagnostics.push({\n code: \"AS001\",\n severity: \"error\",\n message: `Disallowed syntax: ${construct}.`,\n filename: this.filename,\n line: start.line,\n column: start.column,\n span: createSpan(start, end)\n });\n }\n\n private skipTrivia(): void {\n while (!this.isAtEnd()) {\n const char = this.currentChar();\n\n if (isWhitespace(char) || isLineBreak(char)) {\n this.advance();\n continue;\n }\n\n if (char === \"/\" && this.peekChar(1) === \"/\") {\n this.advance();\n this.advance();\n while (!this.isAtEnd() && !isLineBreak(this.currentChar())) {\n this.advance();\n }\n continue;\n }\n\n if (char === \"/\" && this.peekChar(1) === \"*\") {\n this.advance();\n this.advance();\n while (!this.isAtEnd()) {\n if (this.currentChar() === \"*\" && this.peekChar(1) === \"/\") {\n this.advance();\n this.advance();\n break;\n }\n this.advance();\n }\n continue;\n }\n\n return;\n }\n }\n\n private readIdentifierOrKeyword(start: Position): Token {\n this.advance();\n while (!this.isAtEnd() && isIdentifierPart(this.currentChar())) {\n this.advance();\n }\n\n const value = this.source.slice(start.offset, this.index);\n return {\n type: KEYWORDS.has(value) ? \"keyword\" : \"identifier\",\n value,\n start,\n end: this.position()\n };\n }\n\n private readString(start: Position, quote: string): Token {\n this.advance();\n while (!this.isAtEnd()) {\n const char = this.currentChar();\n if (char === quote) {\n this.advance();\n break;\n }\n if (char === \"\\\\\") {\n this.advance();\n if (!this.isAtEnd()) {\n this.advance();\n }\n continue;\n }\n this.advance();\n }\n\n return {\n type: \"string\",\n value: this.source.slice(start.offset, this.index),\n start,\n end: this.position()\n };\n }\n\n private readTemplate(start: Position): Token {\n this.advance();\n\n while (!this.isAtEnd()) {\n const char = this.currentChar();\n if (char === \"`\") {\n this.advance();\n break;\n }\n if (char === \"\\\\\") {\n this.advance();\n if (!this.isAtEnd()) {\n this.advance();\n }\n continue;\n }\n if (char === \"$\" && this.peekChar(1) === \"{\") {\n this.advance();\n this.advance();\n this.scanCode(true);\n continue;\n }\n this.advance();\n }\n\n return {\n type: \"template\",\n value: \"`\",\n start,\n end: this.position()\n };\n }\n\n private readNumber(start: Position): Token {\n if (this.currentChar() === \".\") {\n this.advance();\n while (!this.isAtEnd() && isDecimalDigit(this.currentChar())) {\n this.advance();\n }\n } else {\n this.advance();\n while (!this.isAtEnd() && isIdentifierPart(this.currentChar())) {\n this.advance();\n }\n while (!this.isAtEnd() && this.currentChar() === \".\") {\n this.advance();\n while (!this.isAtEnd() && isIdentifierPart(this.currentChar())) {\n this.advance();\n }\n }\n }\n\n return {\n type: \"numeric\",\n value: this.source.slice(start.offset, this.index),\n start,\n end: this.position()\n };\n }\n\n private readRegexLiteral(start: Position): Token {\n this.advance();\n let inCharacterClass = false;\n\n while (!this.isAtEnd()) {\n const char = this.currentChar();\n\n if (char === \"\\\\\") {\n this.advance();\n if (!this.isAtEnd()) {\n this.advance();\n }\n continue;\n }\n\n if (char === \"[\" && !inCharacterClass) {\n inCharacterClass = true;\n this.advance();\n continue;\n }\n\n if (char === \"]\" && inCharacterClass) {\n inCharacterClass = false;\n this.advance();\n continue;\n }\n\n if (char === \"/\" && !inCharacterClass) {\n this.advance();\n while (!this.isAtEnd() && isAsciiLetter(this.currentChar())) {\n this.advance();\n }\n break;\n }\n\n this.advance();\n }\n\n return {\n type: \"regex\",\n value: this.source.slice(start.offset, this.index),\n start,\n end: this.position()\n };\n }\n\n private readPunctuator(start: Position): Token {\n const punctuator = matchPunctuator(this.source, this.index);\n if (punctuator === undefined) {\n this.advance();\n return {\n type: \"punctuator\",\n value: this.source.slice(start.offset, this.index),\n start,\n end: this.position()\n };\n }\n\n this.advanceBy(punctuator.length);\n return {\n type: \"punctuator\",\n value: punctuator,\n start,\n end: this.position()\n };\n }\n\n private peekNextSignificantChar(): string | undefined {\n const nextIndex = this.skipTriviaFrom(this.index);\n return nextIndex >= this.source.length ? undefined : this.source[nextIndex];\n }\n\n private skipTriviaFrom(start: number): number {\n let index = start;\n\n while (index < this.source.length) {\n const char = this.source[index];\n\n if (isWhitespace(char) || isLineBreak(char)) {\n index += 1;\n continue;\n }\n\n if (char === \"/\" && this.source[index + 1] === \"/\") {\n index += 2;\n while (index < this.source.length && !isLineBreak(this.source[index])) {\n index += 1;\n }\n continue;\n }\n\n if (char === \"/\" && this.source[index + 1] === \"*\") {\n index += 2;\n while (index < this.source.length) {\n if (this.source[index] === \"*\" && this.source[index + 1] === \"/\") {\n index += 2;\n break;\n }\n index += 1;\n }\n continue;\n }\n\n break;\n }\n\n return index;\n }\n\n private currentChar(): string {\n return this.source[this.index] ?? \"\";\n }\n\n private peekChar(offset: number): string {\n return this.source[this.index + offset] ?? \"\";\n }\n\n private advance(): void {\n const char = this.source[this.index];\n this.index += 1;\n if (isLineBreak(char)) {\n if (char !== \"\\n\" || this.source[this.index - 2] !== \"\\r\") this.line += 1;\n this.column = 1;\n return;\n }\n this.column += 1;\n }\n\n private advanceBy(length: number): void {\n for (let index = 0; index < length; index += 1) {\n this.advance();\n }\n }\n\n private isAtEnd(): boolean {\n return this.index >= this.source.length;\n }\n\n private position(): Position {\n return {\n line: this.line,\n column: this.column,\n offset: this.index\n };\n }\n\n private positionWithinSource(offset: number): Position {\n let line = 1;\n let column = 1;\n\n for (let index = 0; index < offset; index += 1) {\n if (isLineBreak(this.source[index])) {\n if (this.source[index] !== \"\\n\" || this.source[index - 1] !== \"\\r\") line += 1;\n column = 1;\n continue;\n }\n column += 1;\n }\n\n return {\n line,\n column,\n offset\n };\n }\n}\n\nfunction createSpan(start: Position, end: Position): SourceSpan {\n return {\n start: { ...start },\n end: { ...end }\n };\n}\n\nfunction isMemberNameToken(\n token: Token,\n previousToken: Token | undefined,\n previousPreviousToken: Token | undefined,\n braceContextStack: BraceContext[],\n nextSignificantChar: string | undefined\n): boolean {\n const memberContext = braceContextStack.at(-1);\n if (memberContext === undefined) {\n return false;\n }\n\n if (memberContext.kind !== \"class\" && memberContext.kind !== \"object\") {\n return false;\n }\n\n if (nextSignificantChar !== \"(\") {\n return false;\n }\n\n if (isMemberEntryStart(previousToken, memberContext.kind)) {\n return true;\n }\n\n if (isMemberModifierToken(previousToken)) {\n return isMemberEntryStart(previousPreviousToken, memberContext.kind);\n }\n\n return previousToken?.type === \"punctuator\" && previousToken.value === \"*\";\n}\n\nfunction isMemberEntryStart(token: Token | undefined, kind: BraceContext[\"kind\"]): boolean {\n if (token?.type !== \"punctuator\") {\n return false;\n }\n\n if (token.value === \"{\") {\n return true;\n }\n\n if (token.value === \",\") {\n return kind === \"object\";\n }\n\n if (token.value === \";\" || token.value === \"}\") {\n return kind === \"class\";\n }\n\n return false;\n}\n\nfunction isMemberModifierToken(token: Token | undefined): boolean {\n if (token === undefined) {\n return false;\n }\n\n if (token.type !== \"identifier\" && token.type !== \"keyword\") {\n return false;\n }\n\n return (\n token.value === \"async\" ||\n token.value === \"get\" ||\n token.value === \"set\" ||\n token.value === \"static\"\n );\n}\n\nfunction updateStatementStart(\n token: Token,\n lastClosedControlParenthesis: boolean,\n isStatementBrace: boolean,\n closedStatementBrace: boolean\n): boolean {\n if (token.type === \"punctuator\") {\n if (token.value === \")\" && lastClosedControlParenthesis) {\n return true;\n }\n\n if (token.value === \"{\") {\n return isStatementBrace;\n }\n\n if (token.value === \"}\") {\n return closedStatementBrace;\n }\n\n return token.value === \";\";\n }\n\n if (token.type === \"keyword\") {\n return token.value === \"do\" || token.value === \"else\";\n }\n\n return false;\n}\n\nfunction matchPunctuator(source: string, index: number): string | undefined {\n return PUNCTUATORS.find((punctuator) => source.startsWith(punctuator, index));\n}\n\nfunction shouldRejectRegexLiteral(\n previousToken: Token | undefined,\n lastClosedControlParenthesis: boolean\n): boolean {\n if (previousToken === undefined) {\n return true;\n }\n\n if (\n previousToken.type === \"identifier\" ||\n previousToken.type === \"numeric\" ||\n previousToken.type === \"regex\" ||\n previousToken.type === \"string\" ||\n previousToken.type === \"template\"\n ) {\n return false;\n }\n\n if (previousToken.type === \"keyword\") {\n return !EXPRESSION_ENDING_KEYWORDS.has(previousToken.value);\n }\n\n if (previousToken.value === \")\") {\n return lastClosedControlParenthesis;\n }\n\n return !isExpressionEndingPunctuator(previousToken.value);\n}\n\nfunction updateGroupingState(\n groupingStack: GroupingContext[],\n previousToken: Token | undefined,\n punctuator: string\n): boolean {\n if (punctuator === \"(\") {\n groupingStack.push({\n value: \"(\",\n isControlCondition:\n previousToken?.type === \"keyword\" && CONTROL_FLOW_PAREN_KEYWORDS.has(previousToken.value)\n });\n return false;\n }\n\n if (punctuator === \"[\") {\n groupingStack.push({ value: \"[\" });\n return false;\n }\n\n if (punctuator === \"{\") {\n groupingStack.push({ value: \"{\" });\n return false;\n }\n\n if (punctuator === \")\" || punctuator === \"]\" || punctuator === \"}\") {\n const context = popGroupingContext(groupingStack, matchingOpeningPunctuator(punctuator));\n return punctuator === \")\" && context?.isControlCondition === true;\n }\n\n return false;\n}\n\nfunction popGroupingContext(\n groupingStack: GroupingContext[],\n expected: \"(\" | \"[\" | \"{\"\n): GroupingContext | undefined {\n const context = groupingStack.pop();\n if (context?.value !== expected) {\n return undefined;\n }\n return context;\n}\n\nfunction matchingOpeningPunctuator(value: \")\" | \"]\" | \"}\"): \"(\" | \"[\" | \"{\" {\n switch (value) {\n case \")\":\n return \"(\";\n case \"]\":\n return \"[\";\n case \"}\":\n return \"{\";\n }\n}\n\nfunction isIdentifierStart(char: string): boolean {\n return char === \"_\" || char === \"$\" || isAsciiLetter(char);\n}\n\nfunction isIdentifierPart(char: string): boolean {\n return isIdentifierStart(char) || isDecimalDigit(char);\n}\n\nfunction isAsciiLetter(char: string): boolean {\n return (char >= \"a\" && char <= \"z\") || (char >= \"A\" && char <= \"Z\");\n}\n\nfunction isDecimalDigit(char: string): boolean {\n return char >= \"0\" && char <= \"9\";\n}\n\nfunction isWhitespace(char: string): boolean {\n return (\n char === \" \" ||\n char === \"\\t\" ||\n char === \"\\v\" ||\n char === \"\\f\" ||\n char === \"\\u00A0\" ||\n char === \"\\uFEFF\"\n );\n}\n\nfunction isLineBreak(char: string): boolean {\n return char === \"\\n\" || char === \"\\r\";\n}\n\nfunction isExpressionEndingPunctuator(value: string): boolean {\n return value === \")\" || value === \"]\" || value === \"}\" || value === \"++\" || value === \"--\";\n}\n", "import type { BlockStatement, ClassNode, Expression } from \"../parse.js\";\n\n/** Visit both definition-time expressions and deferred element bodies. */\nexport function visitClassElements(\n node: ClassNode,\n expression: (node: Expression) => void,\n statement: (node: BlockStatement) => void\n): void {\n if (node.superClass !== undefined) expression(node.superClass);\n for (const element of node.body.body) {\n if (element.type === \"StaticBlock\") {\n statement(element.body);\n continue;\n }\n if (element.computed) expression(element.key);\n if (element.value !== undefined) expression(element.value);\n }\n}\n\n/** Await in a computed key belongs to the defining function, unlike methods. */\nexport function classDefinitionContains(\n node: ClassNode,\n expression: (node: Expression) => boolean\n): boolean {\n return (node.superClass !== undefined && expression(node.superClass)) ||\n node.body.body.some(element => element.type !== \"StaticBlock\" && element.computed && expression(element.key));\n}\n", "import { numericTypedArrayConstructors } from \"../../interp/typed-array-constructors.js\";\n\nexport const KNOWN_RUNTIME_GLOBALS = [\n \"AggregateError\",\n \"AsyncDisposableStack\",\n \"Array\",\n \"ArrayBuffer\",\n \"Atomics\",\n \"DataView\",\n \"Boolean\",\n \"BigInt\",\n \"Date\",\n \"DisposableStack\",\n \"decodeURI\",\n \"decodeURIComponent\",\n \"encodeURI\",\n \"encodeURIComponent\",\n \"escape\",\n \"Error\",\n \"EvalError\",\n \"eval\",\n \"Function\",\n \"FinalizationRegistry\",\n \"Infinity\",\n \"Intl\",\n \"globalThis\",\n \"isFinite\",\n \"isNaN\",\n \"Iterator\",\n \"JSON\",\n \"Map\",\n ...Object.keys(numericTypedArrayConstructors),\n \"Math\",\n \"NaN\",\n \"Number\",\n \"Object\",\n \"parseFloat\",\n \"parseInt\",\n \"Promise\",\n \"Proxy\",\n \"RangeError\",\n \"ReferenceError\",\n \"Reflect\",\n \"RegExp\",\n \"Set\",\n \"SharedArrayBuffer\",\n \"String\",\n \"SuppressedError\",\n \"Symbol\",\n \"structuredClone\",\n \"SyntaxError\",\n \"Temporal\",\n \"TextEncoder\",\n \"TypeError\",\n \"URIError\",\n \"undefined\",\n \"unescape\",\n \"WeakMap\",\n \"WeakSet\",\n \"WeakRef\",\n \"console\"\n] as const;\n", "import { visitClassElements } from \"../class-elements.js\";\nimport {\n type ClassNode,\n parseModule,\n type ArrayExpression,\n type ArrayPattern,\n type FunctionNode,\n type AssignmentExpression,\n type AssignmentPattern,\n type AssignmentProperty,\n type AwaitExpression,\n type BinaryExpression,\n type BlockStatement,\n type CallExpression,\n type CatchClause,\n type ConditionalExpression,\n type DoWhileStatement,\n type Expression,\n type ExpressionStatement,\n type ForInStatement,\n type ForOfStatement,\n type ForStatement,\n type Identifier,\n type IfStatement,\n type ImportDeclaration,\n type LogicalExpression,\n type MemberExpression,\n type Module,\n type NewExpression,\n type ObjectExpression,\n type ObjectPattern,\n type Property,\n type RestElement,\n type SourceSpan,\n type SpreadElement,\n type Statement,\n type SwitchStatement,\n type TemplateLiteral,\n type ThrowStatement,\n type TryStatement,\n type UnaryExpression,\n type VariableDeclaration,\n type VariableDeclarator,\n type WhileStatement\n} from \"../../parse/parser.js\";\nimport { KNOWN_RUNTIME_GLOBALS } from \"./known-globals.js\";\nimport { hoistedVarDeclarations } from \"../../parse/bindings.js\";\n\nexport type Diagnostic = {\n code: \"AS003\";\n severity: \"error\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n};\n\ntype BindingKind = \"const\" | \"import\" | \"let\" | \"param\" | \"var\";\n\ntype Binding = {\n kind: BindingKind;\n name: string;\n};\n\ntype Scope = Map<string, Binding>;\n\nexport function AS003(\n source: string,\n options: { allowedGlobals?: readonly string[]; filename?: string } = {}\n): Diagnostic[] {\n return new AS003Scanner(\n options.filename ?? \"<input>\",\n new Set([...KNOWN_RUNTIME_GLOBALS, ...(options.allowedGlobals ?? [])])\n ).scan(source);\n}\n\nclass AS003Scanner {\n private readonly diagnostics: Diagnostic[] = [];\n private readonly scopes: Scope[] = [];\n\n constructor(\n private readonly filename: string,\n private readonly allowedGlobals: ReadonlySet<string>\n ) {}\n\n scan(source: string): Diagnostic[] {\n const module = parseModule(source, this.filename);\n this.visitModule(module);\n return this.diagnostics;\n }\n\n private visitModule(node: Module): void {\n this.withScope(this.collectModuleBindings(node.body), () => {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n });\n }\n\n private visitStatement(node: Statement): void {\n if (node.type === \"ClassDeclaration\") {\n this.visitClass(node);\n return;\n }\n switch (node.type) {\n case \"FunctionDeclaration\":\n this.visitArrowFunction(node);\n return;\n case \"BlockStatement\":\n this.visitBlock(node);\n return;\n case \"ExpressionStatement\":\n this.visitExpressionStatement(node);\n return;\n case \"IfStatement\":\n this.visitIfStatement(node);\n return;\n case \"ForStatement\":\n this.visitForStatement(node);\n return;\n case \"ForInStatement\":\n case \"ForOfStatement\":\n this.visitForOfStatement(node);\n return;\n case \"WhileStatement\":\n case \"DoWhileStatement\":\n this.visitWhileStatement(node);\n return;\n case \"TryStatement\":\n this.visitTryStatement(node);\n return;\n case \"SwitchStatement\":\n this.visitSwitchStatement(node);\n return;\n case \"VariableDeclaration\":\n this.visitVariableDeclaration(node);\n return;\n case \"ReturnStatement\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"ThrowStatement\":\n this.visitThrowStatement(node);\n return;\n case \"ExportNamedDeclaration\":\n this.visitVariableDeclaration(node.declaration);\n return;\n case \"ExportDefaultDeclaration\":\n if (node.declaration.type === \"ClassDeclaration\" || node.declaration.type === \"FunctionDeclaration\") this.visitStatement(node.declaration);\n else this.visitExpression(node.declaration);\n return;\n case \"ImportDeclaration\":\n case \"BreakStatement\":\n case \"ContinueStatement\":\n return;\n }\n }\n\n private visitBlock(node: BlockStatement, functionBody = false): void {\n const bindings = this.collectBlockBindings(node.body);\n if (functionBody) {\n for (const declaration of hoistedVarDeclarations(node.body)) {\n bindings.push(...this.collectDeclarationBindings(declaration));\n }\n }\n this.withScope(bindings, () => {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n });\n }\n\n private visitExpressionStatement(node: ExpressionStatement): void {\n this.visitExpression(node.expression);\n }\n\n private visitIfStatement(node: IfStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.consequent);\n if (node.alternate !== undefined) {\n this.visitStatement(node.alternate);\n }\n }\n\n private visitForStatement(node: ForStatement): void {\n const bindings =\n node.init?.type === \"VariableDeclaration\" && node.init.kind !== \"var\"\n ? this.collectDeclarationBindings(node.init)\n : [];\n this.withScope(bindings, () => {\n if (node.init !== undefined) {\n if (node.init.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.init);\n } else {\n this.visitExpression(node.init);\n }\n }\n if (node.test !== undefined) {\n this.visitExpression(node.test);\n }\n if (node.update !== undefined) {\n this.visitExpression(node.update);\n }\n this.visitStatement(node.body);\n });\n }\n\n private visitForOfStatement(node: ForInStatement | ForOfStatement): void {\n const bindings =\n node.left.type === \"VariableDeclaration\" && node.left.kind !== \"var\"\n ? this.collectDeclarationBindings(node.left)\n : [];\n this.withScope(bindings, () => {\n if (node.left.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.left);\n } else {\n this.visitAssignmentTarget(node.left);\n }\n this.visitExpression(node.right);\n this.visitStatement(node.body);\n });\n }\n\n private visitWhileStatement(node: WhileStatement | DoWhileStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.body);\n }\n\n private visitSwitchStatement(node: SwitchStatement): void {\n this.visitExpression(node.discriminant);\n this.withScope(\n this.collectBlockBindings(node.cases.flatMap((switchCase) => switchCase.consequent)),\n () => {\n for (const switchCase of node.cases) {\n if (switchCase.test !== undefined) this.visitExpression(switchCase.test);\n for (const statement of switchCase.consequent) this.visitStatement(statement);\n }\n }\n );\n }\n\n private visitTryStatement(node: TryStatement): void {\n this.visitBlock(node.block);\n if (node.handler !== undefined) {\n this.visitCatchClause(node.handler);\n }\n if (node.finalizer !== undefined) {\n this.visitBlock(node.finalizer);\n }\n }\n\n private visitCatchClause(node: CatchClause): void {\n this.withScope(this.collectCatchBindings(node), () => {\n if (node.param !== undefined) {\n this.visitBindingPattern(node.param);\n }\n this.visitBlock(node.body);\n });\n }\n\n private visitThrowStatement(node: ThrowStatement): void {\n this.visitExpression(node.argument);\n }\n\n private visitVariableDeclaration(node: VariableDeclaration): void {\n for (const declarator of node.declarations) {\n this.visitVariableDeclarator(declarator);\n }\n }\n\n private visitVariableDeclarator(node: VariableDeclarator): void {\n this.visitBindingPattern(node.id);\n if (node.init !== undefined) {\n this.visitExpression(node.init);\n }\n }\n\n private visitClass(node: ClassNode): void {\n this.withScope(node.id === undefined ? [] : [{ kind: \"const\", name: node.id.name }], () => {\n visitClassElements(node, expression => this.visitExpression(expression), block => this.visitBlock(block, true));\n });\n }\n\n private visitExpression(node: Expression): void {\n if (node.type === \"ClassExpression\") {\n this.visitClass(node);\n return;\n }\n switch (node.type) {\n case \"YieldExpression\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"Identifier\":\n this.visitIdentifier(node);\n return;\n case \"FunctionExpression\":\n case \"ArrowFunctionExpression\":\n this.visitArrowFunction(node);\n return;\n case \"ImportExpression\":\n this.visitExpression(node.source);\n if (node.options !== undefined) this.visitExpression(node.options);\n return;\n case \"AwaitExpression\":\n this.visitAwaitExpression(node);\n return;\n case \"ArrayExpression\":\n this.visitArrayExpression(node);\n return;\n case \"ObjectExpression\":\n this.visitObjectExpression(node);\n return;\n case \"UnaryExpression\":\n this.visitUnaryExpression(node);\n return;\n case \"BinaryExpression\":\n this.visitBinaryExpression(node);\n return;\n case \"LogicalExpression\":\n this.visitLogicalExpression(node);\n return;\n case \"ConditionalExpression\":\n this.visitConditionalExpression(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentExpression\":\n this.visitAssignmentExpression(node);\n return;\n case \"CallExpression\":\n case \"NewExpression\":\n this.visitCallExpression(node);\n return;\n case \"SequenceExpression\":\n for (const expression of node.expressions) this.visitExpression(expression);\n return;\n case \"UpdateExpression\":\n this.visitExpression(node.argument);\n return;\n case \"TaggedTemplateExpression\":\n this.visitExpression(node.tag);\n this.visitTemplateLiteral(node.quasi);\n return;\n case \"TemplateLiteral\":\n this.visitTemplateLiteral(node);\n return;\n case \"BooleanLiteral\":\n case \"NullLiteral\":\n case \"NumericLiteral\":\n case \"StringLiteral\":\n case \"UndefinedLiteral\":\n return;\n }\n }\n\n private visitArrowFunction(node: FunctionNode): void {\n this.withScope(this.collectParameterBindings(node), () => {\n for (const parameter of node.params) {\n this.visitBindingElement(parameter);\n }\n\n if (node.body.type === \"BlockStatement\") {\n this.visitBlock(node.body, true);\n } else {\n this.visitExpression(node.body);\n }\n });\n }\n\n private visitAwaitExpression(node: AwaitExpression): void {\n this.visitExpression(node.argument);\n }\n\n private visitArrayExpression(node: ArrayExpression): void {\n for (const element of node.elements) {\n if (element?.type === \"SpreadElement\") {\n this.visitSpreadElement(element);\n continue;\n }\n if (element !== undefined) {\n this.visitExpression(element);\n }\n }\n }\n\n private visitObjectExpression(node: ObjectExpression): void {\n for (const property of node.properties) {\n if (property.type === \"SpreadElement\") {\n this.visitSpreadElement(property);\n continue;\n }\n this.visitProperty(property);\n }\n }\n\n private visitUnaryExpression(node: UnaryExpression): void {\n this.visitExpression(node.argument);\n }\n\n private visitBinaryExpression(node: BinaryExpression): void {\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n }\n\n private visitLogicalExpression(node: LogicalExpression): void {\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n }\n\n private visitConditionalExpression(node: ConditionalExpression): void {\n this.visitExpression(node.test);\n this.visitExpression(node.consequent);\n this.visitExpression(node.alternate);\n }\n\n private visitMemberExpression(node: MemberExpression): void {\n this.visitExpression(node.object);\n if (node.computed) {\n this.visitExpression(node.property);\n }\n }\n\n private visitAssignmentExpression(node: AssignmentExpression): void {\n this.visitAssignmentTarget(node.left);\n this.visitExpression(node.right);\n }\n\n private visitCallExpression(node: CallExpression | NewExpression): void {\n this.visitExpression(node.callee);\n for (const argument of node.arguments) {\n if (argument.type === \"SpreadElement\") {\n this.visitSpreadElement(argument);\n continue;\n }\n this.visitExpression(argument);\n }\n }\n\n private visitTemplateLiteral(node: TemplateLiteral): void {\n for (const expression of node.expressions) {\n this.visitExpression(expression);\n }\n }\n\n private visitProperty(node: Property): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitExpression(node.value);\n }\n\n private visitSpreadElement(node: SpreadElement): void {\n this.visitExpression(node.argument);\n }\n\n private visitBindingElement(\n node:\n | AssignmentPattern\n | ArrayPattern\n | Identifier\n | MemberExpression\n | ObjectPattern\n | RestElement\n ): void {\n switch (node.type) {\n case \"AssignmentPattern\":\n this.visitBindingPattern(node.left);\n this.visitExpression(node.right);\n return;\n case \"RestElement\":\n this.visitBindingPattern(node.argument);\n return;\n default:\n this.visitBindingPattern(node);\n return;\n }\n }\n\n private visitBindingPattern(\n node: ArrayPattern | Identifier | MemberExpression | ObjectPattern\n ): void {\n switch (node.type) {\n case \"Identifier\":\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"ArrayPattern\":\n for (const element of node.elements) {\n if (element !== null) {\n this.visitBindingElement(element);\n }\n }\n return;\n case \"ObjectPattern\":\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.visitBindingPattern(property.argument);\n continue;\n }\n this.visitAssignmentProperty(property);\n }\n return;\n }\n }\n\n private visitAssignmentProperty(node: AssignmentProperty): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitBindingElement(node.value);\n }\n\n private visitAssignmentTarget(\n node: AssignmentExpression[\"left\"] | AssignmentPattern | RestElement\n ): void {\n switch (node.type) {\n case \"AssignmentPattern\":\n this.visitAssignmentTarget(node.left);\n this.visitExpression(node.right);\n return;\n case \"RestElement\":\n this.visitAssignmentTarget(node.argument);\n return;\n case \"Identifier\":\n this.visitIdentifier(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"ArrayPattern\":\n for (const element of node.elements) {\n if (element === null) {\n continue;\n }\n this.visitAssignmentTarget(element);\n }\n return;\n case \"ObjectPattern\":\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.visitAssignmentTarget(property);\n continue;\n }\n if (property.computed) {\n this.visitExpression(property.key);\n }\n this.visitAssignmentTarget(property.value);\n }\n return;\n }\n }\n\n private visitIdentifier(node: Identifier): void {\n if (this.resolveBinding(node.name) !== undefined) {\n return;\n }\n\n if (this.allowedGlobals.has(node.name)) {\n return;\n }\n\n const visibleNames = this.collectVisibleNames();\n const nearMatches = this.collectSuggestionNames(visibleNames)\n .map((name) => ({ distance: getLevenshteinDistance(node.name, name), name }))\n .filter((entry) => entry.distance <= 2)\n .sort((left, right) => left.distance - right.distance || left.name.localeCompare(right.name))\n .map((entry) => entry.name);\n\n const message =\n nearMatches.length > 0\n ? `Unknown identifier '${node.name}'. ${formatNearMatchMessage(nearMatches)}`\n : `Unknown identifier '${node.name}'. ${formatVisibleNamesMessage(visibleNames)}`;\n\n this.diagnostics.push({\n code: \"AS003\",\n severity: \"error\",\n message,\n filename: this.filename,\n line: node.span.start.line,\n column: node.span.start.column,\n span: node.span\n });\n }\n\n private withScope(bindings: Binding[], visit: () => void): void {\n const scope: Scope = new Map();\n for (const binding of bindings) {\n scope.set(binding.name, binding);\n }\n this.scopes.push(scope);\n visit();\n this.scopes.pop();\n }\n\n private resolveBinding(name: string): Binding | undefined {\n for (let index = this.scopes.length - 1; index >= 0; index -= 1) {\n const binding = this.scopes[index]?.get(name);\n if (binding !== undefined) {\n return binding;\n }\n }\n return undefined;\n }\n\n private collectVisibleNames(): string[] {\n const names = new Set<string>();\n\n for (let index = this.scopes.length - 1; index >= 0; index -= 1) {\n for (const name of this.scopes[index]?.keys() ?? []) {\n names.add(name);\n }\n }\n\n return [...names].sort((left, right) => left.localeCompare(right));\n }\n\n private collectSuggestionNames(visibleNames: readonly string[]): string[] {\n const names = new Set([...visibleNames, ...this.allowedGlobals]);\n return [...names].sort((left, right) => left.localeCompare(right));\n }\n\n private collectModuleBindings(body: Statement[]): Binding[] {\n const bindings: Binding[] = [];\n for (const declaration of hoistedVarDeclarations(body)) {\n bindings.push(...this.collectDeclarationBindings(declaration));\n }\n for (const statement of body) {\n if (statement.type === \"ExportDefaultDeclaration\" && (statement.declaration.type === \"ClassDeclaration\" || statement.declaration.type === \"FunctionDeclaration\") && statement.declaration.id !== undefined) {\n bindings.push({ kind: \"let\", name: statement.declaration.id.name });\n continue;\n }\n if (statement.type === \"ImportDeclaration\") {\n bindings.push(...this.collectImportBindings(statement));\n continue;\n }\n if ((statement.type === \"FunctionDeclaration\" || statement.type === \"ClassDeclaration\") && statement.id !== undefined) {\n bindings.push({ kind: \"let\", name: statement.id.name });\n continue;\n }\n if (statement.type === \"VariableDeclaration\" && statement.kind !== \"var\") {\n bindings.push(...this.collectDeclarationBindings(statement));\n continue;\n }\n if (statement.type === \"ExportNamedDeclaration\") {\n bindings.push(...this.collectDeclarationBindings(statement.declaration));\n }\n }\n return bindings;\n }\n\n private collectBlockBindings(body: Statement[]): Binding[] {\n const bindings: Binding[] = [];\n for (const statement of body) {\n if ((statement.type === \"FunctionDeclaration\" || statement.type === \"ClassDeclaration\") && statement.id !== undefined) {\n bindings.push({ kind: \"let\", name: statement.id.name });\n }\n if (statement.type === \"VariableDeclaration\" && statement.kind !== \"var\") {\n bindings.push(...this.collectDeclarationBindings(statement));\n }\n }\n return bindings;\n }\n\n private collectParameterBindings(node: FunctionNode): Binding[] {\n const bindings: Binding[] = [];\n if (node.type !== \"ArrowFunctionExpression\") {\n bindings.push({ kind: \"let\", name: \"arguments\" });\n if (node.type === \"FunctionExpression\" && node.id !== undefined) {\n bindings.push({ kind: \"const\", name: node.id.name });\n }\n }\n for (const parameter of node.params) {\n this.collectBindingNamesFromElement(parameter, \"param\", bindings);\n }\n return bindings;\n }\n\n private collectDeclarationBindings(node: VariableDeclaration): Binding[] {\n const bindings: Binding[] = [];\n for (const declarator of node.declarations) {\n this.collectBindingNamesFromPattern(declarator.id, node.kind, bindings);\n }\n return bindings;\n }\n\n private collectCatchBindings(node: CatchClause): Binding[] {\n const bindings: Binding[] = [];\n if (node.param !== undefined) {\n this.collectBindingNamesFromPattern(node.param, \"let\", bindings);\n }\n return bindings;\n }\n\n private collectImportBindings(node: ImportDeclaration): Binding[] {\n const bindings: Binding[] = [];\n for (const specifier of node.specifiers) {\n bindings.push({ kind: \"import\", name: specifier.local.name });\n }\n return bindings;\n }\n\n private collectBindingNamesFromElement(\n node:\n | AssignmentPattern\n | ArrayPattern\n | Identifier\n | MemberExpression\n | ObjectPattern\n | RestElement,\n kind: BindingKind,\n bindings: Binding[]\n ): void {\n switch (node.type) {\n case \"AssignmentPattern\":\n this.collectBindingNamesFromPattern(node.left, kind, bindings);\n return;\n case \"RestElement\":\n this.collectBindingNamesFromPattern(node.argument, kind, bindings);\n return;\n default:\n this.collectBindingNamesFromPattern(node, kind, bindings);\n return;\n }\n }\n\n private collectBindingNamesFromPattern(\n node: ArrayPattern | Identifier | MemberExpression | ObjectPattern,\n kind: BindingKind,\n bindings: Binding[]\n ): void {\n switch (node.type) {\n case \"Identifier\":\n bindings.push({ kind, name: node.name });\n return;\n case \"MemberExpression\":\n return;\n case \"ArrayPattern\":\n for (const element of node.elements) {\n if (element !== null) {\n this.collectBindingNamesFromElement(element, kind, bindings);\n }\n }\n return;\n case \"ObjectPattern\":\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.collectBindingNamesFromPattern(property.argument, kind, bindings);\n continue;\n }\n this.collectBindingNamesFromElement(property.value, kind, bindings);\n }\n return;\n }\n }\n}\n\nfunction formatNearMatchMessage(names: string[]): string {\n if (names.length === 1) {\n return `Did you mean '${names[0]}'?`;\n }\n\n return `Did you mean one of: ${names.map((name) => `'${name}'`).join(\", \")}?`;\n}\n\nfunction formatVisibleNamesMessage(names: string[]): string {\n if (names.length === 0) {\n return \"No names are in scope.\";\n }\n\n return `In-scope names: ${names.join(\", \")}.`;\n}\n\nfunction getLevenshteinDistance(left: string, right: string): number {\n const previous = Array.from({ length: right.length + 1 }, (_, index) => index);\n const current = new Array<number>(right.length + 1);\n\n for (let row = 1; row <= left.length; row += 1) {\n current[0] = row;\n for (let column = 1; column <= right.length; column += 1) {\n const substitutionCost = left[row - 1] === right[column - 1] ? 0 : 1;\n current[column] = Math.min(\n current[column - 1]! + 1,\n previous[column]! + 1,\n previous[column - 1]! + substitutionCost\n );\n }\n\n for (let column = 0; column <= right.length; column += 1) {\n previous[column] = current[column]!;\n }\n }\n\n return previous[right.length]!;\n}\n", "import { parseModule, type ImportDeclaration } from \"../../parse/parser.js\";\n\nexport type ModuleRegistration =\n | readonly string[]\n | {\n exports?: readonly string[] | LintModuleExports;\n filename?: string;\n source?: string;\n };\n\nexport type Modules = ReadonlyMap<string, ModuleRegistration> | Record<string, ModuleRegistration>;\nexport type LintModuleExport =\n | string\n | {\n async?: boolean;\n type?: string;\n };\nexport type LintModuleExports =\n | ReadonlyMap<string, LintModuleExport>\n | Record<string, LintModuleExport>;\nexport type ModuleExportTypes = LintModuleExports;\n\nexport type NormalizedModuleRegistration = {\n asyncExports: ReadonlySet<string>;\n exports: string[];\n exportTypes: ReadonlyMap<string, string>;\n filename?: string;\n source?: string;\n};\n\nexport type SafeJSSourceModule = {\n moduleName: string;\n exports: readonly string[];\n filename: string;\n source: string;\n};\n\nexport function collectImportDeclarations(source: string, filename: string): ImportDeclaration[] {\n const module = parseModule(source, filename);\n return module.body.flatMap((statement) =>\n statement.type === \"ImportDeclaration\" ? [statement] : []\n );\n}\n\nexport function createUnknownModuleMessage(\n moduleName: string,\n moduleNames: readonly string[]\n): string {\n if (moduleNames.length === 0) {\n return `Unknown module '${moduleName}'. No modules are registered.`;\n }\n\n return `Unknown module '${moduleName}'. Available modules: ${moduleNames.join(\", \")}.`;\n}\n\nexport function createUnknownExportMessage(\n moduleName: string,\n exportName: string,\n availableExports: readonly string[]\n): string {\n if (availableExports.length === 0) {\n return `Module '${moduleName}' does not export '${exportName}'. The module exports nothing.`;\n }\n\n return `Module '${moduleName}' does not export '${exportName}'. Available exports: ${availableExports.join(\", \")}.`;\n}\n\nexport function normalizeModules(modules: Modules | undefined): Map<string, string[]> {\n return new Map(\n [...normalizeModuleRegistrations(modules).entries()].map(([moduleName, registration]) => [\n moduleName,\n registration.exports\n ])\n );\n}\n\nexport function normalizeModuleRegistrations(\n modules: Modules | undefined\n): Map<string, NormalizedModuleRegistration> {\n if (modules === undefined) {\n return new Map();\n }\n\n const entries = modules instanceof Map ? [...modules.entries()] : Object.entries(modules);\n const normalized = new Map<string, NormalizedModuleRegistration>();\n\n for (const [moduleName, registration] of entries) {\n normalized.set(moduleName, normalizeModuleRegistration(registration));\n }\n\n return normalized;\n}\n\nexport function collectSafeJSSourceModules(\n modules: Modules | undefined\n): Map<string, SafeJSSourceModule> {\n return new Map(\n [...normalizeModuleRegistrations(modules).entries()].flatMap(([moduleName, registration]) =>\n registration.filename !== undefined && registration.source !== undefined\n ? [\n {\n moduleName,\n exports: registration.exports,\n filename: registration.filename,\n source: registration.source\n } satisfies SafeJSSourceModule\n ].map((sourceModule) => [moduleName, sourceModule] as const)\n : []\n )\n );\n}\n\nexport function hasTypedModuleRegistrations(modules: Modules | undefined): boolean {\n return [...normalizeModuleRegistrations(modules).values()].some(\n (registration) => registration.exportTypes.size > 0\n );\n}\n\nfunction normalizeModuleRegistration(\n registration: ModuleRegistration\n): NormalizedModuleRegistration {\n if (isExportList(registration)) {\n return {\n asyncExports: new Set(),\n exports: dedupeAndSort(registration),\n exportTypes: new Map()\n };\n }\n\n const exports = registration.exports ?? [];\n\n return {\n asyncExports: isExportList(exports) ? new Set() : normalizeAsyncExports(exports),\n exports: dedupeAndSort(isExportList(exports) ? exports : listTypedExports(exports)),\n exportTypes: isExportList(exports) ? new Map() : normalizeExportTypes(exports),\n filename: registration.filename,\n source: registration.source\n };\n}\n\nfunction isExportList(registration: unknown): registration is readonly string[] {\n return Array.isArray(registration);\n}\n\nfunction dedupeAndSort(exportedNames: readonly string[]): string[] {\n return [...new Set(exportedNames)].sort((left, right) => left.localeCompare(right));\n}\n\nfunction listTypedExports(exports: LintModuleExports): string[] {\n return exports instanceof Map ? [...exports.keys()] : Object.keys(exports);\n}\n\nfunction normalizeExportTypes(exports: LintModuleExports): ReadonlyMap<string, string> {\n const entries = exports instanceof Map ? [...exports.entries()] : Object.entries(exports);\n\n return new Map(\n entries\n .flatMap(([exportName, metadata]) => {\n if (exportName.length === 0) {\n return [];\n }\n\n const type = typeof metadata === \"string\" ? metadata : metadata.type;\n return type === undefined ? [] : [[exportName, type] as const];\n })\n .sort(([left], [right]) => left.localeCompare(right))\n );\n}\n\nfunction normalizeAsyncExports(exports: LintModuleExports): ReadonlySet<string> {\n const entries = exports instanceof Map ? [...exports.entries()] : Object.entries(exports);\n\n return new Set(\n entries\n .filter(\n ([exportName, metadata]) =>\n exportName.length > 0 && typeof metadata !== \"string\" && metadata.async === true\n )\n .map(([exportName]) => exportName)\n .sort((left, right) => left.localeCompare(right))\n );\n}\n", "import type { SourceSpan } from \"../../parse/parser.js\";\nimport {\n collectImportDeclarations,\n createUnknownModuleMessage,\n normalizeModules,\n type Modules\n} from \"./module-registry.js\";\n\nexport type Diagnostic = {\n code: \"AS004\";\n severity: \"error\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n};\n\nexport function AS004(\n source: string,\n options: { filename?: string; modules?: Modules } = {}\n): Diagnostic[] {\n const filename = options.filename ?? \"<input>\";\n const modules = normalizeModules(options.modules);\n const moduleNames = [...modules.keys()].sort((left, right) => left.localeCompare(right));\n\n return collectImportDeclarations(source, filename).flatMap((declaration) => {\n if (modules.has(declaration.source.value)) {\n return [];\n }\n\n return [\n {\n code: \"AS004\" as const,\n severity: \"error\" as const,\n message: createUnknownModuleMessage(declaration.source.value, moduleNames),\n filename,\n line: declaration.source.span.start.line,\n column: declaration.source.span.start.column,\n span: declaration.source.span\n }\n ];\n });\n}\n", "import type { SourceSpan } from \"../../parse/parser.js\";\nimport {\n collectImportDeclarations,\n createUnknownExportMessage,\n normalizeModules,\n type Modules\n} from \"./module-registry.js\";\n\nexport type Diagnostic = {\n code: \"AS005\";\n severity: \"error\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n};\n\nexport function AS005(\n source: string,\n options: { filename?: string; modules?: Modules } = {}\n): Diagnostic[] {\n const filename = options.filename ?? \"<input>\";\n const modules = normalizeModules(options.modules);\n\n return collectImportDeclarations(source, filename).flatMap((declaration) => {\n const availableExports = modules.get(declaration.source.value);\n if (availableExports === undefined) {\n return [];\n }\n\n return declaration.specifiers.flatMap((specifier) => {\n if (specifier.type === \"ImportNamespaceSpecifier\") {\n return [];\n }\n\n const importName =\n specifier.type === \"ImportDefaultSpecifier\" ? \"default\" : specifier.imported.name;\n if (availableExports.includes(importName)) {\n return [];\n }\n\n const span =\n specifier.type === \"ImportDefaultSpecifier\"\n ? specifier.local.span\n : specifier.imported.span;\n\n return [\n {\n code: \"AS005\" as const,\n severity: \"error\" as const,\n message: createUnknownExportMessage(\n declaration.source.value,\n importName,\n availableExports\n ),\n filename,\n line: span.start.line,\n column: span.start.column,\n span\n }\n ];\n });\n });\n}\n", "import { visitClassElements } from \"../class-elements.js\";\nimport {\n type ClassNode,\n parseModule,\n type ArrayExpression,\n type ArrayPattern,\n type FunctionNode,\n type AssignmentExpression,\n type AssignmentPattern,\n type AssignmentProperty,\n type AwaitExpression,\n type BinaryExpression,\n type BlockStatement,\n type CallExpression,\n type CatchClause,\n type ConditionalExpression,\n type DoWhileStatement,\n type Expression,\n type ForInStatement,\n type ForOfStatement,\n type ForStatement,\n type Identifier,\n type IfStatement,\n type ImportDeclaration,\n type ImportDefaultSpecifier,\n type ImportNamespaceSpecifier,\n type ImportSpecifier,\n type LogicalExpression,\n type MemberExpression,\n type Module,\n type NewExpression,\n type ObjectExpression,\n type ObjectPattern,\n type Property,\n type RestElement,\n type SourceSpan,\n type SpreadElement,\n type Statement,\n type SwitchStatement,\n type TemplateLiteral,\n type ThrowStatement,\n type TryStatement,\n type UnaryExpression,\n type VariableDeclaration,\n type VariableDeclarator,\n type WhileStatement\n} from \"../../parse/parser.js\";\nimport { hoistedVarDeclarations } from \"../../parse/bindings.js\";\n\ntype DiagnosticCode = \"AS006\" | \"AS007\";\n\nexport type Diagnostic = {\n code: DiagnosticCode;\n severity: \"warning\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n};\n\ntype BindingKind = \"const\" | \"import\" | \"let\" | \"param\" | \"var\";\n\ntype Binding = {\n code?: DiagnosticCode;\n kind: BindingKind;\n message: string;\n name: string;\n reads: number;\n span: SourceSpan;\n};\n\ntype Scope = Map<string, Binding>;\n\nexport function AS006_007(source: string, options: { filename?: string } = {}): Diagnostic[] {\n return new AS006007Scanner(options.filename ?? \"<input>\").scan(source);\n}\n\nclass AS006007Scanner {\n private readonly diagnostics: Diagnostic[] = [];\n private readonly ignoredReads: Array<Set<Binding>> = [];\n private readonly scopes: Scope[] = [];\n\n constructor(private readonly filename: string) {}\n\n scan(source: string): Diagnostic[] {\n const module = parseModule(source, this.filename);\n this.visitModule(module);\n\n return this.diagnostics.sort(\n (left, right) =>\n left.span.start.offset - right.span.start.offset ||\n left.span.end.offset - right.span.end.offset ||\n left.code.localeCompare(right.code)\n );\n }\n\n private visitModule(node: Module): void {\n this.withScope(this.collectModuleBindings(node.body), () => {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n });\n }\n\n private visitStatement(node: Statement): void {\n if (node.type === \"ClassDeclaration\") {\n this.visitClass(node);\n return;\n }\n switch (node.type) {\n case \"FunctionDeclaration\":\n this.visitArrowFunction(node);\n return;\n case \"ExportNamedDeclaration\":\n this.visitVariableDeclaration(node.declaration);\n return;\n case \"ExportDefaultDeclaration\":\n if (node.declaration.type === \"ClassDeclaration\" || node.declaration.type === \"FunctionDeclaration\") this.visitStatement(node.declaration);\n else this.visitExpression(node.declaration);\n return;\n case \"BlockStatement\":\n this.visitBlock(node);\n return;\n case \"ExpressionStatement\":\n this.visitExpression(node.expression);\n return;\n case \"IfStatement\":\n this.visitIfStatement(node);\n return;\n case \"ForStatement\":\n this.visitForStatement(node);\n return;\n case \"ForInStatement\":\n case \"ForOfStatement\":\n this.visitForOfStatement(node);\n return;\n case \"WhileStatement\":\n case \"DoWhileStatement\":\n this.visitWhileStatement(node);\n return;\n case \"TryStatement\":\n this.visitTryStatement(node);\n return;\n case \"SwitchStatement\":\n this.visitSwitchStatement(node);\n return;\n case \"VariableDeclaration\":\n this.visitVariableDeclaration(node);\n return;\n case \"ReturnStatement\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"ThrowStatement\":\n this.visitThrowStatement(node);\n return;\n case \"ImportDeclaration\":\n case \"BreakStatement\":\n case \"ContinueStatement\":\n return;\n }\n }\n\n private visitBlock(node: BlockStatement, functionBody = false): void {\n const bindings = this.collectBlockBindings(node.body);\n if (functionBody) {\n for (const declaration of hoistedVarDeclarations(node.body)) {\n bindings.push(...this.collectDeclarationBindings(declaration));\n }\n }\n this.withScope(bindings, () => {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n });\n }\n\n private visitIfStatement(node: IfStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.consequent);\n if (node.alternate !== undefined) {\n this.visitStatement(node.alternate);\n }\n }\n\n private visitForStatement(node: ForStatement): void {\n const bindings =\n node.init?.type === \"VariableDeclaration\" && node.init.kind !== \"var\"\n ? this.collectDeclarationBindings(node.init)\n : [];\n\n this.withScope(bindings, () => {\n if (node.init !== undefined) {\n if (node.init.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.init);\n } else {\n this.visitExpression(node.init);\n }\n }\n if (node.test !== undefined) {\n this.visitExpression(node.test);\n }\n if (node.update !== undefined) {\n this.visitExpression(node.update);\n }\n this.visitStatement(node.body);\n });\n }\n\n private visitForOfStatement(node: ForInStatement | ForOfStatement): void {\n const bindings =\n node.left.type === \"VariableDeclaration\" && node.left.kind !== \"var\"\n ? this.collectDeclarationBindings(node.left)\n : [];\n\n this.withScope(bindings, () => {\n if (node.left.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.left);\n } else {\n this.visitAssignmentTarget(node.left);\n }\n this.visitExpression(node.right);\n this.visitStatement(node.body);\n });\n }\n\n private visitWhileStatement(node: WhileStatement | DoWhileStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.body);\n }\n\n private visitTryStatement(node: TryStatement): void {\n this.visitBlock(node.block);\n if (node.handler !== undefined) {\n this.visitCatchClause(node.handler);\n }\n if (node.finalizer !== undefined) {\n this.visitBlock(node.finalizer);\n }\n }\n\n private visitCatchClause(node: CatchClause): void {\n this.withScope(this.collectCatchBindings(node), () => {\n if (node.param !== undefined) {\n this.visitBindingPattern(node.param);\n }\n this.visitBlock(node.body);\n });\n }\n\n private visitSwitchStatement(node: SwitchStatement): void {\n this.visitExpression(node.discriminant);\n const statements = node.cases.flatMap((switchCase) => switchCase.consequent);\n this.withScope(this.collectBlockBindings(statements), () => {\n for (const switchCase of node.cases) {\n if (switchCase.test !== undefined) this.visitExpression(switchCase.test);\n for (const statement of switchCase.consequent) this.visitStatement(statement);\n }\n });\n }\n\n private visitThrowStatement(node: ThrowStatement): void {\n this.visitExpression(node.argument);\n }\n\n private visitVariableDeclaration(node: VariableDeclaration): void {\n for (const declarator of node.declarations) {\n this.visitVariableDeclarator(declarator);\n }\n }\n\n private visitVariableDeclarator(node: VariableDeclarator): void {\n this.visitBindingPattern(node.id);\n const init = node.init;\n if (init !== undefined) {\n this.withIgnoredReads(this.resolveBindings(this.collectPatternBindingNames(node.id)), () => {\n this.visitExpression(init);\n });\n }\n }\n\n private visitClass(node: ClassNode): void {\n this.withScope(node.id === undefined ? [] : [this.createBinding(node.id, \"param\")], () => {\n visitClassElements(node, expression => this.visitExpression(expression), block => this.visitBlock(block, true));\n });\n }\n\n private visitExpression(node: Expression): void {\n if (node.type === \"ClassExpression\") {\n this.visitClass(node);\n return;\n }\n switch (node.type) {\n case \"YieldExpression\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"Identifier\":\n this.markRead(node);\n return;\n case \"FunctionExpression\":\n case \"ArrowFunctionExpression\":\n this.visitArrowFunction(node);\n return;\n case \"ImportExpression\":\n this.visitExpression(node.source);\n if (node.options !== undefined) this.visitExpression(node.options);\n return;\n case \"AwaitExpression\":\n this.visitAwaitExpression(node);\n return;\n case \"ArrayExpression\":\n this.visitArrayExpression(node);\n return;\n case \"ObjectExpression\":\n this.visitObjectExpression(node);\n return;\n case \"UnaryExpression\":\n this.visitUnaryExpression(node);\n return;\n case \"BinaryExpression\":\n this.visitBinaryExpression(node);\n return;\n case \"LogicalExpression\":\n this.visitLogicalExpression(node);\n return;\n case \"ConditionalExpression\":\n this.visitConditionalExpression(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentExpression\":\n this.visitAssignmentExpression(node);\n return;\n case \"CallExpression\":\n case \"NewExpression\":\n this.visitCallExpression(node);\n return;\n case \"SequenceExpression\":\n for (const expression of node.expressions) this.visitExpression(expression);\n return;\n case \"UpdateExpression\":\n this.visitExpression(node.argument);\n return;\n case \"TaggedTemplateExpression\":\n this.visitExpression(node.tag);\n this.visitTemplateLiteral(node.quasi);\n return;\n case \"TemplateLiteral\":\n this.visitTemplateLiteral(node);\n return;\n case \"BooleanLiteral\":\n case \"NullLiteral\":\n case \"NumericLiteral\":\n case \"StringLiteral\":\n case \"UndefinedLiteral\":\n return;\n }\n }\n\n private visitArrowFunction(node: FunctionNode): void {\n this.withDeferredReads(() => {\n this.withScope(this.collectParameterBindings(node), () => {\n for (const parameter of node.params) {\n this.visitBindingElement(parameter);\n }\n\n if (node.body.type === \"BlockStatement\") {\n this.visitBlock(node.body, true);\n return;\n }\n\n this.visitExpression(node.body);\n });\n });\n }\n\n private visitAwaitExpression(node: AwaitExpression): void {\n this.visitExpression(node.argument);\n }\n\n private visitArrayExpression(node: ArrayExpression): void {\n for (const element of node.elements) {\n if (element?.type === \"SpreadElement\") {\n this.visitSpreadElement(element);\n continue;\n }\n if (element !== undefined) {\n this.visitExpression(element);\n }\n }\n }\n\n private visitObjectExpression(node: ObjectExpression): void {\n for (const property of node.properties) {\n if (property.type === \"SpreadElement\") {\n this.visitSpreadElement(property);\n continue;\n }\n this.visitProperty(property);\n }\n }\n\n private visitUnaryExpression(node: UnaryExpression): void {\n this.visitExpression(node.argument);\n }\n\n private visitBinaryExpression(node: BinaryExpression): void {\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n }\n\n private visitLogicalExpression(node: LogicalExpression): void {\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n }\n\n private visitConditionalExpression(node: ConditionalExpression): void {\n this.visitExpression(node.test);\n this.visitExpression(node.consequent);\n this.visitExpression(node.alternate);\n }\n\n private visitMemberExpression(node: MemberExpression): void {\n this.visitExpression(node.object);\n if (node.computed) {\n this.visitExpression(node.property);\n }\n }\n\n private visitAssignmentExpression(node: AssignmentExpression): void {\n this.visitAssignmentTarget(node.left);\n this.visitExpression(node.right);\n }\n\n private visitCallExpression(node: CallExpression | NewExpression): void {\n if (node.type === \"CallExpression\" && !node.optional && node.arguments.length > 0 &&\n node.callee.type === \"Identifier\" && node.callee.name === \"eval\") {\n // Direct eval may read any visible binding, even when its source is not a literal.\n for (const scope of this.scopes) {\n for (const binding of scope.values()) {\n if (this.resolveBinding(binding.name) === binding && !this.isIgnoredRead(binding)) {\n binding.reads += 1;\n }\n }\n }\n }\n this.visitExpression(node.callee);\n for (const argument of node.arguments) {\n if (argument.type === \"SpreadElement\") {\n this.visitSpreadElement(argument);\n continue;\n }\n this.visitExpression(argument);\n }\n }\n\n private visitTemplateLiteral(node: TemplateLiteral): void {\n for (const expression of node.expressions) {\n this.visitExpression(expression);\n }\n }\n\n private visitProperty(node: Property): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitExpression(node.value);\n }\n\n private visitSpreadElement(node: SpreadElement): void {\n this.visitExpression(node.argument);\n }\n\n private visitBindingElement(\n node:\n | AssignmentPattern\n | ArrayPattern\n | Identifier\n | MemberExpression\n | ObjectPattern\n | RestElement\n ): void {\n switch (node.type) {\n case \"AssignmentPattern\":\n this.visitBindingPattern(node.left);\n this.withIgnoredReads(\n this.resolveBindings(this.collectPatternBindingNames(node.left)),\n () => {\n this.visitExpression(node.right);\n }\n );\n return;\n case \"RestElement\":\n this.visitBindingPattern(node.argument);\n return;\n default:\n this.visitBindingPattern(node);\n return;\n }\n }\n\n private visitBindingPattern(\n node: ArrayPattern | Identifier | MemberExpression | ObjectPattern\n ): void {\n switch (node.type) {\n case \"Identifier\":\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"ArrayPattern\":\n for (const element of node.elements) {\n if (element !== null) {\n this.visitBindingElement(element);\n }\n }\n return;\n case \"ObjectPattern\":\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.visitBindingPattern(property.argument);\n continue;\n }\n this.visitAssignmentProperty(property);\n }\n return;\n }\n }\n\n private visitAssignmentProperty(node: AssignmentProperty): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitBindingElement(node.value);\n }\n\n private visitAssignmentTarget(\n node: AssignmentExpression[\"left\"] | AssignmentPattern | RestElement\n ): void {\n switch (node.type) {\n case \"AssignmentPattern\":\n this.visitAssignmentTarget(node.left);\n this.visitExpression(node.right);\n return;\n case \"RestElement\":\n this.visitAssignmentTarget(node.argument);\n return;\n case \"Identifier\":\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"ArrayPattern\":\n for (const element of node.elements) {\n if (element === null) {\n continue;\n }\n this.visitAssignmentTarget(element);\n }\n return;\n case \"ObjectPattern\":\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.visitAssignmentTarget(property);\n continue;\n }\n if (property.computed) {\n this.visitExpression(property.key);\n }\n this.visitAssignmentTarget(property.value);\n }\n return;\n }\n }\n\n private withScope(bindings: Binding[], visit: () => void): void {\n const scope: Scope = new Map();\n for (const binding of bindings) {\n scope.set(binding.name, binding);\n }\n\n this.scopes.push(scope);\n visit();\n this.reportUnreadBindings(scope);\n this.scopes.pop();\n }\n\n private reportUnreadBindings(scope: Scope): void {\n for (const binding of scope.values()) {\n if (binding.code === undefined || binding.reads > 0 || binding.name.startsWith(\"_\")) {\n continue;\n }\n\n this.diagnostics.push({\n code: binding.code,\n severity: \"warning\",\n message: binding.message,\n filename: this.filename,\n line: binding.span.start.line,\n column: binding.span.start.column,\n span: binding.span\n });\n }\n }\n\n private markRead(node: Identifier): void {\n const binding = this.resolveBinding(node.name);\n if (binding !== undefined && !this.isIgnoredRead(binding)) {\n binding.reads += 1;\n }\n }\n\n private isIgnoredRead(binding: Binding): boolean {\n for (let index = this.ignoredReads.length - 1; index >= 0; index -= 1) {\n if (this.ignoredReads[index]?.has(binding)) {\n return true;\n }\n }\n return false;\n }\n\n private resolveBinding(name: string): Binding | undefined {\n for (let index = this.scopes.length - 1; index >= 0; index -= 1) {\n const binding = this.scopes[index]?.get(name);\n if (binding !== undefined) {\n return binding;\n }\n }\n return undefined;\n }\n\n private collectModuleBindings(body: Statement[]): Binding[] {\n const bindings: Binding[] = [];\n for (const declaration of hoistedVarDeclarations(body)) {\n bindings.push(...this.collectDeclarationBindings(declaration));\n }\n\n for (const statement of body) {\n if (statement.type === \"ExportDefaultDeclaration\" && (statement.declaration.type === \"FunctionDeclaration\" || statement.declaration.type === \"ClassDeclaration\") && statement.declaration.id !== undefined) {\n bindings.push({ ...this.createBinding(statement.declaration.id, \"let\"), code: undefined });\n continue;\n }\n if (statement.type === \"ImportDeclaration\") {\n bindings.push(...this.collectImportBindings(statement));\n continue;\n }\n if ((statement.type === \"FunctionDeclaration\" || statement.type === \"ClassDeclaration\") && statement.id !== undefined) {\n bindings.push(this.createBinding(statement.id, \"let\"));\n continue;\n }\n if (statement.type === \"VariableDeclaration\" && statement.kind !== \"var\") {\n bindings.push(...this.collectDeclarationBindings(statement));\n continue;\n }\n if (statement.type === \"ExportNamedDeclaration\") {\n bindings.push(...this.collectExportDeclarationBindings(statement.declaration));\n }\n }\n\n return bindings;\n }\n\n private collectBlockBindings(body: Statement[]): Binding[] {\n const bindings: Binding[] = [];\n\n for (const statement of body) {\n if ((statement.type === \"FunctionDeclaration\" || statement.type === \"ClassDeclaration\") && statement.id !== undefined) {\n bindings.push(this.createBinding(statement.id, \"let\"));\n }\n if (statement.type === \"VariableDeclaration\" && statement.kind !== \"var\") {\n bindings.push(...this.collectDeclarationBindings(statement));\n }\n }\n\n return bindings;\n }\n\n private collectParameterBindings(node: FunctionNode): Binding[] {\n const bindings: Binding[] = [];\n\n if (node.type === \"FunctionExpression\" && node.id !== undefined) {\n bindings.push(this.createBinding(node.id, \"param\"));\n }\n\n for (const parameter of node.params) {\n this.collectBindingNamesFromElement(parameter, \"param\", bindings);\n }\n\n return bindings;\n }\n\n private collectDeclarationBindings(node: VariableDeclaration): Binding[] {\n const bindings: Binding[] = [];\n\n for (const declarator of node.declarations) {\n this.collectBindingNamesFromPattern(declarator.id, node.kind, bindings);\n }\n\n return bindings;\n }\n\n private collectExportDeclarationBindings(node: VariableDeclaration): Binding[] {\n return this.collectDeclarationBindings(node).map((binding) => ({\n ...binding,\n code: undefined\n }));\n }\n\n private collectCatchBindings(node: CatchClause): Binding[] {\n const bindings: Binding[] = [];\n\n if (node.param !== undefined) {\n this.collectBindingNamesFromPattern(node.param, \"param\", bindings);\n }\n\n return bindings;\n }\n\n private collectImportBindings(node: ImportDeclaration): Binding[] {\n return node.specifiers.map((specifier) => this.createImportBinding(specifier));\n }\n\n private createImportBinding(\n specifier: ImportDefaultSpecifier | ImportNamespaceSpecifier | ImportSpecifier\n ): Binding {\n return {\n kind: \"import\",\n message: `Import '${specifier.local.name}' is never referenced.`,\n name: specifier.local.name,\n reads: 0,\n span: specifier.local.span\n };\n }\n\n private collectBindingNamesFromElement(\n node:\n | AssignmentPattern\n | ArrayPattern\n | Identifier\n | MemberExpression\n | ObjectPattern\n | RestElement,\n kind: BindingKind,\n bindings: Binding[]\n ): void {\n switch (node.type) {\n case \"AssignmentPattern\":\n this.collectBindingNamesFromPattern(node.left, kind, bindings);\n return;\n case \"RestElement\":\n this.collectBindingNamesFromPattern(node.argument, kind, bindings);\n return;\n default:\n this.collectBindingNamesFromPattern(node, kind, bindings);\n return;\n }\n }\n\n private collectBindingNamesFromPattern(\n node: ArrayPattern | Identifier | MemberExpression | ObjectPattern,\n kind: BindingKind,\n bindings: Binding[]\n ): void {\n switch (node.type) {\n case \"Identifier\":\n bindings.push(this.createBinding(node, kind));\n return;\n case \"MemberExpression\":\n return;\n case \"ArrayPattern\":\n for (const element of node.elements) {\n if (element !== null) {\n this.collectBindingNamesFromElement(element, kind, bindings);\n }\n }\n return;\n case \"ObjectPattern\":\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.collectBindingNamesFromPattern(property.argument, kind, bindings);\n continue;\n }\n this.collectBindingNamesFromElement(property.value, kind, bindings);\n }\n return;\n }\n }\n\n private createBinding(node: Identifier, kind: BindingKind): Binding {\n return {\n code: kind === \"const\" || kind === \"let\" ? \"AS007\" : undefined,\n kind,\n message: `Binding '${node.name}' is declared but never read.`,\n name: node.name,\n reads: 0,\n span: node.span\n };\n }\n\n private collectPatternBindingNames(\n node: ArrayPattern | Identifier | MemberExpression | ObjectPattern\n ): string[] {\n const names: string[] = [];\n this.collectBindingNames(node, names);\n return names;\n }\n\n private collectBindingNames(\n node:\n | AssignmentPattern\n | ArrayPattern\n | Identifier\n | MemberExpression\n | ObjectPattern\n | RestElement,\n names: string[]\n ): void {\n switch (node.type) {\n case \"AssignmentPattern\":\n this.collectBindingNames(node.left, names);\n return;\n case \"RestElement\":\n this.collectBindingNames(node.argument, names);\n return;\n case \"Identifier\":\n names.push(node.name);\n return;\n case \"MemberExpression\":\n return;\n case \"ArrayPattern\":\n for (const element of node.elements) {\n if (element !== null) {\n this.collectBindingNames(element, names);\n }\n }\n return;\n case \"ObjectPattern\":\n for (const property of node.properties) {\n this.collectBindingNames(\n property.type === \"RestElement\" ? property.argument : property.value,\n names\n );\n }\n return;\n }\n }\n\n private resolveBindings(names: string[]): Binding[] {\n return names.flatMap((name) => {\n const binding = this.resolveBinding(name);\n return binding === undefined ? [] : [binding];\n });\n }\n\n private withIgnoredReads(bindings: Binding[], visit: () => void): void {\n if (bindings.length === 0) {\n visit();\n return;\n }\n\n this.ignoredReads.push(new Set(bindings));\n visit();\n this.ignoredReads.pop();\n }\n\n private withDeferredReads(visit: () => void): void {\n const ignoredReads = this.ignoredReads.splice(0);\n visit();\n this.ignoredReads.push(...ignoredReads);\n }\n}\n", "import { visitClassElements } from \"../class-elements.js\";\nimport {\n type ClassNode,\n parseModule,\n type ArrayExpression,\n type ArrayPattern,\n type FunctionNode,\n type AssignmentExpression,\n type AssignmentPattern,\n type CatchClause,\n type CallExpression,\n type ConditionalExpression,\n type DoWhileStatement,\n type Expression,\n type ForInStatement,\n type ForOfStatement,\n type ForStatement,\n type Identifier,\n type IfStatement,\n type ImportDeclaration,\n type ImportDefaultSpecifier,\n type ImportNamespaceSpecifier,\n type ImportSpecifier,\n type LogicalExpression,\n type MemberExpression,\n type Module,\n type ObjectExpression,\n type ObjectPattern,\n type Property,\n type RestElement,\n type ReturnStatement,\n type SourceSpan,\n type Statement,\n type TemplateLiteral,\n type ThrowStatement,\n type TryStatement,\n type UnaryExpression,\n type VariableDeclaration,\n type VariableDeclarator,\n type WhileStatement\n} from \"../../parse/parser.js\";\n\nexport type Diagnostic = {\n code: \"AS009\";\n severity: \"error\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n};\n\ntype BindingKind = \"import\" | \"namespace\" | \"local\";\ntype Scope = Map<string, BindingKind>;\n\nconst MESSAGE =\n \"Async arrow returns a host call without awaiting it. Add 'await' or document that this function intentionally returns a Promise.\";\n\nexport function AS009(source: string, options: { filename?: string } = {}): Diagnostic[] {\n return new AS009Scanner(options.filename ?? \"<input>\").scan(source);\n}\n\nclass AS009Scanner {\n private readonly diagnostics: Diagnostic[] = [];\n private readonly scopes: Scope[] = [];\n private readonly functionStack: boolean[] = [];\n\n constructor(private readonly filename: string) {}\n\n scan(source: string): Diagnostic[] {\n const module = parseModule(source, this.filename);\n this.pushScope(this.collectModuleBindings(module));\n this.visitModule(module);\n this.popScope();\n return this.diagnostics;\n }\n\n private visitModule(node: Module): void {\n this.visitStatements(node.body);\n }\n\n private visitStatements(body: Statement[]): void {\n for (const statement of body) {\n this.visitStatement(statement);\n }\n }\n\n private visitStatement(node: Statement): void {\n if (node.type === \"ClassDeclaration\") {\n this.visitClass(node);\n return;\n }\n switch (node.type) {\n case \"FunctionDeclaration\":\n this.visitArrowFunction(node);\n return;\n case \"BlockStatement\":\n this.visitBlockStatement(node.body);\n return;\n case \"ExpressionStatement\":\n this.visitExpression(node.expression);\n return;\n case \"IfStatement\":\n this.visitIfStatement(node);\n return;\n case \"ForStatement\":\n this.visitForStatement(node);\n return;\n case \"ForInStatement\":\n case \"ForOfStatement\":\n this.visitForOfStatement(node);\n return;\n case \"WhileStatement\":\n case \"DoWhileStatement\":\n this.visitWhileStatement(node);\n return;\n case \"TryStatement\":\n this.visitTryStatement(node);\n return;\n case \"VariableDeclaration\":\n this.visitVariableDeclaration(node);\n return;\n case \"ReturnStatement\":\n this.visitReturnStatement(node);\n return;\n case \"ThrowStatement\":\n this.visitThrowStatement(node);\n return;\n case \"ExportNamedDeclaration\":\n this.visitVariableDeclaration(node.declaration);\n return;\n case \"ExportDefaultDeclaration\":\n if (node.declaration.type === \"ClassDeclaration\" || node.declaration.type === \"FunctionDeclaration\") this.visitStatement(node.declaration);\n else this.visitExpression(node.declaration);\n return;\n case \"ImportDeclaration\":\n case \"BreakStatement\":\n case \"ContinueStatement\":\n return;\n }\n }\n\n private visitBlockStatement(body: Statement[]): void {\n this.withScope(this.collectBlockBindings(body), () => {\n this.visitStatements(body);\n });\n }\n\n private visitIfStatement(node: IfStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.consequent);\n if (node.alternate !== undefined) {\n this.visitStatement(node.alternate);\n }\n }\n\n private visitForStatement(node: ForStatement): void {\n if (node.init !== undefined) {\n if (node.init.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.init);\n } else {\n this.visitExpression(node.init);\n }\n }\n if (node.test !== undefined) {\n this.visitExpression(node.test);\n }\n if (node.update !== undefined) {\n this.visitExpression(node.update);\n }\n this.visitStatement(node.body);\n }\n\n private visitForOfStatement(node: ForInStatement | ForOfStatement): void {\n if (node.left.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.left);\n } else {\n this.visitAssignmentTarget(node.left);\n }\n this.visitExpression(node.right);\n this.visitStatement(node.body);\n }\n\n private visitWhileStatement(node: WhileStatement | DoWhileStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.body);\n }\n\n private visitTryStatement(node: TryStatement): void {\n this.visitStatement(node.block);\n if (node.handler !== undefined) {\n this.visitCatchClause(node.handler);\n }\n if (node.finalizer !== undefined) {\n this.visitStatement(node.finalizer);\n }\n }\n\n private visitCatchClause(node: CatchClause): void {\n const scope = new Map<string, BindingKind>();\n if (node.param !== undefined) {\n this.collectBindingNamesFromPattern(node.param, scope);\n }\n\n this.withScope(scope, () => {\n this.visitBlockStatement(node.body.body);\n });\n }\n\n private visitReturnStatement(node: ReturnStatement): void {\n if (node.argument !== undefined) {\n if (this.isInsideAsyncArrow()) {\n this.reportMissingAwait(node.argument);\n }\n this.visitExpression(node.argument);\n }\n }\n\n private visitThrowStatement(node: ThrowStatement): void {\n this.visitExpression(node.argument);\n }\n\n private visitVariableDeclaration(node: VariableDeclaration): void {\n for (const declarator of node.declarations) {\n this.visitVariableDeclarator(declarator);\n }\n }\n\n private visitVariableDeclarator(node: VariableDeclarator): void {\n this.visitBindingElement(node.id);\n if (node.init !== undefined) {\n this.visitExpression(node.init);\n }\n }\n\n private visitClass(node: ClassNode): void {\n const scope: Scope = new Map();\n if (node.id !== undefined) scope.set(node.id.name, \"local\");\n this.withScope(scope, () => {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n });\n }\n\n private visitExpression(node: Expression): void {\n if (node.type === \"ClassExpression\") {\n this.visitClass(node);\n return;\n }\n switch (node.type) {\n case \"YieldExpression\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"FunctionExpression\":\n case \"ArrowFunctionExpression\":\n this.visitArrowFunction(node);\n return;\n case \"ImportExpression\":\n this.visitExpression(node.source);\n if (node.options !== undefined) this.visitExpression(node.options);\n return;\n case \"AwaitExpression\":\n this.visitExpression(node.argument);\n return;\n case \"ArrayExpression\":\n this.visitArrayExpression(node);\n return;\n case \"ObjectExpression\":\n this.visitObjectExpression(node);\n return;\n case \"UnaryExpression\":\n this.visitUnaryExpression(node);\n return;\n case \"BinaryExpression\":\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n return;\n case \"LogicalExpression\":\n this.visitLogicalExpression(node);\n return;\n case \"ConditionalExpression\":\n this.visitConditionalExpression(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentExpression\":\n this.visitAssignmentExpression(node);\n return;\n case \"CallExpression\":\n this.visitCallExpression(node);\n return;\n case \"TemplateLiteral\":\n this.visitTemplateLiteral(node);\n return;\n case \"Identifier\":\n case \"BooleanLiteral\":\n case \"NullLiteral\":\n case \"NumericLiteral\":\n case \"StringLiteral\":\n case \"UndefinedLiteral\":\n return;\n }\n }\n\n private visitArrowFunction(node: FunctionNode): void {\n const scope = new Map<string, BindingKind>();\n\n for (const parameter of node.params) {\n this.collectBindingNamesFromElement(parameter, scope);\n }\n\n if (node.body.type === \"BlockStatement\") {\n this.mergeScope(scope, this.collectBlockBindings(node.body.body));\n }\n\n this.functionStack.push(node.async);\n this.pushScope(scope);\n\n if (node.async && node.body.type !== \"BlockStatement\") {\n this.reportMissingAwait(node.body);\n }\n\n if (node.body.type === \"BlockStatement\") {\n this.visitStatements(node.body.body);\n } else {\n this.visitExpression(node.body);\n }\n\n this.popScope();\n this.functionStack.pop();\n }\n\n private visitArrayExpression(node: ArrayExpression): void {\n for (const element of node.elements) {\n if (element !== null) {\n if (element.type === \"SpreadElement\") {\n this.visitExpression(element.argument);\n } else {\n this.visitExpression(element);\n }\n }\n }\n }\n\n private visitObjectExpression(node: ObjectExpression): void {\n for (const property of node.properties) {\n if (property.type === \"SpreadElement\") {\n this.visitExpression(property.argument);\n continue;\n }\n\n this.visitProperty(property);\n }\n }\n\n private visitProperty(node: Property): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n\n this.visitExpression(node.value);\n }\n\n private visitUnaryExpression(node: UnaryExpression): void {\n this.visitExpression(node.argument);\n }\n\n private visitLogicalExpression(node: LogicalExpression): void {\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n }\n\n private visitConditionalExpression(node: ConditionalExpression): void {\n this.visitExpression(node.test);\n this.visitExpression(node.consequent);\n this.visitExpression(node.alternate);\n }\n\n private visitMemberExpression(node: MemberExpression): void {\n this.visitExpression(node.object);\n this.visitExpression(node.property);\n }\n\n private visitAssignmentExpression(node: AssignmentExpression): void {\n this.visitAssignmentTarget(node.left);\n this.visitExpression(node.right);\n }\n\n private visitCallExpression(node: CallExpression): void {\n this.visitExpression(node.callee);\n for (const arg of node.arguments) {\n if (arg.type === \"SpreadElement\") {\n this.visitExpression(arg.argument);\n } else {\n this.visitExpression(arg);\n }\n }\n }\n\n private visitTemplateLiteral(node: TemplateLiteral): void {\n for (const expression of node.expressions) {\n this.visitExpression(expression);\n }\n }\n\n private visitAssignmentTarget(\n node: AssignmentExpression[\"left\"] | AssignmentPattern | RestElement\n ): void {\n switch (node.type) {\n case \"Identifier\":\n case \"MetaProperty\":\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentPattern\":\n this.visitAssignmentTarget(node.left);\n this.visitExpression(node.right);\n return;\n case \"RestElement\":\n this.visitAssignmentTarget(node.argument);\n return;\n case \"ArrayPattern\":\n for (const element of node.elements) {\n if (element !== null) {\n this.visitAssignmentTarget(element);\n }\n }\n return;\n case \"ObjectPattern\":\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.visitAssignmentTarget(property.argument);\n continue;\n }\n\n if (property.computed) {\n this.visitExpression(property.key);\n }\n this.visitAssignmentTarget(property.value);\n }\n return;\n }\n }\n\n private visitBindingElement(\n node:\n | AssignmentPattern\n | ArrayPattern\n | Identifier\n | MemberExpression\n | ObjectPattern\n | RestElement\n ): void {\n switch (node.type) {\n case \"AssignmentPattern\":\n this.visitBindingElement(node.left);\n this.visitExpression(node.right);\n return;\n case \"RestElement\":\n this.visitBindingElement(node.argument);\n return;\n default:\n this.visitAssignmentTarget(node);\n return;\n }\n }\n\n private reportMissingAwait(node: Expression): void {\n if (node.type !== \"CallExpression\") {\n return;\n }\n\n if (!this.isHostCall(node)) {\n return;\n }\n\n this.diagnostics.push({\n code: \"AS009\",\n severity: \"error\",\n message: MESSAGE,\n filename: this.filename,\n line: node.span.start.line,\n column: node.span.start.column,\n span: node.span\n });\n }\n\n private isHostCall(node: CallExpression): boolean {\n const root = this.findRootIdentifier(node.callee);\n if (root === undefined) {\n return false;\n }\n\n const binding = this.resolveBinding(root.name);\n return binding === \"import\" || binding === \"namespace\";\n }\n\n private findRootIdentifier(node: Expression): Identifier | undefined {\n switch (node.type) {\n case \"Identifier\":\n return node;\n case \"MemberExpression\":\n return this.findRootIdentifier(node.object);\n default:\n return undefined;\n }\n }\n\n private isInsideAsyncArrow(): boolean {\n return this.functionStack[this.functionStack.length - 1] === true;\n }\n\n private resolveBinding(name: string): BindingKind | undefined {\n for (let index = this.scopes.length - 1; index >= 0; index -= 1) {\n const binding = this.scopes[index].get(name);\n if (binding !== undefined) {\n return binding;\n }\n }\n\n return undefined;\n }\n\n private collectModuleBindings(node: Module): Scope {\n const scope = this.collectBlockBindings(node.body);\n\n for (const statement of node.body) {\n if (statement.type === \"ImportDeclaration\") {\n this.mergeScope(scope, this.collectImportBindings(statement));\n }\n }\n\n return scope;\n }\n\n private collectBlockBindings(body: Statement[]): Scope {\n const scope = new Map<string, BindingKind>();\n\n for (const statement of body) {\n if (statement.type === \"ClassDeclaration\") scope.set(statement.id.name, \"local\");\n if (statement.type === \"VariableDeclaration\") {\n for (const declarator of statement.declarations) {\n this.collectBindingNamesFromPattern(declarator.id, scope);\n }\n }\n }\n\n return scope;\n }\n\n private collectImportBindings(node: ImportDeclaration): Scope {\n const scope = new Map<string, BindingKind>();\n\n for (const specifier of node.specifiers) {\n scope.set(specifier.local.name, this.getImportBindingKind(specifier));\n }\n\n return scope;\n }\n\n private getImportBindingKind(\n specifier: ImportDefaultSpecifier | ImportNamespaceSpecifier | ImportSpecifier\n ): BindingKind {\n return specifier.type === \"ImportNamespaceSpecifier\" ? \"namespace\" : \"import\";\n }\n\n private collectBindingNamesFromElement(\n node:\n | AssignmentPattern\n | ArrayPattern\n | Identifier\n | MemberExpression\n | ObjectPattern\n | RestElement,\n scope: Scope\n ): void {\n switch (node.type) {\n case \"AssignmentPattern\":\n this.collectBindingNamesFromPattern(node.left, scope);\n return;\n case \"RestElement\":\n this.collectBindingNamesFromPattern(node.argument, scope);\n return;\n default:\n this.collectBindingNamesFromPattern(node, scope);\n return;\n }\n }\n\n private collectBindingNamesFromPattern(\n node: ArrayPattern | Identifier | MemberExpression | ObjectPattern,\n scope: Scope\n ): void {\n switch (node.type) {\n case \"Identifier\":\n scope.set(node.name, \"local\");\n return;\n case \"MemberExpression\":\n return;\n case \"ArrayPattern\":\n for (const element of node.elements) {\n if (element !== null) {\n this.collectBindingNamesFromElement(element, scope);\n }\n }\n return;\n case \"ObjectPattern\":\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.collectBindingNamesFromPattern(property.argument, scope);\n continue;\n }\n\n this.collectBindingNamesFromElement(property.value, scope);\n }\n return;\n }\n }\n\n private withScope(scope: Scope, callback: () => void): void {\n this.pushScope(scope);\n try {\n callback();\n } finally {\n this.popScope();\n }\n }\n\n private pushScope(scope: Scope): void {\n this.scopes.push(scope);\n }\n\n private popScope(): void {\n this.scopes.pop();\n }\n\n private mergeScope(target: Scope, source: Scope): void {\n for (const [name, binding] of source) {\n target.set(name, binding);\n }\n }\n}\n", "import { visitClassElements } from \"../class-elements.js\";\nimport {\n parseModule,\n type ArrayExpression,\n type ArrayPattern,\n type FunctionNode,\n type AssignmentExpression,\n type AssignmentPattern,\n type AssignmentProperty,\n type AwaitExpression,\n type BinaryExpression,\n type BlockStatement,\n type CallExpression,\n type CatchClause,\n type ConditionalExpression,\n type DoWhileStatement,\n type Expression,\n type ForInStatement,\n type ForOfStatement,\n type ForStatement,\n type Identifier,\n type IfStatement,\n type ImportDeclaration,\n type ImportDefaultSpecifier,\n type ImportNamespaceSpecifier,\n type ImportSpecifier,\n type LogicalExpression,\n type MemberExpression,\n type Module,\n type ObjectExpression,\n type ObjectPattern,\n type Property,\n type RestElement,\n type SourceSpan,\n type SpreadElement,\n type Statement,\n type TemplateLiteral,\n type ThrowStatement,\n type TryStatement,\n type UnaryExpression,\n type VariableDeclaration,\n type VariableDeclarator,\n type WhileStatement\n} from \"../../parse/parser.js\";\n\nexport type Diagnostic = {\n code: \"AS010\";\n severity: \"warning\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n};\n\ntype Candidate = {\n kind: \"candidate\";\n name: string;\n reads: number;\n reassignments: number;\n span: SourceSpan;\n};\n\ntype ScopeEntry = Candidate | \"import\" | \"local\" | \"namespace\";\ntype Scope = Map<string, ScopeEntry>;\n\nexport function AS010(source: string, options: { filename?: string } = {}): Diagnostic[] {\n return new AS010Scanner(options.filename ?? \"<input>\").scan(source);\n}\n\nclass AS010Scanner {\n private readonly candidates: Candidate[] = [];\n private readonly ignoredReads: Array<Set<Candidate>> = [];\n private readonly scopes: Scope[] = [];\n\n constructor(private readonly filename: string) {}\n\n scan(source: string): Diagnostic[] {\n const module = parseModule(source, this.filename);\n const moduleScope = this.collectModuleBindings(module.body);\n\n this.withScope(moduleScope, () => {\n this.collectCandidates(module.body, moduleScope);\n });\n\n this.withScope(moduleScope, () => {\n this.visitModule(module);\n });\n\n return this.candidates\n .filter((candidate) => candidate.reads === 0 && candidate.reassignments === 0)\n .map((candidate) => ({\n code: \"AS010\" as const,\n severity: \"warning\" as const,\n message: `Top-level let '${candidate.name}' stores a host call result but is never read again.`,\n filename: this.filename,\n line: candidate.span.start.line,\n column: candidate.span.start.column,\n span: candidate.span\n }));\n }\n\n private visitModule(node: Module): void {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n }\n\n private visitStatement(node: Statement): void {\n if (node.type === \"ClassDeclaration\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"FunctionDeclaration\":\n this.visitArrowFunction(node);\n return;\n case \"BlockStatement\":\n this.visitBlock(node);\n return;\n case \"ExpressionStatement\":\n this.visitExpression(node.expression);\n return;\n case \"IfStatement\":\n this.visitIfStatement(node);\n return;\n case \"ForStatement\":\n this.visitForStatement(node);\n return;\n case \"ForInStatement\":\n case \"ForOfStatement\":\n this.visitForOfStatement(node);\n return;\n case \"WhileStatement\":\n case \"DoWhileStatement\":\n this.visitWhileStatement(node);\n return;\n case \"TryStatement\":\n this.visitTryStatement(node);\n return;\n case \"VariableDeclaration\":\n this.visitVariableDeclaration(node);\n return;\n case \"ReturnStatement\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"ThrowStatement\":\n this.visitThrowStatement(node);\n return;\n case \"ExportNamedDeclaration\":\n this.visitVariableDeclaration(node.declaration);\n return;\n case \"ExportDefaultDeclaration\":\n if (node.declaration.type === \"ClassDeclaration\" || node.declaration.type === \"FunctionDeclaration\") this.visitStatement(node.declaration);\n else this.visitExpression(node.declaration);\n return;\n case \"ImportDeclaration\":\n case \"BreakStatement\":\n case \"ContinueStatement\":\n return;\n }\n }\n\n private visitBlock(node: BlockStatement): void {\n this.withScope(this.collectBlockBindings(node.body), () => {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n });\n }\n\n private visitIfStatement(node: IfStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.consequent);\n if (node.alternate !== undefined) {\n this.visitStatement(node.alternate);\n }\n }\n\n private visitForStatement(node: ForStatement): void {\n const scope =\n node.init?.type === \"VariableDeclaration\"\n ? this.collectDeclarationBindings(node.init)\n : new Map();\n\n this.withScope(scope, () => {\n if (node.init !== undefined) {\n if (node.init.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.init);\n } else {\n this.visitExpression(node.init);\n }\n }\n if (node.test !== undefined) {\n this.visitExpression(node.test);\n }\n if (node.update !== undefined) {\n this.visitExpression(node.update);\n }\n this.visitStatement(node.body);\n });\n }\n\n private visitForOfStatement(node: ForInStatement | ForOfStatement): void {\n const scope =\n node.left.type === \"VariableDeclaration\"\n ? this.collectDeclarationBindings(node.left)\n : new Map();\n\n this.withScope(scope, () => {\n if (node.left.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.left);\n } else {\n this.visitAssignmentTarget(node.left);\n }\n this.visitExpression(node.right);\n this.visitStatement(node.body);\n });\n }\n\n private visitWhileStatement(node: WhileStatement | DoWhileStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.body);\n }\n\n private visitTryStatement(node: TryStatement): void {\n this.visitBlock(node.block);\n if (node.handler !== undefined) {\n this.visitCatchClause(node.handler);\n }\n if (node.finalizer !== undefined) {\n this.visitBlock(node.finalizer);\n }\n }\n\n private visitCatchClause(node: CatchClause): void {\n this.withScope(this.collectCatchBindings(node), () => {\n if (node.param !== undefined) {\n this.visitBindingPattern(node.param);\n }\n this.visitBlock(node.body);\n });\n }\n\n private visitThrowStatement(node: ThrowStatement): void {\n this.visitExpression(node.argument);\n }\n\n private visitVariableDeclaration(node: VariableDeclaration): void {\n for (const declarator of node.declarations) {\n this.visitVariableDeclarator(declarator);\n }\n }\n\n private visitVariableDeclarator(node: VariableDeclarator): void {\n this.visitBindingPattern(node.id);\n if (node.init === undefined) {\n return;\n }\n const init = node.init;\n\n this.withIgnoredReads(this.resolveCandidates(this.collectPatternBindingNames(node.id)), () => {\n this.visitExpression(init);\n });\n }\n\n private visitExpression(node: Expression): void {\n if (node.type === \"ClassExpression\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"YieldExpression\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"Identifier\":\n this.markRead(node);\n return;\n case \"FunctionExpression\":\n case \"ArrowFunctionExpression\":\n this.visitArrowFunction(node);\n return;\n case \"ImportExpression\":\n this.visitExpression(node.source);\n if (node.options !== undefined) this.visitExpression(node.options);\n return;\n case \"AwaitExpression\":\n this.visitAwaitExpression(node);\n return;\n case \"ArrayExpression\":\n this.visitArrayExpression(node);\n return;\n case \"ObjectExpression\":\n this.visitObjectExpression(node);\n return;\n case \"UnaryExpression\":\n this.visitUnaryExpression(node);\n return;\n case \"BinaryExpression\":\n this.visitBinaryExpression(node);\n return;\n case \"LogicalExpression\":\n this.visitLogicalExpression(node);\n return;\n case \"ConditionalExpression\":\n this.visitConditionalExpression(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentExpression\":\n this.visitAssignmentExpression(node);\n return;\n case \"CallExpression\":\n this.visitCallExpression(node);\n return;\n case \"TemplateLiteral\":\n this.visitTemplateLiteral(node);\n return;\n case \"BooleanLiteral\":\n case \"NullLiteral\":\n case \"NumericLiteral\":\n case \"StringLiteral\":\n case \"UndefinedLiteral\":\n return;\n }\n }\n\n private visitArrowFunction(node: FunctionNode): void {\n const scope = this.collectParameterBindings(node);\n\n if (node.body.type === \"BlockStatement\") {\n this.mergeScope(scope, this.collectBlockBindings(node.body.body));\n }\n\n this.withScope(scope, () => {\n for (const parameter of node.params) {\n this.visitBindingElement(parameter);\n }\n\n if (node.body.type === \"BlockStatement\") {\n for (const statement of node.body.body) {\n this.visitStatement(statement);\n }\n return;\n }\n\n this.visitExpression(node.body);\n });\n }\n\n private visitAwaitExpression(node: AwaitExpression): void {\n this.visitExpression(node.argument);\n }\n\n private visitArrayExpression(node: ArrayExpression): void {\n for (const element of node.elements) {\n if (element?.type === \"SpreadElement\") {\n this.visitSpreadElement(element);\n continue;\n }\n if (element !== undefined) {\n this.visitExpression(element);\n }\n }\n }\n\n private visitObjectExpression(node: ObjectExpression): void {\n for (const property of node.properties) {\n if (property.type === \"SpreadElement\") {\n this.visitSpreadElement(property);\n continue;\n }\n this.visitProperty(property);\n }\n }\n\n private visitUnaryExpression(node: UnaryExpression): void {\n this.visitExpression(node.argument);\n }\n\n private visitBinaryExpression(node: BinaryExpression): void {\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n }\n\n private visitLogicalExpression(node: LogicalExpression): void {\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n }\n\n private visitConditionalExpression(node: ConditionalExpression): void {\n this.visitExpression(node.test);\n this.visitExpression(node.consequent);\n this.visitExpression(node.alternate);\n }\n\n private visitMemberExpression(node: MemberExpression): void {\n this.visitExpression(node.object);\n if (node.computed) {\n this.visitExpression(node.property);\n }\n }\n\n private visitAssignmentExpression(node: AssignmentExpression): void {\n this.visitAssignmentTarget(node.left);\n this.visitExpression(node.right);\n }\n\n private visitCallExpression(node: CallExpression): void {\n this.visitExpression(node.callee);\n for (const argument of node.arguments) {\n if (argument.type === \"SpreadElement\") {\n this.visitSpreadElement(argument);\n continue;\n }\n this.visitExpression(argument);\n }\n }\n\n private visitTemplateLiteral(node: TemplateLiteral): void {\n for (const expression of node.expressions) {\n this.visitExpression(expression);\n }\n }\n\n private visitProperty(node: Property): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitExpression(node.value);\n }\n\n private visitSpreadElement(node: SpreadElement): void {\n this.visitExpression(node.argument);\n }\n\n private visitBindingElement(\n node:\n | AssignmentPattern\n | ArrayPattern\n | Identifier\n | MemberExpression\n | ObjectPattern\n | RestElement\n ): void {\n switch (node.type) {\n case \"AssignmentPattern\":\n this.visitBindingPattern(node.left);\n this.withIgnoredReads(\n this.resolveCandidates(this.collectPatternBindingNames(node.left)),\n () => {\n this.visitExpression(node.right);\n }\n );\n return;\n case \"RestElement\":\n this.visitBindingPattern(node.argument);\n return;\n default:\n this.visitBindingPattern(node);\n return;\n }\n }\n\n private visitBindingPattern(\n node: ArrayPattern | Identifier | MemberExpression | ObjectPattern\n ): void {\n switch (node.type) {\n case \"Identifier\":\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"ArrayPattern\":\n for (const element of node.elements) {\n if (element !== null) {\n this.visitBindingElement(element);\n }\n }\n return;\n case \"ObjectPattern\":\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.visitBindingPattern(property.argument);\n continue;\n }\n this.visitAssignmentProperty(property);\n }\n return;\n }\n }\n\n private visitAssignmentProperty(node: AssignmentProperty): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitBindingElement(node.value);\n }\n\n private visitAssignmentTarget(\n node: AssignmentExpression[\"left\"] | AssignmentPattern | RestElement\n ): void {\n switch (node.type) {\n case \"AssignmentPattern\":\n this.visitAssignmentTarget(node.left);\n this.visitExpression(node.right);\n return;\n case \"RestElement\":\n this.visitAssignmentTarget(node.argument);\n return;\n case \"Identifier\":\n this.markReassignment(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"ArrayPattern\":\n for (const element of node.elements) {\n if (element !== null) {\n this.visitAssignmentTarget(element);\n }\n }\n return;\n case \"ObjectPattern\":\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.visitAssignmentTarget(property);\n continue;\n }\n if (property.computed) {\n this.visitExpression(property.key);\n }\n this.visitAssignmentTarget(property.value);\n }\n return;\n }\n }\n\n private markRead(node: Identifier): void {\n const candidate = this.resolveCandidate(node.name);\n if (candidate !== undefined && !this.isIgnoredRead(candidate)) {\n candidate.reads += 1;\n }\n }\n\n private markReassignment(node: Identifier): void {\n const candidate = this.resolveCandidate(node.name);\n if (candidate !== undefined) {\n candidate.reassignments += 1;\n }\n }\n\n private isIgnoredRead(candidate: Candidate): boolean {\n for (let index = this.ignoredReads.length - 1; index >= 0; index -= 1) {\n if (this.ignoredReads[index]?.has(candidate)) {\n return true;\n }\n }\n return false;\n }\n\n private resolveCandidate(name: string): Candidate | undefined {\n for (let index = this.scopes.length - 1; index >= 0; index -= 1) {\n const entry = this.scopes[index]?.get(name);\n if (entry === undefined) {\n continue;\n }\n return typeof entry === \"object\" && entry.kind === \"candidate\" ? entry : undefined;\n }\n return undefined;\n }\n\n private collectModuleBindings(body: Statement[]): Scope {\n const scope: Scope = new Map();\n\n for (const statement of body) {\n if (statement.type === \"ImportDeclaration\") {\n this.mergeScope(scope, this.collectImportBindings(statement));\n continue;\n }\n\n if (statement.type === \"VariableDeclaration\") {\n this.mergeScope(scope, this.collectDeclarationBindings(statement));\n continue;\n }\n\n if (statement.type === \"ExportNamedDeclaration\") {\n this.mergeScope(scope, this.collectDeclarationBindings(statement.declaration));\n }\n }\n\n return scope;\n }\n\n private collectCandidates(body: Statement[], scope: Scope): void {\n for (const statement of body) {\n if (statement.type !== \"VariableDeclaration\" || statement.kind !== \"let\") {\n continue;\n }\n\n for (const declarator of statement.declarations) {\n if (declarator.id.type !== \"Identifier\") {\n continue;\n }\n\n const hostCall = this.findHostCall(declarator.init);\n if (hostCall === undefined || !this.isHostCall(hostCall)) {\n continue;\n }\n\n const candidate: Candidate = {\n kind: \"candidate\",\n name: declarator.id.name,\n reads: 0,\n reassignments: 0,\n span: declarator.id.span\n };\n\n this.candidates.push(candidate);\n scope.set(candidate.name, candidate);\n }\n }\n }\n\n private collectBlockBindings(body: Statement[]): Scope {\n const scope: Scope = new Map();\n\n for (const statement of body) {\n if (statement.type === \"VariableDeclaration\") {\n this.mergeScope(scope, this.collectDeclarationBindings(statement));\n }\n }\n\n return scope;\n }\n\n private collectParameterBindings(node: FunctionNode): Scope {\n const scope: Scope = new Map();\n\n for (const parameter of node.params) {\n this.collectBindingNamesFromElement(parameter, scope);\n }\n\n return scope;\n }\n\n private collectDeclarationBindings(node: VariableDeclaration): Scope {\n const scope: Scope = new Map();\n\n for (const declarator of node.declarations) {\n this.collectBindingNamesFromPattern(declarator.id, scope);\n }\n\n return scope;\n }\n\n private collectCatchBindings(node: CatchClause): Scope {\n const scope: Scope = new Map();\n\n if (node.param !== undefined) {\n this.collectBindingNamesFromPattern(node.param, scope);\n }\n\n return scope;\n }\n\n private collectImportBindings(node: ImportDeclaration): Scope {\n const scope: Scope = new Map();\n\n for (const specifier of node.specifiers) {\n scope.set(specifier.local.name, this.getImportBindingKind(specifier));\n }\n\n return scope;\n }\n\n private getImportBindingKind(\n specifier: ImportDefaultSpecifier | ImportNamespaceSpecifier | ImportSpecifier\n ): ScopeEntry {\n return specifier.type === \"ImportNamespaceSpecifier\" ? \"namespace\" : \"import\";\n }\n\n private collectBindingNamesFromElement(\n node:\n | AssignmentPattern\n | ArrayPattern\n | Identifier\n | MemberExpression\n | ObjectPattern\n | RestElement,\n scope: Scope\n ): void {\n switch (node.type) {\n case \"AssignmentPattern\":\n this.collectBindingNamesFromPattern(node.left, scope);\n return;\n case \"RestElement\":\n this.collectBindingNamesFromPattern(node.argument, scope);\n return;\n default:\n this.collectBindingNamesFromPattern(node, scope);\n return;\n }\n }\n\n private collectBindingNamesFromPattern(\n node: ArrayPattern | Identifier | MemberExpression | ObjectPattern,\n scope: Scope\n ): void {\n switch (node.type) {\n case \"Identifier\":\n scope.set(node.name, \"local\");\n return;\n case \"MemberExpression\":\n return;\n case \"ArrayPattern\":\n for (const element of node.elements) {\n if (element !== null) {\n this.collectBindingNamesFromElement(element, scope);\n }\n }\n return;\n case \"ObjectPattern\":\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.collectBindingNamesFromPattern(property.argument, scope);\n continue;\n }\n this.collectBindingNamesFromElement(property.value, scope);\n }\n return;\n }\n }\n\n private collectPatternBindingNames(\n node: ArrayPattern | Identifier | MemberExpression | ObjectPattern\n ): string[] {\n const names: string[] = [];\n this.collectBindingNames(node, names);\n return names;\n }\n\n private collectBindingNames(\n node:\n | AssignmentPattern\n | ArrayPattern\n | Identifier\n | MemberExpression\n | ObjectPattern\n | RestElement,\n names: string[]\n ): void {\n switch (node.type) {\n case \"AssignmentPattern\":\n this.collectBindingNames(node.left, names);\n return;\n case \"RestElement\":\n this.collectBindingNames(node.argument, names);\n return;\n case \"Identifier\":\n names.push(node.name);\n return;\n case \"MemberExpression\":\n return;\n case \"ArrayPattern\":\n for (const element of node.elements) {\n if (element !== null) {\n this.collectBindingNames(element, names);\n }\n }\n return;\n case \"ObjectPattern\":\n for (const property of node.properties) {\n this.collectBindingNames(\n property.type === \"RestElement\" ? property.argument : property.value,\n names\n );\n }\n return;\n }\n }\n\n private resolveCandidates(names: string[]): Candidate[] {\n return names.flatMap((name) => {\n const candidate = this.resolveCandidate(name);\n return candidate === undefined ? [] : [candidate];\n });\n }\n\n private withIgnoredReads(candidates: Candidate[], visit: () => void): void {\n if (candidates.length === 0) {\n visit();\n return;\n }\n\n this.ignoredReads.push(new Set(candidates));\n try {\n visit();\n } finally {\n this.ignoredReads.pop();\n }\n }\n\n private withScope(scope: Scope, visit: () => void): void {\n this.scopes.push(scope);\n try {\n visit();\n } finally {\n this.scopes.pop();\n }\n }\n\n private mergeScope(target: Scope, source: Scope): void {\n for (const [name, binding] of source) {\n target.set(name, binding);\n }\n }\n\n private findHostCall(node: Expression | undefined): CallExpression | undefined {\n if (node === undefined) {\n return undefined;\n }\n\n if (node.type === \"CallExpression\") {\n return node;\n }\n\n if (node.type === \"AwaitExpression\" && node.argument.type === \"CallExpression\") {\n return node.argument;\n }\n\n return undefined;\n }\n\n private isHostCall(node: CallExpression): boolean {\n const root = this.findRootIdentifier(node.callee);\n if (root === undefined) {\n return false;\n }\n\n for (let index = this.scopes.length - 1; index >= 0; index -= 1) {\n const binding = this.scopes[index]?.get(root.name);\n if (binding === undefined) {\n continue;\n }\n return binding === \"import\" || binding === \"namespace\";\n }\n\n return false;\n }\n\n private findRootIdentifier(node: Expression): Identifier | undefined {\n switch (node.type) {\n case \"Identifier\":\n return node;\n case \"MemberExpression\":\n return this.findRootIdentifier(node.object);\n default:\n return undefined;\n }\n }\n}\n", "import {\n parseModule,\n type ArrayPattern,\n type AssignmentPattern,\n type Identifier,\n type MemberExpression,\n type ObjectPattern,\n type RestElement,\n type SourceSpan,\n type VariableDeclaration\n} from \"../../parse/parser.js\";\nimport { normalizeModules, type Modules } from \"./module-registry.js\";\n\nexport type Diagnostic = {\n code: \"AS013\";\n severity: \"error\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n};\n\nexport function AS013(\n source: string,\n options: { allowedExportNames?: readonly string[]; filename?: string; modules?: Modules } = {}\n): Diagnostic[] {\n const filename = options.filename ?? \"<input>\";\n const reservedNames = new Set(normalizeModules(options.modules).keys());\n const allowedExportNames = new Set(options.allowedExportNames ?? []);\n\n if (reservedNames.size === 0) {\n return [];\n }\n\n const diagnostics: Diagnostic[] = [];\n const module = parseModule(source, filename);\n\n for (const statement of module.body) {\n if (statement.type === \"VariableDeclaration\") {\n collectShadowedBindings(statement, reservedNames, diagnostics, filename);\n continue;\n }\n\n if (statement.type === \"ExportNamedDeclaration\") {\n collectShadowedBindings(\n statement.declaration,\n reservedNames,\n diagnostics,\n filename,\n allowedExportNames\n );\n }\n }\n\n return diagnostics;\n}\n\nfunction collectShadowedBindings(\n declaration: VariableDeclaration,\n reservedNames: ReadonlySet<string>,\n diagnostics: Diagnostic[],\n filename: string,\n allowedNames: ReadonlySet<string> = new Set()\n): void {\n for (const declarator of declaration.declarations) {\n collectPatternDiagnostics(declarator.id, reservedNames, diagnostics, filename, allowedNames);\n }\n}\n\nfunction collectPatternDiagnostics(\n pattern:\n | ArrayPattern\n | AssignmentPattern\n | Identifier\n | MemberExpression\n | ObjectPattern\n | RestElement,\n reservedNames: ReadonlySet<string>,\n diagnostics: Diagnostic[],\n filename: string,\n allowedNames: ReadonlySet<string>\n): void {\n switch (pattern.type) {\n case \"Identifier\":\n if (reservedNames.has(pattern.name) && !allowedNames.has(pattern.name)) {\n diagnostics.push({\n code: \"AS013\",\n severity: \"error\",\n message: `Top-level binding '${pattern.name}' shadows registered module '${pattern.name}'.`,\n filename,\n line: pattern.span.start.line,\n column: pattern.span.start.column,\n span: pattern.span\n });\n }\n return;\n case \"AssignmentPattern\":\n collectPatternDiagnostics(pattern.left, reservedNames, diagnostics, filename, allowedNames);\n return;\n case \"RestElement\":\n collectPatternDiagnostics(\n pattern.argument,\n reservedNames,\n diagnostics,\n filename,\n allowedNames\n );\n return;\n case \"ArrayPattern\":\n for (const element of pattern.elements) {\n if (element !== null) {\n collectPatternDiagnostics(element, reservedNames, diagnostics, filename, allowedNames);\n }\n }\n return;\n case \"ObjectPattern\":\n for (const property of pattern.properties) {\n collectPatternDiagnostics(\n property.type === \"RestElement\" ? property : property.value,\n reservedNames,\n diagnostics,\n filename,\n allowedNames\n );\n }\n return;\n case \"MemberExpression\":\n return;\n }\n}\n", "import { visitClassElements } from \"../class-elements.js\";\nimport {\n parseModule,\n type ArrayExpression,\n type ArrayPattern,\n type AssignmentPattern,\n type FunctionNode,\n type AssignmentExpression,\n type CatchClause,\n type CallExpression,\n type ConditionalExpression,\n type DoWhileStatement,\n type Expression,\n type ForInStatement,\n type ForOfStatement,\n type ForStatement,\n type Identifier,\n type IfStatement,\n type LogicalExpression,\n type MemberExpression,\n type Module,\n type ObjectExpression,\n type ObjectPattern,\n type Property,\n type RestElement,\n type ReturnStatement,\n type SourceSpan,\n type Statement,\n type TemplateLiteral,\n type ThrowStatement,\n type TryStatement,\n type UnaryExpression,\n type VariableDeclaration,\n type VariableDeclarator,\n type WhileStatement\n} from \"../../parse/parser.js\";\n\nexport type Diagnostic = {\n code: \"AS015\";\n severity: \"warning\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n};\n\nexport function AS015(source: string, options: { filename?: string } = {}): Diagnostic[] {\n return new AS015Scanner(options.filename ?? \"<input>\").scan(source);\n}\n\nclass AS015Scanner {\n private readonly diagnostics: Diagnostic[] = [];\n\n constructor(private readonly filename: string) {}\n\n scan(source: string): Diagnostic[] {\n this.visitModule(parseModule(source, this.filename));\n return this.diagnostics;\n }\n\n private visitModule(node: Module): void {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n }\n\n private visitStatement(node: Statement): void {\n if (node.type === \"ClassDeclaration\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"FunctionDeclaration\":\n this.visitArrowFunction(node);\n return;\n case \"BlockStatement\":\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n return;\n case \"ExpressionStatement\":\n this.visitExpression(node.expression);\n return;\n case \"IfStatement\":\n this.visitIfStatement(node);\n return;\n case \"ForStatement\":\n this.visitForStatement(node);\n return;\n case \"ForInStatement\":\n case \"ForOfStatement\":\n this.visitForOfStatement(node);\n return;\n case \"WhileStatement\":\n case \"DoWhileStatement\":\n this.visitWhileStatement(node);\n return;\n case \"TryStatement\":\n this.visitTryStatement(node);\n return;\n case \"VariableDeclaration\":\n this.visitVariableDeclaration(node);\n return;\n case \"ReturnStatement\":\n this.visitReturnStatement(node);\n return;\n case \"ThrowStatement\":\n this.visitThrowStatement(node);\n return;\n case \"ExportNamedDeclaration\":\n this.visitVariableDeclaration(node.declaration);\n return;\n case \"ExportDefaultDeclaration\":\n if (node.declaration.type === \"ClassDeclaration\" || node.declaration.type === \"FunctionDeclaration\") this.visitStatement(node.declaration);\n else this.visitExpression(node.declaration);\n return;\n case \"ImportDeclaration\":\n case \"BreakStatement\":\n case \"ContinueStatement\":\n return;\n }\n }\n\n private visitIfStatement(node: IfStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.consequent);\n if (node.alternate !== undefined) {\n this.visitStatement(node.alternate);\n }\n }\n\n private visitForStatement(node: ForStatement): void {\n if (node.init !== undefined) {\n if (node.init.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.init);\n } else {\n this.visitExpression(node.init);\n }\n }\n\n if (node.test !== undefined) {\n this.visitExpression(node.test);\n }\n\n if (node.update !== undefined) {\n this.visitExpression(node.update);\n }\n\n this.visitStatement(node.body);\n }\n\n private visitForOfStatement(node: ForInStatement | ForOfStatement): void {\n if (node.left.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.left);\n }\n this.visitExpression(node.right);\n this.visitStatement(node.body);\n }\n\n private visitWhileStatement(node: WhileStatement | DoWhileStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.body);\n }\n\n private visitTryStatement(node: TryStatement): void {\n this.visitStatement(node.block);\n\n if (node.handler !== undefined) {\n this.visitCatchClause(node.handler);\n }\n\n if (node.finalizer !== undefined) {\n this.visitStatement(node.finalizer);\n }\n }\n\n private visitCatchClause(node: CatchClause): void {\n if (node.param !== undefined) {\n this.visitPattern(node.param);\n }\n this.visitStatement(node.body);\n }\n\n private visitVariableDeclaration(node: VariableDeclaration): void {\n for (const declarator of node.declarations) {\n this.visitVariableDeclarator(declarator);\n }\n }\n\n private visitVariableDeclarator(node: VariableDeclarator): void {\n this.visitPattern(node.id);\n if (node.init !== undefined) {\n this.visitExpression(node.init);\n }\n }\n\n private visitReturnStatement(node: ReturnStatement): void {\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n }\n\n private visitThrowStatement(node: ThrowStatement): void {\n this.visitExpression(node.argument);\n }\n\n private visitExpression(node: Expression): void {\n if (node.type === \"ClassExpression\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"YieldExpression\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"FunctionExpression\":\n case \"ArrowFunctionExpression\":\n this.visitArrowFunction(node);\n return;\n case \"ImportExpression\":\n this.visitExpression(node.source);\n if (node.options !== undefined) this.visitExpression(node.options);\n return;\n case \"AwaitExpression\":\n this.visitExpression(node.argument);\n return;\n case \"ArrayExpression\":\n this.visitArrayExpression(node);\n return;\n case \"ObjectExpression\":\n this.visitObjectExpression(node);\n return;\n case \"UnaryExpression\":\n this.visitUnaryExpression(node);\n return;\n case \"BinaryExpression\":\n case \"LogicalExpression\":\n this.visitBinaryLikeExpression(node);\n return;\n case \"ConditionalExpression\":\n this.visitConditionalExpression(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentExpression\":\n this.visitAssignmentExpression(node);\n return;\n case \"CallExpression\":\n this.visitCallExpression(node);\n return;\n case \"TemplateLiteral\":\n this.visitTemplateLiteral(node);\n return;\n case \"Identifier\":\n case \"BooleanLiteral\":\n case \"NullLiteral\":\n case \"NumericLiteral\":\n case \"StringLiteral\":\n case \"UndefinedLiteral\":\n return;\n }\n }\n\n private visitArrowFunction(node: FunctionNode): void {\n for (const parameter of node.params) {\n this.visitPattern(parameter);\n }\n\n if (node.body.type === \"BlockStatement\") {\n for (const statement of node.body.body) {\n this.visitStatement(statement);\n }\n return;\n }\n\n this.visitExpression(node.body);\n }\n\n private visitArrayExpression(node: ArrayExpression): void {\n for (const element of node.elements) {\n if (element.type === \"SpreadElement\") {\n this.visitExpression(element.argument);\n continue;\n }\n\n this.visitExpression(element);\n }\n }\n\n private visitObjectExpression(node: ObjectExpression): void {\n for (const property of node.properties) {\n if (property.type === \"SpreadElement\") {\n this.visitExpression(property.argument);\n continue;\n }\n\n this.visitProperty(property);\n }\n }\n\n private visitProperty(node: Property): void {\n this.visitExpression(node.key);\n this.visitExpression(node.value);\n }\n\n private visitUnaryExpression(node: UnaryExpression): void {\n this.visitExpression(node.argument);\n }\n\n private visitBinaryLikeExpression(\n node:\n | ConditionalExpression\n | LogicalExpression\n | import(\"../../parse/parser.js\").BinaryExpression\n ): void {\n if (\"left\" in node) {\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n return;\n }\n\n this.visitExpression(node.test);\n this.visitExpression(node.consequent);\n this.visitExpression(node.alternate);\n }\n\n private visitConditionalExpression(node: ConditionalExpression): void {\n this.visitExpression(node.test);\n this.visitExpression(node.consequent);\n this.visitExpression(node.alternate);\n }\n\n private visitMemberExpression(node: MemberExpression): void {\n this.visitExpression(node.object);\n this.visitExpression(node.property);\n }\n\n private visitAssignmentExpression(node: AssignmentExpression): void {\n this.visitExpression(node.right);\n }\n\n private visitCallExpression(node: CallExpression): void {\n if (isSingleElementPromiseRace(node)) {\n this.diagnostics.push({\n code: \"AS015\",\n severity: \"warning\",\n message:\n \"Promise.race() with a single-element iterable literal is unnecessary. Use 'await' instead.\",\n filename: this.filename,\n line: node.span.start.line,\n column: node.span.start.column,\n span: node.span\n });\n }\n\n this.visitExpression(node.callee);\n for (const argument of node.arguments) {\n if (argument.type === \"SpreadElement\") {\n this.visitExpression(argument.argument);\n continue;\n }\n\n this.visitExpression(argument);\n }\n }\n\n private visitTemplateLiteral(node: TemplateLiteral): void {\n for (const expression of node.expressions) {\n this.visitExpression(expression);\n }\n }\n\n private visitPattern(\n node:\n | ArrayPattern\n | AssignmentPattern\n | Identifier\n | MemberExpression\n | ObjectPattern\n | RestElement\n ): void {\n switch (node.type) {\n case \"AssignmentPattern\":\n this.visitPattern(node.left);\n this.visitExpression(node.right);\n return;\n case \"RestElement\":\n this.visitPattern(node.argument);\n return;\n case \"ArrayPattern\":\n for (const element of node.elements) {\n if (element !== null) {\n this.visitPattern(element);\n }\n }\n return;\n case \"ObjectPattern\":\n for (const property of node.properties) {\n this.visitPattern(property.type === \"RestElement\" ? property : property.value);\n }\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"Identifier\":\n return;\n }\n }\n}\n\nfunction isSingleElementPromiseRace(node: CallExpression): boolean {\n if (!isPromiseRace(node.callee) || node.arguments.length !== 1) {\n return false;\n }\n\n const iterable = node.arguments[0];\n if (iterable.type !== \"ArrayExpression\" || iterable.elements.length !== 1) {\n return false;\n }\n\n return iterable.elements[0].type !== \"SpreadElement\";\n}\n\nfunction isPromiseRace(node: Expression): boolean {\n return (\n node.type === \"MemberExpression\" &&\n node.object.type === \"Identifier\" &&\n node.object.name === \"Promise\" &&\n ((node.computed && node.property.type === \"StringLiteral\" && node.property.value === \"race\") ||\n (!node.computed && node.property.type === \"Identifier\" && node.property.name === \"race\"))\n );\n}\n", "import { classDefinitionContains, visitClassElements } from \"../class-elements.js\";\nimport {\n parseModule,\n type ArrayExpression,\n type ArrayPattern,\n type ArrowFunctionExpression,\n type FunctionExpression,\n type FunctionDeclaration,\n type AssignmentExpression,\n type AssignmentPattern,\n type AssignmentProperty,\n type BinaryExpression,\n type BlockStatement,\n type CallExpression,\n type CatchClause,\n type ConditionalExpression,\n type DoWhileStatement,\n type Expression,\n type ForInStatement,\n type ForOfStatement,\n type ForStatement,\n type IfStatement,\n type Identifier,\n type LogicalExpression,\n type MemberExpression,\n type Module,\n type ObjectExpression,\n type ObjectPattern,\n type PatternTarget,\n type Property,\n type RestElement,\n type ReturnStatement,\n type SourceSpan,\n type Statement,\n type TaggedTemplateExpression,\n type TemplateLiteral,\n type ThrowStatement,\n type TryStatement,\n type UnaryExpression,\n type VariableDeclaration,\n type VariableDeclarator,\n type WhileStatement\n} from \"../../parse/parser.js\";\n\nexport type Diagnostic = {\n code: \"AS-ASYNC-NOT-NEEDED\";\n severity: \"info\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n fix: {\n range: readonly [number, number];\n replacement: string;\n };\n};\n\nexport const AS_ASYNC_NOT_NEEDED_MESSAGE =\n \"Async functions without await should remove the async keyword.\";\n\nexport function AS_ASYNC_NOT_NEEDED(\n source: string,\n options: { filename?: string } = {}\n): Diagnostic[] {\n return new ASAsyncNotNeededScanner(source, options.filename ?? \"<input>\").scan();\n}\n\nexport function fixASAsyncNotNeeded(source: string, options: { filename?: string } = {}): string {\n return AS_ASYNC_NOT_NEEDED(source, options)\n .sort((left, right) => right.span.start.offset - left.span.start.offset)\n .reduce((result, diagnostic) => {\n const start = diagnostic.span.start.offset;\n const end =\n source[start + \"async\".length] === \" \"\n ? diagnostic.span.end.offset + 1\n : diagnostic.span.end.offset;\n return `${result.slice(0, start)}${result.slice(end)}`;\n }, source);\n}\n\nclass ASAsyncNotNeededScanner {\n private readonly diagnostics: Diagnostic[] = [];\n\n constructor(\n private readonly source: string,\n private readonly filename: string\n ) {}\n\n scan(): Diagnostic[] {\n this.visitModule(parseModule(this.source, this.filename));\n return this.diagnostics;\n }\n\n private visitModule(node: Module): void {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n }\n\n private visitStatement(node: Statement): void {\n if (node.type === \"ClassDeclaration\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"FunctionDeclaration\":\n this.visitFunctionExpression(node);\n return;\n case \"BlockStatement\":\n this.visitBlockStatement(node);\n return;\n case \"ExpressionStatement\":\n this.visitExpression(node.expression);\n return;\n case \"IfStatement\":\n this.visitIfStatement(node);\n return;\n case \"ForStatement\":\n this.visitForStatement(node);\n return;\n case \"ForInStatement\":\n case \"ForOfStatement\":\n this.visitForOfStatement(node);\n return;\n case \"WhileStatement\":\n case \"DoWhileStatement\":\n this.visitWhileStatement(node);\n return;\n case \"TryStatement\":\n this.visitTryStatement(node);\n return;\n case \"VariableDeclaration\":\n this.visitVariableDeclaration(node);\n return;\n case \"ReturnStatement\":\n this.visitReturnStatement(node);\n return;\n case \"ThrowStatement\":\n this.visitThrowStatement(node);\n return;\n case \"ExportNamedDeclaration\":\n this.visitVariableDeclaration(node.declaration);\n return;\n case \"ExportDefaultDeclaration\":\n if (node.declaration.type === \"ArrowFunctionExpression\") {\n this.visitArrowFunction(node.declaration, true);\n return;\n }\n if (node.declaration.type === \"FunctionExpression\" || node.declaration.type === \"FunctionDeclaration\") {\n this.visitFunctionExpression(node.declaration, true);\n return;\n }\n if (node.declaration.type === \"ClassDeclaration\") this.visitStatement(node.declaration);\n else this.visitExpression(node.declaration);\n return;\n case \"ImportDeclaration\":\n case \"BreakStatement\":\n case \"ContinueStatement\":\n return;\n }\n }\n\n private visitBlockStatement(node: BlockStatement): void {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n }\n\n private visitIfStatement(node: IfStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.consequent);\n if (node.alternate !== undefined) {\n this.visitStatement(node.alternate);\n }\n }\n\n private visitForStatement(node: ForStatement): void {\n if (node.init !== undefined) {\n if (node.init.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.init);\n } else {\n this.visitExpression(node.init);\n }\n }\n\n if (node.test !== undefined) {\n this.visitExpression(node.test);\n }\n\n if (node.update !== undefined) {\n this.visitExpression(node.update);\n }\n\n this.visitStatement(node.body);\n }\n\n private visitForOfStatement(node: ForInStatement | ForOfStatement): void {\n if (node.left.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.left);\n } else {\n this.visitAssignmentTarget(node.left);\n }\n this.visitExpression(node.right);\n this.visitStatement(node.body);\n }\n\n private visitWhileStatement(node: WhileStatement | DoWhileStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.body);\n }\n\n private visitTryStatement(node: TryStatement): void {\n this.visitBlockStatement(node.block);\n if (node.handler !== undefined) {\n this.visitCatchClause(node.handler);\n }\n if (node.finalizer !== undefined) {\n this.visitBlockStatement(node.finalizer);\n }\n }\n\n private visitCatchClause(node: CatchClause): void {\n if (node.param !== undefined) {\n this.visitBindingPattern(node.param);\n }\n this.visitBlockStatement(node.body);\n }\n\n private visitVariableDeclaration(node: VariableDeclaration): void {\n for (const declarator of node.declarations) {\n this.visitVariableDeclarator(declarator);\n }\n }\n\n private visitVariableDeclarator(node: VariableDeclarator): void {\n this.visitBindingPattern(node.id);\n if (node.init !== undefined) {\n this.visitExpression(node.init);\n }\n }\n\n private visitReturnStatement(node: ReturnStatement): void {\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n }\n\n private visitThrowStatement(node: ThrowStatement): void {\n this.visitExpression(node.argument);\n }\n\n private visitExpression(node: Expression): void {\n if (node.type === \"ClassExpression\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"YieldExpression\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"ArrowFunctionExpression\":\n this.visitArrowFunction(node, false);\n return;\n case \"FunctionExpression\":\n this.visitFunctionExpression(node);\n return;\n case \"ImportExpression\":\n this.visitExpression(node.source);\n if (node.options !== undefined) this.visitExpression(node.options);\n return;\n case \"AwaitExpression\":\n this.visitExpression(node.argument);\n return;\n case \"ArrayExpression\":\n this.visitArrayExpression(node);\n return;\n case \"ObjectExpression\":\n this.visitObjectExpression(node);\n return;\n case \"UnaryExpression\":\n this.visitUnaryExpression(node);\n return;\n case \"BinaryExpression\":\n case \"LogicalExpression\":\n this.visitBinaryLikeExpression(node);\n return;\n case \"ConditionalExpression\":\n this.visitConditionalExpression(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentExpression\":\n this.visitAssignmentExpression(node);\n return;\n case \"CallExpression\":\n this.visitCallExpression(node);\n return;\n case \"TemplateLiteral\":\n this.visitTemplateLiteral(node);\n return;\n case \"TaggedTemplateExpression\":\n this.visitTaggedTemplateExpression(node);\n return;\n case \"Identifier\":\n case \"BooleanLiteral\":\n case \"MetaProperty\":\n case \"NullLiteral\":\n case \"NumericLiteral\":\n case \"BigIntLiteral\":\n case \"RegexLiteral\":\n case \"StringLiteral\":\n case \"UndefinedLiteral\":\n return;\n }\n }\n\n private visitArrowFunction(node: ArrowFunctionExpression, isDefaultExportedArrow: boolean): void {\n if (node.async && !isDefaultExportedArrow && !bodyContainsAwait(node.body)) {\n this.report(createAsyncKeywordSpan(node.span));\n }\n\n for (const param of node.params) {\n this.visitBindingElement(param);\n }\n\n if (node.body.type === \"BlockStatement\") {\n this.visitBlockStatement(node.body);\n return;\n }\n\n this.visitExpression(node.body);\n }\n\n private visitFunctionExpression(\n node: FunctionExpression | FunctionDeclaration,\n isDefaultExport = false\n ): void {\n if (node.async && !node.generator && !isDefaultExport && !bodyContainsAwait(node.body)) {\n this.report(createAsyncKeywordSpan(node.span));\n }\n\n for (const param of node.params) {\n this.visitBindingElement(param);\n }\n this.visitBlockStatement(node.body);\n }\n\n private visitArrayExpression(node: ArrayExpression): void {\n for (const element of node.elements) {\n if (element.type === \"SpreadElement\") {\n this.visitExpression(element.argument);\n continue;\n }\n\n this.visitExpression(element);\n }\n }\n\n private visitObjectExpression(node: ObjectExpression): void {\n for (const property of node.properties) {\n if (property.type === \"SpreadElement\") {\n this.visitExpression(property.argument);\n continue;\n }\n\n this.visitProperty(property);\n }\n }\n\n private visitProperty(node: Property): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitExpression(node.value);\n }\n\n private visitUnaryExpression(node: UnaryExpression): void {\n this.visitExpression(node.argument);\n }\n\n private visitBinaryLikeExpression(node: BinaryExpression | LogicalExpression): void {\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n }\n\n private visitConditionalExpression(node: ConditionalExpression): void {\n this.visitExpression(node.test);\n this.visitExpression(node.consequent);\n this.visitExpression(node.alternate);\n }\n\n private visitMemberExpression(node: MemberExpression): void {\n this.visitExpression(node.object);\n if (node.computed) {\n this.visitExpression(node.property);\n }\n }\n\n private visitAssignmentExpression(node: AssignmentExpression): void {\n this.visitAssignmentTarget(node.left);\n this.visitExpression(node.right);\n }\n\n private visitCallExpression(node: CallExpression): void {\n this.visitExpression(node.callee);\n for (const argument of node.arguments) {\n if (argument.type === \"SpreadElement\") {\n this.visitExpression(argument.argument);\n continue;\n }\n\n this.visitExpression(argument);\n }\n }\n\n private visitTemplateLiteral(node: TemplateLiteral): void {\n for (const expression of node.expressions) {\n this.visitExpression(expression);\n }\n }\n\n private visitTaggedTemplateExpression(node: TaggedTemplateExpression): void {\n this.visitExpression(node.tag);\n this.visitTemplateLiteral(node.quasi);\n }\n\n private visitAssignmentTarget(node: AssignmentExpression[\"left\"]): void {\n switch (node.type) {\n case \"Identifier\":\n case \"MetaProperty\":\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"ArrayPattern\":\n case \"ObjectPattern\":\n this.visitBindingPattern(node);\n return;\n }\n }\n\n private visitBindingElement(\n node:\n | AssignmentPattern\n | ArrayPattern\n | Identifier\n | MemberExpression\n | ObjectPattern\n | RestElement\n ): void {\n if (node.type === \"RestElement\") {\n this.visitAssignmentTarget(node.argument);\n return;\n }\n\n this.visitBindingPattern(node);\n }\n\n private visitBindingPattern(\n node: AssignmentPattern | ArrayPattern | Identifier | MemberExpression | ObjectPattern\n ): void {\n switch (node.type) {\n case \"Identifier\":\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentPattern\":\n this.visitBindingPattern(node.left);\n this.visitExpression(node.right);\n return;\n case \"ArrayPattern\":\n for (const element of node.elements) {\n if (element === null) {\n continue;\n }\n this.visitBindingElement(element);\n }\n return;\n case \"ObjectPattern\":\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.visitAssignmentTarget(property.argument);\n continue;\n }\n this.visitAssignmentProperty(property);\n }\n return;\n }\n }\n\n private visitAssignmentProperty(node: AssignmentProperty): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitBindingPattern(node.value);\n }\n\n private report(span: SourceSpan): void {\n const end =\n this.source[span.start.offset + \"async\".length] === \" \"\n ? span.end.offset + 1\n : span.end.offset;\n this.diagnostics.push({\n code: \"AS-ASYNC-NOT-NEEDED\",\n severity: \"info\",\n message: AS_ASYNC_NOT_NEEDED_MESSAGE,\n filename: this.filename,\n line: span.start.line,\n column: span.start.column,\n span,\n fix: {\n range: [span.start.offset, end],\n replacement: \"\"\n }\n });\n }\n}\n\nfunction createAsyncKeywordSpan(span: SourceSpan): SourceSpan {\n return {\n start: { ...span.start },\n end: {\n line: span.start.line,\n column: span.start.column + \"async\".length,\n offset: span.start.offset + \"async\".length\n }\n };\n}\n\nfunction bodyContainsAwait(node: BlockStatement | Expression): boolean {\n return node.type === \"BlockStatement\"\n ? statementListContainsAwait(node.body)\n : expressionContainsAwait(node);\n}\n\nfunction statementListContainsAwait(statements: readonly Statement[]): boolean {\n return statements.some(statementContainsAwait);\n}\n\nfunction statementContainsAwait(node: Statement): boolean {\n switch (node.type) {\n case \"WithStatement\":\n return expressionContainsAwait(node.object) || statementContainsAwait(node.body);\n case \"ClassDeclaration\":\n return classDefinitionContains(node, expressionContainsAwait);\n case \"BlockStatement\":\n return statementListContainsAwait(node.body);\n case \"ExpressionStatement\":\n return expressionContainsAwait(node.expression);\n case \"IfStatement\":\n return (\n expressionContainsAwait(node.test) ||\n statementContainsAwait(node.consequent) ||\n (node.alternate !== undefined && statementContainsAwait(node.alternate))\n );\n case \"ForStatement\":\n return (\n (node.init?.type === \"VariableDeclaration\"\n ? variableDeclarationContainsAwait(node.init)\n : node.init !== undefined && expressionContainsAwait(node.init)) ||\n (node.test !== undefined && expressionContainsAwait(node.test)) ||\n (node.update !== undefined && expressionContainsAwait(node.update)) ||\n statementContainsAwait(node.body)\n );\n case \"ForInStatement\":\n case \"ForOfStatement\":\n return (\n (node.type === \"ForOfStatement\" && node.await === true) ||\n (node.left.type === \"VariableDeclaration\" && variableDeclarationContainsAwait(node.left)) ||\n (node.left.type !== \"VariableDeclaration\" && assignmentTargetContainsAwait(node.left)) ||\n expressionContainsAwait(node.right) ||\n statementContainsAwait(node.body)\n );\n case \"WhileStatement\":\n case \"DoWhileStatement\":\n return expressionContainsAwait(node.test) || statementContainsAwait(node.body);\n case \"TryStatement\":\n return (\n statementListContainsAwait(node.block.body) ||\n (node.handler !== undefined && catchClauseContainsAwait(node.handler)) ||\n (node.finalizer !== undefined && statementListContainsAwait(node.finalizer.body))\n );\n case \"SwitchStatement\":\n return (\n expressionContainsAwait(node.discriminant) ||\n node.cases.some(\n (switchCase) =>\n (switchCase.test !== undefined && expressionContainsAwait(switchCase.test)) ||\n statementListContainsAwait(switchCase.consequent)\n )\n );\n case \"VariableDeclaration\":\n return variableDeclarationContainsAwait(node);\n case \"ReturnStatement\":\n return node.argument !== undefined && expressionContainsAwait(node.argument);\n case \"ThrowStatement\":\n return expressionContainsAwait(node.argument);\n case \"ExportNamedDeclaration\":\n return variableDeclarationContainsAwait(node.declaration);\n case \"ExportDefaultDeclaration\":\n return node.declaration.type === \"ClassDeclaration\" || node.declaration.type === \"FunctionDeclaration\"\n ? statementContainsAwait(node.declaration)\n : expressionContainsAwait(node.declaration);\n case \"ImportDeclaration\":\n case \"FunctionDeclaration\":\n case \"BreakStatement\":\n case \"ContinueStatement\":\n case \"EmptyStatement\":\n return false;\n }\n}\n\nfunction catchClauseContainsAwait(node: CatchClause): boolean {\n return (\n (node.param !== undefined && bindingPatternContainsAwait(node.param)) ||\n statementListContainsAwait(node.body.body)\n );\n}\n\nfunction variableDeclarationContainsAwait(node: VariableDeclaration): boolean {\n return node.declarations.some((declarator) => {\n return (\n bindingPatternContainsAwait(declarator.id) ||\n (declarator.init !== undefined && expressionContainsAwait(declarator.init))\n );\n });\n}\n\nfunction expressionContainsAwait(node: Expression): boolean {\n switch (node.type) {\n case \"ImportExpression\":\n return expressionContainsAwait(node.source) || (node.options !== undefined && expressionContainsAwait(node.options));\n case \"PrivateIdentifier\":\n return false;\n case \"ClassExpression\":\n return classDefinitionContains(node, expressionContainsAwait);\n case \"NewTargetExpression\":\n case \"Super\":\n return false;\n case \"AwaitExpression\":\n return true;\n case \"YieldExpression\":\n return node.argument !== undefined && expressionContainsAwait(node.argument);\n case \"ArrowFunctionExpression\":\n case \"FunctionExpression\":\n return false;\n case \"ArrayExpression\":\n return node.elements.some((element) => {\n return element.type === \"SpreadElement\"\n ? expressionContainsAwait(element.argument)\n : expressionContainsAwait(element);\n });\n case \"ObjectExpression\":\n return objectExpressionContainsAwait(node);\n case \"UnaryExpression\":\n case \"UpdateExpression\":\n return expressionContainsAwait(node.argument);\n case \"SequenceExpression\":\n return node.expressions.some(expressionContainsAwait);\n case \"BinaryExpression\":\n case \"LogicalExpression\":\n return expressionContainsAwait(node.left) || expressionContainsAwait(node.right);\n case \"ConditionalExpression\":\n return (\n expressionContainsAwait(node.test) ||\n expressionContainsAwait(node.consequent) ||\n expressionContainsAwait(node.alternate)\n );\n case \"MemberExpression\":\n return (\n expressionContainsAwait(node.object) ||\n (node.computed && expressionContainsAwait(node.property))\n );\n case \"AssignmentExpression\":\n return assignmentTargetContainsAwait(node.left) || expressionContainsAwait(node.right);\n case \"CallExpression\":\n case \"NewExpression\":\n return (\n expressionContainsAwait(node.callee) ||\n node.arguments.some((argument) => {\n return argument.type === \"SpreadElement\"\n ? expressionContainsAwait(argument.argument)\n : expressionContainsAwait(argument);\n })\n );\n case \"TemplateLiteral\":\n return node.expressions.some(expressionContainsAwait);\n case \"TaggedTemplateExpression\":\n return expressionContainsAwait(node.tag) || expressionContainsAwait(node.quasi);\n case \"Identifier\":\n case \"BooleanLiteral\":\n case \"MetaProperty\":\n case \"NullLiteral\":\n case \"NumericLiteral\":\n case \"BigIntLiteral\":\n case \"RegexLiteral\":\n case \"StringLiteral\":\n case \"ThisExpression\":\n case \"UndefinedLiteral\":\n return false;\n }\n}\n\nfunction objectExpressionContainsAwait(node: ObjectExpression): boolean {\n return node.properties.some((property) => {\n if (property.type === \"SpreadElement\") {\n return expressionContainsAwait(property.argument);\n }\n\n return (\n (property.computed && expressionContainsAwait(property.key)) ||\n expressionContainsAwait(property.value)\n );\n });\n}\n\nfunction assignmentTargetContainsAwait(node: AssignmentExpression[\"left\"]): boolean {\n switch (node.type) {\n case \"Identifier\":\n case \"MetaProperty\":\n return false;\n case \"MemberExpression\":\n return expressionContainsAwait(node);\n case \"ArrayPattern\":\n case \"ObjectPattern\":\n return bindingPatternContainsAwait(node);\n }\n}\n\nfunction bindingElementContainsAwait(\n node:\n | AssignmentPattern\n | ArrayPattern\n | Identifier\n | MemberExpression\n | ObjectPattern\n | RestElement\n): boolean {\n if (node.type === \"RestElement\") {\n return patternTargetContainsAwait(node.argument);\n }\n\n return bindingPatternContainsAwait(node);\n}\n\nfunction bindingPatternContainsAwait(\n node: AssignmentPattern | ArrayPattern | Identifier | MemberExpression | ObjectPattern\n): boolean {\n switch (node.type) {\n case \"Identifier\":\n return false;\n case \"MemberExpression\":\n return expressionContainsAwait(node);\n case \"AssignmentPattern\":\n return bindingPatternContainsAwait(node.left) || expressionContainsAwait(node.right);\n case \"ArrayPattern\":\n return node.elements.some((element) => {\n return element !== null && bindingElementContainsAwait(element);\n });\n case \"ObjectPattern\":\n return node.properties.some(assignmentPropertyContainsAwait);\n }\n}\n\nfunction assignmentPropertyContainsAwait(node: AssignmentProperty | RestElement): boolean {\n if (node.type === \"RestElement\") {\n return patternTargetContainsAwait(node.argument);\n }\n\n return (\n (node.computed && expressionContainsAwait(node.key)) || bindingPatternContainsAwait(node.value)\n );\n}\n\nfunction patternTargetContainsAwait(node: PatternTarget): boolean {\n switch (node.type) {\n case \"Identifier\":\n return false;\n case \"MemberExpression\":\n return expressionContainsAwait(node);\n case \"ArrayPattern\":\n case \"ObjectPattern\":\n return bindingPatternContainsAwait(node);\n }\n}\n", "import { visitClassElements } from \"../class-elements.js\";\nimport {\n parseModule,\n type ArrayExpression,\n type ArrayPattern,\n type FunctionNode,\n type AssignmentExpression,\n type AssignmentPattern,\n type AssignmentProperty,\n type BinaryExpression,\n type BlockStatement,\n type CallExpression,\n type CatchClause,\n type ConditionalExpression,\n type DoWhileStatement,\n type Expression,\n type ForInStatement,\n type ForOfStatement,\n type ForStatement,\n type IfStatement,\n type LogicalExpression,\n type MemberExpression,\n type Module,\n type ObjectExpression,\n type ObjectPattern,\n type PatternTarget,\n type Property,\n type RestElement,\n type SourceSpan,\n type Statement,\n type TaggedTemplateExpression,\n type TemplateLiteral,\n type ThrowStatement,\n type TryStatement,\n type UnaryExpression,\n type VariableDeclaration,\n type VariableDeclarator,\n type WhileStatement\n} from \"../../parse/parser.js\";\n\nexport type Diagnostic = {\n code: \"AS-DESTRUCTURE-NULL-DEFAULT\";\n severity: \"warning\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n hint: string;\n};\n\nconst MESSAGE = \"Destructuring default values only apply to undefined, not null.\";\nconst HINT = \"Handle null explicitly before destructuring or use ?? after binding.\";\n\nexport function AS_DESTRUCTURE_NULL_DEFAULT(\n source: string,\n options: { filename?: string } = {}\n): Diagnostic[] {\n return new ASDestructureNullDefaultScanner(options.filename ?? \"<input>\").scan(source);\n}\n\ntype KnownElement = Expression | \"missing\" | undefined;\n\nclass ASDestructureNullDefaultScanner {\n private readonly diagnostics: Diagnostic[] = [];\n\n constructor(private readonly filename: string) {}\n\n scan(source: string): Diagnostic[] {\n this.visitModule(parseModule(source, this.filename));\n return this.diagnostics;\n }\n\n private visitModule(node: Module): void {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n }\n\n private visitStatement(node: Statement): void {\n if (node.type === \"ClassDeclaration\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"FunctionDeclaration\":\n this.visitArrowFunction(node);\n return;\n case \"BlockStatement\":\n this.visitBlockStatement(node);\n return;\n case \"ExpressionStatement\":\n this.visitExpression(node.expression);\n return;\n case \"IfStatement\":\n this.visitIfStatement(node);\n return;\n case \"ForStatement\":\n this.visitForStatement(node);\n return;\n case \"ForInStatement\":\n case \"ForOfStatement\":\n this.visitForOfStatement(node);\n return;\n case \"WhileStatement\":\n case \"DoWhileStatement\":\n this.visitWhileStatement(node);\n return;\n case \"TryStatement\":\n this.visitTryStatement(node);\n return;\n case \"VariableDeclaration\":\n this.visitVariableDeclaration(node);\n return;\n case \"ReturnStatement\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"ThrowStatement\":\n this.visitThrowStatement(node);\n return;\n case \"ExportNamedDeclaration\":\n this.visitVariableDeclaration(node.declaration);\n return;\n case \"ExportDefaultDeclaration\":\n if (node.declaration.type === \"ClassDeclaration\" || node.declaration.type === \"FunctionDeclaration\") this.visitStatement(node.declaration);\n else this.visitExpression(node.declaration);\n return;\n case \"ImportDeclaration\":\n case \"BreakStatement\":\n case \"ContinueStatement\":\n return;\n }\n }\n\n private visitBlockStatement(node: BlockStatement): void {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n }\n\n private visitIfStatement(node: IfStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.consequent);\n if (node.alternate !== undefined) {\n this.visitStatement(node.alternate);\n }\n }\n\n private visitForStatement(node: ForStatement): void {\n if (node.init !== undefined) {\n if (node.init.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.init);\n } else {\n this.visitExpression(node.init);\n }\n }\n if (node.test !== undefined) {\n this.visitExpression(node.test);\n }\n if (node.update !== undefined) {\n this.visitExpression(node.update);\n }\n this.visitStatement(node.body);\n }\n\n private visitForOfStatement(node: ForInStatement | ForOfStatement): void {\n if (node.left.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.left);\n } else {\n this.visitBindingPattern(node.left);\n }\n this.visitExpression(node.right);\n this.visitStatement(node.body);\n }\n\n private visitWhileStatement(node: WhileStatement | DoWhileStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.body);\n }\n\n private visitTryStatement(node: TryStatement): void {\n this.visitBlockStatement(node.block);\n if (node.handler !== undefined) {\n this.visitCatchClause(node.handler);\n }\n if (node.finalizer !== undefined) {\n this.visitBlockStatement(node.finalizer);\n }\n }\n\n private visitCatchClause(node: CatchClause): void {\n if (node.param !== undefined) {\n this.visitBindingPattern(node.param);\n }\n this.visitBlockStatement(node.body);\n }\n\n private visitVariableDeclaration(node: VariableDeclaration): void {\n for (const declarator of node.declarations) {\n this.visitVariableDeclarator(declarator);\n }\n }\n\n private visitVariableDeclarator(node: VariableDeclarator): void {\n if (node.init !== undefined) {\n this.matchPatternAgainstExpression(node.id, node.init);\n this.visitBindingPattern(node.id);\n this.visitExpression(node.init);\n } else {\n this.visitBindingPattern(node.id);\n }\n }\n\n private visitThrowStatement(node: ThrowStatement): void {\n this.visitExpression(node.argument);\n }\n\n private visitExpression(node: Expression): void {\n if (node.type === \"ClassExpression\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"YieldExpression\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"FunctionExpression\":\n case \"ArrowFunctionExpression\":\n this.visitArrowFunction(node);\n return;\n case \"ArrayExpression\":\n this.visitArrayExpression(node);\n return;\n case \"ImportExpression\":\n this.visitExpression(node.source);\n if (node.options !== undefined) this.visitExpression(node.options);\n return;\n case \"AwaitExpression\":\n this.visitExpression(node.argument);\n return;\n case \"ObjectExpression\":\n this.visitObjectExpression(node);\n return;\n case \"UnaryExpression\":\n this.visitUnaryExpression(node);\n return;\n case \"BinaryExpression\":\n case \"LogicalExpression\":\n this.visitBinaryLikeExpression(node);\n return;\n case \"ConditionalExpression\":\n this.visitConditionalExpression(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentExpression\":\n this.visitAssignmentExpression(node);\n return;\n case \"CallExpression\":\n this.visitCallExpression(node);\n return;\n case \"TemplateLiteral\":\n this.visitTemplateLiteral(node);\n return;\n case \"TaggedTemplateExpression\":\n this.visitTaggedTemplateExpression(node);\n return;\n case \"Identifier\":\n case \"BooleanLiteral\":\n case \"MetaProperty\":\n case \"NullLiteral\":\n case \"NumericLiteral\":\n case \"RegexLiteral\":\n case \"StringLiteral\":\n case \"UndefinedLiteral\":\n return;\n }\n }\n\n private visitArrowFunction(node: FunctionNode): void {\n for (const parameter of node.params) {\n if (parameter.type === \"AssignmentPattern\") {\n this.matchPatternAgainstExpression(parameter.left, parameter.right);\n }\n this.visitBindingElement(parameter);\n }\n if (node.body.type === \"BlockStatement\") {\n this.visitBlockStatement(node.body);\n return;\n }\n this.visitExpression(node.body);\n }\n\n private visitArrayExpression(node: ArrayExpression): void {\n for (const element of node.elements) {\n if (element.type === \"SpreadElement\") {\n this.visitExpression(element.argument);\n continue;\n }\n this.visitExpression(element);\n }\n }\n\n private visitObjectExpression(node: ObjectExpression): void {\n for (const property of node.properties) {\n if (property.type === \"SpreadElement\") {\n this.visitExpression(property.argument);\n continue;\n }\n this.visitProperty(property);\n }\n }\n\n private visitUnaryExpression(node: UnaryExpression): void {\n this.visitExpression(node.argument);\n }\n\n private visitBinaryLikeExpression(node: BinaryExpression | LogicalExpression): void {\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n }\n\n private visitConditionalExpression(node: ConditionalExpression): void {\n this.visitExpression(node.test);\n this.visitExpression(node.consequent);\n this.visitExpression(node.alternate);\n }\n\n private visitMemberExpression(node: MemberExpression): void {\n this.visitExpression(node.object);\n if (node.computed) {\n this.visitExpression(node.property);\n }\n }\n\n private visitAssignmentExpression(node: AssignmentExpression): void {\n this.matchPatternAgainstExpression(node.left, node.right);\n this.visitAssignmentTarget(node.left);\n this.visitExpression(node.right);\n }\n\n private visitCallExpression(node: CallExpression): void {\n this.visitExpression(node.callee);\n for (const argument of node.arguments) {\n if (argument.type === \"SpreadElement\") {\n this.visitExpression(argument.argument);\n continue;\n }\n this.visitExpression(argument);\n }\n }\n\n private visitTemplateLiteral(node: TemplateLiteral): void {\n for (const expression of node.expressions) {\n this.visitExpression(expression);\n }\n }\n\n private visitTaggedTemplateExpression(node: TaggedTemplateExpression): void {\n this.visitExpression(node.tag);\n this.visitTemplateLiteral(node.quasi);\n }\n\n private visitProperty(node: Property): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitExpression(node.value);\n }\n\n private visitBindingElement(\n node: AssignmentPattern | ArrayPattern | ObjectPattern | RestElement | PatternTarget\n ): void {\n if (node.type === \"RestElement\") {\n this.visitBindingPattern(node.argument);\n return;\n }\n this.visitBindingPattern(node);\n }\n\n private visitBindingPattern(\n node: AssignmentPattern | ArrayPattern | ObjectPattern | PatternTarget\n ): void {\n switch (node.type) {\n case \"Identifier\":\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentPattern\":\n this.visitAssignmentPattern(node);\n return;\n case \"ArrayPattern\":\n this.visitArrayPattern(node);\n return;\n case \"ObjectPattern\":\n this.visitObjectPattern(node);\n return;\n }\n }\n\n private visitAssignmentPattern(node: AssignmentPattern): void {\n this.visitBindingPattern(node.left);\n this.visitExpression(node.right);\n }\n\n private visitArrayPattern(node: ArrayPattern): void {\n for (const element of node.elements) {\n if (element === null) {\n continue;\n }\n this.visitBindingElement(element);\n }\n }\n\n private visitObjectPattern(node: ObjectPattern): void {\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.visitBindingPattern(property.argument);\n continue;\n }\n this.visitAssignmentProperty(property);\n }\n }\n\n private visitAssignmentProperty(node: AssignmentProperty): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitBindingPattern(node.value);\n }\n\n private visitAssignmentTarget(node: AssignmentExpression[\"left\"]): void {\n if (node.type === \"MetaProperty\") {\n return;\n }\n this.visitBindingPattern(node);\n }\n\n private matchPatternAgainstExpression(\n pattern: AssignmentExpression[\"left\"] | VariableDeclarator[\"id\"],\n expression: Expression\n ): void {\n if (pattern.type === \"ObjectPattern\" && expression.type === \"ObjectExpression\") {\n this.matchObjectPattern(pattern, expression);\n return;\n }\n if (pattern.type === \"ArrayPattern\" && expression.type === \"ArrayExpression\") {\n this.matchArrayPattern(pattern, expression);\n }\n }\n\n private matchObjectPattern(pattern: ObjectPattern, expression: ObjectExpression): void {\n for (const property of pattern.properties) {\n if (property.type === \"RestElement\") {\n continue;\n }\n if (property.computed) {\n continue;\n }\n\n const key = getStaticPropertyKey(property.key);\n if (key === undefined) {\n continue;\n }\n\n const value = getKnownObjectProperty(expression, key);\n if (value === undefined || value === \"missing\") {\n continue;\n }\n\n this.matchPropertyValue(property.value, value);\n }\n }\n\n private matchArrayPattern(pattern: ArrayPattern, expression: ArrayExpression): void {\n for (const [index, element] of pattern.elements.entries()) {\n if (element === null) {\n continue;\n }\n\n const value = getKnownArrayElement(expression, index);\n if (value === undefined || value === \"missing\") {\n continue;\n }\n\n this.matchPropertyValue(element, value);\n }\n }\n\n private matchPropertyValue(\n pattern: AssignmentPattern | ArrayPattern | ObjectPattern | PatternTarget | RestElement,\n expression: Expression\n ): void {\n if (pattern.type === \"RestElement\") {\n return;\n }\n\n if (pattern.type === \"AssignmentPattern\") {\n if (expression.type === \"NullLiteral\") {\n this.report(pattern.span);\n return;\n }\n this.matchPatternAgainstExpression(pattern.left, expression);\n return;\n }\n\n this.matchPatternAgainstExpression(pattern, expression);\n }\n\n private report(span: SourceSpan): void {\n this.diagnostics.push({\n code: \"AS-DESTRUCTURE-NULL-DEFAULT\",\n severity: \"warning\",\n message: MESSAGE,\n filename: this.filename,\n line: span.start.line,\n column: span.start.column,\n span,\n hint: HINT\n });\n }\n}\n\nfunction getKnownObjectProperty(expression: ObjectExpression, key: string): KnownElement {\n for (let index = expression.properties.length - 1; index >= 0; index -= 1) {\n const property = expression.properties[index];\n if (property.type === \"SpreadElement\" || property.computed) {\n return undefined;\n }\n\n if (getStaticPropertyKey(property.key) === key) {\n return property.value;\n }\n }\n\n return \"missing\";\n}\n\nfunction getKnownArrayElement(expression: ArrayExpression, index: number): KnownElement {\n for (let currentIndex = 0; currentIndex <= index; currentIndex += 1) {\n const element = expression.elements[currentIndex];\n if (element === undefined) {\n return \"missing\";\n }\n if (element.type === \"SpreadElement\") {\n return undefined;\n }\n if (currentIndex === index) {\n return element;\n }\n }\n\n return \"missing\";\n}\n\nfunction getStaticPropertyKey(key: Expression): string | undefined {\n switch (key.type) {\n case \"Identifier\":\n return key.name;\n case \"NumericLiteral\":\n return String(key.value);\n case \"StringLiteral\":\n return key.value;\n default:\n return undefined;\n }\n}\n", "import { visitClassElements } from \"../class-elements.js\";\nimport {\n parseModule,\n type ArrayExpression,\n type AssignmentExpression,\n type AssignmentPattern,\n type BinaryExpression,\n type CallExpression,\n type ConditionalExpression,\n type DoWhileStatement,\n type Expression,\n type ForInStatement,\n type ForOfStatement,\n type ForStatement,\n type FunctionExpression,\n type FunctionDeclaration,\n type IfStatement,\n type LogicalExpression,\n type MemberExpression,\n type Module,\n type ObjectExpression,\n type Property,\n type RestElement,\n type SourceSpan,\n type SpreadElement,\n type Statement,\n type TemplateLiteral,\n type ThrowStatement,\n type TryStatement,\n type UnaryExpression,\n type VariableDeclaration,\n type VariableDeclarator,\n type WhileStatement\n} from \"../../parse/parser.js\";\n\ntype DiagnosticCode =\n | \"AS-EXPORT-DEFAULT-MISSING\"\n | \"AS-EXPORT-DEFAULT-MULTIPLE\"\n | \"AS-EXPORT-DEFAULT-NOT-ARROW\"\n | \"AS-EXPORT-DEFAULT-SIGNATURE\"\n | \"AS-EXPORT-UNKNOWN\"\n | \"AS-IMPORT-META-ASSIGN\"\n | \"AS-RETURN-AT-TOP\";\n\nexport type Diagnostic = {\n code: DiagnosticCode;\n severity: \"error\" | \"warning\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n};\n\nexport type DefaultExportSignature = {\n parameters?: readonly string[];\n required?: boolean;\n};\n\nexport function AS_EXPORT_IMPORT_META(\n source: string,\n options: {\n allowedExportNames?: readonly string[];\n defaultExport?: DefaultExportSignature;\n filename?: string;\n } = {}\n): Diagnostic[] {\n return new Scanner(\n options.filename ?? \"<input>\",\n new Set(options.allowedExportNames ?? []),\n options.defaultExport\n ).scan(source);\n}\n\nclass Scanner {\n private readonly diagnostics: Diagnostic[] = [];\n\n constructor(\n private readonly filename: string,\n private readonly allowedExportNames: ReadonlySet<string>,\n private readonly defaultExport: DefaultExportSignature | undefined\n ) {}\n\n scan(source: string): Diagnostic[] {\n this.visitModule(parseModule(source, this.filename));\n return this.diagnostics;\n }\n\n private visitModule(node: Module): void {\n const defaultExports = node.body.filter(\n (statement) => statement.type === \"ExportDefaultDeclaration\"\n );\n const hasDefaultExport = defaultExports.length > 0;\n\n if (!hasDefaultExport && this.defaultExport?.required === true) {\n this.pushDiagnostic(\n \"AS-EXPORT-DEFAULT-MISSING\",\n \"error\",\n \"Module must export a default entry point.\",\n node.span\n );\n }\n\n for (const [index, statement] of defaultExports.entries()) {\n if (index > 0) {\n this.pushDiagnostic(\n \"AS-EXPORT-DEFAULT-MULTIPLE\",\n \"error\",\n \"Module contains more than one export default declaration.\",\n statement.span\n );\n }\n }\n\n for (const statement of node.body) {\n if (hasDefaultExport && statement.type === \"ReturnStatement\") {\n this.pushDiagnostic(\n \"AS-RETURN-AT-TOP\",\n \"warning\",\n \"Top-level return statement is present alongside an export default declaration.\",\n statement.span\n );\n }\n\n this.visitStatement(statement);\n }\n }\n\n private visitStatement(node: Statement): void {\n if (node.type === \"ClassDeclaration\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"FunctionDeclaration\":\n for (const param of node.params) {\n this.visitAssignmentTarget(param);\n }\n this.visitStatement(node.body);\n return;\n case \"ExportNamedDeclaration\":\n this.visitExportNamedDeclaration(node.declaration);\n return;\n case \"ExportDefaultDeclaration\":\n if (!isDefaultExportCallable(node.declaration)) {\n this.pushDiagnostic(\n \"AS-EXPORT-DEFAULT-NOT-ARROW\",\n \"error\",\n \"Export default must be an arrow, function expression, or function declaration.\",\n node.declaration.span\n );\n } else {\n this.visitDefaultExportSignature(node.declaration);\n }\n if (node.declaration.type === \"ClassDeclaration\" || node.declaration.type === \"FunctionDeclaration\") this.visitStatement(node.declaration);\n else this.visitExpression(node.declaration);\n return;\n case \"BlockStatement\":\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n return;\n case \"ExpressionStatement\":\n this.visitExpression(node.expression);\n return;\n case \"IfStatement\":\n this.visitIfStatement(node);\n return;\n case \"ForStatement\":\n this.visitForStatement(node);\n return;\n case \"ForInStatement\":\n case \"ForOfStatement\":\n this.visitForOfStatement(node);\n return;\n case \"WhileStatement\":\n case \"DoWhileStatement\":\n this.visitWhileStatement(node);\n return;\n case \"TryStatement\":\n this.visitTryStatement(node);\n return;\n case \"VariableDeclaration\":\n this.visitVariableDeclaration(node);\n return;\n case \"ReturnStatement\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"ThrowStatement\":\n this.visitThrowStatement(node);\n return;\n case \"ImportDeclaration\":\n case \"BreakStatement\":\n case \"ContinueStatement\":\n return;\n }\n }\n\n private visitExportNamedDeclaration(node: VariableDeclaration): void {\n const declarator = node.declarations[0];\n if (declarator?.id.type === \"Identifier\" && !this.allowedExportNames.has(declarator.id.name)) {\n this.pushDiagnostic(\n \"AS-EXPORT-UNKNOWN\",\n \"error\",\n `Named export '${declarator.id.name}' is not allowed.`,\n declarator.id.span\n );\n }\n\n this.visitVariableDeclaration(node);\n }\n\n private visitDefaultExportSignature(\n node: Extract<Expression, { type: \"ArrowFunctionExpression\" }> | FunctionExpression | FunctionDeclaration\n ): void {\n const parameters = this.defaultExport?.parameters;\n if (parameters === undefined) {\n return;\n }\n\n if (!hasParameterNames(node, parameters)) {\n this.pushDiagnostic(\n \"AS-EXPORT-DEFAULT-SIGNATURE\",\n \"error\",\n `Default export must declare signature (${parameters.join(\", \")}).`,\n node.span\n );\n }\n }\n\n private visitIfStatement(node: IfStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.consequent);\n if (node.alternate !== undefined) {\n this.visitStatement(node.alternate);\n }\n }\n\n private visitForStatement(node: ForStatement): void {\n if (node.init !== undefined) {\n if (node.init.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.init);\n } else {\n this.visitExpression(node.init);\n }\n }\n if (node.test !== undefined) {\n this.visitExpression(node.test);\n }\n if (node.update !== undefined) {\n this.visitExpression(node.update);\n }\n this.visitStatement(node.body);\n }\n\n private visitForOfStatement(node: ForInStatement | ForOfStatement): void {\n if (node.left.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.left);\n } else {\n if (isImportMetaAssignmentTarget(node.left)) {\n this.pushDiagnostic(\n \"AS-IMPORT-META-ASSIGN\",\n \"error\",\n \"Assignment target must not involve import.meta.\",\n node.left.span\n );\n }\n this.visitAssignmentTarget(node.left);\n }\n this.visitExpression(node.right);\n this.visitStatement(node.body);\n }\n\n private visitWhileStatement(node: WhileStatement | DoWhileStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.body);\n }\n\n private visitTryStatement(node: TryStatement): void {\n this.visitStatement(node.block);\n if (node.handler !== undefined) {\n this.visitStatement(node.handler.body);\n }\n if (node.finalizer !== undefined) {\n this.visitStatement(node.finalizer);\n }\n }\n\n private visitVariableDeclaration(node: VariableDeclaration): void {\n for (const declarator of node.declarations) {\n this.visitVariableDeclarator(declarator);\n }\n }\n\n private visitVariableDeclarator(node: VariableDeclarator): void {\n if (node.init !== undefined) {\n this.visitExpression(node.init);\n }\n }\n\n private visitThrowStatement(node: ThrowStatement): void {\n this.visitExpression(node.argument);\n }\n\n private visitExpression(node: Expression): void {\n if (node.type === \"ClassExpression\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"YieldExpression\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"ArrowFunctionExpression\":\n for (const param of node.params) {\n this.visitAssignmentTarget(param);\n }\n if (node.body.type === \"BlockStatement\") {\n this.visitStatement(node.body);\n } else {\n this.visitExpression(node.body);\n }\n return;\n case \"FunctionExpression\":\n for (const param of node.params) {\n this.visitAssignmentTarget(param);\n }\n this.visitStatement(node.body);\n return;\n case \"ImportExpression\":\n this.visitExpression(node.source);\n if (node.options !== undefined) this.visitExpression(node.options);\n return;\n case \"AwaitExpression\":\n this.visitExpression(node.argument);\n return;\n case \"ArrayExpression\":\n this.visitArrayExpression(node);\n return;\n case \"ObjectExpression\":\n this.visitObjectExpression(node);\n return;\n case \"UnaryExpression\":\n this.visitUnaryExpression(node);\n return;\n case \"BinaryExpression\":\n case \"LogicalExpression\":\n this.visitBinaryLikeExpression(node);\n return;\n case \"ConditionalExpression\":\n this.visitConditionalExpression(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentExpression\":\n this.visitAssignmentExpression(node);\n return;\n case \"CallExpression\":\n this.visitCallExpression(node);\n return;\n case \"TemplateLiteral\":\n this.visitTemplateLiteral(node);\n return;\n case \"Identifier\":\n case \"BooleanLiteral\":\n case \"NullLiteral\":\n case \"NumericLiteral\":\n case \"StringLiteral\":\n case \"RegexLiteral\":\n case \"MetaProperty\":\n case \"UndefinedLiteral\":\n return;\n }\n }\n\n private visitArrayExpression(node: ArrayExpression): void {\n for (const element of node.elements) {\n this.visitExpressionOrSpread(element);\n }\n }\n\n private visitObjectExpression(node: ObjectExpression): void {\n for (const property of node.properties) {\n if (property.type === \"SpreadElement\") {\n this.visitExpression(property.argument);\n } else {\n this.visitProperty(property);\n }\n }\n }\n\n private visitProperty(node: Property): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitExpression(node.value);\n }\n\n private visitUnaryExpression(node: UnaryExpression): void {\n this.visitExpression(node.argument);\n }\n\n private visitBinaryLikeExpression(node: BinaryExpression | LogicalExpression): void {\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n }\n\n private visitConditionalExpression(node: ConditionalExpression): void {\n this.visitExpression(node.test);\n this.visitExpression(node.consequent);\n this.visitExpression(node.alternate);\n }\n\n private visitMemberExpression(node: MemberExpression): void {\n this.visitExpression(node.object);\n if (node.computed) {\n this.visitExpression(node.property);\n }\n }\n\n private visitAssignmentExpression(node: AssignmentExpression): void {\n if (isImportMetaAssignmentTarget(node.left)) {\n this.pushDiagnostic(\n \"AS-IMPORT-META-ASSIGN\",\n \"error\",\n \"Assignment target must not involve import.meta.\",\n node.left.span\n );\n }\n\n this.visitAssignmentTarget(node.left);\n this.visitExpression(node.right);\n }\n\n private visitAssignmentTarget(\n node: AssignmentExpression[\"left\"] | AssignmentPattern | RestElement\n ): void {\n switch (node.type) {\n case \"AssignmentPattern\":\n this.visitAssignmentTarget(node.left);\n this.visitExpression(node.right);\n return;\n case \"RestElement\":\n this.visitAssignmentTarget(node.argument);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"ArrayPattern\":\n for (const element of node.elements) {\n if (element !== null) {\n this.visitAssignmentTarget(element);\n }\n }\n return;\n case \"ObjectPattern\":\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.visitAssignmentTarget(property);\n } else {\n this.visitAssignmentTarget(property.value);\n }\n }\n return;\n case \"Identifier\":\n case \"MetaProperty\":\n return;\n }\n }\n\n private visitCallExpression(node: CallExpression): void {\n this.visitExpression(node.callee);\n for (const argument of node.arguments) {\n this.visitExpressionOrSpread(argument);\n }\n }\n\n private visitTemplateLiteral(node: TemplateLiteral): void {\n for (const expression of node.expressions) {\n this.visitExpression(expression);\n }\n }\n\n private visitExpressionOrSpread(node: Expression | SpreadElement): void {\n if (node.type === \"SpreadElement\") {\n this.visitExpression(node.argument);\n return;\n }\n\n this.visitExpression(node);\n }\n\n private pushDiagnostic(\n code: DiagnosticCode,\n severity: Diagnostic[\"severity\"],\n message: string,\n span: SourceSpan\n ): void {\n this.diagnostics.push({\n code,\n severity,\n message,\n filename: this.filename,\n line: span.start.line,\n column: span.start.column,\n span\n });\n }\n}\n\nfunction isDefaultExportCallable(\n node: Expression | import(\"../../parse/parser.js\").ClassDeclaration | FunctionDeclaration\n): node is Extract<Expression, { type: \"ArrowFunctionExpression\" }> | FunctionExpression | FunctionDeclaration {\n return node.type === \"ArrowFunctionExpression\" || node.type === \"FunctionExpression\" || node.type === \"FunctionDeclaration\";\n}\n\nfunction hasParameterNames(\n node: Extract<Expression, { type: \"ArrowFunctionExpression\" }> | FunctionExpression | FunctionDeclaration,\n names: readonly string[]\n): boolean {\n if (node.params.length !== names.length) {\n return false;\n }\n\n return node.params.every(\n (param, index) => param.type === \"Identifier\" && param.name === names[index]\n );\n}\n\nfunction isImportMetaReference(node: AssignmentExpression[\"left\"] | Expression): boolean {\n if (node.type === \"MetaProperty\") {\n return true;\n }\n\n return (\n node.type === \"MemberExpression\" &&\n (isImportMetaReference(node.object) || (node.computed && isImportMetaReference(node.property)))\n );\n}\n\nfunction isImportMetaAssignmentTarget(\n node: AssignmentExpression[\"left\"] | AssignmentPattern | RestElement\n): boolean {\n switch (node.type) {\n case \"MetaProperty\":\n return true;\n case \"MemberExpression\":\n return isImportMetaReference(node);\n case \"AssignmentPattern\":\n return isImportMetaAssignmentTarget(node.left);\n case \"RestElement\":\n return isImportMetaAssignmentTarget(node.argument);\n case \"ArrayPattern\":\n return node.elements.some(\n (element) => element !== null && isImportMetaAssignmentTarget(element)\n );\n case \"ObjectPattern\":\n return node.properties.some((property) =>\n isImportMetaAssignmentTarget(property.type === \"RestElement\" ? property : property.value)\n );\n case \"Identifier\":\n return false;\n }\n}\n", "import { visitClassElements } from \"../class-elements.js\";\nimport {\n parseModule,\n type ArrayExpression,\n type ArrayPattern,\n type FunctionNode,\n type AssignmentExpression,\n type AssignmentPattern,\n type AssignmentProperty,\n type AssignmentTarget,\n type BinaryExpression,\n type BlockStatement,\n type CallExpression,\n type CatchClause,\n type ConditionalExpression,\n type DoWhileStatement,\n type Expression,\n type ForInStatement,\n type ForOfStatement,\n type ForStatement,\n type IfStatement,\n type Identifier,\n type LogicalExpression,\n type MemberExpression,\n type Module,\n type ObjectExpression,\n type ObjectPattern,\n type PatternTarget,\n type Property,\n type RestElement,\n type ReturnStatement,\n type SourceSpan,\n type Statement,\n type TaggedTemplateExpression,\n type TemplateLiteral,\n type ThrowStatement,\n type TryStatement,\n type UnaryExpression,\n type VariableDeclaration,\n type VariableDeclarator,\n type WhileStatement\n} from \"../../parse/parser.js\";\nimport { normalizeModuleRegistrations, type Modules } from \"./module-registry.js\";\n\nexport type Diagnostic = {\n code: \"AS-FLOATING-PROMISE\";\n severity: \"warning\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n};\n\ntype AsyncImportBinding = {\n async: boolean;\n kind: \"import\";\n name: string;\n};\n\ntype LocalBinding = {\n async: boolean;\n kind: \"local\";\n name: string;\n};\n\ntype NamespaceImportBinding = {\n kind: \"namespace-import\";\n moduleName: string;\n name: string;\n};\n\ntype Binding = AsyncImportBinding | LocalBinding | NamespaceImportBinding;\ntype Scope = Map<string, Binding>;\n\nconst AS_FLOATING_PROMISE_MESSAGE =\n \"Promise-returning call is not awaited, returned, stored, or chained.\";\n\nconst PROMISE_CONSUMERS = new Set([\"all\", \"allSettled\", \"any\", \"race\"]);\nconst PROMISE_FACTORIES = new Set([\"reject\", \"resolve\"]);\nconst PROMISE_CHAIN_METHODS = new Set([\"then\"]);\n\nexport function AS_FLOATING_PROMISE(\n source: string,\n options: { filename?: string; modules?: Modules } = {}\n): Diagnostic[] {\n return new ASFloatingPromiseScanner(options.filename ?? \"<input>\", options.modules).scan(source);\n}\n\nclass ASFloatingPromiseScanner {\n private readonly diagnostics: Diagnostic[] = [];\n private readonly moduleRegistrations;\n private readonly scopes: Scope[] = [];\n\n constructor(\n private readonly filename: string,\n modules: Modules | undefined\n ) {\n this.moduleRegistrations = normalizeModuleRegistrations(modules);\n }\n\n scan(source: string): Diagnostic[] {\n this.visitModule(parseModule(source, this.filename));\n return this.diagnostics;\n }\n\n private visitModule(node: Module): void {\n this.withScope(this.collectModuleBindings(node.body), () => {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n });\n }\n\n private visitStatement(node: Statement): void {\n if (node.type === \"ClassDeclaration\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"FunctionDeclaration\":\n this.visitArrowFunction(node);\n return;\n case \"BlockStatement\":\n this.visitBlockStatement(node);\n return;\n case \"ExpressionStatement\":\n this.reportUnhandledLikelyPromiseStatementExpression(node.expression);\n this.visitExpression(node.expression);\n return;\n case \"IfStatement\":\n this.visitIfStatement(node);\n return;\n case \"ForStatement\":\n this.visitForStatement(node);\n return;\n case \"ForInStatement\":\n case \"ForOfStatement\":\n this.visitForOfStatement(node);\n return;\n case \"WhileStatement\":\n case \"DoWhileStatement\":\n this.visitWhileStatement(node);\n return;\n case \"TryStatement\":\n this.visitTryStatement(node);\n return;\n case \"VariableDeclaration\":\n this.visitVariableDeclaration(node);\n return;\n case \"ReturnStatement\":\n this.visitReturnStatement(node);\n return;\n case \"ThrowStatement\":\n this.visitThrowStatement(node);\n return;\n case \"ExportNamedDeclaration\":\n this.visitVariableDeclaration(node.declaration);\n return;\n case \"ExportDefaultDeclaration\":\n if (node.declaration.type === \"ClassDeclaration\" || node.declaration.type === \"FunctionDeclaration\") this.visitStatement(node.declaration);\n else this.visitExpression(node.declaration);\n return;\n case \"ImportDeclaration\":\n case \"BreakStatement\":\n case \"ContinueStatement\":\n return;\n }\n }\n\n private visitBlockStatement(node: BlockStatement): void {\n this.withScope(this.collectBlockBindings(node.body), () => {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n });\n }\n\n private visitIfStatement(node: IfStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.consequent);\n if (node.alternate !== undefined) {\n this.visitStatement(node.alternate);\n }\n }\n\n private visitForStatement(node: ForStatement): void {\n const bindings =\n node.init?.type === \"VariableDeclaration\" ? this.collectDeclarationBindings(node.init) : [];\n\n this.withScope(bindings, () => {\n if (node.init !== undefined) {\n if (node.init.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.init);\n } else {\n this.visitExpression(node.init);\n }\n }\n\n if (node.test !== undefined) {\n this.visitExpression(node.test);\n }\n\n if (node.update !== undefined) {\n this.visitExpression(node.update);\n }\n\n this.visitStatement(node.body);\n });\n }\n\n private visitForOfStatement(node: ForInStatement | ForOfStatement): void {\n const bindings =\n node.left.type === \"VariableDeclaration\" ? this.collectDeclarationBindings(node.left) : [];\n\n this.withScope(bindings, () => {\n if (node.left.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.left);\n } else {\n this.visitAssignmentTarget(node.left);\n }\n this.visitExpression(node.right);\n this.visitStatement(node.body);\n });\n }\n\n private visitWhileStatement(node: WhileStatement | DoWhileStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.body);\n }\n\n private visitTryStatement(node: TryStatement): void {\n this.visitBlockStatement(node.block);\n if (node.handler !== undefined) {\n this.visitCatchClause(node.handler);\n }\n if (node.finalizer !== undefined) {\n this.visitBlockStatement(node.finalizer);\n }\n }\n\n private visitCatchClause(node: CatchClause): void {\n const bindings = node.param === undefined ? [] : this.collectPatternBindings(node.param);\n\n this.withScope(bindings, () => {\n this.visitBlockStatement(node.body);\n });\n }\n\n private visitVariableDeclaration(node: VariableDeclaration): void {\n for (const declarator of node.declarations) {\n this.visitVariableDeclarator(declarator);\n }\n }\n\n private visitVariableDeclarator(node: VariableDeclarator): void {\n this.visitBindingPattern(node.id);\n if (node.init !== undefined) {\n this.visitExpression(node.init);\n }\n }\n\n private visitReturnStatement(node: ReturnStatement): void {\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n }\n\n private visitThrowStatement(node: ThrowStatement): void {\n this.visitExpression(node.argument);\n }\n\n private visitExpression(node: Expression): void {\n if (node.type === \"ClassExpression\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"YieldExpression\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"FunctionExpression\":\n case \"ArrowFunctionExpression\":\n this.visitArrowFunction(node);\n return;\n case \"ImportExpression\":\n this.visitExpression(node.source);\n if (node.options !== undefined) this.visitExpression(node.options);\n return;\n case \"AwaitExpression\":\n this.visitExpression(node.argument);\n return;\n case \"ArrayExpression\":\n this.visitArrayExpression(node);\n return;\n case \"ObjectExpression\":\n this.visitObjectExpression(node);\n return;\n case \"UnaryExpression\":\n this.visitUnaryExpression(node);\n return;\n case \"BinaryExpression\":\n case \"LogicalExpression\":\n this.visitBinaryLikeExpression(node);\n return;\n case \"ConditionalExpression\":\n this.visitConditionalExpression(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentExpression\":\n this.visitAssignmentExpression(node);\n return;\n case \"CallExpression\":\n this.visitCallExpression(node);\n return;\n case \"TemplateLiteral\":\n this.visitTemplateLiteral(node);\n return;\n case \"TaggedTemplateExpression\":\n this.visitTaggedTemplateExpression(node);\n return;\n case \"Identifier\":\n case \"BooleanLiteral\":\n case \"MetaProperty\":\n case \"NullLiteral\":\n case \"NumericLiteral\":\n case \"RegexLiteral\":\n case \"StringLiteral\":\n case \"UndefinedLiteral\":\n return;\n }\n }\n\n private visitArrowFunction(node: FunctionNode): void {\n this.withScope(this.collectArrowFunctionBindings(node), () => {\n if (node.body.type === \"BlockStatement\") {\n this.visitBlockStatement(node.body);\n return;\n }\n\n this.visitExpression(node.body);\n });\n }\n\n private visitArrayExpression(node: ArrayExpression): void {\n for (const element of node.elements) {\n if (element.type === \"SpreadElement\") {\n this.visitExpression(element.argument);\n continue;\n }\n\n this.visitExpression(element);\n }\n }\n\n private visitObjectExpression(node: ObjectExpression): void {\n for (const property of node.properties) {\n if (property.type === \"SpreadElement\") {\n this.visitExpression(property.argument);\n continue;\n }\n\n this.visitProperty(property);\n }\n }\n\n private visitProperty(node: Property): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitExpression(node.value);\n }\n\n private visitUnaryExpression(node: UnaryExpression): void {\n this.visitExpression(node.argument);\n }\n\n private visitBinaryLikeExpression(node: BinaryExpression | LogicalExpression): void {\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n }\n\n private visitConditionalExpression(node: ConditionalExpression): void {\n this.visitExpression(node.test);\n this.visitExpression(node.consequent);\n this.visitExpression(node.alternate);\n }\n\n private visitMemberExpression(node: MemberExpression): void {\n this.visitExpression(node.object);\n if (node.computed) {\n this.visitExpression(node.property);\n }\n }\n\n private visitAssignmentExpression(node: AssignmentExpression): void {\n this.visitAssignmentTarget(node.left);\n this.visitExpression(node.right);\n }\n\n private visitCallExpression(node: CallExpression): void {\n this.visitExpression(node.callee);\n for (const argument of node.arguments) {\n if (argument.type === \"SpreadElement\") {\n this.visitExpression(argument.argument);\n continue;\n }\n\n this.visitExpression(argument);\n }\n }\n\n private visitTemplateLiteral(node: TemplateLiteral): void {\n for (const expression of node.expressions) {\n this.visitExpression(expression);\n }\n }\n\n private visitTaggedTemplateExpression(node: TaggedTemplateExpression): void {\n this.visitExpression(node.tag);\n this.visitTemplateLiteral(node.quasi);\n }\n\n private visitAssignmentTarget(node: AssignmentTarget | PatternTarget): void {\n switch (node.type) {\n case \"ArrayPattern\":\n case \"ObjectPattern\":\n this.visitBindingPattern(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"Identifier\":\n case \"MetaProperty\":\n return;\n }\n }\n\n private visitBindingPattern(node: ArrayPattern | Identifier | ObjectPattern): void {\n switch (node.type) {\n case \"ArrayPattern\":\n for (const element of node.elements) {\n if (element === null) {\n continue;\n }\n\n this.visitBindingElement(element);\n }\n return;\n case \"ObjectPattern\":\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.visitBindingElement(property);\n continue;\n }\n\n this.visitAssignmentProperty(property);\n }\n return;\n case \"Identifier\":\n return;\n }\n }\n\n private visitAssignmentProperty(node: AssignmentProperty): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitBindingElement(node.value);\n }\n\n private visitBindingElement(\n node:\n | AssignmentPattern\n | ArrayPattern\n | Identifier\n | MemberExpression\n | ObjectPattern\n | RestElement\n ): void {\n switch (node.type) {\n case \"AssignmentPattern\":\n this.visitAssignmentTarget(node.left);\n this.visitExpression(node.right);\n return;\n case \"RestElement\":\n this.visitAssignmentTarget(node.argument);\n return;\n case \"ArrayPattern\":\n case \"ObjectPattern\":\n case \"Identifier\":\n this.visitBindingPattern(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n }\n }\n\n private isUnhandledLikelyPromiseExpression(node: Expression): boolean {\n if (node.type === \"ImportExpression\") return true;\n if (node.type !== \"CallExpression\") {\n return false;\n }\n\n if (this.isPromiseConsumerCall(node) || this.isPromiseChainCall(node)) {\n return false;\n }\n\n return this.isLikelyPromiseCall(node);\n }\n\n private reportUnhandledLikelyPromiseStatementExpression(node: Expression): void {\n if (this.isUnhandledLikelyPromiseExpression(node)) {\n this.report(node.span);\n return;\n }\n\n switch (node.type) {\n case \"LogicalExpression\":\n this.reportUnhandledLikelyPromiseStatementExpression(node.left);\n this.reportUnhandledLikelyPromiseStatementExpression(node.right);\n return;\n case \"ConditionalExpression\":\n this.reportUnhandledLikelyPromiseStatementExpression(node.consequent);\n this.reportUnhandledLikelyPromiseStatementExpression(node.alternate);\n return;\n case \"CallExpression\":\n case \"FunctionExpression\":\n case \"ArrowFunctionExpression\":\n case \"AwaitExpression\":\n case \"ArrayExpression\":\n case \"ObjectExpression\":\n case \"UnaryExpression\":\n case \"BinaryExpression\":\n case \"MemberExpression\":\n case \"AssignmentExpression\":\n case \"TemplateLiteral\":\n case \"TaggedTemplateExpression\":\n case \"Identifier\":\n case \"BooleanLiteral\":\n case \"MetaProperty\":\n case \"NullLiteral\":\n case \"NumericLiteral\":\n case \"RegexLiteral\":\n case \"StringLiteral\":\n case \"UndefinedLiteral\":\n return;\n }\n }\n\n private isLikelyPromiseCall(node: CallExpression): boolean {\n if (node.callee.type === \"ArrowFunctionExpression\") {\n return node.callee.async;\n }\n\n if (node.callee.type === \"Identifier\") {\n return this.resolveAsyncFunctionBinding(node.callee.name);\n }\n\n if (node.callee.type !== \"MemberExpression\") {\n return false;\n }\n\n if (this.isPromiseFactoryCall(node)) {\n return true;\n }\n\n return this.isAsyncNamespaceMemberCall(node.callee);\n }\n\n private isPromiseConsumerCall(node: CallExpression): boolean {\n return this.isPromiseStaticMethodCall(node, PROMISE_CONSUMERS);\n }\n\n private isPromiseFactoryCall(node: CallExpression): boolean {\n return this.isPromiseStaticMethodCall(node, PROMISE_FACTORIES);\n }\n\n private isPromiseStaticMethodCall(\n node: CallExpression,\n methodNames: ReadonlySet<string>\n ): boolean {\n const member = node.callee.type === \"MemberExpression\" ? node.callee : undefined;\n return (\n member !== undefined &&\n !member.computed &&\n member.object.type === \"Identifier\" &&\n member.object.name === \"Promise\" &&\n member.property.type === \"Identifier\" &&\n methodNames.has(member.property.name)\n );\n }\n\n private isPromiseChainCall(node: CallExpression): boolean {\n const member = node.callee.type === \"MemberExpression\" ? node.callee : undefined;\n return (\n member !== undefined &&\n !member.computed &&\n member.property.type === \"Identifier\" &&\n PROMISE_CHAIN_METHODS.has(member.property.name) &&\n this.isLikelyPromiseExpression(member.object)\n );\n }\n\n private isLikelyPromiseExpression(node: Expression): boolean {\n return node.type === \"ImportExpression\" || (node.type === \"CallExpression\" && this.isLikelyPromiseCall(node));\n }\n\n private resolveAsyncFunctionBinding(name: string): boolean {\n const binding = this.resolveBinding(name);\n return (binding?.kind === \"import\" || binding?.kind === \"local\") && binding.async === true;\n }\n\n private isAsyncNamespaceMemberCall(member: MemberExpression): boolean {\n if (\n member.computed ||\n member.object.type !== \"Identifier\" ||\n member.property.type !== \"Identifier\"\n ) {\n return false;\n }\n\n const binding = this.resolveBinding(member.object.name);\n if (binding?.kind !== \"namespace-import\") {\n return false;\n }\n\n return (\n this.moduleRegistrations.get(binding.moduleName)?.asyncExports.has(member.property.name) ===\n true\n );\n }\n\n private collectModuleBindings(statements: readonly Statement[]): Binding[] {\n return [\n ...statements.flatMap((statement): Binding[] => {\n if (statement.type !== \"ImportDeclaration\") {\n return [];\n }\n\n return statement.specifiers.flatMap((specifier): Binding[] => {\n if (specifier.type === \"ImportNamespaceSpecifier\") {\n return [\n {\n kind: \"namespace-import\",\n moduleName: statement.source.value,\n name: specifier.local.name\n }\n ];\n }\n\n const exportName =\n specifier.type === \"ImportDefaultSpecifier\" ? \"default\" : specifier.imported.name;\n\n return [\n {\n async:\n this.moduleRegistrations\n .get(statement.source.value)\n ?.asyncExports.has(exportName) === true,\n kind: \"import\",\n name: specifier.local.name\n }\n ];\n });\n }),\n ...this.collectBlockBindings(statements)\n ];\n }\n\n private collectBlockBindings(statements: readonly Statement[]): Binding[] {\n return statements.flatMap((entry) => {\n const statement = entry.type === \"ExportDefaultDeclaration\" && entry.declaration.type === \"FunctionDeclaration\" ? entry.declaration : entry;\n if (statement.type === \"FunctionDeclaration\" && statement.id !== undefined) {\n return [\n { async: statement.async && !statement.generator, kind: \"local\", name: statement.id.name }\n ];\n }\n if (statement.type === \"VariableDeclaration\") {\n return this.collectDeclarationBindings(statement);\n }\n\n if (statement.type === \"ExportNamedDeclaration\") {\n return this.collectDeclarationBindings(statement.declaration);\n }\n\n return [];\n });\n }\n\n private collectDeclarationBindings(node: VariableDeclaration): Binding[] {\n return node.declarations.flatMap((declarator) =>\n this.collectDeclaratorBindings(declarator).map((name) => ({\n async:\n (declarator.init?.type === \"ArrowFunctionExpression\" ||\n (declarator.init?.type === \"FunctionExpression\" && !declarator.init.generator)) &&\n declarator.init.async,\n kind: \"local\" as const,\n name\n }))\n );\n }\n\n private collectDeclaratorBindings(node: VariableDeclarator): string[] {\n return this.collectPatternBindingNames(node.id);\n }\n\n private collectArrowFunctionBindings(node: FunctionNode): Binding[] {\n const bindings: Binding[] = node.params.flatMap((param) =>\n this.collectParameterBindingNames(param).map((name) => ({\n async: false,\n kind: \"local\" as const,\n name\n }))\n );\n if (node.type === \"FunctionExpression\" && node.id !== undefined) {\n bindings.unshift({ async: node.async && !node.generator, kind: \"local\", name: node.id.name });\n }\n return bindings;\n }\n\n private collectPatternBindings(node: ArrayPattern | Identifier | ObjectPattern): Binding[] {\n return this.collectPatternBindingNames(node).map((name) => ({\n async: false,\n kind: \"local\" as const,\n name\n }));\n }\n\n private collectParameterBindingNames(\n node: AssignmentPattern | ArrayPattern | Identifier | ObjectPattern | RestElement\n ): string[] {\n switch (node.type) {\n case \"AssignmentPattern\":\n return this.collectPatternBindingNames(node.left);\n case \"RestElement\":\n return this.collectPatternBindingNames(node.argument);\n case \"ArrayPattern\":\n case \"ObjectPattern\":\n case \"Identifier\":\n return this.collectPatternBindingNames(node);\n }\n }\n\n private collectPatternBindingNames(\n node: ArrayPattern | Identifier | ObjectPattern | PatternTarget\n ): string[] {\n switch (node.type) {\n case \"Identifier\":\n return [node.name];\n case \"ArrayPattern\":\n return node.elements.flatMap((element) => {\n if (element === null) {\n return [];\n }\n\n return this.collectBindingElementNames(element);\n });\n case \"ObjectPattern\":\n return node.properties.flatMap((property) => {\n if (property.type === \"RestElement\") {\n return this.collectBindingElementNames(property);\n }\n\n return this.collectBindingElementNames(property.value);\n });\n case \"MemberExpression\":\n return [];\n }\n }\n\n private collectBindingElementNames(\n node:\n | AssignmentPattern\n | ArrayPattern\n | Identifier\n | MemberExpression\n | ObjectPattern\n | RestElement\n ): string[] {\n switch (node.type) {\n case \"AssignmentPattern\":\n return this.collectPatternBindingNames(node.left);\n case \"RestElement\":\n return this.collectPatternBindingNames(node.argument);\n case \"ArrayPattern\":\n case \"ObjectPattern\":\n case \"Identifier\":\n return this.collectPatternBindingNames(node);\n case \"MemberExpression\":\n return [];\n }\n }\n\n private resolveBinding(name: string): Binding | undefined {\n for (let index = this.scopes.length - 1; index >= 0; index -= 1) {\n const binding = this.scopes[index]?.get(name);\n if (binding !== undefined) {\n return binding;\n }\n }\n\n return undefined;\n }\n\n private withScope(bindings: readonly Binding[], callback: () => void): void {\n this.scopes.push(new Map(bindings.map((binding) => [binding.name, binding])));\n try {\n callback();\n } finally {\n this.scopes.pop();\n }\n }\n\n private report(span: SourceSpan): void {\n this.diagnostics.push({\n code: \"AS-FLOATING-PROMISE\",\n severity: \"warning\",\n message: AS_FLOATING_PROMISE_MESSAGE,\n filename: this.filename,\n line: span.start.line,\n column: span.start.column,\n span\n });\n }\n}\n", "import { visitClassElements } from \"../class-elements.js\";\nimport {\n parseModule,\n type ArrayExpression,\n type ArrayPattern,\n type FunctionNode,\n type AssignmentExpression,\n type AssignmentPattern,\n type AssignmentProperty,\n type BinaryExpression,\n type BlockStatement,\n type CallExpression,\n type CatchClause,\n type ConditionalExpression,\n type DoWhileStatement,\n type Expression,\n type ForInStatement,\n type ForOfStatement,\n type ForStatement,\n type Identifier,\n type IfStatement,\n type LogicalExpression,\n type MemberExpression,\n type Module,\n type ObjectExpression,\n type ObjectPattern,\n type PatternTarget,\n type Property,\n type RestElement,\n type SourceSpan,\n type Statement,\n type TaggedTemplateExpression,\n type TemplateLiteral,\n type ThrowStatement,\n type TryStatement,\n type UnaryExpression,\n type VariableDeclaration,\n type VariableDeclarator,\n type WhileStatement\n} from \"../../parse/parser.js\";\n\nexport type Diagnostic = {\n code: \"AS-FRONTMATTER-FIELD-UNUSED\";\n severity: \"info\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n};\n\nexport function AS_FRONTMATTER_FIELD_UNUSED(\n source: string,\n options: { filename?: string; frontmatterFields?: readonly string[] } = {}\n): Diagnostic[] {\n if (options.frontmatterFields === undefined) {\n return [];\n }\n\n return new ASFrontmatterFieldUnusedScanner(\n options.filename ?? \"<input>\",\n new Set(options.frontmatterFields)\n ).scan(source);\n}\n\nclass ASFrontmatterFieldUnusedScanner {\n private readonly reads = new Set<string>();\n private suppressDiagnostics = false;\n\n constructor(\n private readonly filename: string,\n private readonly fields: ReadonlySet<string>\n ) {}\n\n scan(source: string): Diagnostic[] {\n if (this.fields.size === 0) {\n return [];\n }\n\n const module = parseModule(source, this.filename);\n this.visitModule(module);\n\n if (this.suppressDiagnostics) {\n return [];\n }\n\n return [...this.fields]\n .filter((field) => !this.reads.has(field))\n .sort()\n .map((field) => this.createDiagnostic(module.span, field));\n }\n\n private visitModule(node: Module): void {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n }\n\n private visitStatement(node: Statement): void {\n if (node.type === \"ClassDeclaration\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"FunctionDeclaration\":\n this.visitArrowFunction(node);\n return;\n case \"BlockStatement\":\n this.visitBlockStatement(node);\n return;\n case \"ExpressionStatement\":\n this.visitExpression(node.expression);\n return;\n case \"IfStatement\":\n this.visitIfStatement(node);\n return;\n case \"ForStatement\":\n this.visitForStatement(node);\n return;\n case \"ForInStatement\":\n case \"ForOfStatement\":\n this.visitForOfStatement(node);\n return;\n case \"WhileStatement\":\n case \"DoWhileStatement\":\n this.visitWhileStatement(node);\n return;\n case \"TryStatement\":\n this.visitTryStatement(node);\n return;\n case \"VariableDeclaration\":\n this.visitVariableDeclaration(node);\n return;\n case \"ReturnStatement\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"ThrowStatement\":\n this.visitThrowStatement(node);\n return;\n case \"ExportNamedDeclaration\":\n this.visitVariableDeclaration(node.declaration);\n return;\n case \"ExportDefaultDeclaration\":\n if (node.declaration.type === \"ClassDeclaration\" || node.declaration.type === \"FunctionDeclaration\") this.visitStatement(node.declaration);\n else this.visitExpression(node.declaration);\n return;\n case \"ImportDeclaration\":\n case \"BreakStatement\":\n case \"ContinueStatement\":\n return;\n }\n }\n\n private visitBlockStatement(node: BlockStatement): void {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n }\n\n private visitIfStatement(node: IfStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.consequent);\n if (node.alternate !== undefined) {\n this.visitStatement(node.alternate);\n }\n }\n\n private visitForStatement(node: ForStatement): void {\n if (node.init !== undefined) {\n if (node.init.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.init);\n } else {\n this.visitExpression(node.init);\n }\n }\n if (node.test !== undefined) {\n this.visitExpression(node.test);\n }\n if (node.update !== undefined) {\n this.visitExpression(node.update);\n }\n this.visitStatement(node.body);\n }\n\n private visitForOfStatement(node: ForInStatement | ForOfStatement): void {\n if (node.left.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.left);\n } else {\n this.visitAssignmentTarget(node.left);\n }\n this.visitExpression(node.right);\n this.visitStatement(node.body);\n }\n\n private visitWhileStatement(node: WhileStatement | DoWhileStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.body);\n }\n\n private visitTryStatement(node: TryStatement): void {\n this.visitBlockStatement(node.block);\n if (node.handler !== undefined) {\n this.visitCatchClause(node.handler);\n }\n if (node.finalizer !== undefined) {\n this.visitBlockStatement(node.finalizer);\n }\n }\n\n private visitCatchClause(node: CatchClause): void {\n if (node.param !== undefined) {\n this.visitBindingPattern(node.param);\n }\n this.visitBlockStatement(node.body);\n }\n\n private visitVariableDeclaration(node: VariableDeclaration): void {\n for (const declarator of node.declarations) {\n this.visitVariableDeclarator(declarator);\n }\n }\n\n private visitVariableDeclarator(node: VariableDeclarator): void {\n if (node.init !== undefined && isFrontmatterIdentifier(node.init)) {\n this.collectObjectPatternReads(node.id);\n } else {\n this.visitBindingPattern(node.id);\n if (node.init !== undefined) {\n this.visitExpression(node.init);\n }\n }\n }\n\n private visitThrowStatement(node: ThrowStatement): void {\n this.visitExpression(node.argument);\n }\n\n private visitExpression(node: Expression): void {\n if (node.type === \"ClassExpression\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"YieldExpression\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"FunctionExpression\":\n case \"ArrowFunctionExpression\":\n this.visitArrowFunction(node);\n return;\n case \"ImportExpression\":\n this.visitExpression(node.source);\n if (node.options !== undefined) this.visitExpression(node.options);\n return;\n case \"AwaitExpression\":\n this.visitExpression(node.argument);\n return;\n case \"ArrayExpression\":\n this.visitArrayExpression(node);\n return;\n case \"ObjectExpression\":\n this.visitObjectExpression(node);\n return;\n case \"UnaryExpression\":\n this.visitUnaryExpression(node);\n return;\n case \"BinaryExpression\":\n case \"LogicalExpression\":\n this.visitBinaryLikeExpression(node);\n return;\n case \"ConditionalExpression\":\n this.visitConditionalExpression(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentExpression\":\n this.visitAssignmentExpression(node);\n return;\n case \"CallExpression\":\n this.visitCallExpression(node);\n return;\n case \"TemplateLiteral\":\n this.visitTemplateLiteral(node);\n return;\n case \"TaggedTemplateExpression\":\n this.visitTaggedTemplateExpression(node);\n return;\n case \"Identifier\":\n case \"BooleanLiteral\":\n case \"NullLiteral\":\n case \"NumericLiteral\":\n case \"StringLiteral\":\n case \"RegexLiteral\":\n case \"MetaProperty\":\n case \"UndefinedLiteral\":\n return;\n }\n }\n\n private visitArrowFunction(node: FunctionNode): void {\n for (const parameter of node.params) {\n this.visitBindingElement(parameter);\n }\n if (node.body.type === \"BlockStatement\") {\n this.visitBlockStatement(node.body);\n return;\n }\n\n this.visitExpression(node.body);\n }\n\n private visitArrayExpression(node: ArrayExpression): void {\n for (const element of node.elements) {\n if (element.type === \"SpreadElement\") {\n this.visitExpression(element.argument);\n } else {\n this.visitExpression(element);\n }\n }\n }\n\n private visitObjectExpression(node: ObjectExpression): void {\n for (const property of node.properties) {\n if (property.type === \"SpreadElement\") {\n this.visitExpression(property.argument);\n } else {\n this.visitProperty(property);\n }\n }\n }\n\n private visitProperty(node: Property): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitExpression(node.value);\n }\n\n private visitUnaryExpression(node: UnaryExpression): void {\n this.visitExpression(node.argument);\n }\n\n private visitBinaryLikeExpression(node: BinaryExpression | LogicalExpression): void {\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n }\n\n private visitConditionalExpression(node: ConditionalExpression): void {\n this.visitExpression(node.test);\n this.visitExpression(node.consequent);\n this.visitExpression(node.alternate);\n }\n\n private visitMemberExpression(node: MemberExpression): void {\n if (isFrontmatterIdentifier(node.object)) {\n this.collectMemberRead(node);\n } else {\n this.visitExpression(node.object);\n }\n\n if (node.computed) {\n this.visitExpression(node.property);\n }\n }\n\n private visitAssignmentExpression(node: AssignmentExpression): void {\n if (isFrontmatterIdentifier(node.right)) {\n this.collectObjectPatternReads(node.left);\n return;\n }\n\n this.visitAssignmentTarget(node.left);\n this.visitExpression(node.right);\n }\n\n private visitCallExpression(node: CallExpression): void {\n this.visitExpression(node.callee);\n for (const argument of node.arguments) {\n if (argument.type === \"SpreadElement\") {\n this.visitExpression(argument.argument);\n } else {\n this.visitExpression(argument);\n }\n }\n }\n\n private visitTemplateLiteral(node: TemplateLiteral): void {\n for (const expression of node.expressions) {\n this.visitExpression(expression);\n }\n }\n\n private visitTaggedTemplateExpression(node: TaggedTemplateExpression): void {\n this.visitExpression(node.tag);\n this.visitTemplateLiteral(node.quasi);\n }\n\n private visitBindingElement(\n node: AssignmentPattern | ArrayPattern | ObjectPattern | RestElement | PatternTarget\n ): void {\n if (node.type === \"RestElement\") {\n this.visitBindingPattern(node.argument);\n return;\n }\n this.visitBindingPattern(node);\n }\n\n private visitBindingPattern(\n node: AssignmentPattern | ArrayPattern | ObjectPattern | PatternTarget\n ): void {\n switch (node.type) {\n case \"Identifier\":\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentPattern\":\n this.visitAssignmentPattern(node);\n return;\n case \"ArrayPattern\":\n this.visitArrayPattern(node);\n return;\n case \"ObjectPattern\":\n this.visitObjectPattern(node);\n return;\n }\n }\n\n private visitAssignmentPattern(node: AssignmentPattern): void {\n this.visitBindingPattern(node.left);\n this.visitExpression(node.right);\n }\n\n private visitArrayPattern(node: ArrayPattern): void {\n for (const element of node.elements) {\n if (element !== null) {\n this.visitBindingElement(element);\n }\n }\n }\n\n private visitObjectPattern(node: ObjectPattern): void {\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.visitBindingPattern(property.argument);\n } else {\n this.visitAssignmentProperty(property);\n }\n }\n }\n\n private visitAssignmentProperty(node: AssignmentProperty): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitBindingPattern(node.value);\n }\n\n private visitAssignmentTarget(node: AssignmentExpression[\"left\"]): void {\n if (node.type !== \"MetaProperty\") {\n this.visitBindingPattern(node);\n }\n }\n\n private collectMemberRead(node: MemberExpression): void {\n if (!node.computed && node.property.type === \"Identifier\") {\n this.markRead(node.property.name);\n return;\n }\n\n if (node.computed && node.property.type === \"StringLiteral\") {\n this.markRead(node.property.value);\n return;\n }\n\n if (node.computed) {\n this.suppressDiagnostics = true;\n }\n }\n\n private collectObjectPatternReads(\n node: AssignmentExpression[\"left\"] | VariableDeclarator[\"id\"]\n ): void {\n if (node.type !== \"ObjectPattern\") {\n if (node.type !== \"MetaProperty\") {\n this.visitBindingPattern(node);\n }\n return;\n }\n\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.suppressDiagnostics = true;\n continue;\n }\n\n const field = readStaticPropertyKey(property);\n if (field === undefined) {\n this.suppressDiagnostics = true;\n continue;\n }\n\n this.markRead(field);\n this.visitBindingPattern(property.value);\n }\n }\n\n private markRead(field: string): void {\n if (this.fields.has(field)) {\n this.reads.add(field);\n }\n }\n\n private createDiagnostic(span: SourceSpan, field: string): Diagnostic {\n return {\n code: \"AS-FRONTMATTER-FIELD-UNUSED\",\n severity: \"info\",\n message: `Frontmatter field '${field}' is declared by the schema but never read.`,\n filename: this.filename,\n line: span.start.line,\n column: span.start.column,\n span\n };\n }\n}\n\nfunction isFrontmatterIdentifier(node: Expression): node is Identifier {\n return node.type === \"Identifier\" && node.name === \"frontmatter\";\n}\n\nfunction readStaticPropertyKey(property: AssignmentProperty): string | undefined {\n if (property.computed) {\n return property.key.type === \"StringLiteral\" ? property.key.value : undefined;\n }\n\n return readPropertyKey(property.key);\n}\n\nfunction readPropertyKey(node: Expression): string | undefined {\n if (node.type === \"Identifier\") {\n return node.name;\n }\n\n if (node.type === \"StringLiteral\") {\n return node.value;\n }\n\n return undefined;\n}\n", "import { ParseError } from \"../../parse/format-error.js\";\nimport {\n DisallowedSyntaxError,\n type ImportDeclaration,\n type SourceSpan\n} from \"../../parse/parser.js\";\nimport {\n collectSafeJSSourceModules,\n collectImportDeclarations,\n type Modules\n} from \"./module-registry.js\";\n\nexport type Diagnostic = {\n code: \"AS-IMPORT-CYCLE\";\n severity: \"error\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n};\n\ntype ImportEdge = {\n declaration: ImportDeclaration;\n filename: string;\n moduleName: string;\n targetModuleName: string;\n};\n\nexport function AS_IMPORT_CYCLE(\n source: string,\n options: { filename?: string; modules?: Modules } = {}\n): Diagnostic[] {\n const filename = options.filename ?? \"<input>\";\n const sourceModules = collectSafeJSSourceModules(options.modules);\n\n if (sourceModules.size === 0) {\n return [];\n }\n\n const dependencyGraph = new Map<string, readonly string[]>();\n const importEdges: ImportEdge[] = [];\n\n for (const sourceModule of sourceModules.values()) {\n const moduleSource = sourceModule.filename === filename ? source : sourceModule.source;\n const declarations = collectImportDeclarationsForCycleRule(moduleSource, sourceModule.filename);\n const targetModuleNames = declarations\n .map((declaration) => declaration.source.value)\n .filter((targetModuleName) => sourceModules.has(targetModuleName));\n\n dependencyGraph.set(sourceModule.moduleName, [...new Set(targetModuleNames)]);\n\n importEdges.push(\n ...declarations.flatMap((declaration) => {\n const targetModuleName = declaration.source.value;\n return sourceModules.has(targetModuleName)\n ? [\n {\n declaration,\n filename: sourceModule.filename,\n moduleName: sourceModule.moduleName,\n targetModuleName\n }\n ]\n : [];\n })\n );\n }\n\n return importEdges.flatMap((edge) => {\n const cyclePath = findPathToModule(\n edge.targetModuleName,\n edge.moduleName,\n dependencyGraph,\n new Set()\n );\n return cyclePath === undefined\n ? []\n : [\n createDiagnostic(\n edge.declaration.source.span,\n edge.targetModuleName,\n [edge.moduleName, ...cyclePath],\n edge.filename\n )\n ];\n });\n}\n\nfunction collectImportDeclarationsForCycleRule(\n source: string,\n filename: string\n): ImportDeclaration[] {\n try {\n return collectImportDeclarations(source, filename);\n } catch (error) {\n if (error instanceof ParseError || error instanceof DisallowedSyntaxError) {\n return [];\n }\n\n throw error;\n }\n}\n\nfunction createDiagnostic(\n span: SourceSpan,\n importedModuleName: string,\n cyclePath: readonly string[],\n filename: string\n): Diagnostic {\n return {\n code: \"AS-IMPORT-CYCLE\",\n severity: \"error\",\n message: `Import from '${importedModuleName}' participates in a cyclic dependency: ${cyclePath.join(\" -> \")}.`,\n filename,\n line: span.start.line,\n column: span.start.column,\n span\n };\n}\n\nfunction findPathToModule(\n currentModuleName: string,\n targetModuleName: string,\n dependencyGraph: ReadonlyMap<string, readonly string[]>,\n visited: Set<string>\n): string[] | undefined {\n if (currentModuleName === targetModuleName) {\n return [targetModuleName];\n }\n\n if (visited.has(currentModuleName)) {\n return undefined;\n }\n\n visited.add(currentModuleName);\n\n for (const dependencyModuleName of dependencyGraph.get(currentModuleName) ?? []) {\n const path = findPathToModule(dependencyModuleName, targetModuleName, dependencyGraph, visited);\n if (path !== undefined) {\n return [currentModuleName, ...path];\n }\n }\n\n visited.delete(currentModuleName);\n return undefined;\n}\n", "import { visitClassElements } from \"../class-elements.js\";\nimport {\n parseModule,\n type ArrayExpression,\n type FunctionNode,\n type AssignmentExpression,\n type BinaryExpression,\n type BlockStatement,\n type CallExpression,\n type CatchClause,\n type ConditionalExpression,\n type DoWhileStatement,\n type Expression,\n type ForInStatement,\n type ForOfStatement,\n type ForStatement,\n type LogicalExpression,\n type MemberExpression,\n type Module,\n type ObjectExpression,\n type Property,\n type SourceSpan,\n type Statement,\n type TaggedTemplateExpression,\n type TemplateLiteral,\n type ThrowStatement,\n type TryStatement,\n type UnaryExpression,\n type VariableDeclaration,\n type VariableDeclarator,\n type WhileStatement\n} from \"../../parse/parser.js\";\nimport { hasTypedModuleRegistrations, type Modules } from \"./module-registry.js\";\n\ntype PrimitiveType = \"boolean\" | \"null\" | \"number\" | \"string\" | \"undefined\";\n\ntype SupportedType =\n | {\n kind: \"array\";\n element: PrimitiveType;\n }\n | {\n kind: \"object\";\n fields: ReadonlyMap<string, PrimitiveType>;\n }\n | {\n kind: \"primitive\";\n name: PrimitiveType;\n };\n\ntype ParsedType =\n | {\n status: \"invalid\";\n }\n | {\n status: \"supported\";\n type: SupportedType;\n }\n | {\n status: \"unsupported\";\n };\n\ntype ParsedObjectFields =\n | {\n fields: ReadonlyMap<string, PrimitiveType>;\n status: \"supported\";\n }\n | {\n status: \"invalid\" | \"unsupported\";\n };\n\ntype JsdocTypeTag = {\n kind: \"type\";\n raw: string;\n span: SourceSpan;\n type?: SupportedType;\n};\n\ntype JsdocParamTag = {\n kind: \"param\";\n name: string;\n raw: string;\n span: SourceSpan;\n type?: SupportedType;\n};\n\ntype ParsedJsdoc = {\n params: JsdocParamTag[];\n type?: JsdocTypeTag;\n};\n\ntype JsdocBlock = {\n endOffset: number;\n startOffset: number;\n};\n\nexport type Diagnostic = {\n code: \"AS-JSDOC-TYPE\";\n severity: \"warning\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n};\n\nexport function AS_JSDOC_TYPE(\n source: string,\n options: { filename?: string; modules?: Modules } = {}\n): Diagnostic[] {\n if (!hasTypedModuleRegistrations(options.modules)) {\n return [];\n }\n\n return new ASJsdocTypeScanner(source, options.filename ?? \"<input>\").scan();\n}\n\nclass ASJsdocTypeScanner {\n private readonly diagnostics: Diagnostic[] = [];\n private readonly jsdocBlocks: JsdocBlock[];\n private readonly parsedJsdoc = new Map<number, ParsedJsdoc>();\n\n constructor(\n private readonly source: string,\n private readonly filename: string\n ) {\n this.jsdocBlocks = collectJsdocBlocks(source);\n }\n\n scan(): Diagnostic[] {\n this.visitModule(parseModule(this.source, this.filename));\n return this.diagnostics;\n }\n\n private visitModule(node: Module): void {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n }\n\n private visitStatement(node: Statement): void {\n if (node.type === \"ClassDeclaration\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"FunctionDeclaration\":\n this.visitArrowFunction(node);\n return;\n case \"BlockStatement\":\n this.visitBlockStatement(node);\n return;\n case \"ExpressionStatement\":\n if (node.expression.type === \"AssignmentExpression\") {\n this.validateAssignmentExpression(\n node.expression,\n this.findLeadingJsdoc(node.span.start.offset)\n );\n }\n this.visitExpression(node.expression);\n return;\n case \"IfStatement\":\n this.visitExpression(node.test);\n this.visitStatement(node.consequent);\n if (node.alternate !== undefined) {\n this.visitStatement(node.alternate);\n }\n return;\n case \"ForStatement\":\n this.visitForStatement(node);\n return;\n case \"ForInStatement\":\n case \"ForOfStatement\":\n this.visitForOfStatement(node);\n return;\n case \"WhileStatement\":\n case \"DoWhileStatement\":\n this.visitWhileStatement(node);\n return;\n case \"TryStatement\":\n this.visitTryStatement(node);\n return;\n case \"VariableDeclaration\":\n this.visitVariableDeclaration(node, this.findLeadingJsdoc(node.span.start.offset));\n return;\n case \"ReturnStatement\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"ThrowStatement\":\n this.visitThrowStatement(node);\n return;\n case \"ExportNamedDeclaration\":\n this.visitVariableDeclaration(\n node.declaration,\n this.findLeadingJsdoc(node.span.start.offset)\n );\n return;\n case \"ExportDefaultDeclaration\":\n if (node.declaration.type === \"ClassDeclaration\" || node.declaration.type === \"FunctionDeclaration\") this.visitStatement(node.declaration);\n else this.visitExpression(node.declaration);\n return;\n case \"ImportDeclaration\":\n case \"BreakStatement\":\n case \"ContinueStatement\":\n return;\n }\n }\n\n private visitBlockStatement(node: BlockStatement): void {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n }\n\n private visitForStatement(node: ForStatement): void {\n if (node.init !== undefined) {\n if (node.init.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(\n node.init,\n this.findLeadingJsdoc(node.init.span.start.offset)\n );\n } else {\n this.visitExpression(node.init);\n }\n }\n if (node.test !== undefined) {\n this.visitExpression(node.test);\n }\n if (node.update !== undefined) {\n this.visitExpression(node.update);\n }\n this.visitStatement(node.body);\n }\n\n private visitForOfStatement(node: ForInStatement | ForOfStatement): void {\n if (node.left.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.left, this.findLeadingJsdoc(node.left.span.start.offset));\n }\n this.visitExpression(node.right);\n this.visitStatement(node.body);\n }\n\n private visitWhileStatement(node: WhileStatement | DoWhileStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.body);\n }\n\n private visitTryStatement(node: TryStatement): void {\n this.visitBlockStatement(node.block);\n if (node.handler !== undefined) {\n this.visitCatchClause(node.handler);\n }\n if (node.finalizer !== undefined) {\n this.visitBlockStatement(node.finalizer);\n }\n }\n\n private visitCatchClause(node: CatchClause): void {\n this.visitBlockStatement(node.body);\n }\n\n private visitThrowStatement(node: ThrowStatement): void {\n this.visitExpression(node.argument);\n }\n\n private visitVariableDeclaration(\n node: VariableDeclaration,\n jsdoc: ParsedJsdoc | undefined\n ): void {\n for (const declarator of node.declarations) {\n this.visitVariableDeclarator(declarator, jsdoc);\n }\n }\n\n private visitVariableDeclarator(node: VariableDeclarator, jsdoc: ParsedJsdoc | undefined): void {\n if (node.init !== undefined && jsdoc?.type?.type !== undefined) {\n this.validateExpression(jsdoc.type.type, jsdoc.type.raw, node.init);\n }\n\n if (node.init?.type === \"ArrowFunctionExpression\" && jsdoc !== undefined) {\n this.validateArrowParams(node.init, jsdoc);\n }\n\n if (node.init !== undefined) {\n this.visitExpression(node.init);\n }\n }\n\n private validateAssignmentExpression(\n node: AssignmentExpression,\n jsdoc: ParsedJsdoc | undefined\n ): void {\n if (node.operator === \"=\" && jsdoc?.type?.type !== undefined) {\n this.validateExpression(jsdoc.type.type, jsdoc.type.raw, node.right);\n }\n }\n\n private validateArrowParams(node: FunctionNode, jsdoc: ParsedJsdoc): void {\n const typedParams = new Map(\n jsdoc.params.filter((param) => param.type !== undefined).map((param) => [param.name, param])\n );\n\n for (const param of node.params) {\n if (param.type !== \"AssignmentPattern\" || param.left.type !== \"Identifier\") {\n continue;\n }\n\n const tag = typedParams.get(param.left.name);\n if (tag?.type !== undefined) {\n this.validateExpression(tag.type, tag.raw, param.right);\n }\n }\n }\n\n private visitExpression(node: Expression): void {\n if (node.type === \"ClassExpression\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"YieldExpression\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"FunctionExpression\":\n case \"ArrowFunctionExpression\":\n this.visitArrowFunction(node);\n return;\n case \"AssignmentExpression\":\n this.visitExpression(node.right);\n return;\n case \"ArrayExpression\":\n this.visitArrayExpression(node);\n return;\n case \"ObjectExpression\":\n this.visitObjectExpression(node);\n return;\n case \"UnaryExpression\":\n this.visitUnaryExpression(node);\n return;\n case \"BinaryExpression\":\n case \"LogicalExpression\":\n this.visitBinaryLikeExpression(node);\n return;\n case \"ConditionalExpression\":\n this.visitConditionalExpression(node);\n return;\n case \"CallExpression\":\n this.visitCallExpression(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"TaggedTemplateExpression\":\n this.visitTaggedTemplateExpression(node);\n return;\n case \"TemplateLiteral\":\n this.visitTemplateLiteral(node);\n return;\n case \"ImportExpression\":\n this.visitExpression(node.source);\n if (node.options !== undefined) this.visitExpression(node.options);\n return;\n case \"AwaitExpression\":\n this.visitExpression(node.argument);\n return;\n case \"BooleanLiteral\":\n case \"Identifier\":\n case \"MetaProperty\":\n case \"NullLiteral\":\n case \"NumericLiteral\":\n case \"RegexLiteral\":\n case \"StringLiteral\":\n case \"UndefinedLiteral\":\n return;\n }\n }\n\n private visitArrowFunction(node: FunctionNode): void {\n for (const param of node.params) {\n if (param.type === \"AssignmentPattern\") {\n this.visitExpression(param.right);\n }\n }\n\n if (node.body.type === \"BlockStatement\") {\n this.visitBlockStatement(node.body);\n } else {\n this.visitExpression(node.body);\n }\n }\n\n private visitArrayExpression(node: ArrayExpression): void {\n for (const element of node.elements) {\n this.visitExpression(element.type === \"SpreadElement\" ? element.argument : element);\n }\n }\n\n private visitObjectExpression(node: ObjectExpression): void {\n for (const property of node.properties) {\n if (property.type === \"SpreadElement\") {\n this.visitExpression(property.argument);\n } else {\n this.visitExpression(property.value);\n }\n }\n }\n\n private visitUnaryExpression(node: UnaryExpression): void {\n this.visitExpression(node.argument);\n }\n\n private visitBinaryLikeExpression(node: BinaryExpression | LogicalExpression): void {\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n }\n\n private visitConditionalExpression(node: ConditionalExpression): void {\n this.visitExpression(node.test);\n this.visitExpression(node.consequent);\n this.visitExpression(node.alternate);\n }\n\n private visitCallExpression(node: CallExpression): void {\n this.visitExpression(node.callee);\n for (const argument of node.arguments) {\n this.visitExpression(argument.type === \"SpreadElement\" ? argument.argument : argument);\n }\n }\n\n private visitMemberExpression(node: MemberExpression): void {\n this.visitExpression(node.object);\n if (node.computed) {\n this.visitExpression(node.property);\n }\n }\n\n private visitTaggedTemplateExpression(node: TaggedTemplateExpression): void {\n this.visitExpression(node.tag);\n this.visitTemplateLiteral(node.quasi);\n }\n\n private visitTemplateLiteral(node: TemplateLiteral): void {\n for (const expression of node.expressions) {\n this.visitExpression(expression);\n }\n }\n\n private validateExpression(\n expected: SupportedType,\n declaredType: string,\n expression: Expression\n ): void {\n switch (expected.kind) {\n case \"primitive\":\n this.validatePrimitiveExpression(expected.name, declaredType, expression);\n return;\n case \"array\":\n this.validateArrayExpression(expected.element, declaredType, expression);\n return;\n case \"object\":\n this.validateObjectExpression(expected.fields, declaredType, expression);\n return;\n }\n }\n\n private validatePrimitiveExpression(\n expected: PrimitiveType,\n declaredType: string,\n expression: Expression\n ): void {\n const actual = inferExpressionKind(expression);\n if (actual !== undefined && actual !== expected) {\n this.pushMismatch(declaredType, actual, expression.span, \"value\");\n }\n }\n\n private validateArrayExpression(\n expected: PrimitiveType,\n declaredType: string,\n expression: Expression\n ): void {\n if (expression.type !== \"ArrayExpression\") {\n const actual = inferExpressionKind(expression);\n if (actual !== undefined) {\n this.pushMismatch(declaredType, actual, expression.span, \"value\");\n }\n return;\n }\n\n for (const element of expression.elements) {\n if (element.type === \"SpreadElement\") {\n continue;\n }\n\n const actual = inferExpressionKind(element);\n if (actual !== undefined && actual !== expected) {\n this.pushMismatch(declaredType, actual, element.span, \"array element\");\n }\n }\n }\n\n private validateObjectExpression(\n expectedFields: ReadonlyMap<string, PrimitiveType>,\n declaredType: string,\n expression: Expression\n ): void {\n if (expression.type !== \"ObjectExpression\") {\n const actual = inferExpressionKind(expression);\n if (actual !== undefined) {\n this.pushMismatch(declaredType, actual, expression.span, \"value\");\n }\n return;\n }\n\n for (const property of expression.properties) {\n if (property.type === \"SpreadElement\") {\n continue;\n }\n\n const fieldName = getPropertyName(property);\n const expected = fieldName === undefined ? undefined : expectedFields.get(fieldName);\n const actual = inferExpressionKind(property.value);\n if (expected !== undefined && actual !== undefined && actual !== expected) {\n this.pushMismatch(\n declaredType,\n actual,\n property.value.span,\n `value for property '${fieldName}'`\n );\n }\n }\n }\n\n private findLeadingJsdoc(nodeStartOffset: number): ParsedJsdoc | undefined {\n for (let index = this.jsdocBlocks.length - 1; index >= 0; index -= 1) {\n const block = this.jsdocBlocks[index];\n if (block.endOffset > nodeStartOffset) {\n continue;\n }\n\n if (this.source.slice(block.endOffset, nodeStartOffset).trim().length > 0) {\n return undefined;\n }\n\n return this.parseJsdocBlock(block);\n }\n\n return undefined;\n }\n\n private parseJsdocBlock(block: JsdocBlock): ParsedJsdoc {\n const cached = this.parsedJsdoc.get(block.startOffset);\n if (cached !== undefined) {\n return cached;\n }\n\n const parsed = parseJsdocBlock(this.source, block, (tagName, raw, span) => {\n this.diagnostics.push({\n code: \"AS-JSDOC-TYPE\",\n severity: \"warning\",\n message: `Could not parse JSDoc @${tagName} annotation '${raw}'.`,\n filename: this.filename,\n line: span.start.line,\n column: span.start.column,\n span\n });\n });\n\n this.parsedJsdoc.set(block.startOffset, parsed);\n return parsed;\n }\n\n private pushMismatch(\n declaredType: string,\n actualType: string,\n span: SourceSpan,\n target: string\n ): void {\n this.diagnostics.push({\n code: \"AS-JSDOC-TYPE\",\n severity: \"warning\",\n message: `JSDoc type '${declaredType}' does not match ${actualType} ${target}.`,\n filename: this.filename,\n line: span.start.line,\n column: span.start.column,\n span\n });\n }\n}\n\nfunction collectJsdocBlocks(source: string): JsdocBlock[] {\n const blocks: JsdocBlock[] = [];\n let index = 0;\n\n while (index < source.length) {\n if (source[index] !== \"/\" || source[index + 1] !== \"*\" || source[index + 2] !== \"*\") {\n index += 1;\n continue;\n }\n\n const startOffset = index;\n index += 3;\n while (index < source.length && (source[index] !== \"*\" || source[index + 1] !== \"/\")) {\n index += 1;\n }\n\n if (index >= source.length) {\n break;\n }\n\n blocks.push({\n startOffset,\n endOffset: index + 2\n });\n index += 2;\n }\n\n return blocks;\n}\n\nfunction parseJsdocBlock(\n source: string,\n block: JsdocBlock,\n onParseError: (tagName: \"param\" | \"type\", raw: string, span: SourceSpan) => void\n): ParsedJsdoc {\n const parsed: ParsedJsdoc = {\n params: []\n };\n let index = block.startOffset + 3;\n const end = block.endOffset - 2;\n\n while (index < end) {\n if (source[index] !== \"@\") {\n index += 1;\n continue;\n }\n\n const tagStart = index;\n index += 1;\n const tagNameStart = index;\n while (index < end && isIdentifierPart(source[index])) {\n index += 1;\n }\n\n const tagName = source.slice(tagNameStart, index);\n if (tagName !== \"param\" && tagName !== \"type\") {\n index = skipToNextTag(source, index, end);\n continue;\n }\n\n index = skipWhitespace(source, index, end);\n const annotation = readBracedAnnotation(source, index, end);\n if (annotation === undefined) {\n onParseError(tagName, \"\", createSpanFromOffsets(source, tagStart, index));\n index = skipToNextTag(source, index, end);\n continue;\n }\n\n const trimmed = trimAnnotation(source, annotation.contentStart, annotation.contentEnd);\n const type = parseSupportedType(source.slice(trimmed.startOffset, trimmed.endOffset));\n if (type.status === \"invalid\") {\n onParseError(\n tagName,\n source.slice(trimmed.startOffset, trimmed.endOffset),\n createSpanFromOffsets(source, trimmed.startOffset, trimmed.endOffset)\n );\n index = annotation.endOffset;\n continue;\n }\n\n index = annotation.endOffset;\n if (tagName === \"type\") {\n parsed.type = {\n kind: \"type\",\n raw: source.slice(trimmed.startOffset, trimmed.endOffset),\n span: createSpanFromOffsets(source, trimmed.startOffset, trimmed.endOffset),\n type: type.status === \"supported\" ? type.type : undefined\n };\n continue;\n }\n\n index = skipWhitespace(source, index, end);\n const paramNameStart = index;\n while (index < end && isIdentifierPart(source[index])) {\n index += 1;\n }\n const paramName = source.slice(paramNameStart, index);\n if (paramName.length === 0) {\n onParseError(\n \"param\",\n source.slice(trimmed.startOffset, trimmed.endOffset),\n createSpanFromOffsets(source, trimmed.startOffset, trimmed.endOffset)\n );\n continue;\n }\n\n parsed.params.push({\n kind: \"param\",\n name: paramName,\n raw: source.slice(trimmed.startOffset, trimmed.endOffset),\n span: createSpanFromOffsets(source, trimmed.startOffset, trimmed.endOffset),\n type: type.status === \"supported\" ? type.type : undefined\n });\n }\n\n return parsed;\n}\n\nfunction readBracedAnnotation(\n source: string,\n startOffset: number,\n endOffset: number\n): { contentEnd: number; contentStart: number; endOffset: number } | undefined {\n if (source[startOffset] !== \"{\") {\n return undefined;\n }\n\n let depth = 0;\n for (let index = startOffset; index < endOffset; index += 1) {\n if (source[index] === \"{\") {\n depth += 1;\n } else if (source[index] === \"}\") {\n depth -= 1;\n if (depth === 0) {\n return {\n contentStart: startOffset + 1,\n contentEnd: index,\n endOffset: index + 1\n };\n }\n }\n }\n\n return undefined;\n}\n\nfunction parseSupportedType(source: string): ParsedType {\n if (isPrimitiveType(source)) {\n return {\n status: \"supported\",\n type: {\n kind: \"primitive\",\n name: source\n }\n };\n }\n\n if (source.endsWith(\"[]\")) {\n const element = source.slice(0, -2);\n return isPrimitiveType(element)\n ? {\n status: \"supported\",\n type: {\n kind: \"array\",\n element\n }\n }\n : { status: \"unsupported\" };\n }\n\n if (source.startsWith(\"{\") && source.endsWith(\"}\")) {\n const fields = parseObjectFields(source.slice(1, -1));\n return fields.status !== \"supported\"\n ? { status: fields.status }\n : {\n status: \"supported\",\n type: {\n kind: \"object\",\n fields: fields.fields\n }\n };\n }\n\n if (source.includes(\"<\") || source.includes(\">\") || source.includes(\"|\")) {\n return { status: \"unsupported\" };\n }\n\n return source.includes(\" \") ? { status: \"invalid\" } : { status: \"unsupported\" };\n}\n\nfunction parseObjectFields(source: string): ParsedObjectFields {\n const fields = new Map<string, PrimitiveType>();\n let index = 0;\n\n while (index < source.length) {\n index = skipWhitespace(source, index, source.length);\n if (index >= source.length) {\n return {\n fields,\n status: \"supported\"\n };\n }\n\n const nameStart = index;\n if (!isIdentifierStart(source[index])) {\n return { status: \"invalid\" };\n }\n\n index += 1;\n while (index < source.length && isIdentifierPart(source[index])) {\n index += 1;\n }\n\n const fieldName = source.slice(nameStart, index);\n index = skipWhitespace(source, index, source.length);\n if (source[index] === \"?\") {\n index += 1;\n index = skipWhitespace(source, index, source.length);\n }\n if (source[index] !== \":\") {\n return { status: \"invalid\" };\n }\n\n index += 1;\n index = skipWhitespace(source, index, source.length);\n const typeStart = index;\n while (index < source.length && source[index] !== \",\" && source[index] !== \";\") {\n index += 1;\n }\n\n const trimmed = trimAnnotation(source, typeStart, index);\n const fieldType = source.slice(trimmed.startOffset, trimmed.endOffset);\n if (!isPrimitiveType(fieldType)) {\n return classifyObjectFieldType(fieldType);\n }\n\n fields.set(fieldName, fieldType);\n index = skipWhitespace(source, index, source.length);\n if (index >= source.length) {\n return {\n fields,\n status: \"supported\"\n };\n }\n if (source[index] !== \",\" && source[index] !== \";\") {\n return { status: \"invalid\" };\n }\n index += 1;\n }\n\n return {\n fields,\n status: \"supported\"\n };\n}\n\nfunction classifyObjectFieldType(source: string): ParsedObjectFields {\n if (source.length === 0) {\n return { status: \"invalid\" };\n }\n\n for (const char of source) {\n if (\n char === \"<\" ||\n char === \">\" ||\n char === \"[\" ||\n char === \"]\" ||\n char === \"{\" ||\n char === \"}\" ||\n char === \"|\" ||\n char === \"&\" ||\n char === \"(\" ||\n char === \")\" ||\n char === \"?\"\n ) {\n return { status: \"unsupported\" };\n }\n }\n\n return source.includes(\" \") || source.includes(\":\")\n ? { status: \"invalid\" }\n : { status: \"unsupported\" };\n}\n\nfunction inferExpressionKind(\n expression: Expression\n): PrimitiveType | \"array\" | \"object\" | undefined {\n switch (expression.type) {\n case \"ArrayExpression\":\n return \"array\";\n case \"BooleanLiteral\":\n return \"boolean\";\n case \"NullLiteral\":\n return \"null\";\n case \"NumericLiteral\":\n return \"number\";\n case \"ObjectExpression\":\n return \"object\";\n case \"StringLiteral\":\n return \"string\";\n case \"TemplateLiteral\":\n return expression.expressions.length === 0 ? \"string\" : undefined;\n case \"UndefinedLiteral\":\n return \"undefined\";\n case \"UnaryExpression\":\n if (\n (expression.operator === \"-\" || expression.operator === \"+\") &&\n expression.argument.type === \"NumericLiteral\"\n ) {\n return \"number\";\n }\n if (expression.operator === \"!\") {\n return \"boolean\";\n }\n return undefined;\n case \"FunctionExpression\":\n case \"ArrowFunctionExpression\":\n case \"AssignmentExpression\":\n case \"AwaitExpression\":\n case \"BinaryExpression\":\n case \"CallExpression\":\n case \"ConditionalExpression\":\n case \"Identifier\":\n case \"LogicalExpression\":\n case \"MemberExpression\":\n case \"MetaProperty\":\n case \"RegexLiteral\":\n case \"TaggedTemplateExpression\":\n return undefined;\n }\n}\n\nfunction getPropertyName(property: Property): string | undefined {\n if (property.computed) {\n return undefined;\n }\n\n if (property.key.type === \"Identifier\") {\n return property.key.name;\n }\n\n if (property.key.type === \"StringLiteral\") {\n return property.key.value;\n }\n\n return undefined;\n}\n\nfunction trimAnnotation(\n source: string,\n startOffset: number,\n endOffset: number\n): { endOffset: number; startOffset: number } {\n let start = startOffset;\n let end = endOffset;\n\n while (start < end && isWhitespace(source[start])) {\n start += 1;\n }\n while (end > start && isWhitespace(source[end - 1])) {\n end -= 1;\n }\n\n return {\n startOffset: start,\n endOffset: end\n };\n}\n\nfunction skipWhitespace(source: string, startOffset: number, endOffset: number): number {\n let index = startOffset;\n while (index < endOffset && isWhitespace(source[index])) {\n index += 1;\n }\n return index;\n}\n\nfunction skipToNextTag(source: string, startOffset: number, endOffset: number): number {\n let index = startOffset;\n while (index < endOffset && source[index] !== \"@\") {\n index += 1;\n }\n return index;\n}\n\nfunction isPrimitiveType(value: string): value is PrimitiveType {\n return (\n value === \"boolean\" ||\n value === \"null\" ||\n value === \"number\" ||\n value === \"string\" ||\n value === \"undefined\"\n );\n}\n\nfunction isIdentifierStart(value: string | undefined): boolean {\n return (\n value !== undefined &&\n ((value >= \"A\" && value <= \"Z\") ||\n (value >= \"a\" && value <= \"z\") ||\n value === \"_\" ||\n value === \"$\")\n );\n}\n\nfunction isIdentifierPart(value: string | undefined): boolean {\n return isIdentifierStart(value) || (value !== undefined && value >= \"0\" && value <= \"9\");\n}\n\nfunction isWhitespace(value: string | undefined): boolean {\n return value === \" \" || value === \"\\n\" || value === \"\\r\" || value === \"\\t\";\n}\n\nfunction createSpanFromOffsets(source: string, startOffset: number, endOffset: number): SourceSpan {\n return {\n start: positionAt(source, startOffset),\n end: positionAt(source, endOffset)\n };\n}\n\nfunction positionAt(source: string, offset: number): SourceSpan[\"start\"] {\n let line = 1;\n let column = 1;\n\n for (let index = 0; index < offset; index += 1) {\n if (source[index] === \"\\n\") {\n line += 1;\n column = 1;\n } else {\n column += 1;\n }\n }\n\n return {\n line,\n column,\n offset\n };\n}\n", "import { visitClassElements } from \"../class-elements.js\";\nimport {\n parseModule,\n type ArrayExpression,\n type ArrayPattern,\n type FunctionNode,\n type AssignmentExpression,\n type AssignmentPattern,\n type AssignmentProperty,\n type BinaryExpression,\n type BlockStatement,\n type CallExpression,\n type CatchClause,\n type ConditionalExpression,\n type DoWhileStatement,\n type Expression,\n type ForInStatement,\n type ForOfStatement,\n type ForStatement,\n type IfStatement,\n type LogicalExpression,\n type MemberExpression,\n type Module,\n type ObjectExpression,\n type ObjectPattern,\n type PatternTarget,\n type Property,\n type RestElement,\n type SourceSpan,\n type Statement,\n type TaggedTemplateExpression,\n type TemplateLiteral,\n type ThrowStatement,\n type TryStatement,\n type UnaryExpression,\n type VariableDeclaration,\n type VariableDeclarator,\n type WhileStatement\n} from \"../../parse/parser.js\";\n\nexport type Diagnostic = {\n code: \"AS-LARGE-LITERAL\";\n severity: \"warning\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n};\n\nconst DEFAULT_LARGE_LITERAL_THRESHOLD = 1000;\n\nexport function AS_LARGE_LITERAL(\n source: string,\n options: { filename?: string; largeLiteralThreshold?: number } = {}\n): Diagnostic[] {\n return new ASLargeLiteralScanner(\n options.filename ?? \"<input>\",\n options.largeLiteralThreshold ?? DEFAULT_LARGE_LITERAL_THRESHOLD\n ).scan(source);\n}\n\nclass ASLargeLiteralScanner {\n private readonly diagnostics: Diagnostic[] = [];\n\n constructor(\n private readonly filename: string,\n private readonly threshold: number\n ) {}\n\n scan(source: string): Diagnostic[] {\n this.visitModule(parseModule(source, this.filename));\n return this.diagnostics;\n }\n\n private visitModule(node: Module): void {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n }\n\n private visitStatement(node: Statement): void {\n if (node.type === \"ClassDeclaration\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"FunctionDeclaration\":\n this.visitArrowFunction(node);\n return;\n case \"BlockStatement\":\n this.visitBlockStatement(node);\n return;\n case \"ExpressionStatement\":\n this.visitExpression(node.expression);\n return;\n case \"IfStatement\":\n this.visitIfStatement(node);\n return;\n case \"ForStatement\":\n this.visitForStatement(node);\n return;\n case \"ForInStatement\":\n case \"ForOfStatement\":\n this.visitForOfStatement(node);\n return;\n case \"WhileStatement\":\n case \"DoWhileStatement\":\n this.visitWhileStatement(node);\n return;\n case \"TryStatement\":\n this.visitTryStatement(node);\n return;\n case \"VariableDeclaration\":\n this.visitVariableDeclaration(node);\n return;\n case \"ReturnStatement\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"ThrowStatement\":\n this.visitThrowStatement(node);\n return;\n case \"ExportNamedDeclaration\":\n this.visitVariableDeclaration(node.declaration);\n return;\n case \"ExportDefaultDeclaration\":\n if (node.declaration.type === \"ClassDeclaration\" || node.declaration.type === \"FunctionDeclaration\") this.visitStatement(node.declaration);\n else this.visitExpression(node.declaration);\n return;\n case \"ImportDeclaration\":\n case \"BreakStatement\":\n case \"ContinueStatement\":\n return;\n }\n }\n\n private visitBlockStatement(node: BlockStatement): void {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n }\n\n private visitIfStatement(node: IfStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.consequent);\n if (node.alternate !== undefined) {\n this.visitStatement(node.alternate);\n }\n }\n\n private visitForStatement(node: ForStatement): void {\n if (node.init !== undefined) {\n if (node.init.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.init);\n } else {\n this.visitExpression(node.init);\n }\n }\n if (node.test !== undefined) {\n this.visitExpression(node.test);\n }\n if (node.update !== undefined) {\n this.visitExpression(node.update);\n }\n this.visitStatement(node.body);\n }\n\n private visitForOfStatement(node: ForInStatement | ForOfStatement): void {\n if (node.left.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.left);\n } else {\n this.visitAssignmentTarget(node.left);\n }\n this.visitExpression(node.right);\n this.visitStatement(node.body);\n }\n\n private visitWhileStatement(node: WhileStatement | DoWhileStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.body);\n }\n\n private visitTryStatement(node: TryStatement): void {\n this.visitBlockStatement(node.block);\n if (node.handler !== undefined) {\n this.visitCatchClause(node.handler);\n }\n if (node.finalizer !== undefined) {\n this.visitBlockStatement(node.finalizer);\n }\n }\n\n private visitCatchClause(node: CatchClause): void {\n if (node.param !== undefined) {\n this.visitBindingPattern(node.param);\n }\n this.visitBlockStatement(node.body);\n }\n\n private visitVariableDeclaration(node: VariableDeclaration): void {\n for (const declarator of node.declarations) {\n this.visitVariableDeclarator(declarator);\n }\n }\n\n private visitVariableDeclarator(node: VariableDeclarator): void {\n this.visitBindingPattern(node.id);\n if (node.init !== undefined) {\n this.visitExpression(node.init);\n }\n }\n\n private visitThrowStatement(node: ThrowStatement): void {\n this.visitExpression(node.argument);\n }\n\n private visitExpression(node: Expression): void {\n if (node.type === \"ClassExpression\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"YieldExpression\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"FunctionExpression\":\n case \"ArrowFunctionExpression\":\n this.visitArrowFunction(node);\n return;\n case \"ImportExpression\":\n this.visitExpression(node.source);\n if (node.options !== undefined) this.visitExpression(node.options);\n return;\n case \"AwaitExpression\":\n this.visitExpression(node.argument);\n return;\n case \"ArrayExpression\":\n this.visitArrayExpression(node);\n return;\n case \"ObjectExpression\":\n this.visitObjectExpression(node);\n return;\n case \"UnaryExpression\":\n this.visitUnaryExpression(node);\n return;\n case \"BinaryExpression\":\n case \"LogicalExpression\":\n this.visitBinaryLikeExpression(node);\n return;\n case \"ConditionalExpression\":\n this.visitConditionalExpression(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentExpression\":\n this.visitAssignmentExpression(node);\n return;\n case \"CallExpression\":\n this.visitCallExpression(node);\n return;\n case \"TemplateLiteral\":\n this.visitTemplateLiteral(node);\n return;\n case \"TaggedTemplateExpression\":\n this.visitTaggedTemplateExpression(node);\n return;\n case \"Identifier\":\n case \"BooleanLiteral\":\n case \"NullLiteral\":\n case \"NumericLiteral\":\n case \"StringLiteral\":\n case \"RegexLiteral\":\n case \"MetaProperty\":\n case \"UndefinedLiteral\":\n return;\n }\n }\n\n private visitArrowFunction(node: FunctionNode): void {\n for (const parameter of node.params) {\n this.visitBindingElement(parameter);\n }\n if (node.body.type === \"BlockStatement\") {\n this.visitBlockStatement(node.body);\n return;\n }\n\n this.visitExpression(node.body);\n }\n\n private visitArrayExpression(node: ArrayExpression): void {\n const staticElementCount = node.elements.filter(\n (element) => element.type !== \"SpreadElement\"\n ).length;\n if (staticElementCount > this.threshold) {\n this.report(node, createArrayMessage(staticElementCount, this.threshold));\n }\n\n for (const element of node.elements) {\n if (element.type === \"SpreadElement\") {\n this.visitExpression(element.argument);\n } else {\n this.visitExpression(element);\n }\n }\n }\n\n private visitObjectExpression(node: ObjectExpression): void {\n const keyCount = node.properties.filter((property) => property.type !== \"SpreadElement\").length;\n if (keyCount > this.threshold) {\n this.report(node, createObjectMessage(keyCount, this.threshold));\n }\n\n for (const property of node.properties) {\n if (property.type === \"SpreadElement\") {\n this.visitExpression(property.argument);\n } else {\n this.visitProperty(property);\n }\n }\n }\n\n private visitProperty(node: Property): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitExpression(node.value);\n }\n\n private visitUnaryExpression(node: UnaryExpression): void {\n this.visitExpression(node.argument);\n }\n\n private visitBinaryLikeExpression(node: BinaryExpression | LogicalExpression): void {\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n }\n\n private visitConditionalExpression(node: ConditionalExpression): void {\n this.visitExpression(node.test);\n this.visitExpression(node.consequent);\n this.visitExpression(node.alternate);\n }\n\n private visitMemberExpression(node: MemberExpression): void {\n this.visitExpression(node.object);\n if (node.computed) {\n this.visitExpression(node.property);\n }\n }\n\n private visitAssignmentExpression(node: AssignmentExpression): void {\n this.visitAssignmentTarget(node.left);\n this.visitExpression(node.right);\n }\n\n private visitCallExpression(node: CallExpression): void {\n this.visitExpression(node.callee);\n for (const argument of node.arguments) {\n if (argument.type === \"SpreadElement\") {\n this.visitExpression(argument.argument);\n } else {\n this.visitExpression(argument);\n }\n }\n }\n\n private visitTemplateLiteral(node: TemplateLiteral): void {\n for (const expression of node.expressions) {\n this.visitExpression(expression);\n }\n }\n\n private visitTaggedTemplateExpression(node: TaggedTemplateExpression): void {\n this.visitExpression(node.tag);\n this.visitTemplateLiteral(node.quasi);\n }\n\n private visitBindingElement(\n node: AssignmentPattern | ArrayPattern | ObjectPattern | RestElement | PatternTarget\n ): void {\n if (node.type === \"RestElement\") {\n this.visitBindingPattern(node.argument);\n return;\n }\n this.visitBindingPattern(node);\n }\n\n private visitBindingPattern(\n node: AssignmentPattern | ArrayPattern | ObjectPattern | PatternTarget\n ): void {\n switch (node.type) {\n case \"Identifier\":\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentPattern\":\n this.visitAssignmentPattern(node);\n return;\n case \"ArrayPattern\":\n this.visitArrayPattern(node);\n return;\n case \"ObjectPattern\":\n this.visitObjectPattern(node);\n return;\n }\n }\n\n private visitAssignmentPattern(node: AssignmentPattern): void {\n this.visitBindingPattern(node.left);\n this.visitExpression(node.right);\n }\n\n private visitArrayPattern(node: ArrayPattern): void {\n for (const element of node.elements) {\n if (element === null) {\n continue;\n }\n this.visitBindingElement(element);\n }\n }\n\n private visitObjectPattern(node: ObjectPattern): void {\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.visitBindingPattern(property.argument);\n continue;\n }\n this.visitAssignmentProperty(property);\n }\n }\n\n private visitAssignmentProperty(node: AssignmentProperty): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitBindingPattern(node.value);\n }\n\n private visitAssignmentTarget(node: AssignmentExpression[\"left\"]): void {\n if (node.type === \"MetaProperty\") {\n return;\n }\n this.visitBindingPattern(node);\n }\n\n private report(node: ArrayExpression | ObjectExpression, message: string): void {\n this.diagnostics.push({\n code: \"AS-LARGE-LITERAL\",\n severity: \"warning\",\n message,\n filename: this.filename,\n line: node.span.start.line,\n column: node.span.start.column,\n span: node.span\n });\n }\n}\n\nfunction createArrayMessage(count: number, threshold: number): string {\n return `Array literal has ${count} static elements, exceeding the configured limit of ${threshold}.`;\n}\n\nfunction createObjectMessage(count: number, threshold: number): string {\n return `Object literal has ${count} static keys, exceeding the configured limit of ${threshold}.`;\n}\n", "import { classDefinitionContains, visitClassElements } from \"../class-elements.js\";\nimport {\n parseModule,\n type ArrayExpression,\n type ArrayPattern,\n type ArrowFunctionExpression,\n type FunctionExpression,\n type FunctionDeclaration,\n type AssignmentExpression,\n type AssignmentPattern,\n type AssignmentProperty,\n type BinaryExpression,\n type BlockStatement,\n type CallExpression,\n type CatchClause,\n type ConditionalExpression,\n type DoWhileStatement,\n type Expression,\n type ForInStatement,\n type ForOfStatement,\n type ForStatement,\n type IfStatement,\n type Identifier,\n type LogicalExpression,\n type MemberExpression,\n type Module,\n type ObjectExpression,\n type ObjectPattern,\n type PatternTarget,\n type Property,\n type RestElement,\n type ReturnStatement,\n type SourceSpan,\n type Statement,\n type TaggedTemplateExpression,\n type TemplateLiteral,\n type ThrowStatement,\n type TryStatement,\n type UnaryExpression,\n type VariableDeclaration,\n type VariableDeclarator,\n type WhileStatement\n} from \"../../parse/parser.js\";\n\nexport type Diagnostic = {\n code: \"AS-MISSING-ASYNC\";\n severity: \"error\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n fix: {\n range: readonly [number, number];\n replacement: string;\n };\n};\n\nexport const AS_MISSING_ASYNC_MESSAGE = \"Functions that contain await must be marked async.\";\n\nexport function AS_MISSING_ASYNC(\n source: string,\n options: { filename?: string } = {}\n): Diagnostic[] {\n return new ASMissingAsyncScanner(options.filename ?? \"<input>\").scan(source);\n}\n\nexport function fixASMissingAsync(source: string, options: { filename?: string } = {}): string {\n return AS_MISSING_ASYNC(source, options)\n .sort((left, right) => right.span.start.offset - left.span.start.offset)\n .reduce((result, diagnostic) => {\n const offset = diagnostic.span.start.offset;\n return `${result.slice(0, offset)}async ${result.slice(offset)}`;\n }, source);\n}\n\nclass ASMissingAsyncScanner {\n private readonly diagnostics: Diagnostic[] = [];\n\n constructor(private readonly filename: string) {}\n\n scan(source: string): Diagnostic[] {\n this.visitModule(parseModule(source, this.filename));\n return this.diagnostics;\n }\n\n private visitModule(node: Module): void {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n }\n\n private visitStatement(node: Statement): void {\n if (node.type === \"ClassDeclaration\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"FunctionDeclaration\":\n this.visitFunctionExpression(node);\n return;\n case \"BlockStatement\":\n this.visitBlockStatement(node);\n return;\n case \"ExpressionStatement\":\n this.visitExpression(node.expression);\n return;\n case \"IfStatement\":\n this.visitIfStatement(node);\n return;\n case \"ForStatement\":\n this.visitForStatement(node);\n return;\n case \"ForInStatement\":\n case \"ForOfStatement\":\n this.visitForOfStatement(node);\n return;\n case \"WhileStatement\":\n case \"DoWhileStatement\":\n this.visitWhileStatement(node);\n return;\n case \"TryStatement\":\n this.visitTryStatement(node);\n return;\n case \"VariableDeclaration\":\n this.visitVariableDeclaration(node);\n return;\n case \"ReturnStatement\":\n this.visitReturnStatement(node);\n return;\n case \"ThrowStatement\":\n this.visitThrowStatement(node);\n return;\n case \"ExportNamedDeclaration\":\n this.visitVariableDeclaration(node.declaration);\n return;\n case \"ExportDefaultDeclaration\":\n if (node.declaration.type === \"ClassDeclaration\" || node.declaration.type === \"FunctionDeclaration\") this.visitStatement(node.declaration);\n else this.visitExpression(node.declaration);\n return;\n case \"ImportDeclaration\":\n case \"BreakStatement\":\n case \"ContinueStatement\":\n return;\n }\n }\n\n private visitBlockStatement(node: BlockStatement): void {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n }\n\n private visitIfStatement(node: IfStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.consequent);\n if (node.alternate !== undefined) {\n this.visitStatement(node.alternate);\n }\n }\n\n private visitForStatement(node: ForStatement): void {\n if (node.init !== undefined) {\n if (node.init.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.init);\n } else {\n this.visitExpression(node.init);\n }\n }\n\n if (node.test !== undefined) {\n this.visitExpression(node.test);\n }\n\n if (node.update !== undefined) {\n this.visitExpression(node.update);\n }\n\n this.visitStatement(node.body);\n }\n\n private visitForOfStatement(node: ForInStatement | ForOfStatement): void {\n if (node.left.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.left);\n }\n this.visitExpression(node.right);\n this.visitStatement(node.body);\n }\n\n private visitWhileStatement(node: WhileStatement | DoWhileStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.body);\n }\n\n private visitTryStatement(node: TryStatement): void {\n this.visitBlockStatement(node.block);\n if (node.handler !== undefined) {\n this.visitCatchClause(node.handler);\n }\n if (node.finalizer !== undefined) {\n this.visitBlockStatement(node.finalizer);\n }\n }\n\n private visitCatchClause(node: CatchClause): void {\n if (node.param !== undefined) {\n this.visitBindingPattern(node.param);\n }\n this.visitBlockStatement(node.body);\n }\n\n private visitVariableDeclaration(node: VariableDeclaration): void {\n for (const declarator of node.declarations) {\n this.visitVariableDeclarator(declarator);\n }\n }\n\n private visitVariableDeclarator(node: VariableDeclarator): void {\n this.visitBindingPattern(node.id);\n if (node.init !== undefined) {\n this.visitExpression(node.init);\n }\n }\n\n private visitReturnStatement(node: ReturnStatement): void {\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n }\n\n private visitThrowStatement(node: ThrowStatement): void {\n this.visitExpression(node.argument);\n }\n\n private visitExpression(node: Expression): void {\n if (node.type === \"ClassExpression\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"YieldExpression\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"ArrowFunctionExpression\":\n this.visitArrowFunction(node);\n return;\n case \"FunctionExpression\":\n this.visitFunctionExpression(node);\n return;\n case \"ImportExpression\":\n this.visitExpression(node.source);\n if (node.options !== undefined) this.visitExpression(node.options);\n return;\n case \"AwaitExpression\":\n this.visitExpression(node.argument);\n return;\n case \"ArrayExpression\":\n this.visitArrayExpression(node);\n return;\n case \"ObjectExpression\":\n this.visitObjectExpression(node);\n return;\n case \"UnaryExpression\":\n this.visitUnaryExpression(node);\n return;\n case \"BinaryExpression\":\n case \"LogicalExpression\":\n this.visitBinaryLikeExpression(node);\n return;\n case \"ConditionalExpression\":\n this.visitConditionalExpression(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentExpression\":\n this.visitAssignmentExpression(node);\n return;\n case \"CallExpression\":\n this.visitCallExpression(node);\n return;\n case \"TemplateLiteral\":\n this.visitTemplateLiteral(node);\n return;\n case \"TaggedTemplateExpression\":\n this.visitTaggedTemplateExpression(node);\n return;\n case \"Identifier\":\n case \"BooleanLiteral\":\n case \"MetaProperty\":\n case \"NullLiteral\":\n case \"NumericLiteral\":\n case \"BigIntLiteral\":\n case \"RegexLiteral\":\n case \"StringLiteral\":\n case \"UndefinedLiteral\":\n return;\n }\n }\n\n private visitArrowFunction(node: ArrowFunctionExpression): void {\n if (!node.async && bodyContainsAwait(node.body)) {\n this.report(node.span);\n }\n\n for (const param of node.params) {\n this.visitBindingElement(param);\n }\n\n if (node.body.type === \"BlockStatement\") {\n this.visitBlockStatement(node.body);\n return;\n }\n\n this.visitExpression(node.body);\n }\n\n private visitFunctionExpression(node: FunctionExpression | FunctionDeclaration): void {\n if (!node.async && bodyContainsAwait(node.body)) {\n this.report(node.span);\n }\n\n for (const param of node.params) {\n this.visitBindingElement(param);\n }\n this.visitBlockStatement(node.body);\n }\n\n private visitArrayExpression(node: ArrayExpression): void {\n for (const element of node.elements) {\n if (element.type === \"SpreadElement\") {\n this.visitExpression(element.argument);\n continue;\n }\n\n this.visitExpression(element);\n }\n }\n\n private visitObjectExpression(node: ObjectExpression): void {\n for (const property of node.properties) {\n if (property.type === \"SpreadElement\") {\n this.visitExpression(property.argument);\n continue;\n }\n\n this.visitProperty(property);\n }\n }\n\n private visitProperty(node: Property): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitExpression(node.value);\n }\n\n private visitUnaryExpression(node: UnaryExpression): void {\n this.visitExpression(node.argument);\n }\n\n private visitBinaryLikeExpression(node: BinaryExpression | LogicalExpression): void {\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n }\n\n private visitConditionalExpression(node: ConditionalExpression): void {\n this.visitExpression(node.test);\n this.visitExpression(node.consequent);\n this.visitExpression(node.alternate);\n }\n\n private visitMemberExpression(node: MemberExpression): void {\n this.visitExpression(node.object);\n if (node.computed) {\n this.visitExpression(node.property);\n }\n }\n\n private visitAssignmentExpression(node: AssignmentExpression): void {\n this.visitAssignmentTarget(node.left);\n this.visitExpression(node.right);\n }\n\n private visitCallExpression(node: CallExpression): void {\n this.visitExpression(node.callee);\n for (const argument of node.arguments) {\n if (argument.type === \"SpreadElement\") {\n this.visitExpression(argument.argument);\n continue;\n }\n\n this.visitExpression(argument);\n }\n }\n\n private visitTemplateLiteral(node: TemplateLiteral): void {\n for (const expression of node.expressions) {\n this.visitExpression(expression);\n }\n }\n\n private visitTaggedTemplateExpression(node: TaggedTemplateExpression): void {\n this.visitExpression(node.tag);\n this.visitTemplateLiteral(node.quasi);\n }\n\n private visitAssignmentTarget(node: AssignmentExpression[\"left\"]): void {\n switch (node.type) {\n case \"Identifier\":\n case \"MetaProperty\":\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"ArrayPattern\":\n case \"ObjectPattern\":\n this.visitBindingPattern(node);\n return;\n }\n }\n\n private visitBindingElement(\n node:\n | AssignmentPattern\n | ArrayPattern\n | Identifier\n | MemberExpression\n | ObjectPattern\n | RestElement\n ): void {\n if (node.type === \"RestElement\") {\n this.visitAssignmentTarget(node.argument);\n return;\n }\n\n this.visitBindingPattern(node);\n }\n\n private visitBindingPattern(\n node: AssignmentPattern | ArrayPattern | Identifier | MemberExpression | ObjectPattern\n ): void {\n switch (node.type) {\n case \"Identifier\":\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentPattern\":\n this.visitBindingPattern(node.left);\n this.visitExpression(node.right);\n return;\n case \"ArrayPattern\":\n for (const element of node.elements) {\n if (element === null) {\n continue;\n }\n this.visitBindingElement(element);\n }\n return;\n case \"ObjectPattern\":\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.visitAssignmentTarget(property.argument);\n continue;\n }\n this.visitAssignmentProperty(property);\n }\n return;\n }\n }\n\n private visitAssignmentProperty(node: AssignmentProperty): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitBindingPattern(node.value);\n }\n\n private report(span: SourceSpan): void {\n this.diagnostics.push({\n code: \"AS-MISSING-ASYNC\",\n severity: \"error\",\n message: AS_MISSING_ASYNC_MESSAGE,\n filename: this.filename,\n line: span.start.line,\n column: span.start.column,\n span,\n fix: {\n range: [span.start.offset, span.start.offset],\n replacement: \"async \"\n }\n });\n }\n}\n\nfunction bodyContainsAwait(node: BlockStatement | Expression): boolean {\n return node.type === \"BlockStatement\"\n ? statementListContainsAwait(node.body)\n : expressionContainsAwait(node);\n}\n\nfunction statementListContainsAwait(statements: readonly Statement[]): boolean {\n return statements.some(statementContainsAwait);\n}\n\nfunction statementContainsAwait(node: Statement): boolean {\n switch (node.type) {\n case \"WithStatement\":\n return expressionContainsAwait(node.object) || statementContainsAwait(node.body);\n case \"ClassDeclaration\":\n return classDefinitionContains(node, expressionContainsAwait);\n case \"BlockStatement\":\n return statementListContainsAwait(node.body);\n case \"ExpressionStatement\":\n return expressionContainsAwait(node.expression);\n case \"IfStatement\":\n return (\n expressionContainsAwait(node.test) ||\n statementContainsAwait(node.consequent) ||\n (node.alternate !== undefined && statementContainsAwait(node.alternate))\n );\n case \"ForStatement\":\n return (\n (node.init?.type === \"VariableDeclaration\"\n ? variableDeclarationContainsAwait(node.init)\n : node.init !== undefined && expressionContainsAwait(node.init)) ||\n (node.test !== undefined && expressionContainsAwait(node.test)) ||\n (node.update !== undefined && expressionContainsAwait(node.update)) ||\n statementContainsAwait(node.body)\n );\n case \"ForInStatement\":\n case \"ForOfStatement\":\n return (\n (node.left.type === \"VariableDeclaration\" && variableDeclarationContainsAwait(node.left)) ||\n (node.left.type !== \"VariableDeclaration\" && assignmentTargetContainsAwait(node.left)) ||\n expressionContainsAwait(node.right) ||\n statementContainsAwait(node.body)\n );\n case \"WhileStatement\":\n case \"DoWhileStatement\":\n return expressionContainsAwait(node.test) || statementContainsAwait(node.body);\n case \"TryStatement\":\n return (\n statementListContainsAwait(node.block.body) ||\n (node.handler !== undefined && catchClauseContainsAwait(node.handler)) ||\n (node.finalizer !== undefined && statementListContainsAwait(node.finalizer.body))\n );\n case \"SwitchStatement\":\n return (\n expressionContainsAwait(node.discriminant) ||\n node.cases.some(\n (switchCase) =>\n (switchCase.test !== undefined && expressionContainsAwait(switchCase.test)) ||\n statementListContainsAwait(switchCase.consequent)\n )\n );\n case \"VariableDeclaration\":\n return variableDeclarationContainsAwait(node);\n case \"ReturnStatement\":\n return node.argument !== undefined && expressionContainsAwait(node.argument);\n case \"ThrowStatement\":\n return expressionContainsAwait(node.argument);\n case \"ExportNamedDeclaration\":\n return variableDeclarationContainsAwait(node.declaration);\n case \"ExportDefaultDeclaration\":\n return node.declaration.type === \"ClassDeclaration\" || node.declaration.type === \"FunctionDeclaration\"\n ? statementContainsAwait(node.declaration)\n : expressionContainsAwait(node.declaration);\n case \"ImportDeclaration\":\n case \"FunctionDeclaration\":\n case \"BreakStatement\":\n case \"ContinueStatement\":\n case \"EmptyStatement\":\n return false;\n }\n}\n\nfunction catchClauseContainsAwait(node: CatchClause): boolean {\n return (\n (node.param !== undefined && bindingPatternContainsAwait(node.param)) ||\n statementListContainsAwait(node.body.body)\n );\n}\n\nfunction variableDeclarationContainsAwait(node: VariableDeclaration): boolean {\n return node.declarations.some((declarator) => {\n return (\n bindingPatternContainsAwait(declarator.id) ||\n (declarator.init !== undefined && expressionContainsAwait(declarator.init))\n );\n });\n}\n\nfunction expressionContainsAwait(node: Expression): boolean {\n switch (node.type) {\n case \"ImportExpression\":\n return expressionContainsAwait(node.source) || (node.options !== undefined && expressionContainsAwait(node.options));\n case \"PrivateIdentifier\":\n return false;\n case \"ClassExpression\":\n return classDefinitionContains(node, expressionContainsAwait);\n case \"NewTargetExpression\":\n case \"Super\":\n return false;\n case \"AwaitExpression\":\n return true;\n case \"YieldExpression\":\n return node.argument !== undefined && expressionContainsAwait(node.argument);\n case \"ArrowFunctionExpression\":\n case \"FunctionExpression\":\n return false;\n case \"ArrayExpression\":\n return node.elements.some((element) => {\n return element.type === \"SpreadElement\"\n ? expressionContainsAwait(element.argument)\n : expressionContainsAwait(element);\n });\n case \"ObjectExpression\":\n return objectExpressionContainsAwait(node);\n case \"UnaryExpression\":\n case \"UpdateExpression\":\n return expressionContainsAwait(node.argument);\n case \"SequenceExpression\":\n return node.expressions.some(expressionContainsAwait);\n case \"BinaryExpression\":\n case \"LogicalExpression\":\n return expressionContainsAwait(node.left) || expressionContainsAwait(node.right);\n case \"ConditionalExpression\":\n return (\n expressionContainsAwait(node.test) ||\n expressionContainsAwait(node.consequent) ||\n expressionContainsAwait(node.alternate)\n );\n case \"MemberExpression\":\n return (\n expressionContainsAwait(node.object) ||\n (node.computed && expressionContainsAwait(node.property))\n );\n case \"AssignmentExpression\":\n return assignmentTargetContainsAwait(node.left) || expressionContainsAwait(node.right);\n case \"CallExpression\":\n case \"NewExpression\":\n return (\n expressionContainsAwait(node.callee) ||\n node.arguments.some((argument) => {\n return argument.type === \"SpreadElement\"\n ? expressionContainsAwait(argument.argument)\n : expressionContainsAwait(argument);\n })\n );\n case \"TemplateLiteral\":\n return node.expressions.some(expressionContainsAwait);\n case \"TaggedTemplateExpression\":\n return expressionContainsAwait(node.tag) || expressionContainsAwait(node.quasi);\n case \"Identifier\":\n case \"BooleanLiteral\":\n case \"MetaProperty\":\n case \"NullLiteral\":\n case \"NumericLiteral\":\n case \"BigIntLiteral\":\n case \"RegexLiteral\":\n case \"StringLiteral\":\n case \"ThisExpression\":\n case \"UndefinedLiteral\":\n return false;\n }\n}\n\nfunction objectExpressionContainsAwait(node: ObjectExpression): boolean {\n return node.properties.some((property) => {\n if (property.type === \"SpreadElement\") {\n return expressionContainsAwait(property.argument);\n }\n\n return (\n (property.computed && expressionContainsAwait(property.key)) ||\n expressionContainsAwait(property.value)\n );\n });\n}\n\nfunction assignmentTargetContainsAwait(node: AssignmentExpression[\"left\"]): boolean {\n switch (node.type) {\n case \"Identifier\":\n case \"MetaProperty\":\n return false;\n case \"MemberExpression\":\n return expressionContainsAwait(node);\n case \"ArrayPattern\":\n case \"ObjectPattern\":\n return bindingPatternContainsAwait(node);\n }\n}\n\nfunction bindingElementContainsAwait(\n node:\n | AssignmentPattern\n | ArrayPattern\n | Identifier\n | MemberExpression\n | ObjectPattern\n | RestElement\n): boolean {\n if (node.type === \"RestElement\") {\n return patternTargetContainsAwait(node.argument);\n }\n\n return bindingPatternContainsAwait(node);\n}\n\nfunction bindingPatternContainsAwait(\n node: AssignmentPattern | ArrayPattern | Identifier | MemberExpression | ObjectPattern\n): boolean {\n switch (node.type) {\n case \"Identifier\":\n return false;\n case \"MemberExpression\":\n return expressionContainsAwait(node);\n case \"AssignmentPattern\":\n return bindingPatternContainsAwait(node.left) || expressionContainsAwait(node.right);\n case \"ArrayPattern\":\n return node.elements.some((element) => {\n return element !== null && bindingElementContainsAwait(element);\n });\n case \"ObjectPattern\":\n return node.properties.some(assignmentPropertyContainsAwait);\n }\n}\n\nfunction assignmentPropertyContainsAwait(node: AssignmentProperty | RestElement): boolean {\n if (node.type === \"RestElement\") {\n return patternTargetContainsAwait(node.argument);\n }\n\n return (\n (node.computed && expressionContainsAwait(node.key)) || bindingPatternContainsAwait(node.value)\n );\n}\n\nfunction patternTargetContainsAwait(node: PatternTarget): boolean {\n switch (node.type) {\n case \"Identifier\":\n return false;\n case \"MemberExpression\":\n return expressionContainsAwait(node);\n case \"ArrayPattern\":\n case \"ObjectPattern\":\n return bindingPatternContainsAwait(node);\n }\n}\n", "import { visitClassElements } from \"../class-elements.js\";\nimport {\n parseModule,\n type ArrayExpression,\n type ArrayPattern,\n type FunctionNode,\n type AssignmentExpression,\n type AssignmentPattern,\n type AssignmentProperty,\n type BinaryExpression,\n type BlockStatement,\n type CallExpression,\n type CatchClause,\n type ConditionalExpression,\n type DoWhileStatement,\n type Expression,\n type ForInStatement,\n type ForOfStatement,\n type ForStatement,\n type Identifier,\n type IfStatement,\n type LogicalExpression,\n type MemberExpression,\n type Module,\n type ObjectExpression,\n type ObjectPattern,\n type PatternTarget,\n type Property,\n type RestElement,\n type ReturnStatement,\n type SourceSpan,\n type Statement,\n type TaggedTemplateExpression,\n type TemplateLiteral,\n type ThrowStatement,\n type TryStatement,\n type UnaryExpression,\n type VariableDeclaration,\n type VariableDeclarator,\n type WhileStatement\n} from \"../../parse/parser.js\";\n\nexport type Diagnostic = {\n code: \"AS-MUTATING-FROZEN\";\n severity: \"warning\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n};\n\ntype FrozenState = \"frozen\" | \"unknown\";\ntype Scope = Map<string, FrozenState>;\n\nconst MUTATING_ARRAY_METHODS = new Set([\n \"copyWithin\",\n \"fill\",\n \"pop\",\n \"push\",\n \"reverse\",\n \"shift\",\n \"sort\",\n \"splice\",\n \"unshift\"\n]);\n\nexport function AS_MUTATING_FROZEN(\n source: string,\n options: { filename?: string } = {}\n): Diagnostic[] {\n return new ASMutatingFrozenScanner(options.filename ?? \"<input>\").scan(source);\n}\n\nclass ASMutatingFrozenScanner {\n private readonly diagnostics: Diagnostic[] = [];\n private readonly scopes: Scope[] = [];\n\n constructor(private readonly filename: string) {}\n\n scan(source: string): Diagnostic[] {\n this.visitModule(parseModule(source, this.filename));\n return this.diagnostics;\n }\n\n private visitModule(node: Module): void {\n this.withScope(this.collectStatementBindings(node.body), () => {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n });\n }\n\n private visitStatement(node: Statement): void {\n if (node.type === \"ClassDeclaration\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"FunctionDeclaration\":\n this.visitArrowFunction(node);\n return;\n case \"BlockStatement\":\n this.visitBlockStatement(node);\n return;\n case \"ExpressionStatement\":\n this.visitExpression(node.expression);\n return;\n case \"IfStatement\":\n this.visitIfStatement(node);\n return;\n case \"ForStatement\":\n this.visitForStatement(node);\n return;\n case \"ForInStatement\":\n case \"ForOfStatement\":\n this.visitForOfStatement(node);\n return;\n case \"WhileStatement\":\n case \"DoWhileStatement\":\n this.visitWhileStatement(node);\n return;\n case \"TryStatement\":\n this.visitTryStatement(node);\n return;\n case \"VariableDeclaration\":\n this.visitVariableDeclaration(node);\n return;\n case \"ReturnStatement\":\n this.visitReturnStatement(node);\n return;\n case \"ThrowStatement\":\n this.visitThrowStatement(node);\n return;\n case \"ExportNamedDeclaration\":\n this.visitVariableDeclaration(node.declaration);\n return;\n case \"ExportDefaultDeclaration\":\n if (node.declaration.type === \"ClassDeclaration\" || node.declaration.type === \"FunctionDeclaration\") this.visitStatement(node.declaration);\n else this.visitExpression(node.declaration);\n return;\n case \"ImportDeclaration\":\n case \"BreakStatement\":\n case \"ContinueStatement\":\n return;\n }\n }\n\n private visitBlockStatement(node: BlockStatement): void {\n this.withScope(this.collectStatementBindings(node.body), () => {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n });\n }\n\n private visitIfStatement(node: IfStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.consequent);\n if (node.alternate !== undefined) {\n this.visitStatement(node.alternate);\n }\n }\n\n private visitForStatement(node: ForStatement): void {\n const bindings =\n node.init?.type === \"VariableDeclaration\" ? this.collectDeclarationBindings(node.init) : [];\n\n this.withScope(bindings, () => {\n if (node.init !== undefined) {\n if (node.init.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.init);\n } else {\n this.visitExpression(node.init);\n }\n }\n\n if (node.test !== undefined) {\n this.visitExpression(node.test);\n }\n\n if (node.update !== undefined) {\n this.visitExpression(node.update);\n }\n\n this.visitStatement(node.body);\n });\n }\n\n private visitForOfStatement(node: ForInStatement | ForOfStatement): void {\n const bindings =\n node.left.type === \"VariableDeclaration\" ? this.collectDeclarationBindings(node.left) : [];\n\n this.withScope(bindings, () => {\n if (node.left.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.left);\n } else {\n this.visitAssignmentTarget(node.left);\n }\n this.visitExpression(node.right);\n this.visitStatement(node.body);\n });\n }\n\n private visitWhileStatement(node: WhileStatement | DoWhileStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.body);\n }\n\n private visitTryStatement(node: TryStatement): void {\n this.visitBlockStatement(node.block);\n if (node.handler !== undefined) {\n this.visitCatchClause(node.handler);\n }\n if (node.finalizer !== undefined) {\n this.visitBlockStatement(node.finalizer);\n }\n }\n\n private visitCatchClause(node: CatchClause): void {\n const bindings =\n node.param === undefined\n ? []\n : this.createUnknownBindings(this.collectPatternBindings(node.param));\n\n this.withScope(bindings, () => {\n this.visitBlockStatement(node.body);\n });\n }\n\n private visitVariableDeclaration(node: VariableDeclaration): void {\n for (const declarator of node.declarations) {\n this.visitVariableDeclarator(declarator);\n }\n }\n\n private visitVariableDeclarator(node: VariableDeclarator): void {\n if (node.init !== undefined) {\n this.visitExpression(node.init);\n }\n\n if (node.id.type !== \"Identifier\") {\n this.visitBindingPattern(node.id);\n return;\n }\n\n this.setBinding(\n node.id.name,\n isImmutableArrayOrigin(\n node.init,\n (name) => this.lookup(name),\n (name) => this.isBound(name)\n )\n );\n }\n\n private visitReturnStatement(node: ReturnStatement): void {\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n }\n\n private visitThrowStatement(node: ThrowStatement): void {\n this.visitExpression(node.argument);\n }\n\n private visitExpression(node: Expression): void {\n if (node.type === \"ClassExpression\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"YieldExpression\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"FunctionExpression\":\n case \"ArrowFunctionExpression\":\n this.visitArrowFunction(node);\n return;\n case \"ImportExpression\":\n this.visitExpression(node.source);\n if (node.options !== undefined) this.visitExpression(node.options);\n return;\n case \"AwaitExpression\":\n this.visitExpression(node.argument);\n return;\n case \"ArrayExpression\":\n this.visitArrayExpression(node);\n return;\n case \"ObjectExpression\":\n this.visitObjectExpression(node);\n return;\n case \"UnaryExpression\":\n this.visitUnaryExpression(node);\n return;\n case \"BinaryExpression\":\n case \"LogicalExpression\":\n this.visitBinaryLikeExpression(node);\n return;\n case \"ConditionalExpression\":\n this.visitConditionalExpression(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentExpression\":\n this.visitAssignmentExpression(node);\n return;\n case \"CallExpression\":\n this.visitCallExpression(node);\n return;\n case \"TemplateLiteral\":\n this.visitTemplateLiteral(node);\n return;\n case \"TaggedTemplateExpression\":\n this.visitTaggedTemplateExpression(node);\n return;\n case \"Identifier\":\n case \"BooleanLiteral\":\n case \"MetaProperty\":\n case \"NullLiteral\":\n case \"NumericLiteral\":\n case \"RegexLiteral\":\n case \"StringLiteral\":\n case \"UndefinedLiteral\":\n return;\n }\n }\n\n private visitArrowFunction(node: FunctionNode): void {\n this.withScope(this.collectArrowFunctionBindings(node), () => {\n if (node.body.type === \"BlockStatement\") {\n this.visitBlockStatement(node.body);\n return;\n }\n\n this.visitExpression(node.body);\n });\n }\n\n private visitArrayExpression(node: ArrayExpression): void {\n for (const element of node.elements) {\n if (element.type === \"SpreadElement\") {\n this.visitExpression(element.argument);\n continue;\n }\n\n this.visitExpression(element);\n }\n }\n\n private visitObjectExpression(node: ObjectExpression): void {\n for (const property of node.properties) {\n if (property.type === \"SpreadElement\") {\n this.visitExpression(property.argument);\n continue;\n }\n\n this.visitProperty(property);\n }\n }\n\n private visitProperty(node: Property): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitExpression(node.value);\n }\n\n private visitUnaryExpression(node: UnaryExpression): void {\n this.visitExpression(node.argument);\n }\n\n private visitBinaryLikeExpression(node: BinaryExpression | LogicalExpression): void {\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n }\n\n private visitConditionalExpression(node: ConditionalExpression): void {\n this.visitExpression(node.test);\n this.visitExpression(node.consequent);\n this.visitExpression(node.alternate);\n }\n\n private visitMemberExpression(node: MemberExpression): void {\n this.visitExpression(node.object);\n if (node.computed) {\n this.visitExpression(node.property);\n }\n }\n\n private visitAssignmentExpression(node: AssignmentExpression): void {\n this.visitAssignmentTarget(node.left);\n this.visitExpression(node.right);\n\n if (node.left.type === \"Identifier\" && node.operator === \"=\") {\n this.setBinding(\n node.left.name,\n isImmutableArrayOrigin(\n node.right,\n (name) => this.lookup(name),\n (name) => this.isBound(name)\n )\n );\n }\n }\n\n private visitCallExpression(node: CallExpression): void {\n if (\n isMutatingFrozenCall(\n node,\n (name) => this.lookup(name),\n (name) => this.isBound(name)\n )\n ) {\n const methodName = getCalledMethodName(node);\n this.report(node.span, methodName ?? \"method\");\n }\n\n this.visitExpression(node.callee);\n for (const argument of node.arguments) {\n if (argument.type === \"SpreadElement\") {\n this.visitExpression(argument.argument);\n continue;\n }\n\n this.visitExpression(argument);\n }\n }\n\n private visitTemplateLiteral(node: TemplateLiteral): void {\n for (const expression of node.expressions) {\n this.visitExpression(expression);\n }\n }\n\n private visitTaggedTemplateExpression(node: TaggedTemplateExpression): void {\n this.visitExpression(node.tag);\n this.visitTemplateLiteral(node.quasi);\n }\n\n private visitAssignmentTarget(node: AssignmentExpression[\"left\"] | PatternTarget): void {\n switch (node.type) {\n case \"Identifier\":\n case \"MetaProperty\":\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"ArrayPattern\":\n case \"ObjectPattern\":\n this.visitBindingPattern(node);\n return;\n }\n }\n\n private visitBindingPattern(node: ArrayPattern | Identifier | ObjectPattern): void {\n switch (node.type) {\n case \"Identifier\":\n return;\n case \"ArrayPattern\":\n for (const element of node.elements) {\n if (element === null) {\n continue;\n }\n\n this.visitBindingElement(element);\n }\n return;\n case \"ObjectPattern\":\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.visitBindingElement(property);\n continue;\n }\n\n this.visitAssignmentProperty(property);\n }\n return;\n }\n }\n\n private visitAssignmentProperty(node: AssignmentProperty): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitBindingElement(node.value);\n }\n\n private visitBindingElement(\n node:\n | AssignmentPattern\n | ArrayPattern\n | Identifier\n | MemberExpression\n | ObjectPattern\n | RestElement\n ): void {\n switch (node.type) {\n case \"AssignmentPattern\":\n this.visitAssignmentTarget(node.left);\n this.visitExpression(node.right);\n return;\n case \"RestElement\":\n this.visitAssignmentTarget(node.argument);\n return;\n case \"ArrayPattern\":\n case \"ObjectPattern\":\n case \"Identifier\":\n this.visitBindingPattern(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n }\n }\n\n private collectStatementBindings(statements: readonly Statement[]): Array<[string, FrozenState]> {\n return statements.flatMap((statement) => {\n if (statement.type === \"VariableDeclaration\") {\n return this.collectDeclarationBindings(statement);\n }\n\n if (statement.type === \"ExportNamedDeclaration\") {\n return this.collectDeclarationBindings(statement.declaration);\n }\n\n if (statement.type === \"ImportDeclaration\") {\n return statement.specifiers.map((specifier): [string, FrozenState] => [\n specifier.local.name,\n \"unknown\"\n ]);\n }\n\n return [];\n });\n }\n\n private collectDeclarationBindings(node: VariableDeclaration): Array<[string, FrozenState]> {\n return node.declarations.flatMap((declarator) =>\n this.createUnknownBindings(this.collectPatternBindings(declarator.id))\n );\n }\n\n private collectArrowFunctionBindings(node: FunctionNode): Array<[string, FrozenState]> {\n return node.params.flatMap((param) =>\n this.createUnknownBindings(this.collectBindingElementNames(param))\n );\n }\n\n private createUnknownBindings(names: readonly string[]): Array<[string, FrozenState]> {\n return names.map((name) => [name, \"unknown\"]);\n }\n\n private collectPatternBindings(node: ArrayPattern | Identifier | ObjectPattern): string[] {\n switch (node.type) {\n case \"Identifier\":\n return [node.name];\n case \"ArrayPattern\":\n return node.elements.flatMap((element) =>\n element === null ? [] : this.collectBindingElementNames(element)\n );\n case \"ObjectPattern\":\n return node.properties.flatMap((property) =>\n property.type === \"RestElement\"\n ? this.collectBindingElementNames(property)\n : this.collectBindingElementNames(property.value)\n );\n }\n }\n\n private collectBindingElementNames(\n node:\n | AssignmentPattern\n | ArrayPattern\n | Identifier\n | MemberExpression\n | ObjectPattern\n | RestElement\n ): string[] {\n switch (node.type) {\n case \"Identifier\":\n return [node.name];\n case \"AssignmentPattern\":\n return this.collectBindingElementNames(node.left);\n case \"RestElement\":\n return this.collectBindingElementNames(node.argument);\n case \"ArrayPattern\":\n case \"ObjectPattern\":\n return this.collectPatternBindings(node);\n case \"MemberExpression\":\n return [];\n }\n }\n\n private withScope(bindings: Array<[string, FrozenState]>, callback: () => void): void {\n this.scopes.push(new Map(bindings));\n try {\n callback();\n } finally {\n this.scopes.pop();\n }\n }\n\n private lookup(name: string): FrozenState {\n for (let index = this.scopes.length - 1; index >= 0; index -= 1) {\n const binding = this.scopes[index].get(name);\n if (binding !== undefined) {\n return binding;\n }\n }\n\n return \"unknown\";\n }\n\n private isBound(name: string): boolean {\n return this.scopes.some((scope) => scope.has(name));\n }\n\n private setBinding(name: string, state: FrozenState): void {\n for (let index = this.scopes.length - 1; index >= 0; index -= 1) {\n const scope = this.scopes[index];\n if (scope.has(name)) {\n scope.set(name, state);\n return;\n }\n }\n }\n\n private report(span: SourceSpan, methodName: string): void {\n this.diagnostics.push({\n code: \"AS-MUTATING-FROZEN\",\n severity: \"warning\",\n message: `Mutating array method '${methodName}' cannot be called on an immutable array.`,\n filename: this.filename,\n line: span.start.line,\n column: span.start.column,\n span\n });\n }\n}\n\nfunction isMutatingFrozenCall(\n node: CallExpression,\n lookup: (name: string) => FrozenState,\n isBound: (name: string) => boolean\n): boolean {\n const methodName = getCalledMethodName(node);\n\n return (\n methodName !== undefined &&\n MUTATING_ARRAY_METHODS.has(methodName) &&\n node.callee.type === \"MemberExpression\" &&\n isImmutableArrayOrigin(node.callee.object, lookup, isBound) === \"frozen\"\n );\n}\n\nfunction getCalledMethodName(node: CallExpression): string | undefined {\n if (node.callee.type !== \"MemberExpression\") {\n return undefined;\n }\n\n if (!node.callee.computed) {\n return node.callee.property.type === \"Identifier\" ? node.callee.property.name : undefined;\n }\n\n return node.callee.property.type === \"StringLiteral\" ? node.callee.property.value : undefined;\n}\n\nfunction isImmutableArrayOrigin(\n node: Expression | undefined,\n lookup: (name: string) => FrozenState,\n isBound: (name: string) => boolean\n): FrozenState {\n if (node === undefined) {\n return \"unknown\";\n }\n\n if (node.type === \"Identifier\") {\n return lookup(node.name);\n }\n\n return isImmutableArrayFactoryCall(node, isBound) ? \"frozen\" : \"unknown\";\n}\n\nfunction isImmutableArrayFactoryCall(\n node: Expression,\n isBound: (name: string) => boolean\n): boolean {\n if (node.type !== \"CallExpression\" || node.callee.type !== \"MemberExpression\") {\n return false;\n }\n\n if (node.callee.computed) {\n return false;\n }\n\n const objectName = node.callee.object.type === \"Identifier\" ? node.callee.object.name : undefined;\n const propertyName =\n node.callee.property.type === \"Identifier\" ? node.callee.property.name : undefined;\n\n return (\n (objectName === \"Object\" && propertyName === \"freeze\" && !isBound(objectName)) ||\n (objectName === \"Array\" && propertyName === \"of\" && !isBound(objectName))\n );\n}\n", "import { visitClassElements } from \"../class-elements.js\";\nimport {\n parseModule,\n type ArrayExpression,\n type ArrayPattern,\n type FunctionNode,\n type AssignmentExpression,\n type AssignmentPattern,\n type AssignmentProperty,\n type BinaryExpression,\n type BlockStatement,\n type CallExpression,\n type CatchClause,\n type ConditionalExpression,\n type DoWhileStatement,\n type Expression,\n type ForInStatement,\n type ForOfStatement,\n type ForStatement,\n type IfStatement,\n type LogicalExpression,\n type MemberExpression,\n type Module,\n type ObjectExpression,\n type ObjectPattern,\n type PatternTarget,\n type Property,\n type RestElement,\n type ReturnStatement,\n type SourceSpan,\n type Statement,\n type TaggedTemplateExpression,\n type TemplateLiteral,\n type ThrowStatement,\n type TryStatement,\n type UnaryExpression,\n type VariableDeclaration,\n type VariableDeclarator,\n type WhileStatement\n} from \"../../parse/parser.js\";\n\nexport type Diagnostic = {\n code: \"AS-NEEDLESS-TEMPLATE\";\n severity: \"info\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n fix: {\n range: readonly [number, number];\n replacement: string;\n };\n hint: string;\n};\n\nexport const AS_NEEDLESS_TEMPLATE_MESSAGE =\n \"Template literals with only one interpolation should use the value or String(value).\";\n\nexport function AS_NEEDLESS_TEMPLATE(\n source: string,\n options: { filename?: string } = {}\n): Diagnostic[] {\n return new ASNeedlessTemplateScanner(source, options.filename ?? \"<input>\").scan();\n}\n\nexport function fixASNeedlessTemplate(source: string, options: { filename?: string } = {}): string {\n const filename = options.filename ?? \"<input>\";\n let result = source;\n\n while (true) {\n const diagnostics = new ASNeedlessTemplateScanner(result, filename).collect();\n if (diagnostics.length === 0) {\n return result;\n }\n\n const next = selectInnermostDiagnostics(diagnostics)\n .sort((left, right) => right.span.start.offset - left.span.start.offset)\n .reduce((current, diagnostic) => {\n return `${current.slice(0, diagnostic.span.start.offset)}${createReplacement(current, diagnostic)}${current.slice(diagnostic.span.end.offset)}`;\n }, result);\n\n if (next === result) {\n return result;\n }\n\n result = next;\n }\n}\n\ntype InternalDiagnostic = Diagnostic & {\n expression: Expression;\n expressionSpan: SourceSpan;\n};\n\nclass ASNeedlessTemplateScanner {\n private readonly diagnostics: InternalDiagnostic[] = [];\n\n constructor(\n private readonly source: string,\n private readonly filename: string\n ) {}\n\n scan(): Diagnostic[] {\n this.visitModule(parseModule(this.source, this.filename));\n return this.diagnostics.map(\n ({ expression: _expression, expressionSpan: _expressionSpan, ...diagnostic }) => diagnostic\n );\n }\n\n collect(): InternalDiagnostic[] {\n this.visitModule(parseModule(this.source, this.filename));\n return this.diagnostics;\n }\n\n private visitModule(node: Module): void {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n }\n\n private visitStatement(node: Statement): void {\n if (node.type === \"ClassDeclaration\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"FunctionDeclaration\":\n this.visitArrowFunction(node);\n return;\n case \"BlockStatement\":\n this.visitBlockStatement(node);\n return;\n case \"ExpressionStatement\":\n this.visitExpression(node.expression);\n return;\n case \"IfStatement\":\n this.visitIfStatement(node);\n return;\n case \"ForStatement\":\n this.visitForStatement(node);\n return;\n case \"ForInStatement\":\n case \"ForOfStatement\":\n this.visitForOfStatement(node);\n return;\n case \"WhileStatement\":\n case \"DoWhileStatement\":\n this.visitWhileStatement(node);\n return;\n case \"TryStatement\":\n this.visitTryStatement(node);\n return;\n case \"VariableDeclaration\":\n this.visitVariableDeclaration(node);\n return;\n case \"ReturnStatement\":\n this.visitReturnStatement(node);\n return;\n case \"ThrowStatement\":\n this.visitThrowStatement(node);\n return;\n case \"ExportNamedDeclaration\":\n this.visitVariableDeclaration(node.declaration);\n return;\n case \"ExportDefaultDeclaration\":\n if (node.declaration.type === \"ClassDeclaration\" || node.declaration.type === \"FunctionDeclaration\") this.visitStatement(node.declaration);\n else this.visitExpression(node.declaration);\n return;\n case \"ImportDeclaration\":\n case \"BreakStatement\":\n case \"ContinueStatement\":\n return;\n }\n }\n\n private visitBlockStatement(node: BlockStatement): void {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n }\n\n private visitIfStatement(node: IfStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.consequent);\n if (node.alternate !== undefined) {\n this.visitStatement(node.alternate);\n }\n }\n\n private visitForStatement(node: ForStatement): void {\n if (node.init !== undefined) {\n if (node.init.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.init);\n } else {\n this.visitExpression(node.init);\n }\n }\n\n if (node.test !== undefined) {\n this.visitExpression(node.test);\n }\n\n if (node.update !== undefined) {\n this.visitExpression(node.update);\n }\n\n this.visitStatement(node.body);\n }\n\n private visitForOfStatement(node: ForInStatement | ForOfStatement): void {\n if (node.left.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.left);\n } else {\n this.visitAssignmentTarget(node.left);\n }\n this.visitExpression(node.right);\n this.visitStatement(node.body);\n }\n\n private visitWhileStatement(node: WhileStatement | DoWhileStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.body);\n }\n\n private visitTryStatement(node: TryStatement): void {\n this.visitBlockStatement(node.block);\n if (node.handler !== undefined) {\n this.visitCatchClause(node.handler);\n }\n if (node.finalizer !== undefined) {\n this.visitBlockStatement(node.finalizer);\n }\n }\n\n private visitCatchClause(node: CatchClause): void {\n if (node.param !== undefined) {\n this.visitBindingPattern(node.param);\n }\n this.visitBlockStatement(node.body);\n }\n\n private visitVariableDeclaration(node: VariableDeclaration): void {\n for (const declarator of node.declarations) {\n this.visitVariableDeclarator(declarator);\n }\n }\n\n private visitVariableDeclarator(node: VariableDeclarator): void {\n this.visitBindingPattern(node.id);\n if (node.init !== undefined) {\n this.visitExpression(node.init);\n }\n }\n\n private visitReturnStatement(node: ReturnStatement): void {\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n }\n\n private visitThrowStatement(node: ThrowStatement): void {\n this.visitExpression(node.argument);\n }\n\n private visitExpression(node: Expression): void {\n if (node.type === \"ClassExpression\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"YieldExpression\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"FunctionExpression\":\n case \"ArrowFunctionExpression\":\n this.visitArrowFunction(node);\n return;\n case \"ImportExpression\":\n this.visitExpression(node.source);\n if (node.options !== undefined) this.visitExpression(node.options);\n return;\n case \"AwaitExpression\":\n this.visitExpression(node.argument);\n return;\n case \"ArrayExpression\":\n this.visitArrayExpression(node);\n return;\n case \"ObjectExpression\":\n this.visitObjectExpression(node);\n return;\n case \"UnaryExpression\":\n this.visitUnaryExpression(node);\n return;\n case \"BinaryExpression\":\n case \"LogicalExpression\":\n this.visitBinaryLikeExpression(node);\n return;\n case \"ConditionalExpression\":\n this.visitConditionalExpression(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentExpression\":\n this.visitAssignmentExpression(node);\n return;\n case \"CallExpression\":\n this.visitCallExpression(node);\n return;\n case \"TemplateLiteral\":\n this.visitTemplateLiteral(node, true);\n return;\n case \"TaggedTemplateExpression\":\n this.visitTaggedTemplateExpression(node);\n return;\n case \"Identifier\":\n case \"BooleanLiteral\":\n case \"MetaProperty\":\n case \"NullLiteral\":\n case \"NumericLiteral\":\n case \"RegexLiteral\":\n case \"StringLiteral\":\n case \"UndefinedLiteral\":\n return;\n }\n }\n\n private visitArrowFunction(node: FunctionNode): void {\n for (const param of node.params) {\n this.visitBindingElement(param);\n }\n\n if (node.body.type === \"BlockStatement\") {\n this.visitBlockStatement(node.body);\n return;\n }\n\n this.visitExpression(node.body);\n }\n\n private visitArrayExpression(node: ArrayExpression): void {\n for (const element of node.elements) {\n if (element.type === \"SpreadElement\") {\n this.visitExpression(element.argument);\n continue;\n }\n\n this.visitExpression(element);\n }\n }\n\n private visitObjectExpression(node: ObjectExpression): void {\n for (const property of node.properties) {\n if (property.type === \"SpreadElement\") {\n this.visitExpression(property.argument);\n continue;\n }\n\n this.visitProperty(property);\n }\n }\n\n private visitProperty(node: Property): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitExpression(node.value);\n }\n\n private visitUnaryExpression(node: UnaryExpression): void {\n this.visitExpression(node.argument);\n }\n\n private visitBinaryLikeExpression(node: BinaryExpression | LogicalExpression): void {\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n }\n\n private visitConditionalExpression(node: ConditionalExpression): void {\n this.visitExpression(node.test);\n this.visitExpression(node.consequent);\n this.visitExpression(node.alternate);\n }\n\n private visitMemberExpression(node: MemberExpression): void {\n this.visitExpression(node.object);\n if (node.computed) {\n this.visitExpression(node.property);\n }\n }\n\n private visitAssignmentExpression(node: AssignmentExpression): void {\n this.visitAssignmentTarget(node.left);\n this.visitExpression(node.right);\n }\n\n private visitCallExpression(node: CallExpression): void {\n this.visitExpression(node.callee);\n for (const argument of node.arguments) {\n if (argument.type === \"SpreadElement\") {\n this.visitExpression(argument.argument);\n continue;\n }\n\n this.visitExpression(argument);\n }\n }\n\n private visitTemplateLiteral(node: TemplateLiteral, canReport: boolean): void {\n if (canReport && isNeedlessTemplate(node)) {\n this.report(node, node.expressions[0]);\n }\n\n for (const expression of node.expressions) {\n this.visitExpression(expression);\n }\n }\n\n private visitTaggedTemplateExpression(node: TaggedTemplateExpression): void {\n this.visitExpression(node.tag);\n this.visitTemplateLiteral(node.quasi, false);\n }\n\n private visitAssignmentTarget(node: AssignmentExpression[\"left\"]): void {\n switch (node.type) {\n case \"Identifier\":\n case \"MetaProperty\":\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"ArrayPattern\":\n case \"ObjectPattern\":\n this.visitBindingPattern(node);\n return;\n }\n }\n\n private visitBindingElement(\n node:\n | AssignmentPattern\n | ArrayPattern\n | MemberExpression\n | ObjectPattern\n | PatternTarget\n | RestElement\n ): void {\n if (node.type === \"RestElement\") {\n this.visitAssignmentTarget(node.argument);\n return;\n }\n\n this.visitBindingPattern(node);\n }\n\n private visitBindingPattern(\n node: AssignmentPattern | ArrayPattern | MemberExpression | ObjectPattern | PatternTarget\n ): void {\n switch (node.type) {\n case \"Identifier\":\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentPattern\":\n this.visitBindingPattern(node.left);\n this.visitExpression(node.right);\n return;\n case \"ArrayPattern\":\n for (const element of node.elements) {\n if (element === null) {\n continue;\n }\n this.visitBindingElement(element);\n }\n return;\n case \"ObjectPattern\":\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.visitAssignmentTarget(property.argument);\n continue;\n }\n this.visitAssignmentProperty(property);\n }\n return;\n }\n }\n\n private visitAssignmentProperty(node: AssignmentProperty): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitBindingPattern(node.value);\n }\n\n private report(template: TemplateLiteral, expression: Expression): void {\n this.diagnostics.push({\n code: \"AS-NEEDLESS-TEMPLATE\",\n severity: \"info\",\n message: AS_NEEDLESS_TEMPLATE_MESSAGE,\n hint: `Use ${createStringReplacement(\n this.source.slice(expression.span.start.offset, expression.span.end.offset),\n expression\n )}.`,\n filename: this.filename,\n line: template.span.start.line,\n column: template.span.start.column,\n span: template.span,\n fix: {\n range: [template.span.start.offset, template.span.end.offset],\n replacement: createStringReplacement(\n this.source.slice(expression.span.start.offset, expression.span.end.offset),\n expression\n )\n },\n expression,\n expressionSpan: expression.span\n });\n }\n}\n\nfunction selectInnermostDiagnostics(\n diagnostics: readonly InternalDiagnostic[]\n): InternalDiagnostic[] {\n return diagnostics.filter(\n (candidate) =>\n !diagnostics.some((other) => other !== candidate && containsSpan(candidate.span, other.span))\n );\n}\n\nfunction containsSpan(outer: SourceSpan, inner: SourceSpan): boolean {\n return outer.start.offset <= inner.start.offset && inner.end.offset <= outer.end.offset;\n}\n\nfunction createReplacement(source: string, diagnostic: InternalDiagnostic): string {\n return createStringReplacement(\n source.slice(diagnostic.expressionSpan.start.offset, diagnostic.expressionSpan.end.offset),\n diagnostic.expression\n );\n}\n\nfunction createStringReplacement(expressionSource: string, expression: Expression): string {\n if (isStringCallExpression(expression)) {\n return expressionSource;\n }\n\n return `String(${expressionSource})`;\n}\n\nfunction isStringCallExpression(expression: Expression): boolean {\n return (\n expression.type === \"CallExpression\" &&\n expression.callee.type === \"Identifier\" &&\n expression.callee.name === \"String\"\n );\n}\n\nfunction isNeedlessTemplate(node: TemplateLiteral): boolean {\n if (node.expressions.length !== 1 || node.quasis.length !== 2) {\n return false;\n }\n\n return (\n node.expressions[0]?.type !== \"TemplateLiteral\" &&\n node.quasis.every((quasi) => quasi.value.raw === \"\")\n );\n}\n", "import { visitClassElements } from \"../class-elements.js\";\nimport {\n parseModule,\n type ArrayExpression,\n type ArrayPattern,\n type FunctionNode,\n type AssignmentExpression,\n type AssignmentPattern,\n type AssignmentProperty,\n type AwaitExpression,\n type BinaryExpression,\n type BlockStatement,\n type CallExpression,\n type CatchClause,\n type ConditionalExpression,\n type DoWhileStatement,\n type Expression,\n type ForInStatement,\n type ForOfStatement,\n type ForStatement,\n type Identifier,\n type IfStatement,\n type LogicalExpression,\n type MemberExpression,\n type Module,\n type ObjectExpression,\n type ObjectPattern,\n type Property,\n type RestElement,\n type ReturnStatement,\n type SourceSpan,\n type SpreadElement,\n type Statement,\n type TaggedTemplateExpression,\n type TemplateLiteral,\n type ThrowStatement,\n type TryStatement,\n type UnaryExpression,\n type VariableDeclaration,\n type VariableDeclarator,\n type WhileStatement\n} from \"../../parse/parser.js\";\nimport { KNOWN_RUNTIME_GLOBALS } from \"./known-globals.js\";\n\nexport type Diagnostic = {\n code: \"AS-SHADOW-GLOBAL\";\n severity: \"warning\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n};\n\nexport function AS_SHADOW_GLOBAL(\n source: string,\n options: { allowedGlobals?: readonly string[]; filename?: string } = {}\n): Diagnostic[] {\n return new ASShadowGlobalScanner(\n options.filename ?? \"<input>\",\n new Set([...KNOWN_RUNTIME_GLOBALS, ...(options.allowedGlobals ?? [])])\n ).scan(source);\n}\n\nclass ASShadowGlobalScanner {\n private readonly diagnostics: Diagnostic[] = [];\n\n constructor(\n private readonly filename: string,\n private readonly knownGlobals: ReadonlySet<string>\n ) {}\n\n scan(source: string): Diagnostic[] {\n this.visitModule(parseModule(source, this.filename));\n return this.diagnostics;\n }\n\n private visitModule(node: Module): void {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n }\n\n private visitStatement(node: Statement): void {\n if (node.type === \"ClassDeclaration\") {\n this.reportIfGlobalShadow(node.id);\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"FunctionDeclaration\":\n this.visitArrowFunctionExpression(node);\n return;\n case \"BlockStatement\":\n this.visitBlockStatement(node);\n return;\n case \"ExpressionStatement\":\n this.visitExpression(node.expression);\n return;\n case \"IfStatement\":\n this.visitIfStatement(node);\n return;\n case \"ForStatement\":\n this.visitForStatement(node);\n return;\n case \"ForInStatement\":\n case \"ForOfStatement\":\n this.visitForOfStatement(node);\n return;\n case \"WhileStatement\":\n case \"DoWhileStatement\":\n this.visitWhileStatement(node);\n return;\n case \"TryStatement\":\n this.visitTryStatement(node);\n return;\n case \"VariableDeclaration\":\n this.visitVariableDeclaration(node);\n return;\n case \"ReturnStatement\":\n this.visitReturnStatement(node);\n return;\n case \"ThrowStatement\":\n this.visitThrowStatement(node);\n return;\n case \"ExportNamedDeclaration\":\n this.visitVariableDeclaration(node.declaration);\n return;\n case \"ExportDefaultDeclaration\":\n if (node.declaration.type === \"ClassDeclaration\" || node.declaration.type === \"FunctionDeclaration\") this.visitStatement(node.declaration);\n else this.visitExpression(node.declaration);\n return;\n case \"ImportDeclaration\":\n case \"BreakStatement\":\n case \"ContinueStatement\":\n return;\n }\n }\n\n private visitBlockStatement(node: BlockStatement): void {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n }\n\n private visitIfStatement(node: IfStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.consequent);\n if (node.alternate !== undefined) {\n this.visitStatement(node.alternate);\n }\n }\n\n private visitForStatement(node: ForStatement): void {\n if (node.init !== undefined) {\n if (node.init.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.init);\n } else {\n this.visitExpression(node.init);\n }\n }\n if (node.test !== undefined) {\n this.visitExpression(node.test);\n }\n if (node.update !== undefined) {\n this.visitExpression(node.update);\n }\n this.visitStatement(node.body);\n }\n\n private visitForOfStatement(node: ForInStatement | ForOfStatement): void {\n if (node.left.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.left);\n } else {\n this.visitAssignmentTargetPattern(node.left);\n }\n this.visitExpression(node.right);\n this.visitStatement(node.body);\n }\n\n private visitWhileStatement(node: WhileStatement | DoWhileStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.body);\n }\n\n private visitTryStatement(node: TryStatement): void {\n this.visitBlockStatement(node.block);\n if (node.handler !== undefined) {\n this.visitCatchClause(node.handler);\n }\n if (node.finalizer !== undefined) {\n this.visitBlockStatement(node.finalizer);\n }\n }\n\n private visitCatchClause(node: CatchClause): void {\n if (node.param !== undefined) {\n this.visitPatternTarget(node.param);\n }\n this.visitBlockStatement(node.body);\n }\n\n private visitReturnStatement(node: ReturnStatement): void {\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n }\n\n private visitThrowStatement(node: ThrowStatement): void {\n this.visitExpression(node.argument);\n }\n\n private visitVariableDeclaration(node: VariableDeclaration): void {\n for (const declarator of node.declarations) {\n this.visitVariableDeclarator(declarator);\n }\n }\n\n private visitVariableDeclarator(node: VariableDeclarator): void {\n this.visitPatternTarget(node.id);\n if (node.init !== undefined) {\n this.visitExpression(node.init);\n }\n }\n\n private visitExpression(node: Expression): void {\n if (node.type === \"ClassExpression\") {\n if (node.id !== undefined) this.reportIfGlobalShadow(node.id);\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"YieldExpression\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"FunctionExpression\":\n case \"ArrowFunctionExpression\":\n this.visitArrowFunctionExpression(node);\n return;\n case \"ArrayExpression\":\n this.visitArrayExpression(node);\n return;\n case \"ImportExpression\":\n this.visitExpression(node.source);\n if (node.options !== undefined) this.visitExpression(node.options);\n return;\n case \"AwaitExpression\":\n this.visitAwaitExpression(node);\n return;\n case \"BinaryExpression\":\n this.visitBinaryExpression(node);\n return;\n case \"CallExpression\":\n this.visitCallExpression(node);\n return;\n case \"ConditionalExpression\":\n this.visitConditionalExpression(node);\n return;\n case \"LogicalExpression\":\n this.visitLogicalExpression(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"ObjectExpression\":\n this.visitObjectExpression(node);\n return;\n case \"TaggedTemplateExpression\":\n this.visitTaggedTemplateExpression(node);\n return;\n case \"TemplateLiteral\":\n this.visitTemplateLiteral(node);\n return;\n case \"UnaryExpression\":\n this.visitUnaryExpression(node);\n return;\n case \"AssignmentExpression\":\n this.visitAssignmentExpression(node);\n return;\n case \"BooleanLiteral\":\n case \"Identifier\":\n case \"MetaProperty\":\n case \"NullLiteral\":\n case \"NumericLiteral\":\n case \"RegexLiteral\":\n case \"StringLiteral\":\n case \"UndefinedLiteral\":\n return;\n }\n }\n\n private visitArrowFunctionExpression(node: FunctionNode): void {\n if (node.type !== \"ArrowFunctionExpression\" && node.id !== undefined) {\n this.reportIfGlobalShadow(node.id);\n }\n for (const parameter of node.params) {\n this.visitBindingElement(parameter);\n }\n if (node.body.type === \"BlockStatement\") {\n this.visitBlockStatement(node.body);\n } else {\n this.visitExpression(node.body);\n }\n }\n\n private visitArrayExpression(node: ArrayExpression): void {\n for (const element of node.elements) {\n if (element.type === \"SpreadElement\") {\n this.visitSpreadElement(element);\n } else {\n this.visitExpression(element);\n }\n }\n }\n\n private visitAwaitExpression(node: AwaitExpression): void {\n this.visitExpression(node.argument);\n }\n\n private visitBinaryExpression(node: BinaryExpression): void {\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n }\n\n private visitCallExpression(node: CallExpression): void {\n this.visitExpression(node.callee);\n for (const argument of node.arguments) {\n if (argument.type === \"SpreadElement\") {\n this.visitSpreadElement(argument);\n } else {\n this.visitExpression(argument);\n }\n }\n }\n\n private visitConditionalExpression(node: ConditionalExpression): void {\n this.visitExpression(node.test);\n this.visitExpression(node.consequent);\n this.visitExpression(node.alternate);\n }\n\n private visitLogicalExpression(node: LogicalExpression): void {\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n }\n\n private visitMemberExpression(node: MemberExpression): void {\n this.visitExpression(node.object);\n if (node.computed) {\n this.visitExpression(node.property);\n }\n }\n\n private visitObjectExpression(node: ObjectExpression): void {\n for (const property of node.properties) {\n if (property.type === \"SpreadElement\") {\n this.visitSpreadElement(property);\n } else {\n this.visitProperty(property);\n }\n }\n }\n\n private visitTaggedTemplateExpression(node: TaggedTemplateExpression): void {\n this.visitExpression(node.tag);\n this.visitTemplateLiteral(node.quasi);\n }\n\n private visitTemplateLiteral(node: TemplateLiteral): void {\n for (const expression of node.expressions) {\n this.visitExpression(expression);\n }\n }\n\n private visitUnaryExpression(node: UnaryExpression): void {\n this.visitExpression(node.argument);\n }\n\n private visitAssignmentExpression(node: AssignmentExpression): void {\n this.visitAssignmentTargetPattern(node.left);\n this.visitExpression(node.right);\n }\n\n private visitAssignmentTargetPattern(\n node: AssignmentExpression[\"left\"] | AssignmentPattern | RestElement\n ): void {\n switch (node.type) {\n case \"AssignmentPattern\":\n this.visitAssignmentTargetPattern(node.left);\n this.visitExpression(node.right);\n return;\n case \"RestElement\":\n this.visitAssignmentTargetPattern(node.argument);\n return;\n case \"ArrayPattern\":\n this.visitAssignmentArrayPattern(node);\n return;\n case \"ObjectPattern\":\n this.visitAssignmentObjectPattern(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"Identifier\":\n case \"MetaProperty\":\n return;\n }\n }\n\n private visitAssignmentArrayPattern(node: ArrayPattern): void {\n for (const element of node.elements) {\n if (element !== null) {\n this.visitAssignmentTargetPattern(element);\n }\n }\n }\n\n private visitAssignmentObjectPattern(node: ObjectPattern): void {\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.visitAssignmentTargetPattern(property.argument);\n continue;\n }\n if (property.computed) {\n this.visitExpression(property.key);\n }\n this.visitAssignmentTargetPattern(property.value);\n }\n }\n\n private visitProperty(node: Property): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitExpression(node.value);\n }\n\n private visitSpreadElement(node: SpreadElement): void {\n this.visitExpression(node.argument);\n }\n\n private visitBindingElement(\n node:\n | AssignmentPattern\n | ArrayPattern\n | Identifier\n | MemberExpression\n | ObjectPattern\n | RestElement\n ): void {\n switch (node.type) {\n case \"AssignmentPattern\":\n this.visitPatternTarget(node.left);\n this.visitExpression(node.right);\n return;\n case \"RestElement\":\n this.visitPatternTarget(node.argument);\n return;\n default:\n this.visitPatternTarget(node);\n return;\n }\n }\n\n private visitPatternTarget(\n node: ArrayPattern | Identifier | MemberExpression | ObjectPattern\n ): void {\n switch (node.type) {\n case \"Identifier\":\n this.reportIfGlobalShadow(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"ArrayPattern\":\n this.visitArrayPattern(node);\n return;\n case \"ObjectPattern\":\n this.visitObjectPattern(node);\n return;\n }\n }\n\n private visitArrayPattern(node: ArrayPattern): void {\n for (const element of node.elements) {\n if (element !== null) {\n this.visitBindingElement(element);\n }\n }\n }\n\n private visitObjectPattern(node: ObjectPattern): void {\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.visitPatternTarget(property.argument);\n continue;\n }\n this.visitAssignmentProperty(property);\n }\n }\n\n private visitAssignmentProperty(node: AssignmentProperty): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitBindingElement(node.value);\n }\n\n private reportIfGlobalShadow(node: Identifier): void {\n if (!this.knownGlobals.has(node.name)) {\n return;\n }\n\n this.diagnostics.push({\n code: \"AS-SHADOW-GLOBAL\",\n severity: \"warning\",\n message: `Local binding '${node.name}' shadows a runtime global.`,\n filename: this.filename,\n line: node.span.start.line,\n column: node.span.start.column,\n span: node.span\n });\n }\n}\n", "import { visitClassElements } from \"../class-elements.js\";\nimport {\n parseModule,\n type ArrayExpression,\n type FunctionNode,\n type AssignmentExpression,\n type BinaryExpression,\n type BlockStatement,\n type CallExpression,\n type CatchClause,\n type ConditionalExpression,\n type DoWhileStatement,\n type Expression,\n type ForInStatement,\n type ForOfStatement,\n type ForStatement,\n type IfStatement,\n type LogicalExpression,\n type MemberExpression,\n type Module,\n type ObjectExpression,\n type Property,\n type SourceSpan,\n type Statement,\n type TaggedTemplateExpression,\n type TemplateLiteral,\n type ThrowStatement,\n type TryStatement,\n type UnaryExpression,\n type VariableDeclaration,\n type VariableDeclarator,\n type WhileStatement\n} from \"../../parse/parser.js\";\n\nexport type Diagnostic = {\n code: \"AS-UNBOUNDED-LOOP\";\n severity: \"warning\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n};\n\nconst MESSAGE =\n \"Unbounded loop or generator source has no static exit with break, return, or throw.\";\n\ntype LoopStatement =\n | DoWhileStatement\n | ForInStatement\n | ForOfStatement\n | ForStatement\n | WhileStatement;\ntype UnboundedLoopStatement = DoWhileStatement | ForStatement | WhileStatement;\n\nexport function AS_UNBOUNDED_LOOP(\n source: string,\n options: { filename?: string } = {}\n): Diagnostic[] {\n return new ASUnboundedLoopScanner(options.filename ?? \"<input>\").scan(source);\n}\n\nclass ASUnboundedLoopScanner {\n private readonly diagnostics: Diagnostic[] = [];\n private readonly labelStack: string[] = [];\n\n constructor(private readonly filename: string) {}\n\n scan(source: string): Diagnostic[] {\n this.visitModule(parseModule(source, this.filename));\n return this.diagnostics;\n }\n\n private visitModule(node: Module): void {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n }\n\n private visitStatement(node: Statement): void {\n if (node.type === \"ClassDeclaration\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"FunctionDeclaration\":\n this.visitArrowFunction(node);\n return;\n case \"BlockStatement\":\n this.visitBlockStatement(node);\n return;\n case \"ExpressionStatement\":\n this.visitExpression(node.expression);\n return;\n case \"IfStatement\":\n this.visitIfStatement(node);\n return;\n case \"ForStatement\":\n this.visitForStatement(node);\n return;\n case \"ForInStatement\":\n case \"ForOfStatement\":\n this.visitForOfStatement(node);\n return;\n case \"WhileStatement\":\n this.visitWhileStatement(node);\n return;\n case \"DoWhileStatement\":\n this.visitDoWhileStatement(node);\n return;\n case \"TryStatement\":\n this.visitTryStatement(node);\n return;\n case \"VariableDeclaration\":\n this.visitVariableDeclaration(node);\n return;\n case \"ReturnStatement\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"ThrowStatement\":\n this.visitThrowStatement(node);\n return;\n case \"ExportNamedDeclaration\":\n this.visitVariableDeclaration(node.declaration);\n return;\n case \"ExportDefaultDeclaration\":\n if (node.declaration.type === \"ClassDeclaration\" || node.declaration.type === \"FunctionDeclaration\") this.visitStatement(node.declaration);\n else this.visitExpression(node.declaration);\n return;\n case \"ImportDeclaration\":\n case \"BreakStatement\":\n case \"ContinueStatement\":\n return;\n }\n }\n\n private visitBlockStatement(node: BlockStatement): void {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n }\n\n private visitIfStatement(node: IfStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.consequent);\n if (node.alternate !== undefined) {\n this.visitStatement(node.alternate);\n }\n }\n\n private visitForStatement(node: ForStatement): void {\n if (node.init !== undefined) {\n if (node.init.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.init);\n } else {\n this.visitExpression(node.init);\n }\n }\n if (node.test !== undefined) {\n this.visitExpression(node.test);\n }\n if (node.update !== undefined) {\n this.visitExpression(node.update);\n }\n this.visitLoopBody(node, () => {\n this.reportIfUnboundedWithoutExit(node);\n this.visitStatement(node.body);\n });\n }\n\n private visitForOfStatement(node: ForInStatement | ForOfStatement): void {\n if (node.left.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.left);\n }\n this.visitExpression(node.right);\n this.visitLoopBody(node, () => {\n this.visitStatement(node.body);\n });\n }\n\n private visitWhileStatement(node: WhileStatement): void {\n this.visitExpression(node.test);\n this.visitLoopBody(node, () => {\n this.reportIfUnboundedWithoutExit(node);\n this.visitStatement(node.body);\n });\n }\n\n private visitDoWhileStatement(node: DoWhileStatement): void {\n this.visitExpression(node.test);\n this.visitLoopBody(node, () => {\n this.reportIfUnboundedWithoutExit(node);\n this.visitStatement(node.body);\n });\n }\n\n private visitLoopBody(node: LoopStatement, callback: () => void): void {\n const labels = getLoopLabels(node);\n this.labelStack.push(...labels);\n callback();\n this.labelStack.length -= labels.length;\n }\n\n private visitTryStatement(node: TryStatement): void {\n this.visitBlockStatement(node.block);\n if (node.handler !== undefined) {\n this.visitCatchClause(node.handler);\n }\n if (node.finalizer !== undefined) {\n this.visitBlockStatement(node.finalizer);\n }\n }\n\n private visitCatchClause(node: CatchClause): void {\n this.visitBlockStatement(node.body);\n }\n\n private visitVariableDeclaration(node: VariableDeclaration): void {\n for (const declarator of node.declarations) {\n this.visitVariableDeclarator(declarator);\n }\n }\n\n private visitVariableDeclarator(node: VariableDeclarator): void {\n if (node.init !== undefined) {\n this.visitExpression(node.init);\n }\n }\n\n private visitThrowStatement(node: ThrowStatement): void {\n this.visitExpression(node.argument);\n }\n\n private visitExpression(node: Expression): void {\n if (node.type === \"ClassExpression\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"YieldExpression\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"FunctionExpression\":\n case \"ArrowFunctionExpression\":\n this.visitArrowFunction(node);\n return;\n case \"ImportExpression\":\n this.visitExpression(node.source);\n if (node.options !== undefined) this.visitExpression(node.options);\n return;\n case \"AwaitExpression\":\n this.visitExpression(node.argument);\n return;\n case \"ArrayExpression\":\n this.visitArrayExpression(node);\n return;\n case \"ObjectExpression\":\n this.visitObjectExpression(node);\n return;\n case \"UnaryExpression\":\n this.visitUnaryExpression(node);\n return;\n case \"BinaryExpression\":\n case \"LogicalExpression\":\n this.visitBinaryLikeExpression(node);\n return;\n case \"ConditionalExpression\":\n this.visitConditionalExpression(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentExpression\":\n this.visitAssignmentExpression(node);\n return;\n case \"CallExpression\":\n this.visitCallExpression(node);\n return;\n case \"TemplateLiteral\":\n this.visitTemplateLiteral(node);\n return;\n case \"TaggedTemplateExpression\":\n this.visitTaggedTemplateExpression(node);\n return;\n case \"Identifier\":\n case \"BooleanLiteral\":\n case \"NullLiteral\":\n case \"NumericLiteral\":\n case \"StringLiteral\":\n case \"RegexLiteral\":\n case \"MetaProperty\":\n case \"UndefinedLiteral\":\n return;\n }\n }\n\n private visitArrowFunction(node: FunctionNode): void {\n const labels = this.labelStack.splice(0);\n try {\n if (node.body.type === \"BlockStatement\") {\n this.visitBlockStatement(node.body);\n return;\n }\n\n this.visitExpression(node.body);\n } finally {\n this.labelStack.push(...labels);\n }\n }\n\n private visitArrayExpression(node: ArrayExpression): void {\n for (const element of node.elements) {\n if (element.type === \"SpreadElement\") {\n this.visitExpression(element.argument);\n } else {\n this.visitExpression(element);\n }\n }\n }\n\n private visitObjectExpression(node: ObjectExpression): void {\n for (const property of node.properties) {\n if (property.type === \"SpreadElement\") {\n this.visitExpression(property.argument);\n } else {\n this.visitProperty(property);\n }\n }\n }\n\n private visitProperty(node: Property): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitExpression(node.value);\n }\n\n private visitUnaryExpression(node: UnaryExpression): void {\n this.visitExpression(node.argument);\n }\n\n private visitBinaryLikeExpression(node: BinaryExpression | LogicalExpression): void {\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n }\n\n private visitConditionalExpression(node: ConditionalExpression): void {\n this.visitExpression(node.test);\n this.visitExpression(node.consequent);\n this.visitExpression(node.alternate);\n }\n\n private visitMemberExpression(node: MemberExpression): void {\n this.visitExpression(node.object);\n if (node.computed) {\n this.visitExpression(node.property);\n }\n }\n\n private visitAssignmentExpression(node: AssignmentExpression): void {\n this.visitExpression(node.right);\n }\n\n private visitCallExpression(node: CallExpression): void {\n this.visitExpression(node.callee);\n for (const argument of node.arguments) {\n if (argument.type === \"SpreadElement\") {\n this.visitExpression(argument.argument);\n } else {\n this.visitExpression(argument);\n }\n }\n }\n\n private visitTemplateLiteral(node: TemplateLiteral): void {\n for (const expression of node.expressions) {\n this.visitExpression(expression);\n }\n }\n\n private visitTaggedTemplateExpression(node: TaggedTemplateExpression): void {\n this.visitExpression(node.tag);\n this.visitTemplateLiteral(node.quasi);\n }\n\n private reportIfUnboundedWithoutExit(node: UnboundedLoopStatement): void {\n if (!isUnboundedLoop(node)) {\n return;\n }\n\n const exitingLabels = new Set([...this.labelStack, ...getLoopLabels(node)]);\n if (bodyHasExit(node.body, exitingLabels, true)) {\n return;\n }\n\n this.diagnostics.push({\n code: \"AS-UNBOUNDED-LOOP\",\n severity: \"warning\",\n message: MESSAGE,\n filename: this.filename,\n line: node.span.start.line,\n column: node.span.start.column,\n span: node.span\n });\n }\n}\n\nfunction isUnboundedLoop(node: UnboundedLoopStatement): boolean {\n switch (node.type) {\n case \"ForStatement\":\n return node.test === undefined;\n case \"WhileStatement\":\n case \"DoWhileStatement\":\n return isTrueLiteral(node.test);\n }\n}\n\nfunction getLoopLabels(node: LoopStatement): readonly string[] {\n return node.labels ?? (node.label === undefined ? [] : [node.label]);\n}\n\nfunction isTrueLiteral(node: Expression): boolean {\n return node.type === \"BooleanLiteral\" && node.value;\n}\n\nfunction bodyHasExit(\n node: Statement,\n exitingLabels: ReadonlySet<string>,\n allowUnlabeledBreak: boolean\n): boolean {\n switch (node.type) {\n case \"WithStatement\":\n return bodyHasExit(node.body, exitingLabels, allowUnlabeledBreak);\n case \"ClassDeclaration\":\n return false;\n case \"BlockStatement\":\n return node.body.some((statement) =>\n bodyHasExit(statement, exitingLabels, allowUnlabeledBreak)\n );\n case \"IfStatement\":\n return (\n bodyHasExit(node.consequent, exitingLabels, allowUnlabeledBreak) ||\n (node.alternate !== undefined &&\n bodyHasExit(node.alternate, exitingLabels, allowUnlabeledBreak))\n );\n case \"ForStatement\":\n case \"ForInStatement\":\n case \"ForOfStatement\":\n case \"WhileStatement\":\n case \"DoWhileStatement\":\n return bodyHasExit(node.body, exitingLabels, false);\n case \"TryStatement\":\n return (\n bodyHasExit(node.block, exitingLabels, allowUnlabeledBreak) ||\n (node.handler !== undefined &&\n bodyHasExit(node.handler.body, exitingLabels, allowUnlabeledBreak)) ||\n (node.finalizer !== undefined &&\n bodyHasExit(node.finalizer, exitingLabels, allowUnlabeledBreak))\n );\n case \"SwitchStatement\":\n return node.cases.some((switchCase) =>\n switchCase.consequent.some((statement) => bodyHasExit(statement, exitingLabels, false))\n );\n case \"ReturnStatement\":\n case \"ThrowStatement\":\n return true;\n case \"BreakStatement\":\n return node.label === undefined ? allowUnlabeledBreak : exitingLabels.has(node.label);\n case \"ExportNamedDeclaration\":\n return false;\n case \"ExportDefaultDeclaration\":\n case \"ExpressionStatement\":\n case \"ImportDeclaration\":\n case \"FunctionDeclaration\":\n case \"ContinueStatement\":\n case \"EmptyStatement\":\n case \"VariableDeclaration\":\n return false;\n }\n}\n", "import { visitClassElements } from \"../class-elements.js\";\nimport {\n parseModule,\n type ArrayExpression,\n type FunctionNode,\n type AssignmentExpression,\n type BinaryExpression,\n type BlockStatement,\n type CallExpression,\n type CatchClause,\n type ConditionalExpression,\n type DoWhileStatement,\n type Expression,\n type ForInStatement,\n type ForOfStatement,\n type ForStatement,\n type IfStatement,\n type LogicalExpression,\n type MemberExpression,\n type Module,\n type ObjectExpression,\n type Property,\n type SourceSpan,\n type Statement,\n type SwitchStatement,\n type TaggedTemplateExpression,\n type TemplateLiteral,\n type ThrowStatement,\n type TryStatement,\n type UnaryExpression,\n type VariableDeclaration,\n type VariableDeclarator,\n type WhileStatement\n} from \"../../parse/parser.js\";\n\nexport type Diagnostic = {\n code: \"AS-UNREACHABLE\";\n severity: \"warning\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n};\n\nexport function AS_UNREACHABLE(source: string, options: { filename?: string } = {}): Diagnostic[] {\n return new ASUnreachableScanner(options.filename ?? \"<input>\").scan(source);\n}\n\nclass ASUnreachableScanner {\n private readonly diagnostics: Diagnostic[] = [];\n private breakTargets = new Map<string, { reached: boolean }>();\n\n constructor(private readonly filename: string) {}\n\n scan(source: string): Diagnostic[] {\n this.visitModule(parseModule(source, this.filename));\n return this.diagnostics;\n }\n\n private visitModule(node: Module): void {\n this.visitStatements(node.body);\n }\n\n private visitStatements(statements: readonly Statement[]): boolean {\n let terminated = false;\n\n for (const statement of statements) {\n if (terminated) {\n if (isEmptyBlockStatement(statement)) {\n continue;\n }\n\n this.report(statement.span);\n return true;\n }\n\n terminated = this.visitStatement(statement);\n }\n\n return terminated;\n }\n\n private visitStatement(node: Statement): boolean {\n if (node.type === \"ClassDeclaration\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return false;\n }\n switch (node.type) {\n case \"WithStatement\":\n this.visitExpression(node.object);\n return this.visitStatement(node.body);\n case \"FunctionDeclaration\":\n this.visitArrowFunction(node);\n return false;\n case \"BlockStatement\":\n return this.visitBlock(node);\n case \"ExpressionStatement\":\n this.visitExpression(node.expression);\n return false;\n case \"IfStatement\":\n return this.visitIfStatement(node);\n case \"ForStatement\":\n this.visitForStatement(node);\n return false;\n case \"ForInStatement\":\n case \"ForOfStatement\":\n this.visitForOfStatement(node);\n return false;\n case \"WhileStatement\":\n case \"DoWhileStatement\":\n this.visitWhileStatement(node);\n return false;\n case \"TryStatement\":\n return this.visitTryStatement(node);\n case \"SwitchStatement\":\n this.visitSwitchStatement(node);\n return false;\n case \"VariableDeclaration\":\n this.visitVariableDeclaration(node);\n return false;\n case \"ReturnStatement\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return true;\n case \"ThrowStatement\":\n this.visitThrowStatement(node);\n return true;\n case \"BreakStatement\":\n if (node.label !== undefined) {\n const target = this.breakTargets.get(node.label);\n if (target !== undefined) target.reached = true;\n }\n return true;\n case \"ContinueStatement\":\n return true;\n case \"ExportNamedDeclaration\":\n this.visitVariableDeclaration(node.declaration);\n return false;\n case \"ExportDefaultDeclaration\":\n if (node.declaration.type === \"ClassDeclaration\" || node.declaration.type === \"FunctionDeclaration\") this.visitStatement(node.declaration);\n else this.visitExpression(node.declaration);\n return false;\n case \"ImportDeclaration\":\n case \"EmptyStatement\":\n return false;\n }\n }\n\n private visitBlock(node: BlockStatement): boolean {\n const target = { reached: false };\n for (const label of node.labels ?? []) this.breakTargets.set(label, target);\n const terminated = this.visitStatements(node.body);\n for (const label of node.labels ?? []) this.breakTargets.delete(label);\n return terminated && !target.reached;\n }\n\n private visitIfStatement(node: IfStatement): boolean {\n this.visitExpression(node.test);\n const consequentTerminates = this.visitStatement(node.consequent);\n const alternateTerminates =\n node.alternate === undefined ? false : this.visitStatement(node.alternate);\n\n return node.alternate !== undefined && consequentTerminates && alternateTerminates;\n }\n\n private visitForStatement(node: ForStatement): void {\n if (node.init !== undefined) {\n if (node.init.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.init);\n } else {\n this.visitExpression(node.init);\n }\n }\n\n if (node.test !== undefined) {\n this.visitExpression(node.test);\n }\n\n if (node.update !== undefined) {\n this.visitExpression(node.update);\n }\n\n this.visitStatement(node.body);\n }\n\n private visitForOfStatement(node: ForInStatement | ForOfStatement): void {\n if (node.left.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.left);\n }\n this.visitExpression(node.right);\n this.visitStatement(node.body);\n }\n\n private visitWhileStatement(node: WhileStatement | DoWhileStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.body);\n }\n\n private visitTryStatement(node: TryStatement): boolean {\n const tryTerminates = this.visitBlock(node.block);\n const catchTerminates =\n node.handler === undefined ? false : this.visitCatchClause(node.handler);\n const finallyTerminates =\n node.finalizer === undefined ? false : this.visitBlock(node.finalizer);\n\n if (finallyTerminates) {\n return true;\n }\n\n if (node.handler === undefined) {\n return tryTerminates;\n }\n\n return tryTerminates && catchTerminates;\n }\n\n private visitSwitchStatement(node: SwitchStatement): void {\n this.visitExpression(node.discriminant);\n for (const switchCase of node.cases) {\n if (switchCase.test !== undefined) {\n this.visitExpression(switchCase.test);\n }\n this.visitStatements(switchCase.consequent);\n }\n }\n\n private visitCatchClause(node: CatchClause): boolean {\n return this.visitBlock(node.body);\n }\n\n private visitVariableDeclaration(node: VariableDeclaration): void {\n for (const declarator of node.declarations) {\n this.visitVariableDeclarator(declarator);\n }\n }\n\n private visitVariableDeclarator(node: VariableDeclarator): void {\n if (node.init !== undefined) {\n this.visitExpression(node.init);\n }\n }\n\n private visitThrowStatement(node: ThrowStatement): void {\n this.visitExpression(node.argument);\n }\n\n private visitExpression(node: Expression): void {\n if (node.type === \"ClassExpression\") {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n return;\n }\n switch (node.type) {\n case \"YieldExpression\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"FunctionExpression\":\n case \"ArrowFunctionExpression\":\n this.visitArrowFunction(node);\n return;\n case \"ImportExpression\":\n this.visitExpression(node.source);\n if (node.options !== undefined) this.visitExpression(node.options);\n return;\n case \"AwaitExpression\":\n this.visitExpression(node.argument);\n return;\n case \"ArrayExpression\":\n this.visitArrayExpression(node);\n return;\n case \"ObjectExpression\":\n this.visitObjectExpression(node);\n return;\n case \"UnaryExpression\":\n this.visitUnaryExpression(node);\n return;\n case \"BinaryExpression\":\n case \"LogicalExpression\":\n this.visitBinaryLikeExpression(node);\n return;\n case \"ConditionalExpression\":\n this.visitConditionalExpression(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentExpression\":\n this.visitAssignmentExpression(node);\n return;\n case \"CallExpression\":\n this.visitCallExpression(node);\n return;\n case \"TaggedTemplateExpression\":\n this.visitTaggedTemplateExpression(node);\n return;\n case \"TemplateLiteral\":\n this.visitTemplateLiteral(node);\n return;\n case \"Identifier\":\n case \"BooleanLiteral\":\n case \"MetaProperty\":\n case \"NullLiteral\":\n case \"NumericLiteral\":\n case \"RegexLiteral\":\n case \"StringLiteral\":\n case \"UndefinedLiteral\":\n return;\n }\n }\n\n private visitArrowFunction(node: FunctionNode): void {\n const outerTargets = this.breakTargets;\n this.breakTargets = new Map();\n try {\n if (node.body.type === \"BlockStatement\") {\n this.visitBlock(node.body);\n return;\n }\n\n this.visitExpression(node.body);\n } finally {\n this.breakTargets = outerTargets;\n }\n }\n\n private visitArrayExpression(node: ArrayExpression): void {\n for (const element of node.elements) {\n if (element.type === \"SpreadElement\") {\n this.visitExpression(element.argument);\n continue;\n }\n\n this.visitExpression(element);\n }\n }\n\n private visitObjectExpression(node: ObjectExpression): void {\n for (const property of node.properties) {\n if (property.type === \"SpreadElement\") {\n this.visitExpression(property.argument);\n continue;\n }\n\n this.visitProperty(property);\n }\n }\n\n private visitProperty(node: Property): void {\n this.visitExpression(node.key);\n this.visitExpression(node.value);\n }\n\n private visitUnaryExpression(node: UnaryExpression): void {\n this.visitExpression(node.argument);\n }\n\n private visitBinaryLikeExpression(node: BinaryExpression | LogicalExpression): void {\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n }\n\n private visitConditionalExpression(node: ConditionalExpression): void {\n this.visitExpression(node.test);\n this.visitExpression(node.consequent);\n this.visitExpression(node.alternate);\n }\n\n private visitMemberExpression(node: MemberExpression): void {\n this.visitExpression(node.object);\n this.visitExpression(node.property);\n }\n\n private visitAssignmentExpression(node: AssignmentExpression): void {\n if (node.left.type === \"MemberExpression\") {\n this.visitMemberExpression(node.left);\n }\n this.visitExpression(node.right);\n }\n\n private visitCallExpression(node: CallExpression): void {\n this.visitExpression(node.callee);\n for (const argument of node.arguments) {\n if (argument.type === \"SpreadElement\") {\n this.visitExpression(argument.argument);\n continue;\n }\n\n this.visitExpression(argument);\n }\n }\n\n private visitTaggedTemplateExpression(node: TaggedTemplateExpression): void {\n this.visitExpression(node.tag);\n this.visitTemplateLiteral(node.quasi);\n }\n\n private visitTemplateLiteral(node: TemplateLiteral): void {\n for (const expression of node.expressions) {\n this.visitExpression(expression);\n }\n }\n\n private report(span: SourceSpan): void {\n this.diagnostics.push({\n code: \"AS-UNREACHABLE\",\n severity: \"warning\",\n message: \"Statement is unreachable because a prior statement in the same block always exits.\",\n filename: this.filename,\n line: span.start.line,\n column: span.start.column,\n span\n });\n }\n}\n\nfunction isEmptyBlockStatement(statement: Statement): boolean {\n return statement.type === \"BlockStatement\" && statement.body.length === 0;\n}\n", "import { visitClassElements } from \"../class-elements.js\";\nimport {\n type ClassNode,\n parseModule,\n type ArrayExpression,\n type ArrayPattern,\n type FunctionNode,\n type AssignmentExpression,\n type AssignmentPattern,\n type AssignmentProperty,\n type BlockStatement,\n type CallExpression,\n type CatchClause,\n type DoWhileStatement,\n type Expression,\n type ForInStatement,\n type ForOfStatement,\n type ForStatement,\n type Identifier,\n type IfStatement,\n type ImportDeclaration,\n type ImportDefaultSpecifier,\n type ImportNamespaceSpecifier,\n type ImportSpecifier,\n type MemberExpression,\n type Module,\n type ObjectExpression,\n type ObjectPattern,\n type Property,\n type RestElement,\n type SourceSpan,\n type SpreadElement,\n type Statement,\n type TemplateLiteral,\n type TryStatement,\n type VariableDeclaration,\n type VariableDeclarator,\n type WhileStatement\n} from \"../../parse/parser.js\";\n\nexport type Diagnostic = {\n code: \"AS-UNUSED-IMPORT\";\n severity: \"warning\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n fix: {\n range: readonly [number, number];\n replacement: string;\n };\n};\n\ntype BindingKind = \"const\" | \"import\" | \"let\" | \"param\" | \"var\";\ntype ImportSpecifierNode = ImportDefaultSpecifier | ImportNamespaceSpecifier | ImportSpecifier;\n\ntype ImportBinding = {\n declaration: ImportDeclaration;\n kind: \"import\";\n name: string;\n reads: number;\n specifier: ImportSpecifierNode;\n span: SourceSpan;\n};\n\ntype LocalBinding = {\n kind: Exclude<BindingKind, \"import\">;\n name: string;\n};\n\ntype Binding = ImportBinding | LocalBinding;\n\ntype Scope = Map<string, Binding>;\n\ntype UnusedImport = {\n declaration: ImportDeclaration;\n specifier: ImportSpecifierNode;\n};\n\ntype Replacement = {\n end: number;\n start: number;\n text: string;\n};\n\nexport function AS_UNUSED_IMPORT(\n source: string,\n options: { filename?: string } = {}\n): Diagnostic[] {\n const filename = options.filename ?? \"<input>\";\n const unusedImports = collectUnusedImports(source, filename);\n const unusedByDeclaration = groupUnusedSpecifiers(unusedImports);\n\n return unusedImports.map((unusedImport) =>\n createDiagnostic(\n filename,\n source,\n unusedImport,\n unusedByDeclaration.get(unusedImport.declaration) ?? new Set([unusedImport.specifier])\n )\n );\n}\n\nexport function fixASUnusedImports(source: string, options: { filename?: string } = {}): string {\n const unusedImports = collectUnusedImports(source, options.filename ?? \"<input>\");\n if (unusedImports.length === 0) {\n return source;\n }\n\n const unusedByDeclaration = groupUnusedSpecifiers(unusedImports);\n\n const replacements: Replacement[] = [];\n for (const [declaration, unusedSpecifiers] of unusedByDeclaration.entries()) {\n replacements.push(createUnusedImportReplacement(source, declaration, unusedSpecifiers));\n }\n\n return applyReplacements(source, replacements);\n}\n\nfunction groupUnusedSpecifiers(\n unusedImports: readonly UnusedImport[]\n): Map<ImportDeclaration, Set<ImportSpecifierNode>> {\n const unusedByDeclaration = new Map<ImportDeclaration, Set<ImportSpecifierNode>>();\n for (const unusedImport of unusedImports) {\n const specifiers = unusedByDeclaration.get(unusedImport.declaration) ?? new Set();\n specifiers.add(unusedImport.specifier);\n unusedByDeclaration.set(unusedImport.declaration, specifiers);\n }\n return unusedByDeclaration;\n}\n\nfunction collectUnusedImports(source: string, filename: string): UnusedImport[] {\n return new ASUnusedImportScanner(filename).scan(source);\n}\n\nclass ASUnusedImportScanner {\n private readonly imports: ImportBinding[] = [];\n private readonly scopes: Scope[] = [];\n\n constructor(private readonly filename: string) {}\n\n scan(source: string): UnusedImport[] {\n const module = parseModule(source, this.filename);\n this.visitModule(module);\n return this.imports\n .filter((binding) => binding.reads === 0)\n .map((binding) => ({\n declaration: binding.declaration,\n specifier: binding.specifier\n }));\n }\n\n private visitModule(node: Module): void {\n this.withScope(this.collectModuleBindings(node.body), () => {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n });\n }\n\n private visitStatement(node: Statement): void {\n if (node.type === \"ClassDeclaration\") {\n this.visitClass(node);\n return;\n }\n switch (node.type) {\n case \"FunctionDeclaration\":\n this.visitArrowFunction(node);\n return;\n case \"ExportNamedDeclaration\":\n this.visitVariableDeclaration(node.declaration);\n return;\n case \"ExportDefaultDeclaration\":\n if (node.declaration.type === \"ClassDeclaration\" || node.declaration.type === \"FunctionDeclaration\") this.visitStatement(node.declaration);\n else this.visitExpression(node.declaration);\n return;\n case \"BlockStatement\":\n this.visitBlock(node);\n return;\n case \"ExpressionStatement\":\n this.visitExpression(node.expression);\n return;\n case \"IfStatement\":\n this.visitIfStatement(node);\n return;\n case \"ForStatement\":\n this.visitForStatement(node);\n return;\n case \"ForInStatement\":\n case \"ForOfStatement\":\n this.visitForOfStatement(node);\n return;\n case \"WhileStatement\":\n case \"DoWhileStatement\":\n this.visitWhileStatement(node);\n return;\n case \"TryStatement\":\n this.visitTryStatement(node);\n return;\n case \"VariableDeclaration\":\n this.visitVariableDeclaration(node);\n return;\n case \"ReturnStatement\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"ThrowStatement\":\n this.visitExpression(node.argument);\n return;\n case \"ImportDeclaration\":\n case \"BreakStatement\":\n case \"ContinueStatement\":\n return;\n }\n }\n\n private visitBlock(node: BlockStatement): void {\n this.withScope(this.collectBlockBindings(node.body), () => {\n for (const statement of node.body) {\n this.visitStatement(statement);\n }\n });\n }\n\n private visitIfStatement(node: IfStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.consequent);\n if (node.alternate !== undefined) {\n this.visitStatement(node.alternate);\n }\n }\n\n private visitForStatement(node: ForStatement): void {\n const bindings =\n node.init?.type === \"VariableDeclaration\" ? this.collectDeclarationBindings(node.init) : [];\n\n this.withScope(bindings, () => {\n if (node.init !== undefined) {\n if (node.init.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.init);\n } else {\n this.visitExpression(node.init);\n }\n }\n if (node.test !== undefined) {\n this.visitExpression(node.test);\n }\n if (node.update !== undefined) {\n this.visitExpression(node.update);\n }\n this.visitStatement(node.body);\n });\n }\n\n private visitForOfStatement(node: ForInStatement | ForOfStatement): void {\n const bindings =\n node.left.type === \"VariableDeclaration\" ? this.collectDeclarationBindings(node.left) : [];\n\n this.withScope(bindings, () => {\n if (node.left.type === \"VariableDeclaration\") {\n this.visitVariableDeclaration(node.left);\n } else {\n this.visitAssignmentTarget(node.left);\n }\n this.visitExpression(node.right);\n this.visitStatement(node.body);\n });\n }\n\n private visitWhileStatement(node: WhileStatement | DoWhileStatement): void {\n this.visitExpression(node.test);\n this.visitStatement(node.body);\n }\n\n private visitTryStatement(node: TryStatement): void {\n this.visitBlock(node.block);\n if (node.handler !== undefined) {\n this.visitCatchClause(node.handler);\n }\n if (node.finalizer !== undefined) {\n this.visitBlock(node.finalizer);\n }\n }\n\n private visitCatchClause(node: CatchClause): void {\n this.withScope(this.collectCatchBindings(node), () => {\n if (node.param !== undefined) {\n this.visitBindingPattern(node.param);\n }\n this.visitBlock(node.body);\n });\n }\n\n private visitVariableDeclaration(node: VariableDeclaration): void {\n for (const declarator of node.declarations) {\n this.visitVariableDeclarator(declarator);\n }\n }\n\n private visitVariableDeclarator(node: VariableDeclarator): void {\n this.visitBindingPattern(node.id);\n if (node.init !== undefined) {\n this.visitExpression(node.init);\n }\n }\n\n private visitClass(node: ClassNode): void {\n this.withScope(node.id === undefined ? [] : [{ kind: \"const\", name: node.id.name }], () => {\n visitClassElements(node, expression => this.visitExpression(expression), statement => this.visitStatement(statement));\n });\n }\n\n private visitExpression(node: Expression): void {\n if (node.type === \"ClassExpression\") {\n this.visitClass(node);\n return;\n }\n switch (node.type) {\n case \"YieldExpression\":\n if (node.argument !== undefined) {\n this.visitExpression(node.argument);\n }\n return;\n case \"Identifier\":\n this.markRead(node);\n return;\n case \"FunctionExpression\":\n case \"ArrowFunctionExpression\":\n this.visitArrowFunction(node);\n return;\n case \"ImportExpression\":\n this.visitExpression(node.source);\n if (node.options !== undefined) this.visitExpression(node.options);\n return;\n case \"AwaitExpression\":\n this.visitExpression(node.argument);\n return;\n case \"ArrayExpression\":\n this.visitArrayExpression(node);\n return;\n case \"ObjectExpression\":\n this.visitObjectExpression(node);\n return;\n case \"UnaryExpression\":\n this.visitExpression(node.argument);\n return;\n case \"BinaryExpression\":\n case \"LogicalExpression\":\n this.visitExpression(node.left);\n this.visitExpression(node.right);\n return;\n case \"ConditionalExpression\":\n this.visitExpression(node.test);\n this.visitExpression(node.consequent);\n this.visitExpression(node.alternate);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"AssignmentExpression\":\n this.visitAssignmentExpression(node);\n return;\n case \"CallExpression\":\n this.visitCallExpression(node);\n return;\n case \"TemplateLiteral\":\n this.visitTemplateLiteral(node);\n return;\n case \"TaggedTemplateExpression\":\n this.visitExpression(node.tag);\n this.visitTemplateLiteral(node.quasi);\n return;\n case \"MetaProperty\":\n return;\n case \"BooleanLiteral\":\n case \"NullLiteral\":\n case \"NumericLiteral\":\n case \"RegexLiteral\":\n case \"StringLiteral\":\n case \"UndefinedLiteral\":\n return;\n }\n }\n\n private visitArrowFunction(node: FunctionNode): void {\n this.withScope(this.collectParameterBindings(node), () => {\n for (const parameter of node.params) {\n this.visitBindingElement(parameter);\n }\n\n if (node.body.type === \"BlockStatement\") {\n this.visitBlock(node.body);\n return;\n }\n\n this.visitExpression(node.body);\n });\n }\n\n private visitArrayExpression(node: ArrayExpression): void {\n for (const element of node.elements) {\n if (element?.type === \"SpreadElement\") {\n this.visitSpreadElement(element);\n continue;\n }\n if (element !== undefined) {\n this.visitExpression(element);\n }\n }\n }\n\n private visitObjectExpression(node: ObjectExpression): void {\n for (const property of node.properties) {\n if (property.type === \"SpreadElement\") {\n this.visitSpreadElement(property);\n continue;\n }\n this.visitProperty(property);\n }\n }\n\n private visitMemberExpression(node: MemberExpression): void {\n this.visitExpression(node.object);\n if (node.computed) {\n this.visitExpression(node.property);\n }\n }\n\n private visitAssignmentExpression(node: AssignmentExpression): void {\n this.visitAssignmentTarget(node.left);\n this.visitExpression(node.right);\n }\n\n private visitCallExpression(node: CallExpression): void {\n if (!node.optional && node.arguments.length > 0 &&\n node.callee.type === \"Identifier\" && node.callee.name === \"eval\") {\n // Dynamic source may reference any import that is visible at this call.\n for (const binding of this.imports) {\n if (this.resolveBinding(binding.name) === binding) binding.reads += 1;\n }\n }\n this.visitExpression(node.callee);\n for (const argument of node.arguments) {\n if (argument.type === \"SpreadElement\") {\n this.visitSpreadElement(argument);\n continue;\n }\n this.visitExpression(argument);\n }\n }\n\n private visitTemplateLiteral(node: TemplateLiteral): void {\n for (const expression of node.expressions) {\n this.visitExpression(expression);\n }\n }\n\n private visitProperty(node: Property): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitExpression(node.value);\n }\n\n private visitSpreadElement(node: SpreadElement): void {\n this.visitExpression(node.argument);\n }\n\n private visitBindingElement(\n node:\n | AssignmentPattern\n | ArrayPattern\n | Identifier\n | MemberExpression\n | ObjectPattern\n | RestElement\n ): void {\n switch (node.type) {\n case \"AssignmentPattern\":\n this.visitBindingPattern(node.left);\n this.visitExpression(node.right);\n return;\n case \"RestElement\":\n this.visitBindingPattern(node.argument);\n return;\n default:\n this.visitBindingPattern(node);\n return;\n }\n }\n\n private visitBindingPattern(\n node: ArrayPattern | Identifier | MemberExpression | ObjectPattern\n ): void {\n switch (node.type) {\n case \"Identifier\":\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"ArrayPattern\":\n for (const element of node.elements) {\n if (element !== null) {\n this.visitBindingElement(element);\n }\n }\n return;\n case \"ObjectPattern\":\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.visitBindingPattern(property.argument);\n continue;\n }\n this.visitAssignmentProperty(property);\n }\n return;\n }\n }\n\n private visitAssignmentProperty(node: AssignmentProperty): void {\n if (node.computed) {\n this.visitExpression(node.key);\n }\n this.visitBindingElement(node.value);\n }\n\n private visitAssignmentTarget(\n node: AssignmentExpression[\"left\"] | AssignmentPattern | RestElement\n ): void {\n switch (node.type) {\n case \"AssignmentPattern\":\n this.visitAssignmentTarget(node.left);\n this.visitExpression(node.right);\n return;\n case \"RestElement\":\n this.visitAssignmentTarget(node.argument);\n return;\n case \"Identifier\":\n this.markRead(node);\n return;\n case \"MemberExpression\":\n this.visitMemberExpression(node);\n return;\n case \"ArrayPattern\":\n for (const element of node.elements) {\n if (element !== null) {\n this.visitAssignmentTarget(element);\n }\n }\n return;\n case \"ObjectPattern\":\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.visitAssignmentTarget(property);\n continue;\n }\n if (property.computed) {\n this.visitExpression(property.key);\n }\n this.visitAssignmentTarget(property.value);\n }\n return;\n case \"MetaProperty\":\n return;\n }\n }\n\n private withScope(bindings: Binding[], visit: () => void): void {\n const scope: Scope = new Map();\n for (const binding of bindings) {\n scope.set(binding.name, binding);\n }\n\n this.scopes.push(scope);\n visit();\n this.scopes.pop();\n }\n\n private markRead(node: Identifier): void {\n const binding = this.resolveBinding(node.name);\n if (binding?.kind === \"import\") {\n binding.reads += 1;\n }\n }\n\n private resolveBinding(name: string): Binding | undefined {\n for (let index = this.scopes.length - 1; index >= 0; index -= 1) {\n const binding = this.scopes[index]?.get(name);\n if (binding !== undefined) {\n return binding;\n }\n }\n return undefined;\n }\n\n private collectModuleBindings(body: Statement[]): Binding[] {\n const bindings: Binding[] = [];\n\n for (const statement of body) {\n if (statement.type === \"ExportDefaultDeclaration\" && (statement.declaration.type === \"FunctionDeclaration\" || statement.declaration.type === \"ClassDeclaration\") && statement.declaration.id !== undefined) {\n bindings.push({ kind: \"let\", name: statement.declaration.id.name });\n continue;\n }\n if (statement.type === \"ImportDeclaration\") {\n bindings.push(...this.collectImportBindings(statement));\n continue;\n }\n if ((statement.type === \"FunctionDeclaration\" || statement.type === \"ClassDeclaration\") && statement.id !== undefined) {\n bindings.push({ kind: \"let\", name: statement.id.name });\n continue;\n }\n if (statement.type === \"VariableDeclaration\") {\n bindings.push(...this.collectDeclarationBindings(statement));\n continue;\n }\n if (statement.type === \"ExportNamedDeclaration\") {\n bindings.push(...this.collectDeclarationBindings(statement.declaration));\n }\n }\n\n return bindings;\n }\n\n private collectBlockBindings(body: Statement[]): Binding[] {\n const bindings: Binding[] = [];\n\n for (const statement of body) {\n if ((statement.type === \"FunctionDeclaration\" || statement.type === \"ClassDeclaration\") && statement.id !== undefined) {\n bindings.push({ kind: \"let\", name: statement.id.name });\n }\n if (statement.type === \"VariableDeclaration\") {\n bindings.push(...this.collectDeclarationBindings(statement));\n }\n }\n\n return bindings;\n }\n\n private collectParameterBindings(node: FunctionNode): Binding[] {\n const bindings: Binding[] = [];\n\n if (node.type !== \"ArrowFunctionExpression\") {\n bindings.push({ kind: \"param\", name: \"arguments\" });\n if (node.type === \"FunctionExpression\" && node.id !== undefined) {\n bindings.push({ kind: \"param\", name: node.id.name });\n }\n }\n\n for (const parameter of node.params) {\n this.collectBindingNamesFromElement(parameter, \"param\", bindings);\n }\n\n return bindings;\n }\n\n private collectDeclarationBindings(node: VariableDeclaration): Binding[] {\n const bindings: Binding[] = [];\n\n for (const declarator of node.declarations) {\n this.collectBindingNamesFromPattern(declarator.id, node.kind, bindings);\n }\n\n return bindings;\n }\n\n private collectCatchBindings(node: CatchClause): Binding[] {\n const bindings: Binding[] = [];\n\n if (node.param !== undefined) {\n this.collectBindingNamesFromPattern(node.param, \"param\", bindings);\n }\n\n return bindings;\n }\n\n private collectImportBindings(node: ImportDeclaration): ImportBinding[] {\n return node.specifiers.map((specifier) => {\n const binding: ImportBinding = {\n declaration: node,\n kind: \"import\",\n name: specifier.local.name,\n reads: 0,\n specifier,\n span: specifier.span\n };\n this.imports.push(binding);\n return binding;\n });\n }\n\n private collectBindingNamesFromElement(\n node:\n | AssignmentPattern\n | ArrayPattern\n | Identifier\n | MemberExpression\n | ObjectPattern\n | RestElement,\n kind: Exclude<BindingKind, \"import\">,\n bindings: Binding[]\n ): void {\n switch (node.type) {\n case \"AssignmentPattern\":\n this.collectBindingNamesFromPattern(node.left, kind, bindings);\n return;\n case \"RestElement\":\n this.collectBindingNamesFromPattern(node.argument, kind, bindings);\n return;\n default:\n this.collectBindingNamesFromPattern(node, kind, bindings);\n return;\n }\n }\n\n private collectBindingNamesFromPattern(\n node: ArrayPattern | Identifier | MemberExpression | ObjectPattern,\n kind: Exclude<BindingKind, \"import\">,\n bindings: Binding[]\n ): void {\n switch (node.type) {\n case \"Identifier\":\n bindings.push({\n kind,\n name: node.name\n });\n return;\n case \"MemberExpression\":\n return;\n case \"ArrayPattern\":\n for (const element of node.elements) {\n if (element !== null) {\n this.collectBindingNamesFromElement(element, kind, bindings);\n }\n }\n return;\n case \"ObjectPattern\":\n for (const property of node.properties) {\n if (property.type === \"RestElement\") {\n this.collectBindingNamesFromPattern(property.argument, kind, bindings);\n continue;\n }\n this.collectBindingNamesFromElement(property.value, kind, bindings);\n }\n return;\n }\n }\n}\n\nfunction createDiagnostic(\n filename: string,\n source: string,\n unusedImport: UnusedImport,\n unusedSpecifiers: ReadonlySet<ImportSpecifierNode>\n): Diagnostic {\n const { declaration, specifier } = unusedImport;\n const replacement = createUnusedImportReplacement(source, declaration, unusedSpecifiers);\n return {\n code: \"AS-UNUSED-IMPORT\",\n severity: \"warning\",\n message: `Import '${specifier.local.name}' is never referenced.`,\n filename,\n line: specifier.span.start.line,\n column: specifier.span.start.column,\n span: specifier.span,\n fix: {\n range: [replacement.start, replacement.end],\n replacement: replacement.text\n }\n };\n}\n\nfunction createUnusedImportReplacement(\n source: string,\n declaration: ImportDeclaration,\n unusedSpecifiers: ReadonlySet<ImportSpecifierNode>\n): Replacement {\n const keptSpecifiers = declaration.specifiers.filter(\n (specifier) => !unusedSpecifiers.has(specifier)\n );\n if (keptSpecifiers.length === 0) {\n return createImportLineDeletion(source, declaration);\n }\n\n return {\n start: declaration.specifiers[0]?.span.start.offset ?? declaration.span.start.offset,\n end: createSpecifierListReplacementEnd(source, declaration),\n text: keptSpecifiers\n .map((specifier) => source.slice(specifier.span.start.offset, specifier.span.end.offset))\n .join(\", \")\n };\n}\n\nfunction createImportLineDeletion(source: string, declaration: ImportDeclaration): Replacement {\n const lineStart = source.lastIndexOf(\"\\n\", declaration.span.start.offset - 1) + 1;\n let end = declaration.span.end.offset;\n\n while (source[end] === \" \" || source[end] === \"\\t\") {\n end += 1;\n }\n if (source[end] === \";\") {\n end += 1;\n }\n while (source[end] === \" \" || source[end] === \"\\t\") {\n end += 1;\n }\n if (source.slice(end, end + 2) === \"\\r\\n\") {\n end += 2;\n } else if (source[end] === \"\\n\") {\n end += 1;\n }\n\n return {\n start: lineStart,\n end,\n text:\n lineStart === 0 && end >= source.length && hasTrailingLineBreak(source)\n ? readTrailingLineBreak(source)\n : \"\"\n };\n}\n\nfunction hasTrailingLineBreak(source: string): boolean {\n return source.endsWith(\"\\n\") || source.endsWith(\"\\r\");\n}\n\nfunction readTrailingLineBreak(source: string): string {\n return source.endsWith(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n}\n\nfunction createSpecifierListReplacementEnd(source: string, declaration: ImportDeclaration): number {\n const lastSpecifier = declaration.specifiers[declaration.specifiers.length - 1];\n if (lastSpecifier === undefined) {\n return declaration.span.end.offset;\n }\n\n const end = skipInlineWhitespace(source, lastSpecifier.span.end.offset);\n if (source[end] !== \",\") {\n return lastSpecifier.span.end.offset;\n }\n\n return end + 1;\n}\n\nfunction skipInlineWhitespace(source: string, offset: number): number {\n let index = offset;\n while (\n source[index] === \" \" ||\n source[index] === \"\\t\" ||\n source[index] === \"\\r\" ||\n source[index] === \"\\n\"\n ) {\n index += 1;\n }\n return index;\n}\n\nfunction applyReplacements(source: string, replacements: readonly Replacement[]): string {\n return [...replacements]\n .sort((left, right) => right.start - left.start)\n .reduce((result, replacement) => {\n return `${result.slice(0, replacement.start)}${replacement.text}${result.slice(replacement.end)}`;\n }, source);\n}\n", "import { SandboxError } from \"../interp/budget.js\";\nimport { formatParseError } from \"../parse/format-error.js\";\nimport { AS001 } from \"./rules/AS001.js\";\nimport { AS003 } from \"./rules/AS003.js\";\nimport { AS004 } from \"./rules/AS004.js\";\nimport { AS005 } from \"./rules/AS005.js\";\nimport { AS006_007 } from \"./rules/AS006-007.js\";\nimport { AS009 } from \"./rules/AS009.js\";\nimport { AS010 } from \"./rules/AS010.js\";\nimport { AS013 } from \"./rules/AS013.js\";\nimport { AS015 } from \"./rules/AS015.js\";\nimport { AS_ASYNC_NOT_NEEDED } from \"./rules/AS-async-not-needed.js\";\nimport { AS_DESTRUCTURE_NULL_DEFAULT } from \"./rules/AS-destructure-null-default.js\";\nimport { AS_EXPORT_IMPORT_META } from \"./rules/AS-export-import-meta.js\";\nimport type { DefaultExportSignature } from \"./rules/AS-export-import-meta.js\";\nimport { AS_FLOATING_PROMISE } from \"./rules/AS-floating-promise.js\";\nimport { AS_FRONTMATTER_FIELD_UNUSED } from \"./rules/AS-frontmatter-field-unused.js\";\nimport { AS_IMPORT_CYCLE } from \"./rules/AS-import-cycle.js\";\nimport { AS_JSDOC_TYPE } from \"./rules/AS-jsdoc-type.js\";\nimport { AS_LARGE_LITERAL } from \"./rules/AS-large-literal.js\";\nimport { AS_MISSING_ASYNC } from \"./rules/AS-missing-async.js\";\nimport { AS_MUTATING_FROZEN } from \"./rules/AS-mutating-frozen.js\";\nimport { AS_NEEDLESS_TEMPLATE } from \"./rules/AS-needless-template.js\";\nimport { AS_SHADOW_GLOBAL } from \"./rules/AS-shadow-global.js\";\nimport { AS_UNBOUNDED_LOOP } from \"./rules/AS-unbounded-loop.js\";\nimport { AS_UNREACHABLE } from \"./rules/AS-unreachable.js\";\nimport { AS_UNUSED_IMPORT } from \"./rules/AS-unused-import.js\";\nimport { collectComments, tokenize, type Comment, type Position } from \"../parse/tokenizer.js\";\nimport { parseModule, type SourceSpan, type Statement } from \"../parse/parser.js\";\nimport type { Modules } from \"./rules/module-registry.js\";\n\nexport type Diagnostic = {\n code: string;\n severity: \"error\" | \"info\" | \"warning\";\n message: string;\n filename: string;\n line: number;\n column: number;\n span: SourceSpan;\n fix?: Fix;\n hint?: string;\n};\n\nexport type Fix = {\n range: readonly [number, number];\n replacement: string;\n};\n\nexport type LintOptions = {\n allowedExportNames?: readonly string[];\n allowedGlobals?: readonly string[];\n defaultExport?: DefaultExportSignature;\n fix?: boolean;\n fixRanges?: readonly Fix[\"range\"][];\n filename?: string;\n largeLiteralThreshold?: number;\n frontmatterFields?: readonly string[];\n modules?: Modules;\n};\n\nexport type LintFixResult = {\n diagnostics: Diagnostic[];\n fixed: string;\n fixes: Fix[];\n};\n\ntype LintRule = (source: string, options: LintOptions) => readonly Diagnostic[];\n\nconst RULES: readonly LintRule[] = [\n AS003,\n AS004,\n AS005,\n AS_SHADOW_GLOBAL,\n AS_UNUSED_IMPORT,\n AS006_007,\n AS_MISSING_ASYNC,\n AS009,\n AS010,\n AS013,\n AS015,\n AS_IMPORT_CYCLE,\n AS_FLOATING_PROMISE,\n AS_ASYNC_NOT_NEEDED,\n AS_JSDOC_TYPE,\n AS_NEEDLESS_TEMPLATE,\n AS_LARGE_LITERAL,\n AS_MUTATING_FROZEN,\n AS_FRONTMATTER_FIELD_UNUSED,\n AS_DESTRUCTURE_NULL_DEFAULT,\n AS_UNBOUNDED_LOOP,\n AS_UNREACHABLE,\n AS_EXPORT_IMPORT_META\n];\n\nconst KNOWN_DIAGNOSTIC_CODES = new Set([\n \"AS001\",\n \"AS002\",\n \"AS003\",\n \"AS004\",\n \"AS005\",\n \"AS006\",\n \"AS007\",\n \"AS008\",\n \"AS009\",\n \"AS010\",\n \"AS011\",\n \"AS012\",\n \"AS013\",\n \"AS014\",\n \"AS015\",\n \"AS-ASYNC-NOT-NEEDED\",\n \"AS-AWAIT-NON-PROMISE\",\n \"AS-EXPORT-DEFAULT-MISSING\",\n \"AS-DESTRUCTURE-NULL-DEFAULT\",\n \"AS-EXPORT-DEFAULT-MULTIPLE\",\n \"AS-EXPORT-DEFAULT-NOT-ARROW\",\n \"AS-EXPORT-DEFAULT-SIGNATURE\",\n \"AS-EXPORT-IMPORT-META\",\n \"AS-EXPORT-UNKNOWN\",\n \"AS-FLOATING-PROMISE\",\n \"AS-FRONTMATTER-FIELD-UNUSED\",\n \"AS-IMPORT-CYCLE\",\n \"AS-IMPORT-META-ASSIGN\",\n \"AS-JSDOC-TYPE\",\n \"AS-LARGE-LITERAL\",\n \"AS-MISSING-ASYNC\",\n \"AS-MUTATING-FROZEN\",\n \"AS-NEEDLESS-TEMPLATE\",\n \"AS-RETURN-AT-TOP\",\n \"AS-SHADOW-GLOBAL\",\n \"AS-UNBOUNDED-LOOP\",\n \"AS-UNKNOWN-DIRECTIVE\",\n \"AS-UNREACHABLE\",\n \"AS-UNUSED-IMPORT\"\n]);\n\ntype SuppressionState = {\n diagnostics: Diagnostic[];\n fileCodes: ReadonlySet<string>;\n lineCodes: ReadonlySet<string>;\n};\n\nexport function lint(source: string, options: LintOptions & { fix: true }): LintFixResult;\nexport function lint(source: string, options?: LintOptions): Diagnostic[];\nexport function lint(source: string, options: LintOptions = {}): Diagnostic[] | LintFixResult {\n const diagnostics = collectDiagnostics(source, options);\n\n if (!options.fix) {\n return diagnostics;\n }\n\n const { fixed, fixes } = applyNonOverlappingFixes(source, diagnostics, options.fixRanges);\n return {\n diagnostics:\n fixed === source ? diagnostics : collectDiagnostics(fixed, { ...options, fix: false }),\n fixed,\n fixes\n };\n}\n\nfunction collectDiagnostics(source: string, options: LintOptions): Diagnostic[] {\n const suppressions = buildSuppressionState(source, options);\n const as001Diagnostics = AS001(source, options);\n if (as001Diagnostics.length > 0 && !hasOnlyRegexLiteralDiagnostics(as001Diagnostics)) {\n return finalizeDiagnostics(as001Diagnostics, suppressions);\n }\n\n const diagnostics: Diagnostic[] = [...as001Diagnostics];\n for (const rule of RULES) {\n diagnostics.push(...rule(source, options));\n }\n\n const as010Keys = new Set(\n diagnostics\n .filter((diagnostic) => diagnostic.code === \"AS010\")\n .map((diagnostic) => createSpanKey(diagnostic.span))\n );\n\n return finalizeDiagnostics(\n diagnostics.filter(\n (diagnostic) => diagnostic.code !== \"AS007\" || !as010Keys.has(createSpanKey(diagnostic.span))\n ),\n suppressions\n );\n}\n\nfunction applyNonOverlappingFixes(\n source: string,\n diagnostics: readonly Diagnostic[],\n ranges?: readonly Fix[\"range\"][]\n): { fixed: string; fixes: Fix[] } {\n const fixes = diagnostics\n .flatMap((diagnostic) => (diagnostic.fix === undefined ? [] : [diagnostic.fix]))\n .filter(\n (fix) =>\n ranges === undefined ||\n ranges.some((range) => fix.range[0] >= range[0] && fix.range[1] <= range[1])\n )\n .sort(compareFixes);\n const selected: Fix[] = [];\n\n for (const fix of fixes) {\n if (selected.some((applied) => fixesOverlap(applied, fix))) {\n continue;\n }\n selected.push(fix);\n }\n\n selected.sort((left, right) => right.range[0] - left.range[0] || right.range[1] - left.range[1]);\n return {\n fixes: selected,\n fixed: selected.reduce(\n (result, fix) =>\n `${result.slice(0, fix.range[0])}${fix.replacement}${result.slice(fix.range[1])}`,\n source\n )\n };\n}\n\nfunction compareFixes(left: Fix, right: Fix): number {\n return left.range[0] - right.range[0] || left.range[1] - right.range[1];\n}\n\nfunction fixesOverlap(left: Fix, right: Fix): boolean {\n return left.range[0] < right.range[1] && right.range[0] < left.range[1];\n}\n\nfunction finalizeDiagnostics(\n diagnostics: readonly Diagnostic[],\n suppressions: SuppressionState\n): Diagnostic[] {\n return [\n ...diagnostics.filter((diagnostic) => !isSuppressed(diagnostic, suppressions)),\n ...suppressions.diagnostics\n ].sort(compareDiagnostics);\n}\n\nfunction isSuppressed(diagnostic: Diagnostic, suppressions: SuppressionState): boolean {\n return (\n suppressions.fileCodes.has(diagnostic.code) ||\n suppressions.lineCodes.has(createSuppressionKey(diagnostic.line, diagnostic.code))\n );\n}\n\nfunction buildSuppressionState(source: string, options: LintOptions): SuppressionState {\n let comments: Comment[];\n try {\n comments = collectComments(source);\n } catch (error) {\n if (error instanceof SandboxError) throw error;\n if (error instanceof Error) throw formatParseError(source, options.filename ?? \"<input>\", error);\n throw error;\n }\n const lineCodes = new Set<string>();\n const fileCodes = new Set<string>();\n const diagnostics: Diagnostic[] = [];\n const statementSpans = collectStatementSpans(source);\n const lineStarts = createLineStarts(source);\n const filename = options.filename ?? \"<input>\";\n\n for (const comment of comments) {\n const directive = parseDirective(comment);\n if (directive === undefined) {\n continue;\n }\n\n const codes = directive.codes.filter(({ code, startOffset, endOffset }) => {\n if (KNOWN_DIAGNOSTIC_CODES.has(code)) {\n return true;\n }\n\n diagnostics.push(\n createUnknownDirectiveDiagnostic(filename, source, lineStarts, code, startOffset, endOffset)\n );\n return false;\n });\n\n if (directive.kind === \"file\") {\n if (comment.type !== \"block\" || !isTopOfFileComment(source, comment)) {\n continue;\n }\n\n for (const { code } of codes) {\n fileCodes.add(code);\n }\n continue;\n }\n\n if (directive.kind === \"line\") {\n const span = findContainingStatementSpan(comment, statementSpans);\n if (span !== undefined) {\n for (const { code } of codes) {\n for (let line = span.start.line; line <= span.end.line; line += 1) {\n lineCodes.add(createSuppressionKey(line, code));\n }\n }\n continue;\n }\n\n for (const { code } of codes) {\n lineCodes.add(createSuppressionKey(comment.start.line, code));\n }\n continue;\n }\n\n const span =\n findNextStatementSpan(comment, statementSpans) ?? findNextTokenSpan(source, comment);\n if (span === undefined) {\n continue;\n }\n\n for (const { code } of codes) {\n for (let line = span.start.line; line <= span.end.line; line += 1) {\n lineCodes.add(createSuppressionKey(line, code));\n }\n }\n }\n\n return { diagnostics, fileCodes, lineCodes };\n}\n\nfunction compareDiagnostics(left: Diagnostic, right: Diagnostic): number {\n return (\n left.line - right.line || left.column - right.column || left.code.localeCompare(right.code)\n );\n}\n\ntype ParsedDirective = {\n kind: \"file\" | \"line\" | \"next\";\n codes: Array<{\n code: string;\n startOffset: number;\n endOffset: number;\n }>;\n};\n\ntype CommentWord = {\n value: string;\n startOffset: number;\n endOffset: number;\n};\n\nfunction parseDirective(comment: Comment): ParsedDirective | undefined {\n const words = splitCommentWords(comment);\n const markerIndex = words.findIndex((word) => isDirectiveMarker(word.value));\n if (markerIndex < 0) {\n return undefined;\n }\n\n const marker = words[markerIndex]!;\n const codes: ParsedDirective[\"codes\"] = [];\n for (const word of words.slice(markerIndex + 1)) {\n if (!isDirectiveCodeLike(word.value)) {\n break;\n }\n\n codes.push({\n code: word.value,\n startOffset: word.startOffset,\n endOffset: word.endOffset\n });\n }\n\n if (marker.value === \"@as-disable-file\") {\n if (comment.type !== \"block\") {\n return undefined;\n }\n return { kind: \"file\", codes };\n }\n\n if (comment.type !== \"line\") {\n return undefined;\n }\n\n if (marker.value === \"@as-disable-line\") {\n return { kind: \"line\", codes };\n }\n\n return { kind: \"next\", codes };\n}\n\nfunction splitCommentWords(comment: Comment): CommentWord[] {\n const words: CommentWord[] = [];\n const contentOffset = comment.start.offset + 2;\n let index = 0;\n\n while (index < comment.value.length) {\n while (index < comment.value.length && isWhitespace(comment.value[index]!)) {\n index += 1;\n }\n\n const start = index;\n while (index < comment.value.length && !isWhitespace(comment.value[index]!)) {\n index += 1;\n }\n\n if (start < index) {\n words.push({\n value: comment.value.slice(start, index),\n startOffset: contentOffset + start,\n endOffset: contentOffset + index\n });\n }\n }\n\n return words;\n}\n\nfunction isDirectiveMarker(value: string): boolean {\n return value === \"@as-disable\" || value === \"@as-disable-line\" || value === \"@as-disable-file\";\n}\n\nfunction isDirectiveCodeLike(value: string): boolean {\n if (value.length <= 2 || value.slice(0, 2).toUpperCase() !== \"AS\") {\n return false;\n }\n\n for (let index = 2; index < value.length; index += 1) {\n const char = value[index]!;\n if (!isAsciiLetter(char) && !isDecimalDigit(char) && char !== \"-\") {\n return false;\n }\n }\n\n return true;\n}\n\nfunction collectStatementSpans(source: string): SourceSpan[] {\n try {\n const module = parseModule(source);\n const spans: SourceSpan[] = [];\n for (const statement of module.body) {\n collectStatementSpan(statement, spans);\n }\n return spans.sort((left, right) => left.start.offset - right.start.offset);\n } catch {\n return [];\n }\n}\n\nfunction collectStatementSpan(statement: Statement, spans: SourceSpan[]): void {\n spans.push(statement.span);\n\n switch (statement.type) {\n case \"BlockStatement\":\n for (const child of statement.body) {\n collectStatementSpan(child, spans);\n }\n return;\n case \"DoWhileStatement\":\n case \"ForInStatement\":\n case \"ForOfStatement\":\n case \"ForStatement\":\n case \"WhileStatement\":\n collectStatementSpan(statement.body, spans);\n return;\n case \"IfStatement\": {\n collectStatementSpan(statement.consequent, spans);\n if (statement.alternate !== undefined) {\n collectStatementSpan(statement.alternate, spans);\n }\n return;\n }\n case \"TryStatement\": {\n collectStatementSpan(statement.block, spans);\n if (statement.handler !== undefined) {\n collectStatementSpan(statement.handler.body, spans);\n }\n if (statement.finalizer !== undefined) {\n collectStatementSpan(statement.finalizer, spans);\n }\n return;\n }\n }\n}\n\nfunction findNextStatementSpan(\n comment: Comment,\n statementSpans: readonly SourceSpan[]\n): SourceSpan | undefined {\n return statementSpans.find((span) => span.start.offset >= comment.end.offset);\n}\n\nfunction findContainingStatementSpan(\n comment: Comment,\n statementSpans: readonly SourceSpan[]\n): SourceSpan | undefined {\n return statementSpans\n .filter(\n (span) => span.start.offset <= comment.start.offset && comment.start.offset <= span.end.offset\n )\n .sort((left, right) => spanLength(left) - spanLength(right))[0];\n}\n\nfunction spanLength(span: SourceSpan): number {\n return span.end.offset - span.start.offset;\n}\n\nfunction findNextTokenSpan(source: string, comment: Comment): SourceSpan | undefined {\n try {\n const token = tokenize(source, { allowRegexLiterals: true }).find(\n (candidate) => candidate.type !== \"eof\" && candidate.start.offset >= comment.end.offset\n );\n if (token === undefined) {\n return undefined;\n }\n return { start: token.start, end: token.end };\n } catch {\n return undefined;\n }\n}\n\nfunction isTopOfFileComment(source: string, comment: Comment): boolean {\n for (let index = 0; index < comment.start.offset; index += 1) {\n if (!isWhitespace(source[index]!)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction createUnknownDirectiveDiagnostic(\n filename: string,\n source: string,\n lineStarts: readonly number[],\n code: string,\n startOffset: number,\n endOffset: number\n): Diagnostic {\n const start = positionAt(lineStarts, startOffset);\n const end = positionAt(lineStarts, endOffset);\n return {\n code: \"AS-UNKNOWN-DIRECTIVE\",\n severity: \"warning\",\n message: `Unknown lint disable rule code '${code}'.`,\n filename,\n line: start.line,\n column: start.column,\n span: { start, end }\n };\n}\n\nfunction createLineStarts(source: string): number[] {\n const starts = [0];\n for (let index = 0; index < source.length; index += 1) {\n const char = source[index]!;\n if (char === \"\\r\" || char === \"\\n\") {\n if (char === \"\\r\" && source[index + 1] === \"\\n\") index += 1;\n starts.push(index + 1);\n }\n }\n return starts;\n}\n\nfunction positionAt(lineStarts: readonly number[], offset: number): Position {\n let lineIndex = 0;\n for (let index = 0; index < lineStarts.length; index += 1) {\n if (lineStarts[index]! > offset) {\n break;\n }\n lineIndex = index;\n }\n\n const lineStart = lineStarts[lineIndex]!;\n return {\n line: lineIndex + 1,\n column: offset - lineStart + 1,\n offset\n };\n}\n\nfunction createSuppressionKey(line: number, code: string): string {\n return `${line}:${code}`;\n}\n\nfunction isWhitespace(value: string): boolean {\n return value === \" \" || value === \"\\t\" || value === \"\\n\" || value === \"\\r\";\n}\n\nfunction isAsciiLetter(value: string): boolean {\n return (value >= \"A\" && value <= \"Z\") || (value >= \"a\" && value <= \"z\");\n}\n\nfunction isDecimalDigit(value: string): boolean {\n return value >= \"0\" && value <= \"9\";\n}\n\nfunction createSpanKey(span: SourceSpan): string {\n return `${span.start.offset}:${span.end.offset}`;\n}\n\nfunction hasOnlyRegexLiteralDiagnostics(diagnostics: readonly Diagnostic[]): boolean {\n return diagnostics.every(\n (diagnostic) => diagnostic.message === \"Disallowed syntax: regex literal.\"\n );\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["MESSAGE", "isIdentifierPart", "isIdentifierStart", "isWhitespace", "bodyContainsAwait", "statementListContainsAwait", "expressionContainsAwait", "statementContainsAwait", "variableDeclarationContainsAwait", "assignmentTargetContainsAwait", "catchClauseContainsAwait", "bindingPatternContainsAwait", "objectExpressionContainsAwait", "bindingElementContainsAwait", "patternTargetContainsAwait", "assignmentPropertyContainsAwait", "MESSAGE", "createDiagnostic", "createDiagnostic", "span", "isWhitespace", "isAsciiLetter", "isDecimalDigit", "positionAt"]
7
+ }