@oddo/lang 0.0.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lexer.mjs","../src/parser.mjs","../src/ast-converter.mjs","../src/compiler.mjs","../src/highlighter.mjs","../src/index.mjs"],"sourcesContent":["/**\n * Oddo Language Lexer\n * Token definitions for Chevrotain\n */\n\nimport { createToken, Lexer } from 'chevrotain';\n\n// Tokens are defined in order of precedence (most specific first)\n\n// Identifiers (defined first for use in keyword definitions)\nexport const Identifier = createToken({\n name: 'Identifier',\n pattern: /[a-zA-Z_$][a-zA-Z0-9_$]*/,\n});\n\n// Keywords\nexport const Return = createToken({\n name: 'Return',\n pattern: /return\\b/,\n longer_alt: Identifier,\n});\n\nexport const True = createToken({\n name: 'True',\n pattern: /true\\b/,\n longer_alt: Identifier,\n});\n\nexport const False = createToken({\n name: 'False',\n pattern: /false\\b/,\n longer_alt: Identifier,\n});\n\nexport const Null = createToken({\n name: 'Null',\n pattern: /null\\b/,\n longer_alt: Identifier,\n});\n\nexport const Typeof = createToken({\n name: 'Typeof',\n pattern: /typeof\\b/,\n longer_alt: Identifier,\n});\n\nexport const Void = createToken({\n name: 'Void',\n pattern: /void\\b/,\n longer_alt: Identifier,\n});\n\nexport const Delete = createToken({\n name: 'Delete',\n pattern: /delete\\b/,\n longer_alt: Identifier,\n});\n\nexport const Instanceof = createToken({\n name: 'Instanceof',\n pattern: /instanceof\\b/,\n longer_alt: Identifier,\n});\n\nexport const In = createToken({\n name: 'In',\n pattern: /in\\b/,\n longer_alt: Identifier,\n});\n\nexport const Export = createToken({\n name: 'Export',\n pattern: /export\\b/,\n longer_alt: Identifier,\n});\n\nexport const Import = createToken({\n name: 'Import',\n pattern: /import\\b/,\n longer_alt: Identifier,\n});\n\nexport const From = createToken({\n name: 'From',\n pattern: /from\\b/,\n longer_alt: Identifier,\n});\n\nexport const Default = createToken({\n name: 'Default',\n pattern: /default\\b/,\n longer_alt: Identifier,\n});\n\nexport const As = createToken({\n name: 'As',\n pattern: /as\\b/,\n longer_alt: Identifier,\n});\n\n// Modifier\nexport const Modifier = createToken({\n name: 'Modifier',\n pattern: /@[a-zA-Z_$][a-zA-Z0-9_$]*/,\n});\n\n// Literals\nexport const NumberLiteral = createToken({\n name: 'NumberLiteral',\n pattern: /-?(0[xX][0-9a-fA-F]+|0[bB][01]+|0[oO][0-7]+|\\d+(\\.\\d+)?([eE][+-]?\\d+)?)/,\n});\n\nexport const StringLiteral = createToken({\n name: 'StringLiteral',\n pattern: /\"([^\"\\\\]|\\\\.)*\"/,\n});\n\n// Template literal token with custom pattern function to handle escapes correctly\n// Handles: `text`, `text ${expr} text`, `text \\` text`, `text \\${expr} text`, etc.\nexport const TemplateLiteral = createToken({\n name: 'TemplateLiteral',\n line_breaks: true, // Template literals can span multiple lines\n pattern: (text, offset) => {\n // Must start with backtick\n if (text[offset] !== '`') {\n return null;\n }\n\n let pos = offset + 1;\n let escaped = false;\n let braceDepth = 0; // Track depth of ${...} expressions\n\n while (pos < text.length) {\n const char = text[pos];\n\n if (escaped) {\n // After backslash, skip the escaped character\n escaped = false;\n pos++;\n continue;\n }\n\n if (char === '\\\\') {\n // Escape sequence\n escaped = true;\n pos++;\n continue;\n }\n\n if (char === '`' && braceDepth === 0) {\n // Found closing backtick (not escaped, and not inside ${...})\n return [text.substring(offset, pos + 1)];\n }\n\n if (char === '$' && pos + 1 < text.length && text[pos + 1] === '{') {\n // Found ${ - start of expression\n // Check if it's escaped: \\${ or $\\{\n if (pos > offset && text[pos - 1] === '\\\\') {\n // Escaped as \\${ - treat as literal text\n pos += 2;\n continue;\n }\n // Not escaped - enter expression\n braceDepth++;\n pos += 2;\n continue;\n }\n\n if (char === '{' && braceDepth > 0) {\n // Nested brace inside ${...}\n braceDepth++;\n pos++;\n continue;\n }\n\n if (char === '}' && braceDepth > 0) {\n // Closing brace for ${...} expression\n braceDepth--;\n pos++;\n continue;\n }\n\n pos++;\n }\n\n // Reached end of input without closing backtick\n return null;\n },\n});\n\n// Operators (in order of precedence/ambiguity)\nexport const PlusPlus = createToken({ name: 'PlusPlus', pattern: /\\+\\+/ });\nexport const MinusMinus = createToken({ name: 'MinusMinus', pattern: /--/ });\nexport const Plus = createToken({ name: 'Plus', pattern: /\\+/ });\nexport const Minus = createToken({ name: 'Minus', pattern: /-/ });\nexport const StarStar = createToken({ name: 'StarStar', pattern: /\\*\\*/ });\nexport const Star = createToken({ name: 'Star', pattern: /\\*/ });\n// Slash must come after JSXSelfClosing to avoid conflicts\nexport const Slash = createToken({ name: 'Slash', pattern: /\\// });\nexport const Percent = createToken({ name: 'Percent', pattern: /%/ });\nexport const LessThanEqual = createToken({ name: 'LessThanEqual', pattern: /<=/ });\nexport const GreaterThanEqual = createToken({ name: 'GreaterThanEqual', pattern: />=/ });\nexport const Pipe = createToken({ name: 'Pipe', pattern: /\\|>/ });\nexport const Compose = createToken({ name: 'Compose', pattern: /<\\|/ });\nexport const LessThan = createToken({ name: 'LessThan', pattern: /</ });\nexport const GreaterThan = createToken({ name: 'GreaterThan', pattern: />/ });\nexport const EqualEqual = createToken({ name: 'EqualEqual', pattern: /==/ });\nexport const BangEqual = createToken({ name: 'BangEqual', pattern: /!=/ });\nexport const AndAnd = createToken({ name: 'AndAnd', pattern: /&&/ });\nexport const OrOr = createToken({ name: 'OrOr', pattern: /\\|\\|/ });\nexport const QuestionDot = createToken({ name: 'QuestionDot', pattern: /\\?\\./ });\nexport const QuestionQuestion = createToken({ name: 'QuestionQuestion', pattern: /\\?\\?/ });\nexport const Question = createToken({ name: 'Question', pattern: /\\?/ });\nexport const ColonEqual = createToken({ name: 'ColonEqual', pattern: /:=/ });\nexport const Colon = createToken({ name: 'Colon', pattern: /:/ });\nexport const Bang = createToken({ name: 'Bang', pattern: /!/ });\nexport const Tilde = createToken({ name: 'Tilde', pattern: /~/ });\nexport const And = createToken({ name: 'And', pattern: /&/ });\nexport const Or = createToken({ name: 'Or', pattern: /\\|/ });\nexport const Caret = createToken({ name: 'Caret', pattern: /\\^/ });\nexport const LeftShift = createToken({ name: 'LeftShift', pattern: /<</ });\nexport const RightShift = createToken({ name: 'RightShift', pattern: />>/ });\nexport const UnsignedRightShift = createToken({ name: 'UnsignedRightShift', pattern: />>>/ });\n\n// Assignment operators (using := syntax)\nexport const PlusColonEqual = createToken({ name: 'PlusColonEqual', pattern: /\\+:=/ });\nexport const MinusColonEqual = createToken({ name: 'MinusColonEqual', pattern: /-:=/ });\nexport const StarStarColonEqual = createToken({ name: 'StarStarColonEqual', pattern: /\\*\\*:=/ });\nexport const StarColonEqual = createToken({ name: 'StarColonEqual', pattern: /\\*:=/ });\nexport const SlashColonEqual = createToken({ name: 'SlashColonEqual', pattern: /\\/:=/ });\nexport const PercentColonEqual = createToken({ name: 'PercentColonEqual', pattern: /%:=/ });\nexport const LeftShiftColonEqual = createToken({ name: 'LeftShiftColonEqual', pattern: /<<:=/ });\nexport const RightShiftColonEqual = createToken({ name: 'RightShiftColonEqual', pattern: />>:=/ });\nexport const UnsignedRightShiftColonEqual = createToken({ name: 'UnsignedRightShiftColonEqual', pattern: />>>:=/ });\nexport const AndColonEqual = createToken({ name: 'AndColonEqual', pattern: /&:=/ });\nexport const CaretColonEqual = createToken({ name: 'CaretColonEqual', pattern: /\\^:=/ });\nexport const OrColonEqual = createToken({ name: 'OrColonEqual', pattern: /\\|:=/ });\nexport const Equal = createToken({ name: 'Equal', pattern: /=/ });\n\n// Punctuation\nexport const LeftParen = createToken({ name: 'LeftParen', pattern: /\\(/ });\nexport const RightParen = createToken({ name: 'RightParen', pattern: /\\)/ });\nexport const LeftBracket = createToken({ name: 'LeftBracket', pattern: /\\[/ });\nexport const RightBracket = createToken({ name: 'RightBracket', pattern: /\\]/ });\nexport const LeftBrace = createToken({ name: 'LeftBrace', pattern: /\\{/ });\nexport const RightBrace = createToken({ name: 'RightBrace', pattern: /\\}/ });\nexport const Comma = createToken({ name: 'Comma', pattern: /,/ });\nexport const Dot = createToken({ name: 'Dot', pattern: /\\./ });\nexport const DotDotDot = createToken({ name: 'DotDotDot', pattern: /\\.\\.\\./ });\nexport const Semicolon = createToken({ name: 'Semicolon', pattern: /;/ });\n\n// JSX tokens (must come before LessThan/GreaterThan to avoid conflicts)\n// Note: JSX parsing will need special handling since < and > are ambiguous\nexport const JSXCloseTagStart = createToken({ name: 'JSXCloseTagStart', pattern: /<\\// });\nexport const JSXSelfClosing = createToken({ name: 'JSXSelfClosing', pattern: /\\/>/ });\n\n// Indentation tokens (must come before WhiteSpace)\nexport const Indent = createToken({\n name: 'Indent',\n pattern: /INDENT/,\n line_breaks: false,\n});\n\nexport const Dedent = createToken({\n name: 'Dedent',\n pattern: /DEDENT/,\n line_breaks: false,\n});\n\n// Whitespace and comments\nexport const WhiteSpace = createToken({\n name: 'WhiteSpace',\n pattern: /\\s+/,\n group: Lexer.SKIPPED,\n});\n\nexport const LineComment = createToken({\n name: 'LineComment',\n pattern: /\\/\\/.*/,\n group: Lexer.SKIPPED,\n});\n\nexport const MultiLineComment = createToken({\n name: 'MultiLineComment',\n pattern: /\\/\\*[\\s\\S]*?\\*\\//,\n group: Lexer.SKIPPED,\n});\n\n// All tokens in order\nexport const allTokens = [\n WhiteSpace,\n LineComment,\n MultiLineComment,\n // Keywords\n Return,\n True,\n False,\n Null,\n Typeof,\n Void,\n Delete,\n Instanceof,\n In,\n Export,\n Import,\n From,\n Default,\n As,\n // Modifier\n Modifier,\n // Literals\n NumberLiteral,\n StringLiteral,\n TemplateLiteral, // Must come before Identifier to match backtick before identifiers\n // Operators (order matters for ambiguity)\n PlusPlus,\n MinusMinus,\n // Assignment operators (must come before their base operators)\n StarStarColonEqual, // **:= must come before **\n LeftShiftColonEqual, // <<:= must come before <<\n RightShiftColonEqual, // >>:= must come before >>\n UnsignedRightShiftColonEqual, // >>>:= must come before >>>\n PlusColonEqual, // +:= must come before +\n MinusColonEqual, // -:= must come before -\n StarColonEqual, // *:= must come before *\n SlashColonEqual, // /:= must come before /\n PercentColonEqual, // %:= must come before %\n AndColonEqual, // &:= must come before &\n OrColonEqual, // |:= must come before |\n CaretColonEqual, // ^:= must come before ^\n EqualEqual,\n BangEqual,\n LessThanEqual,\n GreaterThanEqual,\n Pipe, // Must come before GreaterThan to match |> before >\n Compose, // Must come before LessThan to match <| before <\n LeftShift,\n UnsignedRightShift, // Must come before RightShift (>>> before >>)\n RightShift,\n StarStar,\n AndAnd,\n OrOr,\n Equal,\n Plus,\n Minus,\n Star,\n Percent,\n // JSX tokens must come before LessThan/GreaterThan/Slash to avoid conflicts\n JSXCloseTagStart, // </ must come before <\n JSXSelfClosing, // /> must come before /\n LessThan,\n GreaterThan,\n // Slash must come after JSXSelfClosing to avoid conflicts\n Slash,\n And,\n Or,\n Caret,\n Bang,\n Tilde,\n QuestionDot, // Must come before Question to match ?. before ?\n QuestionQuestion,\n Question,\n ColonEqual, // Must come before Colon to match := before :\n Colon,\n // Punctuation\n LeftParen,\n RightParen,\n LeftBracket,\n RightBracket,\n LeftBrace,\n RightBrace,\n Comma,\n DotDotDot, // Must come before Dot to match ... before .\n Dot,\n Semicolon,\n // Note: JSXOpenTag and JSXCloseTag use < and > tokens\n // Identifiers (must be last)\n Identifier,\n];\n\n// Create lexer\nexport const lexer = new Lexer(allTokens);\n","/**\n * Oddo Language Parser using Chevrotain\n * Implements the Oddo language specification\n */\n\nimport { CstParser } from 'chevrotain';\nimport {\n // Keywords\n Return,\n True,\n False,\n Null,\n Typeof,\n Void,\n Delete,\n Instanceof,\n In,\n Export,\n Import,\n From,\n Default,\n As,\n // Literals\n NumberLiteral,\n StringLiteral,\n TemplateLiteral,\n Identifier,\n Modifier,\n // Operators\n PlusPlus,\n MinusMinus,\n Plus,\n Minus,\n StarStar,\n Star,\n Slash,\n Percent,\n LessThanEqual,\n GreaterThanEqual,\n Pipe,\n Compose,\n LessThan,\n GreaterThan,\n EqualEqual,\n BangEqual,\n AndAnd,\n OrOr,\n QuestionDot,\n QuestionQuestion,\n Question,\n ColonEqual,\n Colon,\n Bang,\n Tilde,\n And,\n Or,\n Caret,\n LeftShift,\n RightShift,\n UnsignedRightShift,\n // Assignment\n PlusColonEqual,\n MinusColonEqual,\n StarStarColonEqual,\n StarColonEqual,\n SlashColonEqual,\n PercentColonEqual,\n LeftShiftColonEqual,\n RightShiftColonEqual,\n UnsignedRightShiftColonEqual,\n AndColonEqual,\n CaretColonEqual,\n OrColonEqual,\n Equal,\n // Punctuation\n LeftParen,\n RightParen,\n LeftBracket,\n RightBracket,\n LeftBrace,\n RightBrace,\n Comma,\n DotDotDot,\n Dot,\n Semicolon,\n // JSX\n JSXSelfClosing,\n JSXCloseTagStart,\n // Whitespace (for JSX text)\n WhiteSpace,\n} from './lexer.mjs';\n\n// Maximum number of tokens to look ahead when parsing arrow function parameters\n// This prevents infinite loops and excessive lookahead for malformed input\nconst MAX_TOKEN_LOOKAHEAD_COUNT = 30;\n\nclass OddoParser extends CstParser {\n constructor() {\n super([\n // Keywords\n Return,\n True,\n False,\n Null,\n Typeof,\n Void,\n Delete,\n Instanceof,\n In,\n Export,\n Import,\n From,\n Default,\n As,\n // Literals\n NumberLiteral,\n StringLiteral,\n Identifier,\n Modifier,\n // Operators\n PlusPlus,\n MinusMinus,\n Plus,\n Minus,\n StarStar,\n Star,\n Slash,\n Percent,\n LessThanEqual,\n GreaterThanEqual,\n LessThan,\n GreaterThan,\n EqualEqual,\n BangEqual,\n AndAnd,\n OrOr,\n QuestionQuestion,\n Question,\n ColonEqual, // Must come before Colon to match := before :\n Colon,\n Bang,\n Tilde,\n And,\n Or,\n Caret,\n LeftShift,\n RightShift,\n UnsignedRightShift,\n // Assignment\n PlusColonEqual,\n MinusColonEqual,\n StarStarColonEqual,\n StarColonEqual,\n SlashColonEqual,\n PercentColonEqual,\n LeftShiftColonEqual,\n RightShiftColonEqual,\n UnsignedRightShiftColonEqual,\n AndColonEqual,\n CaretColonEqual,\n OrColonEqual,\n Equal,\n // Punctuation\n LeftParen,\n RightParen,\n LeftBracket,\n RightBracket,\n LeftBrace,\n RightBrace,\n Comma,\n DotDotDot,\n Dot,\n // JSX\n JSXCloseTagStart,\n JSXSelfClosing,\n ]);\n\n // Define rules\n this.RULE('program', () => {\n let lastStatementStartLine = 0;\n this.MANY(() => {\n // Ensure statements are separated by newlines\n const currentToken = this.LA(1);\n if (currentToken && lastStatementStartLine > 0) {\n // Skip newline check for export/import statements (they're always at top level)\n const isExportOrImport = currentToken.tokenType === Export || currentToken.tokenType === Import;\n if (!isExportOrImport && currentToken.startLine <= lastStatementStartLine) {\n // Statements must be on separate lines\n // Throw an error that will be caught by the parser's error handling\n throw new Error(`Statements must be separated by newlines. Found statement starting at line ${currentToken.startLine}, column ${currentToken.startColumn} on the same line as previous statement (started at line ${lastStatementStartLine}).`);\n }\n }\n // Parse the statement\n this.SUBRULE(this.statement);\n // Update the last statement start line for the next iteration\n // Use the current token's line (which is where this statement started)\n if (currentToken) {\n lastStatementStartLine = currentToken.startLine;\n }\n });\n });\n\n this.RULE('statement', () => {\n this.OR([\n // Modifier on block: @modifier:\\n ...\n {\n GATE: () => {\n const la1 = this.LA(1);\n const la2 = this.LA(2);\n return la1 && la1.tokenType.name === 'Modifier' &&\n la2 && la2.tokenType === Colon;\n },\n ALT: () => {\n this.SUBRULE(this.modifierBlockStatement);\n },\n },\n { ALT: () => this.SUBRULE(this.exportStatement) },\n { ALT: () => this.SUBRULE(this.importStatement) },\n { ALT: () => this.SUBRULE(this.returnStatement) },\n { ALT: () => this.SUBRULE(this.expressionStatement) },\n ]);\n });\n\n this.RULE('modifierBlockStatement', () => {\n this.CONSUME(Modifier);\n this.CONSUME(Colon);\n this.SUBRULE(this.blockStatement);\n });\n\n // Export statement\n this.RULE('exportStatement', () => {\n this.CONSUME(Export);\n this.OR([\n {\n // export default expression\n GATE: () => {\n const la1 = this.LA(1);\n return la1 && la1.tokenType === Default;\n },\n ALT: () => {\n this.CONSUME(Default);\n this.SUBRULE(this.expression);\n },\n },\n {\n // export { x, y } or export { x as y }\n GATE: () => {\n const la1 = this.LA(1);\n return la1 && la1.tokenType === LeftBrace;\n },\n ALT: () => {\n this.CONSUME(LeftBrace);\n this.OPTION(() => {\n this.SUBRULE(this.exportSpecifierList);\n });\n this.CONSUME(RightBrace);\n },\n },\n {\n // export x = 1 (named export of assignment)\n ALT: () => {\n this.SUBRULE(this.expressionStatement);\n },\n },\n ]);\n });\n\n // Export specifier list: x, y, x as y\n this.RULE('exportSpecifierList', () => {\n this.SUBRULE(this.exportSpecifier);\n this.MANY(() => {\n this.CONSUME(Comma);\n this.SUBRULE1(this.exportSpecifier);\n });\n // Allow trailing comma\n this.OPTION(() => {\n this.CONSUME1(Comma);\n });\n });\n\n // Export specifier: identifier or identifier as identifier\n this.RULE('exportSpecifier', () => {\n this.CONSUME(Identifier);\n this.OPTION(() => {\n this.CONSUME(As);\n this.CONSUME1(Identifier);\n });\n });\n\n // Import statement\n this.RULE('importStatement', () => {\n this.CONSUME(Import);\n this.OR([\n {\n // import * as ns from \"module\"\n GATE: () => {\n const la1 = this.LA(1);\n return la1 && la1.tokenType === Star;\n },\n ALT: () => {\n this.CONSUME(Star);\n this.CONSUME(As);\n this.CONSUME(Identifier);\n this.CONSUME(From);\n this.CONSUME(StringLiteral);\n },\n },\n {\n // import defaultName from \"module\" or import defaultName, { x } from \"module\"\n ALT: () => {\n this.CONSUME1(Identifier);\n this.OPTION(() => {\n this.CONSUME(Comma);\n this.CONSUME(LeftBrace);\n this.OPTION1(() => {\n this.SUBRULE(this.importSpecifierList);\n });\n this.CONSUME(RightBrace);\n });\n this.CONSUME1(From);\n this.CONSUME1(StringLiteral);\n },\n },\n {\n // import { x, y } from \"module\"\n ALT: () => {\n this.CONSUME1(LeftBrace);\n this.OPTION2(() => {\n this.SUBRULE1(this.importSpecifierList);\n });\n this.CONSUME1(RightBrace);\n this.CONSUME2(From);\n this.CONSUME2(StringLiteral);\n },\n },\n ]);\n });\n\n // Import specifier list: x, y, x as y\n this.RULE('importSpecifierList', () => {\n this.SUBRULE(this.importSpecifier);\n this.MANY(() => {\n this.CONSUME(Comma);\n this.SUBRULE1(this.importSpecifier);\n });\n // Allow trailing comma\n this.OPTION(() => {\n this.CONSUME1(Comma);\n });\n });\n\n // Import specifier: identifier or identifier as identifier\n this.RULE('importSpecifier', () => {\n this.CONSUME(Identifier);\n this.OPTION(() => {\n this.CONSUME(As);\n this.CONSUME1(Identifier);\n });\n });\n\n this.RULE('returnStatement', () => {\n this.OPTION1(() => {\n this.CONSUME(Modifier);\n });\n this.CONSUME(Return);\n this.OPTION2(() => {\n this.SUBRULE(this.expression);\n });\n });\n\n this.RULE('expressionStatement', () => {\n this.OPTION1(() => {\n this.CONSUME(Modifier);\n });\n this.SUBRULE(this.expression);\n // Note: Colon + blockBody is NOT allowed here\n // Only modifiers can have colon + blockBody: @modifier:\\n ...\n // Arrow functions handle block bodies directly: x =>\\n ...\n });\n\n // Block body with indentation tracking\n // Requires INDENT token before statements, ends on DEDENT\n // Handles nested blocks by tracking indentation depth\n // Block statement with braces (like JavaScript)\n this.RULE('blockStatement', () => {\n this.CONSUME(LeftBrace);\n this.MANY(() => {\n this.SUBRULE(this.statement);\n });\n this.CONSUME(RightBrace);\n });\n\n // Expression hierarchy (following operator precedence)\n this.RULE('expression', () => {\n this.SUBRULE(this.assignment);\n });\n\n // Destructuring patterns for assignment (must be defined before assignment rule)\n this.RULE('destructuringPattern', () => {\n this.OR([\n {\n // Array pattern: [a, b, ...rest]\n GATE: () => {\n const la1 = this.LA(1);\n return la1 && la1.tokenType === LeftBracket;\n },\n ALT: () => {\n this.CONSUME(LeftBracket);\n this.OPTION1(() => {\n this.SUBRULE(this.arrayDestructuringList);\n });\n this.CONSUME(RightBracket);\n },\n },\n {\n // Object pattern: {a, b, ...rest}\n GATE: () => {\n const la1 = this.LA(1);\n return la1 && la1.tokenType === LeftBrace;\n },\n ALT: () => {\n this.CONSUME(LeftBrace);\n this.OPTION2(() => {\n this.SUBRULE(this.objectDestructuringList);\n });\n this.CONSUME(RightBrace);\n },\n },\n ]);\n });\n\n this.RULE('arrayDestructuringList', () => {\n this.OR([\n {\n // Rest element: ...rest\n GATE: () => {\n const la1 = this.LA(1);\n return la1 && la1.tokenType === DotDotDot;\n },\n ALT: () => {\n this.CONSUME(DotDotDot);\n this.CONSUME(Identifier);\n },\n },\n {\n // Regular element: identifier or nested pattern\n ALT: () => {\n this.OR1([\n { ALT: () => this.SUBRULE(this.destructuringPattern) },\n { ALT: () => this.CONSUME1(Identifier) },\n ]);\n },\n },\n ]);\n this.MANY(() => {\n this.CONSUME(Comma);\n this.OR2([\n {\n // Rest element: ...rest (must be last)\n GATE: () => {\n const la1 = this.LA(1);\n return la1 && la1.tokenType === DotDotDot;\n },\n ALT: () => {\n this.CONSUME1(DotDotDot);\n this.CONSUME2(Identifier);\n },\n },\n {\n // Regular element: identifier or nested pattern\n ALT: () => {\n this.OR3([\n { ALT: () => this.SUBRULE1(this.destructuringPattern) },\n { ALT: () => this.CONSUME3(Identifier) },\n ]);\n },\n },\n ]);\n });\n // Allow trailing comma\n this.OPTION(() => {\n this.CONSUME1(Comma);\n });\n });\n\n this.RULE('objectDestructuringList', () => {\n this.OR([\n {\n // Rest property: ...rest\n GATE: () => {\n const la1 = this.LA(1);\n return la1 && la1.tokenType === DotDotDot;\n },\n ALT: () => {\n this.CONSUME(DotDotDot);\n this.CONSUME(Identifier);\n },\n },\n {\n // Regular property: key or key: identifier, optionally with default value\n ALT: () => {\n this.OR1([\n { ALT: () => this.CONSUME1(Identifier) },\n { ALT: () => this.CONSUME(StringLiteral) },\n ]);\n this.OPTION(() => {\n this.CONSUME(Colon);\n this.OR2([\n { ALT: () => this.SUBRULE(this.destructuringPattern) },\n { ALT: () => this.CONSUME2(Identifier) },\n ]);\n });\n // Optional default value: = expression\n this.OPTION3(() => {\n this.CONSUME(Equal);\n this.SUBRULE(this.expression);\n });\n },\n },\n ]);\n this.MANY(() => {\n this.CONSUME(Comma);\n this.OR3([\n {\n // Rest property: ...rest (must be last)\n GATE: () => {\n const la1 = this.LA(1);\n return la1 && la1.tokenType === DotDotDot;\n },\n ALT: () => {\n this.CONSUME1(DotDotDot);\n this.CONSUME3(Identifier);\n },\n },\n {\n // Regular property: key or key: identifier, optionally with default value\n ALT: () => {\n this.OR4([\n { ALT: () => this.CONSUME4(Identifier) },\n { ALT: () => this.CONSUME1(StringLiteral) },\n ]);\n this.OPTION1(() => {\n this.CONSUME1(Colon);\n this.OR5([\n { ALT: () => this.SUBRULE1(this.destructuringPattern) },\n { ALT: () => this.CONSUME5(Identifier) },\n ]);\n });\n // Optional default value: = expression\n this.OPTION4(() => {\n this.CONSUME1(Equal);\n this.SUBRULE2(this.expression);\n });\n },\n },\n ]);\n });\n // Allow trailing comma\n this.OPTION2(() => {\n this.CONSUME2(Comma);\n });\n });\n\n // Assignment (right-associative, lowest precedence)\n // Supports destructuring patterns: [a, b] = arr, {a, b} = obj\n this.RULE('assignment', () => {\n this.OR([\n {\n // Destructuring assignment: [pattern] = or {pattern} = or [pattern] := or {pattern} :=\n // Only match if we have [ or { and can find an = or := token after a valid pattern\n GATE: () => {\n const la1 = this.LA(1);\n if (!la1) return false;\n // Only consider destructuring if we start with [ or {\n if (la1.tokenType !== LeftBracket && la1.tokenType !== LeftBrace) {\n return false;\n }\n // Look ahead to find a matching ] or } and check if = or := follows\n // Start depth at 1 since we've already seen the opening [ or {\n let depth = 1;\n let i = 2; // Start at 2 since LA(1) is the opening bracket\n while (i < MAX_TOKEN_LOOKAHEAD_COUNT) {\n const token = this.LA(i);\n if (!token) break;\n if (token.tokenType === LeftBracket || token.tokenType === LeftBrace) {\n depth++;\n } else if (token.tokenType.name === 'RightBracket' || token.tokenType.name === 'RightBrace') {\n depth--;\n if (depth === 0) {\n // Check if next token is = or :=\n const nextToken = this.LA(i + 1);\n return nextToken && (nextToken.tokenType === Equal || nextToken.tokenType === ColonEqual);\n }\n }\n i++;\n }\n return false;\n },\n ALT: () => {\n this.SUBRULE(this.destructuringPattern);\n this.OR2([\n { ALT: () => this.CONSUME1(Equal) },\n { ALT: () => this.CONSUME1(ColonEqual) },\n ]);\n this.SUBRULE(this.assignment); // Right-associative\n },\n },\n {\n // Regular assignment: expr = expr or expr := expr\n ALT: () => {\n this.SUBRULE(this.conditional);\n this.OPTION(() => {\n this.OR1([\n { ALT: () => this.CONSUME(Equal) },\n { ALT: () => this.CONSUME(ColonEqual) },\n { ALT: () => this.CONSUME(PlusColonEqual) },\n { ALT: () => this.CONSUME(MinusColonEqual) },\n { ALT: () => this.CONSUME(StarColonEqual) },\n { ALT: () => this.CONSUME(SlashColonEqual) },\n { ALT: () => this.CONSUME(PercentColonEqual) },\n { ALT: () => this.CONSUME(StarStarColonEqual) },\n { ALT: () => this.CONSUME(LeftShiftColonEqual) },\n { ALT: () => this.CONSUME(RightShiftColonEqual) },\n { ALT: () => this.CONSUME(UnsignedRightShiftColonEqual) },\n { ALT: () => this.CONSUME(AndColonEqual) },\n { ALT: () => this.CONSUME(CaretColonEqual) },\n { ALT: () => this.CONSUME(OrColonEqual) },\n ]);\n this.SUBRULE1(this.assignment); // Right-associative\n });\n },\n },\n ]);\n });\n\n // Conditional (right-associative)\n this.RULE('conditional', () => {\n this.SUBRULE(this.logicalOr);\n this.OPTION(() => {\n this.CONSUME(Question);\n this.SUBRULE(this.expression);\n this.CONSUME(Colon);\n this.SUBRULE(this.conditional); // Right-associative\n });\n });\n\n // Logical OR\n this.RULE('logicalOr', () => {\n this.SUBRULE(this.pipe);\n this.MANY(() => {\n this.CONSUME(OrOr);\n this.SUBRULE2(this.pipe);\n });\n });\n\n // Pipe operator |> (left-associative)\n this.RULE('pipe', () => {\n this.SUBRULE(this.compose);\n this.MANY(() => {\n this.CONSUME(Pipe);\n this.SUBRULE2(this.compose);\n });\n });\n\n // Compose operator <| (right-associative)\n this.RULE('compose', () => {\n this.SUBRULE(this.nullishCoalescing);\n this.OPTION(() => {\n this.CONSUME(Compose);\n this.SUBRULE(this.compose); // Right-associative\n });\n });\n\n // Nullish Coalescing (??)\n this.RULE('nullishCoalescing', () => {\n this.SUBRULE(this.logicalAnd);\n this.MANY(() => {\n this.CONSUME(QuestionQuestion);\n this.SUBRULE2(this.logicalAnd);\n });\n });\n\n // Logical AND\n this.RULE('logicalAnd', () => {\n this.SUBRULE(this.equality);\n this.MANY(() => {\n this.CONSUME(AndAnd);\n this.SUBRULE2(this.equality);\n });\n });\n\n // Equality\n this.RULE('equality', () => {\n this.SUBRULE(this.relational);\n this.MANY(() => {\n this.OR([\n { ALT: () => this.CONSUME(EqualEqual) },\n { ALT: () => this.CONSUME(BangEqual) },\n ]);\n this.SUBRULE2(this.relational);\n });\n });\n\n // Relational\n this.RULE('relational', () => {\n this.SUBRULE(this.additive);\n let lastTokenLine = this.LA(0) ? this.LA(0).endLine || this.LA(0).startLine : null;\n this.MANY(() => {\n const nextToken = this.LA(1);\n\n // For < and > operators specifically, check if on same line\n // This prevents JSX confusion: `<div>text</div>\\n<div>` should not be `< div`\n if (nextToken && (nextToken.tokenType === LessThan || nextToken.tokenType === GreaterThan)) {\n if (lastTokenLine && nextToken.startLine > lastTokenLine) {\n return; // Stop relational operators across lines for < and >\n }\n }\n\n this.OR([\n { ALT: () => this.CONSUME(LessThanEqual) },\n { ALT: () => this.CONSUME(GreaterThanEqual) },\n { ALT: () => this.CONSUME(LessThan) },\n { ALT: () => this.CONSUME(GreaterThan) },\n { ALT: () => this.CONSUME(Instanceof) },\n { ALT: () => this.CONSUME(In) },\n ]);\n this.SUBRULE2(this.additive);\n lastTokenLine = this.LA(0) ? this.LA(0).endLine || this.LA(0).startLine : lastTokenLine;\n });\n });\n\n // Additive\n this.RULE('additive', () => {\n this.SUBRULE(this.multiplicative);\n this.MANY(() => {\n this.OR([\n { ALT: () => this.CONSUME(Plus) },\n { ALT: () => this.CONSUME(Minus) },\n ]);\n this.SUBRULE2(this.multiplicative);\n });\n });\n\n // Multiplicative\n this.RULE('multiplicative', () => {\n this.SUBRULE(this.exponentiation);\n this.MANY(() => {\n this.OR([\n { ALT: () => this.CONSUME(Star) },\n { ALT: () => this.CONSUME(Slash) },\n { ALT: () => this.CONSUME(Percent) },\n ]);\n this.SUBRULE2(this.exponentiation);\n });\n });\n\n // Exponentiation (right-associative)\n this.RULE('exponentiation', () => {\n this.SUBRULE(this.unary);\n this.OPTION(() => {\n this.CONSUME(StarStar);\n this.SUBRULE(this.exponentiation); // Right-associative\n });\n });\n\n // Unary operators\n // Arrow functions are also parsed here (before postfix) to avoid ambiguity with parenthesized expressions\n this.RULE('unary', () => {\n this.OR([\n {\n ALT: () => {\n this.OR1([\n { ALT: () => this.CONSUME(Typeof) },\n { ALT: () => this.CONSUME(Void) },\n { ALT: () => this.CONSUME(Delete) },\n ]);\n this.SUBRULE1(this.unary);\n },\n },\n {\n ALT: () => {\n this.OR2([\n { ALT: () => this.CONSUME(Plus) },\n { ALT: () => this.CONSUME(Minus) },\n { ALT: () => this.CONSUME(Bang) },\n { ALT: () => this.CONSUME(Tilde) },\n ]);\n this.SUBRULE2(this.unary);\n },\n },\n {\n ALT: () => {\n this.OR3([\n { ALT: () => this.CONSUME(PlusPlus) },\n { ALT: () => this.CONSUME(MinusMinus) },\n ]);\n this.SUBRULE1(this.postfix);\n },\n },\n { ALT: () => this.SUBRULE2(this.postfix) },\n ]);\n });\n\n // Postfix operators\n this.RULE('postfix', () => {\n this.SUBRULE(this.functionCall);\n this.OPTION(() => {\n this.OR([\n { ALT: () => this.CONSUME(PlusPlus) },\n { ALT: () => this.CONSUME(MinusMinus) },\n ]);\n });\n });\n\n // Function calls (including tagged template literals)\n // Note: Function calls and member access have the same precedence and chain together\n // e.g., a.b().c.d() is parsed as ((a.b()).c).d()\n this.RULE('functionCall', () => {\n this.SUBRULE(this.memberAccess);\n let lastTokenLine = this.LA(0) ? this.LA(0).endLine || this.LA(0).startLine : null;\n this.MANY(() => {\n const nextToken = this.LA(1);\n\n // For function calls (not template literals or method chains), check if on same line\n // This prevents `expr\\n(args)` from being parsed as a function call\n // which would break arrow functions: `x => x\\n(y) => y` should be two statements\n if (nextToken && (nextToken.tokenType === LeftParen ||\n (nextToken.tokenType === QuestionDot && this.LA(2) && this.LA(2).tokenType === LeftParen))) {\n if (lastTokenLine && nextToken.startLine > lastTokenLine) {\n return; // Stop function calls across lines\n }\n }\n\n // Tagged template literal, optional function call, or regular function call\n this.OR([\n {\n // Template literals are allowed across lines (for tagged templates)\n GATE: () => {\n const la1 = this.LA(1);\n return la1 && la1.tokenType === TemplateLiteral;\n },\n ALT: () => {\n this.CONSUME(TemplateLiteral);\n lastTokenLine = this.LA(0) ? this.LA(0).endLine || this.LA(0).startLine : lastTokenLine;\n },\n },\n {\n // Optional function call: fn?.(...)\n // NOT allowed across lines (checked above)\n ALT: () => {\n this.CONSUME(QuestionDot);\n this.CONSUME(LeftParen);\n this.OPTION(() => {\n this.SUBRULE(this.argumentList);\n });\n this.CONSUME(RightParen);\n lastTokenLine = this.LA(0) ? this.LA(0).endLine || this.LA(0).startLine : lastTokenLine;\n },\n },\n {\n // Regular function call: fn(...)\n // NOT allowed across lines (checked above)\n ALT: () => {\n this.CONSUME1(LeftParen);\n this.OPTION8(() => {\n this.SUBRULE1(this.argumentList);\n });\n this.CONSUME1(RightParen);\n lastTokenLine = this.LA(0) ? this.LA(0).endLine || this.LA(0).startLine : lastTokenLine;\n },\n },\n ]);\n // After a function call, allow chaining more member access\n this.OPTION1(() => {\n this.MANY1(() => {\n const nextToken = this.LA(1);\n\n // For bracket access, check if on same line (same logic as memberAccess rule)\n if (nextToken && (nextToken.tokenType === LeftBracket ||\n (nextToken.tokenType === QuestionDot && this.LA(2) && this.LA(2).tokenType === LeftBracket))) {\n if (lastTokenLine && nextToken.startLine > lastTokenLine) {\n return; // Stop bracket access across lines\n }\n }\n\n this.OR1([\n {\n // Optional chaining property access: obj?.prop\n // Allowed across lines for method chaining\n ALT: () => {\n this.CONSUME1(QuestionDot);\n this.CONSUME1(Identifier);\n lastTokenLine = this.LA(0) ? this.LA(0).endLine || this.LA(0).startLine : lastTokenLine;\n },\n },\n {\n // Regular property access: obj.prop\n // Allowed across lines for method chaining\n ALT: () => {\n this.CONSUME(Dot);\n this.CONSUME2(Identifier);\n lastTokenLine = this.LA(0) ? this.LA(0).endLine || this.LA(0).startLine : lastTokenLine;\n },\n },\n {\n // Optional chaining bracket access: obj?.[expr]\n // NOT allowed across lines (checked above)\n ALT: () => {\n this.CONSUME2(QuestionDot);\n this.CONSUME(LeftBracket);\n const la1 = this.LA(1);\n\n // Pattern: [...] - copy entire array\n if (la1 && la1.tokenType === DotDotDot) {\n this.CONSUME(DotDotDot);\n this.CONSUME(RightBracket);\n } else {\n // Pattern: [start...end] - array slice\n this.OPTION2(() => {\n this.SUBRULE(this.expression);\n });\n this.OPTION3(() => {\n this.CONSUME(DotDotDot);\n this.OPTION4(() => {\n this.SUBRULE1(this.expression);\n });\n });\n this.CONSUME(RightBracket);\n }\n lastTokenLine = this.LA(0) ? this.LA(0).endLine || this.LA(0).startLine : lastTokenLine;\n },\n },\n {\n // Regular bracket access: obj[expr]\n // NOT allowed across lines (checked above)\n ALT: () => {\n this.CONSUME1(LeftBracket);\n const la1 = this.LA(1);\n\n // Pattern: [...] - copy entire array\n if (la1 && la1.tokenType === DotDotDot) {\n this.CONSUME1(DotDotDot);\n this.CONSUME1(RightBracket);\n } else {\n // Pattern: [start...end] - array slice\n this.OPTION5(() => {\n this.SUBRULE2(this.expression);\n });\n this.OPTION6(() => {\n this.CONSUME2(DotDotDot);\n this.OPTION7(() => {\n this.SUBRULE3(this.expression);\n });\n });\n this.CONSUME2(RightBracket);\n }\n lastTokenLine = this.LA(0) ? this.LA(0).endLine || this.LA(0).startLine : lastTokenLine;\n },\n },\n ]);\n });\n });\n });\n });\n\n this.RULE('argumentList', () => {\n this.OR([\n {\n // Spread argument: ...expr\n GATE: () => {\n const la1 = this.LA(1);\n return la1 && la1.tokenType === DotDotDot;\n },\n ALT: () => {\n this.CONSUME(DotDotDot);\n this.SUBRULE(this.expression);\n },\n },\n {\n // Regular argument: expr\n ALT: () => {\n this.SUBRULE1(this.expression);\n },\n },\n ]);\n this.MANY(() => {\n this.CONSUME(Comma);\n this.OR1([\n {\n // Spread argument: ...expr\n GATE: () => {\n const la1 = this.LA(1);\n return la1 && la1.tokenType === DotDotDot;\n },\n ALT: () => {\n this.CONSUME1(DotDotDot);\n this.SUBRULE2(this.expression);\n },\n },\n {\n // Regular argument: expr\n ALT: () => {\n this.SUBRULE3(this.expression);\n },\n },\n ]);\n });\n // Allow trailing comma\n this.OPTION(() => {\n this.CONSUME2(Comma);\n });\n });\n\n // Member access\n this.RULE('memberAccess', () => {\n this.SUBRULE(this.primary);\n let lastTokenLine = this.LA(0) ? this.LA(0).endLine || this.LA(0).startLine : null;\n this.MANY(() => {\n const nextToken = this.LA(1);\n\n // Stop if we see QuestionDot followed by LeftParen (that's a function call, not member access)\n if (nextToken && nextToken.tokenType === QuestionDot) {\n const tokenAfter = this.LA(2);\n if (tokenAfter && tokenAfter.tokenType === LeftParen) {\n return; // Let functionCall handle this\n }\n }\n\n // For bracket access (not dot access), check if on same line\n // This prevents [1,2]\\n[3,4] from being parsed as bracket access\n if (nextToken && (nextToken.tokenType === LeftBracket ||\n (nextToken.tokenType === QuestionDot && this.LA(2) && this.LA(2).tokenType === LeftBracket))) {\n if (lastTokenLine && nextToken.startLine > lastTokenLine) {\n return; // Stop bracket access across lines\n }\n }\n\n this.OR([\n {\n // Optional chaining property access: obj?.prop\n // But NOT obj?.( which is a function call\n // Allowed across lines for method chaining\n GATE: () => {\n const la1 = this.LA(1);\n const la2 = this.LA(2);\n return la1 && la1.tokenType === QuestionDot && la2 && la2.tokenType === Identifier;\n },\n ALT: () => {\n this.CONSUME(QuestionDot);\n this.CONSUME(Identifier);\n lastTokenLine = this.LA(0) ? this.LA(0).endLine || this.LA(0).startLine : lastTokenLine;\n },\n },\n {\n // Regular property access: obj.prop\n // Allowed across lines for method chaining\n ALT: () => {\n this.CONSUME(Dot);\n this.CONSUME1(Identifier);\n lastTokenLine = this.LA(0) ? this.LA(0).endLine || this.LA(0).startLine : lastTokenLine;\n },\n },\n {\n // Optional chaining bracket access: obj?.[expr]\n // NOT allowed across lines (checked above)\n GATE: () => {\n const la1 = this.LA(1);\n const la2 = this.LA(2);\n return la1 && la1.tokenType === QuestionDot && la2 && la2.tokenType === LeftBracket;\n },\n ALT: () => {\n this.CONSUME1(QuestionDot);\n this.CONSUME(LeftBracket);\n const la1 = this.LA(1);\n\n // Pattern: [...] - copy entire array\n if (la1 && la1.tokenType === DotDotDot) {\n const la2 = this.LA(2);\n if (la2 && la2.tokenType === RightBracket) {\n this.CONSUME(DotDotDot);\n this.CONSUME(RightBracket);\n } else {\n // This shouldn't happen, but handle it\n this.CONSUME(DotDotDot);\n this.CONSUME(RightBracket);\n }\n }\n // Pattern: [expression...] or [expression...expression] or [expression]\n else {\n this.SUBRULE(this.expression);\n const laAfterExpr = this.LA(1);\n\n // Pattern: [expression...expression] - slice with start and end\n if (laAfterExpr && laAfterExpr.tokenType === DotDotDot) {\n const laAfterDotDotDot = this.LA(2);\n // Check if there's an expression after the DotDotDot\n if (laAfterDotDotDot && laAfterDotDotDot.tokenType !== RightBracket) {\n this.CONSUME(DotDotDot);\n this.SUBRULE1(this.expression);\n this.CONSUME(RightBracket);\n }\n // Pattern: [expression...] - slice from start\n else {\n this.CONSUME(DotDotDot);\n this.CONSUME(RightBracket);\n }\n }\n // Pattern: [expression] - regular bracket access\n else {\n this.CONSUME(RightBracket);\n }\n }\n lastTokenLine = this.LA(0) ? this.LA(0).endLine || this.LA(0).startLine : lastTokenLine;\n },\n },\n {\n // Regular bracket access: obj[expr]\n // NOT allowed across lines (checked above)\n ALT: () => {\n this.CONSUME1(LeftBracket);\n const la1 = this.LA(1);\n\n // Pattern: [...] - copy entire array\n if (la1 && la1.tokenType === DotDotDot) {\n const la2 = this.LA(2);\n if (la2 && la2.tokenType === RightBracket) {\n this.CONSUME1(DotDotDot);\n this.CONSUME1(RightBracket);\n } else {\n // This shouldn't happen, but handle it\n this.CONSUME2(DotDotDot);\n this.CONSUME2(RightBracket);\n }\n }\n // Pattern: [expression...] or [expression...expression] or [expression]\n else {\n this.SUBRULE1(this.expression);\n const laAfterExpr = this.LA(1);\n\n // Pattern: [expression...expression] - slice with start and end\n if (laAfterExpr && laAfterExpr.tokenType === DotDotDot) {\n const laAfterDotDotDot = this.LA(2);\n // Check if there's an expression after the DotDotDot\n if (laAfterDotDotDot && laAfterDotDotDot.tokenType !== RightBracket) {\n this.CONSUME3(DotDotDot);\n this.SUBRULE2(this.expression);\n this.CONSUME3(RightBracket);\n }\n // Pattern: [expression...] - slice from start\n else {\n this.CONSUME4(DotDotDot);\n this.CONSUME4(RightBracket);\n }\n }\n // Pattern: [expression] - regular bracket access\n else {\n this.CONSUME5(RightBracket);\n }\n }\n lastTokenLine = this.LA(0) ? this.LA(0).endLine || this.LA(0).startLine : lastTokenLine;\n },\n },\n ]);\n });\n });\n\n // Primary expressions\n // Note: Arrow functions with single param (x =>) are unambiguous\n // For multi-param arrow functions ((x, y) =>), we parse them separately\n this.RULE('primary', () => {\n this.OR([\n { ALT: () => this.SUBRULE(this.literal) },\n { ALT: () => this.SUBRULE(this.arrayLiteral) },\n { ALT: () => this.SUBRULE(this.objectLiteral) },\n {\n // JSX Fragment: <> ... </>\n GATE: () => {\n const la1 = this.LA(1);\n const la2 = this.LA(2);\n // Must start with < followed by > (fragment opening)\n return la1 && la1.tokenType === LessThan &&\n la2 && la2.tokenType === GreaterThan;\n },\n ALT: () => this.SUBRULE(this.jsxFragment)\n },\n {\n // JSX Element: <TagName ...> or <TagName />\n GATE: () => {\n const la1 = this.LA(1);\n const la2 = this.LA(2);\n // Must start with < followed by an identifier (tag name)\n return la1 && la1.tokenType === LessThan &&\n la2 && la2.tokenType === Identifier;\n },\n ALT: () => this.SUBRULE(this.jsxElement)\n },\n // Single-param arrow function (unambiguous: x =>)\n {\n GATE: () => {\n const la1 = this.LA(1);\n const la2 = this.LA(2);\n const la3 = this.LA(3);\n return la1 && la1.tokenType === Identifier &&\n la2 && la2.tokenType === Equal &&\n la3 && la3.tokenType === GreaterThan;\n },\n ALT: () => this.SUBRULE(this.arrowFunction),\n },\n // Parenthesized expression or multi-param arrow function\n { ALT: () => this.SUBRULE(this.parenthesizedExpression) },\n { ALT: () => this.SUBRULE(this.identifier) },\n ]);\n });\n\n // Literals\n this.RULE('literal', () => {\n this.OR([\n { ALT: () => this.CONSUME(NumberLiteral) },\n { ALT: () => this.CONSUME(StringLiteral) },\n { ALT: () => this.SUBRULE(this.templateLiteral) },\n { ALT: () => this.CONSUME(True) },\n { ALT: () => this.CONSUME(False) },\n { ALT: () => this.CONSUME(Null) },\n ]);\n });\n\n // Template literal\n this.RULE('templateLiteral', () => {\n this.CONSUME(TemplateLiteral);\n });\n\n // Array literal\n this.RULE('arrayLiteral', () => {\n this.CONSUME(LeftBracket);\n this.OPTION(() => {\n this.SUBRULE(this.arrayElementList);\n });\n this.CONSUME(RightBracket);\n });\n\n this.RULE('arrayElementList', () => {\n this.OR([\n {\n // Spread element: ...expr\n GATE: () => {\n const la1 = this.LA(1);\n return la1 && la1.tokenType === DotDotDot;\n },\n ALT: () => {\n this.CONSUME(DotDotDot);\n this.SUBRULE(this.expression);\n },\n },\n {\n // Regular element: expr\n ALT: () => {\n this.SUBRULE1(this.expression);\n },\n },\n ]);\n this.MANY(() => {\n this.CONSUME(Comma);\n this.OR1([\n {\n // Spread element: ...expr\n GATE: () => {\n const la1 = this.LA(1);\n return la1 && la1.tokenType === DotDotDot;\n },\n ALT: () => {\n this.CONSUME1(DotDotDot);\n this.SUBRULE2(this.expression);\n },\n },\n {\n // Regular element: expr\n ALT: () => {\n this.SUBRULE3(this.expression);\n },\n },\n ]);\n });\n // Allow trailing comma\n this.OPTION(() => {\n this.CONSUME1(Comma);\n });\n });\n\n // Object literal\n this.RULE('objectLiteral', () => {\n this.CONSUME(LeftBrace);\n this.OPTION(() => {\n this.SUBRULE(this.objectPropertyList);\n });\n this.CONSUME(RightBrace);\n });\n\n this.RULE('objectPropertyList', () => {\n this.SUBRULE(this.objectProperty);\n this.MANY(() => {\n this.CONSUME(Comma);\n this.SUBRULE2(this.objectProperty);\n });\n // Allow trailing comma\n this.OPTION(() => {\n this.CONSUME1(Comma);\n });\n });\n\n this.RULE('objectProperty', () => {\n this.OR([\n {\n // Spread property: ...expr\n GATE: () => {\n const la1 = this.LA(1);\n return la1 && la1.tokenType === DotDotDot;\n },\n ALT: () => {\n this.CONSUME(DotDotDot);\n this.SUBRULE(this.expression);\n },\n },\n {\n // Computed key: [expr]: value\n GATE: () => {\n const la1 = this.LA(1);\n return la1 && la1.tokenType === LeftBracket;\n },\n ALT: () => {\n this.CONSUME(LeftBracket);\n this.SUBRULE1(this.expression); // Key expression\n this.CONSUME(RightBracket);\n this.CONSUME(Colon);\n this.SUBRULE2(this.expression); // Value expression\n },\n },\n {\n ALT: () => {\n // Key-value: key: value\n this.OR1([\n { ALT: () => this.CONSUME1(Identifier) },\n { ALT: () => this.CONSUME(StringLiteral) },\n ]);\n this.CONSUME1(Colon);\n this.SUBRULE3(this.expression); // Value expression\n },\n },\n {\n ALT: () => {\n // Shorthand: key\n this.CONSUME2(Identifier);\n },\n },\n ]);\n });\n\n // Arrow function\n // Only single-param arrow functions (x =>) are parsed here to avoid ambiguity\n // Multi-param arrow functions ((x, y) =>) are handled via parenthesizedExpression + optional =>\n this.RULE('arrowFunction', () => {\n // Single parameter without parens: x => expr or x => { ... }\n this.CONSUME(Identifier);\n this.CONSUME(Equal);\n this.CONSUME(GreaterThan);\n this.OR([\n {\n // Block body: x => { ... }\n GATE: () => {\n const la1 = this.LA(1);\n return la1 && la1.tokenType === LeftBrace;\n },\n ALT: () => {\n this.SUBRULE(this.blockStatement);\n },\n },\n {\n // Expression body: x => expr\n ALT: () => {\n this.SUBRULE(this.expression);\n },\n },\n ]);\n });\n\n this.RULE('parameterList', () => {\n this.OR([\n {\n // Rest parameter: ...rest\n GATE: () => {\n const la1 = this.LA(1);\n return la1 && la1.tokenType === DotDotDot;\n },\n ALT: () => {\n this.CONSUME(DotDotDot);\n this.CONSUME(Identifier);\n },\n },\n {\n // Destructuring pattern: [a, b] or {a, b} or [a, b] = default or {a, b} = default\n GATE: () => {\n const la1 = this.LA(1);\n return la1 && (la1.tokenType === LeftBracket || la1.tokenType === LeftBrace);\n },\n ALT: () => {\n this.SUBRULE(this.destructuringPattern);\n this.OPTION(() => {\n this.CONSUME(Equal);\n this.SUBRULE(this.expression);\n });\n },\n },\n {\n // Regular parameter: identifier or identifier = expression\n ALT: () => {\n this.CONSUME1(Identifier);\n this.OPTION1(() => {\n this.CONSUME1(Equal);\n this.SUBRULE1(this.expression);\n });\n },\n },\n ]);\n this.MANY(() => {\n this.CONSUME(Comma);\n this.OR1([\n {\n // Rest parameter: ...rest (must be last)\n GATE: () => {\n const la1 = this.LA(1);\n return la1 && la1.tokenType === DotDotDot;\n },\n ALT: () => {\n this.CONSUME1(DotDotDot);\n this.CONSUME2(Identifier);\n },\n },\n {\n // Destructuring pattern: [a, b] or {a, b} or [a, b] = default or {a, b} = default\n GATE: () => {\n const la1 = this.LA(1);\n return la1 && (la1.tokenType === LeftBracket || la1.tokenType === LeftBrace);\n },\n ALT: () => {\n this.SUBRULE1(this.destructuringPattern);\n this.OPTION2(() => {\n this.CONSUME2(Equal);\n this.SUBRULE2(this.expression);\n });\n },\n },\n {\n // Regular parameter: identifier or identifier = expression\n ALT: () => {\n this.CONSUME3(Identifier);\n this.OPTION3(() => {\n this.CONSUME3(Equal);\n this.SUBRULE3(this.expression);\n });\n },\n },\n ]);\n });\n // Allow trailing comma\n this.OPTION4(() => {\n this.CONSUME1(Comma);\n });\n });\n\n // JSX Element\n // Note: JSX parsing is complex because < and > are ambiguous\n // For now, we'll use LessThan and GreaterThan tokens\n this.RULE('jsxElement', () => {\n this.CONSUME(LessThan);\n this.SUBRULE1(this.jsxElementName);\n this.MANY1(() => {\n this.SUBRULE(this.jsxAttribute);\n });\n this.OR([\n {\n ALT: () => {\n // Self-closing: />\n this.CONSUME(JSXSelfClosing);\n },\n },\n {\n ALT: () => {\n // Opening tag with children: >\n this.CONSUME1(GreaterThan);\n this.MANY2(() => {\n this.SUBRULE(this.jsxChild);\n });\n this.CONSUME(JSXCloseTagStart);\n this.SUBRULE2(this.jsxElementName);\n this.CONSUME2(GreaterThan);\n },\n },\n ]);\n });\n\n // JSX Fragment: <> ... </>\n this.RULE('jsxFragment', () => {\n this.CONSUME(LessThan);\n this.CONSUME(GreaterThan);\n this.MANY(() => {\n this.SUBRULE(this.jsxChild);\n });\n this.CONSUME(JSXCloseTagStart);\n this.CONSUME1(GreaterThan);\n });\n\n this.RULE('jsxElementName', () => {\n this.CONSUME(Identifier);\n this.MANY(() => {\n this.OR([\n {\n ALT: () => {\n this.CONSUME(Dot);\n this.CONSUME1(Identifier);\n },\n },\n {\n ALT: () => {\n this.CONSUME(Minus);\n this.CONSUME2(Identifier);\n },\n },\n ]);\n });\n });\n\n this.RULE('jsxAttribute', () => {\n this.OR([\n {\n ALT: () => {\n // Spread: {...expr}\n this.CONSUME(LeftBrace);\n this.CONSUME(DotDotDot);\n this.SUBRULE(this.expression);\n this.CONSUME(RightBrace);\n },\n },\n {\n ALT: () => {\n // Regular: key=\"value\" or key={expr} or key\n // Attribute names can contain hyphens: data-value, aria-label, etc.\n this.CONSUME(Identifier);\n this.MANY(() => {\n this.CONSUME(Minus);\n this.CONSUME1(Identifier);\n });\n this.OPTION(() => {\n this.CONSUME(Equal);\n this.SUBRULE(this.jsxAttributeValue);\n });\n },\n },\n ]);\n });\n\n this.RULE('jsxAttributeValue', () => {\n this.OR([\n { ALT: () => this.CONSUME(StringLiteral) },\n {\n ALT: () => {\n this.CONSUME(LeftBrace);\n this.SUBRULE(this.expression);\n this.CONSUME(RightBrace);\n },\n },\n ]);\n });\n\n this.RULE('jsxChild', () => {\n this.OR([\n {\n // JSX Fragment: <>...</>\n GATE: () => {\n const la1 = this.LA(1);\n const la2 = this.LA(2);\n // Fragment starts with < followed by >\n return la1 && la1.tokenType === LessThan &&\n la2 && la2.tokenType === GreaterThan;\n },\n ALT: () => this.SUBRULE(this.jsxFragment),\n },\n {\n // JSX element: <tag> or </tag>\n GATE: () => {\n const la1 = this.LA(1);\n const la2 = this.LA(2);\n // Element starts with < followed by identifier\n return la1 && la1.tokenType === LessThan &&\n la2 && la2.tokenType === Identifier;\n },\n ALT: () => this.SUBRULE(this.jsxElement),\n },\n {\n // JSX expression: {expr} or {} (empty expression for comments)\n GATE: () => {\n const la1 = this.LA(1);\n return la1 && la1.tokenType === LeftBrace;\n },\n ALT: () => {\n this.CONSUME(LeftBrace);\n // Check if next token is RightBrace (empty expression/comment)\n const la1 = this.LA(1);\n if (la1 && la1.tokenType === RightBrace) {\n // Empty expression {} - used for JSX comments {/* ... */}\n this.CONSUME(RightBrace);\n } else {\n // Regular expression\n this.SUBRULE(this.expression);\n this.CONSUME(RightBrace);\n }\n },\n },\n {\n // JSX text: consume ANY tokens until we hit < or { or </\n ALT: () => {\n // Consume one or more tokens as JSX text\n // Use MANY to repeat, checking each time if we should stop\n this.MANY({\n GATE: () => {\n const la1 = this.LA(1);\n if (!la1) return false;\n // Stop if we hit JSX tag start, closing tag, or expression\n if (la1.tokenType === LessThan ||\n la1.tokenType.name === 'JSXCloseTagStart' ||\n la1.tokenType === LeftBrace) {\n return false;\n }\n return true; // Continue consuming ANY token\n },\n DEF: () => {\n // Consume ANY token type - match all possible tokens\n // This allows any token to be part of JSX text until we hit < or { or </\n // We need to list all token types to ensure everything is matched\n this.OR1([\n // Literals\n { ALT: () => this.CONSUME(Identifier) },\n { ALT: () => this.CONSUME(StringLiteral) },\n { ALT: () => this.CONSUME(NumberLiteral) },\n { ALT: () => this.CONSUME(TemplateLiteral) },\n // Keywords\n { ALT: () => this.CONSUME(Return) },\n { ALT: () => this.CONSUME(True) },\n { ALT: () => this.CONSUME(False) },\n { ALT: () => this.CONSUME(Null) },\n { ALT: () => this.CONSUME(Typeof) },\n { ALT: () => this.CONSUME(Void) },\n { ALT: () => this.CONSUME(Delete) },\n { ALT: () => this.CONSUME(Instanceof) },\n { ALT: () => this.CONSUME(In) },\n { ALT: () => this.CONSUME(Export) },\n { ALT: () => this.CONSUME(Import) },\n { ALT: () => this.CONSUME(From) },\n { ALT: () => this.CONSUME(Default) },\n { ALT: () => this.CONSUME(As) },\n { ALT: () => this.CONSUME(Modifier) },\n // Operators\n { ALT: () => this.CONSUME(PlusPlus) },\n { ALT: () => this.CONSUME(MinusMinus) },\n { ALT: () => this.CONSUME(StarStarColonEqual) },\n { ALT: () => this.CONSUME(LeftShiftColonEqual) },\n { ALT: () => this.CONSUME(RightShiftColonEqual) },\n { ALT: () => this.CONSUME(UnsignedRightShiftColonEqual) },\n { ALT: () => this.CONSUME(PlusColonEqual) },\n { ALT: () => this.CONSUME(MinusColonEqual) },\n { ALT: () => this.CONSUME(StarColonEqual) },\n { ALT: () => this.CONSUME(SlashColonEqual) },\n { ALT: () => this.CONSUME(PercentColonEqual) },\n { ALT: () => this.CONSUME(AndColonEqual) },\n { ALT: () => this.CONSUME(OrColonEqual) },\n { ALT: () => this.CONSUME(CaretColonEqual) },\n { ALT: () => this.CONSUME(EqualEqual) },\n { ALT: () => this.CONSUME(BangEqual) },\n { ALT: () => this.CONSUME(LessThanEqual) },\n { ALT: () => this.CONSUME(GreaterThanEqual) },\n { ALT: () => this.CONSUME(Pipe) },\n { ALT: () => this.CONSUME(Compose) },\n { ALT: () => this.CONSUME(LeftShift) },\n { ALT: () => this.CONSUME(UnsignedRightShift) },\n { ALT: () => this.CONSUME(RightShift) },\n { ALT: () => this.CONSUME(StarStar) },\n { ALT: () => this.CONSUME(AndAnd) },\n { ALT: () => this.CONSUME(OrOr) },\n { ALT: () => this.CONSUME(Equal) },\n { ALT: () => this.CONSUME(Plus) },\n { ALT: () => this.CONSUME(Minus) },\n { ALT: () => this.CONSUME(Star) },\n { ALT: () => this.CONSUME(Percent) },\n { ALT: () => this.CONSUME(GreaterThan) },\n { ALT: () => this.CONSUME(Slash) },\n { ALT: () => this.CONSUME(And) },\n { ALT: () => this.CONSUME(Or) },\n { ALT: () => this.CONSUME(Caret) },\n { ALT: () => this.CONSUME(Bang) },\n { ALT: () => this.CONSUME(Tilde) },\n { ALT: () => this.CONSUME(QuestionQuestion) },\n { ALT: () => this.CONSUME(Question) },\n { ALT: () => this.CONSUME(ColonEqual) },\n { ALT: () => this.CONSUME(Colon) },\n // Punctuation\n { ALT: () => this.CONSUME(LeftParen) },\n { ALT: () => this.CONSUME(RightParen) },\n { ALT: () => this.CONSUME(LeftBracket) },\n { ALT: () => this.CONSUME(RightBracket) },\n { ALT: () => this.CONSUME1(RightBrace) },\n { ALT: () => this.CONSUME(Comma) },\n { ALT: () => this.CONSUME(DotDotDot) },\n { ALT: () => this.CONSUME(Dot) },\n { ALT: () => this.CONSUME(Semicolon) },\n // Whitespace (if not skipped)\n { ALT: () => this.CONSUME(WhiteSpace) },\n ]);\n },\n });\n },\n },\n ]);\n });\n\n // Parenthesized expression\n // Also handles arrow functions: () =>, (a) =>, (x, y) =>, (x, ...rest) =>\n // After parsing (expr), we check if => follows\n this.RULE('parenthesizedExpression', () => {\n this.CONSUME(LeftParen);\n // Check if it's a parameter list or an expression\n this.OR([\n {\n // Arrow function parameter list: () =>, (a) =>, (x, y) =>, (x, ...rest) =>, (...args) =>\n // Check if => follows the closing paren\n GATE: () => {\n // Any parentheses followed by => must be parsed as an arrow function parameter list\n // Look ahead to find the matching closing paren and check if => follows\n let depth = 1;\n let i = 1;\n while (i < MAX_TOKEN_LOOKAHEAD_COUNT) {\n const token = this.LA(i);\n if (!token) break;\n if (token.tokenType === LeftParen) depth++;\n if (token.tokenType === RightParen) {\n depth--;\n if (depth === 0) {\n // Found the matching closing paren, check if => follows\n const nextToken = this.LA(i + 1);\n const afterNext = this.LA(i + 2);\n return nextToken && nextToken.tokenType === Equal &&\n afterNext && afterNext.tokenType === GreaterThan;\n }\n }\n i++;\n }\n return false;\n },\n ALT: () => {\n // Parameter list is optional (empty () => is valid)\n this.OPTION(() => {\n this.SUBRULE(this.parameterList);\n });\n this.CONSUME(RightParen);\n // If => follows, this is an arrow function\n this.CONSUME(Equal);\n this.CONSUME1(GreaterThan);\n this.OR1([\n {\n // Block body: (x, y) => { ... }\n GATE: () => {\n const la1 = this.LA(1);\n return la1 && la1.tokenType === LeftBrace;\n },\n ALT: () => {\n this.SUBRULE(this.blockStatement);\n },\n },\n {\n // Expression body: (x, y) => expr\n ALT: () => {\n this.SUBRULE1(this.expression);\n },\n },\n ]);\n },\n },\n {\n // Regular parenthesized expression: (expr)\n // This alternative should NOT be used if => follows (that's handled by the arrow function alternative above)\n GATE: () => {\n // Look ahead to find the matching closing paren and check if => follows\n // If => follows, we should use the arrow function alternative instead\n let depth = 1;\n let i = 1;\n while (i < MAX_TOKEN_LOOKAHEAD_COUNT) {\n const token = this.LA(i);\n if (!token) break;\n if (token.tokenType === LeftParen) depth++;\n if (token.tokenType === RightParen) {\n depth--;\n if (depth === 0) {\n // Found the matching closing paren, check if => follows\n const nextToken = this.LA(i + 1);\n const afterNext = this.LA(i + 2);\n // If => follows, return false to prevent this alternative from being used\n if (nextToken && nextToken.tokenType === Equal &&\n afterNext && afterNext.tokenType === GreaterThan) {\n return false;\n }\n // => does not follow, this is a regular parenthesized expression\n return true;\n }\n }\n i++;\n }\n // If we can't find the closing paren, allow this alternative\n return true;\n },\n ALT: () => {\n this.SUBRULE2(this.expression);\n this.CONSUME1(RightParen);\n },\n },\n ]);\n });\n\n // Identifier\n this.RULE('identifier', () => {\n this.CONSUME(Identifier);\n });\n\n // Must call this after all rules are defined\n // Note: Chevrotain requires performSelfAnalysis() to succeed\n // We've structured the grammar to avoid ambiguity by:\n // 1. Parsing single-param arrow functions (x =>) separately\n // 2. Handling multi-param arrow functions ((x, y) =>) via parenthesizedExpression + optional =>\n this.performSelfAnalysis();\n }\n}\n\nexport const parser = new OddoParser();\n","/**\r\n * AST Converter for Oddo Language\r\n * Converts Chevrotain CST to Oddo AST format\r\n */\r\n\r\nimport { parseOddoExpression } from './index.mjs';\r\n\r\n// Helper functions\r\nfunction getTokenValue(token) {\r\n if (!token) return null;\r\n if (Array.isArray(token)) return token.map(getTokenValue);\r\n return token.image || token.tokenType?.name;\r\n}\r\n\r\nfunction getFirstChild(node, ruleName) {\r\n const children = node.children?.[ruleName];\r\n return children && children.length > 0 ? children[0] : null;\r\n}\r\n\r\nfunction getAllChildren(node, ruleName) {\r\n return node.children?.[ruleName] || [];\r\n}\r\n\r\n// Helper function to find the first token's start offset in a CST node\r\nfunction getFirstTokenOffset(node) {\r\n if (!node) return undefined;\r\n\r\n // If this node has a startOffset, return it\r\n if (node.startOffset !== undefined) {\r\n return node.startOffset;\r\n }\r\n\r\n // If this node has children, recursively search them\r\n if (node.children) {\r\n for (const key in node.children) {\r\n const children = node.children[key];\r\n if (Array.isArray(children)) {\r\n for (const child of children) {\r\n const offset = getFirstTokenOffset(child);\r\n if (offset !== undefined) {\r\n return offset;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n// Convert statement\r\nfunction convertStatement(cst) {\r\n if (cst.children.exportStatement) {\r\n return convertExportStatement(getFirstChild(cst, 'exportStatement'));\r\n }\r\n if (cst.children.importStatement) {\r\n return convertImportStatement(getFirstChild(cst, 'importStatement'));\r\n }\r\n if (cst.children.returnStatement) {\r\n return convertReturnStatement(getFirstChild(cst, 'returnStatement'));\r\n }\r\n if (cst.children.expressionStatement) {\r\n return convertExpressionStatement(getFirstChild(cst, 'expressionStatement'));\r\n }\r\n if (cst.children.modifierBlockStatement) {\r\n return convertModifierBlockStatement(getFirstChild(cst, 'modifierBlockStatement'));\r\n }\r\n return null;\r\n}\r\n\r\nfunction convertModifierBlockStatement(cst) {\r\n const modifier = cst.children.Modifier?.[0];\r\n const block = getFirstChild(cst, 'blockStatement');\r\n\r\n return {\r\n type: 'expressionStatement',\r\n modifier: modifier ? modifier.image.slice(1) : null, // Remove @\r\n expression: null,\r\n block: block ? {\r\n type: 'blockStatement',\r\n body: getAllChildren(block, 'statement').map(convertStatement),\r\n } : null,\r\n };\r\n}\r\n\r\nfunction convertReturnStatement(cst) {\r\n const modifier = cst.children.Modifier?.[0];\r\n const argument = getFirstChild(cst, 'expression');\r\n\r\n return {\r\n type: 'returnStatement',\r\n modifier: modifier ? modifier.image.slice(1) : null, // Remove @\r\n argument: argument ? convertExpression(argument) : null,\r\n };\r\n }\r\n\r\nfunction convertExpressionStatement(cst) {\r\n const modifier = cst.children.Modifier?.[0];\r\n const expression = getFirstChild(cst, 'expression');\r\n // Note: Colon + blockStatement is no longer allowed in expressionStatement\r\n // Blocks are only allowed with modifiers (@modifier: { ... }) or arrow functions (x => { ... })\r\n\r\n return {\r\n type: 'expressionStatement',\r\n modifier: modifier ? modifier.image.slice(1) : null,\r\n expression: expression ? convertExpression(expression) : null,\r\n block: null,\r\n };\r\n }\r\n\r\nfunction convertExportStatement(cst) {\r\n // Check for export default\r\n if (cst.children.Default && cst.children.Default.length > 0) {\r\n const expression = getFirstChild(cst, 'expression');\r\n return {\r\n type: 'exportDefaultStatement',\r\n declaration: expression ? convertExpression(expression) : null,\r\n };\r\n }\r\n\r\n // Check for export { x, y }\r\n if (cst.children.LeftBrace && cst.children.LeftBrace.length > 0) {\r\n const specifierList = getFirstChild(cst, 'exportSpecifierList');\r\n const specifiers = specifierList ? getAllChildren(specifierList, 'exportSpecifier').map(convertExportSpecifier) : [];\r\n return {\r\n type: 'exportNamedStatement',\r\n specifiers,\r\n };\r\n }\r\n\r\n // export x = 1 (named export of assignment)\r\n const expressionStatement = getFirstChild(cst, 'expressionStatement');\r\n if (expressionStatement) {\r\n return {\r\n type: 'exportNamedStatement',\r\n declaration: convertExpressionStatement(expressionStatement),\r\n };\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction convertExportSpecifier(cst) {\r\n const local = cst.children.Identifier?.[0]?.image;\r\n const exported = cst.children.Identifier?.[1]?.image || local; // Use second identifier if 'as' is present\r\n\r\n return {\r\n type: 'exportSpecifier',\r\n local,\r\n exported,\r\n };\r\n}\r\n\r\nfunction convertImportStatement(cst) {\r\n // Check for import * as ns from \"module\"\r\n if (cst.children.Star && cst.children.Star.length > 0) {\r\n const namespace = cst.children.Identifier?.[0]?.image;\r\n const source = cst.children.StringLiteral?.[0]?.image?.slice(1, -1); // Remove quotes\r\n\r\n return {\r\n type: 'importNamespaceStatement',\r\n namespace,\r\n source,\r\n };\r\n }\r\n\r\n // Check for import defaultName from \"module\" or import defaultName, { x } from \"module\"\r\n const defaultName = cst.children.Identifier?.[0]?.image;\r\n const hasComma = cst.children.Comma && cst.children.Comma.length > 0;\r\n const source = cst.children.StringLiteral?.[0]?.image?.slice(1, -1); // Remove quotes\r\n\r\n if (hasComma) {\r\n // import defaultName, { x } from \"module\"\r\n const specifierList = getFirstChild(cst, 'importSpecifierList');\r\n const specifiers = specifierList ? getAllChildren(specifierList, 'importSpecifier').map(convertImportSpecifier) : [];\r\n\r\n return {\r\n type: 'importStatement',\r\n defaultImport: defaultName,\r\n specifiers,\r\n source,\r\n };\r\n }\r\n\r\n // Check for import { x, y } from \"module\"\r\n if (cst.children.LeftBrace && cst.children.LeftBrace.length > 0) {\r\n const specifierList = getFirstChild(cst, 'importSpecifierList');\r\n const specifiers = specifierList ? getAllChildren(specifierList, 'importSpecifier').map(convertImportSpecifier) : [];\r\n\r\n return {\r\n type: 'importStatement',\r\n defaultImport: null,\r\n specifiers,\r\n source,\r\n };\r\n }\r\n\r\n // import defaultName from \"module\"\r\n if (defaultName && source) {\r\n return {\r\n type: 'importStatement',\r\n defaultImport: defaultName,\r\n specifiers: [],\r\n source,\r\n };\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction convertImportSpecifier(cst) {\r\n const imported = cst.children.Identifier?.[0]?.image;\r\n const local = cst.children.Identifier?.[1]?.image || imported; // Use second identifier if 'as' is present\r\n\r\n return {\r\n type: 'importSpecifier',\r\n imported,\r\n local,\r\n };\r\n}\r\n\r\n// Convert expression\r\nexport function convertExpression(cst) {\r\n if (!cst) return null;\r\n\r\n // Check node name first (for recursive calls on nested nodes)\r\n const nodeName = cst.name;\r\n if (nodeName === 'assignment') return convertAssignment(cst);\r\n if (nodeName === 'conditional') return convertConditional(cst);\r\n if (nodeName === 'logicalOr') return convertLogicalOr(cst);\r\n if (nodeName === 'pipe') return convertPipe(cst);\r\n if (nodeName === 'compose') return convertCompose(cst);\r\n if (nodeName === 'nullishCoalescing') return convertNullishCoalescing(cst);\r\n if (nodeName === 'logicalAnd') return convertLogicalAnd(cst);\r\n if (nodeName === 'equality') return convertEquality(cst);\r\n if (nodeName === 'relational') return convertRelational(cst);\r\n if (nodeName === 'additive') return convertAdditive(cst);\r\n if (nodeName === 'multiplicative') return convertMultiplicative(cst);\r\n if (nodeName === 'exponentiation') return convertExponentiation(cst);\r\n if (nodeName === 'unary') return convertUnary(cst);\r\n if (nodeName === 'postfix') return convertPostfix(cst);\r\n if (nodeName === 'functionCall') return convertFunctionCall(cst);\r\n if (nodeName === 'memberAccess') return convertMemberAccess(cst);\r\n if (nodeName === 'primary') return convertPrimary(cst);\r\n\r\n // Check children (for top-level expression nodes)\r\n // Assignment\r\n if (cst.children.assignment) {\r\n return convertAssignment(getFirstChild(cst, 'assignment'));\r\n }\r\n\r\n // Conditional\r\n if (cst.children.conditional) {\r\n return convertConditional(getFirstChild(cst, 'conditional'));\r\n }\r\n\r\n // Logical OR\r\n if (cst.children.logicalOr) {\r\n return convertLogicalOr(getFirstChild(cst, 'logicalOr'));\r\n }\r\n\r\n // Pipe\r\n if (cst.children.pipe) {\r\n return convertPipe(getFirstChild(cst, 'pipe'));\r\n }\r\n\r\n // Compose\r\n if (cst.children.compose) {\r\n return convertCompose(getFirstChild(cst, 'compose'));\r\n }\r\n\r\n // Nullish Coalescing\r\n if (cst.children.nullishCoalescing) {\r\n return convertNullishCoalescing(getFirstChild(cst, 'nullishCoalescing'));\r\n }\r\n\r\n // Logical AND\r\n if (cst.children.logicalAnd) {\r\n return convertLogicalAnd(getFirstChild(cst, 'logicalAnd'));\r\n }\r\n\r\n // Equality\r\n if (cst.children.equality) {\r\n return convertEquality(getFirstChild(cst, 'equality'));\r\n }\r\n\r\n // Relational\r\n if (cst.children.relational) {\r\n return convertRelational(getFirstChild(cst, 'relational'));\r\n }\r\n\r\n // Additive\r\n if (cst.children.additive) {\r\n return convertAdditive(getFirstChild(cst, 'additive'));\r\n }\r\n\r\n // Multiplicative\r\n if (cst.children.multiplicative) {\r\n return convertMultiplicative(getFirstChild(cst, 'multiplicative'));\r\n }\r\n\r\n // Exponentiation\r\n if (cst.children.exponentiation) {\r\n return convertExponentiation(getFirstChild(cst, 'exponentiation'));\r\n }\r\n\r\n // Unary\r\n if (cst.children.unary) {\r\n return convertUnary(getFirstChild(cst, 'unary'));\r\n }\r\n\r\n // Postfix\r\n if (cst.children.postfix) {\r\n return convertPostfix(getFirstChild(cst, 'postfix'));\r\n }\r\n\r\n // Function call\r\n if (cst.children.functionCall) {\r\n return convertFunctionCall(getFirstChild(cst, 'functionCall'));\r\n }\r\n\r\n // Member access\r\n if (cst.children.memberAccess) {\r\n return convertMemberAccess(getFirstChild(cst, 'memberAccess'));\r\n }\r\n\r\n // Primary\r\n if (cst.children.primary) {\r\n return convertPrimary(getFirstChild(cst, 'primary'));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n// Convert destructuring patterns\r\nfunction convertDestructuringPattern(cst) {\r\n if (cst.children.LeftBracket) {\r\n // Array pattern: [a, b, ...rest]\r\n const arrayList = getFirstChild(cst, 'arrayDestructuringList');\r\n return {\r\n type: 'arrayPattern',\r\n elements: arrayList ? convertArrayDestructuringList(arrayList) : [],\r\n };\r\n }\r\n\r\n if (cst.children.LeftBrace) {\r\n // Object pattern: {a, b, ...rest} or {a: x, b}\r\n const objectList = getFirstChild(cst, 'objectDestructuringList');\r\n return {\r\n type: 'objectPattern',\r\n properties: objectList ? convertObjectDestructuringList(objectList) : [],\r\n };\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction convertArrayDestructuringList(cst) {\r\n const elements = [];\r\n\r\n // Chevrotain flattens the CST structure - identifiers and commas are direct children\r\n const identifiers = cst.children.Identifier || [];\r\n const commas = cst.children.Comma || [];\r\n const dotDotDots = cst.children.DotDotDot || [];\r\n const destructuringPatterns = getAllChildren(cst, 'destructuringPattern');\r\n\r\n // Track positions to determine order\r\n let identifierIndex = 0;\r\n let patternIndex = 0;\r\n let dotDotDotIndex = 0;\r\n\r\n // Process elements in order\r\n // First element (before any comma)\r\n if (dotDotDotIndex < dotDotDots.length && dotDotDots[dotDotDotIndex].startOffset < (identifiers[identifierIndex]?.startOffset || Infinity)) {\r\n // Rest element first\r\n if (identifierIndex < identifiers.length) {\r\n elements.push({\r\n type: 'restElement',\r\n argument: { type: 'identifier', name: identifiers[identifierIndex].image },\r\n });\r\n dotDotDotIndex++;\r\n identifierIndex++;\r\n }\r\n } else if (patternIndex < destructuringPatterns.length && destructuringPatterns[patternIndex].startOffset < (identifiers[identifierIndex]?.startOffset || Infinity)) {\r\n // Nested pattern first\r\n elements.push(convertDestructuringPattern(destructuringPatterns[patternIndex]));\r\n patternIndex++;\r\n } else if (identifierIndex < identifiers.length) {\r\n // Regular identifier first\r\n elements.push({ type: 'identifier', name: identifiers[identifierIndex].image });\r\n identifierIndex++;\r\n }\r\n\r\n // Process remaining elements (after commas)\r\n for (let i = 0; i < commas.length; i++) {\r\n // Check what comes after this comma\r\n if (dotDotDotIndex < dotDotDots.length &&\r\n dotDotDots[dotDotDotIndex].startOffset < (identifiers[identifierIndex]?.startOffset || Infinity) &&\r\n dotDotDots[dotDotDotIndex].startOffset < (destructuringPatterns[patternIndex]?.startOffset || Infinity)) {\r\n // Rest element\r\n if (identifierIndex < identifiers.length) {\r\n elements.push({\r\n type: 'restElement',\r\n argument: { type: 'identifier', name: identifiers[identifierIndex].image },\r\n });\r\n dotDotDotIndex++;\r\n identifierIndex++;\r\n break; // Rest must be last\r\n }\r\n } else if (patternIndex < destructuringPatterns.length &&\r\n destructuringPatterns[patternIndex].startOffset < (identifiers[identifierIndex]?.startOffset || Infinity)) {\r\n // Nested pattern\r\n elements.push(convertDestructuringPattern(destructuringPatterns[patternIndex]));\r\n patternIndex++;\r\n } else if (identifierIndex < identifiers.length) {\r\n // Regular identifier\r\n elements.push({ type: 'identifier', name: identifiers[identifierIndex].image });\r\n identifierIndex++;\r\n }\r\n }\r\n\r\n return elements;\r\n}\r\n\r\nfunction convertObjectDestructuringList(cst) {\r\n const properties = [];\r\n\r\n // Chevrotain flattens the CST - we need to reconstruct the structure\r\n // Object destructuring can have: Identifier, StringLiteral, Colon, Comma, DotDotDot, destructuringPattern, Equal, expression\r\n const identifiers = cst.children.Identifier || [];\r\n const stringLiterals = cst.children.StringLiteral || [];\r\n const colons = cst.children.Colon || [];\r\n const commas = cst.children.Comma || [];\r\n const dotDotDots = cst.children.DotDotDot || [];\r\n const equals = cst.children.Equal || [];\r\n const destructuringPatterns = getAllChildren(cst, 'destructuringPattern');\r\n // Expressions in OPTION subrules are stored as direct children\r\n const expressions = cst.children.expression || [];\r\n\r\n // Track positions\r\n let idIndex = 0;\r\n let strIndex = 0;\r\n let colonIndex = 0;\r\n let commaIndex = 0;\r\n let dotDotDotIndex = 0;\r\n let patternIndex = 0;\r\n let exprIndex = 0; // Track expression index for matching defaults\r\n\r\n // Process first property (before any comma)\r\n // Only process as rest if DotDotDot comes before any identifier\r\n if (dotDotDotIndex < dotDotDots.length &&\r\n (idIndex >= identifiers.length || dotDotDots[dotDotDotIndex].startOffset < identifiers[idIndex].startOffset) &&\r\n (strIndex >= stringLiterals.length || dotDotDots[dotDotDotIndex].startOffset < stringLiterals[strIndex].startOffset)) {\r\n // Rest property first: ...rest\r\n // Find the identifier that comes after this DotDotDot\r\n let restIdIndex = idIndex;\r\n for (let j = idIndex; j < identifiers.length; j++) {\r\n if (identifiers[j].startOffset > dotDotDots[dotDotDotIndex].startOffset) {\r\n restIdIndex = j;\r\n break;\r\n }\r\n }\r\n if (restIdIndex < identifiers.length) {\r\n properties.push({\r\n type: 'restProperty',\r\n argument: { type: 'identifier', name: identifiers[restIdIndex].image },\r\n });\r\n dotDotDotIndex++;\r\n idIndex = restIdIndex + 1;\r\n return properties; // Rest must be last\r\n }\r\n }\r\n\r\n // Regular property\r\n let key = null;\r\n let value = null;\r\n\r\n // Get key (identifier or string literal)\r\n if (idIndex < identifiers.length && (strIndex >= stringLiterals.length || identifiers[idIndex].startOffset < stringLiterals[strIndex].startOffset)) {\r\n key = { type: 'identifier', name: identifiers[idIndex].image };\r\n idIndex++;\r\n } else if (strIndex < stringLiterals.length) {\r\n key = { type: 'string', value: stringLiterals[strIndex].image.slice(1, -1) };\r\n strIndex++;\r\n }\r\n\r\n // Check if there's a colon (key: value pattern)\r\n if (colonIndex < colons.length && key) {\r\n colonIndex++;\r\n // Get value (identifier or nested pattern)\r\n // Check if there's a nested pattern after the colon\r\n if (patternIndex < destructuringPatterns.length) {\r\n // Get the actual start offset from the opening bracket/brace\r\n const pattern = destructuringPatterns[patternIndex];\r\n const leftBracket = pattern.children?.LeftBracket?.[0];\r\n const leftBrace = pattern.children?.LeftBrace?.[0];\r\n const patternStart = leftBracket?.startOffset || leftBrace?.startOffset || pattern.startOffset || 0;\r\n const colon = colons[colonIndex - 1];\r\n const colonEnd = colon.endOffset || colon.startOffset;\r\n\r\n // Check if this pattern comes after the colon and before any identifier\r\n if (patternStart > colonEnd &&\r\n (idIndex >= identifiers.length || patternStart < identifiers[idIndex].startOffset)) {\r\n value = convertDestructuringPattern(pattern);\r\n patternIndex++;\r\n } else if (idIndex < identifiers.length) {\r\n value = { type: 'identifier', name: identifiers[idIndex].image };\r\n idIndex++;\r\n }\r\n } else if (idIndex < identifiers.length) {\r\n value = { type: 'identifier', name: identifiers[idIndex].image };\r\n idIndex++;\r\n }\r\n\r\n // Check for default value after the value\r\n let defaultValue = null;\r\n const valueEnd = value ? (value.startOffset || (identifiers[idIndex - 1]?.endOffset || 0)) : (key.startOffset || 0);\r\n const defaultEqual = equals.find(eq => eq.startOffset > valueEnd && eq.startOffset < valueEnd + 20);\r\n if (defaultEqual && expressions.length > 0) {\r\n const defaultExpr = expressions.find(expr => {\r\n const exprStart = expr.startOffset ||\r\n expr.children?.number?.[0]?.children?.NumberLiteral?.[0]?.startOffset ||\r\n expr.children?.identifier?.[0]?.children?.Identifier?.[0]?.startOffset;\r\n return exprStart && exprStart > defaultEqual.startOffset && exprStart < defaultEqual.startOffset + 20;\r\n });\r\n if (defaultExpr) {\r\n defaultValue = convertExpression(defaultExpr);\r\n }\r\n }\r\n\r\n if (key && value) {\r\n properties.push({\r\n type: 'property',\r\n key,\r\n value,\r\n shorthand: false,\r\n default: defaultValue,\r\n });\r\n }\r\n } else if (key) {\r\n // Shorthand property - check for default value\r\n let defaultValue = null;\r\n const keyEnd = key.startOffset || (identifiers[idIndex - 1]?.endOffset || 0);\r\n const nextCommaStart = commas.length > 0 ? commas[0].startOffset : Infinity;\r\n const defaultEqual = equals.find(eq =>\r\n eq.startOffset > keyEnd && eq.startOffset < nextCommaStart\r\n );\r\n\r\n if (defaultEqual && exprIndex < expressions.length) {\r\n defaultValue = convertExpression(expressions[exprIndex]);\r\n exprIndex++;\r\n }\r\n\r\n properties.push({\r\n type: 'property',\r\n key,\r\n value: key, // Shorthand: same as key\r\n shorthand: true,\r\n default: defaultValue,\r\n });\r\n }\r\n\r\n // Process remaining properties (after commas)\r\n for (let i = 0; i < commas.length; i++) {\r\n const comma = commas[i];\r\n\r\n // Check if the next token after this comma is a DotDotDot (rest property)\r\n // Find the next DotDotDot that comes after this comma\r\n let nextDotDotDot = null;\r\n let nextDotDotDotIndex = -1;\r\n for (let j = dotDotDotIndex; j < dotDotDots.length; j++) {\r\n if (dotDotDots[j].startOffset > comma.startOffset) {\r\n nextDotDotDot = dotDotDots[j];\r\n nextDotDotDotIndex = j;\r\n break;\r\n }\r\n }\r\n\r\n // Check if next token after comma is the DotDotDot (before any identifier)\r\n const nextIdOffset = idIndex < identifiers.length ? identifiers[idIndex].startOffset : Infinity;\r\n const nextStrOffset = strIndex < stringLiterals.length ? stringLiterals[strIndex].startOffset : Infinity;\r\n const nextTokenOffset = Math.min(nextIdOffset, nextStrOffset);\r\n\r\n if (nextDotDotDot && nextDotDotDot.startOffset < nextTokenOffset) {\r\n // Rest property - find the identifier that comes after this DotDotDot\r\n let restIdIndex = idIndex;\r\n for (let j = idIndex; j < identifiers.length; j++) {\r\n if (identifiers[j].startOffset > nextDotDotDot.startOffset) {\r\n restIdIndex = j;\r\n break;\r\n }\r\n }\r\n if (restIdIndex < identifiers.length) {\r\n properties.push({\r\n type: 'restProperty',\r\n argument: { type: 'identifier', name: identifiers[restIdIndex].image },\r\n });\r\n dotDotDotIndex = nextDotDotDotIndex + 1;\r\n idIndex = restIdIndex + 1;\r\n break; // Rest must be last\r\n }\r\n }\r\n\r\n // Regular property\r\n key = null;\r\n value = null;\r\n\r\n // Get key\r\n if (idIndex < identifiers.length && (strIndex >= stringLiterals.length || identifiers[idIndex].startOffset < stringLiterals[strIndex].startOffset)) {\r\n key = { type: 'identifier', name: identifiers[idIndex].image };\r\n idIndex++;\r\n } else if (strIndex < stringLiterals.length) {\r\n key = { type: 'string', value: stringLiterals[strIndex].image.slice(1, -1) };\r\n strIndex++;\r\n }\r\n\r\n // Check for colon\r\n let defaultValue = null;\r\n if (colonIndex < colons.length && key) {\r\n colonIndex++;\r\n // Get value\r\n if (patternIndex < destructuringPatterns.length) {\r\n // Get the actual start offset from the opening bracket/brace\r\n const pattern = destructuringPatterns[patternIndex];\r\n const leftBracket = pattern.children?.LeftBracket?.[0];\r\n const leftBrace = pattern.children?.LeftBrace?.[0];\r\n const patternStart = leftBracket?.startOffset || leftBrace?.startOffset || pattern.startOffset || 0;\r\n const colon = colons[colonIndex - 1];\r\n const colonEnd = colon.endOffset || colon.startOffset;\r\n\r\n // Check if this pattern comes after the colon and before any identifier\r\n if (patternStart > colonEnd &&\r\n (idIndex >= identifiers.length || patternStart < identifiers[idIndex].startOffset)) {\r\n value = convertDestructuringPattern(pattern);\r\n patternIndex++;\r\n } else if (idIndex < identifiers.length) {\r\n value = { type: 'identifier', name: identifiers[idIndex].image };\r\n idIndex++;\r\n }\r\n } else if (idIndex < identifiers.length) {\r\n value = { type: 'identifier', name: identifiers[idIndex].image };\r\n idIndex++;\r\n }\r\n\r\n // Check for default value after the value\r\n // Find the equal that comes after this value (before the next comma or end)\r\n const valueEnd = value ? (value.startOffset || (identifiers[idIndex - 1]?.endOffset || 0)) : (key.startOffset || 0);\r\n const nextCommaStart = i < commas.length - 1 ? commas[i + 1].startOffset : Infinity;\r\n const defaultEqual = equals.find(eq =>\r\n eq.startOffset > valueEnd && eq.startOffset < nextCommaStart\r\n );\r\n\r\n if (defaultEqual && exprIndex < expressions.length) {\r\n defaultValue = convertExpression(expressions[exprIndex]);\r\n exprIndex++;\r\n }\r\n\r\n if (key && value) {\r\n properties.push({\r\n type: 'property',\r\n key,\r\n value,\r\n shorthand: false,\r\n default: defaultValue,\r\n });\r\n }\r\n } else if (key) {\r\n // Shorthand property - check for default value\r\n const keyEnd = key.startOffset || (identifiers[idIndex - 1]?.endOffset || 0);\r\n const nextCommaStart = i < commas.length - 1 ? commas[i + 1].startOffset : Infinity;\r\n const defaultEqual = equals.find(eq =>\r\n eq.startOffset > keyEnd && eq.startOffset < nextCommaStart\r\n );\r\n\r\n if (defaultEqual && exprIndex < expressions.length) {\r\n defaultValue = convertExpression(expressions[exprIndex]);\r\n exprIndex++;\r\n }\r\n\r\n properties.push({\r\n type: 'property',\r\n key,\r\n value: key,\r\n shorthand: true,\r\n default: defaultValue,\r\n });\r\n }\r\n }\r\n\r\n return properties;\r\n}\r\n\r\nfunction convertAssignment(cst) {\r\n // Check if this is a destructuring assignment\r\n const destructuringPattern = getFirstChild(cst, 'destructuringPattern');\r\n\r\n if (destructuringPattern) {\r\n // Destructuring assignment: [pattern] = or {pattern} = or [pattern] := or {pattern} :=\r\n const opToken = cst.children.Equal?.[0] ||\r\n cst.children.ColonEqual?.[0] ||\r\n cst.children.PlusColonEqual?.[0] ||\r\n cst.children.MinusColonEqual?.[0] ||\r\n cst.children.StarColonEqual?.[0] ||\r\n cst.children.SlashColonEqual?.[0] ||\r\n cst.children.PercentColonEqual?.[0] ||\r\n cst.children.StarStarColonEqual?.[0] ||\r\n cst.children.LeftShiftColonEqual?.[0] ||\r\n cst.children.RightShiftColonEqual?.[0] ||\r\n cst.children.UnsignedRightShiftColonEqual?.[0] ||\r\n cst.children.AndColonEqual?.[0] ||\r\n cst.children.CaretColonEqual?.[0] ||\r\n cst.children.OrColonEqual?.[0];\r\n\r\n if (opToken) {\r\n const left = convertDestructuringPattern(destructuringPattern);\r\n const right = convertExpression(getFirstChild(cst, 'assignment'));\r\n \r\n // In Oddo, = is a declaration, := is an assignment\r\n if (opToken.image === '=') {\r\n return {\r\n type: 'variableDeclaration',\r\n operator: '=',\r\n left,\r\n right,\r\n };\r\n }\r\n \r\n return {\r\n type: 'assignment',\r\n operator: opToken.image,\r\n left,\r\n right,\r\n };\r\n }\r\n\r\n // If no operator, just return the pattern (shouldn't happen in valid syntax)\r\n return convertDestructuringPattern(destructuringPattern);\r\n }\r\n\r\n // Regular assignment: expr = expr or expr := expr\r\n const left = convertExpression(getFirstChild(cst, 'conditional'));\r\n const opToken = cst.children.Equal?.[0] ||\r\n cst.children.ColonEqual?.[0] ||\r\n cst.children.PlusColonEqual?.[0] ||\r\n cst.children.MinusColonEqual?.[0] ||\r\n cst.children.StarColonEqual?.[0] ||\r\n cst.children.SlashColonEqual?.[0] ||\r\n cst.children.PercentColonEqual?.[0] ||\r\n cst.children.StarStarColonEqual?.[0] ||\r\n cst.children.LeftShiftColonEqual?.[0] ||\r\n cst.children.RightShiftColonEqual?.[0] ||\r\n cst.children.UnsignedRightShiftColonEqual?.[0] ||\r\n cst.children.AndColonEqual?.[0] ||\r\n cst.children.CaretColonEqual?.[0] ||\r\n cst.children.OrColonEqual?.[0];\r\n\r\n if (opToken) {\r\n const right = convertExpression(getFirstChild(cst, 'assignment'));\r\n\r\n // Check if this is a slice assignment: arr[start...end] := value\r\n if (left && left.type === 'arraySlice') {\r\n if (opToken.image === '=') {\r\n throw new Error('Array slice assignments must use := operator, not =');\r\n }\r\n // Only := is allowed for array slice assignments\r\n return {\r\n type: 'arraySliceAssignment',\r\n slice: left,\r\n value: right,\r\n };\r\n }\r\n\r\n // Check if left-hand side is member access (a.b.c)\r\n if (left && left.type === 'memberAccess') {\r\n if (opToken.image === '=') {\r\n throw new Error('Member access assignments must use := operator, not =');\r\n }\r\n }\r\n\r\n // In Oddo, = is a declaration (const), := is an assignment\r\n if (opToken.image === '=') {\r\n return {\r\n type: 'variableDeclaration',\r\n operator: '=',\r\n left,\r\n right,\r\n };\r\n }\r\n\r\n // := and compound assignments (+=:, etc.) are true assignments\r\n return {\r\n type: 'assignment',\r\n operator: opToken.image,\r\n left,\r\n right,\r\n };\r\n }\r\n\r\n return left;\r\n }\r\n\r\nfunction convertConditional(cst) {\r\n const test = convertExpression(getFirstChild(cst, 'logicalOr'));\r\n const hasQuestion = cst.children.Question && cst.children.Question.length > 0;\r\n\r\n if (hasQuestion) {\r\n const consequent = convertExpression(getFirstChild(cst, 'expression'));\r\n const alternate = convertExpression(getFirstChild(cst, 'conditional'));\r\n return {\r\n type: 'conditional',\r\n test,\r\n consequent,\r\n alternate,\r\n };\r\n }\r\n\r\n return test;\r\n }\r\n\r\nfunction convertLogicalOr(cst) {\r\n const left = convertExpression(getFirstChild(cst, 'pipe'));\r\n const operators = cst.children.OrOr || [];\r\n\r\n return operators.reduce((acc, _, index) => {\r\n const right = convertExpression(getAllChildren(cst, 'pipe')[index + 1]);\r\n return {\r\n type: 'logical',\r\n operator: '||',\r\n left: acc,\r\n right,\r\n };\r\n }, left);\r\n }\r\n\r\nfunction convertPipe(cst) {\r\n const left = convertExpression(getFirstChild(cst, 'compose'));\r\n const operators = cst.children.Pipe || [];\r\n\r\n return operators.reduce((acc, _, index) => {\r\n const right = convertExpression(getAllChildren(cst, 'compose')[index + 1]);\r\n return {\r\n type: 'pipe',\r\n left: acc,\r\n right,\r\n };\r\n }, left);\r\n }\r\n\r\nfunction convertCompose(cst) {\r\n const left = convertExpression(getFirstChild(cst, 'nullishCoalescing'));\r\n const composeOp = cst.children.Compose?.[0];\r\n\r\n if (composeOp) {\r\n const right = convertExpression(getFirstChild(cst, 'compose'));\r\n // Right-associative: c <| b <| a means c <| (b <| a)\r\n // So we want: left(right) where left is the outer function and right is the inner result\r\n return {\r\n type: 'compose',\r\n left: left, // Outer function (c)\r\n right: right, // Inner result (b <| a)\r\n };\r\n }\r\n\r\n return left;\r\n }\r\n\r\nfunction convertNullishCoalescing(cst) {\r\n const left = convertExpression(getFirstChild(cst, 'logicalAnd'));\r\n const operators = cst.children.QuestionQuestion || [];\r\n\r\n return operators.reduce((acc, _, index) => {\r\n const right = convertExpression(getAllChildren(cst, 'logicalAnd')[index + 1]);\r\n return {\r\n type: 'nullishCoalescing',\r\n operator: '??',\r\n left: acc,\r\n right,\r\n };\r\n }, left);\r\n }\r\n\r\nfunction convertLogicalAnd(cst) {\r\n const left = convertExpression(getFirstChild(cst, 'equality'));\r\n const operators = cst.children.AndAnd || [];\r\n\r\n return operators.reduce((acc, _, index) => {\r\n const right = convertExpression(getAllChildren(cst, 'equality')[index + 1]);\r\n return {\r\n type: 'logical',\r\n operator: '&&',\r\n left: acc,\r\n right,\r\n };\r\n }, left);\r\n }\r\n\r\nfunction convertEquality(cst) {\r\n const left = convertExpression(getFirstChild(cst, 'relational'));\r\n const operators = [\r\n ...(cst.children.EqualEqual || []),\r\n ...(cst.children.BangEqual || []),\r\n ];\r\n\r\n return operators.reduce((acc, op, index) => {\r\n const right = convertExpression(getAllChildren(cst, 'relational')[index + 1]);\r\n return {\r\n type: 'binary',\r\n operator: op.image,\r\n left: acc,\r\n right,\r\n };\r\n }, left);\r\n }\r\n\r\nfunction convertRelational(cst) {\r\n const left = convertExpression(getFirstChild(cst, 'additive'));\r\n const operators = [\r\n ...(cst.children.LessThanEqual || []),\r\n ...(cst.children.GreaterThanEqual || []),\r\n ...(cst.children.LessThan || []),\r\n ...(cst.children.GreaterThan || []),\r\n ...(cst.children.Instanceof || []),\r\n ...(cst.children.In || []),\r\n ];\r\n\r\n return operators.reduce((acc, op, index) => {\r\n const right = convertExpression(getAllChildren(cst, 'additive')[index + 1]);\r\n return {\r\n type: 'binary',\r\n operator: op.image,\r\n left: acc,\r\n right,\r\n };\r\n }, left);\r\n }\r\n\r\nfunction convertAdditive(cst) {\r\n const left = convertExpression(getFirstChild(cst, 'multiplicative'));\r\n const operators = [\r\n ...(cst.children.Plus || []),\r\n ...(cst.children.Minus || []),\r\n ];\r\n\r\n return operators.reduce((acc, op, index) => {\r\n const right = convertExpression(getAllChildren(cst, 'multiplicative')[index + 1]);\r\n return {\r\n type: 'binary',\r\n operator: op.image,\r\n left: acc,\r\n right,\r\n };\r\n }, left);\r\n }\r\n\r\nfunction convertMultiplicative(cst) {\r\n const left = convertExpression(getFirstChild(cst, 'exponentiation'));\r\n const operators = [\r\n ...(cst.children.Star || []),\r\n ...(cst.children.Slash || []),\r\n ...(cst.children.Percent || []),\r\n ];\r\n\r\n return operators.reduce((acc, op, index) => {\r\n const right = convertExpression(getAllChildren(cst, 'exponentiation')[index + 1]);\r\n return {\r\n type: 'binary',\r\n operator: op.image,\r\n left: acc,\r\n right,\r\n };\r\n }, left);\r\n }\r\n\r\nfunction convertExponentiation(cst) {\r\n const left = convertExpression(getFirstChild(cst, 'unary'));\r\n const hasStarStar = cst.children.StarStar && cst.children.StarStar.length > 0;\r\n\r\n if (hasStarStar) {\r\n const right = convertExpression(getFirstChild(cst, 'exponentiation'));\r\n return {\r\n type: 'binary',\r\n operator: '**',\r\n left,\r\n right,\r\n };\r\n }\r\n\r\n return left;\r\n }\r\n\r\nfunction convertUnary(cst) {\r\n // Check for prefix operators\r\n const prefixOp = cst.children.PlusPlus?.[0] ||\r\n cst.children.MinusMinus?.[0];\r\n\r\n if (prefixOp) {\r\n const operand = convertExpression(getFirstChild(cst, 'postfix'));\r\n return {\r\n type: 'prefix',\r\n operator: prefixOp.image,\r\n operand,\r\n };\r\n }\r\n\r\n // Check for unary operators\r\n const unaryOp = cst.children.Typeof?.[0] ||\r\n cst.children.Void?.[0] ||\r\n cst.children.Delete?.[0] ||\r\n cst.children.Plus?.[0] ||\r\n cst.children.Minus?.[0] ||\r\n cst.children.Bang?.[0] ||\r\n cst.children.Tilde?.[0];\r\n\r\n if (unaryOp) {\r\n const operand = convertExpression(getFirstChild(cst, 'unary'));\r\n return {\r\n type: 'unary',\r\n operator: unaryOp.image,\r\n operand,\r\n };\r\n }\r\n\r\n // Otherwise it's a postfix expression\r\n return convertExpression(getFirstChild(cst, 'postfix'));\r\n }\r\n\r\nfunction convertPostfix(cst) {\r\n const operand = convertExpression(getFirstChild(cst, 'functionCall'));\r\n const op = cst.children.PlusPlus?.[0] || cst.children.MinusMinus?.[0];\r\n\r\n if (op) {\r\n return {\r\n type: 'postfix',\r\n operator: op.image,\r\n operand,\r\n };\r\n }\r\n\r\n return operand;\r\n }\r\n\r\nfunction convertFunctionCall(cst) {\r\n let callee = convertExpression(getFirstChild(cst, 'memberAccess'));\r\n const leftParens = cst.children.LeftParen || [];\r\n const questionDots = cst.children.QuestionDot || [];\r\n const templateLiterals = cst.children.TemplateLiteral || [];\r\n\r\n // Handle tagged template literals: fn`template`\r\n if (templateLiterals.length > 0 && leftParens.length === 0) {\r\n // This is a tagged template literal\r\n const templateLiteral = convertTemplateLiteralFromToken(templateLiterals[0]);\r\n return {\r\n type: 'taggedTemplate',\r\n tag: callee,\r\n template: templateLiteral,\r\n };\r\n }\r\n\r\n // Collect all operations: calls, dots, brackets, optional access\r\n const dots = cst.children.Dot || [];\r\n const identifiers = cst.children.Identifier || [];\r\n const brackets = cst.children.LeftBracket || [];\r\n const rightBrackets = cst.children.RightBracket || [];\r\n const argLists = getAllChildren(cst, 'argumentList');\r\n const allExprs = getAllChildren(cst, 'expression');\r\n\r\n // Build unified operations list sorted by offset\r\n const ops = [\r\n ...leftParens.map((t, i) => ({ k: 'c', off: t.startOffset, i, token: t })),\r\n ...dots.map((t, i) => ({ k: 'd', off: t.startOffset, i })),\r\n ...brackets.map((t, i) => ({ k: 'b', off: t.startOffset, i, end: rightBrackets[i]?.endOffset })),\r\n ...questionDots.filter(q => !leftParens.some(p => Math.abs(p.startOffset - q.endOffset) <= 1))\r\n .map((t, i) => ({ k: 'q', off: t.startOffset, i }))\r\n ].sort((a, b) => a.off - b.off);\r\n\r\n let identIdx = 0;\r\n\r\n for (const op of ops) {\r\n if (op.k === 'c') {\r\n // Function call\r\n const isOptional = questionDots.some(q => q.endOffset < op.token.startOffset && op.token.startOffset - q.endOffset <= 1);\r\n const argsCST = argLists[op.i];\r\n const args = [];\r\n if (argsCST) {\r\n const exprs = getAllChildren(argsCST, 'expression');\r\n const spreads = argsCST.children.DotDotDot || [];\r\n for (const expr of exprs) {\r\n const start = getFirstTokenOffset(expr);\r\n const isSpread = start !== undefined && spreads.some(s => Math.abs(s.endOffset + 1 - start) <= 1);\r\n args.push(isSpread ? { type: 'spreadElement', argument: convertExpression(expr) } : convertExpression(expr));\r\n }\r\n }\r\n callee = { type: 'call', callee, arguments: args, optional: isOptional };\r\n } else if (op.k === 'd') {\r\n const id = identifiers[identIdx++];\r\n if (id) callee = { type: 'memberAccess', object: callee, property: id.image, computed: false, optional: false };\r\n } else if (op.k === 'q') {\r\n const nextBracket = brackets.find(b => b.startOffset > op.off && b.startOffset - op.off <= 2);\r\n if (nextBracket) {\r\n const bIdx = brackets.indexOf(nextBracket);\r\n const expr = allExprs.find(e => { const o = getFirstTokenOffset(e); return o > nextBracket.startOffset && o < rightBrackets[bIdx]?.endOffset; });\r\n if (expr) callee = { type: 'memberAccess', object: callee, property: convertExpression(expr), computed: true, optional: true };\r\n ops.splice(ops.findIndex(o => o.k === 'b' && o.i === bIdx), 1);\r\n } else {\r\n const id = identifiers[identIdx++];\r\n if (id) callee = { type: 'memberAccess', object: callee, property: id.image, computed: false, optional: true };\r\n }\r\n } else if (op.k === 'b') {\r\n const expr = allExprs.find(e => { const o = getFirstTokenOffset(e); return o > op.off && o < op.end; });\r\n if (expr) callee = { type: 'memberAccess', object: callee, property: convertExpression(expr), computed: true, optional: false };\r\n }\r\n }\r\n\r\n return callee;\r\n}\r\n\r\nfunction convertMemberAccess(cst) {\r\n let object = convertExpression(getFirstChild(cst, 'primary'));\r\n const dots = cst.children.Dot || [];\r\n const questionDots = cst.children.QuestionDot || [];\r\n const brackets = cst.children.LeftBracket || [];\r\n const dotDotDots = cst.children.DotDotDot || [];\r\n\r\n // If no member access operators, just return the object\r\n if (dots.length === 0 && questionDots.length === 0 && brackets.length === 0) {\r\n return object;\r\n }\r\n\r\n // Build a list of all member access operations in order\r\n const allOps = [];\r\n\r\n // Add dots (regular property access)\r\n for (const dot of dots) {\r\n allOps.push({ type: 'dot', token: dot, optional: false });\r\n }\r\n\r\n // Add question dots (optional property access)\r\n for (const qDot of questionDots) {\r\n allOps.push({ type: 'dot', token: qDot, optional: true });\r\n }\r\n\r\n // Sort by offset to maintain original order\r\n allOps.sort((a, b) => a.token.startOffset - b.token.startOffset);\r\n\r\n // Process dots (dot notation: obj.prop and obj?.prop)\r\n // Identifiers array contains all identifiers after the primary one\r\n const identifiers = cst.children.Identifier || [];\r\n let identifierIndex = 0;\r\n\r\n for (let i = 0; i < allOps.length; i++) {\r\n const op = allOps[i];\r\n const identifier = identifiers[identifierIndex];\r\n if (identifier) {\r\n identifierIndex++;\r\n object = {\r\n type: 'memberAccess',\r\n object,\r\n property: identifier.image,\r\n computed: false,\r\n optional: op.optional,\r\n };\r\n }\r\n }\r\n\r\n // Process brackets (bracket notation: obj[prop], obj?.[prop], or array slices)\r\n const expressions = getAllChildren(cst, 'expression');\r\n let expressionIndex = 0;\r\n\r\n for (let i = 0; i < brackets.length; i++) {\r\n const bracket = brackets[i];\r\n const bracketStart = bracket.startOffset;\r\n\r\n // Check if this bracket is preceded by a QuestionDot (optional chaining)\r\n const isOptional = questionDots.some(qDot => {\r\n // QuestionDot should be immediately before this bracket\r\n return qDot.endOffset < bracketStart && bracketStart - qDot.endOffset <= 1;\r\n });\r\n\r\n // Check if this bracket pair contains a slice\r\n // Find the corresponding RightBracket\r\n const rightBrackets = cst.children.RightBracket || [];\r\n const rightBracket = rightBrackets[i];\r\n\r\n if (!rightBracket) continue;\r\n\r\n // Check for DotDotDot tokens between this bracket pair\r\n const dotDotDotsInRange = dotDotDots.filter(ddd =>\r\n ddd.startOffset > bracketStart && ddd.startOffset < rightBracket.startOffset\r\n );\r\n\r\n // If there's a DotDotDot in this bracket pair, it's a slice\r\n if (dotDotDotsInRange.length > 0) {\r\n // Pattern: [...] - copy entire array (no expressions)\r\n if (expressions.length === expressionIndex) {\r\n object = {\r\n type: 'arraySlice',\r\n object,\r\n start: null,\r\n end: null,\r\n };\r\n continue;\r\n }\r\n\r\n // Pattern: [expression...expression] - slice with start and end (two expressions)\r\n if (expressions.length >= expressionIndex + 2) {\r\n const startExpr = expressions[expressionIndex];\r\n const endExpr = expressions[expressionIndex + 1];\r\n expressionIndex += 2;\r\n object = {\r\n type: 'arraySlice',\r\n object,\r\n start: convertExpression(startExpr),\r\n end: convertExpression(endExpr),\r\n };\r\n continue;\r\n }\r\n\r\n // Pattern: [expression...] - slice from start (one expression)\r\n if (expressions.length === expressionIndex + 1) {\r\n const startExpr = expressions[expressionIndex];\r\n expressionIndex++;\r\n object = {\r\n type: 'arraySlice',\r\n object,\r\n start: convertExpression(startExpr),\r\n end: null,\r\n };\r\n continue;\r\n }\r\n }\r\n\r\n // Pattern: [expression] - regular bracket access\r\n if (expressions.length > expressionIndex) {\r\n const exprCst = expressions[expressionIndex];\r\n expressionIndex++;\r\n const property = convertExpression(exprCst);\r\n object = {\r\n type: 'memberAccess',\r\n object,\r\n property,\r\n computed: true,\r\n optional: isOptional,\r\n };\r\n }\r\n }\r\n\r\n return object;\r\n }\r\n\r\nfunction convertPrimary(cst) {\r\n if (cst.children.literal) {\r\n return convertLiteral(getFirstChild(cst, 'literal'));\r\n }\r\n if (cst.children.arrayLiteral) {\r\n return convertArrayLiteral(getFirstChild(cst, 'arrayLiteral'));\r\n }\r\n if (cst.children.objectLiteral) {\r\n return convertObjectLiteral(getFirstChild(cst, 'objectLiteral'));\r\n }\r\n if (cst.children.arrowFunction) {\r\n return convertArrowFunction(getFirstChild(cst, 'arrowFunction'));\r\n }\r\n if (cst.children.jsxElement) {\r\n return convertJSXElement(getFirstChild(cst, 'jsxElement'));\r\n }\r\n if (cst.children.jsxFragment) {\r\n return convertJSXFragment(getFirstChild(cst, 'jsxFragment'));\r\n }\r\n if (cst.children.parenthesizedExpression) {\r\n const parenCst = getFirstChild(cst, 'parenthesizedExpression');\r\n // Check if it's actually an arrow function (has =>)\r\n if (parenCst.children.Equal && parenCst.children.Equal.length > 0) {\r\n // This is an arrow function: () =>, (a) =>, (x, y) => expr or (x, y) =>\\n ... or (x, ...rest) => expr\r\n const paramList = getFirstChild(parenCst, 'parameterList');\r\n // If there's no parameterList, it's either () => or (a) => (single param)\r\n let parameters = [];\r\n if (paramList) {\r\n parameters = convertParameterList(paramList);\r\n } else {\r\n // Check if there's a single identifier (single param in parens: (a) =>)\r\n // This would be in the expression if it was parsed as a regular expression first\r\n // But since we're in the arrow function branch, we need to check differently\r\n // Actually, single param in parens should be handled by parameterList with one identifier\r\n // Empty param list () => should have no parameters\r\n parameters = [];\r\n }\r\n\r\n // Check if body is a block or expression\r\n const blockStatementCST = getFirstChild(parenCst, 'blockStatement');\r\n const expressionCST = getFirstChild(parenCst, 'expression');\r\n\r\n let body;\r\n if (blockStatementCST) {\r\n // Block body: (x, y) => { ... }\r\n body = {\r\n type: 'blockStatement',\r\n body: getAllChildren(blockStatementCST, 'statement').map(convertStatement),\r\n };\r\n } else if (expressionCST) {\r\n // Expression body: (x, y) => expr\r\n body = convertExpression(expressionCST);\r\n } else {\r\n body = null;\r\n }\r\n\r\n return {\r\n type: 'arrowFunction',\r\n parameters,\r\n body,\r\n };\r\n }\r\n // Regular parenthesized expression\r\n const exprCst = getFirstChild(parenCst, 'expression');\r\n return exprCst ? convertExpression(exprCst) : null;\r\n }\r\n if (cst.children.identifier) {\r\n const id = getFirstChild(cst, 'identifier');\r\n return {\r\n type: 'identifier',\r\n name: id.children.Identifier[0].image,\r\n };\r\n }\r\n return null;\r\n }\r\n\r\nfunction convertLiteral(cst) {\r\n if (cst.children.NumberLiteral) {\r\n const image = cst.children.NumberLiteral[0].image;\r\n let value;\r\n let raw = null;\r\n // Handle hex, binary, and octal literals - preserve original format\r\n if (image.startsWith('0x') || image.startsWith('0X')) {\r\n value = parseInt(image, 16);\r\n raw = image; // Preserve hex format\r\n } else if (image.startsWith('0b') || image.startsWith('0B')) {\r\n value = parseInt(image.slice(2), 2);\r\n raw = image; // Preserve binary format\r\n } else if (image.startsWith('0o') || image.startsWith('0O')) {\r\n value = parseInt(image.slice(2), 8);\r\n raw = image; // Preserve octal format\r\n } else {\r\n value = parseFloat(image);\r\n // For decimal numbers, preserve if it has special formatting (scientific notation, etc.)\r\n if (image.includes('e') || image.includes('E') || image.includes('.')) {\r\n raw = image;\r\n }\r\n }\r\n return { type: 'number', value, raw };\r\n }\r\n if (cst.children.StringLiteral) {\r\n const image = cst.children.StringLiteral[0].image;\r\n const value = image.slice(1, -1); // Remove quotes\r\n return { type: 'string', value };\r\n }\r\n if (cst.children.templateLiteral) {\r\n return convertTemplateLiteral(getFirstChild(cst, 'templateLiteral'));\r\n }\r\n if (cst.children.True) {\r\n return { type: 'boolean', value: true };\r\n }\r\n if (cst.children.False) {\r\n return { type: 'boolean', value: false };\r\n }\r\n if (cst.children.Null) {\r\n return { type: 'null', value: null };\r\n }\r\n return null;\r\n}\r\n\r\n// Convert template literal CST node to AST\r\nfunction convertTemplateLiteral(cst) {\r\n const token = cst.children.TemplateLiteral?.[0];\r\n if (!token) return null;\r\n return convertTemplateLiteralFromToken(token);\r\n}\r\n\r\n// Convert template literal token to AST\r\n// Parses the template literal string to extract quasis and expressions\r\nfunction convertTemplateLiteralFromToken(token) {\r\n const templateText = token.image;\r\n const quasis = [];\r\n const expressions = [];\r\n\r\n // Remove opening and closing backticks\r\n let text = templateText.slice(1, -1);\r\n let pos = 0;\r\n let currentQuasiRaw = ''; // Raw value (with escape sequences as-is)\r\n let currentQuasiCooked = ''; // Cooked value (with escape sequences processed)\r\n let escaped = false;\r\n let braceDepth = 0;\r\n\r\n while (pos < text.length) {\r\n const char = text[pos];\r\n\r\n if (escaped) {\r\n // Handle escape sequences - add to both raw and cooked\r\n currentQuasiRaw += '\\\\' + char; // Keep escape sequence in raw\r\n\r\n // Process escape for cooked value\r\n if (char === '`') {\r\n currentQuasiCooked += '`';\r\n } else if (char === '$') {\r\n currentQuasiCooked += '$';\r\n } else if (char === '{') {\r\n currentQuasiCooked += '{';\r\n } else if (char === '}') {\r\n currentQuasiCooked += '}';\r\n } else if (char === '\\\\') {\r\n currentQuasiCooked += '\\\\';\r\n } else {\r\n // Other escape sequences (like \\n, \\t, etc.)\r\n currentQuasiCooked += '\\\\' + char;\r\n }\r\n escaped = false;\r\n pos++;\r\n continue;\r\n }\r\n\r\n if (char === '\\\\') {\r\n // Don't add backslash yet - wait for next char to determine escape sequence\r\n escaped = true;\r\n pos++;\r\n continue;\r\n }\r\n\r\n // Check for ${ - start of expression\r\n if (char === '$' && pos + 1 < text.length && text[pos + 1] === '{') {\r\n // Save current quasi\r\n quasis.push({\r\n type: 'templateElement',\r\n value: { raw: currentQuasiRaw, cooked: currentQuasiCooked },\r\n tail: false,\r\n });\r\n currentQuasiRaw = '';\r\n currentQuasiCooked = '';\r\n\r\n // Find the matching }\r\n pos += 2; // Skip ${\r\n braceDepth = 1;\r\n let exprStart = pos;\r\n\r\n while (pos < text.length && braceDepth > 0) {\r\n if (text[pos] === '{') {\r\n braceDepth++;\r\n } else if (text[pos] === '}') {\r\n braceDepth--;\r\n if (braceDepth === 0) {\r\n // Found matching }\r\n const exprText = text.substring(exprStart, pos);\r\n // Parse the expression using parseOddoExpression\r\n try {\r\n const exprAST = parseOddoExpression(exprText);\r\n expressions.push(exprAST);\r\n } catch (e) {\r\n // If parsing fails, create an error node\r\n expressions.push({\r\n type: 'error',\r\n message: `Failed to parse expression: ${exprText}`,\r\n });\r\n }\r\n pos++; // Skip }\r\n break;\r\n }\r\n }\r\n pos++;\r\n }\r\n continue;\r\n }\r\n\r\n // Regular character - add to both raw and cooked\r\n currentQuasiRaw += char;\r\n currentQuasiCooked += char;\r\n pos++;\r\n }\r\n\r\n // Add final quasi\r\n quasis.push({\r\n type: 'templateElement',\r\n value: { raw: currentQuasiRaw, cooked: currentQuasiCooked },\r\n tail: true,\r\n });\r\n\r\n return {\r\n type: 'templateLiteral',\r\n quasis,\r\n expressions,\r\n };\r\n}\r\n\r\nfunction convertArrayLiteral(cst) {\r\n const elements = [];\r\n const elementList = getFirstChild(cst, 'arrayElementList');\r\n if (elementList) {\r\n const expressions = getAllChildren(elementList, 'expression');\r\n const dotDotDots = elementList.children.DotDotDot || [];\r\n\r\n // Check each expression - if there's a DotDotDot token right before it (offset-wise), it's a spread\r\n for (let i = 0; i < expressions.length; i++) {\r\n const exprCst = expressions[i];\r\n const exprStart = getFirstTokenOffset(exprCst);\r\n\r\n // Check if there's a DotDotDot token that ends right before this expression starts\r\n const isSpread = exprStart !== undefined && dotDotDots.some(dot => {\r\n const dotEnd = dot.endOffset;\r\n // DotDotDot ends at dotEnd, expression starts at exprStart\r\n // They should be adjacent (with at most 1 whitespace char between)\r\n return Math.abs(dotEnd + 1 - exprStart) <= 1;\r\n });\r\n\r\n if (isSpread) {\r\n elements.push({\r\n type: 'spread',\r\n expression: convertExpression(exprCst),\r\n });\r\n } else {\r\n elements.push(convertExpression(exprCst));\r\n }\r\n }\r\n }\r\n return {\r\n type: 'array',\r\n elements,\r\n };\r\n}\r\n\r\nfunction convertObjectLiteral(cst) {\r\n const properties = [];\r\n const propertyList = getFirstChild(cst, 'objectPropertyList');\r\n if (propertyList) {\r\n properties.push(...getAllChildren(propertyList, 'objectProperty').map(convertObjectProperty));\r\n }\r\n return {\r\n type: 'object',\r\n properties,\r\n };\r\n }\r\n\r\nfunction convertObjectProperty(cst) {\r\n // Check for spread property first: ...expr\r\n if (cst.children.DotDotDot && cst.children.DotDotDot.length > 0) {\r\n const expression = convertExpression(getFirstChild(cst, 'expression'));\r\n return {\r\n type: 'spreadProperty',\r\n argument: expression,\r\n };\r\n }\r\n\r\n // Check for computed key: [expr]: value\r\n if (cst.children.LeftBracket && cst.children.LeftBracket.length > 0) {\r\n // For computed keys, we have two expressions: key and value\r\n // They're stored as SUBRULE1(expression) and SUBRULE2(expression)\r\n const expressions = getAllChildren(cst, 'expression');\r\n const keyExpression = expressions[0] ? convertExpression(expressions[0]) : null;\r\n const valueExpression = expressions[1] ? convertExpression(expressions[1]) : null;\r\n\r\n if (!keyExpression || !valueExpression) {\r\n throw new Error('Computed key property must have both key and value expressions');\r\n }\r\n\r\n return {\r\n type: 'property',\r\n key: keyExpression,\r\n value: valueExpression,\r\n shorthand: false,\r\n computed: true,\r\n };\r\n }\r\n\r\n const identifier = cst.children.Identifier?.[0];\r\n const stringLiteral = cst.children.StringLiteral?.[0];\r\n const hasColon = cst.children.Colon && cst.children.Colon.length > 0;\r\n\r\n if (hasColon) {\r\n // Key-value pair\r\n const key = identifier ? { type: 'identifier', name: identifier.image } :\r\n stringLiteral ? { type: 'string', value: stringLiteral.image.slice(1, -1) } :\r\n null;\r\n const value = convertExpression(getFirstChild(cst, 'expression'));\r\n return {\r\n type: 'property',\r\n key,\r\n value,\r\n shorthand: false,\r\n computed: false,\r\n };\r\n } else {\r\n // Shorthand\r\n if (!identifier) {\r\n // This shouldn't happen in valid syntax, but handle gracefully\r\n return null;\r\n }\r\n const name = identifier.image;\r\n return {\r\n type: 'property',\r\n key: { type: 'identifier', name },\r\n value: { type: 'identifier', name },\r\n shorthand: true,\r\n computed: false,\r\n };\r\n }\r\n }\r\n\r\nfunction convertArrowFunction(cst) {\r\n let parameters = [];\r\n\r\n // Check if it's a single parameter (Identifier directly in arrowFunction)\r\n if (cst.children.Identifier && cst.children.Identifier.length === 1 && !cst.children.LeftParen) {\r\n // Single parameter without parens: x =>\r\n parameters = [{\r\n type: 'parameter',\r\n name: cst.children.Identifier[0].image,\r\n }];\r\n } else if (cst.children.arrowFunctionParams) {\r\n // Has arrowFunctionParams subrule\r\n const paramsCST = getFirstChild(cst, 'arrowFunctionParams');\r\n if (paramsCST && paramsCST.children.Identifier && paramsCST.children.Identifier.length === 1 && !paramsCST.children.LeftParen) {\r\n // Single parameter without parens\r\n parameters = [{\r\n type: 'parameter',\r\n name: paramsCST.children.Identifier[0].image,\r\n }];\r\n } else if (paramsCST) {\r\n // Multiple parameters with parens\r\n const paramList = getFirstChild(paramsCST, 'parameterList');\r\n if (paramList) {\r\n parameters = convertParameterList(paramList);\r\n }\r\n }\r\n } else if (cst.children.LeftParen) {\r\n // Multi-parameter with parens: (x, y) => or (x, ...rest) =>\r\n const paramList = getFirstChild(cst, 'parameterList');\r\n if (paramList) {\r\n parameters = convertParameterList(paramList);\r\n }\r\n }\r\n\r\n // Check if body is a block or expression\r\n const blockStatementCST = getFirstChild(cst, 'blockStatement');\r\n const expressionCST = getFirstChild(cst, 'expression');\r\n\r\n let body;\r\n if (blockStatementCST) {\r\n // Block body: x => { ... }\r\n body = {\r\n type: 'blockStatement',\r\n body: getAllChildren(blockStatementCST, 'statement').map(convertStatement),\r\n };\r\n } else if (expressionCST) {\r\n // Expression body: x => expr\r\n body = convertExpression(expressionCST);\r\n } else {\r\n body = null;\r\n }\r\n\r\n return {\r\n type: 'arrowFunction',\r\n parameters,\r\n body,\r\n };\r\n }\r\n\r\nfunction convertParameterList(cst) {\r\n if (!cst) return [];\r\n const parameters = [];\r\n\r\n // Get all possible parameter types\r\n const identifiers = cst.children.Identifier || [];\r\n const dotDotDots = cst.children.DotDotDot || [];\r\n const equals = cst.children.Equal || [];\r\n const destructuringPatterns = getAllChildren(cst, 'destructuringPattern');\r\n const commas = cst.children.Comma || [];\r\n // Expressions in OPTION subrules are stored as direct children\r\n // When using OPTION(() => { SUBRULE(expression) }), Chevrotain stores them as cst.children.expression\r\n const expressions = cst.children.expression || [];\r\n\r\n // Helper to get expression start offset from various nested structures\r\n const getExprStart = (expr) => {\r\n if (!expr) return null;\r\n if (expr.startOffset) return expr.startOffset;\r\n\r\n // Try to find from nested children - check number literals first (most common for defaults)\r\n const numberLit = expr.children?.number?.[0]?.children?.NumberLiteral?.[0];\r\n if (numberLit?.startOffset) return numberLit.startOffset;\r\n\r\n // Try identifier\r\n const identifier = expr.children?.identifier?.[0]?.children?.Identifier?.[0];\r\n if (identifier?.startOffset) return identifier.startOffset;\r\n\r\n // Try literal (which contains number/string/etc)\r\n const literal = expr.children?.literal?.[0];\r\n if (literal) {\r\n const litNumber = literal.children?.NumberLiteral?.[0];\r\n if (litNumber?.startOffset) return litNumber.startOffset;\r\n }\r\n\r\n // Try deeper nesting through assignment/conditional/etc\r\n const assignment = expr.children?.assignment?.[0];\r\n if (assignment) {\r\n const nestedId = assignment.children?.conditional?.[0]?.children?.logicalOr?.[0]?.children?.pipe?.[0]?.children?.compose?.[0]?.children?.nullishCoalescing?.[0]?.children?.logicalAnd?.[0]?.children?.equality?.[0]?.children?.relational?.[0]?.children?.additive?.[0]?.children?.multiplicative?.[0]?.children?.exponentiation?.[0]?.children?.unary?.[0]?.children?.postfix?.[0]?.children?.functionCall?.[0]?.children?.memberAccess?.[0]?.children?.primary?.[0]?.children?.identifier?.[0]?.children?.Identifier?.[0];\r\n if (nestedId?.startOffset) return nestedId.startOffset;\r\n }\r\n\r\n return null;\r\n };\r\n\r\n // Process parameters in order by their position in the source\r\n // Collect all parameter candidates and sort by start offset\r\n const paramCandidates = [];\r\n\r\n // Add rest parameters\r\n for (const dotDotDot of dotDotDots) {\r\n const restId = identifiers.find(id => id.startOffset > dotDotDot.startOffset);\r\n if (restId) {\r\n paramCandidates.push({\r\n type: 'rest',\r\n start: dotDotDot.startOffset,\r\n id: restId,\r\n });\r\n }\r\n }\r\n\r\n // Add destructuring patterns\r\n for (const pattern of destructuringPatterns) {\r\n // Get the actual start offset from the opening bracket/brace\r\n const leftBracket = pattern.children?.LeftBracket?.[0];\r\n const leftBrace = pattern.children?.LeftBrace?.[0];\r\n const patternStart = leftBracket?.startOffset || leftBrace?.startOffset || pattern.startOffset || 0;\r\n paramCandidates.push({\r\n type: 'destructuring',\r\n start: patternStart,\r\n pattern,\r\n });\r\n }\r\n\r\n // Add identifier parameters (but exclude those that are part of rest params or destructuring)\r\n for (const id of identifiers) {\r\n // Check if this identifier is part of a rest parameter\r\n const isRestId = dotDotDots.some(dot => {\r\n const dotEnd = dot.endOffset || (dot.startOffset + 3);\r\n return id.startOffset > dot.startOffset && id.startOffset < dotEnd + 5;\r\n });\r\n\r\n // Check if this identifier is inside a destructuring pattern\r\n const isInPattern = destructuringPatterns.some(pattern => {\r\n const patternStart = pattern.startOffset;\r\n // Try to get actual end offset from the pattern's children\r\n let patternEnd = pattern.endOffset;\r\n if (!patternEnd) {\r\n // Try to find the closing bracket/brace\r\n const rightBracket = pattern.children?.RightBracket?.[0];\r\n const rightBrace = pattern.children?.RightBrace?.[0];\r\n patternEnd = rightBracket?.endOffset || rightBrace?.endOffset || (patternStart + 1000);\r\n }\r\n return id.startOffset >= patternStart && id.startOffset <= patternEnd;\r\n });\r\n\r\n if (!isRestId && !isInPattern) {\r\n paramCandidates.push({\r\n type: 'identifier',\r\n start: id.startOffset,\r\n id,\r\n });\r\n }\r\n }\r\n\r\n // Sort by start offset to process in order\r\n paramCandidates.sort((a, b) => a.start - b.start);\r\n\r\n // Process each parameter in order\r\n let exprIndex = 0;\r\n for (let i = 0; i < paramCandidates.length; i++) {\r\n const candidate = paramCandidates[i];\r\n const nextComma = commas.find(c => c.startOffset > candidate.start);\r\n const nextCommaStart = nextComma ? nextComma.startOffset : Infinity;\r\n const nextCandidate = i < paramCandidates.length - 1 ? paramCandidates[i + 1] : null;\r\n const nextCandidateStart = nextCandidate ? nextCandidate.start : Infinity;\r\n const boundary = Math.min(nextCommaStart, nextCandidateStart);\r\n\r\n if (candidate.type === 'rest') {\r\n parameters.push({\r\n type: 'restElement',\r\n argument: {\r\n type: 'identifier',\r\n name: candidate.id.image,\r\n },\r\n });\r\n // Rest must be last\r\n break;\r\n } else if (candidate.type === 'destructuring') {\r\n const patternAST = convertDestructuringPattern(candidate.pattern);\r\n\r\n // Check for default value\r\n const patternEnd = candidate.pattern.endOffset || (candidate.pattern.startOffset + 100);\r\n const patternEqual = equals.find(eq =>\r\n eq.startOffset > patternEnd && eq.startOffset < boundary\r\n );\r\n\r\n let defaultValue = null;\r\n if (patternEqual && exprIndex < expressions.length) {\r\n defaultValue = convertExpression(expressions[exprIndex]);\r\n exprIndex++;\r\n }\r\n\r\n parameters.push({\r\n type: 'destructuringPattern',\r\n pattern: patternAST,\r\n default: defaultValue,\r\n });\r\n } else if (candidate.type === 'identifier') {\r\n // Regular identifier parameter\r\n const id = candidate.id;\r\n const idEnd = id.endOffset || (id.startOffset + id.image.length);\r\n const paramEqual = equals.find(eq =>\r\n eq.startOffset > idEnd && eq.startOffset < boundary\r\n );\r\n\r\n let defaultValue = null;\r\n if (paramEqual && exprIndex < expressions.length) {\r\n defaultValue = convertExpression(expressions[exprIndex]);\r\n exprIndex++;\r\n }\r\n\r\n parameters.push({\r\n type: 'parameter',\r\n name: id.image,\r\n default: defaultValue,\r\n });\r\n }\r\n }\r\n\r\n return parameters;\r\n}\r\n\r\nfunction convertJSXElement(cst) {\r\n const nameCST = getFirstChild(cst, 'jsxElementName');\r\n const identifiers = nameCST.children.Identifier || [];\r\n const dots = nameCST.children.Dot || [];\r\n const minuses = nameCST.children.Minus || [];\r\n\r\n // Build the name by joining identifiers with dots or hyphens\r\n // Sort tokens by position to determine the correct separator\r\n const tokens = [];\r\n identifiers.forEach(id => tokens.push({ type: 'id', token: id }));\r\n dots.forEach(dot => tokens.push({ type: 'dot', token: dot }));\r\n minuses.forEach(minus => tokens.push({ type: 'minus', token: minus }));\r\n\r\n tokens.sort((a, b) => a.token.startOffset - b.token.startOffset);\r\n\r\n let name = '';\r\n for (let i = 0; i < tokens.length; i++) {\r\n const token = tokens[i];\r\n if (token.type === 'id') {\r\n if (name) {\r\n // Check what separator comes before this identifier\r\n const prevToken = tokens[i - 1];\r\n if (prevToken && prevToken.type === 'dot') {\r\n name += '.';\r\n } else if (prevToken && prevToken.type === 'minus') {\r\n name += '-';\r\n }\r\n }\r\n name += token.token.image;\r\n }\r\n }\r\n\r\n const attributes = getAllChildren(cst, 'jsxAttribute').map(convertJSXAttribute);\r\n\r\n const isSelfClosing = cst.children.JSXSelfClosing && cst.children.JSXSelfClosing.length > 0;\r\n\r\n let children = [];\r\n if (!isSelfClosing) {\r\n children = getAllChildren(cst, 'jsxChild')\r\n .map(convertJSXChild)\r\n .filter(child => child !== null); // Filter out null children (empty text nodes)\r\n }\r\n\r\n return {\r\n type: 'jsxElement',\r\n name,\r\n attributes,\r\n children,\r\n selfClosing: isSelfClosing || false, // Explicitly set to false for non-self-closing elements\r\n };\r\n }\r\n\r\n/**\r\n * Convert Oddo JSX fragment to AST\r\n */\r\nfunction convertJSXFragment(cst) {\r\n // JSX Fragment: <> ... </>\r\n // No element name, no attributes, just children\r\n const childrenCST = getAllChildren(cst, 'jsxChild');\r\n const children = childrenCST\r\n .map(convertJSXChild)\r\n .filter(child => child !== null); // Filter out null children (empty text nodes)\r\n\r\n return {\r\n type: 'jsxFragment',\r\n children,\r\n };\r\n}\r\n\r\nfunction convertJSXAttribute(cst) {\r\n if (cst.children.LeftBrace) {\r\n // Spread attribute\r\n const expression = convertExpression(getFirstChild(cst, 'expression'));\r\n return {\r\n type: 'jsxSpread',\r\n expression,\r\n };\r\n } else {\r\n // Regular attribute\r\n // Attribute names can contain hyphens: data-value, aria-label, etc.\r\n const identifiers = cst.children.Identifier || [];\r\n const minuses = cst.children.Minus || [];\r\n\r\n // Build the attribute name by joining identifiers with hyphens\r\n let name = identifiers[0]?.image || '';\r\n for (let i = 0; i < minuses.length && i + 1 < identifiers.length; i++) {\r\n name += '-' + identifiers[i + 1].image;\r\n }\r\n\r\n const valueCST = getFirstChild(cst, 'jsxAttributeValue');\r\n\r\n let value = { type: 'boolean', value: true }; // Default\r\n if (valueCST) {\r\n if (valueCST.children.StringLiteral) {\r\n const image = valueCST.children.StringLiteral[0].image;\r\n value = { type: 'string', value: image.slice(1, -1) };\r\n } else if (valueCST.children.LeftBrace) {\r\n const expr = convertExpression(getFirstChild(valueCST, 'expression'));\r\n value = { type: 'expression', value: expr };\r\n }\r\n }\r\n\r\n return {\r\n type: 'jsxAttribute',\r\n name,\r\n value,\r\n };\r\n }\r\n }\r\n\r\n/**\r\n * Decode HTML entities in JSX text\r\n * Supports named entities (&nbsp;, &lt;, etc.) and numeric entities (&#160;, &#xA0;)\r\n */\r\nfunction decodeHTMLEntities(text) {\r\n // Common named HTML entities\r\n const entities = {\r\n 'nbsp': '\\u00A0', // non-breaking space\r\n 'lt': '<',\r\n 'gt': '>',\r\n 'amp': '&',\r\n 'quot': '\"',\r\n 'apos': \"'\",\r\n 'cent': '\\u00A2', // ¢\r\n 'pound': '\\u00A3', // £\r\n 'yen': '\\u00A5', // ¥\r\n 'euro': '\\u20AC', // €\r\n 'copy': '\\u00A9', // ©\r\n 'reg': '\\u00AE', // ®\r\n 'trade': '\\u2122', // ™\r\n 'mdash': '\\u2014', // —\r\n 'ndash': '\\u2013', // –\r\n 'hellip': '\\u2026', // …\r\n 'laquo': '\\u00AB', // «\r\n 'raquo': '\\u00BB', // »\r\n 'ldquo': '\\u201C', // \"\r\n 'rdquo': '\\u201D', // \"\r\n 'lsquo': '\\u2018', // '\r\n 'rsquo': '\\u2019', // '\r\n 'bull': '\\u2022', // •\r\n 'deg': '\\u00B0', // °\r\n 'plusmn': '\\u00B1', // ±\r\n 'times': '\\u00D7', // ×\r\n 'divide': '\\u00F7', // ÷\r\n 'ne': '\\u2260', // ≠\r\n 'le': '\\u2264', // ≤\r\n 'ge': '\\u2265', // ≥\r\n 'infin': '\\u221E', // ∞\r\n 'sum': '\\u2211', // ∑\r\n 'prod': '\\u220F', // ∏\r\n 'larr': '\\u2190', // ←\r\n 'uarr': '\\u2191', // ↑\r\n 'rarr': '\\u2192', // →\r\n 'darr': '\\u2193', // ↓\r\n 'harr': '\\u2194', // ↔\r\n };\r\n\r\n return text.replace(/&([a-zA-Z]+|#\\d+|#x[0-9a-fA-F]+);/g, (match, entity) => {\r\n // Numeric entity (decimal): &#160;\r\n if (entity.startsWith('#x')) {\r\n // Hexadecimal: &#xA0;\r\n const code = parseInt(entity.substring(2), 16);\r\n return String.fromCharCode(code);\r\n } else if (entity.startsWith('#')) {\r\n // Decimal: &#160;\r\n const code = parseInt(entity.substring(1), 10);\r\n return String.fromCharCode(code);\r\n } else {\r\n // Named entity: &nbsp;\r\n return entities[entity] || match; // Return original if not found\r\n }\r\n });\r\n}\r\n\r\nfunction convertJSXChild(cst) {\r\n if (cst.children.jsxElement) {\r\n return convertJSXElement(getFirstChild(cst, 'jsxElement'));\r\n }\r\n if (cst.children.jsxFragment) {\r\n return convertJSXFragment(getFirstChild(cst, 'jsxFragment'));\r\n }\r\n if (cst.children.LeftBrace) {\r\n // Check if this is an empty expression {} (JSX comment)\r\n const expressionCST = getFirstChild(cst, 'expression');\r\n if (!expressionCST) {\r\n // Empty expression {} - represents JSX comment, return null to skip it\r\n return null;\r\n }\r\n const expression = convertExpression(expressionCST);\r\n return {\r\n type: 'jsxExpression',\r\n expression,\r\n };\r\n }\r\n // JSX text: collect ALL tokens from the CST and concatenate their images\r\n // Since we now consume ANY token type, we need to collect all children that aren't\r\n // jsxElement or LeftBrace (which are handled above)\r\n const allTokens = [];\r\n\r\n // Iterate through all children of the CST node\r\n // Collect any token that's not a subrule (jsxElement) or LeftBrace\r\n for (const key in cst.children) {\r\n // Skip subrules and LeftBrace (already handled)\r\n if (key === 'jsxElement' || key === 'LeftBrace') {\r\n continue;\r\n }\r\n // Collect all tokens of this type\r\n if (cst.children[key] && Array.isArray(cst.children[key])) {\r\n cst.children[key].forEach(token => {\r\n if (token && token.image !== undefined) {\r\n allTokens.push({ token, offset: token.startOffset });\r\n }\r\n });\r\n }\r\n }\r\n\r\n if (allTokens.length > 0) {\r\n // Sort tokens by position to maintain order\r\n allTokens.sort((a, b) => a.offset - b.offset);\r\n\r\n // Concatenate token images, preserving whitespace between tokens\r\n // When the lexer skips whitespace, we need to detect gaps and insert spaces\r\n let textValue = '';\r\n for (let i = 0; i < allTokens.length; i++) {\r\n const current = allTokens[i];\r\n\r\n if (i > 0) {\r\n const previous = allTokens[i - 1];\r\n // Calculate the end offset of the previous token\r\n const previousEnd = previous.token.endOffset !== undefined\r\n ? previous.token.endOffset\r\n : previous.token.startOffset + previous.token.image.length - 1;\r\n\r\n // Check if there's a gap between tokens (whitespace was skipped)\r\n if (current.token.startOffset > previousEnd + 1) {\r\n // Insert a space to preserve the original spacing\r\n textValue += ' ';\r\n }\r\n }\r\n\r\n textValue += current.token.image;\r\n }\r\n\r\n // Decode HTML entities\r\n const decodedValue = decodeHTMLEntities(textValue);\r\n return {\r\n type: 'jsxText',\r\n value: decodedValue,\r\n };\r\n }\r\n return null;\r\n}\r\n\r\nfunction convertCSTToAST(cst) {\r\n if (!cst) return null;\r\n\r\n // Entry point - convert program CST to AST\r\n if (cst.name === 'program') {\r\n const statements = getAllChildren(cst, 'statement').map(convertStatement);\r\n return {\r\n type: 'program',\r\n body: statements,\r\n };\r\n }\r\n return null;\r\n}\r\n\r\nexport { convertCSTToAST };\r\n"," /**\n * Oddo Language Compiler\n * Compiles Oddo AST to JavaScript using Babel\n */\n\nimport _generate from '@babel/generator';\nimport _traverse from '@babel/traverse';\nimport * as t from '@babel/types';\n\nconst generate = _generate.default || _generate;\nconst traverse = _traverse.default || _traverse;\n\n// Helper function to extract identifiers from a Babel AST expression\nfunction extractIdentifiers(babelNode) {\n const identifiers = new Set();\n const locals = new Set(); // Track locally bound identifiers\n\n function traverse(node) {\n if (!node) return;\n\n if (t.isIdentifier(node)) {\n // Skip local bindings and internal placeholders\n if (!locals.has(node.name) && !node.name.startsWith('__ODDO_IMPORT_')) {\n identifiers.add(node.name);\n }\n } else if (t.isMemberExpression(node) || t.isOptionalMemberExpression(node)) {\n traverse(node.object);\n if (node.computed) traverse(node.property);\n } else if (t.isCallExpression(node) || t.isOptionalCallExpression(node)) {\n traverse(node.callee);\n node.arguments?.forEach(arg => traverse(arg));\n } else if (t.isBinaryExpression(node) || t.isLogicalExpression(node)) {\n traverse(node.left);\n traverse(node.right);\n } else if (t.isUnaryExpression(node)) {\n traverse(node.argument);\n } else if (t.isConditionalExpression(node)) {\n traverse(node.test);\n traverse(node.consequent);\n traverse(node.alternate);\n } else if (t.isArrayExpression(node)) {\n node.elements?.forEach(el => traverse(el));\n } else if (t.isObjectExpression(node)) {\n node.properties?.forEach(prop => {\n if (t.isObjectProperty(prop)) {\n if (prop.computed) traverse(prop.key);\n traverse(prop.value);\n } else if (t.isSpreadElement(prop)) {\n traverse(prop.argument);\n }\n });\n } else if (t.isArrowFunctionExpression(node)) {\n // Collect params as locals, then traverse body\n node.params.forEach(p => {\n if (t.isIdentifier(p)) locals.add(p.name);\n else if (t.isObjectPattern(p)) p.properties.forEach(prop => t.isIdentifier(prop.value) && locals.add(prop.value.name));\n else if (t.isArrayPattern(p)) p.elements?.forEach(el => t.isIdentifier(el) && locals.add(el.name));\n });\n if (t.isBlockStatement(node.body)) node.body.body.forEach(s => traverse(s));\n else traverse(node.body);\n } else if (t.isBlockStatement(node)) {\n node.body.forEach(s => traverse(s));\n } else if (t.isExpressionStatement(node)) {\n traverse(node.expression);\n } else if (t.isReturnStatement(node)) {\n traverse(node.argument);\n } else if (t.isSequenceExpression(node)) {\n node.expressions.forEach(expr => traverse(expr));\n } else if (t.isUpdateExpression(node)) {\n traverse(node.argument);\n } else if (t.isAssignmentExpression(node)) {\n traverse(node.left);\n traverse(node.right);\n } else if (t.isSpreadElement(node)) {\n traverse(node.argument);\n }\n }\n\n traverse(babelNode);\n return Array.from(identifiers);\n}\n\n// Wrap dependency references with call expressions: x -> x()\nfunction wrapDependenciesWithCalls(arrowFunc, deps) {\n const depSet = new Set(deps);\n const locals = new Set();\n\n const tempFile = t.file(t.program([t.expressionStatement(arrowFunc)]));\n\n // Collect local bindings from nested arrow functions\n traverse(tempFile, {\n noScope: true,\n ArrowFunctionExpression(path) {\n if (path.node !== arrowFunc) {\n path.node.params.forEach(p => t.isIdentifier(p) && locals.add(p.name));\n }\n }\n });\n\n // Collect and replace identifiers (skip params and object keys)\n const toReplace = [];\n const shorthandToExpand = [];\n traverse(tempFile, {\n noScope: true,\n Identifier(path) {\n // Skip if this is a param of the main arrow function\n if (t.isArrowFunctionExpression(path.parent) && path.parent.params.includes(path.node)) {\n return;\n }\n const parent = path.parent;\n // Skip member expression properties (non-computed)\n const isMemberProp = t.isMemberExpression(parent) && parent.property === path.node && !parent.computed;\n // Skip object property keys (non-shorthand)\n const isObjectKey = t.isObjectProperty(parent) && parent.key === path.node && !parent.shorthand;\n // Handle shorthand properties specially: { c } -> { c: c() }\n const isShorthand = t.isObjectProperty(parent) && parent.shorthand && parent.key === path.node;\n\n if (depSet.has(path.node.name) && !isMemberProp && !isObjectKey && !locals.has(path.node.name)) {\n if (isShorthand) {\n shorthandToExpand.push({ prop: parent, name: path.node.name });\n } else {\n toReplace.push(path);\n }\n }\n }\n });\n // Expand shorthand properties: { c } -> { c: c() }\n shorthandToExpand.forEach(({ prop, name }) => {\n prop.shorthand = false;\n prop.value = t.callExpression(t.identifier(name), []);\n });\n toReplace.forEach(p => p.replaceWith(t.callExpression(t.identifier(p.node.name), [])));\n}\n\n// Check if an identifier is known to be non-reactive (@mutable or normal declaration)\n// Uses scope-based lookup with prototypal inheritance\nfunction isKnownNonReactive(name) {\n return isNonReactive(name);\n}\n\n// Filter identifiers to get only potentially reactive ones\n// Excludes: undeclared/globals, @mutable, normal declarations\n// Includes: @state, @computed, function params\nfunction getReactiveDeps(identifiers) {\n return identifiers.filter(id => {\n // Undeclared/global → non-reactive (not in any scope)\n if (!isDeclared(id)) {\n return false;\n }\n // Known non-reactive (@mutable, immutable) → non-reactive\n if (isNonReactive(id)) {\n return false;\n }\n // Known reactive (state, computed, param) → include\n return true;\n });\n}\n\n// Create a lifted expression: _lift((deps...) => expr, [deps...])\n// For functions: _liftFn((deps..., originalParams...) => body, [deps...])\n// NO transformation of expression body - runtime handles unwrapping\nfunction createLiftedExpr(valueExpr, identifiers) {\n const reactiveDeps = getReactiveDeps(identifiers);\n \n if (reactiveDeps.length === 0) {\n // No reactive deps - return expression as-is\n return null;\n }\n \n const depParams = reactiveDeps.map(id => t.identifier(id));\n const depsArray = reactiveDeps.map(id => t.identifier(id));\n \n // Check if valueExpr is a function expression\n if (t.isArrowFunctionExpression(valueExpr)) {\n // For functions: use _liftFn, prepend reactive deps to existing params\n usedModifiers.add('liftFn');\n \n // Prepend reactive dep params to original function params\n const newParams = [...depParams, ...valueExpr.params];\n const liftedFunc = t.arrowFunctionExpression(newParams, valueExpr.body);\n \n return t.callExpression(\n t.identifier(modifierAliases['liftFn']),\n [liftedFunc, t.arrayExpression(depsArray)]\n );\n }\n \n // For non-functions: use _lift\n usedModifiers.add('lift');\n const arrowFunc = t.arrowFunctionExpression(depParams, valueExpr);\n \n return t.callExpression(\n t.identifier(modifierAliases['lift']),\n [arrowFunc, t.arrayExpression(depsArray)]\n );\n}\n\n// Create a reactive expression call: _x((deps...) => expr with deps(), [deps...])\nfunction createReactiveExpr(valueExpr, attrExpression = false) {\n const identifiers = extractIdentifiers(valueExpr);\n const pragma = attrExpression ? 'computed' : 'x'\n\n if (identifiers.length === 0) {\n // No dependencies - just return the expression directly if it's a literal\n if (t.isLiteral(valueExpr)) {\n return valueExpr;\n }\n // Otherwise wrap with empty deps\n usedModifiers.add(pragma);\n const arrowFunc = t.arrowFunctionExpression([], valueExpr);\n return t.callExpression(\n t.identifier(modifierAliases[pragma]),\n [arrowFunc, t.arrayExpression([])]\n );\n }\n\n usedModifiers.add(pragma);\n const params = identifiers.map(id => t.identifier(id));\n const deps = identifiers.map(id => t.identifier(id));\n const arrowFunc = t.arrowFunctionExpression(params, valueExpr);\n wrapDependenciesWithCalls(arrowFunc, identifiers);\n\n return t.callExpression(\n t.identifier(modifierAliases[pragma]),\n [arrowFunc, t.arrayExpression(deps)]\n );\n}\n\n// Modifier transformations map\n// Maps modifier names to transformation functions\nconst MODIFIER_TRANSFORMATIONS = {\n state: {\n needsImport: true,\n // @state x = 3 -> const [x, setX] = _state(3);\n transform: (valueExpr, leftExpr) => {\n const stateCall = t.callExpression(\n t.identifier(modifierAliases['state']),\n [valueExpr]\n );\n\n // If there's a left side (variable name), create array destructuring\n if (leftExpr && t.isIdentifier(leftExpr)) {\n const getterName = leftExpr.name;\n const setterBaseName = 'set' + getterName.charAt(0).toUpperCase() + getterName.slice(1);\n const setterName = generateUniqueId(setterBaseName);\n\n // Track state-to-setter mapping for @mutate validation\n stateSetterMap.set(getterName, setterName);\n\n return t.variableDeclaration('const', [\n t.variableDeclarator(\n t.arrayPattern([\n t.identifier(getterName),\n t.identifier(setterName)\n ]),\n stateCall\n )\n ]);\n }\n return t.expressionStatement(stateCall);\n },\n },\n computed: {\n needsImport: true,\n // @computed sum = x + y -> const sum = _computed((x, y) => x() + y(), [x, y])\n transform: (valueExpr, leftExpr) => {\n const identifiers = extractIdentifiers(valueExpr);\n const params = identifiers.map(id => t.identifier(id));\n const deps = identifiers.map(id => t.identifier(id));\n\n const arrowFunc = t.arrowFunctionExpression(params, valueExpr);\n\n // Wrap dependency references with call expressions\n wrapDependenciesWithCalls(arrowFunc, identifiers);\n\n const computedCall = t.callExpression(\n t.identifier(modifierAliases['computed']),\n [arrowFunc, t.arrayExpression(deps)]\n );\n\n if (leftExpr && t.isIdentifier(leftExpr)) {\n // Variable is already tracked in scope during pre-pass\n return t.variableDeclaration('const', [\n t.variableDeclarator(leftExpr, computedCall)\n ]);\n }\n return t.expressionStatement(computedCall);\n },\n },\n react: {\n needsImport: true,\n // @react sum = x + y -> const sum = _react((x, y) => x() + y(), [x, y])\n transform: (valueExpr, leftExpr) => {\n const identifiers = extractIdentifiers(valueExpr);\n const params = identifiers.map(id => t.identifier(id));\n const deps = identifiers.map(id => t.identifier(id));\n\n const arrowFunc = t.arrowFunctionExpression(params, valueExpr);\n\n // Wrap dependency references with call expressions\n wrapDependenciesWithCalls(arrowFunc, identifiers);\n\n const reactCall = t.callExpression(\n t.identifier(modifierAliases['react']),\n [arrowFunc, t.arrayExpression(deps)]\n );\n\n if (leftExpr) {\n return t.variableDeclaration('const', [\n t.variableDeclarator(leftExpr, reactCall)\n ]);\n }\n return t.expressionStatement(reactCall);\n },\n },\n mutate: {\n needsImport: true,\n // @mutate x = (arg1, arg2) => { x1 := value1; x2 := value2 }\n // -> const x = mutate((finalizer, x1, x2, ...outerDeps, arg1, arg2) => { ... }, finalizerFn, stateContainers, outerDeps)\n transform: (oddoExpr, leftExpr) => {\n // mutate must be an arrow function (Oddo AST)\n if (oddoExpr.type !== 'arrowFunction') {\n throw new Error('@mutate modifier must be a function');\n }\n\n // Extract function parameters\n const funcParams = (oddoExpr.parameters || []).map(p => p.name);\n\n // Find all := assignments in the function body\n // Each assignment has a 'kind': 'state' or 'mutable'\n const assignments = [];\n const bodyStatements = oddoExpr.body?.body || [];\n\n for (const stmt of bodyStatements) {\n if (stmt.type === 'expressionStatement' &&\n stmt.expression?.type === 'assignment' &&\n stmt.expression?.operator === ':=') {\n const leftName = stmt.expression.left?.name;\n if (!leftName) {\n throw new Error('@mutate: := assignment must have an identifier on the left side');\n }\n \n // Check if it's a @state or @mutable variable\n if (stateSetterMap.has(leftName)) {\n assignments.push({\n name: leftName,\n kind: 'state',\n setter: stateSetterMap.get(leftName),\n rightOddo: stmt.expression.right\n });\n } else if (mutableVariables.has(leftName)) {\n assignments.push({\n name: leftName,\n kind: 'mutable',\n rightOddo: stmt.expression.right\n });\n } else {\n throw new Error(`@mutate: Cannot mutate '${leftName}': not a @state or @mutable variable in current scope`);\n }\n }\n }\n\n if (assignments.length === 0) {\n throw new Error('@mutate function must contain at least one := assignment');\n }\n\n // Separate state and mutable assignments\n const stateAssignments = assignments.filter(a => a.kind === 'state');\n const mutableAssignments = assignments.filter(a => a.kind === 'mutable');\n \n // Only state containers need special handling\n const stateContainerNames = stateAssignments.map(a => a.name);\n const allAssignmentNames = assignments.map(a => a.name);\n\n // Collect outer dependencies from all := right-hand sides\n // Exclude @mutable variables from callable deps (they're plain values)\n const outerDeps = new Set();\n for (const assignment of assignments) {\n collectOddoIdentifiers(assignment.rightOddo).forEach(id => {\n if (!funcParams.includes(id) && !allAssignmentNames.includes(id)) {\n outerDeps.add(id);\n }\n });\n }\n const outerDepsArray = Array.from(outerDeps);\n\n // Build the mutate function body\n // Parameters: (finalizer, ...stateContainers, ...outerDeps, ...originalParams)\n const mutateParams = [\n t.identifier('finalizer'),\n ...stateContainerNames.map(n => t.identifier(n)),\n ...outerDepsArray.map(n => t.identifier(n)),\n ...funcParams.map(n => t.identifier(n))\n ];\n\n // Build body statements\n const mutateBodyStmts = [];\n \n // Only add stateProxy if we have state assignments\n if (stateAssignments.length > 0) {\n usedModifiers.add('stateProxy');\n }\n\n // Set of all identifiers that need to be called with ()\n // This includes: state containers, outer deps that are NOT @mutable\n const callableIds = new Set([\n ...stateContainerNames,\n ...outerDepsArray.filter(id => !mutableVariables.has(id))\n ]);\n\n for (const assignment of assignments) {\n // Convert right side to Babel AST\n const rightBabel = convertExpression(assignment.rightOddo);\n\n // Wrap identifiers that are callable (reactive containers) with ()\n const tempFile = t.file(t.program([t.expressionStatement(rightBabel)]));\n const toReplace = [];\n const shorthandToExpand = [];\n traverse(tempFile, {\n noScope: true,\n Identifier(path) {\n const parent = path.parent;\n const isMemberProp = t.isMemberExpression(parent) && parent.property === path.node && !parent.computed;\n const isObjectKey = t.isObjectProperty(parent) && parent.key === path.node && !parent.shorthand;\n const isShorthand = t.isObjectProperty(parent) && parent.shorthand && parent.key === path.node;\n\n if (callableIds.has(path.node.name) && !isMemberProp && !isObjectKey) {\n if (isShorthand) {\n shorthandToExpand.push({ prop: parent, name: path.node.name });\n } else {\n toReplace.push(path);\n }\n }\n }\n });\n shorthandToExpand.forEach(({ prop, name }) => {\n prop.shorthand = false;\n prop.value = t.callExpression(t.identifier(name), []);\n });\n toReplace.forEach(p => p.replaceWith(t.callExpression(t.identifier(p.node.name), [])));\n\n // Get the modified expression from tempFile\n const wrappedRightExpr = tempFile.program.body[0].expression;\n\n if (assignment.kind === 'state') {\n // stateContainer = stateProxy(rightExpr)\n mutateBodyStmts.push(\n t.expressionStatement(\n t.assignmentExpression(\n '=',\n t.identifier(assignment.name),\n t.callExpression(\n t.identifier(modifierAliases['stateProxy']),\n [wrappedRightExpr]\n )\n )\n )\n );\n } else {\n // mutable: direct assignment\n mutateBodyStmts.push(\n t.expressionStatement(\n t.assignmentExpression(\n '=',\n t.identifier(assignment.name),\n wrappedRightExpr\n )\n )\n );\n }\n }\n\n // Add finalizer call only for state containers: finalizer(x1(), x2(), x3())\n if (stateContainerNames.length > 0) {\n mutateBodyStmts.push(\n t.expressionStatement(\n t.callExpression(\n t.identifier('finalizer'),\n stateContainerNames.map(n => t.callExpression(t.identifier(n), []))\n )\n )\n );\n }\n\n const mutateArrowFunc = t.arrowFunctionExpression(\n mutateParams,\n t.blockStatement(mutateBodyStmts)\n );\n\n // Build finalizer function for state assignments only\n const finalizerParams = stateContainerNames.map(n => t.identifier(n));\n const finalizerCalls = stateAssignments.map(a =>\n t.callExpression(t.identifier(a.setter), [t.identifier(a.name)])\n );\n const finalizerBody = finalizerCalls.length === 0\n ? t.identifier('undefined')\n : finalizerCalls.length === 1\n ? finalizerCalls[0]\n : t.sequenceExpression(finalizerCalls);\n const finalizerFunc = t.arrowFunctionExpression(finalizerParams, finalizerBody);\n\n // Build state containers array (only state, not mutable)\n const stateContainersArray = t.arrayExpression(\n stateContainerNames.map(n => t.identifier(n))\n );\n\n // Build outer deps array\n const outerDepsArrayExpr = t.arrayExpression(\n outerDepsArray.map(n => t.identifier(n))\n );\n\n // Build the mutate call\n const mutateCall = t.callExpression(\n t.identifier(modifierAliases['mutate']),\n [mutateArrowFunc, finalizerFunc, stateContainersArray, outerDepsArrayExpr]\n );\n\n if (leftExpr) {\n return t.variableDeclaration('const', [\n t.variableDeclarator(leftExpr, mutateCall)\n ]);\n }\n return t.expressionStatement(mutateCall);\n },\n },\n effect: {\n needsImport: true,\n // @effect (() => setWhatever(x)) -> _effect((setWhatever, x) => { setWhatever()(x()) }, [setWhatever, x])\n // Note: receives Oddo AST (not Babel AST) to avoid premature wrapping with _liftFn\n transform: (oddoExpr) => {\n // effect must be an arrow function (Oddo AST)\n if (oddoExpr.type !== 'arrowFunction') {\n throw new Error('effect modifier must be a function');\n }\n\n // Extract dependencies from the function body (not params, those are local)\n // Use Oddo AST identifiers, filter out function's own params, and only keep reactive ones\n const bodyIdentifiers = collectOddoIdentifiersOnly(oddoExpr.body);\n const ownParams = new Set((oddoExpr.parameters || []).map(p => p.name));\n const identifiers = bodyIdentifiers.filter(id => !ownParams.has(id) && isReactive(id));\n \n const params = identifiers.map(id => t.identifier(id));\n const deps = identifiers.map(id => t.identifier(id));\n\n // Convert the body from Oddo AST to Babel AST\n let convertedBody;\n if (oddoExpr.body && oddoExpr.body.type === 'blockStatement') {\n // Block body\n const statements = oddoExpr.body.body.map(stmt => convertStatement(stmt));\n convertedBody = t.blockStatement(statements);\n } else if (oddoExpr.body) {\n // Expression body - wrap in block statement\n const exprBody = convertExpression(oddoExpr.body);\n convertedBody = t.blockStatement([t.expressionStatement(exprBody)]);\n } else {\n convertedBody = t.blockStatement([]);\n }\n\n // Create new arrow function with dependencies as params\n const arrowFunc = t.arrowFunctionExpression(params, convertedBody);\n\n // Wrap dependency references with call expressions\n wrapDependenciesWithCalls(arrowFunc, identifiers);\n\n const effectCall = t.callExpression(\n t.identifier(modifierAliases['effect']),\n [arrowFunc, t.arrayExpression(deps)]\n );\n\n return t.expressionStatement(effectCall);\n },\n },\n mutable: {\n needsImport: false,\n // @mutable x = 3 -> let x = 3;\n // @mutable x = y + 1 (y is @state) -> let x = _lift((y) => y() + 1, [y])\n transform: (valueExpr, leftExpr) => {\n if (leftExpr && t.isIdentifier(leftExpr)) {\n // Track this as a mutable variable for @mutate validation\n mutableVariables.add(leftExpr.name);\n \n // Check if expression contains reactive dependencies\n const identifiers = extractIdentifiers(valueExpr);\n const liftedExpr = createLiftedExpr(valueExpr, identifiers);\n \n return t.variableDeclaration('let', [\n t.variableDeclarator(leftExpr, liftedExpr || valueExpr)\n ]);\n }\n // If no left side, just return the expression\n return t.expressionStatement(valueExpr);\n },\n },\n};\n\n// Track which modifiers are used in the current compilation\nlet usedModifiers = new Set();\n// Map from modifier name to unique identifier (generated by Babel)\nlet modifierAliases = {};\n// Set of used names for collision avoidance (populated before conversion)\nlet usedNames = new Set();\n// Map from state variable names to their setter names (for @mutate validation)\nlet stateSetterMap = new Map();\n// Set of mutable variable names (for @mutate validation)\nlet mutableVariables = new Set();\n\n// Scope tracking using prototypal inheritance\n// Each scope is an object where keys are variable names and values are { type, reactive }\n// Child scopes inherit from parent scopes via Object.create()\nlet moduleScope = null;\nlet currentScope = null;\n\n// Variable info structure: { type: 'state'|'computed'|'mutable'|'immutable'|'param', reactive: boolean }\nfunction declareVariable(name, type) {\n const reactive = (type === 'state' || type === 'computed' || type === 'param');\n currentScope[name] = { type, reactive };\n}\n\nfunction isDeclared(name) {\n return name in currentScope;\n}\n\nfunction isReactive(name) {\n return currentScope[name]?.reactive === true;\n}\n\nfunction isNonReactive(name) {\n return currentScope[name]?.reactive === false;\n}\n\nfunction getVarType(name) {\n return currentScope[name]?.type;\n}\n\n// UID generator that avoids collisions (available during conversion)\nfunction generateUniqueId(baseName) {\n let candidate = baseName;\n let i = 2;\n while (usedNames.has(candidate)) {\n candidate = `${baseName}${i++}`;\n }\n usedNames.add(candidate);\n return candidate;\n}\n\n// Collect all identifiers from Oddo AST before conversion\n// Also builds scope chain with variable declarations using prototypal inheritance\nfunction collectOddoIdentifiers(node, names = new Set()) {\n if (!node || typeof node !== 'object') return names;\n\n // Initialize module scope for program node\n if (node.type === 'program') {\n moduleScope = Object.create(null);\n currentScope = moduleScope;\n }\n\n if (node.type === 'identifier') {\n names.add(node.name);\n }\n\n // Collect variable declarations into current scope\n if (node.type === 'expressionStatement') {\n const varName = node.expression?.left?.name;\n if (varName) {\n // Determine variable type based on modifier\n if (node.modifier === 'state') {\n declareVariable(varName, 'state');\n } else if (node.modifier === 'computed') {\n declareVariable(varName, 'computed');\n } else if (node.modifier === 'mutable') {\n declareVariable(varName, 'mutable');\n } else if (!node.modifier && node.expression?.type === 'variableDeclaration') {\n declareVariable(varName, 'immutable');\n }\n // Other modifiers (effect, mutate, react) don't declare named variables in the same way\n }\n }\n \n // Handle arrow functions - create child scope and add params\n if (node.type === 'arrowFunction') {\n // Create child scope\n const parentScope = currentScope;\n currentScope = Object.create(parentScope);\n \n // Store scope reference on AST node for conversion phase\n node._scope = currentScope;\n \n // Add function parameters to this scope\n if (node.parameters) {\n for (const param of node.parameters) {\n if (param.name) {\n declareVariable(param.name, 'param');\n }\n }\n }\n \n // Traverse function body in child scope\n if (node.body) {\n collectOddoIdentifiers(node.body, names);\n }\n \n // Restore parent scope\n currentScope = parentScope;\n \n // Skip normal traversal for this node (we handled it specially)\n return names;\n }\n\n // Recursively traverse all object properties\n for (const key of Object.keys(node)) {\n if (key === 'type') continue;\n const val = node[key];\n if (Array.isArray(val)) {\n val.forEach(item => collectOddoIdentifiers(item, names));\n } else if (val && typeof val === 'object') {\n collectOddoIdentifiers(val, names);\n }\n }\n return names;\n}\n\n/**\n * Convert Oddo AST to Babel AST and generate JavaScript code\n * @param {Object} ast - Oddo AST (program node)\n * @param {Object} config - Compilation configuration options\n * @param {string} config.runtimeLibrary - Runtime library to import (defaults to '@oddo/ui')\n * @returns {string} Generated JavaScript code\n */\nexport function compileToJS(ast, config = {}) {\n if (!ast || ast.type !== 'program') {\n throw new Error('Expected a program AST node');\n }\n\n // Extract configuration with defaults\n const runtimeLibrary = config.runtimeLibrary || '@oddo/ui';\n\n // Reset tracking variables\n usedModifiers = new Set();\n modifierAliases = {};\n stateSetterMap = new Map();\n mutableVariables = new Set();\n moduleScope = null;\n currentScope = null;\n \n // Pre-pass: collect all identifiers and build scope chain with variable types\n // This populates usedNames and sets up moduleScope/currentScope with prototypal inheritance\n usedNames = collectOddoIdentifiers(ast);\n\n // First pass: Convert AST with temporary placeholder identifiers\n // Modifiers: state, computed, react, mutate, effect\n // JSX Pragmas: e (element), c (component), x (expression), f (fragment)\n // Helpers: stateProxy\n const allImports = ['state', 'computed', 'react', 'mutate', 'effect', 'stateProxy', 'lift', 'liftFn', 'e', 'c', 'x', 'f'];\n for (const name of allImports) {\n modifierAliases[name] = `__ODDO_IMPORT_${name}__`;\n }\n\n const babelAST = convertProgram(ast);\n const fileAST = t.file(babelAST);\n\n // UID generator that avoids collisions\n const generateUid = (name) => {\n let candidate = `_${name}`;\n let i = 1;\n while (usedNames.has(candidate)) {\n candidate = `_${name}${i++}`;\n }\n usedNames.add(candidate);\n return candidate;\n };\n\n // Generate unique identifiers for each import that was actually used\n const tempToUnique = {};\n for (const name of usedModifiers) {\n const tempName = `__ODDO_IMPORT_${name}__`;\n const uniqueName = generateUid(name);\n tempToUnique[tempName] = uniqueName;\n modifierAliases[name] = uniqueName;\n }\n\n // Replace all temporary identifiers with unique ones\n if (Object.keys(tempToUnique).length > 0) {\n traverse(fileAST, {\n noScope: true,\n Identifier(path) {\n if (tempToUnique[path.node.name]) {\n path.node.name = tempToUnique[path.node.name];\n }\n }\n });\n }\n\n // Add imports for modifiers/pragmas that were actually used\n // Filter to only those with needsImport: true (or not defined in MODIFIER_TRANSFORMATIONS, like JSX pragmas)\n const modifiersNeedingImport = Array.from(usedModifiers).filter(name => {\n const modifier = MODIFIER_TRANSFORMATIONS[name];\n // JSX pragmas (e, c, f, x) are not in MODIFIER_TRANSFORMATIONS, they always need import\n return !modifier || modifier.needsImport !== false;\n });\n\n if (modifiersNeedingImport.length > 0) {\n // Create named import with aliases\n // import { state as _state, e as _e } from \"@oddo/ui\"\n const specifiers = modifiersNeedingImport.map(name => {\n return t.importSpecifier(\n t.identifier(modifierAliases[name]), // local: _state, _e\n t.identifier(name) // imported: state, e\n );\n });\n\n const importDeclaration = t.importDeclaration(\n specifiers,\n t.stringLiteral(runtimeLibrary)\n );\n\n babelAST.body.unshift(importDeclaration);\n }\n\n const output = generate(babelAST, {\n compact: false,\n comments: false,\n });\n\n return output.code;\n}\n\n/**\n * Convert Oddo program to Babel program\n */\nfunction convertProgram(ast) {\n const body = [];\n\n // Flatten block statements that come from modifier blocks\n for (const stmt of ast.body) {\n const converted = convertStatement(stmt);\n if (converted.type === 'BlockStatement' && converted.body.length > 0) {\n // If this is a block statement from a modifier block, flatten it\n body.push(...converted.body);\n } else {\n body.push(converted);\n }\n }\n\n return t.program(body);\n}\n\n/**\n * Convert Oddo statement to Babel statement\n */\nfunction convertStatement(stmt) {\n switch (stmt.type) {\n case 'expressionStatement':\n return convertExpressionStatement(stmt);\n case 'returnStatement':\n return convertReturnStatement(stmt);\n case 'blockStatement':\n return convertBlockStatement(stmt);\n case 'exportDefaultStatement':\n return convertExportDefaultStatement(stmt);\n case 'exportNamedStatement':\n return convertExportNamedStatement(stmt);\n case 'importStatement':\n return convertImportStatement(stmt);\n case 'importNamespaceStatement':\n return convertImportNamespaceStatement(stmt);\n default:\n throw new Error(`Unknown statement type: ${stmt.type}`);\n }\n}\n\n/**\n * Convert Oddo expression statement to Babel expression statement\n */\nfunction convertExpressionStatement(stmt) {\n // Handle modifiers\n if (stmt.modifier) {\n const modifierTransform = MODIFIER_TRANSFORMATIONS[stmt.modifier];\n if (!modifierTransform) {\n throw new Error(`Unknown modifier: @${stmt.modifier}`);\n }\n\n // Handle modifier on expression: @state x = 3\n if (stmt.expression) {\n // Extract the value and left side from the expression\n let valueExpr = null;\n let leftExpr = null;\n\n // If it's a declaration (=) or assignment (:=), extract both left and right sides\n if (stmt.expression.type === 'variableDeclaration' || stmt.expression.type === 'assignment') {\n leftExpr = convertExpression(stmt.expression.left);\n // For mutate/effect modifier, pass original Oddo AST for special processing\n if (stmt.modifier === 'mutate' || stmt.modifier === 'effect') {\n valueExpr = stmt.expression.right; // Oddo AST, not converted\n } else {\n valueExpr = convertExpression(stmt.expression.right);\n }\n } else {\n // Otherwise, use the expression itself as the value\n if (stmt.modifier === 'mutate' || stmt.modifier === 'effect') {\n valueExpr = stmt.expression; // Oddo AST, not converted\n } else {\n valueExpr = convertExpression(stmt.expression);\n }\n }\n\n // Apply the modifier transformation\n const { transform } = modifierTransform;\n\n // Track that this modifier is used\n usedModifiers.add(stmt.modifier);\n\n const transformedStmt = transform(valueExpr, leftExpr);\n\n // The transform function returns either a VariableDeclaration or ExpressionStatement\n // Return it directly (don't wrap in another ExpressionStatement)\n return transformedStmt;\n }\n\n // Handle modifier on block: @state:\\n x = 3\\n y = 4\n if (stmt.block) {\n // Apply the modifier transformation to each statement in the block\n const transformedStatements = [];\n\n for (const blockStmt of stmt.block.body) {\n // If the statement has its own modifier, use that instead of the block's modifier\n if (blockStmt.modifier) {\n // Convert the statement with its own modifier\n transformedStatements.push(convertStatement(blockStmt));\n } else if (blockStmt.type === 'expressionStatement' && blockStmt.expression) {\n // Each statement in the block should be treated as if it has the block's modifier\n // Only process expression statements (assignments/declarations)\n // Extract the value and left side from the expression\n let valueExpr = null;\n let leftExpr = null;\n\n // If it's a declaration (=) or assignment (:=), extract both left and right sides\n if (blockStmt.expression.type === 'variableDeclaration' || blockStmt.expression.type === 'assignment') {\n leftExpr = convertExpression(blockStmt.expression.left);\n valueExpr = convertExpression(blockStmt.expression.right);\n } else {\n // Otherwise, use the expression itself as the value\n valueExpr = convertExpression(blockStmt.expression);\n }\n\n // Apply the modifier transformation\n const { transform } = modifierTransform;\n\n // Track that this modifier is used\n usedModifiers.add(stmt.modifier);\n\n const transformedStmt = transform(valueExpr, leftExpr);\n transformedStatements.push(transformedStmt);\n } else {\n // For non-expression statements, convert normally\n transformedStatements.push(convertStatement(blockStmt));\n }\n }\n\n // Return all transformed statements as a sequence (they'll be flattened by convertProgram)\n // Actually, we need to return them individually, but convertProgram expects a single statement\n // So we'll return them as a block statement\n return t.blockStatement(transformedStatements);\n }\n }\n\n // In Oddo, = is a declaration (const), := is an assignment (expression)\n // Handle variable declaration before converting as expression\n if (stmt.expression && stmt.expression.type === 'variableDeclaration') {\n const left = convertExpression(stmt.expression.left);\n const right = convertExpression(stmt.expression.right);\n \n // Variable is already tracked in scope during pre-pass\n \n // Check if expression contains reactive dependencies\n const identifiers = extractIdentifiers(right);\n const liftedExpr = createLiftedExpr(right, identifiers);\n \n return t.variableDeclaration('const', [\n t.variableDeclarator(left, liftedExpr || right)\n ]);\n }\n\n let expression = null;\n\n if (stmt.expression) {\n expression = convertExpression(stmt.expression);\n }\n\n // If there's a block, wrap in an IIFE or handle appropriately\n if (stmt.block) {\n const block = convertBlockStatement(stmt.block);\n // For modifier blocks, we might want to wrap them differently\n // For now, just convert the block to a statement\n if (expression) {\n // If there's both expression and block, create a sequence\n return t.expressionStatement(\n t.sequenceExpression([\n expression,\n t.callExpression(\n t.arrowFunctionExpression([], block.body.length === 1 ? block.body[0].expression : t.blockStatement(block.body)),\n []\n )\n ])\n );\n } else {\n // Just a block - convert to IIFE\n return t.expressionStatement(\n t.callExpression(\n t.arrowFunctionExpression([], block),\n []\n )\n );\n }\n }\n\n if (!expression) {\n throw new Error('Expression statement must have expression or block');\n }\n\n // := operator is an assignment expression, not a declaration\n // It will be handled by convertExpression which calls convertAssignmentExpression\n\n // Handle array slice assignment as declaration\n if (stmt.expression && stmt.expression.type === 'arraySliceAssignment') {\n const sliceAssignment = convertExpression(stmt.expression);\n // Array slice assignments are expressions, but we need to wrap them in a declaration\n // Actually, array slice assignments modify the array in place, so they should remain as expressions\n // But if the user wants them as declarations, we could create a const for the result\n // For now, keep as expression statement since slice assignment modifies in place\n return t.expressionStatement(sliceAssignment);\n }\n\n return t.expressionStatement(expression);\n}\n\n/**\n * Convert Oddo return statement to Babel return statement\n */\nfunction convertReturnStatement(stmt) {\n const argument = stmt.argument ? convertExpression(stmt.argument) : null;\n return t.returnStatement(argument);\n}\n\n/**\n * Convert Oddo block statement to Babel block statement\n */\nfunction convertBlockStatement(stmt) {\n const body = stmt.body.map(convertStatement);\n return t.blockStatement(body);\n}\n\n/**\n * Convert Oddo expression to Babel expression\n */\nfunction convertExpression(expr) {\n if (!expr) return null;\n\n switch (expr.type) {\n case 'identifier':\n return t.identifier(expr.name);\n\n case 'number':\n // If raw value is present (hex, binary, octal, or scientific notation), use it\n // Otherwise use the numeric value\n if (expr.raw) {\n // Create numeric literal with raw value preserved\n // Babel's numericLiteral doesn't directly support raw, so we'll create it manually\n const node = t.numericLiteral(expr.value);\n node.extra = { raw: expr.raw, rawValue: expr.value };\n return node;\n }\n return t.numericLiteral(expr.value);\n\n case 'string':\n return t.stringLiteral(expr.value);\n\n case 'templateLiteral':\n return convertTemplateLiteral(expr);\n\n case 'taggedTemplate':\n return convertTaggedTemplate(expr);\n\n case 'boolean':\n return t.booleanLiteral(expr.value);\n\n case 'null':\n return t.nullLiteral();\n\n case 'array':\n return convertArrayLiteral(expr);\n\n case 'object':\n return convertObjectLiteral(expr);\n\n case 'arrowFunction':\n return convertArrowFunction(expr);\n\n case 'call':\n return convertCallExpression(expr);\n\n case 'memberAccess':\n return convertMemberExpression(expr);\n\n case 'arraySlice':\n return convertArraySlice(expr);\n\n case 'binary':\n return convertBinaryExpression(expr);\n\n case 'logical':\n return convertLogicalExpression(expr);\n\n case 'nullishCoalescing':\n return convertNullishCoalescing(expr);\n\n case 'pipe':\n return convertPipe(expr);\n\n case 'compose':\n return convertCompose(expr);\n\n case 'unary':\n return convertUnaryExpression(expr);\n\n case 'prefix':\n return convertUpdateExpression(expr, true);\n\n case 'postfix':\n return convertUpdateExpression(expr, false);\n\n case 'conditional':\n return convertConditionalExpression(expr);\n\n case 'assignment':\n return convertAssignmentExpression(expr);\n\n case 'arraySliceAssignment':\n return convertArraySliceAssignment(expr);\n\n case 'arrayPattern':\n return convertArrayPattern(expr);\n\n case 'objectPattern':\n return convertObjectPattern(expr);\n\n case 'jsxElement':\n return convertJSXElement(expr);\n\n case 'jsxFragment':\n return convertJSXFragment(expr);\n\n default:\n throw new Error(`Unknown expression type: ${expr.type}`);\n }\n}\n\n/**\n * Convert Oddo array literal to Babel array expression\n */\nfunction convertArrayLiteral(expr) {\n const elements = expr.elements.map(el => {\n if (!el) return null; // Handle holes in arrays\n if (el.type === 'spreadElement') {\n return t.spreadElement(convertExpression(el.argument));\n }\n if (el.type === 'spread') {\n return t.spreadElement(convertExpression(el.expression));\n }\n return convertExpression(el);\n }).filter(Boolean);\n return t.arrayExpression(elements);\n}\n\n/**\n * Convert Oddo object literal to Babel object expression\n */\nfunction convertObjectLiteral(expr) {\n const properties = expr.properties.map(prop => {\n if (prop.type === 'spreadProperty') {\n return t.spreadElement(convertExpression(prop.argument));\n }\n\n const key = convertExpression(prop.key);\n const value = convertExpression(prop.value);\n\n // Check if this is a computed key\n const computed = prop.computed || false;\n\n if (prop.shorthand) {\n return t.objectProperty(key, value, computed, true);\n }\n\n return t.objectProperty(key, value, computed, false);\n });\n\n return t.objectExpression(properties);\n}\n\n/**\n * Convert Oddo arrow function to Babel arrow function expression\n */\nfunction convertArrowFunction(expr) {\n // Switch to this function's scope (created during pre-pass)\n const savedScope = currentScope;\n if (expr._scope) {\n currentScope = expr._scope;\n }\n \n // BEFORE converting body: find reactive deps that will be captured\n // These will become additional params via _liftFn, so treat them as non-reactive inside\n const bodyIdentifiers = collectOddoIdentifiersOnly(expr.body);\n const reactiveDepsForBody = bodyIdentifiers.filter(id => {\n // Check if it's reactive in parent scope (not current function scope)\n // and not already a param of this function\n const isOwnParam = expr.parameters?.some(p => p.name === id);\n if (isOwnParam) return false;\n \n // Check parent scope for reactivity\n const varInfo = savedScope?.[id];\n return varInfo?.reactive === true;\n });\n \n // Add reactive deps as virtual params in current scope (so body doesn't wrap them)\n for (const dep of reactiveDepsForBody) {\n currentScope[dep] = { type: 'param', reactive: false }; // Treat as non-reactive param\n }\n \n const params = expr.parameters.map(param => {\n if (param.type === 'restElement') {\n return t.restElement(convertExpression(param.argument));\n }\n if (param.type === 'destructuringPattern') {\n // Destructuring pattern parameter: [a, b] or {a, b} or [a, b] = default or {a, b} = default\n const pattern = convertExpression(param.pattern);\n if (param.default) {\n return t.assignmentPattern(pattern, convertExpression(param.default));\n }\n return pattern;\n }\n if (param.type === 'parameter') {\n const paramId = t.identifier(param.name);\n // Add default value if present\n if (param.default) {\n return t.assignmentPattern(paramId, convertExpression(param.default));\n }\n return paramId;\n }\n // Handle array/object patterns (legacy support)\n return convertExpression(param);\n });\n\n let body;\n if (expr.body && expr.body.type === 'blockStatement') {\n // Block body: convert blockStatement to BlockStatement\n const statements = expr.body.body.map(stmt => convertStatement(stmt));\n body = t.blockStatement(statements);\n } else if (expr.body) {\n // Expression body: convert expression\n body = convertExpression(expr.body);\n } else {\n body = null;\n }\n\n // Restore parent scope\n currentScope = savedScope;\n\n // If there are reactive deps, wrap with _liftFn\n if (reactiveDepsForBody.length > 0) {\n usedModifiers.add('liftFn');\n \n // Prepend reactive dep params to original params\n const depParams = reactiveDepsForBody.map(id => t.identifier(id));\n const allParams = [...depParams, ...params];\n const depsArray = reactiveDepsForBody.map(id => t.identifier(id));\n \n const liftedFunc = t.arrowFunctionExpression(allParams, body);\n \n return t.callExpression(\n t.identifier(modifierAliases['liftFn']),\n [liftedFunc, t.arrayExpression(depsArray)]\n );\n }\n\n return t.arrowFunctionExpression(params, body);\n}\n\n// Helper: collect identifiers from Oddo AST without side effects\nfunction collectOddoIdentifiersOnly(node, names = new Set()) {\n if (!node || typeof node !== 'object') return Array.from(names);\n\n if (node.type === 'identifier') {\n names.add(node.name);\n }\n\n for (const key of Object.keys(node)) {\n if (key === 'type') continue;\n const val = node[key];\n if (Array.isArray(val)) {\n val.forEach(item => collectOddoIdentifiersOnly(item, names));\n } else if (val && typeof val === 'object') {\n collectOddoIdentifiersOnly(val, names);\n }\n }\n return Array.from(names);\n}\n\n/**\n * Convert Oddo call expression to Babel call expression\n */\nfunction convertCallExpression(expr) {\n const callee = convertExpression(expr.callee);\n const args = expr.arguments.map(arg => {\n // Handle spread arguments\n if (arg.type === 'spreadElement') {\n return t.spreadElement(convertExpression(arg.argument));\n }\n return convertExpression(arg);\n });\n\n // Handle optional chaining: func?.(args)\n if (expr.optional) {\n return t.optionalCallExpression(callee, args, true);\n }\n\n return t.callExpression(callee, args);\n}\n\n/**\n * Convert Oddo template literal to Babel template literal\n */\nfunction convertTemplateLiteral(expr) {\n const quasis = expr.quasis.map(quasi => {\n return t.templateElement(\n quasi.value,\n quasi.tail\n );\n });\n\n const expressions = expr.expressions.map(expr => convertExpression(expr));\n\n return t.templateLiteral(quasis, expressions);\n}\n\n/**\n * Convert Oddo tagged template to Babel tagged template expression\n */\nfunction convertTaggedTemplate(expr) {\n const tag = convertExpression(expr.tag);\n const template = convertTemplateLiteral(expr.template);\n\n return t.taggedTemplateExpression(tag, template);\n}\n\n/**\n * Convert Oddo member access to Babel member expression\n */\nfunction convertMemberExpression(expr) {\n const object = convertExpression(expr.object);\n const property = typeof expr.property === 'string'\n ? t.identifier(expr.property)\n : convertExpression(expr.property);\n\n // Handle optional chaining: obj?.prop or obj?.[expr]\n if (expr.optional) {\n return t.optionalMemberExpression(object, property, expr.computed || false, true);\n }\n\n return t.memberExpression(object, property, expr.computed || false);\n}\n\n/**\n * Convert Oddo array slice to Babel call expression (array.slice(start, end))\n */\nfunction convertArraySlice(expr) {\n const object = convertExpression(expr.object);\n const args = [];\n\n // Add start argument if present\n if (expr.start !== null && expr.start !== undefined) {\n args.push(convertExpression(expr.start));\n } else {\n // For [..], use slice(0) to copy entire array\n args.push(t.numericLiteral(0));\n }\n\n // Add end argument if present\n if (expr.end !== null && expr.end !== undefined) {\n args.push(convertExpression(expr.end));\n }\n\n // Create array.slice(start, end) call\n const sliceProperty = t.identifier('slice');\n const sliceMember = t.memberExpression(object, sliceProperty, false);\n return t.callExpression(sliceMember, args);\n}\n\n/**\n * Convert Oddo binary expression to Babel binary expression\n */\nfunction convertBinaryExpression(expr) {\n const left = convertExpression(expr.left);\n const right = convertExpression(expr.right);\n\n // Map Oddo operators to Babel operators\n const operatorMap = {\n '+': '+',\n '-': '-',\n '*': '*',\n '/': '/',\n '%': '%',\n '**': '**',\n '==': '===', // Map == to === in JavaScript\n '!=': '!==', // Map != to !== in JavaScript\n '<': '<',\n '<=': '<=',\n '>': '>',\n '>=': '>=',\n '<<': '<<',\n '>>': '>>',\n '>>>': '>>>',\n '&': '&',\n '^': '^',\n '|': '|',\n 'instanceof': 'instanceof',\n 'in': 'in',\n };\n\n const operator = operatorMap[expr.operator] || expr.operator;\n return t.binaryExpression(operator, left, right);\n}\n\n/**\n * Convert Oddo logical expression to Babel logical expression\n */\nfunction convertLogicalExpression(expr) {\n const left = convertExpression(expr.left);\n const right = convertExpression(expr.right);\n const operator = expr.operator === '&&' ? '&&' : '||';\n return t.logicalExpression(operator, left, right);\n}\n\n/**\n * Convert Oddo nullish coalescing expression to Babel nullish coalescing expression\n */\nfunction convertNullishCoalescing(expr) {\n const left = convertExpression(expr.left);\n const right = convertExpression(expr.right);\n return t.logicalExpression('??', left, right);\n}\n\n/**\n * Convert Oddo pipe expression to Babel call expression\n * a |> b |> c -> c(b(a))\n */\nfunction convertPipe(expr) {\n const left = convertExpression(expr.left);\n const right = convertExpression(expr.right);\n\n // Right side should be a function call: right(left)\n return t.callExpression(right, [left]);\n}\n\n/**\n * Convert Oddo compose expression to Babel call expression\n * c <| b <| a -> c(b(a))\n */\nfunction convertCompose(expr) {\n const left = convertExpression(expr.left);\n const right = convertExpression(expr.right);\n\n // Left side should be a function call: left(right)\n return t.callExpression(left, [right]);\n}\n\n/**\n * Convert Oddo unary expression to Babel unary expression\n */\nfunction convertUnaryExpression(expr) {\n const argument = convertExpression(expr.operand);\n\n const operatorMap = {\n '+': '+',\n '-': '-',\n '!': '!',\n '~': '~',\n 'typeof': 'typeof',\n 'void': 'void',\n 'delete': 'delete',\n };\n\n const operator = operatorMap[expr.operator] || expr.operator;\n return t.unaryExpression(operator, argument);\n}\n\n/**\n * Convert Oddo update expression (prefix/postfix) to Babel update expression\n */\nfunction convertUpdateExpression(expr, prefix) {\n const argument = convertExpression(expr.operand);\n const operator = expr.operator === '++' ? '++' : '--';\n return t.updateExpression(operator, argument, prefix);\n}\n\n/**\n * Convert Oddo conditional expression to Babel conditional expression\n */\nfunction convertConditionalExpression(expr) {\n const test = convertExpression(expr.test);\n const consequent = convertExpression(expr.consequent);\n const alternate = convertExpression(expr.alternate);\n return t.conditionalExpression(test, consequent, alternate);\n}\n\n/**\n * Convert Oddo assignment expression to Babel assignment expression\n */\nfunction convertAssignmentExpression(expr) {\n const left = convertExpression(expr.left);\n const right = convertExpression(expr.right);\n\n const operatorMap = {\n '=': '=',\n ':=': '=', // Map := to = in JavaScript\n '+:=': '+=',\n '-:=': '-=',\n '*:=': '*=',\n '/:=': '/=',\n '%:=': '%=',\n '**:=': '**=',\n '<<:=': '<<=',\n '>>:=': '>>=',\n '>>>:=': '>>>=',\n '&:=': '&=',\n '^:=': '^=',\n '|:=': '|=',\n };\n\n const operator = operatorMap[expr.operator] || expr.operator;\n return t.assignmentExpression(operator, left, right);\n}\n\n/**\n * Convert Oddo array slice assignment to Babel call expression\n * arr[start...end] = values -> Array.prototype.splice.apply(arr, [start, deleteCount].concat(values))\n */\nfunction convertArraySliceAssignment(expr) {\n const slice = expr.slice;\n const object = convertExpression(slice.object);\n const value = convertExpression(expr.value);\n\n // Calculate deleteCount: end - start\n // If end is null, we need to handle it differently\n let startExpr, deleteCountExpr;\n\n if (slice.start === null || slice.start === undefined) {\n // [...end] = value -> slice from 0 to end\n startExpr = t.numericLiteral(0);\n if (slice.end === null || slice.end === undefined) {\n // [...] = value -> replace entire array\n deleteCountExpr = t.memberExpression(\n object,\n t.identifier('length'),\n false\n );\n } else {\n // [...end] = value -> deleteCount = end - 0 = end\n deleteCountExpr = convertExpression(slice.end);\n }\n } else {\n startExpr = convertExpression(slice.start);\n if (slice.end === null || slice.end === undefined) {\n // [start...] = value -> deleteCount = arr.length - start\n deleteCountExpr = t.binaryExpression(\n '-',\n t.memberExpression(object, t.identifier('length'), false),\n startExpr\n );\n } else {\n // [start...end] = value -> deleteCount = end - start\n const endExpr = convertExpression(slice.end);\n // If both are numeric literals, compute the difference\n if (slice.start.type === 'number' && slice.end.type === 'number') {\n const deleteCount = slice.end.value - slice.start.value;\n deleteCountExpr = t.numericLiteral(deleteCount);\n } else {\n deleteCountExpr = t.binaryExpression('-', endExpr, startExpr);\n }\n }\n }\n\n // Create [start, deleteCount] array\n const spliceArgs = t.arrayExpression([startExpr, deleteCountExpr]);\n\n // Create .concat(value) call\n const concatCall = t.callExpression(\n t.memberExpression(spliceArgs, t.identifier('concat'), false),\n [value]\n );\n\n // Create Array.prototype.splice\n const spliceMethod = t.memberExpression(\n t.memberExpression(\n t.memberExpression(t.identifier('Array'), t.identifier('prototype'), false),\n t.identifier('splice'),\n false\n ),\n t.identifier('apply'),\n false\n );\n\n // Create Array.prototype.splice.apply(arr, [start, deleteCount].concat(value))\n return t.callExpression(spliceMethod, [object, concatCall]);\n}\n\n/**\n * Convert Oddo array pattern to Babel array pattern\n */\nfunction convertArrayPattern(expr) {\n const elements = expr.elements.map(el => {\n if (el.type === 'restElement') {\n return t.restElement(convertExpression(el.argument));\n }\n return convertExpression(el);\n });\n return t.arrayPattern(elements);\n}\n\n/**\n * Convert Oddo object pattern to Babel object pattern\n */\nfunction convertObjectPattern(expr) {\n const properties = expr.properties.map(prop => {\n if (prop.type === 'restProperty') {\n return t.restElement(convertExpression(prop.argument));\n }\n\n const key = convertExpression(prop.key);\n let value = prop.shorthand\n ? null // Babel handles shorthand automatically\n : convertExpression(prop.value);\n\n // Handle default value\n if (prop.default) {\n const actualValue = value || key; // Use value if present, otherwise key (for shorthand)\n value = t.assignmentPattern(actualValue, convertExpression(prop.default));\n } else {\n value = value || key; // For shorthand, use key\n }\n\n // Babel objectProperty: (key, value, computed, shorthand)\n // computed defaults to false if key is an identifier\n // shorthand is false if there's a default value (since we wrap it in assignmentPattern)\n const computed = prop.key && prop.key.type === 'string';\n return t.objectProperty(key, value, computed, prop.shorthand && !prop.default);\n });\n\n return t.objectPattern(properties);\n}\n\n/**\n * Convert JSX child to pragma call\n */\nfunction convertJSXChild(child) {\n if (child.type === 'jsxText') {\n // Trim and skip whitespace-only text\n const text = child.value;\n if (!text.trim()) return null;\n return t.stringLiteral(text);\n } else if (child.type === 'jsxExpression') {\n // JSX expression: {expr} -> _x((deps) => expr(), [deps])\n const innerExpr = convertExpression(child.expression);\n return createReactiveExpr(innerExpr);\n } else if (child.type === 'jsxElement') {\n return convertJSXElement(child);\n } else if (child.type === 'jsxFragment') {\n return convertJSXFragment(child);\n }\n return null;\n}\n\n/**\n * Convert Oddo JSX element to pragma call: _e() or _c()\n */\nfunction convertJSXElement(expr) {\n const tagName = expr.name;\n const isComponent = /^[A-Z]/.test(tagName);\n const pragma = isComponent ? 'c' : 'e';\n usedModifiers.add(pragma);\n\n // Check if any attribute is a spread\n const hasSpread = expr.attributes.some(attr => attr.type === 'jsxSpread');\n\n let propsArg;\n\n if (hasSpread) {\n // With spread: wrap entire props object in _x()\n // _x((deps...) => ({ ...spread(), attr: value() }), [deps...])\n const properties = [];\n\n for (const attr of expr.attributes) {\n if (attr.type === 'jsxSpread') {\n properties.push(t.spreadElement(convertExpression(attr.expression)));\n } else {\n const key = t.identifier(attr.name);\n let value;\n if (attr.value === null) {\n value = t.booleanLiteral(true);\n } else if (attr.value.type === 'string') {\n value = t.stringLiteral(attr.value.value);\n } else if (attr.value.type === 'expression') {\n value = convertExpression(attr.value.value);\n } else {\n value = convertExpression(attr.value);\n }\n properties.push(t.objectProperty(key, value));\n }\n }\n\n const propsObj = t.objectExpression(properties);\n propsArg = createReactiveExpr(propsObj, true);\n } else if (expr.attributes.length === 0) {\n // No attributes\n propsArg = t.nullLiteral();\n } else {\n // No spread: build object with individual _x() for expressions\n const properties = [];\n\n for (const attr of expr.attributes) {\n const key = t.identifier(attr.name);\n let value;\n\n if (attr.value === null) {\n // Boolean attribute: disabled -> {disabled: true}\n value = t.booleanLiteral(true);\n } else if (attr.value.type === 'string') {\n // String literal: class=\"x\" -> {class: \"x\"}\n value = t.stringLiteral(attr.value.value);\n } else if (attr.value.type === 'expression') {\n // Expression: value={x} -> {value: _x((x) => x(), [x])}\n const innerExpr = convertExpression(attr.value.value);\n value = createReactiveExpr(innerExpr, true);\n } else {\n const innerExpr = convertExpression(attr.value);\n value = createReactiveExpr(innerExpr, true);\n }\n\n properties.push(t.objectProperty(key, value));\n }\n\n propsArg = t.objectExpression(properties);\n }\n\n // Convert children\n const children = expr.children\n .map(convertJSXChild)\n .filter(Boolean);\n\n // Build pragma call: _e(\"div\", props, ...children) or _c(Component, props, ...children)\n const tagArg = isComponent ? t.identifier(tagName) : t.stringLiteral(tagName);\n const args = [tagArg, propsArg, ...children];\n\n return t.callExpression(\n t.identifier(modifierAliases[pragma]),\n args\n );\n}\n\n/**\n * Convert Oddo JSX fragment to pragma call: _f()\n */\nfunction convertJSXFragment(expr) {\n usedModifiers.add('f');\n\n const children = expr.children\n .map(convertJSXChild)\n .filter(Boolean);\n\n return t.callExpression(\n t.identifier(modifierAliases['f']),\n children\n );\n}\n\n/**\n * Convert Oddo export default statement to Babel export default declaration\n */\nfunction convertExportDefaultStatement(stmt) {\n const declaration = convertExpression(stmt.declaration);\n return t.exportDefaultDeclaration(declaration);\n}\n\n/**\n * Convert Oddo export named statement to Babel export named declaration\n */\nfunction convertExportNamedStatement(stmt) {\n if (stmt.declaration) {\n // export x = 1 (named export of declaration) or export x := 1 (named export of assignment)\n const exprStmt = stmt.declaration;\n if (exprStmt.type === 'expressionStatement' && exprStmt.expression) {\n // Variable declaration: export x = 1\n if (exprStmt.expression.type === 'variableDeclaration') {\n const id = convertExpression(exprStmt.expression.left);\n const init = convertExpression(exprStmt.expression.right);\n const declaration = t.variableDeclaration('const', [\n t.variableDeclarator(id, init)\n ]);\n return t.exportNamedDeclaration(declaration, []);\n }\n // Assignment: export x := 1\n // Note: JavaScript doesn't support export x = 3 directly, so we'll convert it\n // to a const declaration for compatibility\n if (exprStmt.expression.type === 'assignment') {\n const id = convertExpression(exprStmt.expression.left);\n const init = convertExpression(exprStmt.expression.right);\n const declaration = t.variableDeclaration('const', [\n t.variableDeclarator(id, init)\n ]);\n return t.exportNamedDeclaration(declaration, []);\n }\n }\n // Fallback: try to convert as-is\n const declaration = convertStatement(stmt.declaration);\n return t.exportNamedDeclaration(declaration, []);\n }\n\n // export { x, y } or export { x as y }\n const specifiers = stmt.specifiers.map(spec => {\n const local = t.identifier(spec.local);\n const exported = spec.local === spec.exported\n ? local\n : t.identifier(spec.exported);\n return t.exportSpecifier(local, exported);\n });\n\n return t.exportNamedDeclaration(null, specifiers);\n}\n\n/**\n * Convert Oddo import statement to Babel import declaration\n */\nfunction convertImportStatement(stmt) {\n const specifiers = [];\n\n // Add default import if present\n if (stmt.defaultImport) {\n specifiers.push(t.importDefaultSpecifier(t.identifier(stmt.defaultImport)));\n }\n\n // Add named imports\n for (const spec of stmt.specifiers) {\n const imported = spec.imported === spec.local\n ? t.identifier(spec.imported)\n : t.identifier(spec.imported);\n const local = t.identifier(spec.local);\n specifiers.push(t.importSpecifier(local, imported));\n }\n\n const source = t.stringLiteral(stmt.source);\n return t.importDeclaration(specifiers, source);\n}\n\n/**\n * Convert Oddo import namespace statement to Babel import namespace declaration\n */\nfunction convertImportNamespaceStatement(stmt) {\n const namespace = t.importNamespaceSpecifier(t.identifier(stmt.namespace));\n const source = t.stringLiteral(stmt.source);\n return t.importDeclaration([namespace], source);\n}\n","/**\n * Oddo Syntax Highlighter\n * Uses the Chevrotain lexer to tokenize and highlight code\n */\n\nimport { lexer, allTokens } from './lexer.mjs';\n\n// Token type to CSS class mapping\nconst tokenClassMap = {\n // Keywords\n 'Return': 'keyword',\n 'Import': 'keyword',\n 'Export': 'keyword',\n 'From': 'keyword',\n 'Default': 'keyword',\n 'As': 'keyword',\n \n // Keyword operators\n 'Typeof': 'keyword',\n 'Void': 'keyword',\n 'Delete': 'keyword',\n 'Instanceof': 'keyword',\n 'In': 'keyword',\n \n // Constants\n 'True': 'constant',\n 'False': 'constant',\n 'Null': 'constant',\n \n // Literals\n 'NumberLiteral': 'number',\n 'StringLiteral': 'string',\n 'TemplateLiteral': 'string',\n \n // Modifier\n 'Modifier': 'modifier',\n \n // Comments\n 'LineComment': 'comment',\n 'MultiLineComment': 'comment',\n \n // Operators\n 'Equal': 'operator',\n 'ColonEqual': 'operator',\n 'PlusPlus': 'operator',\n 'MinusMinus': 'operator',\n 'Plus': 'operator',\n 'Minus': 'operator',\n 'Star': 'operator',\n 'StarStar': 'operator',\n 'Slash': 'operator',\n 'Percent': 'operator',\n 'EqualEqual': 'operator',\n 'BangEqual': 'operator',\n 'LessThan': 'tag',\n 'GreaterThan': 'tag',\n 'LessThanEqual': 'operator',\n 'GreaterThanEqual': 'operator',\n 'AndAnd': 'operator',\n 'OrOr': 'operator',\n 'Bang': 'operator',\n 'Question': 'operator',\n 'QuestionDot': 'operator',\n 'QuestionQuestion': 'operator',\n 'Colon': 'operator',\n 'Pipe': 'operator',\n 'Compose': 'operator',\n 'DotDotDot': 'operator',\n 'And': 'operator',\n 'Or': 'operator',\n 'Caret': 'operator',\n 'Tilde': 'operator',\n 'LeftShift': 'operator',\n 'RightShift': 'operator',\n 'UnsignedRightShift': 'operator',\n \n // Compound assignment\n 'PlusColonEqual': 'operator',\n 'MinusColonEqual': 'operator',\n 'StarColonEqual': 'operator',\n 'StarStarColonEqual': 'operator',\n 'SlashColonEqual': 'operator',\n 'PercentColonEqual': 'operator',\n 'LeftShiftColonEqual': 'operator',\n 'RightShiftColonEqual': 'operator',\n 'UnsignedRightShiftColonEqual': 'operator',\n 'AndColonEqual': 'operator',\n 'OrColonEqual': 'operator',\n 'CaretColonEqual': 'operator',\n \n // JSX\n 'JSXCloseTagStart': 'tag',\n 'JSXSelfClosing': 'tag',\n \n // Punctuation\n 'LeftParen': 'punctuation',\n 'RightParen': 'punctuation',\n 'LeftBracket': 'punctuation',\n 'RightBracket': 'punctuation',\n 'LeftBrace': 'punctuation',\n 'RightBrace': 'punctuation',\n 'Comma': 'punctuation',\n 'Dot': 'punctuation',\n 'Semicolon': 'punctuation',\n \n // Identifier - default\n 'Identifier': 'identifier',\n};\n\n// Escape HTML special characters\nfunction escapeHtml(text) {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n\n/**\n * Highlights Oddo code and returns HTML\n * @param {string} code - The Oddo source code\n * @returns {string} - HTML with syntax highlighting spans\n */\nexport function highlightOddo(code) {\n // Handle reactive wrappers or non-string values\n const text = String(code || '');\n if (!text || text.trim() === '') {\n return '';\n }\n\n // Tokenize the code\n // Note: The lexer skips whitespace and comments, so we need to handle them differently\n // We'll use a simple regex-based approach to preserve all characters\n \n const result = lexer.tokenize(text);\n const tokens = result.tokens;\n \n // Also get the groups (comments are in groups since they're SKIPPED)\n const comments = [\n ...(result.groups.LineComment || []),\n ...(result.groups.MultiLineComment || []),\n ];\n \n // Combine all tokens and sort by position\n const allTokenInstances = [...tokens, ...comments].sort((a, b) => a.startOffset - b.startOffset);\n \n let html = '';\n let lastEnd = 0;\n \n for (const token of allTokenInstances) {\n // Add any text between tokens (whitespace)\n if (token.startOffset > lastEnd) {\n const between = text.substring(lastEnd, token.startOffset);\n html += escapeHtml(between);\n }\n \n // Add the token with its class\n const tokenType = token.tokenType.name;\n const cssClass = tokenClassMap[tokenType] || 'text';\n const tokenText = escapeHtml(token.image);\n \n html += `<span class=\"tok-${cssClass}\">${tokenText}</span>`;\n \n lastEnd = token.startOffset + token.image.length;\n }\n \n // Add any remaining text after the last token\n if (lastEnd < text.length) {\n html += escapeHtml(text.substring(lastEnd));\n }\n \n return html;\n}\n\n/**\n * Creates the CSS for syntax highlighting\n * @returns {string} - CSS rules\n */\nexport function getHighlightingCSS() {\n return `\n .tok-keyword { color: #ff79c6; }\n .tok-constant { color: #bd93f9; }\n .tok-number { color: #bd93f9; }\n .tok-string { color: #f1fa8c; }\n .tok-modifier { color: #50fa7b; font-weight: 500; }\n .tok-comment { color: #6272a4; font-style: italic; }\n .tok-operator { color: #ff79c6; }\n .tok-tag { color: #8be9fd; }\n .tok-punctuation { color: #f8f8f2; }\n .tok-identifier { color: #f8f8f2; }\n .tok-text { color: #f8f8f2; }\n `;\n}\n\n","/**\r\n * Oddo Language Parser (Chevrotain Implementation)\r\n * Main entry point\r\n */\r\n\r\nimport { lexer } from './lexer.mjs';\r\nimport { parser } from './parser.mjs';\r\nimport { convertCSTToAST, convertExpression } from './ast-converter.mjs';\r\nimport { compileToJS } from './compiler.mjs';\r\nimport { highlightOddo, getHighlightingCSS } from './highlighter.mjs';\r\n\r\n/**\r\n * Tokenize input using the standard lexer\r\n * No indentation processing - blocks use braces like JavaScript\r\n */\r\nfunction tokenize(input) {\r\n return lexer.tokenize(input);\r\n}\r\n\r\n/**\r\n * Parse Oddo language source code\r\n * @param {string} input - Source code to parse\r\n * @returns {object} AST (Abstract Syntax Tree)\r\n */\r\nexport function parseOddo(input) {\r\n // Tokenize using standard lexer\r\n const lexResult = tokenize(input);\r\n\r\n if (lexResult.errors.length > 0) {\r\n const errors = lexResult.errors.map(err => ({\r\n message: err.message,\r\n line: err.line,\r\n column: err.column,\r\n }));\r\n throw new Error(`Lexer errors: ${JSON.stringify(errors)}`);\r\n }\r\n\r\n // Parse\r\n parser.input = lexResult.tokens;\r\n const cst = parser.program();\r\n\r\n if (parser.errors.length > 0) {\r\n const errors = parser.errors.map(err => ({\r\n message: err.message,\r\n token: err.token?.image,\r\n line: err.token?.startLine,\r\n column: err.token?.startColumn,\r\n }));\r\n throw new Error(`Parser errors: ${JSON.stringify(errors)}`);\r\n }\r\n\r\n // Convert CST to AST\r\n const ast = convertCSTToAST(cst);\r\n return ast;\r\n}\r\n\r\n/**\r\n * Parse Oddo language expression\r\n * @param {string} input - Expression to parse\r\n * @returns {object} AST node\r\n */\r\nexport function parseOddoExpression(input) {\r\n // Tokenize using standard lexer\r\n const lexResult = tokenize(input);\r\n\r\n if (lexResult.errors.length > 0) {\r\n const errors = lexResult.errors.map(err => ({\r\n message: err.message,\r\n line: err.line,\r\n column: err.column,\r\n }));\r\n throw new Error(`Lexer errors: ${JSON.stringify(errors)}`);\r\n }\r\n\r\n // Parse as expression directly\r\n parser.input = lexResult.tokens;\r\n const cst = parser.expression();\r\n\r\n if (parser.errors.length > 0) {\r\n const errors = parser.errors.map(err => ({\r\n message: err.message,\r\n token: err.token?.image,\r\n line: err.token?.startLine,\r\n column: err.token?.startColumn,\r\n }));\r\n throw new Error(`Parser errors: ${JSON.stringify(errors)}`);\r\n }\r\n\r\n // Convert CST to AST\r\n const ast = convertExpression(cst);\r\n return ast;\r\n}\r\n\r\nexport function compileOddoToJS(input, config = {}) {\r\n const ast = parseOddo(input);\r\n return compileToJS(ast, config);\r\n}\r\n\r\nexport function compileOddoExpressionToJS(input, config = {}) {\r\n const ast = parseOddoExpression(input);\r\n return compileToJS(ast, config);\r\n}\r\n\r\n// Re-export highlighter functions\r\nexport { highlightOddo, getHighlightingCSS };\r\n"],"mappings":"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","names":["nextToken","expressionStatement","source","_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","opToken","left","templateLiteral","t","identifier","stringLiteral","allTokens","traverse","_a","arrowFunc","convertExpression","convertStatement","importDeclaration","convertStatement","convertExpressionStatement","convertReturnStatement","convertImportStatement","convertExpression","convertTemplateLiteral","convertArrayLiteral","convertObjectLiteral","convertArrowFunction","convertNullishCoalescing","convertPipe","convertCompose","convertJSXElement","convertJSXFragment","expr","convertJSXChild","declaration"]}