Files
endorphin-aster-vm/crates/frontend/editor/ast.ts
T

220 lines
8.8 KiB
TypeScript

// Generated by scripts/generate_ast.py from Endor.asdl. Do not edit.
export const AST_SCHEMA_ID = "urn:endor:ast:sha256:ad2ac52943dd26e08395c0d2698861da98bb89c360241c4712c769de86709fd0" as const;
export interface Span { start: number; end: number; }
export type AstDocument = { schema: typeof AST_SCHEMA_ID; root: AstRoot; };
export type AstRoot = { kind: "Module"; data: Program; } | { kind: "Expression"; data: Expr; } | { kind: "Interactive"; data: InteractiveInput; };
export type Name = { text: string; span: Span; };
export type Program = { declarations: Array<Decl>; span: Span; };
export type Decl = { kind: DeclKind; span: Span; };
export type DeclKind = { kind: "Function"; data: Function; } | { kind: "Class"; data: Class; };
export type Class = { name: Name; base?: Name | null; fields: Array<Parameter>; methods: Array<Function>; span: Span; };
export type Function = { name: Name; parameters: Array<Parameter>; return_type: Name; body: Block; span: Span; };
export type Parameter = { name: Name; type_name: Name; span: Span; };
export type Block = { statements: Array<Stmt>; span: Span; };
export type Stmt = { kind: StmtKind; span: Span; };
export type StmtKind = { kind: "Binding"; data: Binding; } | { kind: "Assignment"; data: Assignment; } | { kind: "MemberAssignment"; data: MemberAssignment; } | { kind: "Return"; data: ReturnStatement; } | { kind: "Expression"; data: Expr; } | { kind: "Declaration"; data: Decl; };
export type Binding = { name: Name; value: Expr; span: Span; };
export type Assignment = { name: Name; value: Expr; span: Span; };
export type MemberAssignment = { object: Expr; name: Name; value: Expr; span: Span; };
export type ReturnStatement = { value?: Expr | null; span: Span; };
export type InteractiveInput = { statements: Array<Stmt>; span: Span; };
export type Expr = { kind: ExprKind; span: Span; };
export type ExprKind = { kind: "Name"; data: string; } | { kind: "Number"; data: string; } | { kind: "String"; data: string; } | { kind: "Symbol"; data: Name; } | { kind: "Unary"; data: { operation: UnaryOp; operand: Expr; }; } | { kind: "Binary"; data: { operation: BinaryOp; left: Expr; right: Expr; }; } | { kind: "Member"; data: { object: Expr; name: Name; }; } | { kind: "Call"; data: { callee: Expr; arguments: Array<Expr>; }; };
export type UnaryOp = "Negate";
export type BinaryOp = "Add" | "Subtract" | "Multiply" | "Divide";
export interface Visitor {
visitSpan?(node: Span): boolean | void;
visitAstDocument?(node: AstDocument): boolean | void;
visitAstRoot?(node: AstRoot): boolean | void;
visitName?(node: Name): boolean | void;
visitProgram?(node: Program): boolean | void;
visitDecl?(node: Decl): boolean | void;
visitDeclKind?(node: DeclKind): boolean | void;
visitClass?(node: Class): boolean | void;
visitFunction?(node: Function): boolean | void;
visitParameter?(node: Parameter): boolean | void;
visitBlock?(node: Block): boolean | void;
visitStmt?(node: Stmt): boolean | void;
visitStmtKind?(node: StmtKind): boolean | void;
visitBinding?(node: Binding): boolean | void;
visitAssignment?(node: Assignment): boolean | void;
visitMemberAssignment?(node: MemberAssignment): boolean | void;
visitReturnStatement?(node: ReturnStatement): boolean | void;
visitInteractiveInput?(node: InteractiveInput): boolean | void;
visitExpr?(node: Expr): boolean | void;
visitExprKind?(node: ExprKind): boolean | void;
visitUnaryOp?(node: UnaryOp): boolean | void;
visitBinaryOp?(node: BinaryOp): boolean | void;
}
export function walkSpan(node: Span, visitor: Visitor): void { visitor.visitSpan?.(node); }
export function walkAstDocument(node: AstDocument, visitor: Visitor): void {
if (visitor.visitAstDocument?.(node) === false) return;
walkAstRoot(node.root, visitor);
}
export function walkAstRoot(node: AstRoot, visitor: Visitor): void {
if (visitor.visitAstRoot?.(node) === false) return;
switch (node.kind) {
case "Module":
walkProgram(node.data, visitor);
break;
case "Expression":
walkExpr(node.data, visitor);
break;
case "Interactive":
walkInteractiveInput(node.data, visitor);
break;
}
}
export function walkName(node: Name, visitor: Visitor): void {
if (visitor.visitName?.(node) === false) return;
walkSpan(node.span, visitor);
}
export function walkProgram(node: Program, visitor: Visitor): void {
if (visitor.visitProgram?.(node) === false) return;
for (const value of node.declarations) walkDecl(value, visitor);
walkSpan(node.span, visitor);
}
export function walkDecl(node: Decl, visitor: Visitor): void {
if (visitor.visitDecl?.(node) === false) return;
walkDeclKind(node.kind, visitor);
walkSpan(node.span, visitor);
}
export function walkDeclKind(node: DeclKind, visitor: Visitor): void {
if (visitor.visitDeclKind?.(node) === false) return;
switch (node.kind) {
case "Function":
walkFunction(node.data, visitor);
break;
case "Class":
walkClass(node.data, visitor);
break;
}
}
export function walkClass(node: Class, visitor: Visitor): void {
if (visitor.visitClass?.(node) === false) return;
walkName(node.name, visitor);
if (node.base != null) walkName(node.base, visitor);
for (const value of node.fields) walkParameter(value, visitor);
for (const value of node.methods) walkFunction(value, visitor);
walkSpan(node.span, visitor);
}
export function walkFunction(node: Function, visitor: Visitor): void {
if (visitor.visitFunction?.(node) === false) return;
walkName(node.name, visitor);
for (const value of node.parameters) walkParameter(value, visitor);
walkName(node.return_type, visitor);
walkBlock(node.body, visitor);
walkSpan(node.span, visitor);
}
export function walkParameter(node: Parameter, visitor: Visitor): void {
if (visitor.visitParameter?.(node) === false) return;
walkName(node.name, visitor);
walkName(node.type_name, visitor);
walkSpan(node.span, visitor);
}
export function walkBlock(node: Block, visitor: Visitor): void {
if (visitor.visitBlock?.(node) === false) return;
for (const value of node.statements) walkStmt(value, visitor);
walkSpan(node.span, visitor);
}
export function walkStmt(node: Stmt, visitor: Visitor): void {
if (visitor.visitStmt?.(node) === false) return;
walkStmtKind(node.kind, visitor);
walkSpan(node.span, visitor);
}
export function walkStmtKind(node: StmtKind, visitor: Visitor): void {
if (visitor.visitStmtKind?.(node) === false) return;
switch (node.kind) {
case "Binding":
walkBinding(node.data, visitor);
break;
case "Assignment":
walkAssignment(node.data, visitor);
break;
case "MemberAssignment":
walkMemberAssignment(node.data, visitor);
break;
case "Return":
walkReturnStatement(node.data, visitor);
break;
case "Expression":
walkExpr(node.data, visitor);
break;
case "Declaration":
walkDecl(node.data, visitor);
break;
}
}
export function walkBinding(node: Binding, visitor: Visitor): void {
if (visitor.visitBinding?.(node) === false) return;
walkName(node.name, visitor);
walkExpr(node.value, visitor);
walkSpan(node.span, visitor);
}
export function walkAssignment(node: Assignment, visitor: Visitor): void {
if (visitor.visitAssignment?.(node) === false) return;
walkName(node.name, visitor);
walkExpr(node.value, visitor);
walkSpan(node.span, visitor);
}
export function walkMemberAssignment(node: MemberAssignment, visitor: Visitor): void {
if (visitor.visitMemberAssignment?.(node) === false) return;
walkExpr(node.object, visitor);
walkName(node.name, visitor);
walkExpr(node.value, visitor);
walkSpan(node.span, visitor);
}
export function walkReturnStatement(node: ReturnStatement, visitor: Visitor): void {
if (visitor.visitReturnStatement?.(node) === false) return;
if (node.value != null) walkExpr(node.value, visitor);
walkSpan(node.span, visitor);
}
export function walkInteractiveInput(node: InteractiveInput, visitor: Visitor): void {
if (visitor.visitInteractiveInput?.(node) === false) return;
for (const value of node.statements) walkStmt(value, visitor);
walkSpan(node.span, visitor);
}
export function walkExpr(node: Expr, visitor: Visitor): void {
if (visitor.visitExpr?.(node) === false) return;
walkExprKind(node.kind, visitor);
walkSpan(node.span, visitor);
}
export function walkExprKind(node: ExprKind, visitor: Visitor): void {
if (visitor.visitExprKind?.(node) === false) return;
switch (node.kind) {
case "Name":
break;
case "Number":
break;
case "String":
break;
case "Symbol":
walkName(node.data, visitor);
break;
case "Unary":
walkUnaryOp(node.data.operation, visitor);
walkExpr(node.data.operand, visitor);
break;
case "Binary":
walkBinaryOp(node.data.operation, visitor);
walkExpr(node.data.left, visitor);
walkExpr(node.data.right, visitor);
break;
case "Member":
walkExpr(node.data.object, visitor);
walkName(node.data.name, visitor);
break;
case "Call":
walkExpr(node.data.callee, visitor);
for (const value of node.data.arguments) walkExpr(value, visitor);
break;
}
}
export function walkUnaryOp(node: UnaryOp, visitor: Visitor): void {
if (visitor.visitUnaryOp?.(node) === false) return;
}
export function walkBinaryOp(node: BinaryOp, visitor: Visitor): void {
if (visitor.visitBinaryOp?.(node) === false) return;
}