246 lines
9.9 KiB
TypeScript
246 lines
9.9 KiB
TypeScript
// Generated by scripts/generate_ast.py from Endor.asdl. Do not edit.
|
|
|
|
export const AST_SCHEMA_ID = "urn:endor:ast:sha256:21b0349ac295d9bc8cedcad8f07d8e2d45cf220e19e7c2fad10269555fcfd71a" 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: "If"; data: IfStatement; } | { kind: "While"; data: WhileStatement; } | { 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 IfStatement = { condition: Expr; body: Block; otherwise?: Block | null; span: Span; };
|
|
export type WhileStatement = { condition: Expr; body: Block; 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: "Await"; data: Expr; } | { 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" | "Equal" | "NotEqual" | "Less" | "LessEqual" | "Greater" | "GreaterEqual";
|
|
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;
|
|
visitIfStatement?(node: IfStatement): boolean | void;
|
|
visitWhileStatement?(node: WhileStatement): 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 "If":
|
|
walkIfStatement(node.data, visitor);
|
|
break;
|
|
case "While":
|
|
walkWhileStatement(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 walkIfStatement(node: IfStatement, visitor: Visitor): void {
|
|
if (visitor.visitIfStatement?.(node) === false) return;
|
|
walkExpr(node.condition, visitor);
|
|
walkBlock(node.body, visitor);
|
|
if (node.otherwise != null) walkBlock(node.otherwise, visitor);
|
|
walkSpan(node.span, visitor);
|
|
}
|
|
export function walkWhileStatement(node: WhileStatement, visitor: Visitor): void {
|
|
if (visitor.visitWhileStatement?.(node) === false) return;
|
|
walkExpr(node.condition, visitor);
|
|
walkBlock(node.body, 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 "Await":
|
|
walkExpr(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;
|
|
}
|