220 lines
8.8 KiB
TypeScript
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;
|
|
}
|