UNPKG

@dbml/parse

Version:
1,484 lines 148 kB
import I, { last as $e, partition as zt, findLastIndex as Qt } from "lodash"; var u = /* @__PURE__ */ ((t) => (t.SPACE = "<space>", t.TAB = "<tab>", t.NEWLINE = "<newline>", t.COMMA = "<comma>", t.LPAREN = "<lparen>", t.RPAREN = "<rparen>", t.LBRACE = "<lbrace>", t.RBRACE = "<rbrace>", t.LBRACKET = "<lbracket>", t.RBRACKET = "<rbracket>", t.LANGLE = "<langle>", t.RANGLE = "<rangle>", t.OP = "<op>", t.EOF = "<eof>", t.NUMERIC_LITERAL = "<number>", t.STRING_LITERAL = "<string>", t.COLOR_LITERAL = "<color>", t.FUNCTION_EXPRESSION = "<function-expression>", t.QUOTED_STRING = "<variable>", t.IDENTIFIER = "<identifier>", t.SEMICOLON = "<semicolon>", t.COLON = "<colon>", t.SINGLE_LINE_COMMENT = "<single-line-comment>", t.MULTILINE_COMMENT = "<multiline-comment>", t))(u || {}); function qt(t) { switch (t.kind) { case "<newline>": case "<space>": case "<tab>": case "<single-line-comment>": case "<multiline-comment>": return !0; default: return !1; } } function lt(t) { if (!t) return !1; switch (t) { case "+": case "-": case "*": case "/": case "%": case "<": case ">": case "=": case "!": case ".": case "&": case "|": return !0; default: return !1; } } function ct(t) { return t !== void 0 && t.kind === "<op>"; } class G { constructor(e, n, s, i, r) { this.kind = e, this.startPos = n, this.endPos = s, this.value = i, this.leadingTrivia = [], this.trailingTrivia = [], this.leadingInvalid = [], this.trailingInvalid = [], this.isInvalid = r, this.start = n.offset, this.end = s.offset; } static create(e, n, s, i, r) { return new G(e, n, s, i, r); } } function gt(t) { return t.trailingTrivia.find(({ kind: e }) => e === u.NEWLINE) !== void 0; } function ut(t, e) { return e.leadingTrivia.find(({ kind: s }) => s === u.NEWLINE) !== void 0 || gt(t); } function We(t) { return t.trailingTrivia.find(({ kind: e }) => [u.SPACE, u.TAB].includes(e)) !== void 0; } function _t(t) { return t.trailingTrivia.length === 0 ? t.end : _t($e(t.trailingTrivia)); } function At(t) { return t.leadingTrivia.length === 0 ? t.start : At(t.leadingTrivia[0]); } function Ht(t) { return [u.SINGLE_LINE_COMMENT, u.MULTILINE_COMMENT].includes( t.kind ); } class Jt { constructor() { this.id = 0; } reset() { this.id = 0; } nextId() { return this.id++; } } class k { // The symbol that this syntax node refers to // args must be passed in order of appearance in the node constructor(e, n, s) { this.id = e, this.kind = n; const i = s.find((a) => a !== void 0 && !Number.isNaN(a.start)); i ? (this.startPos = i.startPos, this.fullStart = i instanceof G ? At(i) : i.fullStart) : (this.startPos = { offset: NaN, column: NaN, line: NaN }, this.fullStart = NaN); const r = [...s].reverse().find((a) => a !== void 0 && !Number.isNaN(a.end)); r ? (this.endPos = r.endPos, this.fullEnd = r instanceof G ? _t(r) : r.fullEnd) : (this.endPos = { offset: NaN, column: NaN, line: NaN }, this.fullEnd = NaN), this.start = this.startPos.offset, this.end = this.endPos.offset; } } var Ne = /* @__PURE__ */ ((t) => (t.PROGRAM = "<program>", t.ELEMENT_DECLARATION = "<element-declaration>", t.ATTRIBUTE = "<attribute>", t.IDENTIFIER_STREAM = "<identifer-stream>", t.LITERAL = "<literal>", t.VARIABLE = "<variable>", t.PREFIX_EXPRESSION = "<prefix-expression>", t.INFIX_EXPRESSION = "<infix-expression>", t.POSTFIX_EXPRESSION = "<postfix-expression>", t.FUNCTION_EXPRESSION = "<function-expression>", t.FUNCTION_APPLICATION = "<function-application>", t.BLOCK_EXPRESSION = "<block-expression>", t.LIST_EXPRESSION = "<list-expression>", t.TUPLE_EXPRESSION = "<tuple-expression>", t.CALL_EXPRESSION = "<call-expression>", t.PRIMARY_EXPRESSION = "<primary-expression>", t.GROUP_EXPRESSION = "<group-expression>", t.DUMMY = "<dummy>", t.ARRAY = "<array>", t))(Ne || {}); class j extends k { constructor({ body: e = [], eof: n }, s) { super(s, "<program>", [...e, n]), this.body = e, this.eof = n; } } class A extends k { constructor({ type: e, name: n, as: s, alias: i, attributeList: r, bodyColon: a, body: l }, p) { if (super(p, "<element-declaration>", [ e, n, s, i, r, a, l ]), l && a && !(l instanceof v || l instanceof A)) throw new Error("If an element has a simple body, it must be a function application node"); this.type = e, this.name = n, this.as = s, this.alias = i, this.attributeList = r, this.bodyColon = a, this.body = l; } } class q extends k { constructor({ identifiers: e = [] }, n) { super(n, "<identifer-stream>", e || []), this.identifiers = e; } } class ie extends k { constructor({ name: e, colon: n, value: s }, i) { super(i, "<attribute>", [e, n, s]), this.name = e, this.value = s, this.colon = n; } } class H extends k { constructor({ op: e, expression: n }, s) { super(s, "<prefix-expression>", [e, n]), this.op = e, this.expression = n; } } class J extends k { constructor({ op: e, leftExpression: n, rightExpression: s }, i) { super(i, "<infix-expression>", [n, e, s]), this.op = e, this.leftExpression = n, this.rightExpression = s; } } class Me extends k { constructor({ op: e, expression: n }, s) { super(s, "<postfix-expression>", [n, e]), this.op = e, this.expression = n; } } class se extends k { constructor({ value: e }, n) { super(n, "<function-expression>", [e]), this.value = e; } } class v extends k { constructor({ callee: e, args: n = [] }, s) { super(s, "<function-application>", [e, ...n]), this.callee = e, this.args = n; } } class K extends k { constructor({ blockOpenBrace: e, body: n = [], blockCloseBrace: s }, i) { super(i, "<block-expression>", [e, ...n, s]), this.blockOpenBrace = e, this.body = n, this.blockCloseBrace = s; } } class R extends k { constructor({ listOpenBracket: e, elementList: n = [], commaList: s = [], listCloseBracket: i }, r) { super(r, "<list-expression>", [ e, ...vt(n, s), i ]), this.listOpenBracket = e, this.elementList = n, this.commaList = s, this.listCloseBracket = i; } } class ee extends k { constructor({ tupleOpenParen: e, elementList: n = [], commaList: s = [], tupleCloseParen: i }, r) { super(r, "<tuple-expression>", [ e, ...vt(n, s), i ]), this.tupleOpenParen = e, this.elementList = n, this.commaList = s, this.tupleCloseParen = i; } } class ze extends ee { constructor({ groupOpenParen: e, expression: n, groupCloseParen: s }, i) { super( { tupleOpenParen: e, elementList: n && [n], commaList: [], tupleCloseParen: s }, i ), this.kind = "<group-expression>"; } } class Z extends k { constructor({ callee: e, argumentList: n }, s) { super(s, "<call-expression>", [e, n]), this.callee = e, this.argumentList = n; } } class be extends k { constructor({ literal: e }, n) { super(n, "<literal>", [e]), this.literal = e; } } class te extends k { constructor({ variable: e }, n) { super(n, "<variable>", [e]), this.variable = e; } } class M extends k { constructor({ expression: e }, n) { super(n, "<primary-expression>", [e]), this.expression = e; } } class Se extends k { constructor({ pre: e }, n) { const s = G.create(u.SPACE, e.endPos, e.endPos, " ", !1); super(n, "<dummy>", [s]); } } class he extends k { constructor({ expression: e, indexer: n }, s) { super(s, "<array>", [e, n]), this.array = e, this.indexer = n; } } function vt(t, e) { if (!t || t.length === 0) return e || []; if (!e || e.length === 0) return t || []; const [n] = t, [s] = e; return (n.start < s.start ? I.flatten(I.zip(t, e)) : I.flatten(I.zip(e, t))).filter( (i) => i !== null ); } function hs(t, e = !1) { return JSON.stringify( t, function(n, s) { var i; return !(this instanceof j) && n === "symbol" ? s == null ? void 0 : s.id : ( /* this instanceof SyntaxNode && */ n === "symbol" ? { symbolTable: s == null ? void 0 : s.symbolTable, id: s == null ? void 0 : s.id, references: s == null ? void 0 : s.references.map((r) => r.id), declaration: (i = s == null ? void 0 : s.declaration) == null ? void 0 : i.id } : ( /* this instanceof SyntaxNode && */ n === "referee" || /* this instanceof SyntaxNode && */ n === "parent" || /* this instanceof NodeSymbol && */ n === "declaration" ? s == null ? void 0 : s.id : ( /* this instanceof NodeSymbol && */ n === "symbolTable" ? Object.fromEntries(s.table) : s ) ) ); }, e ? 2 : 0 ); } class x { constructor(e) { this.value = e; } unwrap() { return this.value; } // eslint-disable-next-line @typescript-eslint/no-unused-vars unwrap_or(e) { return this.value; } and_then(e) { return e(this.value); } map(e) { return new x(e(this.value)); } // eslint-disable-next-line class-methods-use-this isOk() { return !0; } } class y { // eslint-disable-next-line class-methods-use-this unwrap() { throw new Error("Trying to unwrap a None value"); } // eslint-disable-next-line class-methods-use-this unwrap_or(e) { return e; } // eslint-disable-next-line @typescript-eslint/no-unused-vars, class-methods-use-this and_then(e) { return new y(); } // eslint-disable-next-line @typescript-eslint/no-unused-vars, class-methods-use-this map(e) { return new y(); } // eslint-disable-next-line class-methods-use-this isOk() { return !1; } } var T = /* @__PURE__ */ ((t) => (t.Schema = "Schema", t.Table = "Table", t.Column = "Column", t.TableGroup = "TableGroup", t.TableGroupField = "TableGroup field", t.Enum = "Enum", t.EnumField = "Enum field", t.Note = "Note", t))(T || {}); function Qe(t) { return `Schema:${t}`; } function De(t) { return `Table:${t}`; } function qe(t) { return `Column:${t}`; } function He(t) { return `Enum:${t}`; } function Je(t) { return `Enum field:${t}`; } function Ze(t) { return `TableGroup:${t}`; } function Ke(t) { return `TableGroup field:${t}`; } function Zt(t) { return `Note:${t}`; } function Ce(t, e) { switch (e) { case "Column": return qe(t); case "Enum": return He(t); case "Enum field": return Je(t); case "Schema": return Qe(t); case "Table": return De(t); case "TableGroup": return Ze(t); case "TableGroup field": return Ke(t); default: throw new Error("Unreachable"); } } function re(t) { const [e, n] = t.split(":"); return Object.values(T).includes(e) ? new x({ name: n, kind: e }) : new y(); } function Kt(t) { const e = re(t).unwrap_or(void 0); if (!e) return !1; const { kind: n, name: s } = e; return n === "Schema" && s === "public"; } function en(t) { return [ Qe, De, He, Ze, qe, Je, Ke ].map((e) => e(t)); } function Fe(t) { return !!t.match(/(\p{L}|_|\p{M})/gu); } function Re(t) { const [e] = t; return e >= "0" && e <= "9"; } function tn(t) { const [e] = t; return Re(e) || Fe(e) && e.toLowerCase() >= "a" && e.toLowerCase() <= "f"; } function Ee(t) { return Fe(t) || Re(t); } function ht(t, e) { const n = [], s = Math.min(t.length, e.length); for (let i = 0; i < s; i += 1) n.push(t[i], e[i]); return n.push(...t.slice(s), ...e.slice(s)), n; } function _e(t, e) { return t >= e.start && t < e.end; } class nn { constructor() { this.id = 0; } reset() { this.id = 0; } nextId() { return this.id++; } } class wt { constructor({ symbolTable: e }, n) { this.references = [], this.id = n, this.symbolTable = e; } } class sn { constructor({ symbolTable: e, declaration: n }, s) { this.references = [], this.id = s, this.symbolTable = e, this.declaration = n; } } class rn { constructor({ declaration: e }, n) { this.references = [], this.id = n, this.declaration = e; } } class yt { constructor({ symbolTable: e, declaration: n }, s) { this.references = [], this.id = s, this.symbolTable = e, this.declaration = n; } } class an { constructor({ declaration: e }, n) { this.references = [], this.id = n, this.declaration = e; } } class on { constructor({ symbolTable: e, declaration: n }, s) { this.references = [], this.id = s, this.symbolTable = e, this.declaration = n; } } class ln { constructor({ declaration: e }, n) { this.references = [], this.id = n, this.declaration = e; } } var o = /* @__PURE__ */ ((t) => (t[t.UNKNOWN_SYMBOL = 1e3] = "UNKNOWN_SYMBOL", t[t.UNEXPECTED_SYMBOL = 1001] = "UNEXPECTED_SYMBOL", t[t.UNEXPECTED_EOF = 1002] = "UNEXPECTED_EOF", t[t.UNEXPECTED_NEWLINE = 1003] = "UNEXPECTED_NEWLINE", t[t.UNKNOWN_TOKEN = 1004] = "UNKNOWN_TOKEN", t[t.UNEXPECTED_TOKEN = 1005] = "UNEXPECTED_TOKEN", t[t.UNEXPECTED_ELEMENT_DECLARATION = 1006] = "UNEXPECTED_ELEMENT_DECLARATION", t[t.MISSING_SPACES = 1007] = "MISSING_SPACES", t[t.UNKNOWN_PREFIX_OP = 1008] = "UNKNOWN_PREFIX_OP", t[t.INVALID_OPERAND = 1009] = "INVALID_OPERAND", t[t.EMPTY_ATTRIBUTE_NAME = 1010] = "EMPTY_ATTRIBUTE_NAME", t[t.INVALID_ESCAPE_SEQUENCE = 1011] = "INVALID_ESCAPE_SEQUENCE", t[t.INVALID_NAME = 3e3] = "INVALID_NAME", t[t.UNEXPECTED_NAME = 3001] = "UNEXPECTED_NAME", t[t.NAME_NOT_FOUND = 3002] = "NAME_NOT_FOUND", t[t.DUPLICATE_NAME = 3003] = "DUPLICATE_NAME", t[t.INVALID_ALIAS = 3004] = "INVALID_ALIAS", t[t.UNEXPECTED_ALIAS = 3005] = "UNEXPECTED_ALIAS", t[t.UNEXPECTED_SETTINGS = 3006] = "UNEXPECTED_SETTINGS", t[t.INVALID_SETTINGS = 3007] = "INVALID_SETTINGS", t[t.UNEXPECTED_SIMPLE_BODY = 3008] = "UNEXPECTED_SIMPLE_BODY", t[t.UNEXPECTED_COMPLEX_BODY = 3009] = "UNEXPECTED_COMPLEX_BODY", t[t.INVALID_TABLE_CONTEXT = 3010] = "INVALID_TABLE_CONTEXT", t[t.INVALID_TABLE_SETTING = 3011] = "INVALID_TABLE_SETTING", t[t.DUPLICATE_TABLE_SETTING = 3012] = "DUPLICATE_TABLE_SETTING", t[t.INVALID_TABLEGROUP_CONTEXT = 3013] = "INVALID_TABLEGROUP_CONTEXT", t[t.INVALID_TABLEGROUP_ELEMENT_NAME = 3014] = "INVALID_TABLEGROUP_ELEMENT_NAME", t[t.DUPLICATE_TABLEGROUP_ELEMENT_NAME = 3015] = "DUPLICATE_TABLEGROUP_ELEMENT_NAME", t[t.DUPLICATE_TABLEGROUP_FIELD_NAME = 3016] = "DUPLICATE_TABLEGROUP_FIELD_NAME", t[t.INVALID_TABLEGROUP_FIELD = 3017] = "INVALID_TABLEGROUP_FIELD", t[t.EMPTY_TABLE = 3018] = "EMPTY_TABLE", t[t.INVALID_COLUMN = 3019] = "INVALID_COLUMN", t[t.INVALID_COLUMN_NAME = 3020] = "INVALID_COLUMN_NAME", t[t.UNKNOWN_COLUMN_SETTING = 3021] = "UNKNOWN_COLUMN_SETTING", t[t.INVALID_COLUMN_TYPE = 3022] = "INVALID_COLUMN_TYPE", t[t.DUPLICATE_COLUMN_NAME = 3023] = "DUPLICATE_COLUMN_NAME", t[t.DUPLICATE_COLUMN_SETTING = 3024] = "DUPLICATE_COLUMN_SETTING", t[t.INVALID_COLUMN_SETTING_VALUE = 3025] = "INVALID_COLUMN_SETTING_VALUE", t[t.INVALID_ENUM_CONTEXT = 3026] = "INVALID_ENUM_CONTEXT", t[t.INVALID_ENUM_ELEMENT_NAME = 3027] = "INVALID_ENUM_ELEMENT_NAME", t[t.INVALID_ENUM_ELEMENT = 3028] = "INVALID_ENUM_ELEMENT", t[t.DUPLICATE_ENUM_ELEMENT_NAME = 3029] = "DUPLICATE_ENUM_ELEMENT_NAME", t[t.UNKNOWN_ENUM_ELEMENT_SETTING = 3030] = "UNKNOWN_ENUM_ELEMENT_SETTING", t[t.DUPLICATE_ENUM_ELEMENT_SETTING = 3031] = "DUPLICATE_ENUM_ELEMENT_SETTING", t[t.INVALID_ENUM_ELEMENT_SETTING = 3032] = "INVALID_ENUM_ELEMENT_SETTING", t[t.EMPTY_ENUM = 3033] = "EMPTY_ENUM", t[t.INVALID_REF_CONTEXT = 3034] = "INVALID_REF_CONTEXT", t[t.UNKNOWN_REF_SETTING = 3035] = "UNKNOWN_REF_SETTING", t[t.DUPLICATE_REF_SETTING = 3036] = "DUPLICATE_REF_SETTING", t[t.INVALID_REF_SETTING_VALUE = 3037] = "INVALID_REF_SETTING_VALUE", t[t.INVALID_REF_RELATIONSHIP = 3038] = "INVALID_REF_RELATIONSHIP", t[t.INVALID_REF_FIELD = 3039] = "INVALID_REF_FIELD", t[t.EMPTY_REF = 3040] = "EMPTY_REF", t[t.REF_REDEFINED = 3041] = "REF_REDEFINED", t[t.INVALID_NOTE_CONTEXT = 3042] = "INVALID_NOTE_CONTEXT", t[t.INVALID_NOTE = 3043] = "INVALID_NOTE", t[t.NOTE_REDEFINED = 3044] = "NOTE_REDEFINED", t[t.NOTE_CONTENT_REDEFINED = 3045] = "NOTE_CONTENT_REDEFINED", t[t.EMPTY_NOTE = 3046] = "EMPTY_NOTE", t[t.INVALID_INDEXES_CONTEXT = 3047] = "INVALID_INDEXES_CONTEXT", t[t.INVALID_INDEXES_FIELD = 3048] = "INVALID_INDEXES_FIELD", t[t.INVALID_INDEX = 3049] = "INVALID_INDEX", t[t.UNKNOWN_INDEX_SETTING = 3050] = "UNKNOWN_INDEX_SETTING", t[t.DUPLICATE_INDEX_SETTING = 3051] = "DUPLICATE_INDEX_SETTING", t[t.UNEXPECTED_INDEX_SETTING_VALUE = 3052] = "UNEXPECTED_INDEX_SETTING_VALUE", t[t.INVALID_INDEX_SETTING_VALUE = 3053] = "INVALID_INDEX_SETTING_VALUE", t[t.INVALID_PROJECT_CONTEXT = 3054] = "INVALID_PROJECT_CONTEXT", t[t.PROJECT_REDEFINED = 3055] = "PROJECT_REDEFINED", t[t.INVALID_PROJECT_FIELD = 3056] = "INVALID_PROJECT_FIELD", t[t.INVALID_CUSTOM_CONTEXT = 3057] = "INVALID_CUSTOM_CONTEXT", t[t.INVALID_CUSTOM_ELEMENT_VALUE = 3058] = "INVALID_CUSTOM_ELEMENT_VALUE", t[t.INVALID_ELEMENT_IN_SIMPLE_BODY = 3059] = "INVALID_ELEMENT_IN_SIMPLE_BODY", t[t.BINDING_ERROR = 4e3] = "BINDING_ERROR", t[t.UNSUPPORTED = 5e3] = "UNSUPPORTED", t[t.CIRCULAR_REF = 5001] = "CIRCULAR_REF", t[t.SAME_ENDPOINT = 5002] = "SAME_ENDPOINT", t[t.UNEQUAL_FIELDS_BINARY_REF = 5003] = "UNEQUAL_FIELDS_BINARY_REF", t[t.CONFLICTING_SETTING = 5004] = "CONFLICTING_SETTING", t[t.TABLE_REAPPEAR_IN_TABLEGROUP = 5005] = "TABLE_REAPPEAR_IN_TABLEGROUP", t))(o || {}); class c extends Error { constructor(e, n, s) { super(n), this.code = e, this.diagnostic = n, this.nodeOrToken = s, this.start = s.start, this.end = s.end, this.name = this.constructor.name, Object.setPrototypeOf(this, c.prototype); } } class X { constructor(e, n) { this.value = e, this.errors = n === void 0 ? [] : n; } getValue() { return this.value; } getErrors() { return this.errors; } chain(e) { const n = e(this.value), s = [...this.errors, ...n.errors]; return new X(n.value, s); } map(e) { return new X(e(this.value), this.errors); } } function cn(t, e, n) { if (!t || !me(t) || e.length === 0) return new y(); const s = [...e], i = Xe(t).unwrap(), r = s.pop(); if (!(r instanceof K)) return new y(); const a = I.last(s) instanceof R ? s.pop() : void 0; return s.length === 3 && Xe(s[1]).unwrap().value === "as" ? new x( n.create(A, { type: i, name: s[0], as: Xe(s[1]).unwrap(), alias: s[2], attributeList: a, body: r }) ) : s.length === 1 ? new x( n.create(A, { type: i, name: s[0], attributeList: a, body: r }) ) : s.length === 0 ? new x( n.create(A, { type: i, attributeList: a, body: r }) ) : new y(); } function ft(t) { return t.kind === u.IDENTIFIER && t.value === "as"; } function N(t) { t && (t instanceof G ? un(t) : hn(t)); } function un(t) { t.kind !== u.EOF && (t.isInvalid = !0); } function hn(t) { if (t instanceof A) N(t.type), N(t.name), N(t.as), N(t.alias), N(t.bodyColon), N(t.attributeList), N(t.body); else if (t instanceof q) t.identifiers.forEach(N); else if (t instanceof ie) N(t.name), N(t.colon), N(t.value); else if (t instanceof H) N(t.op), N(t.expression); else if (t instanceof J) N(t.leftExpression), N(t.op), N(t.rightExpression); else if (t instanceof Me) N(t.op), N(t.expression); else if (t instanceof K) N(t.blockOpenBrace), t.body.forEach(N), N(t.blockCloseBrace); else if (t instanceof R) N(t.listOpenBracket), t.commaList.forEach(N), t.elementList.forEach(N), N(t.listCloseBracket); else if (t instanceof ee) N(t.tupleOpenParen), t.commaList.forEach(N), t.elementList.forEach(N), N(t.tupleCloseParen); else if (t instanceof Z) N(t.callee), N(t.argumentList); else if (t instanceof v) N(t.callee), t.args.forEach(N); else if (t instanceof M) N(t.expression); else if (t instanceof se) N(t.value); else if (t instanceof te) N(t.variable); else if (t instanceof be) N(t.literal); else throw t instanceof ze ? new Error("This case is handled by the TupleExpressionNode case") : new Error("Unreachable case in markInvalidNode"); } function kt(t) { return !!(t != null && t.isInvalid); } function U(...t) { return t.filter((e) => e !== void 0); } function fn(t) { if (t instanceof j) return U(...t.body, t.eof); if (t instanceof A) return U( t.type, t.name, t.as, t.alias, t.attributeList, t.bodyColon, t.body ); if (t instanceof ie) return U(t.name, t.colon, t.value); if (t instanceof q) return t.identifiers; if (t instanceof be) return t.literal ? [t.literal] : []; if (t instanceof te) return U(t.variable); if (t instanceof H) return U(t.op, t.expression); if (t instanceof J) return U(t.leftExpression, t.op, t.rightExpression); if (t instanceof Me) return U(t.expression, t.op); if (t instanceof se) return U(t.value); if (t instanceof v) return U(t.callee, ...t.args); if (t instanceof K) return U(t.blockOpenBrace, ...t.body, t.blockCloseBrace); if (t instanceof R) return U( t.listOpenBracket, ...ht(t.elementList, t.commaList), t.listCloseBracket ); if (t instanceof ee) return U( t.tupleOpenParen, ...ht(t.elementList, t.commaList), t.tupleCloseParen ); if (t instanceof Z) return U(t.callee, t.argumentList); if (t instanceof M) return U(t.expression); if (t instanceof he) return U( t.array, t.indexer ); throw t instanceof ze ? new Error("This case is already handled by TupleExpressionNode") : new Error("Unreachable - no other possible cases"); } function Xe(t) { return V(t) ? new x(t.expression.variable) : new y(); } function Y(t) { var e; return t instanceof M && (t.expression instanceof te && t.expression.variable instanceof G && t.expression.variable.kind === u.QUOTED_STRING || t.expression instanceof be && ((e = t.expression.literal) == null ? void 0 : e.kind) === u.STRING_LITERAL); } function V(t) { return t instanceof M && t.expression instanceof te && t.expression.variable instanceof G; } function me(t) { var e; return t instanceof M && t.expression instanceof te && ((e = t.expression.variable) == null ? void 0 : e.kind) === u.IDENTIFIER; } function et(t) { var e; return t instanceof J && t.leftExpression instanceof k && t.rightExpression instanceof k && ((e = t.op) == null ? void 0 : e.value) === "."; } function Te(t) { if (t === void 0) return new y(); const e = t.identifiers.map((n) => n.value).join(" "); return e === "" ? new y() : new x(e); } class pn { // list of errors during lexing constructor(e) { this.start = { offset: 0, line: 0, column: 0 }, this.current = { offset: 0, line: 0, column: 0 }, this.tokens = [], this.errors = [], this.text = e; } isAtEnd() { return this.current.offset >= this.text.length; } advance() { const e = this.peek(); return this.current = { ...this.current }, e === ` ` ? (this.current.line += 1, this.current.column = 0) : this.current.column += 1, this.current.offset += 1, e; } peek(e = 0) { if (!(this.current.offset + e >= this.text.length)) return this.text[this.current.offset + e]; } // Check if the sequence ahead matches `sequence` check(e) { for (let n = 0; n < e.length; n += 1) if (e[n] !== this.peek(n)) return !1; return !0; } // If the sequence ahead matches `sequence`, move `current` past `sequence` match(e) { return this.check(e) ? (e.split("").forEach(() => this.advance()), !0) : !1; } addToken(e, n = !1) { this.tokens.push(this.createToken(e, n)); } createToken(e, n = !1) { return G.create( e, this.start, this.current, this.text.substring(this.start.offset, this.current.offset), n ); } lex() { return this.scanTokens(), this.tokens.push(G.create(u.EOF, this.start, this.current, "", !1)), this.gatherTrivia(), this.gatherInvalid(), new X(this.tokens, this.errors); } scanTokens() { for (; !this.isAtEnd(); ) { const e = this.advance(); switch (e) { case " ": this.addToken(u.SPACE); break; case "\r": break; case ` `: this.addToken(u.NEWLINE); break; case " ": this.addToken(u.TAB); break; case ",": this.addToken(u.COMMA); break; case "(": this.addToken(u.LPAREN); break; case ")": this.addToken(u.RPAREN); break; case "[": this.addToken(u.LBRACKET); break; case "]": this.addToken(u.RBRACKET); break; case "{": this.addToken(u.LBRACE); break; case "}": this.addToken(u.RBRACE); break; case ";": this.addToken(u.SEMICOLON); break; case ":": this.addToken(u.COLON); break; case "'": this.match("''") ? this.multilineStringLiteral() : this.singleLineStringLiteral(); break; case '"': this.quotedVariable(); break; case "`": this.functionExpression(); break; case "#": this.colorLiteral(); break; case "/": this.match("/") ? this.singleLineComment() : this.match("*") ? this.multilineComment() : this.operator(); break; default: if (lt(e)) { this.operator(); break; } if (Fe(e)) { this.identifier(); break; } if (Re(e)) { this.numericLiteralOrIdentifier(); break; } this.addToken(u.OP, !0), this.errors.push( new c( o.UNKNOWN_SYMBOL, `Unexpected token '${e}'`, this.createToken(u.OP, !0) ) ); break; } this.start = { ...this.current }; } } gatherTrivia() { let e = !0, n = [], s; const i = []; for (const r of this.tokens) qt(r) ? (n.push(r), r.kind === u.NEWLINE && s && (s.trailingTrivia = n, e = !0, s = void 0, n = [])) : (e ? r.leadingTrivia = n : s.trailingTrivia = n, i.push(r), n = [], s = r, e = !1); this.tokens = i; } gatherInvalid() { let e; const n = [], s = []; for (e = 0; e < this.tokens.length && kt(this.tokens[e]); e += 1) s.push(this.tokens[e]); let i = this.tokens[e]; for (i.leadingInvalid = [...s, ...i.leadingInvalid]; e < this.tokens.length; e += 1) { const r = this.tokens[e]; r.isInvalid ? i.trailingInvalid.push(r) : (i = r, n.push(r)); } this.tokens = n; } // Consuming characters until the `stopSequence` is encountered consumeUntil(e, n, { allowNewline: s, // Whether newline is allowed allowEof: i, // Whether EOF is allowed raw: r, // Whether to interpret '\' as a backlash consumeStopSequence: a = !0 }) { let l = ""; for (; !this.isAtEnd() && (s || !this.check(` `)) && !this.check(n); ) this.peek() === "\\" && !r ? (this.advance(), l += this.escapedString()) : l += this.advance(); if (this.isAtEnd() && !i) { const p = this.createToken(e, !0); this.tokens.push(p), this.errors.push( new c(o.UNEXPECTED_EOF, "EOF reached while parsing", p) ); return; } if (this.check(` `) && !s) { const p = this.createToken(e, !0); this.tokens.push(p), this.errors.push( new c( o.UNEXPECTED_NEWLINE, "Invalid newline encountered while parsing", p ) ); return; } a && this.match(n), this.tokens.push(G.create(e, this.start, this.current, l, !1)); } singleLineStringLiteral() { this.consumeUntil(u.STRING_LITERAL, "'", { allowNewline: !1, allowEof: !1, raw: !1 }); } multilineStringLiteral() { this.consumeUntil(u.STRING_LITERAL, "'''", { allowNewline: !0, allowEof: !1, raw: !1 }); } functionExpression() { this.consumeUntil(u.FUNCTION_EXPRESSION, "`", { allowNewline: !1, allowEof: !1, raw: !0 }); } quotedVariable() { this.consumeUntil(u.QUOTED_STRING, '"', { allowNewline: !1, allowEof: !1, raw: !1 }); } singleLineComment() { this.consumeUntil(u.SINGLE_LINE_COMMENT, ` `, { allowNewline: !0, allowEof: !0, raw: !0, consumeStopSequence: !1 }); } multilineComment() { this.consumeUntil(u.MULTILINE_COMMENT, "*/", { allowNewline: !0, allowEof: !1, raw: !0 }); } identifier() { for (; !this.isAtEnd() && Ee(this.peek()); ) this.advance(); this.addToken(u.IDENTIFIER); } operator() { for (; lt(this.peek()); ) this.advance(); this.addToken(u.OP); } // we accept identifiers starting with digits but must contain at least one char or underscore numericLiteralOrIdentifier() { let e = 0; if (this.isAtEnd()) return this.addToken(u.NUMERIC_LITERAL); for (; !this.isAtEnd(); ) { const n = this.check("."); if (e += n ? 1 : 0, e > 1) break; if (!n && this.current.offset === this.text.length - 1) return this.advance(), this.addToken(u.NUMERIC_LITERAL); if (!n && !Ee(this.peek())) return this.addToken(u.NUMERIC_LITERAL); if (!n && !Re(this.peek())) break; this.advance(); } if (e > 0) { for (; !this.isAtEnd() && (this.check(".") || Ee(this.peek())); ) this.advance(); const n = this.createToken(u.NUMERIC_LITERAL, !0); this.tokens.push(n), this.errors.push(new c(o.UNKNOWN_TOKEN, "Invalid number", n)); } else { for (; !this.isAtEnd() && Ee(this.peek()); ) this.advance(); const n = this.createToken(u.IDENTIFIER, !1); this.tokens.push(n); } } colorLiteral() { for (; !this.isAtEnd() && Ee(this.peek()); ) this.advance(); this.addToken(u.COLOR_LITERAL); } escapedString() { const e = { column: this.current.column - 1, offset: this.current.offset - 1, line: this.current.line }; if (this.isAtEnd()) return "\\"; switch (this.advance()) { case "\r": return this.check(` `) && this.advance(), ""; case ` `: return ""; case "t": return " "; case "n": return ` `; case "\\": return "\\"; case "r": return "\r"; case "'": return "'"; case '"': return '"'; case "0": return "\0"; case "b": return "\b"; case "v": return "\v"; case "f": return "\f"; case " ": return "\\ "; case "u": { let n = ""; for (let s = 0; s <= 3; s += 1) { if (this.isAtEnd() || !Ee(this.peek())) return this.errors.push(new c(o.INVALID_ESCAPE_SEQUENCE, `Invalid unicode escape sequence '\\u${n}', only unicode escape sequences of the form '\\uHHHH' where H is a hexadecimal number are allowed`, G.create(u.STRING_LITERAL, e, this.current, `\\u${n}`, !0))), `\\u${n}`; n += this.advance(); } return String.fromCharCode(parseInt(n, 16)); } default: return this.text[this.current.offset - 1]; } } } var Oe = /* @__PURE__ */ ((t) => (t[t.ListExpression = 0] = "ListExpression", t[t.GroupExpression = 1] = "GroupExpression", t[t.BlockExpression = 2] = "BlockExpression", t))(Oe || {}); class dn { constructor() { this.stack = [], this.numberOfNestedLParens = 0, this.numberOfNestedLBrackets = 0, this.numberOfNestedLBraces = 0; } push(e) { this.stack.push(e), e === 0 && (this.numberOfNestedLBrackets += 1), e === 1 && (this.numberOfNestedLParens += 1), e === 2 && (this.numberOfNestedLBraces += 1); } pop() { const e = this.stack.pop(); return e === 0 && (this.numberOfNestedLBrackets -= 1), e === 1 && (this.numberOfNestedLParens -= 1), e === 2 && (this.numberOfNestedLBraces -= 1), e; } top() { return I.last(this.stack); } isWithinGroupExpressionContext() { return this.numberOfNestedLParens > 0; } isWithinListExpressionContext() { return this.numberOfNestedLBrackets > 0; } isWithinBlockExpressionContext() { return this.numberOfNestedLBraces > 0; } // Call the passed in callback // with the guarantee that the passed in context will be pushed and popped properly // even in cases of exceptions withContextDo(e, n) { return () => { this.push(e); try { return n(); } finally { this.pop(); } }; } // Return the type of the handler context currently in the context stack to handle `token` findHandlerContext(e, n) { if (!(this.numberOfNestedLBraces <= 0 && this.numberOfNestedLBrackets <= 0 && this.numberOfNestedLParens <= 0)) for (let s = n; s < e.length - 1; s += 1) switch (e[s].kind) { case u.COMMA: if (this.isWithinGroupExpressionContext() || this.isWithinListExpressionContext()) return [...this.stack].reverse().find( (r) => [ 1, 0 /* ListExpression */ ].includes(r) ); break; case u.RPAREN: if (this.isWithinGroupExpressionContext()) return 1; break; case u.RBRACE: if (this.isWithinBlockExpressionContext()) return 2; break; case u.RBRACKET: if (this.isWithinListExpressionContext()) return 0; break; } } } class En { constructor(e) { this.generator = e; } create(e, n) { return new e(n, this.generator.nextId()); } } class d { constructor(e, n, s) { this.token = e, this.partialNode = n, this.handlerContext = s; } } class Nn { constructor(e, n) { this.current = 0, this.errors = [], this.contextStack = new dn(), this.synchronizeProgram = () => { const s = this.peek(); s.kind !== u.EOF ? N(this.advance()) : (N(this.peek()), this.logError(s, o.UNEXPECTED_EOF, "Unexpected EOF")); }, this.synchronizeElementDeclarationName = () => { for (; !this.isAtEnd(); ) { const s = this.peek(); if (ft(s) || this.check(u.COLON, u.LBRACE, u.LBRACKET)) break; N(s), this.advance(); } }, this.synchronizeElementDeclarationAlias = () => { for (; !this.isAtEnd(); ) { const s = this.peek(); if (this.check(u.COLON, u.LBRACE, u.LBRACKET)) break; N(s), this.advance(); } }, this.blockExpression = this.contextStack.withContextDo(Oe.BlockExpression, () => { const s = { body: [] }, i = () => this.nodeFactory.create(K, s); try { this.consume("Expect an opening brace '{'", u.LBRACE), s.blockOpenBrace = this.previous(); } catch (r) { if (!(r instanceof d)) throw r; if (s.blockOpenBrace = r.partialNode, !this.canHandle(r)) throw new d(r.token, i(), r.handlerContext); this.synchronizeBlock(); } for (; !this.isAtEnd() && !this.check(u.RBRACE); ) try { s.body.push(this.canBeField() ? this.fieldDeclaration() : this.expression()); } catch (r) { if (!(r instanceof d)) throw r; if (s.body.push(r.partialNode), !this.canHandle(r)) throw new d(r.token, i(), r.handlerContext); this.synchronizeBlock(); } try { this.consume("Expect a closing brace '}'", u.RBRACE), s.blockCloseBrace = this.previous(); } catch (r) { if (!(r instanceof d)) throw r; if (s.blockCloseBrace = r.partialNode, !this.canHandle(r)) throw new d(r.token, i(), r.handlerContext); this.synchronizeBlock(); } return i(); }), this.synchronizeBlock = () => { if (!this.check(u.RBRACE)) for (N(this.advance()); !this.isAtEnd(); ) { const s = this.peek(); if (this.check(u.RBRACE) || ut(this.previous(), s)) break; N(s), this.advance(); } }, this.tupleExpression = this.contextStack.withContextDo(Oe.GroupExpression, () => { const s = { elementList: [], commaList: [] }, i = () => this.nodeFactory.create(ze, { groupOpenParen: s.tupleOpenParen, groupCloseParen: s.tupleCloseParen, expression: s.elementList[0] }), r = () => this.nodeFactory.create(ee, s); try { this.consume("Expect an opening parenthesis '('", u.LPAREN), s.tupleOpenParen = this.previous(); } catch (a) { if (!(a instanceof d)) throw a; if (s.tupleOpenParen = a.partialNode, !this.canHandle(a)) throw new d(a.token, r(), a.handlerContext); this.synchronizeTuple(); } if (!this.isAtEnd() && !this.check(u.RPAREN)) try { s.elementList.push(this.normalExpression()); } catch (a) { if (!(a instanceof d)) throw a; if (s.elementList.push(a.partialNode), !this.canHandle(a)) throw new d(a.token, i(), a.handlerContext); this.synchronizeTuple(); } for (; !this.isAtEnd() && !this.check(u.RPAREN); ) try { this.consume("Expect a comma ','", u.COMMA), s.commaList.push(this.previous()), s.elementList.push(this.normalExpression()); } catch (a) { if (!(a instanceof d)) throw a; if (a.partialNode instanceof k && s.elementList.push(a.partialNode), !this.canHandle(a)) throw new d(a.token, r(), a.handlerContext); this.synchronizeTuple(); } try { this.consume("Expect a closing parenthesis ')'", u.RPAREN), s.tupleCloseParen = this.previous(); } catch (a) { if (!(a instanceof d)) throw a; if (s.tupleCloseParen = a.partialNode, !this.canHandle(a)) throw new d(a.token, r(), a.handlerContext); this.synchronizeTuple(); } return s.elementList.length === 1 ? i() : r(); }), this.synchronizeTuple = () => { for (; !this.isAtEnd(); ) { const s = this.peek(); if (this.check(u.RPAREN, u.COMMA)) break; N(s), this.advance(); } }, this.listExpression = this.contextStack.withContextDo(Oe.ListExpression, () => { const s = { elementList: [], commaList: [] }, i = () => this.nodeFactory.create(R, s); try { this.consume("Expect an opening bracket '['", u.LBRACKET), s.listOpenBracket = this.previous(); } catch (r) { if (!(r instanceof d)) throw r; if (s.listOpenBracket = r.partialNode, !this.canHandle(r)) throw new d(r.token, i(), r.handlerContext); this.synchronizeList(); } if (!this.isAtEnd() && !this.check(u.RBRACKET)) try { s.elementList.push(this.attribute()); } catch (r) { if (!(r instanceof d)) throw r; if (s.elementList.push(r.partialNode), !this.canHandle(r)) throw new d(r.token, i(), r.handlerContext); this.synchronizeList(); } for (; !this.isAtEnd() && !this.check(u.RBRACKET); ) try { this.consume("Expect a comma ','", u.COMMA), s.commaList.push(this.previous()), s.elementList.push(this.attribute()); } catch (r) { if (!(r instanceof d)) throw r; if (r.partialNode instanceof k && s.elementList.push(r.partialNode), !this.canHandle(r)) throw new d(r.token, i(), r.handlerContext); this.synchronizeList(); } try { this.consume("Expect a closing bracket ']'", u.RBRACKET), s.listCloseBracket = this.previous(); } catch (r) { if (!(r instanceof d)) throw r; if (s.listCloseBracket = r.partialNode, !this.canHandle(r)) throw new d(r.token, i(), r.handlerContext); this.synchronizeList(); } return i(); }), this.synchronizeList = () => { for (; !this.isAtEnd(); ) { const s = this.peek(); if (this.check(u.COMMA, u.RBRACKET)) break; N(s), this.advance(); } }, this.synchronizeAttributeName = () => { for (; !this.isAtEnd(); ) { const s = this.peek(); if (this.check(u.COMMA, u.RBRACKET, u.COLON)) break; N(s), this.advance(); } }, this.synchronizeAttributeValue = () => { for (; !this.isAtEnd(); ) { const s = this.peek(); if (this.check(u.COMMA, u.RBRACKET)) break; N(s), this.advance(); } }, this.tokens = e, this.nodeFactory = new En(n); } isAtEnd() { return this.current >= this.tokens.length || this.tokens[this.current].kind === u.EOF; } advance() { return this.isAtEnd() ? I.last(this.tokens) : this.tokens[this.current++]; } peek(e = 0) { return e + this.current >= this.tokens.length ? I.last(this.tokens) : this.tokens[this.current + e]; } match(...e) { const n = this.check(...e); return n && this.advance(), n; } check(...e) { const n = this.peek(); return e.includes(n.kind); } previous() { return this.tokens[this.current - 1]; } canHandle(e) { return e.handlerContext === void 0 || e.handlerContext === this.contextStack.top(); } consume(e, ...n) { if (!this.match(...n)) throw this.logError(this.peek(), o.UNEXPECTED_TOKEN, e), new d( this.peek(), void 0, this.contextStack.findHandlerContext(this.tokens, this.current) ); } // Discard tokens until one of `kind` is found // If any tokens are discarded, the error message is logged // Return whether the token of one of the listed kinds are eventually reached discardUntil(e, ...n) { if (this.isAtEnd() || !this.check(...n)) { for (N(this.peek()), this.logError(this.advance(), o.UNEXPECTED_TOKEN, e); !this.isAtEnd() && !this.check(...n); ) N(this.advance()); return !this.isAtEnd(); } return !0; } gatherInvalid() { const e = [], n = []; let s, i = 0; for (; i < this.tokens.length && this.tokens[i].isInvalid; i += 1) n.push(this.tokens[i]); for (s = this.tokens[i], s.leadingInvalid = n, e.push(s), i += 1; i < this.tokens.length; i += 1) { const r = this.tokens[i]; r.isInvalid ? s.trailingInvalid.push(r) : (s = r, e.push(s)); } this.tokens = e; } parse() { const e = this.program(), n = this.advance(), s = this.nodeFactory.create(j, { body: e, eof: n }); return this.gatherInvalid(), new X({ ast: s, tokens: this.tokens }, this.errors); } /* Parsing and synchronizing ProgramNode */ program() { const e = []; for (; !this.isAtEnd(); ) try { const n = this.elementDeclaration(); e.push(n); } catch (n) { if (!(n instanceof d)) throw n; e.push(n.partialNode), this.synchronizeProgram(); } return e; } /* Parsing and synchronizing top-level ElementDeclarationNode */ elementDeclaration() { const e = {}, n = () => this.nodeFactory.create(A, e); try { this.consume("Expect an identifier", u.IDENTIFIER), e.type = this.previous(); } catch (s) { throw s instanceof d ? (e.type = s.partialNode, new d(s.token, n(), s.handlerContext)) : s; } if (!this.check(u.COLON, u.LBRACE, u.LBRACKET)) try { e.name = this.normalExpression(); } catch (s) { if (!(s instanceof d)) throw s; if (e.name = s.partialNode, !this.canHandle(s)) throw new d(s.token, n(), s.handlerContext); this.synchronizeElementDeclarationName(); } if (ft(this.peek())) if (e.as = this.advance(), this.check(u.COLON, u.LBRACE, u.LBRACKET)) this.logError(this.peek(), o.UNEXPECTED_TOKEN, "Expect an alias"); else try { e.alias = this.normalExpression(); } catch (s) { if (!(s instanceof d)) throw s; if (e.alias = s.partialNode, !this.canHandle(s)) throw new d(s.token, n(), s.handlerContext); this.synchronizeElementDeclarationAlias(); } try { e.attributeList = this.check(u.LBRACKET) ? this.listExpression() : void 0; } catch (s) { throw s instanceof d ? (e.attributeList = s.partialNode, new d(s.token, n(), s.handlerContext)) : s; } if (!this.discardUntil( "Expect an opening brace '{' or a colon ':'", u.LBRACE, u.COLON )) return n(); try { if (this.match(u.COLON)) { e.bodyColon = this.previous(); const s = this.expression(); s instanceof A ? (N(s), this.logError(s, o.UNEXPECTED_ELEMENT_DECLARATION, "An element's simple body must not be an element declaration")) : e.body = s; } else e.body = this.blockExpression(); } catch (s) { throw s instanceof d ? (e.body = s.partialNode, new d(s.token, n(), s.handlerContext)) : s; } return this.nodeFactory.create(A, e); } /* Parsing nested element declarations with simple body */ // e.g // ``` // Table Users { // Note: 'This is a note' // fieldDeclaration() handles this // } fieldDeclaration() { const e = {}, n = () => this.nodeFactory.create(A, e); try { this.consume("Expect an identifier", u.IDENTIFIER), e.type = this.previous(); } catch (s) { throw s instanceof d ? (e.type = s.partialNode, new d(s.token, n(), s.handlerContext)) : s; } try { this.consume("Expect a colon ':'", u.COLON), e.bodyColon = this.previous(); } catch (s) { throw s instanceof d ? (e.bodyColon = s.partialNode, new d(s.token, n(), s.handlerContext)) : s; } try { const s = this.expression(); s instanceof A ? this.errors.push(new c(o.INVALID_ELEMENT_IN_SIMPLE_BODY, "Simple body cannot be an element declaration", s)) : e.body = s; } catch (s) { throw s instanceof d ? (e.body = s.partialNode, new d(s.token, n(), s.handlerContext)) : s; } return this.nodeFactory.create(A, e); } /* Parsing any ExpressionNode, including non-NormalExpression */ expression() { const e = { args: [] }, n = () => cn(e.callee, e.args, this.nodeFactory).unwrap_or( this.nodeFactory.create(v, e) ); try { e.callee = this.normalExpression(); } catch (i) { throw i instanceof d ? (e.callee = i.partialNode, new d(i.token, n(), i.handlerContext)) : i; } if (this.shouldStopExpression()) return n(); let s = e.callee; for (; !this.shouldStopExpression(); ) { We(this.previous()) || this.logError(s, o.MISSING_SPACES, "Expect a following space"); try { s = this.normalExpression(), e.args.push(s); } catch (i) { throw i instanceof d ? (s = i.partialNode, e.args.push(s), new d(i.token, n(), i.handlerContext)) : i; } } return n(); } shouldStopExpression() { if (this.isAtEnd() || gt(this.previous())) return !0; const e = this.peek().kind; return e === u.RBRACE || e === u.RBRACKET || e === u.RPAREN || e === u.COMMA || e === u.COLON; } normalExpression() { return this.expression_bp(0); } // Pratt's parsing algorithm expression_bp(e) { let n = this.leftExpression_bp(); for (; !this.isAtEnd(); ) { const s = this.peek(); if (s.kind === u.LPAREN) { const { left: i } = pt(s); if (i < e || // When '(' is encountered, // consider it part of another expression if // it's at the start of a new line // and we're currently not having unmatched '(' or '[' ut(this.previous(), s) && !this.contextStack.isWithinGroupExpressionContext() && !this.contextStack.isWithinListExpressionContext()) break; try { n = this.nodeFactory.create(Z, { callee: n, argumentList: this.tupleExpression() }); } catch (r) { throw r instanceof d ? (n = this.nodeFactory.create(Z, { callee: n, argumentList: r.partialNode }), new d(r.token, n, r.handlerContext)) : r; } } else if (s.kind === u.LBRACKET) { if (We(this.previous())) break; try { n = this.nodeFactory.create(he, { expression: n, indexer: this.listExpression() }); } catch (i) { throw i instanceof d ? (n = this.nodeFactory.create(he, { expression: n, indexer: i.partialNode }), new d(i.token, n, i.handlerContext)) : i; } } else if (ct(s)) { const i = s, r = pt(i); if (r.left !== null) { if (r.left <= e) break; this.advance(), n = this.nodeFactory.create(Me, { expression: n, op: i }); } else { const a = Tn(i); if (a.left === null || a.left <= e) break; this.advance(); try { n = this.nodeFactory.create(J, { leftExpression: n, op: i, rightExpression: i.value === "." ? this.extractOperand() : this.expression_bp(a.right) }); } catch (l) { throw l instanceof d ? (n = this.nodeFactory.create(J, { leftExpression: n, op: i, rightExpression: l.partialNode }), new d(l.token, n, l.