@dbml/parse
Version:
> TODO: description
1,479 lines (1,478 loc) • 171 kB
JavaScript
import g, { last as Ve, forIn as Ge, partition as Pt, head as ln, findLastIndex as cn } 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.TILDE = "<tilde>", t.SINGLE_LINE_COMMENT = "<single-line-comment>", t.MULTILINE_COMMENT = "<multiline-comment>", t))(u || {});
function un(t) {
switch (t.kind) {
case "<newline>":
case "<space>":
case "<tab>":
case "<single-line-comment>":
case "<multiline-comment>":
return !0;
default:
return !1;
}
}
function hn(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 Et(t) {
return t !== void 0 && t.kind === "<op>";
}
class Q {
constructor(e, n, s, i, a) {
this.kind = e, this.startPos = n, this.endPos = s, this.value = i, this.leadingTrivia = [], this.trailingTrivia = [], this.leadingInvalid = [], this.trailingInvalid = [], this.isInvalid = a, this.start = n.offset, this.end = s.offset;
}
static create(e, n, s, i, a) {
return new Q(e, n, s, i, a);
}
}
function St(t) {
return t.trailingTrivia.find(({ kind: e }) => e === u.NEWLINE) !== void 0;
}
function Nt(t, e) {
return e.leadingTrivia.find(({ kind: s }) => s === u.NEWLINE) !== void 0 || St(t);
}
function Ze(t) {
return t.trailingTrivia.find(({ kind: e }) => [u.SPACE, u.TAB].includes(e)) !== void 0;
}
function Dt(t) {
return t.trailingTrivia.length === 0 ? t.end : Dt(Ve(t.trailingTrivia));
}
function xt(t) {
return t.leadingTrivia.length === 0 ? t.start : xt(t.leadingTrivia[0]);
}
function fn(t) {
return [u.SINGLE_LINE_COMMENT, u.MULTILINE_COMMENT].includes(
t.kind
);
}
class pn {
constructor() {
this.id = 0;
}
reset() {
this.id = 0;
}
nextId() {
return this.id++;
}
}
class x {
// 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((r) => r !== void 0 && !Number.isNaN(r.start));
i ? (this.startPos = i.startPos, this.fullStart = i instanceof Q ? xt(i) : i.fullStart) : (this.startPos = {
offset: NaN,
column: NaN,
line: NaN
}, this.fullStart = NaN);
const a = [...s].reverse().find((r) => r !== void 0 && !Number.isNaN(r.end));
a ? (this.endPos = a.endPos, this.fullEnd = a instanceof Q ? Dt(a) : a.fullEnd) : (this.endPos = {
offset: NaN,
column: NaN,
line: NaN
}, this.fullEnd = NaN), this.start = this.startPos.offset, this.end = this.endPos.offset;
}
}
var me = /* @__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.PARTIAL_INJECTION = "<partial-injection>", t))(me || {});
class K extends x {
constructor({ body: e = [], eof: n }, s) {
super(s, "<program>", [...e, n]), this.body = e, this.eof = n;
}
}
class y extends x {
constructor({
type: e,
name: n,
as: s,
alias: i,
attributeList: a,
bodyColon: r,
body: c
}, f) {
if (super(f, "<element-declaration>", [
e,
n,
s,
i,
a,
r,
c
]), c && r && !(c instanceof w || c instanceof y))
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 = a, this.bodyColon = r, this.body = c;
}
}
class ne extends x {
constructor({ identifiers: e = [] }, n) {
super(n, "<identifer-stream>", e || []), this.identifiers = e;
}
}
class se extends x {
constructor({
name: e,
colon: n,
value: s
}, i) {
super(i, "<attribute>", [e, n, s]), this.name = e, this.value = s, this.colon = n;
}
}
class Z extends x {
constructor({ op: e, expression: n }, s) {
super(s, "<prefix-expression>", [e, n]), this.op = e, this.expression = n;
}
}
class le extends x {
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 qe extends x {
constructor({ op: e, expression: n }, s) {
super(s, "<postfix-expression>", [n, e]), this.op = e, this.expression = n;
}
}
class ue extends x {
constructor({ value: e }, n) {
super(n, "<function-expression>", [e]), this.value = e;
}
}
class w extends x {
constructor({ callee: e, args: n = [] }, s) {
super(s, "<function-application>", [e, ...n]), this.callee = e, this.args = n;
}
}
class oe extends x {
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 be extends x {
constructor({ op: e, partial: n }, s) {
super(s, "<partial-injection>", [e, n]), this.partial = n;
}
}
class M extends x {
constructor({
listOpenBracket: e,
elementList: n = [],
commaList: s = [],
listCloseBracket: i
}, a) {
super(a, "<list-expression>", [
e,
...Ot(n, s),
i
]), this.listOpenBracket = e, this.elementList = n, this.commaList = s, this.listCloseBracket = i;
}
}
class ce extends x {
constructor({
tupleOpenParen: e,
elementList: n = [],
commaList: s = [],
tupleCloseParen: i
}, a) {
super(a, "<tuple-expression>", [
e,
...Ot(n, s),
i
]), this.tupleOpenParen = e, this.elementList = n, this.commaList = s, this.tupleCloseParen = i;
}
}
class nt extends ce {
constructor({
groupOpenParen: e,
expression: n,
groupCloseParen: s
}, i) {
super(
{
tupleOpenParen: e,
elementList: n && [n],
commaList: [],
tupleCloseParen: s
},
i
), this.kind = "<group-expression>";
}
}
class ee extends x {
constructor({
callee: e,
argumentList: n
}, s) {
super(s, "<call-expression>", [e, n]), this.callee = e, this.argumentList = n;
}
}
class ye extends x {
constructor({ literal: e }, n) {
super(n, "<literal>", [e]), this.literal = e;
}
}
class re extends x {
constructor({ variable: e }, n) {
super(n, "<variable>", [e]), this.variable = e;
}
}
class j extends x {
constructor({ expression: e }, n) {
super(n, "<primary-expression>", [e]), this.expression = e;
}
}
class Me extends x {
constructor({ pre: e }, n) {
const s = Q.create(u.SPACE, e.endPos, e.endPos, " ", !1);
super(n, "<dummy>", [s]);
}
}
class Ie extends x {
constructor({ expression: e, indexer: n }, s) {
super(s, "<array>", [e, n]), this.array = e, this.indexer = n;
}
}
function Ot(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 ? g.flatten(g.zip(t, e)) : g.flatten(g.zip(e, t))).filter(
(i) => i !== null
);
}
function Ss(t, e = !1) {
return JSON.stringify(
t,
function(n, s) {
var i;
return !(this instanceof K) && 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((a) => a.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 U {
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 U(e(this.value));
}
isOk() {
return !0;
}
}
class P {
constructor() {
this.value = void 0;
}
unwrap() {
throw new Error("Trying to unwrap a None value");
}
unwrap_or(e) {
return e;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
and_then(e) {
return new P();
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
map(e) {
return new P();
}
// eslint-disable-next-line class-methods-use-this
isOk() {
return !1;
}
}
var m = /* @__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.TablePartial = "TablePartial", t.TablePartialInjection = "TablePartialInjection", t))(m || {});
function st(t) {
return `Schema:${t}`;
}
function Ce(t) {
return `Table:${t}`;
}
function He(t) {
return `Column:${t}`;
}
function it(t) {
return `Enum:${t}`;
}
function at(t) {
return `Enum field:${t}`;
}
function rt(t) {
return `TableGroup:${t}`;
}
function ot(t) {
return `TableGroup field:${t}`;
}
function dn(t) {
return `Note:${t}`;
}
function lt(t) {
return `TablePartial:${t}`;
}
function Rt(t) {
return `TablePartialInjection:${t}`;
}
function Fe(t, e) {
switch (e) {
case "Column":
return He(t);
case "Enum":
return it(t);
case "Enum field":
return at(t);
case "Schema":
return st(t);
case "Table":
return Ce(t);
case "TableGroup":
return rt(t);
case "TableGroup field":
return ot(t);
case "TablePartial":
return lt(t);
default:
throw new Error("Unreachable");
}
}
function ie(t) {
const [e, n] = t.split(":");
return Object.values(m).includes(e) ? new U({
name: n,
kind: e
}) : new P();
}
function En(t) {
const e = ie(t).unwrap_or(void 0);
if (!e)
return !1;
const { kind: n, name: s } = e;
return n === "Schema" && s === "public";
}
function Nn(t) {
const e = ie(t).unwrap_or(void 0);
if (!e) return !1;
const { kind: n } = e;
return n === "TablePartialInjection";
}
function Tn(t) {
const e = ie(t).unwrap_or(void 0);
if (!e) return null;
const { kind: n, name: s } = e;
return n === "TablePartialInjection" ? Fe(
s,
"TablePartial"
/* TablePartial */
) : null;
}
class mn {
constructor() {
this.id = 0;
}
reset() {
this.id = 0;
}
nextId() {
return this.id++;
}
}
class Ut {
constructor({ symbolTable: e }, n) {
this.references = [], this.id = n, this.symbolTable = e;
}
}
class bn {
constructor({ symbolTable: e, declaration: n }, s) {
this.references = [], this.id = s, this.symbolTable = e, this.declaration = n;
}
}
class In {
constructor({ declaration: e }, n) {
this.references = [], this.id = n, this.declaration = e;
}
}
class Mt {
constructor({ symbolTable: e, declaration: n }, s) {
this.references = [], this.id = s, this.symbolTable = e, this.declaration = n;
}
}
class ct {
constructor({ declaration: e }, n) {
this.references = [], this.id = n, this.declaration = e;
}
}
class Ln {
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 _n {
constructor({ symbolTable: e, declaration: n }, s) {
this.references = [], this.id = s, this.symbolTable = e, this.declaration = n;
}
}
class gn {
constructor({ declaration: e }, n) {
this.references = [], this.id = n, this.declaration = e;
}
}
class vn {
constructor({ injectorFieldSymbol: e, injectorDeclaration: n }, s) {
this.references = [], this.id = s, this.injectorDeclaration = n, this.injectorFieldSymbol = e;
}
}
function wn(t) {
return [
st,
Ce,
it,
rt,
He,
at,
ot,
lt,
Rt
].map((e) => e(t));
}
function yn(t) {
return t instanceof ct ? vn : null;
}
function ze(t) {
return !!t.match(new RegExp("(\\p{L}|_|\\p{M})", "gu"));
}
function Xe(t) {
const [e] = t;
return e >= "0" && e <= "9";
}
function kn(t) {
const [e] = t;
return Xe(e) || ze(e) && e.toLowerCase() >= "a" && e.toLowerCase() <= "f";
}
function ve(t) {
return ze(t) || Xe(t);
}
function Tt(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 Se(t, e) {
return t >= e.start && t < e.end;
}
function Ft(t) {
var e;
return t instanceof Z ? `${(e = t.op) == null ? void 0 : e.value}${Ft(t.expression)}` : t.expression.literal.value;
}
function et(t) {
var e;
return t instanceof Z ? ((e = t.op) == null ? void 0 : e.value) === "-" ? -et(t.expression) : et(t.expression) : Number.parseFloat(t.expression.literal.value);
}
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.INVALID_TABLE_PARTIAL_CONTEXT = 3060] = "INVALID_TABLE_PARTIAL_CONTEXT", t[t.INVALID_TABLE_PARTIAL_ELEMENT_NAME = 3061] = "INVALID_TABLE_PARTIAL_ELEMENT_NAME", t[t.INVALID_TABLE_PARTIAL_SETTING = 3062] = "INVALID_TABLE_PARTIAL_SETTING", t[t.DUPLICATE_TABLE_PARTIAL_ELEMENT_NAME = 3063] = "DUPLICATE_TABLE_PARTIAL_ELEMENT_NAME", t[t.DUPLICATE_TABLE_PARTIAL_SETTING = 3064] = "DUPLICATE_TABLE_PARTIAL_SETTING", t[t.INVALID_TABLE_PARTIAL_INJECTION = 3065] = "INVALID_TABLE_PARTIAL_INJECTION", t[t.INVALID_TABLE_PARTIAL_INJECTION_OP = 3066] = "INVALID_TABLE_PARTIAL_INJECTION_OP", t[t.INVALID_TABLE_PARTIAL_INJECTION_NAME = 3067] = "INVALID_TABLE_PARTIAL_INJECTION_NAME", t[t.DUPLICATE_TABLE_PARTIAL_INJECTION_NAME = 3068] = "DUPLICATE_TABLE_PARTIAL_INJECTION_NAME", 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 l 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, l.prototype);
}
}
class J {
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 J(n.value, s);
}
map(e) {
return new J(e(this.value), this.errors);
}
}
function Pn(t, e, n) {
if (!t || !Ne(t) || e.length === 0)
return new P();
const s = [...e], i = mt(t).unwrap(), a = s.pop();
if (!(a instanceof oe))
return new P();
const r = g.last(s) instanceof M ? s.pop() : void 0;
if (s.length === 3) {
const c = mt(s[1]).value;
return !c || !tt(c) ? new P() : new U(
n.create(y, {
type: i,
name: s[0],
as: c,
alias: s[2],
attributeList: r,
body: a
})
);
}
return s.length === 1 ? new U(
n.create(y, {
type: i,
name: s[0],
attributeList: r,
body: a
})
) : s.length === 0 ? new U(
n.create(y, {
type: i,
attributeList: r,
body: a
})
) : new P();
}
function tt(t) {
return t.kind === u.IDENTIFIER && t.value === "as";
}
function b(t) {
t && (t instanceof Q ? Sn(t) : Dn(t));
}
function Sn(t) {
t.kind !== u.EOF && (t.isInvalid = !0);
}
function Dn(t) {
if (t instanceof y)
b(t.type), b(t.name), b(t.as), b(t.alias), b(t.bodyColon), b(t.attributeList), b(t.body);
else if (t instanceof ne)
t.identifiers.forEach(b);
else if (t instanceof se)
b(t.name), b(t.colon), b(t.value);
else if (t instanceof Z)
b(t.op), b(t.expression);
else if (t instanceof le)
b(t.leftExpression), b(t.op), b(t.rightExpression);
else if (t instanceof qe)
b(t.op), b(t.expression);
else if (t instanceof oe)
b(t.blockOpenBrace), t.body.forEach(b), b(t.blockCloseBrace);
else if (t instanceof M)
b(t.listOpenBracket), t.commaList.forEach(b), t.elementList.forEach(b), b(t.listCloseBracket);
else if (t instanceof ce)
b(t.tupleOpenParen), t.commaList.forEach(b), t.elementList.forEach(b), b(t.tupleCloseParen);
else if (t instanceof ee)
b(t.callee), b(t.argumentList);
else if (t instanceof w)
b(t.callee), t.args.forEach(b);
else if (t instanceof j)
b(t.expression);
else if (t instanceof ue)
b(t.value);
else if (t instanceof re)
b(t.variable);
else if (t instanceof ye)
b(t.literal);
else throw t instanceof nt ? new Error("This case is handled by the TupleExpressionNode case") : new Error("Unreachable case in markInvalidNode");
}
function Bt(t) {
return !!(t != null && t.isInvalid);
}
function C(...t) {
return t.filter((e) => e !== void 0);
}
function xn(t) {
if (t instanceof K)
return C(...t.body, t.eof);
if (t instanceof y)
return C(
t.type,
t.name,
t.as,
t.alias,
t.attributeList,
t.bodyColon,
t.body
);
if (t instanceof se)
return C(t.name, t.colon, t.value);
if (t instanceof ne)
return t.identifiers;
if (t instanceof ye)
return t.literal ? [t.literal] : [];
if (t instanceof re)
return C(t.variable);
if (t instanceof Z)
return C(t.op, t.expression);
if (t instanceof le)
return C(t.leftExpression, t.op, t.rightExpression);
if (t instanceof qe)
return C(t.expression, t.op);
if (t instanceof ue)
return C(t.value);
if (t instanceof w)
return C(t.callee, ...t.args);
if (t instanceof oe)
return C(t.blockOpenBrace, ...t.body, t.blockCloseBrace);
if (t instanceof M)
return C(
t.listOpenBracket,
...Tt(t.elementList, t.commaList),
t.listCloseBracket
);
if (t instanceof ce)
return C(
t.tupleOpenParen,
...Tt(t.elementList, t.commaList),
t.tupleCloseParen
);
if (t instanceof ee)
return C(t.callee, t.argumentList);
if (t instanceof j)
return C(t.expression);
if (t instanceof Ie)
return C(
t.array,
t.indexer
);
if (t instanceof be) return C(t.partial);
throw t instanceof nt ? new Error("This case is already handled by TupleExpressionNode") : new Error("Unreachable - no other possible cases");
}
function mt(t) {
return $(t) ? new U(t.expression.variable) : new P();
}
function Y(t) {
var e;
return t instanceof j && (t.expression instanceof re && t.expression.variable instanceof Q && t.expression.variable.kind === u.QUOTED_STRING || t.expression instanceof ye && ((e = t.expression.literal) == null ? void 0 : e.kind) === u.STRING_LITERAL);
}
function $(t) {
return t instanceof j && t.expression instanceof re && t.expression.variable instanceof Q;
}
function Ne(t) {
var e;
return t instanceof j && t.expression instanceof re && ((e = t.expression.variable) == null ? void 0 : e.kind) === u.IDENTIFIER;
}
function ut(t) {
var e;
return t instanceof le && t.leftExpression instanceof x && t.rightExpression instanceof x && ((e = t.op) == null ? void 0 : e.value) === ".";
}
function we(t) {
if (t === void 0)
return new P();
const e = t.identifiers.map((n) => n.value).join(" ");
return e === "" ? new P() : new U(e);
}
class On {
// 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 Q.create(
e,
this.start,
this.current,
this.text.substring(this.start.offset, this.current.offset),
n
);
}
lex() {
return this.scanTokens(), this.tokens.push(Q.create(u.EOF, this.start, this.current, "", !1)), this.gatherTrivia(), this.gatherInvalid(), new J(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.addToken(u.TILDE);
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(e);
break;
default:
if (hn(e)) {
this.operator(e);
break;
}
if (ze(e)) {
this.identifier();
break;
}
if (Xe(e)) {
this.numericLiteralOrIdentifier();
break;
}
this.addToken(u.OP, !0), this.errors.push(
new l(
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 a of this.tokens)
un(a) ? (n.push(a), a.kind === u.NEWLINE && s && (s.trailingTrivia = n, e = !0, s = void 0, n = [])) : (e ? a.leadingTrivia = n : s.trailingTrivia = n, i.push(a), n = [], s = a, e = !1);
this.tokens = i;
}
gatherInvalid() {
let e;
const n = [], s = [];
for (e = 0; e < this.tokens.length && Bt(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 a = this.tokens[e];
a.isInvalid ? i.trailingInvalid.push(a) : (i = a, n.push(a));
}
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: a,
// Whether to interpret '\' as a backlash
consumeStopSequence: r = !0
}) {
let c = "";
for (; !this.isAtEnd() && (s || !this.check(`
`)) && !this.check(n); )
this.peek() === "\\" && !a ? (this.advance(), c += this.escapedString()) : c += this.advance();
if (this.isAtEnd() && !i) {
const f = this.createToken(e, !0);
this.tokens.push(f), this.errors.push(
new l(o.UNEXPECTED_EOF, "EOF reached while parsing", f)
);
return;
}
if (this.check(`
`) && !s) {
const f = this.createToken(e, !0);
this.tokens.push(f), this.errors.push(
new l(
o.UNEXPECTED_NEWLINE,
"Invalid newline encountered while parsing",
f
)
);
return;
}
r && this.match(n), this.tokens.push(Q.create(e, this.start, this.current, c, !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() && ve(this.peek()); )
this.advance();
this.addToken(u.IDENTIFIER);
}
operator(e) {
switch (e) {
case "<":
[">", "="].includes(this.peek()) && this.advance();
break;
case ">":
this.peek() === "=" && this.advance();
break;
case "=":
this.peek() === "=" && this.advance();
break;
case "!":
this.peek() === "=" && this.advance();
break;
}
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 && !ve(this.peek()))
return this.addToken(u.NUMERIC_LITERAL);
if (!n && !Xe(this.peek()))
break;
this.advance();
}
if (e > 0) {
for (; !this.isAtEnd() && (this.check(".") || ve(this.peek())); )
this.advance();
const n = this.createToken(u.NUMERIC_LITERAL, !0);
this.tokens.push(n), this.errors.push(new l(o.UNKNOWN_TOKEN, "Invalid number", n));
} else {
for (; !this.isAtEnd() && ve(this.peek()); )
this.advance();
const n = this.createToken(u.IDENTIFIER, !1);
this.tokens.push(n);
}
}
colorLiteral() {
for (; !this.isAtEnd() && ve(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() || !ve(this.peek()))
return this.errors.push(new l(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`, Q.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 Be = /* @__PURE__ */ ((t) => (t[t.ListExpression = 0] = "ListExpression", t[t.GroupExpression = 1] = "GroupExpression", t[t.BlockExpression = 2] = "BlockExpression", t))(Be || {});
class Rn {
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 g.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(
(a) => [
1,
0
/* ListExpression */
].includes(a)
);
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 Un {
constructor(e) {
this.generator = e;
}
create(e, n) {
return new e(n, this.generator.nextId());
}
}
class T {
constructor(e, n, s) {
this.token = e, this.partialNode = n, this.handlerContext = s;
}
}
class Mn {
constructor(e, n) {
this.current = 0, this.errors = [], this.contextStack = new Rn(), this.synchronizeProgram = () => {
const s = this.peek();
s.kind !== u.EOF ? b(this.advance()) : (b(this.peek()), this.logError(s, o.UNEXPECTED_EOF, "Unexpected EOF"));
}, this.synchronizeElementDeclarationName = () => {
for (; !this.isAtEnd(); ) {
const s = this.peek();
if (tt(s) || this.check(u.COLON, u.LBRACE, u.LBRACKET))
break;
b(s), this.advance();
}
}, this.synchronizeElementDeclarationAlias = () => {
for (; !this.isAtEnd(); ) {
const s = this.peek();
if (this.check(u.COLON, u.LBRACE, u.LBRACKET))
break;
b(s), this.advance();
}
}, this.blockExpression = this.contextStack.withContextDo(Be.BlockExpression, () => {
const s = { body: [] }, i = () => this.nodeFactory.create(oe, s);
try {
this.consume("Expect an opening brace '{'", u.LBRACE), s.blockOpenBrace = this.previous();
} catch (a) {
if (!(a instanceof T))
throw a;
if (s.blockOpenBrace = a.partialNode, !this.canHandle(a))
throw new T(a.token, i(), a.handlerContext);
this.synchronizeBlock();
}
for (; !this.isAtEnd() && !this.check(u.RBRACE); )
try {
if (this.match(u.TILDE)) {
const a = this.previous(), r = this.variable(), c = this.nodeFactory.create(be, { op: a, partial: r });
s.body.push(c);
} else
s.body.push(this.canBeField() ? this.fieldDeclaration() : this.expression());
} catch (a) {
if (!(a instanceof T))
throw a;
if (s.body.push(a.partialNode), !this.canHandle(a))
throw new T(a.token, i(), a.handlerContext);
this.synchronizeBlock();
}
try {
this.consume("Expect a closing brace '}'", u.RBRACE), s.blockCloseBrace = this.previous();
} catch (a) {
if (!(a instanceof T))
throw a;
if (s.blockCloseBrace = a.partialNode, !this.canHandle(a))
throw new T(a.token, i(), a.handlerContext);
this.synchronizeBlock();
}
return i();
}), this.synchronizeBlock = () => {
if (!this.check(u.RBRACE))
for (b(this.advance()); !this.isAtEnd(); ) {
const s = this.peek();
if (this.check(u.RBRACE) || Nt(this.previous(), s))
break;
b(s), this.advance();
}
}, this.tupleExpression = this.contextStack.withContextDo(Be.GroupExpression, () => {
const s = { elementList: [], commaList: [] }, i = () => this.nodeFactory.create(nt, {
groupOpenParen: s.tupleOpenParen,
groupCloseParen: s.tupleCloseParen,
expression: s.elementList[0]
}), a = () => this.nodeFactory.create(ce, s);
try {
this.consume("Expect an opening parenthesis '('", u.LPAREN), s.tupleOpenParen = this.previous();
} catch (r) {
if (!(r instanceof T))
throw r;
if (s.tupleOpenParen = r.partialNode, !this.canHandle(r))
throw new T(r.token, a(), r.handlerContext);
this.synchronizeTuple();
}
if (!this.isAtEnd() && !this.check(u.RPAREN))
try {
s.elementList.push(this.normalExpression());
} catch (r) {
if (!(r instanceof T))
throw r;
if (s.elementList.push(r.partialNode), !this.canHandle(r))
throw new T(r.token, i(), r.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 (r) {
if (!(r instanceof T))
throw r;
if (r.partialNode instanceof x && s.elementList.push(r.partialNode), !this.canHandle(r))
throw new T(r.token, a(), r.handlerContext);
this.synchronizeTuple();
}
try {
this.consume("Expect a closing parenthesis ')'", u.RPAREN), s.tupleCloseParen = this.previous();
} catch (r) {
if (!(r instanceof T))
throw r;
if (s.tupleCloseParen = r.partialNode, !this.canHandle(r))
throw new T(r.token, a(), r.handlerContext);
this.synchronizeTuple();
}
return s.elementList.length === 1 ? i() : a();
}), this.synchronizeTuple = () => {
for (; !this.isAtEnd(); ) {
const s = this.peek();
if (this.check(u.RPAREN, u.COMMA))
break;
b(s), this.advance();
}
}, this.listExpression = this.contextStack.withContextDo(Be.ListExpression, () => {
const s = { elementList: [], commaList: [] }, i = () => this.nodeFactory.create(M, s);
try {
this.consume("Expect an opening bracket '['", u.LBRACKET), s.listOpenBracket = this.previous();
} catch (a) {
if (!(a instanceof T))
throw a;
if (s.listOpenBracket = a.partialNode, !this.canHandle(a))
throw new T(a.token, i(), a.handlerContext);
this.synchronizeList();
}
if (!this.isAtEnd() && !this.check(u.RBRACKET))
try {
s.elementList.push(this.attribute());
} catch (a) {
if (!(a instanceof T))
throw a;
if (s.elementList.push(a.partialNode), !this.canHandle(a))
throw new T(a.token, i(), a.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 (a) {
if (!(a instanceof T))
throw a;
if (a.partialNode instanceof x && s.elementList.push(a.partialNode), !this.canHandle(a))
throw new T(a.token, i(), a.handlerContext);
this.synchronizeList();
}
try {
this.consume("Expect a closing bracket ']'", u.RBRACKET), s.listCloseBracket = this.previous();
} catch (a) {
if (!(a instanceof T))
throw a;
if (s.listCloseBracket = a.partialNode, !this.canHandle(a))
throw new T(a.token, i(), a.handlerContext);
this.synchronizeList();
}
return i();
}), this.synchronizeList = () => {
for (; !this.isAtEnd(); ) {
const s = this.peek();
if (this.check(u.COMMA, u.RBRACKET))
break;
b(s), this.advance();
}
}, this.synchronizeAttributeName = () => {
for (; !this.isAtEnd(); ) {
const s = this.peek();
if (this.check(u.COMMA, u.RBRACKET, u.COLON))
break;
b(s), this.advance();
}
}, this.synchronizeAttributeValue = () => {
for (; !this.isAtEnd(); ) {
const s = this.peek();
if (this.check(u.COMMA, u.RBRACKET))
break;
b(s), this.advance();
}
}, this.tokens = e, this.nodeFactory = new Un(n);
}
isAtEnd() {
return this.current >= this.tokens.length || this.tokens[this.current].kind === u.EOF;
}
advance() {
return this.isAtEnd() ? g.last(this.tokens) : this.tokens[this.current++];
}
peek(e = 0) {
return e + this.current >= this.tokens.length ? g.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 T(
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 (b(this.peek()), this.logError(this.advance(), o.UNEXPECTED_TOKEN, e); !this.isAtEnd() && !this.check(...n); )
b(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 a = this.tokens[i];
a.isInvalid ? s.trailingInvalid.push(a) : (s = a, e.push(s));
}
this.tokens = e;
}
parse() {
const e = this.program(), n = this.advance(), s = this.nodeFactory.create(K, { body: e, eof: n });
return this.gatherInvalid(), new J({ 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 T))
throw n;
e.push(n.partialNode), this.synchronizeProgram();
}
return e;
}
/* Parsing and synchronizing top-level ElementDeclarationNode */
elementDeclaration() {
const e = {}, n = () => this.nodeFactory.create(y, e);
try {
this.consume("Expect an identifier", u.IDENTIFIER), e.type = this.previous();
} catch (s) {
throw s instanceof T ? (e.type = s.partialNode, new T(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 T))
throw s;
if (e.name = s.partialNode, !this.canHandle(s))
throw new T(s.token, n(), s.handlerContext);
this.synchronizeElementDeclarationName();
}
if (tt(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 T))
throw s;
if (e.alias = s.partialNode, !this.canHandle(s))
throw new T(s.token, n(), s.handlerContext);
this.synchronizeElementDeclarationAlias();
}
try {
e.attributeList = this.check(u.LBRACKET) ? this.listExpression() : void 0;
} catch (s) {
throw s instanceof T ? (e.attributeList = s.partialNode, new T(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 y ? (b(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 T ? (e.body = s.partialNode, new T(s.token, n(), s.handlerContext)) : s;
}
return this.nodeFactory.create(y, 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(y, e);
try {
this.consume("Expect an identifier", u.IDENTIFIER), e.type = this.previous();
} catch (s) {
throw s instanceof T ? (e.type = s.partialNode, new T(s.token, n(), s.handlerContext)) : s;
}
try {
this.consume("Expect a colon ':'", u.COLON), e.bodyColon = this.previous();
} catch (s) {
throw s instanceof T ? (e.bodyColon = s.partialNode, new T(s.token, n(), s.handlerContext)) : s;
}
try {
const s = this.expression();
s instanceof y ? this.errors.push(new l(o.INVALID_ELEMENT_IN_SIMPLE_BODY, "Simple body cannot be an element declaration", s)) : e.body = s;
} catch (s) {
throw s instanceof T ? (e.body = s.partialNode, new T(s.token, n(), s.handlerContext)) : s;
}
return this.nodeFactory.create(y, e);
}
/* Parsing any ExpressionNode, including non-NormalExpression */
expression() {
const e = { args: [] }, n = () => Pn(e.callee, e.args, this.nodeFactory).unwrap_or(
this.nodeFactory.create(w, e)
);
try {
e.callee = this.normalExpression();
} catch (i) {
throw i instanceof T ? (e.callee = i.partialNode, new T(i.token, n(), i.handlerContext)) : i;
}