diff --git a/src/ast-spec.ts b/src/ast-spec.ts index b1f00e81f..c6cc88034 100644 --- a/src/ast-spec.ts +++ b/src/ast-spec.ts @@ -4,6 +4,7 @@ import { TextSpan } from "./text" import { Value } from "./evaluator" import { Package } from "./package" import { Diagnostic } from "./diagnostics"; +import { serializeTag, serialize, JsonObject } from "./util"; let nextNodeId = 1; @@ -29,6 +30,17 @@ export abstract class Syntax { this.id = nextNodeId++; } + [serializeTag]() { + const result: JsonObject = {}; + for (const key of Object.keys(this)) { + if (key === 'parentNode' || key === 'errors' || key === 'type' || key === 'id') { + continue; + } + result[key] = serialize((this as any)[key]); + } + return result; + } + *preorder() { const stack: Syntax[] = [ this as unknown as Syntax ] ; while (stack.length > 0) { diff --git a/src/ast.ts b/src/ast.ts index 6a981b1e2..116db3230 100644 --- a/src/ast.ts +++ b/src/ast.ts @@ -8,6 +8,8 @@ import { Package } from "./package"; import { Diagnostic } from "./diagnostics"; +import { serializeTag, serialize, JsonObject } from "./util"; + let nextNodeId = 1; export type ResolveSyntaxKind = Extract 0) {