@anchan828/json-ast
Version:
JSON parser AST utilities
125 lines (124 loc) • 3.88 kB
JavaScript
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) { }
}