@dbml/parse
Version:
> TODO: description
4,402 lines • 148 kB
JavaScript
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.handlerContext)) : l;
}
}
} else
break;
}
return n;
}
leftExpression_bp() {
let e;
if (ct(this.peek())) {
const n = {};
n.op = this.peek();
const s = In(n.op);
if (s.right === null)
throw this.logError(
n.op,
o.UNKNOWN_PREFIX_OP,
`Unexpected '${n.op.value}' in an expression`
), new d(
n.op,
this.nodeFactory.create(Se, { pre: n.op }),
this.contextStack.findHandlerContext(this.tokens, this.current)
);
this.advance();
try {
n.expression = this.expression_bp(s.right);
} catch (i) {
throw i instanceof d ? (n.expression = i.partialNode, new d(
i.token,
this.nodeFactory.create(H, n),
i.handlerContext
)) : i;
}
e = this.nodeFactory.create(H, n);
} else if (e = this.extractOperand(), e instanceof Se)
throw new d(
this.peek(),
this.nodeFactory.create(Se, { pre: this.peek() }),
this.contextStack.findHandlerContext(this.tokens, this.current)
);
return e;
}
// Extract an operand to be used in a normal form expression
// e.g (1 + 2) in (1 + 2) * 3
// e.g [1, 2, 3, 4]
// e.g { ... }
extractOperand() {
return this.check(
u.NUMERIC_LITERAL,
u.STRING_LITERAL,
u.COLOR_LITERAL,
u.QUOTED_STRING,
u.IDENTIFIER
) ? this.primaryExpression() : this.check(u.FUNCTION_EXPRESSION) ? this.functionExpression() : this.check(u.LBRACKET) ? this.listExpression() : this.check(u.LBRACE) ? this.blockExpression() : this.check(u.LPAREN) ? this.tupleExpression() : (this.peek().kind === u.EOF ? this.logError(
this.peek(),
o.UNEXPECTED_EOF,
"Unexpected EOF"
) : this.logError(
this.peek(),
o.INVALID_OPERAND,
`Invalid start of operand "${this.peek().value}"`
), this.nodeFactory.create(Se, { pre: this.previous() }));
}
/* Parsing FunctionExpression */
functionExpression() {
const e = {};
try {
this.consume("Expect a function expression", u.FUNCTION_EXPRESSION), e.value = this.previous();
} catch (n) {
throw n instanceof d ? (e.value = n.partialNode, new d(
n.token,
this.nodeFactory.create(se, e),
n.handlerContext
)) : n;
}
return this.nodeFactory.create(se, e);
}
canBeField() {
return this.peek().kind === u.IDENTIFIER && this.peek(1).kind === u.COLON;
}
/* Parsing PrimaryExpression */
primaryExpression() {
if (this.match(
u.COLOR_LITERAL,
u.STRING_LITERAL,
u.NUMERIC_LITERAL
))
return this.nodeFactory.create(M, {
expression: this.nodeFactory.create(be, { literal: this.previous() })
});
if (this.match(u.QUOTED_STRING, u.IDENTIFIER))
return this.nodeFactory.create(M, {
expression: this.nodeFactory.create(te, { variable: this.previous() })
});
throw this.logError(this.peek(), o.UNEXPECTED_TOKEN, "Expect a variable or literal"), new d(
this.peek(),
void 0,
this.contextStack.findHandlerContext(this.tokens, this.current)
);
}
attribute() {
const e = {};
if (this.check(u.COLON, u.RBRACKET, u.COMMA)) {
const n = this.peek();
this.logError(
n,
o.EMPTY_ATTRIBUTE_NAME,
"Expect a non-empty attribute name"
), e.name = this.nodeFactory.create(q, { identifiers: [] });
} else
try {
e.name = this.attributeName();
} catch (n) {
if (!(n instanceof d))
throw n;
if (e.name = n.partialNode, !this.canHandle(n))
throw new d(
n.token,
this.nodeFactory.create(ie, e),
n.handlerContext
);
this.synchronizeAttributeName();
}
return this.match(u.COLON) && (e.colon = this.previous(), e.value = this.attributeValue()), this.nodeFactory.create(ie, e);
}
attributeValue() {
let e;
try {
e = this.peek().kind === u.IDENTIFIER && this.peek(1).kind === u.IDENTIFIER ? this.attributeName() : this.normalExpression();
} catch (n) {
if (!(n instanceof d) || !this.canHandle(n))
throw n;
e = n.partialNode, this.synchronizeAttributeValue();
}
return e;
}
attributeName() {
const e = [];
if (this.peek().kind !== u.IDENTIFIER)
return this.primaryExpression();
for (; !this.isAtEnd() && !this.check(u.COLON, u.COMMA, u.RBRACKET); )
try {
this.consume("Expect an identifier", u.IDENTIFIER), e.push(this.previous());
} catch (n) {
throw n instanceof d ? new d(
n.token,
this.nodeFactory.create(q, { identifiers: e }),
n.handlerContext
) : n;
}
return this.nodeFactory.create(q, { identifiers: e });
}
logError(e, n, s) {
this.errors.push(new c(n, s, e));
}
}
const mn = {
"+": { left: 9, right: 10 },
"*": { left: 11, right: 12 },
"-": { left: 9, right: 10 },
"/": { left: 11, right: 12 },
"%": { left: 11, right: 12 },
"<": { left: 7, right: 8 },
"<=": { left: 7, right: 8 },
">": { left: 7, right: 8 },
">=": { left: 7, right: 8 },
"<>": { left: 7, right: 8 },
"=": { left: 2, right: 3 },
"==": { left: 4, right: 5 },
"!=": { left: 4, right: 5 },
".": { left: 16, right: 17 }
};
function Tn(t) {
return mn[t.value] || { left: null, right: null };
}
const bn = {
"+": { left: null, right: 15 },
"-": { left: null, right: 15 },
"<": { left: null, right: 15 },
">": { left: null, right: 15 },
"<>": { left: null, right: 15 },
"!": { left: null, right: 15 }
};
function In(t) {
return bn[t.value] || { left: null, right: null };
}
const Ln = {
"(": { left: 14, right: null }
};
function pt(t) {
return Ln[t.value] || { left: null, right: null };
}
var b = /* @__PURE__ */ ((t) => (t.Table = "table", t.Enum = "enum", t.Ref = "ref", t.Note = "note", t.Project = "project", t.Indexes = "indexes", t.TableGroup = "tablegroup", t))(b || {});
function we(t) {
var n;
const e = (n = t == null ? void 0 : t.type) == null ? void 0 : n.value.toLowerCase();
switch (e) {
case b.Enum:
case b.Table:
case b.Indexes:
case b.Note:
case b.Project:
case b.Ref:
case b.TableGroup:
return new x(e);
default:
return new y();
}
}
function pe(t) {
if (!et(t))
return new x([t]);
const e = pe(t.leftExpression).unwrap_or(void 0);
return e ? (e.push(t.rightExpression), new x(e)) : new y();
}
function z(t) {
if (t === void 0)
return new y();
const e = pe(t).unwrap_or(void 0);
if (!e)
return new y();
const n = [];
for (const s of e) {
const i = Q(s).unwrap_or(void 0);
if (!i)
return new y();
n.push(i);
}
return new x(n);
}
function Ae(t) {
if (t === void 0)
return new y();
const e = pe(t).unwrap_or(void 0);
if (!e || e.length === 0)
return new y();
const n = [];
let s;
if (!V(I.last(e))) {
const i = e.pop();
if (Dt(i))
s = i.elementList.map(
(r) => W(r).unwrap()
);
else
return new y();
}
for (const i of e) {
const r = Q(i).unwrap_or(void 0);
if (!r)
return new y();
n.push(r);
}
return new x({
variables: n,
tupleElements: s
});
}
function Q(t) {
return V(t) ? new x(t.expression.variable.value) : new y();
}
function je(t) {
if (dt(t))
return t instanceof se ? new x({ functional: [t], nonFunctional: [] }) : new x({ functional: [], nonFunctional: [t] });
if (t instanceof ee && t.elementList.every(dt)) {
const e = t.elementList.filter(
(s) => s instanceof se
), n = t.elementList.filter(V);
return new x({ functional: e, nonFunctional: n });
}
return new y();
}
function W(t) {
var n;
const e = (n = t == null ? void 0 : t.expression.variable) == null ? void 0 : n.value;
return e === void 0 ? new y() : new x(e);
}
function $(t) {
return Y(t) ? t.expression instanceof te ? new x(t.expression.variable.value) : new x(t.expression.literal.value) : new y();
}
function gn(t) {
var e;
return !(t instanceof J) || !Ot((e = t.op) == null ? void 0 : e.value) ? !1 : Ae(t.leftExpression).and_then(() => Ae(t.rightExpression)).unwrap_or(void 0) !== void 0;
}
function _n(t) {
const e = Ae(t.leftExpression), n = Ae(t.rightExpression);
if (!e.isOk() || !n.isOk())
return !1;
const { tupleElements: s } = e.unwrap(), { tupleElements: i } = n.unwrap();
return (s == null ? void 0 : s.length) === (i == null ? void 0 : i.length);
}
function dt(t) {
return t instanceof M && t.expression instanceof te || t instanceof se;
}
function An(t, e) {
var i, r, a, l;
let n = e;
const s = Kt(t);
for (; n; ) {
if ((r = (i = n.symbol) == null ? void 0 : i.symbolTable) != null && r.has(t))
return (a = n.symbol.symbolTable) == null ? void 0 : a.get(t);
if (((l = n.symbol) == null ? void 0 : l.declaration) instanceof j && s)
return n.symbol;
if (n instanceof j)
return;
n = n.parent;
}
}
class vn {
constructor(e, n, s) {
this.declarationNode = e, this.publicSymbolTable = n, this.symbolFactory = s;
}
validate() {
return [...this.validateContext(), ...this.validateName(this.declarationNode.name), ...this.validateAlias(this.declarationNode.alias), ...this.validateSettingList(this.declarationNode.attributeList), ...this.validateBody(this.declarationNode.body)];
}
validateContext() {
return this.declarationNode.parent instanceof j || we(this.declarationNode.parent).unwrap_or(void 0) !== b.Project ? [new c(o.INVALID_CUSTOM_CONTEXT, "A custom element can only appear in a Project", this.declarationNode)] : [];
}
validateName(e) {
return e ? [new c(o.UNEXPECTED_NAME, "A Custom element shouldn't have a name", e)] : [];
}
validateAlias(e) {
return e ? [new c(o.UNEXPECTED_NAME, "A Custom element shouldn't have an alias", e)] : [];
}
validateSettingList(e) {
return e ? [new c(o.UNEXPECTED_SETTINGS, "A Custom element shouldn't have a setting list", e)] : [];
}
validateBody(e) {
if (!e)
return [];
if (e instanceof K)
return [new c(o.UNEXPECTED_COMPLEX_BODY, "A Custom element can only have an inline field", e)];
const n = [];
return Y(e.callee) || n.push(new c(o.INVALID_CUSTOM_ELEMENT_VALUE, "A Custom element value can only be a string", e)), e.args.length > 0 && n.push(...e.args.map((s) => new c(o.INVALID_CUSTOM_ELEMENT_VALUE, "A Custom element value can only be a string", s))), n;
}
}
class ye {
constructor() {
this.table = /* @__PURE__ */ new Map();
}
has(e) {
return this.table.has(e);
}
set(e, n) {
this.table.set(e, n);
}
get(e, n) {
return this.table.get(e) || n !== void 0 && this.set(e, n) || n;
}
entries() {
return this.table.entries();
}
}
class wn {
constructor(e, n, s) {
this.declarationNode = e, this.publicSymbolTable = n, this.symbolFactory = s;
}
validate() {
return [...this.validateContext(), ...this.validateName(this.declarationNode.name), ...this.validateAlias(this.declarationNode.alias), ...this.validateSettingList(this.declarationNode.attributeList), ...this.registerElement(), ...this.validateBody(this.declarationNode.body)];
}
validateContext() {
return this.declarationNode.parent instanceof A ? [new c(o.INVALID_PROJECT_CONTEXT, "An Enum can only appear top-level", this.declarationNode)] : [];
}
validateName(e) {
return e ? St(e) ? [] : [new c(o.INVALID_NAME, "An Enum name must be of the form <enum> or <schema>.<enum>", e)] : [new c(o.NAME_NOT_FOUND, "An Enum must have a name", this.declarationNode)];
}
validateAlias(e) {
return e ? [new c(o.UNEXPECTED_ALIAS, "A Ref shouldn't have an alias", e)] : [];
}
registerElement() {
const e = [];
this.declarationNode.symbol = this.symbolFactory.create(sn, { declaration: this.declarationNode, symbolTable: new ye() });
const { name: n } = this.declarationNode, s = z(n);
if (s.isOk()) {
const i = s.unwrap(), r = i.pop(), a = tt(i, this.publicSymbolTable, this.symbolFactory), l = He(r);
a.has(l) && e.push(new c(o.DUPLICATE_NAME, `Enum name ${r} already exists in schema '${i.join(".") || "public"}'`, n)), a.set(l, this.declarationNode.symbol);
}
return e;
}
validateSettingList(e) {
return e ? [new c(o.UNEXPECTED_SETTINGS, "An Enum shouldn't have a setting list", e)] : [];
}
validateBody(e) {
if (!e)
return [];
if (e instanceof v)
return this.validateFields([e]);
const [n, s] = I.partition(e.body, (i) => i instanceof v);
return [...this.validateFields(n), ...this.validateSubElements(s)];
}
validateFields(e) {
return e.length === 0 ? [new c(o.EMPTY_ENUM, "An Enum must have at least one element", this.declarationNode)] : e.flatMap((n) => {
const s = [];
n.callee && !V(n.callee) && s.push(new c(o.INVALID_ENUM_ELEMENT_NAME, "An enum field must be an identifier or a quoted identifier", n.callee));
const i = [...n.args];
return I.last(i) instanceof R ? (s.push(...this.validateFieldSettings(I.last(i))), i.pop()) : i[0] instanceof R && (s.push(...this.validateFieldSettings(i[0])), i.shift()), i.length > 0 && s.push(...i.map((r) => new c(o.INVALID_ENUM_ELEMENT, "An Enum must have only a field and optionally a setting list", r))), s.push(...this.registerField(n)), s;
});
}
validateFieldSettings(e) {
const n = C(e), s = n.getErrors(), i = n.getValue();
for (const r in i) {
const a = i[r];
switch (r) {
case "note":
a.length > 1 && a.forEach((l) => s.push(new c(o.DUPLICATE_ENUM_ELEMENT_SETTING, "'note' can only appear once", l))), a.forEach((l) => {
Y(l.value) || s.push(new c(o.INVALID_ENUM_ELEMENT_SETTING, "'note' must be a string", l));
});
break;
default:
a.forEach((l) => s.push(new c(o.UNKNOWN_ENUM_ELEMENT_SETTING, `Unknown enum field setting '${r}'`, l)));
}
}
return s;
}
validateSubElements(e) {
return e.flatMap((n) => {
if (n.parent = this.declarationNode, !n.type)
return [];
const s = oe(n);
return new s(n, this.publicSymbolTable, this.symbolFactory).validate();
});
}
registerField(e) {
if (e.callee && V(e.callee)) {
const n = W(e.callee).unwrap(), s = Je(n), i = this.symbolFactory.create(rn, { declaration: e });
e.symbol = i;
const r = this.declarationNode.symbol.symbolTable;
if (r.has(s)) {
const a = r.get(s);
return [
new c(o.DUPLICATE_COLUMN_NAME, `Duplicate enum field ${n}`, e),
new c(o.DUPLICATE_COLUMN_NAME, `Duplicate enum field ${n}`, a.declaration)
];
}
r.set(s, i);
}
return [];
}
}
class yn {
constructor(e, n, s) {
this.declarationNode = e, this.publicSymbolTable = n, this.symbolFactory = s;
}
validate() {
return [...this.validateContext(), ...this.validateName(this.declarationNode.name), ...this.validateAlias(this.declarationNode.alias), ...this.validateSettingList(this.declarationNode.attributeList), ...this.validateBody(this.declarationNode.body)];
}
validateContext() {
return this.declarationNode.parent instanceof j || we(this.declarationNode.parent).unwrap_or(void 0) !== b.Table ? [new c(o.INVALID_NOTE_CONTEXT, "An Indexes can only appear inside a Table", this.declarationNode)] : [];
}
validateName(e) {
return e ? [new c(o.UNEXPECTED_NAME, "An Indexes shouldn't have a name", e)] : [];
}
validateAlias(e) {
return e ? [new c(o.UNEXPECTED_ALIAS, "An Indexes shouldn't have an alias", e)] : [];
}
validateSettingList(e) {
return e ? [new c(o.UNEXPECTED_SETTINGS, "An Indexes shouldn't have a setting list", e)] : [];
}
validateBody(e) {
if (!e)
return [];
if (e instanceof v)
return [new c(o.UNEXPECTED_SIMPLE_BODY, "An Indexes must have a complex body", e)];
const [n, s] = I.partition(e.body, (i) => i instanceof v);
return [...this.validateFields(n), ...this.validateSubElements(s)];
}
validateFields(e) {
return e.flatMap((n) => {
if (!n.callee)
return [];
const s = [], i = [n.callee, ...n.args];
return I.last(i) instanceof R && s.push(...this.validateFieldSetting(i.pop())), i.forEach((r) => {
for (; r instanceof Z; )
r.argumentList && !je(r.argumentList).isOk() && s.push(new c(o.INVALID_INDEXES_FIELD, "An index field must be an identifier, a quoted identifier, a functional expression or a tuple of such", r.argumentList)), r = r.callee;
je(r).isOk() || s.push(new c(o.INVALID_INDEXES_FIELD, "An index field must be an identifier, a quoted identifier, a functional expression or a tuple of such", r));
}), s;
});
}
validateFieldSetting(e) {
const n = C(e), s = n.getErrors(), i = n.getValue();
for (const r in i) {
const a = i[r];
switch (r) {
case "note":
case "name":
a.length > 1 && a.forEach((l) => s.push(new c(o.DUPLICATE_INDEX_SETTING, `'${r}' can only appear once`, l))), a.forEach((l) => {
Y(l.value) || s.push(new c(o.INVALID_INDEX_SETTING_VALUE, `'${r}' must be a string`, l));
});
break;
case "unique":
case "pk":
a.length > 1 && a.forEach((l) => s.push(new c(o.DUPLICATE_INDEX_SETTING, `'${r}' can only appear once`, l))), a.forEach((l) => {
ue(l.value) || s.push(new c(o.INVALID_INDEX_SETTING_VALUE, `'${r}' must not have a value`, l));
});
break;
case "type":
a.length > 1 && a.forEach((l) => s.push(new c(o.DUPLICATE_INDEX_SETTING, "'type' can only appear once", l))), a.forEach((l) => {
V(l.value) || s.push(new c(o.INVALID_INDEX_SETTING_VALUE, `'type' must be "btree" or "hash"`, l));
});
break;
default:
a.forEach((l) => s.push(new c(o.UNKNOWN_INDEX_SETTING, `Unknown index setting '${r}'`, l)));
}
}
return s;
}
validateSubElements(e) {
return e.flatMap((n) => {
if (n.parent = this.declarationNode, !n.type)
return [];
const s = oe(n);
return new s(n, this.publicSymbolTable, this.symbolFactory).validate();
});
}
}
class kn {
constructor(e, n, s) {
this.declarationNode = e, this.publicSymbolTable = n, this.symbolFactory = s;
}
validate() {
return [
...this.validateContext(),
...this.validateName(this.declarationNode.name),
...this.validateAlias(this.declarationNode.alias),
...this.validateSettingList(this.declarationNode.attributeList),
...this.validateBody(this.declarationNode.body)
];
}
validateContext() {
return !(this.declarationNode.parent instanceof j) && ![
b.Table,
b.TableGroup,
b.Project
].includes(we(this.declarationNode.parent).unwrap_or(void 0)) ? [new c(
o.INVALID_NOTE_CONTEXT,
"A Note can only appear inside a Table, a Table Group or a Project. Sticky note can only appear at the global scope.",
this.declarationNode
)] : [];
}
validateName(e) {
if (!(this.declarationNode.parent instanceof j))
return e ? [new c(o.UNEXPECTED_NAME, "A Note shouldn't have a name", e)] : [];
if (!e)
return [new c(o.INVALID_NAME, "Sticky note must have a name", this.declarationNode)];
const n = z(e);
if (!n.isOk())
return [new c(o.INVALID_NAME, "Invalid name for sticky note ", this.declarationNode)];
const i = n.unwrap().join("."), r = Zt(i);
return this.publicSymbolTable.has(r) ? [new c(o.DUPLICATE_NAME, `Sticky note "${i}" has already been defined`, e)] : (this.publicSymbolTable.set(r, this.declarationNode.symbol), []);
}
validateAlias(e) {
return e ? [new c(o.UNEXPECTED_ALIAS, "A Ref shouldn't have an alias", e)] : [];
}
validateSettingList(e) {
return e ? [new c(o.UNEXPECTED_SETTINGS, "A Note shouldn't have a setting list", e)] : [];
}
validateBody(e) {
if (!e)
return [];
if (e instanceof v)
return this.validateFields([e]);
const [n, s] = I.partition(e.body, (i) => i instanceof v);
return [...this.validateFields(n), ...this.validateSubElements(s)];
}
validateFields(e) {
const n = [];
return e.length === 0 ? [new c(o.EMPTY_NOTE, "A Note must have a content", this.declarationNode)] : (e.length > 1 && e.slice(1).forEach((s) => n.push(new c(o.NOTE_CONTENT_REDEFINED, "A Note can only contain one string", s))), Y(e[0].callee) || n.push(new c(o.INVALID_NOTE, "A Note content must be a quoted string", e[0])), e[0].args.length > 0 && n.push(...e[0].args.map((s) => new c(o.INVALID_NOTE, "A Note can only contain one quoted string", s))), n);
}
validateSubElements(e) {
return e.flatMap((n) => {
if (n.parent = this.declarationNode, !n.type)
return [];
const s = oe(n);
return new s(n, this.publicSymbolTable, this.symbolFactory).validate();
});
}
}
class xn {
constructor(e, n, s) {
this.declarationNode = e, this.publicSymbolTable = n, this.symbolFactory = s;
}
validate() {
return [...this.validateContext(), ...this.validateName(this.declarationNode.name), ...this.validateAlias(this.declarationNode.alias), ...this.validateSettingList(this.declarationNode.attributeList), ...this.validateBody(this.declarationNode.body)];
}
validateContext() {
return this.declarationNode.parent instanceof A ? [new c(o.INVALID_PROJECT_CONTEXT, "A Project can only appear top-level", this.declarationNode)] : [];
}
validateName(e) {
return e ? ke(e) ? [] : [new c(o.INVALID_NAME, "A Project's name is optional or must be an identifier or a quoted identifer", e)] : [];
}
validateAlias(e) {
return e ? [new c(o.UNEXPECTED_ALIAS, "A Project shouldn't have an alias", e)] : [];
}
validateSettingList(e) {
return e ? [new c(o.UNEXPECTED_SETTINGS, "A Project shouldn't have a setting list", e)] : [];
}
validateBody(e) {
if (!e)
return [];
if (e instanceof v)
return [new c(o.UNEXPECTED_SIMPLE_BODY, "A Project's body must be a block", e)];
const [n, s] = I.partition(e.body, (i) => i instanceof v);
return [
...n.map((i) => new c(o.INVALID_PROJECT_FIELD, "A Project can not have inline fields", i)),
...this.validateSubElements(s)
];
}
validateSubElements(e) {
return e.flatMap((n) => {
if (n.parent = this.declarationNode, !n.type)
return [];
const s = oe(n);
return new s(n, this.publicSymbolTable, this.symbolFactory).validate();
});
}
}
class Sn {
constructor(e, n, s) {
this.declarationNode = e, this.publicSymbolTable = n, this.symbolFactory = s;
}
validate() {
return [...this.validateContext(), ...this.validateName(this.declarationNode.name), ...this.validateAlias(this.declarationNode.alias), ...this.validateSettingList(this.declarationNode.attributeList), ...this.validateBody(this.declarationNode.body)];
}
validateContext() {
return this.declarationNode.parent instanceof j ? [] : [new c(o.INVALID_REF_CONTEXT, "A Ref must appear top-level", this.declarationNode)];
}
validateName(e) {
return e ? ke(e) ? [] : [new c(o.INVALID_NAME, "A Ref's name is optional or must be an identifier or a quoted identifer", e)] : [];
}
validateAlias(e) {
return e ? [new c(o.UNEXPECTED_ALIAS, "A Ref shouldn't have an alias", e)] : [];
}
validateSettingList(e) {
return e ? [new c(o.UNEXPECTED_SETTINGS, "A Ref shouldn't have a setting list", e)] : [];
}
validateBody(e) {
if (!e)
return [];
if (e instanceof v)
return this.validateFields([e]);
const [n, s] = I.partition(e.body, (i) => i instanceof v);
return [...this.validateFields(n), ...this.validateSubElements(s)];
}
validateFields(e) {
if (e.length === 0)
return [new c(o.EMPTY_REF, "A Ref must have at least one field", this.declarationNode)];
const n = [];
return e.length > 1 && n.push(...e.slice(1).map((s) => new c(o.REF_REDEFINED, "A Ref can only contain one binary relationship", s))), e.forEach((s) => {
s.callee && !gn(s.callee) && n.push(new c(o.INVALID_REF_FIELD, "A Ref field must be a binary relationship", s.callee)), s.callee && !_n(s.callee) && n.push(new c(o.UNEQUAL_FIELDS_BINARY_REF, "Unequal fields in ref endpoints", s.callee));
const i = [...s.args];
if (I.last(i) instanceof R) {
const r = this.validateFieldSettings(I.last(i));
n.push(...r), i.pop();
} else
i[0] instanceof R && (n.push(...this.validateFieldSettings(i[0])), i.shift());
i.length > 0 && n.push(...i.map((r) => new c(o.INVALID_REF_FIELD, "A Ref field should only have a single binary relationship", r)));
}), n;
}
validateFieldSettings(e) {
const n = C(e), s = n.getErrors(), i = n.getValue();
for (const r in i) {
const a = i[r];
switch (r) {
case "delete":
case "update":
a.length > 1 && a.forEach((l) => s.push(new c(o.DUPLICATE_REF_SETTING, `'${r}' can only appear once`, l))), a.forEach((l) => {
On(l.value) || s.push(new c(o.INVALID_REF_SETTING_VALUE, `'${r}' can only have values "cascade", "no action", "set null", "set default" or "restrict"`, l));
});
break;
case "color":
a.length > 1 && s.push(...a.map((l) => new c(o.DUPLICATE_REF_SETTING, "'color' can only appear once", l))), a.forEach((l) => {
nt(l.value) || s.push(new c(o.INVALID_REF_SETTING_VALUE, "'color' must be a color literal", l));
});
break;
default:
a.forEach((l) => s.push(new c(o.UNKNOWN_REF_SETTING, `Unknown ref setting '${r}'`, l)));
}
}
return s;
}
validateSubElements(e) {
return e.flatMap((n) => {
if (n.parent = this.declarationNode, !n.type)
return [];
const s = oe(n);
return new s(n, this.publicSymbolTable, this.symbolFactory).validate();
});
}
}
function On(t) {
if (!(V(t) && t.expression.variable.kind !== u.QUOTED_STRING) && !(t instanceof q))
return !1;
let e;
if (t instanceof q ? e = Te(t).unwrap_or("") : e = t.expression.variable.value, e)
switch (e.toLowerCase()) {
case "cascade":
case "no action":
case "set null":
case "set default":
case "restrict":
return !0;
default:
return !1;
}
return !1;
}
class Dn {
constructor(e, n, s) {
this.declarationNode = e, this.symbolFactory = s, this.publicSymbolTable = n;
}
validate() {
return [...this.validateContext(), ...this.validateName(this.declarationNode.name), ...this.validateAlias(this.declarationNode.alias), ...this.validateSettingList(this.declarationNode.attributeList), ...this.registerElement(), ...this.validateBody(this.declarationNode.body)];
}
validateContext() {
return this.declarationNode.parent instanceof A ? [new c(o.INVALID_TABLE_CONTEXT, "Table must appear top-level", this.declarationNode)] : [];
}
validateName(e) {
return e ? e instanceof he ? [new c(o.INVALID_NAME, "Invalid array as Table name, maybe you forget to add a space between the name and the setting list?", e)] : St(e) ? [] : [new c(o.INVALID_NAME, "A Table name must be of the form <table> or <schema>.<table>", e)] : [new c(o.NAME_NOT_FOUND, "A Table must have a name", this.declarationNode)];
}
validateAlias(e) {
return e ? Mn(e) ? [] : [new c(o.INVALID_ALIAS, "Table aliases can only contains alphanumeric and underscore unless surrounded by double quotes", e)] : [];
}
validateSettingList(e) {
const n = C(e), s = n.getErrors(), i = n.getValue();
for (const r in i) {
const a = i[r];
switch (r) {
case "headercolor":
a.length > 1 && s.push(...a.map((l) => new c(o.DUPLICATE_TABLE_SETTING, "'headercolor' can only appear once", l))), a.forEach((l) => {
nt(l.value) || s.push(new c(o.INVALID_TABLE_SETTING, "'headercolor' must be a color literal", l.value || l.name));
});
break;
case "note":
a.length > 1 && s.push(...a.map((l) => new c(o.DUPLICATE_TABLE_SETTING, "'note' can only appear once", l))), a.forEach((l) => {
Y(l.value) || s.push(new c(o.INVALID_TABLE_SETTING, "'note' must be a string literal", l.value || l.name));
});
break;
default:
s.push(...a.map((l) => new c(o.INVALID_TABLE_SETTING, `Unknown '${r}' setting`, l)));
}
}
return s;
}
registerElement() {
const e = [];
this.declarationNode.symbol = this.symbolFactory.create(yt, { declaration: this.declarationNode, symbolTable: new ye() });
const { name: n, alias: s } = this.declarationNode, i = z(n);
if (i.isOk()) {
const r = [...i.unwrap()], a = r.pop(), l = tt(r, this.publicSymbolTable, this.symbolFactory), p = De(a);
l.has(p) && e.push(new c(o.DUPLICATE_NAME, `Table name '${a}' already exists in schema '${r.join(".") || "public"}'`, n)), l.set(p, this.declarationNode.symbol);
}
if (s && ke(s) && !Pn(s.expression.variable.value, i.unwrap_or([]))) {
const r = W(s).unwrap(), a = De(r);
this.publicSymbolTable.has(a) && e.push(new c(o.DUPLICATE_NAME, `Table name '${r}' already exists`, n)), this.publicSymbolTable.set(a, this.declarationNode.symbol);
}
return e;
}
validateBody(e) {
if (!e)
return [];
if (e instanceof v)
return [new c(o.UNEXPECTED_SIMPLE_BODY, "A Table's body must be a block", e)];
const [n, s] = I.partition(e.body, (i) => i instanceof v);
return [...this.validateFields(n), ...this.validateSubElements(s)];
}
validateFields(e) {
return e.length === 0 ? [new c(o.EMPTY_TABLE, "A Table must have at least one column", this.declarationNode)] : e.flatMap((n) => {
if (!n.callee)
return [];
const s = [];
n.args.length === 0 && s.push(new c(o.INVALID_COLUMN, "A column must have a type", n.callee)), V(n.callee) || s.push(new c(o.INVALID_COLUMN_NAME, "A column name must be an identifier or a quoted identifier", n.callee)), n.args[0] && !Rn(n.args[0]) && s.push(new c(o.INVALID_COLUMN_TYPE, "Invalid column type", n.args[0]));
const i = n.args.slice(1);
return s.push(...this.validateFieldSetting(i)), s.push(...this.registerField(n)), s;
});
}
registerField(e) {
if (e.callee && V(e.callee)) {
const n = W(e.callee).unwrap(), s = qe(n), i = this.symbolFactory.create(an, { declaration: e });
e.symbol = i;
const r = this.declarationNode.symbol.symbolTable;
if (r.has(s)) {
const a = r.get(s);
return [
new c(o.DUPLICATE_COLUMN_NAME, `Duplicate column ${n}`, e),
new c(o.DUPLICATE_COLUMN_NAME, `Duplicate column ${n}`, a.declaration)
];
}
r.set(s, i);
}
return [];
}
// This is needed to support legacy inline settings
validateFieldSetting(e) {
if (!e.slice(0, -1).every(me) || !e.slice(-1).every((p) => me(p) || p instanceof R))
return [...e.map((p) => new c(o.INVALID_COLUMN, "These fields must be some inline settings optionally ended with a setting list", p))];
if (e.length === 0)
return [];
let n;
I.last(e) instanceof R && (n = e.pop());
const s = C(n), i = s.getErrors(), r = s.getValue();
for (const p of e) {
const f = W(p).unwrap_or("").toLowerCase();
if (f !== "pk" && f !== "unique") {
i.push(new c(o.INVALID_SETTINGS, "Inline column settings can only be `pk` or `unique`", p));
continue;
}
r[f] === void 0 ? r[f] = [p] : r[f].push(p);
}
const a = r.pk || [], l = r["primary key"] || [];
a.length >= 1 && l.length >= 1 && i.push(...[...a, ...l].map((p) => new c(o.DUPLICATE_COLUMN_SETTING, "Either one of 'primary key' and 'pk' can appear", p)));
for (const p in r) {
const f = r[p];
switch (p) {
case "note":
f.length > 1 && i.push(...f.map((h) => new c(o.DUPLICATE_COLUMN_SETTING, "note can only appear once", h))), f.forEach((h) => {
Y(h.value) || i.push(new c(o.INVALID_COLUMN_SETTING_VALUE, "'note' must be a quoted string", h.value || h.name));
});
break;
case "ref":
f.forEach((h) => {
Bn(h.value) || i.push(new c(o.INVALID_COLUMN_SETTING_VALUE, "'ref' must be a valid unary relationship", h.value || h.name));
});
break;
case "primary key":
f.length > 1 && i.push(...f.map((h) => new c(o.DUPLICATE_COLUMN_SETTING, "primary key can only appear once", h))), f.forEach((h) => {
ue(h.value) || i.push(new c(o.INVALID_COLUMN_SETTING_VALUE, "'primary key' must not have a value", h.value || h.name));
});
break;
case "pk":
f.length > 1 && i.push(...f.map((h) => new c(o.DUPLICATE_COLUMN_SETTING, "'pk' can only appear once", h))), f.forEach((h) => {
h instanceof ie && !ue(h.value) && i.push(new c(o.INVALID_COLUMN_SETTING_VALUE, "'pk' must not have a value", h.value || h.name));
});
break;
case "not null":
f.length > 1 && i.push(...f.map((h) => new c(o.DUPLICATE_COLUMN_SETTING, "'not null' can only appear once", h)));
const E = r.null || [];
f.length >= 1 && E.length >= 1 && i.push(...[...f, ...E].map((h) => new c(o.CONFLICTING_SETTING, "'not null' and 'null' can not be set at the same time", h))), f.forEach((h) => {
ue(h.value) || i.push(new c(o.INVALID_COLUMN_SETTING_VALUE, "'not null' must not have a value", h.value || h.name));
});
break;
case "null":
f.length > 1 && i.push(...f.map((h) => new c(o.DUPLICATE_COLUMN_SETTING, "'null' can only appear once", h))), f.forEach((h) => {
ue(h.value) || i.push(new c(o.INVALID_COLUMN_SETTING_VALUE, "'null' must not have a value", h.value || h.name));
});
break;
case "unique":
f.length > 1 && i.push(...f.map((h) => new c(o.DUPLICATE_COLUMN_SETTING, "'unique' can only appear once", h))), f.forEach((h) => {
h instanceof ie && !ue(h.value) && i.push(new c(o.INVALID_COLUMN_SETTING_VALUE, "'unique' must not have a value", h.value || h.name));
});
break;
case "increment":
f.length > 1 && i.push(...f.map((h) => new c(o.DUPLICATE_COLUMN_SETTING, "'increment' can only appear once", h))), f.forEach((h) => {
h instanceof ie && !ue(h.value) && i.push(new c(o.INVALID_COLUMN_SETTING_VALUE, "'increment' must not have a value", h.value || h.name));
});
break;
case "default":
f.length > 1 && i.push(...f.map((h) => new c(o.DUPLICATE_TABLE_SETTING, "'default' can only appear once", h))), f.forEach((h) => {
Fn(h.value) || i.push(new c(o.INVALID_TABLE_SETTING, "'default' must be a string literal, number literal, function expression, true, false or null", h.value || h.name));
});
break;
default:
f.forEach((h) => i.push(new c(o.UNKNOWN_COLUMN_SETTING, `Unknown column setting '${p}'`, h)));
}
}
return i;
}
validateSubElements(e) {
const n = e.flatMap((i) => {
if (i.parent = this.declarationNode, !i.type)
return [];
const r = oe(i);
return new r(i, this.publicSymbolTable, this.symbolFactory).validate();
}), s = e.filter((i) => {
var r;
return ((r = i.type) == null ? void 0 : r.value.toLowerCase()) === "note";
});
return s.length > 1 && n.push(...s.map((i) => new c(o.NOTE_REDEFINED, "Duplicate notes are defined", i))), n;
}
}
function Rn(t) {
if (!(t instanceof Z || et(t) || t instanceof M || t instanceof he))
return !1;
if (t instanceof Z) {
if (t.callee === void 0 || t.argumentList === void 0 || !t.argumentList.elementList.every((n) => fe(n) || Y(n) || me(n)))
return !1;
t = t.callee;
}
for (; t instanceof he; ) {
if (t.array === void 0 || t.indexer === void 0 || !t.indexer.elementList.every((n) => !n.colon && !n.value && fe(n.name)))
return !1;
t = t.array;
}
const e = z(t).unwrap_or(void 0);
return e !== void 0 && e.length > 0;
}
function Pn(t, e) {
return e.length === 1 && t === e[0];
}
class Un {
constructor(e, n, s) {
this.declarationNode = e, this.publicSymbolTable = n, this.symbolFactory = s;
}
validate() {
return [
...this.validateContext(),
...this.validateName(this.declarationNode.name),
...this.validateAlias(this.declarationNode.alias),
...this.validateSettingList(this.declarationNode.attributeList),
...this.registerElement(),
...this.validateBody(this.declarationNode.body)
];
}
validateContext() {
return this.declarationNode.parent instanceof A ? [new c(
o.INVALID_TABLEGROUP_CONTEXT,
"TableGroup must appear top-level",
this.declarationNode
)] : [];
}
validateName(e) {
return e ? ke(e) ? [] : [new c(
o.INVALID_NAME,
"A TableGroup name must be a single identifier",
e
)] : [new c(
o.NAME_NOT_FOUND,
"A TableGroup must have a name",
this.declarationNode
)];
}
validateAlias(e) {
return e ? [new c(
o.UNEXPECTED_ALIAS,
"A TableGroup shouldn't have an alias",
e
)] : [];
}
registerElement() {
const { name: e } = this.declarationNode;
this.declarationNode.symbol = this.symbolFactory.create(on, { declaration: this.declarationNode, symbolTable: new ye() });
const n = z(e);
if (n.isOk()) {
const s = n.unwrap(), i = s.pop(), r = tt(s, this.publicSymbolTable, this.symbolFactory), a = Ze(i);
if (r.has(a))
return [new c(o.DUPLICATE_NAME, `TableGroup name '${i}' already exists`, e)];
r.set(a, this.declarationNode.symbol);
}
return [];
}
validateSettingList(e) {
const n = C(e), s = n.getErrors(), i = n.getValue();
return I.forIn(i, (r, a) => {
switch (a) {
case "color":
r.length > 1 && s.push(...r.map((l) => new c(
o.DUPLICATE_TABLE_SETTING,
"'color' can only appear once",
l
))), r.forEach((l) => {
nt(l.value) || s.push(new c(
o.INVALID_TABLE_SETTING,
"'color' must be a color literal",
l.value || l.name
));
});
break;
case "note":
r.length > 1 && s.push(...r.map((l) => new c(
o.DUPLICATE_TABLE_SETTING,
"'note' can only appear once",
l
))), r.filter((l) => !Y(l.value)).forEach((l) => {
s.push(new c(
o.INVALID_TABLE_SETTING,
"'note' must be a string literal",
l.value || l.name
));
});
break;
default:
s.push(...r.map((l) => new c(
o.INVALID_TABLE_SETTING,
`Unknown '${a}' setting`,
l
)));
break;
}
}), s;
}
validateBody(e) {
if (!e)
return [];
if (e instanceof v)
return [new c(
o.UNEXPECTED_SIMPLE_BODY,
"A TableGroup's body must be a block",
e
)];
const [n, s] = I.partition(e.body, (i) => i instanceof v);
return [
...this.validateFields(n),
...this.validateSubElements(s)
];
}
validateFields(e) {
return e.flatMap((n) => {
const s = [];
return n.callee && !z(n.callee).isOk() && s.push(new c(o.INVALID_TABLEGROUP_FIELD, "A TableGroup field must be of the form <table> or <schema>.<table>", n.callee)), this.registerField(n), n.args.length > 0 && s.push(...n.args.map((i) => new c(o.INVALID_TABLEGROUP_FIELD, "A TableGroup field should only have a single Table name", i))), s;
});
}
validateSubElements(e) {
const n = e.flatMap((i) => {
if (i.parent = this.declarationNode, !i.type)
return [];
const r = oe(i);
return new r(i, this.publicSymbolTable, this.symbolFactory).validate();
}), s = e.filter((i) => {
var r;
return ((r = i.type) == null ? void 0 : r.value.toLowerCase()) === "note";
});
return s.length > 1 && n.push(...s.map((i) => new c(o.NOTE_REDEFINED, "Duplicate notes are defined", i))), n;
}
registerField(e) {
if (e.callee && V(e.callee)) {
const n = W(e.callee).unwrap(), s = Ke(n), i = this.symbolFactory.create(ln, { declaration: e });
e.symbol = i;
const r = this.declarationNode.symbol.symbolTable;
if (r.has(s)) {
const a = r.get(s);
return [
new c(o.DUPLICATE_TABLEGROUP_FIELD_NAME, `${n} already exists in the group`, e),
new c(o.DUPLICATE_TABLEGROUP_FIELD_NAME, `${n} already exists in the group`, a.declaration)
];
}
r.set(s, i);
}
return [];
}
}
const xt = ["-", "+"];
function oe(t) {
switch (t.type.value.toLowerCase()) {
case b.Enum:
return wn;
case b.Table:
return Dn;
case b.TableGroup:
return Un;
case b.Project:
return xn;
case b.Ref:
return Sn;
case b.Note:
return kn;
case b.Indexes:
return yn;
default:
return vn;
}
}
function St(t) {
return !!z(t).unwrap_or(!1);
}
function Mn(t) {
return ke(t);
}
function ke(t) {
return t instanceof M && t.expression instanceof te;
}
function tt(t, e, n) {
var i;
t[0] === "public" && (t = t.slice(1));
let s = e;
for (const r of t) {
let a;
const l = Qe(r);
if (s.has(l)) {
if (a = (i = s.get(l)) == null ? void 0 : i.symbolTable, !a)
throw new Error("Expect a symbol table in a schema symbol");
} else {
a = new ye();
const p = n.create(wt, { symbolTable: a });
s.set(l, p);
}
s = a;
}
return s;
}
function Ot(t) {
return t === "-" || t === "<>" || t === ">" || t === "<";
}
function nt(t) {
var n;
if (!(t instanceof M) || !(t.expression instanceof be) || ((n = t.expression.literal) == null ? void 0 : n.kind) !== u.COLOR_LITERAL)
return !1;
const e = t.expression.literal.value;
if (e.length !== 4 && e.length !== 7 || e[0] !== "#")
return !1;
for (let s = 1; s < e.length; s += 1)
if (!tn(e[s]))
return !1;
return !0;
}
function ue(t) {
return t === void 0;
}
function Fn(t) {
var e;
return !!(Y(t) || fe(t) || me(t) && ["true", "false", "null"].includes(t.expression.variable.value.toLowerCase()) || t instanceof H && xt.includes((e = t.op) == null ? void 0 : e.value) && fe(t.expression) || t instanceof se);
}
function fe(t) {
var e;
return t instanceof M && t.expression instanceof be && ((e = t.expression.literal) == null ? void 0 : e.kind) === u.NUMERIC_LITERAL;
}
function Bn(t) {
var n;
if (!(t instanceof H) || !Ot((n = t.op) == null ? void 0 : n.value))
return !1;
const e = z(t.expression).unwrap_or(void 0);
return e !== void 0 && e.length > 0;
}
function Dt(t) {
return t instanceof ee && t.elementList.every(V);
}
function C(t) {
var s;
const e = {}, n = [];
if (!t)
return new X({});
for (const i of t.elementList) {
if (!i.name)
continue;
if (i.name instanceof M) {
n.push(new c(o.INVALID_SETTINGS, "A setting name must be a stream of identifiers", i.name));
continue;
}
const r = (s = Te(i.name).unwrap_or(void 0)) == null ? void 0 : s.toLowerCase();
r && (e[r] === void 0 ? e[r] = [i] : e[r].push(i));
}
return new X(e, n);
}
class Et {
constructor(e, n) {
this.ast = e, this.symbolFactory = n, this.publicSchemaSymbol = this.symbolFactory.create(wt, {
symbolTable: new ye()
}), this.ast.symbol = this.publicSchemaSymbol, this.ast.symbol.declaration = this.ast;
}
validate() {
const e = [];
this.ast.body.forEach((s) => {
if (s.parent = this.ast, s.type === void 0)
return;
const i = oe(s), r = new i(
s,
this.publicSchemaSymbol.symbolTable,
this.symbolFactory
);
e.push(...r.validate());
});
const n = this.ast.body.filter((s) => we(s).unwrap_or(void 0) === b.Project);
return n.length > 1 && n.forEach((s) => e.push(new c(o.PROJECT_REDEFINED, "Only one project can exist", s))), new X(this.ast, e);
}
}
class le {
constructor(e, n) {
this.declarationNode = e, this.errors = n;
}
bind() {
this.bindSettingList(this.declarationNode.attributeList, this.settingList), this.bindBody();
}
bindSettingList(e, n) {
if (e)
for (const s of e.elementList) {
if (s.name instanceof M)
continue;
const i = Te(s.name).unwrap_or(void 0);
if (!i)
continue;
const r = n[i.toLowerCase()];
r != null && r.shouldBind && this.scanAndBind(s.value, r);
}
}
bindBody() {
const e = this.declarationNode;
if (!e.body)
return;
const { body: n } = e;
if (n instanceof K)
for (const s of n.body)
if (s instanceof A) {
if (!s.type)
continue;
const i = Rt(s);
new i(s, this.errors).bind();
} else
this.bindSubfield(s);
else
this.bindSubfield(n);
}
bindSubfield(e) {
const n = [e.callee, ...e.args], s = I.last(n);
s instanceof R && (n.pop(), this.bindSettingList(s, this.subfield.settingList));
const { argBinderRules: i } = this.subfield.arg;
for (let r = 0; r < Math.min(n.length, i.length); r += 1)
i[r].shouldBind && this.scanAndBind(n[r], i[r]);
}
// Scan for variable node and member access expression in the node to bind
scanAndBind(e, n) {
var s, i;
if (e)
if (e instanceof M) {
if (e.expression instanceof te && ((i = n.keywords) != null && i.includes((s = e.expression.variable) == null ? void 0 : s.value.toLowerCase())))
return;
this.bindFragments([e], n);
} else
e instanceof J ? et(e) ? this.bindFragments(pe(e).unwrap_or([]), n) : (this.scanAndBind(e.leftExpression, n), this.scanAndBind(e.rightExpression, n)) : e instanceof H ? this.scanAndBind(e.expression, n) : e instanceof Me ? this.scanAndBind(e.expression, n) : e instanceof ee && e.elementList.forEach((r) => this.scanAndBind(r, n));
}
// Bind the fragments of a member access expression
// which can be a simple expression like v1.User,
// or a complex tuple like v1.User.(id, name)
bindFragments(e, n) {
if (e.length === 0)
return;
const s = [...n.topSubnamesSymbolKind], { remainingSubnamesSymbolKind: i } = n, r = e.findIndex((h) => !V(h)), l = r !== -1 && Dt(e[r]) ? e[r] : void 0, p = r >= 0 ? s.pop() : void 0, f = e.slice(
0,
r === -1 ? void 0 : r
);
if (f.length === 0)
return;
const E = [];
for (; s.length && f.length; ) {
const h = s.pop(), m = f.pop(), g = W(m).unwrap();
E.unshift({
index: Ce(g, h),
referrer: m
});
}
for (; f.length; ) {
const h = f.pop(), m = W(h).unwrap();
E.unshift({
index: Ce(m, i),
referrer: h
});
}
return l ? l.elementList.forEach(
(h) => this.resolveIndexStack(
[
...E,
{
index: Ce(
W(h).unwrap(),
p
),
referrer: h
}
],
n.ignoreNameNotFound
)
) : this.resolveIndexStack(E, n.ignoreNameNotFound);
}
// Looking up the indexes in the subname stack from the current declaration node
// Each time the index resolves to a symbol, the referrer's symbol is bound to it
resolveIndexStack(e, n) {
if (e.length === 0)
throw new Error("Unreachable - An unresolved name must have at least one name component");
const [s, ...i] = e, r = An(s.index, this.declarationNode);
if (r === void 0) {
const { kind: f, name: E } = re(s.index).unwrap();
this.logError(s.referrer, `Can not find ${f} '${E}'`, n);
return;
}
r.references.push(s.referrer), s.referrer.referee = r;
let a = r.symbolTable, { kind: l, name: p } = re(s.index).unwrap();
for (const f of i) {
const { kind: E, name: h } = re(f.index).unwrap(), m = a.get(f.index);
if (!m) {
this.logError(
f.referrer,
`${l} '${p}' does not have ${E} '${h}'`,
n
);
return;
}
if (l = E, p = h, f.referrer.referee = m, m.references.push(f.referrer), !m.symbolTable)
break;
a = m.symbolTable;
}
}
logError(e, n, s) {
s || this.errors.push(new c(o.BINDING_ERROR, n, e));
}
}
class Vn extends le {
constructor() {
super(...arguments), this.subfield = {
arg: {
argBinderRules: []
},
settingList: {}
}, this.settingList = {};
}
}
class Gn extends le {
constructor() {
super(...arguments), this.subfield = {
arg: {
argBinderRules: [{ shouldBind: !1 }]
},
settingList: {}
}, this.settingList = {};
}
}
class Cn extends le {
constructor() {
super(...arguments), this.subfield = {
arg: {
argBinderRules: [
{
shouldBind: !0,
topSubnamesSymbolKind: [T.Table, T.Column],
remainingSubnamesSymbolKind: T.Schema,
ignoreNameNotFound: !1
},
{
shouldBind: !0,
topSubnamesSymbolKind: [T.Table, T.Column],
remainingSubnamesSymbolKind: T.Schema,
ignoreNameNotFound: !1
},
{
shouldBind: !0,
topSubnamesSymbolKind: [T.Table, T.Column],
remainingSubnamesSymbolKind: T.Schema,
ignoreNameNotFound: !1
},
{
shouldBind: !0,
topSubnamesSymbolKind: [T.Table, T.Column],
remainingSubnamesSymbolKind: T.Schema,
ignoreNameNotFound: !1
}
]
},
settingList: {}
}, this.settingList = {};
}
}
class Xn extends le {
constructor() {
super(...arguments), this.subfield = {
arg: {
argBinderRules: [{ shouldBind: !1 }]
},
settingList: {}
}, this.settingList = {};
}
}
class $n extends le {
constructor() {
super(...arguments), this.subfield = {
arg: {
argBinderRules: []
},
settingList: {}
}, this.settingList = {};
}
}
class Wn extends le {
constructor() {
super(...arguments), this.subfield = {
arg: {
argBinderRules: [
{
shouldBind: !0,
topSubnamesSymbolKind: [T.Table, T.Column],
remainingSubnamesSymbolKind: T.Schema,
ignoreNameNotFound: !1
}
]
},
settingList: {}
}, this.settingList = {};
}
}
class jn extends le {
constructor() {
super(...arguments), this.subfield = {
arg: {
argBinderRules: [
{ shouldBind: !1 },
{
shouldBind: !0,
topSubnamesSymbolKind: [T.Enum],
remainingSubnamesSymbolKind: T.Schema,
ignoreNameNotFound: !0
}
]
},
settingList: {
ref: {
shouldBind: !0,
topSubnamesSymbolKind: [T.Table, T.Column],
remainingSubnamesSymbolKind: T.Schema,
ignoreNameNotFound: !1
},
default: {
shouldBind: !1
}
}
}, this.settingList = {};
}
}
class Yn extends le {
constructor() {
super(...arguments), this.subfield = {
arg: {
argBinderRules: [
{
shouldBind: !0,
topSubnamesSymbolKind: [T.Table],
remainingSubnamesSymbolKind: T.Schema,
ignoreNameNotFound: !1
}
]
},
settingList: {}
}, this.settingList = {};
}
}
function Rt(t) {
switch (t.type.value.toLowerCase()) {
case b.Enum:
return Gn;
case b.Table:
return jn;
case b.TableGroup:
return Yn;
case b.Project:
return $n;
case b.Ref:
return Wn;
case b.Note:
return Xn;
case b.Indexes:
return Cn;
default:
return Vn;
}
}
class zn {
constructor(e) {
this.ast = e, this.errors = [];
}
resolve() {
for (const e of this.ast.body)
if (e.type) {
const n = Rt(e);
new n(e, this.errors).bind();
}
return new X(this.ast, this.errors);
}
}
class Qn {
constructor(e) {
this.generator = e;
}
create(e, n) {
return new e(n, this.generator.nextId());
}
}
class qn {
constructor(e, n) {
this.ast = e, this.symbolFactory = new Qn(n);
}
// Analyzing: Invoking both the validator and binder
analyze() {
return new Et(this.ast, this.symbolFactory).validate().chain((n) => new zn(n).resolve());
}
// For invoking the validator only
validate() {
return new Et(this.ast, this.symbolFactory).validate().chain((n) => new X(n, []));
}
}
function Nt(t, e) {
const { variables: n, tupleElements: s } = Ae(t).unwrap();
return s ? n.length === 0 ? {
schemaName: e.schemaName,
tableName: e.name,
fieldNames: s
} : {
tableName: n.pop(),
schemaName: n.pop() || null,
fieldNames: s
} : n.length === 1 ? {
schemaName: e.schemaName,
tableName: e.name,
fieldNames: [n[0]]
} : {
fieldNames: [n.pop()],
tableName: n.pop(),
schemaName: n.pop() || null
};
}
function Pt(t) {
switch (t) {
case "<":
return ["1", "*"];
case "<>":
return ["*", "*"];
case ">":
return ["*", "1"];
case "-":
return ["1", "1"];
}
throw new Error("Invalid relation op");
}
function _(t) {
return {
start: {
offset: t.startPos.offset,
line: t.startPos.line + 1,
column: t.startPos.column + 1
},
end: { offset: t.endPos.offset, line: t.endPos.line + 1, column: t.endPos.column + 1 }
};
}
function Ye(t) {
var n;
const e = (n = pe(t).unwrap_or(void 0)) == null ? void 0 : n.pop();
return e instanceof ee ? e.elementList.map((s) => s.referee) : [e.referee];
}
function Ie(t) {
const e = z(t).unwrap();
return {
name: e.pop(),
schemaName: e
};
}
function Be(t) {
return t.expression.literal.value;
}
function Ut(t, e) {
if (Array.isArray(t)) {
const i = t.map(({ id: a }) => a).sort().join(","), r = e.map(({ id: a }) => a).sort().join(",");
return i < r ? `${i}-${r}` : `${r}-${i}`;
}
const n = t.id.toString(), s = e.id.toString();
return n < s ? `${n}-${s}` : `${s}-${n}`;
}
function Mt(t, e) {
if (Array.isArray(t)) {
const i = t.map(({ id: a }) => a).sort(), r = e.map(({ id: a }) => a).sort();
return I.zip(i, r).every(([a, l]) => a === l);
}
const n = t.id, s = e.id;
return n === s;
}
function ae(t) {
const e = t.split(`
`), n = e.slice(e.findIndex((r) => r.trimStart() !== "")), s = n.filter((r) => r.trimStart()), i = Math.min(...s.map((r) => r.length - r.trimStart().length));
return n.map((r) => r.slice(i)).join(`
`);
}
class Ft {
constructor(e, n) {
this.declarationNode = e, this.env = n, this.table = { name: void 0, schemaName: void 0, alias: null, fields: [], token: void 0, indexes: [] }, this.pkColumns = [];
}
interpret() {
this.table.token = _(this.declarationNode), this.env.tables.set(this.declarationNode, this.table);
const e = [
...this.interpretName(this.declarationNode.name),
...this.interpretAlias(this.declarationNode.alias),
...this.interpretSettingList(this.declarationNode.attributeList),
...this.interpretBody(this.declarationNode.body)
];
return this.pkColumns.length >= 2 && (this.table.indexes.push({
columns: this.pkColumns.map(({ name: n, token: s }) => ({ value: n, type: "column", token: s })),
token: {
start: { offset: -1, line: -1, column: -1 },
// do not make sense to have a meaningful start (?)
end: { offset: -1, line: -1, column: -1 }
// do not make sense to have a meaningful end (?)
},
pk: !0
}), this.pkColumns.forEach((n) => n.pk = !1)), e;
}
interpretName(e) {
const { name: n, schemaName: s } = Ie(e);
return s.length > 1 ? (this.table.name = n, this.table.schemaName = s.join("."), [new c(o.UNSUPPORTED, "Nested schema is not supported", e)]) : (this.table.name = n, this.table.schemaName = s.length ? s[0] : null, []);
}
interpretAlias(e) {
if (!e)
return [];
const n = W(e).unwrap_or(null);
return n && (this.env.aliases.push({
name: n,
kind: "table",
value: {
tableName: this.table.name,
schemaName: this.table.schemaName
}
}), this.table.alias = n), [];
}
interpretSettingList(e) {
var i, r, a;
const n = C(e).getValue();
this.table.headerColor = (i = n.headercolor) != null && i.length ? Be((a = (r = n.headercolor) == null ? void 0 : r.at(0)) == null ? void 0 : a.value) : void 0;
const [s] = n.note || [];
return this.table.note = s && {
value: $(s == null ? void 0 : s.value).map(ae).unwrap(),
token: _(s)
}, [];
}
interpretBody(e) {
const [n, s] = I.partition(e.body, (i) => i instanceof v);
return [...this.interpretFields(n), ...this.interpretSubElements(s)];
}
interpretSubElements(e) {
return e.flatMap((n) => {
var s;
switch ((s = n.type) == null ? void 0 : s.value.toLowerCase()) {
case "note":
return this.table.note = {
value: $(n.body instanceof K ? n.body.body[0].callee : n.body.callee).map(ae).unwrap(),
token: _(n)
}, [];
case "indexes":
return this.interpretIndexes(n);
}
return [];
});
}
interpretFields(e) {
return e.flatMap((n) => this.interpretColumn(n));
}
interpretColumn(e) {
var a, l, p, f, E, h, m, g, P;
const n = [], s = {};
s.name = W(e.callee).unwrap();
const i = Hn(e.args[0]);
s.type = i.getValue(), n.push(...i.getErrors()), s.token = _(e), s.inline_refs = [];
const r = e.args.slice(1);
if (I.last(r) instanceof R) {
const S = C(r.pop()).getValue();
s.pk = !!((a = S.pk) != null && a.length) || !!((l = S["primary key"]) != null && l.length), s.increment = !!((p = S.increment) != null && p.length), s.unique = !!((f = S.unique) != null && f.length), s.not_null = (E = S["not null"]) != null && E.length ? !0 : (h = S.null) != null && h.length ? !1 : void 0, s.dbdefault = Jn((g = (m = S.default) == null ? void 0 : m.at(0)) == null ? void 0 : g.value);
const F = (P = S.note) == null ? void 0 : P.at(0);
s.note = F && {
value: $(F.value).map(ae).unwrap(),
token: _(F)
};
const Le = S.ref || [];
s.inline_refs = Le.flatMap((B) => {
const [rt] = Ye(B.value.expression);
if (Mt(rt, e.symbol))
return n.push(new c(o.SAME_ENDPOINT, "Two endpoints are the same", B)), [];
const xe = B.value.op, ne = z(B.value.expression).unwrap();
let de;
if (ne.length === 1) {
const [ce] = ne;
de = {
schemaName: this.table.schemaName,
tableName: this.table.name,
fieldNames: [ce],
relation: xe.value,
token: _(B)
};
} else if (ne.length === 2) {
const [ce, ge] = ne;
de = {
schemaName: null,
tableName: ce,
fieldNames: [ge],
relation: xe.value,
token: _(B)
};
} else if (ne.length === 3) {
const [ce, ge, ot] = ne;
de = {
schemaName: ce,
tableName: ge,
fieldNames: [ot],
relation: xe.value,
token: _(B)
};
} else {
n.push(new c(o.UNSUPPORTED, "Nested schema is not supported", B));
const ce = ne.pop(), ge = ne.pop();
de = {
schemaName: ne.join("."),
tableName: ge,
fieldNames: [ce],
relation: xe.value,
token: _(B)
};
}
const at = this.registerInlineRefToEnv(e, rt, de, B);
return n.push(...at), at.length === 0 ? de : [];
});
}
return s.pk || (s.pk = r.some((S) => Q(S).unwrap().toLowerCase() === "pk")), s.unique || (s.unique = r.some((S) => Q(S).unwrap().toLowerCase() === "unique")), this.table.fields.push(s), s.pk && this.pkColumns.push(s), n;
}
interpretIndexes(e) {
return this.table.indexes.push(...e.body.body.map((n) => {
var a, l, p, f, E, h, m;
const s = { columns: [] }, i = n;
s.token = _(i);
const r = [i.callee, ...i.args];
if (I.last(r) instanceof R) {
const g = C(r.pop()).getValue();
s.pk = !!((a = g.pk) != null && a.length), s.unique = !!((l = g.unique) != null && l.length), s.name = $((f = (p = g.name) == null ? void 0 : p.at(0)) == null ? void 0 : f.value).unwrap_or(void 0);
const P = (E = g.note) == null ? void 0 : E.at(0);
s.note = P && {
value: $(P.value).unwrap(),
token: _(P)
}, s.type = Q((m = (h = g.type) == null ? void 0 : h.at(0)) == null ? void 0 : m.value).unwrap_or(void 0);
}
return r.flatMap((g) => {
if (!(g instanceof Z))
return g;
const P = [];
for (; g instanceof Z; )
P.push(g.argumentList), g = g.callee;
return P.push(g), P;
}).forEach((g) => {
const { functional: P, nonFunctional: S } = je(g).unwrap();
s.columns.push(
...P.map((F) => ({
value: F.value.value,
type: "expression",
token: _(F)
})),
...S.map((F) => ({
value: W(F).unwrap(),
type: "column",
token: _(F)
}))
);
}), s;
})), [];
}
registerInlineRefToEnv(e, n, s, i) {
const r = Ut(e.symbol, n);
if (this.env.refIds[r])
return [
new c(o.CIRCULAR_REF, "References with same endpoints exist", i),
new c(o.CIRCULAR_REF, "References with same endpoints exist", this.env.refIds[r])
];
const a = Pt(s.relation);
return this.env.refIds[r] = i, this.env.ref.set(i, {
name: null,
schemaName: null,
token: s.token,
endpoints: [
{
...s,
relation: a[1]
},
{
schemaName: this.table.schemaName,
tableName: this.table.name,
fieldNames: [Q(e.callee).unwrap()],
token: _(e),
relation: a[0]
}
]
}), [];
}
}
function Hn(t) {
let e = null;
t instanceof Z && (e = t.argumentList.elementList.map((r) => fe(r) ? r.expression.literal.value : Y(r) ? $(r).unwrap() : Q(r).unwrap()).join(","), t = t.callee);
let n = "";
for (; t instanceof he; )
n = `[${t.indexer.elementList.map((r) => r.name.expression.literal.value).join(",")}]${n}`, t = t.array;
const { name: s, schemaName: i } = Ie(t);
return i.length > 1 ? new X(
{
schemaName: i.length === 0 ? null : i[0],
type_name: `${s}${n}${e ? `(${e})` : ""}`,
args: e
},
[new c(o.UNSUPPORTED, "Nested schema is not supported", t)]
) : new X({
schemaName: i.length === 0 ? null : i[0],
type_name: `${s}${n}${e ? `(${e})` : ""}`,
args: e
});
}
function Jn(t) {
var e, n, s;
if (t) {
if (Y(t))
return {
value: $(t).unwrap(),
type: "string"
};
if (fe(t))
return {
type: "number",
value: Number.parseFloat(t.expression.literal.value)
};
if (me(t))
return {
value: t.expression.variable.value.toLowerCase(),
type: "boolean"
};
if (t instanceof H && xt.includes((e = t.op) == null ? void 0 : e.value) && fe(t.expression)) {
const i = Number.parseFloat(t.expression.expression.literal.value);
return {
value: ((n = t.op) == null ? void 0 : n.value) === "-" ? 0 - i : i,
type: "number"
};
}
if (t instanceof se)
return {
value: (s = t.value) == null ? void 0 : s.value,
type: "expression"
};
throw new Error("Unreachable");
}
}
class Zn {
constructor(e, n) {
this.declarationNode = e, this.env = n, this.note = { name: void 0, content: void 0, token: void 0 };
}
interpret() {
return this.note.token = _(this.declarationNode), this.env.notes.set(this.declarationNode, this.note), [
...this.interpretName(this.declarationNode.name),
...this.interpretSettingList(this.declarationNode.attributeList),
...this.interpretBody(this.declarationNode.body)
];
}
interpretName(e) {
const { name: n } = Ie(e);
return this.note.name = n, [];
}
interpretSettingList(e) {
var s, i, r;
const n = C(e).getValue();
return this.note.headerColor = (s = n.headercolor) != null && s.length ? Be((r = (i = n.headercolor) == null ? void 0 : i.at(0)) == null ? void 0 : r.value) : void 0, [];
}
interpretBody(e) {
const [n, s] = I.partition(e.body, (i) => i instanceof v);
return n.length !== 1 || s.length > 0 ? [
new c(o.INVALID_NOTE, "Invalid note syntax", e)
] : [...this.interpretNote(n[0])];
}
interpretNote(e) {
const n = I.get(e, "callee.expression.literal.value", "");
return this.note.content = ae(n), [];
}
}
class Bt {
constructor(e, n) {
this.declarationNode = e, this.env = n, this.container = this.declarationNode.parent instanceof A ? this.env.tables.get(this.declarationNode.parent) : void 0, this.ref = {};
}
interpret() {
return this.ref.token = _(this.declarationNode), this.env.ref.set(this.declarationNode, this.ref), [
...this.interpretName(this.declarationNode.name),
...this.interpretBody(this.declarationNode.body)
];
}
interpretName(e) {
const n = [], s = z(this.declarationNode.name).unwrap_or([]);
return this.ref.name = s.pop() || null, s.length > 1 && n.push(new c(o.UNSUPPORTED, "Nested schema is not supported", this.declarationNode.name)), this.ref.schemaName = s.join(".") || null, n;
}
interpretBody(e) {
return e instanceof v ? this.interpretField(e) : this.interpretField(e.body[0]);
}
interpretField(e) {
var f, E, h, m, g, P, S;
const n = e.callee.op.value, { leftExpression: s, rightExpression: i } = e.callee, r = Ye(s), a = Ye(i);
if (Mt(r, a))
return [new c(o.SAME_ENDPOINT, "Two endpoints are the same", e)];
const l = Ut(r, a);
if (this.env.refIds[l])
return [
new c(o.CIRCULAR_REF, "References with same endpoints exist", this.declarationNode),
new c(o.CIRCULAR_REF, "References with same endpoints exist", this.env.refIds[l])
];
if (e.args[0]) {
const F = C(e.args[0]).getValue(), Le = (E = (f = F.delete) == null ? void 0 : f.at(0)) == null ? void 0 : E.value;
this.ref.onDelete = Le instanceof q ? Te(Le).unwrap_or(void 0) : Q(Le).unwrap_or(void 0);
const B = (m = (h = F.update) == null ? void 0 : h.at(0)) == null ? void 0 : m.value;
this.ref.onUpdate = B instanceof q ? Te(B).unwrap_or(void 0) : Q(B).unwrap_or(void 0), this.ref.color = (g = F.color) != null && g.length ? Be((S = (P = F.color) == null ? void 0 : P.at(0)) == null ? void 0 : S.value) : void 0;
}
const p = Pt(n);
return this.ref.endpoints = [
{
...Nt(s, this.container),
relation: p[0],
token: _(s)
},
{
...Nt(i, this.container),
relation: p[1],
token: _(i)
}
], this.env.refIds[l] = this.declarationNode, [];
}
}
class Vt {
constructor(e, n) {
this.declarationNode = e, this.env = n, this.tableGroup = { tables: [] };
}
interpret() {
const e = [];
return this.tableGroup.token = _(this.declarationNode), this.env.tableGroups.set(this.declarationNode, this.tableGroup), e.push(
...this.interpretName(this.declarationNode.name),
...this.interpretSettingList(this.declarationNode.attributeList),
...this.interpretBody(this.declarationNode.body)
), e;
}
interpretName(e) {
const n = [], { name: s, schemaName: i } = Ie(e);
return i.length >= 2 && (this.tableGroup.name = s, this.tableGroup.schemaName = i.join("."), n.push(new c(o.UNSUPPORTED, "Nested schema is not supported", this.declarationNode.name))), this.tableGroup.name = s, this.tableGroup.schemaName = i[0] || null, n;
}
interpretBody(e) {
const [n, s] = zt(e.body, (i) => i instanceof v);
return [
...this.interpretFields(n),
...this.interpretSubElements(s)
];
}
interpretSubElements(e) {
return e.flatMap((n) => {
var s;
switch ((s = n.type) == null ? void 0 : s.value.toLowerCase()) {
case "note":
this.tableGroup.note = {
value: $(
n.body instanceof K ? n.body.body[0].callee : n.body.callee
).map(ae).unwrap(),
token: _(n)
};
break;
}
return [];
});
}
interpretFields(e) {
const n = [];
return this.tableGroup.tables = e.map((s) => {
const i = z(s.callee).unwrap();
i.length > 2 && n.push(new c(o.UNSUPPORTED, "Nested schema is not supported", s));
const r = pe(s.callee).unwrap().pop().referee.id;
if (this.env.groupOfTable[r]) {
const a = this.env.groupOfTable[r], { schemaName: l, name: p } = this.env.tableGroups.get(a), f = l ? `${l}.${p}` : p;
n.push(new c(o.TABLE_REAPPEAR_IN_TABLEGROUP, `Table "${i.join(".")}" already appears in group "${f}"`, s));
} else
this.env.groupOfTable[r] = this.declarationNode;
return {
name: i.pop(),
schemaName: i.join(".")
};
}), n;
}
interpretSettingList(e) {
var i, r, a;
const n = C(e).getValue();
this.tableGroup.color = (i = n.color) != null && i.length ? Be((a = (r = n.color) == null ? void 0 : r.at(0)) == null ? void 0 : a.value) : void 0;
const [s] = n.note || [];
return this.tableGroup.note = s && {
value: $(s == null ? void 0 : s.value).map(ae).unwrap(),
token: _(s)
}, [];
}
}
class Gt {
constructor(e, n) {
this.declarationNode = e, this.env = n, this.enum = { values: [] };
}
interpret() {
return this.enum.token = _(this.declarationNode), this.env.enums.set(this.declarationNode, this.enum), [...this.interpretName(this.declarationNode.name), ...this.interpretBody(this.declarationNode.body)];
}
interpretName(e) {
const { name: n, schemaName: s } = Ie(e);
return s.length > 1 ? (this.enum.name = n, this.enum.schemaName = s.join("."), [new c(o.UNSUPPORTED, "Nested schema is not supported", e)]) : (this.enum.name = n, this.enum.schemaName = s.length ? s[0] : null, []);
}
interpretBody(e) {
return e.body.flatMap((n) => {
var l;
const s = n, i = {};
i.token = _(s), i.name = Q(s.callee).unwrap();
const a = (l = C(s.args[0]).getValue().note) == null ? void 0 : l.at(0);
return i.note = a && {
value: $(a.value).map(ae).unwrap(),
token: _(a)
}, this.enum.values.push(i), [];
});
}
}
class Kn {
constructor(e, n) {
this.declarationNode = e, this.env = n, this.project = { enums: [], refs: [], tableGroups: [], tables: [] };
}
interpret() {
return this.env.project.set(this.declarationNode, this.project), this.project.token = _(this.declarationNode), [...this.interpretName(this.declarationNode.name), ...this.interpretBody(this.declarationNode.body)];
}
interpretName(e) {
if (!e)
return this.project.name = null, [];
const { name: n } = Ie(e);
return this.project.name = n, [];
}
interpretBody(e) {
return e.body.flatMap((n) => {
var i;
const s = n;
switch ((i = s.type) == null ? void 0 : i.value.toLowerCase()) {
case "table": {
const r = new Ft(s, this.env).interpret();
return this.project.tables.push(this.env.tables.get(s)), r;
}
case "ref": {
const r = new Bt(s, this.env).interpret();
return this.project.refs.push(this.env.ref.get(s)), r;
}
case "tablegroup": {
const r = new Vt(s, this.env).interpret();
return this.project.tableGroups.push(this.env.tableGroups.get(s)), r;
}
case "enum": {
const r = new Gt(s, this.env).interpret();
return this.project.enums.push(this.env.enums.get(s)), r;
}
case "note":
return this.project.note = {
value: $(s.body instanceof K ? s.body.body[0].callee : s.body.callee).map(ae).unwrap(),
token: _(s)
}, [];
default:
return this.project[s.type.value.toLowerCase()] = $(s.body.callee).unwrap(), [];
}
});
}
}
class es {
constructor(e) {
this.ast = e, this.env = {
schema: [],
tables: /* @__PURE__ */ new Map(),
notes: /* @__PURE__ */ new Map(),
refIds: {},
ref: /* @__PURE__ */ new Map(),
enums: /* @__PURE__ */ new Map(),
tableGroups: /* @__PURE__ */ new Map(),
groupOfTable: {},
aliases: [],
project: /* @__PURE__ */ new Map()
};
}
interpret() {
const e = this.ast.body.flatMap((n) => {
switch (we(n).unwrap_or(void 0)) {
case b.Table:
return new Ft(n, this.env).interpret();
case b.Note:
return new Zn(n, this.env).interpret();
case b.Ref:
return new Bt(n, this.env).interpret();
case b.TableGroup:
return new Vt(n, this.env).interpret();
case b.Enum:
return new Gt(n, this.env).interpret();
case b.Project:
return new Kn(n, this.env).interpret();
default:
return [];
}
});
return new X(ts(this.env), e);
}
}
function ts(t) {
return {
schemas: [],
tables: Array.from(t.tables.values()),
notes: Array.from(t.notes.values()),
refs: Array.from(t.ref.values()),
enums: Array.from(t.enums.values()),
tableGroups: Array.from(t.tableGroups.values()),
aliases: t.aliases,
project: Array.from(t.project.values())[0] || {}
};
}
var L = /* @__PURE__ */ ((t) => (t[t.Function = 1] = "Function", t[t.Constructor = 2] = "Constructor", t[t.Field = 3] = "Field", t[t.Variable = 4] = "Variable", t[t.Class = 5] = "Class", t[t.Struct = 6] = "Struct", t[t.Interface = 7] = "Interface", t[t.Module = 8] = "Module", t[t.Property = 9] = "Property", t[t.Event = 10] = "Event", t[t.Operator = 11] = "Operator", t[t.Unit = 12] = "Unit", t[t.Value = 13] = "Value", t[t.Constant = 14] = "Constant", t[t.Enum = 15] = "Enum", t[t.EnumMember = 16] = "EnumMember", t[t.Keyword = 17] = "Keyword", t[t.Text = 18] = "Text", t[t.Color = 19] = "Color", t[t.File = 20] = "File", t[t.Reference = 21] = "Reference", t[t.Customcolor = 22] = "Customcolor", t[t.Folder = 23] = "Folder", t[t.TypeParameter = 24] = "TypeParameter", t[t.User = 25] = "User", t[t.Issue = 26] = "Issue", t[t.Snippet = 27] = "Snippet", t))(L || {}), w = /* @__PURE__ */ ((t) => (t[t.None = 0] = "None", t[t.KeepWhitespace = 1] = "KeepWhitespace", t[t.InsertAsSnippet = 4] = "InsertAsSnippet", t))(w || {});
function ve(t) {
switch (t) {
case T.Schema:
return L.Module;
case T.Table:
return L.Class;
case T.Column:
return L.Field;
case T.Enum:
return L.Enum;
case T.EnumField:
return L.EnumMember;
case T.TableGroup:
return L.Struct;
case T.TableGroupField:
return L.Field;
default:
return L.Text;
}
}
function Pe(t, e) {
if (!t || We(t))
return !1;
for (const n of t.trailingTrivia) {
if (n.start > e)
break;
if (n.kind === u.NEWLINE && n.end <= e)
return !1;
}
return !0;
}
function D() {
return {
suggestions: []
};
}
function Ue(t) {
return {
...t,
suggestions: t.suggestions.map((e) => ({
...e,
insertText: ` ${e.insertText}`
}))
};
}
function Ve(t) {
return {
...t,
suggestions: t.suggestions.map((e) => ({
...e,
insertText: e.insertText.split("").every(Fe) ? e.insertText : `"${e.insertText}"`
}))
};
}
function st(t, e) {
return t.getOffsetAt(e);
}
class Ct {
constructor(e, n = []) {
this.compiler = e, this.triggerCharacters = n;
}
provideCompletionItems(e, n) {
var E, h;
const s = st(e, n), i = this.compiler.token.flatStream(), { token: r, index: a } = this.compiler.container.token(s), l = a === void 0 ? i[0] : i[a + 1];
if ([
...(r == null ? void 0 : r.trailingTrivia) || [],
...(r == null ? void 0 : r.leadingTrivia) || [],
...(l == null ? void 0 : l.leadingTrivia) || []
].find((m) => Ht(m) && _e(s, m)))
return D();
if (a === void 0)
return Lt();
if ([u.STRING_LITERAL, u.QUOTED_STRING].includes(r.kind) && _e(s, r))
return D();
const p = this.compiler.container.element(s);
if (this.compiler.container.scopeKind(s) === O.TOPLEVEL || p instanceof A && p.type && p.type.start <= s && p.type.end >= s)
return Lt();
const f = [...this.compiler.container.stack(s)].reverse();
for (const m of f)
if (m instanceof H)
switch ((E = m.op) == null ? void 0 : E.value) {
case ">":
case "<":
case "<>":
case "-":
return mt(
this.compiler,
s,
m
);
}
else if (m instanceof J)
switch ((h = m.op) == null ? void 0 : h.value) {
case ">":
case "<":
case "<>":
case "-":
return mt(
this.compiler,
s,
m
);
case ".":
return Xt(
this.compiler,
s,
m
);
}
else {
if (m instanceof ie)
return Tt(this.compiler, s, m);
if (m instanceof R)
return Tt(this.compiler, s, m);
if (m instanceof ee)
return ns(this.compiler, s);
if (m instanceof v)
return It(this.compiler, s, m);
if (m instanceof A && (m.bodyColon && s >= m.bodyColon.end || m.body && _e(s, m.body)))
return It(this.compiler, s, void 0);
}
return D();
}
}
function mt(t, e, n) {
const s = t.container.scopeKind(e);
if ([O.REF, O.TABLE].includes(s)) {
const i = Ge(t, e, t.container.element(e), [
T.Table,
T.Schema,
T.Column
]);
return Pe(n.op, e) ? Ue(i) : i;
}
return D();
}
function Ge(t, e, n, s) {
var a;
if (n === void 0)
return D();
let i = n;
const r = { suggestions: [] };
for (; i; ) {
if ((a = i == null ? void 0 : i.symbol) != null && a.symbolTable) {
const { symbol: l } = i;
r.suggestions.push(
...t.symbol.members(l).filter(({ kind: p }) => s.includes(p)).map(({ name: p, kind: f }) => ({
label: p,
insertText: p,
insertTextRules: w.KeepWhitespace,
kind: ve(f),
sortText: ve(f).toString().padStart(2, "0"),
range: void 0
}))
);
}
i = i instanceof A ? i.parent : void 0;
}
return Ve(r);
}
function ns(t, e) {
var s;
switch (t.container.scopeKind(e)) {
case O.INDEXES:
return Wt(t, e);
case O.REF:
{
const i = [...t.container.stack(e)];
for (; i.length > 0; ) {
const r = i.pop();
if (r instanceof J && ((s = r.op) == null ? void 0 : s.value) === ".")
return Xt(
t,
e,
r
);
}
}
return $t(t, e);
}
return D();
}
function Tt(t, e, n) {
const { token: s } = t.container.token(e);
if ([u.COMMA, u.LBRACKET].includes(s == null ? void 0 : s.kind)) {
const i = bt(t, e);
return (s == null ? void 0 : s.kind) === u.COMMA && Pe(s, e) ? Ue(i) : i;
}
if (n.name && n.name.start <= e && n.name.end >= e)
return bt(t, e);
if (n.name instanceof q) {
const i = ss(
t,
e,
Te(n.name).unwrap_or("")
);
return (s == null ? void 0 : s.kind) === u.COLON && Pe(s, e) ? Ue(i) : i;
}
return D();
}
function bt(t, e) {
const n = t.container.element(e), s = t.container.scopeKind(e);
if (n instanceof j)
return D();
if (n.body && !_e(e, n.body))
switch (s) {
case O.TABLE:
return {
suggestions: ["headercolor", "note"].map((i) => ({
label: i,
insertText: `${i}: `,
kind: L.Field,
insertTextRules: w.KeepWhitespace,
range: void 0
}))
};
case O.TABLEGROUP:
return {
suggestions: ["color", "note"].map((i) => ({
label: i,
insertText: `${i}: `,
kind: L.Field,
insertTextRules: w.KeepWhitespace,
range: void 0
}))
};
default:
return D();
}
switch (s) {
case O.TABLE:
return {
suggestions: [
...["primary key", "null", "not null", "increment", "pk", "unique"].map((i) => ({
label: i,
insertText: i,
kind: L.Property,
insertTextRules: w.KeepWhitespace,
range: void 0
})),
...["ref", "default"].map((i) => ({
label: i,
insertText: `${i}: `,
kind: L.Property,
insertTextRules: w.KeepWhitespace,
range: void 0
})),
{
label: "note",
insertText: "note: ",
kind: L.Property,
insertTextRules: w.KeepWhitespace,
range: void 0
}
]
};
case O.ENUM:
return {
suggestions: [
{
label: "note",
insertText: "note: ",
kind: L.Property,
insertTextRules: w.KeepWhitespace,
range: void 0
}
]
};
case O.INDEXES:
return {
suggestions: [
...["unique", "pk"].map((i) => ({
label: i,
insertText: i,
insertTextRules: w.KeepWhitespace,
kind: L.Property,
range: void 0
})),
...["note", "name", "type"].map((i) => ({
label: i,
insertText: `${i}: `,
kind: L.Property,
insertTextRules: w.KeepWhitespace,
range: void 0
}))
]
};
case O.REF:
return {
suggestions: ["update", "delete"].map((i) => ({
label: i,
insertText: `${i}: `,
kind: L.Property,
insertTextRules: w.KeepWhitespace,
range: void 0
}))
};
}
return D();
}
function ss(t, e, n) {
switch (n == null ? void 0 : n.toLowerCase()) {
case "update":
case "delete":
return {
suggestions: ["cascade", "set default", "set null", "restrict"].map((s) => ({
label: s,
insertText: s,
kind: L.Value,
insertTextRules: w.KeepWhitespace,
range: void 0
}))
};
case "type":
return {
suggestions: ["btree", "hash"].map((s) => ({
label: s,
insertText: `${s}`,
kind: L.Value,
insertTextRules: w.KeepWhitespace,
range: void 0
}))
};
}
return D();
}
function Xt(t, e, n) {
const s = pe(n).unwrap_or([]);
if (s.pop(), s.some((r) => !V(r)))
return D();
const i = s.map((r) => Q(r).unwrap());
return Ve({
suggestions: t.symbol.ofName({ nameStack: i, owner: t.container.element(e) }).flatMap(({ symbol: r }) => t.symbol.members(r)).map(({ kind: r, name: a }) => ({
label: a,
insertText: a,
kind: ve(r),
range: void 0
}))
});
}
function It(t, e, n) {
var i;
switch (t.container.scopeKind(e)) {
case O.TABLE:
return rs(t, e, n);
case O.PROJECT:
return as(t, e, n);
case O.INDEXES:
return ls(t, e);
case O.ENUM:
return is(t, e, n);
case O.REF: {
const r = $t(t, e);
return ((i = t.container.token(e).token) == null ? void 0 : i.kind) === u.COLON && Pe(t.container.token(e).token, e) ? Ue(r) : r;
}
case O.TABLEGROUP:
return os(t);
default:
return D();
}
}
function Lt() {
return {
suggestions: ["Table", "TableGroup", "Enum", "Project", "Ref"].map((t) => ({
label: t,
insertText: t,
insertTextRules: w.KeepWhitespace,
kind: L.Keyword,
range: void 0
}))
};
}
function is(t, e, n) {
return n != null && n.callee && it(e, n) === 1 ? Ge(t, e, t.container.element(e), [
T.Schema,
T.Table,
T.Column
]) : D();
}
function rs(t, e, n) {
if (!(n != null && n.callee))
return {
suggestions: ["Note", "indexes"].map((i) => ({
label: i,
insertText: i,
insertTextRules: w.KeepWhitespace,
kind: L.Keyword,
range: void 0
}))
};
const s = it(e, n);
return s === 0 ? {
suggestions: ["Note", "indexes"].map((i) => ({
label: i,
insertText: i,
insertTextRules: w.KeepWhitespace,
kind: L.Keyword,
range: void 0
}))
} : s === 1 ? cs(t, e) : D();
}
function as(t, e, n) {
return n != null && n.callee ? it(e, n) === 0 ? {
suggestions: ["Table", "TableGroup", "Enum", "Note", "Ref"].map((i) => ({
label: i,
insertText: i,
insertTextRules: w.KeepWhitespace,
kind: L.Keyword,
range: void 0
}))
} : D() : {
suggestions: ["Table", "TableGroup", "Enum", "Note", "Ref"].map((i) => ({
label: i,
insertText: i,
insertTextRules: w.KeepWhitespace,
kind: L.Keyword,
range: void 0
}))
};
}
function $t(t, e) {
return Ge(t, e, t.container.element(e), [
T.Schema,
T.Table,
T.Column
]);
}
function os(t) {
return {
suggestions: [
...Ve({
suggestions: [...t.parse.publicSymbolTable().entries()].flatMap(([e]) => {
const n = re(e).unwrap_or(void 0);
if (n === void 0)
return [];
const { kind: s, name: i } = n;
return s !== T.Table && s !== T.Schema ? [] : {
label: i,
insertText: i,
insertTextRules: w.KeepWhitespace,
kind: ve(s),
range: void 0
};
})
}).suggestions,
...["Note"].map((e) => ({
label: e,
insertText: e,
insertTextRules: w.KeepWhitespace,
kind: L.Keyword,
range: void 0
}))
]
};
}
function ls(t, e) {
return Wt(t, e);
}
function cs(t, e) {
return {
suggestions: [
...[
"integer",
"int",
"tinyint",
"smallint",
"mediumint",
"bigint",
"bit",
"bool",
"binary",
"varbinary",
"logical",
"char",
"nchar",
"varchar",
"varchar2",
"nvarchar",
"nvarchar2",
"binary_float",
"binary_double",
"float",
"double",
"decimal",
"dec",
"real",
"money",
"smallmoney",
"enum",
"tinyblob",
"tinytext",
"blob",
"text",
"mediumblob",
"mediumtext",
"longblob",
"longtext",
"ntext",
"set",
"inet6",
"uuid",
"image",
"date",
"time",
"datetime",
"datetime2",
"timestamp",
"year",
"smalldatetime",
"datetimeoffset",
"XML",
"sql_variant",
"uniqueidentifier",
"CURSOR",
"BFILE",
"CLOB",
"NCLOB",
"RAW"
].map((n) => ({
label: n,
insertText: n,
insertTextRules: w.KeepWhitespace,
kind: L.TypeParameter,
sortText: L.TypeParameter.toString().padStart(2, "0"),
range: void 0
})),
...Ge(t, e, t.container.element(e), [
T.Enum,
T.Schema
]).suggestions
]
};
}
function Wt(t, e) {
const n = t.container.element(e), s = n == null ? void 0 : n.parent;
if (!((s == null ? void 0 : s.symbol) instanceof yt))
return D();
const { symbolTable: i } = s.symbol;
return Ve({
suggestions: [...i.entries()].flatMap(([r]) => {
const a = re(r).unwrap_or(void 0);
if (a === void 0)
return [];
const { name: l } = a;
return {
label: l,
insertText: l,
insertTextRules: w.KeepWhitespace,
kind: ve(T.Column),
range: void 0
};
})
});
}
function it(t, e) {
if (!e.callee)
return -1;
const n = [e.callee, ...e.args], s = n.findIndex((i) => t <= i.end);
return s === -1 ? n.length : s;
}
class jt {
constructor(e) {
this.compiler = e;
}
provideDefinition(e, n) {
var a;
const { uri: s } = e, i = st(e, n), r = [...this.compiler.container.stack(i)];
for (; r.length !== 0; ) {
const l = r.pop();
if ((a = l == null ? void 0 : l.referee) != null && a.declaration && [Ne.PRIMARY_EXPRESSION, Ne.VARIABLE].includes(l == null ? void 0 : l.kind)) {
const { startPos: p, endPos: f } = l.referee.declaration;
return [
{
range: {
startColumn: p.column + 1,
startLineNumber: p.line + 1,
endColumn: f.column + 1,
endLineNumber: f.line + 1
},
uri: s
}
];
}
}
return [];
}
}
class Yt {
constructor(e) {
this.compiler = e;
}
provideReferences(e, n) {
const { uri: s } = e, i = st(e, n), r = [...this.compiler.container.stack(i)];
for (; r.length !== 0; ) {
const a = r.pop();
if (a && [
Ne.ELEMENT_DECLARATION,
Ne.FUNCTION_APPLICATION,
Ne.PRIMARY_EXPRESSION
].includes(a == null ? void 0 : a.kind)) {
const { symbol: l } = a;
if (l != null && l.references.length)
return l.references.map(({ startPos: p, endPos: f }) => ({
range: {
startColumn: p.column + 1,
startLineNumber: p.line + 1,
endColumn: f.column + 1,
endLineNumber: f.line + 1
},
uri: s
}));
}
}
return [];
}
}
const fs = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
CompletionItemInsertTextRule: w,
CompletionItemKind: L,
DBMLCompletionItemProvider: Ct,
DBMLDefinitionProvider: jt,
DBMLReferencesProvider: Yt
}, Symbol.toStringTag, { value: "Module" }));
var O = /* @__PURE__ */ ((t) => (t[t.TABLE = 0] = "TABLE", t[t.ENUM = 1] = "ENUM", t[t.TABLEGROUP = 2] = "TABLEGROUP", t[t.INDEXES = 3] = "INDEXES", t[t.NOTE = 4] = "NOTE", t[t.REF = 5] = "REF", t[t.PROJECT = 6] = "PROJECT", t[t.CUSTOM = 7] = "CUSTOM", t[t.TOPLEVEL = 8] = "TOPLEVEL", t))(O || {});
class ps {
constructor() {
this.source = "", this.cache = new Array(
16
/* TOTAL_QUERY_COUNT */
).fill(null), this.nodeIdGenerator = new Jt(), this.symbolIdGenerator = new nn(), this.token = {
invalidStream: this.createQuery(
6,
() => this.parse.tokens().filter(kt)
),
// Valid + Invalid tokens (which are guarenteed to be non-trivials) are included in the stream
flatStream: this.createQuery(
7,
() => this.parse.tokens().flatMap((e) => [...e.leadingInvalid, e, ...e.trailingInvalid])
)
}, this.parse = {
source: () => this.source,
_: this.createQuery(
0,
() => {
const e = new pn(this.source).lex().chain((n) => new Nn(n, this.nodeIdGenerator).parse()).chain(({ ast: n, tokens: s }) => new qn(n, this.symbolIdGenerator).analyze().map(() => ({ ast: n, tokens: s })));
return e.getErrors().length > 0 ? e : e.chain(({ ast: n, tokens: s }) => new es(n).interpret().map((r) => ({ ast: n, tokens: s, rawDb: r })));
}
),
ast: this.createQuery(
1,
() => this.parse._().getValue().ast
),
errors: this.createQuery(2, () => this.parse._().getErrors()),
tokens: this.createQuery(
4,
() => this.parse._().getValue().tokens
),
rawDb: this.createQuery(
3,
() => this.parse._().getValue().rawDb
),
publicSymbolTable: this.createQuery(
5,
() => this.parse._().getValue().ast.symbol.symbolTable
)
}, this.container = {
stack: this.createQuery(
10,
(e) => {
const n = this.token.flatStream(), { index: s, token: i } = this.container.token(e), r = s === void 0 ? -1 : Qt(n, (f) => !f.isInvalid, s);
if (r === -1)
return [this.parse.ast()];
const a = n[r].start;
let l = this.parse.ast();
const p = [l];
for (; ; ) {
const E = fn(l).find((h) => _e(a, h));
if (E === void 0 || E instanceof G)
break;
p.push(E), l = E;
}
if ((i == null ? void 0 : i.kind) === u.COLON)
return p;
for (; p.length > 0; ) {
let f = !1;
const E = $e(p);
if (E instanceof v) {
const h = this.parse.source();
for (let m = E.end; m < e; m += 1)
h[m] === `
` && (p.pop(), f = !0);
} else
E instanceof H || E instanceof J ? this.container.token(e).token !== E.op && (p.pop(), f = !0) : E instanceof R ? E.listCloseBracket && E.end <= e && (p.pop(), f = !0) : E instanceof ee ? E.tupleCloseParen && E.end <= e && (p.pop(), f = !0) : E instanceof K ? E.blockCloseBrace && E.end <= e && (p.pop(), f = !0) : E instanceof q || E.end < e && (p.pop(), f = !0);
if (f) {
const h = $e(p);
h instanceof A && h.end <= e && p.pop();
}
if (!f)
break;
}
return p;
}
),
token: this.createQuery(
11,
(e) => {
const n = this.token.flatStream().findIndex((s) => s.start >= e);
return n === void 0 ? { token: void 0, index: void 0 } : n <= 0 ? { token: void 0, index: void 0 } : {
token: this.token.flatStream()[n - 1],
index: n - 1
};
}
),
element: this.createQuery(
12,
(e) => {
const n = this.container.stack(e);
for (let s = n.length - 1; s >= 0; s -= 1)
if (n[s] instanceof A)
return n[s];
return this.parse.ast();
}
),
scope: this.createQuery(
14,
(e) => {
var n, s;
return (s = (n = this.container.element(e)) == null ? void 0 : n.symbol) == null ? void 0 : s.symbolTable;
}
),
scopeKind: this.createQuery(15, (e) => {
var s;
if (this.container.element(e) instanceof j)
return 8;
switch ((s = this.container.element(e).type) == null ? void 0 : s.value.toLowerCase()) {
case "table":
return 0;
case "enum":
return 1;
case "ref":
return 5;
case "tablegroup":
return 2;
case "indexes":
return 3;
case "note":
return 4;
case "project":
return 6;
default:
return 7;
}
})
}, this.symbol = {
// Given a stack of name and the current scope
// Try looking up the first name in the stack in the current scope
// and resolve the rest of the name stack as members
// Then try to do the same with all ancestor scopes
ofName: this.createQuery(
8,
({
nameStack: e,
owner: n = this.parse.ast()
}) => {
var i;
if (e.length === 0)
return [];
const s = [];
for (let r = n; r; r = r instanceof A ? r.parent : void 0) {
if (!((i = r.symbol) != null && i.symbolTable))
continue;
const { symbolTable: a } = r.symbol;
let l = [a], p = [];
for (const f of e)
p = l.flatMap(
(E) => en(f).flatMap((h) => {
const m = E.get(h), g = re(h).unwrap_or(void 0);
return !m || !g ? [] : { ...g, symbol: m };
})
), l = p.flatMap(
(E) => E.symbol.symbolTable ? E.symbol.symbolTable : []
);
s.push(...p);
}
return s;
},
({ nameStack: e, owner: n }) => `${e.join(".")}@${n.id}`
),
members: this.createQuery(
9,
(e) => e.symbolTable ? [...e.symbolTable.entries()].map(([n, s]) => ({
...re(n).unwrap(),
symbol: s
})) : []
)
};
}
createQuery(e, n, s) {
return (i) => {
const r = this.cache[e], a = i && s ? s(i) : i;
if (r !== null) {
if (!(r instanceof Map))
return r;
if (r.has(a))
return r.get(a);
}
const l = n(i);
return i !== void 0 ? r instanceof Map ? r.set(a, l) : (this.cache[e] = /* @__PURE__ */ new Map(), this.cache[e].set(a, l)) : this.cache[e] = l, l;
};
}
setSource(e) {
this.source = e, this.cache = new Array(
16
/* TOTAL_QUERY_COUNT */
).fill(null), this.nodeIdGenerator.reset(), this.symbolIdGenerator.reset();
}
initMonacoServices() {
return {
definitionProvider: new jt(this),
referenceProvider: new Yt(this),
autocompletionProvider: new Ct(this)
};
}
}
export {
ps as Compiler,
hs as serialize,
fs as services
};