@anchan828/json-ast
Version: 
JSON parser AST utilities
130 lines (129 loc) • 4.54 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Visitor = void 0;
var ast_js_1 = require("./ast.js");
// Do not export this function as it provides the main traversal of the AST
function traverseAST(visitor, node) {
    switch (node.type) {
        case ast_js_1.JsonNodeTypes.DOCUMENT: {
            visitor.document(node);
            if (node.comments) {
                node.comments.forEach(function (commentNode) {
                    visitor.comment(commentNode);
                });
            }
            if (node.child) {
                node.child.accept(visitor);
            }
            break;
        }
        case ast_js_1.JsonNodeTypes.OBJECT: {
            visitor.object(node);
            if (node.comments) {
                node.comments.forEach(function (commentNode) {
                    visitor.comment(commentNode);
                });
            }
            if (node.properties) {
                node.properties.forEach(function (propNode) {
                    propNode.accept(visitor);
                });
            }
            break;
        }
        case ast_js_1.JsonNodeTypes.PROPERTY: {
            visitor.property(node);
            node.key.accept(visitor);
            node.value.accept(visitor);
            break;
        }
        case ast_js_1.JsonNodeTypes.KEY: {
            visitor.key(node);
            break;
        }
        case ast_js_1.JsonNodeTypes.ARRAY: {
            visitor.array(node);
            if (visitor.stop)
                break;
            if (node.comments) {
                node.comments.forEach(function (commentNode) {
                    visitor.comment(commentNode);
                });
            }
            if (node.items) {
                node.items.forEach(function (itemNode) {
                    itemNode.accept(visitor);
                });
            }
            break;
        }
        case ast_js_1.JsonNodeTypes.STRING: {
            visitor.value(node);
            if (!visitor.stop)
                visitor.string(node);
            break;
        }
        case ast_js_1.JsonNodeTypes.NUMBER: {
            visitor.value(node);
            if (!visitor.stop)
                visitor.number(node);
            break;
        }
        case ast_js_1.JsonNodeTypes.TRUE: {
            visitor.value(node);
            if (!visitor.stop)
                visitor.boolean(node);
            break;
        }
        case ast_js_1.JsonNodeTypes.FALSE: {
            visitor.value(node);
            if (!visitor.stop)
                visitor.boolean(node);
            break;
        }
        case ast_js_1.JsonNodeTypes.NULL: {
            visitor.value(node);
            if (!visitor.stop)
                visitor.null(node);
            break;
        }
        default:
            break;
    }
}
var Visitor = /** @class */ (function () {
    function Visitor() {
        this.stop = false;
    }
    // Visit
    Visitor.prototype.visit = function (node) {
        // call to "private" function
        if (this.stop)
            return;
        traverseAST(this, node);
    };
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    Visitor.prototype.document = function (docNode) { };
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    Visitor.prototype.object = function (objectNode) { };
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    Visitor.prototype.property = function (propertyNode) { };
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    Visitor.prototype.key = function (keyNode) { };
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    Visitor.prototype.array = function (arrayNode) { };
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    Visitor.prototype.value = function (valueNode) { };
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    Visitor.prototype.comment = function (commentNode) { };
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    Visitor.prototype.string = function (stringNode) { };
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    Visitor.prototype.number = function (numberNode) { };
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    Visitor.prototype.boolean = function (booleanNode) { };
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    Visitor.prototype.null = function (nullNode) { };
    return Visitor;
}());
exports.Visitor = Visitor;