// 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; 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; methods: Array; span: Span; }; export type Function = { name: Name; parameters: Array; return_type: Name; body: Block; span: Span; }; export type Parameter = { name: Name; type_name: Name; span: Span; }; export type Block = { statements: Array; 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; 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; }; }; 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; }