greybel-languageserver-core
Version:
Core functionality of language server for GreyScript
204 lines • 7.21 kB
JavaScript
;
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