UNPKG

greybel-languageserver-core

Version:
204 lines 7.21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.findEx = exports.ScraperWalker = void 0; const miniscript_core_1 = require("miniscript-core"); const getScraperMap = function (visit) { return { ParenthesisExpression: (item, level) => { visit(item.expression, level); }, AssignmentStatement: function (item, level) { visit(item.init, level); visit(item.variable, level); }, MemberExpression: function (item, level) { visit(item.base, level); visit(item.identifier, level); }, FunctionDeclaration: function (item, level) { for (let index = 0; index < item.parameters.length; index++) { visit(item.parameters[index], level); } for (let index = 0; index < item.body.length; index++) { visit(item.body[index], level); } }, MapConstructorExpression: function (item, level) { for (let index = 0; index < item.fields.length; index++) { visit(item.fields[index], level); } }, ReturnStatement: function (item, level) { if (item.argument) { visit(item.argument, level); } }, WhileStatement: function (item, level) { visit(item.condition, level); for (let index = 0; index < item.body.length; index++) { visit(item.body[index], level); } }, IndexExpression: function (item, level) { visit(item.base, level); visit(item.index, level); }, SliceExpression: function (item, level) { visit(item.base, level); visit(item.left, level); visit(item.right, level); }, ListValue: function (item, level) { visit(item.value, level); }, MapKeyString: function (item, level) { visit(item.key, level); visit(item.value, level); }, IfShortcutStatement: function (item, level) { for (let index = 0; index < item.clauses.length; index++) { visit(item.clauses[index], level); } }, IfShortcutClause: function (item, level) { visit(item.condition, level); for (let index = 0; index < item.body.length; index++) { visit(item.body[index], level); } }, ElseifShortcutClause: function (item, level) { visit(item.condition, level); for (let index = 0; index < item.body.length; index++) { visit(item.body[index], level); } }, ElseShortcutClause: function (item, level) { for (let index = 0; index < item.body.length; index++) { visit(item.body[index], level); } }, ForGenericStatement: function (item, level) { visit(item.variable, level); visit(item.iterator, level); for (let index = 0; index < item.body.length; index++) { visit(item.body[index], level); } }, IfStatement: function (item, level) { for (let index = 0; index < item.clauses.length; index++) { visit(item.clauses[index], level); } }, IfClause: function (item, level) { visit(item.condition, level); for (let index = 0; index < item.body.length; index++) { visit(item.body[index], level); } }, ElseifClause: function (item, level) { visit(item.condition, level); for (let index = 0; index < item.body.length; index++) { visit(item.body[index], level); } }, ElseClause: function (item, level) { for (let index = 0; index < item.body.length; index++) { visit(item.body[index], level); } }, NegationExpression: function (item, level) { visit(item.argument, level); }, CallExpression: function (item, level) { visit(item.base, level); for (let index = 0; index < item.arguments.length; index++) { visit(item.arguments[index], level); } }, CallStatement: function (item, level) { visit(item.expression, level); }, ListConstructorExpression: function (item, level) { for (let index = 0; index < item.fields.length; index++) { visit(item.fields[index], level); } }, BinaryExpression: function (item, level) { visit(item.left, level); visit(item.right, level); }, BinaryNegatedExpression: function (item, level) { visit(item.argument, level); }, IsaExpression: function (item, level) { visit(item.left, level); visit(item.right, level); }, LogicalExpression: function (item, level) { visit(item.left, level); visit(item.right, level); }, ComparisonGroupExpression: function (item, level) { for (let index = 0; index < item.expressions.length; index++) { visit(item.expressions[index], level); } }, UnaryExpression: function (item, level) { visit(item.argument, level); }, Chunk: function (item, level) { for (let index = 0; index < item.body.length; index++) { visit(item.body[index], level); } }, InvalidCodeExpression: () => { } }; }; class ScraperWalker { constructor(callback, customMap = {}) { this.map = Object.assign(getScraperMap(this.visit.bind(this)), customMap); this.callback = callback; this.state = { exit: false, skip: false }; } visit(o, level = 0) { if (o == null) return; if (o.type == null) { console.error('Error ast type:', o); throw new Error('Unexpected as type'); } const state = this.callback(o, level); if (state != null) { Object.assign(this.state, state); } if (this.state.exit || this.state.skip) { this.state.skip = false; return; } const next = this.map[o.type]; if (next != null) { next.call(this, o, level + 1); } } } exports.ScraperWalker = ScraperWalker; function findEx(validate, rootItem) { const result = []; const walker = new ScraperWalker((item, level) => { const state = validate(item, level) || {}; if (state.valid && item.type !== miniscript_core_1.ASTType.InvalidCodeExpression) { result.push(item); } return { exit: !!state.exit, skip: !!state.skip }; }); walker.visit(rootItem); return result; } exports.findEx = findEx; //# sourceMappingURL=ast-scraper.js.map