UNPKG

@anchan828/json-ast

Version:
125 lines (124 loc) 3.88 kB
import { JsonNodeTypes, } from "./ast.js"; // Do not export this function as it provides the main traversal of the AST function traverseAST(visitor, node) { switch (node.type) { case JsonNodeTypes.DOCUMENT: { visitor.document(node); if (node.comments) { node.comments.forEach((commentNode) => { visitor.comment(commentNode); }); } if (node.child) { node.child.accept(visitor); } break; } case JsonNodeTypes.OBJECT: { visitor.object(node); if (node.comments) { node.comments.forEach((commentNode) => { visitor.comment(commentNode); }); } if (node.properties) { node.properties.forEach((propNode) => { propNode.accept(visitor); }); } break; } case JsonNodeTypes.PROPERTY: { visitor.property(node); node.key.accept(visitor); node.value.accept(visitor); break; } case JsonNodeTypes.KEY: { visitor.key(node); break; } case JsonNodeTypes.ARRAY: { visitor.array(node); if (visitor.stop) break; if (node.comments) { node.comments.forEach((commentNode) => { visitor.comment(commentNode); }); } if (node.items) { node.items.forEach((itemNode) => { itemNode.accept(visitor); }); } break; } case JsonNodeTypes.STRING: { visitor.value(node); if (!visitor.stop) visitor.string(node); break; } case JsonNodeTypes.NUMBER: { visitor.value(node); if (!visitor.stop) visitor.number(node); break; } case JsonNodeTypes.TRUE: { visitor.value(node); if (!visitor.stop) visitor.boolean(node); break; } case JsonNodeTypes.FALSE: { visitor.value(node); if (!visitor.stop) visitor.boolean(node); break; } case JsonNodeTypes.NULL: { visitor.value(node); if (!visitor.stop) visitor.null(node); break; } default: break; } } export class Visitor { constructor() { this.stop = false; } // Visit visit(node) { // call to "private" function if (this.stop) return; traverseAST(this, node); } // eslint-disable-next-line @typescript-eslint/no-unused-vars document(docNode) { } // eslint-disable-next-line @typescript-eslint/no-unused-vars object(objectNode) { } // eslint-disable-next-line @typescript-eslint/no-unused-vars property(propertyNode) { } // eslint-disable-next-line @typescript-eslint/no-unused-vars key(keyNode) { } // eslint-disable-next-line @typescript-eslint/no-unused-vars array(arrayNode) { } // eslint-disable-next-line @typescript-eslint/no-unused-vars value(valueNode) { } // eslint-disable-next-line @typescript-eslint/no-unused-vars comment(commentNode) { } // eslint-disable-next-line @typescript-eslint/no-unused-vars string(stringNode) { } // eslint-disable-next-line @typescript-eslint/no-unused-vars number(numberNode) { } // eslint-disable-next-line @typescript-eslint/no-unused-vars boolean(booleanNode) { } // eslint-disable-next-line @typescript-eslint/no-unused-vars null(nullNode) { } }