@eagleoutice/flowr
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
69 lines • 3.22 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TreeSitterExecutor = exports.DEFAULT_TREE_SITTER_WASM_PATH = exports.DEFAULT_TREE_SITTER_R_WASM_PATH = void 0;
const web_tree_sitter_1 = __importDefault(require("web-tree-sitter"));
const fs_1 = __importDefault(require("fs"));
const config_1 = require("../../../config");
const log_1 = require("../../../util/log");
exports.DEFAULT_TREE_SITTER_R_WASM_PATH = `${__dirname}/tree-sitter-r.wasm`;
exports.DEFAULT_TREE_SITTER_WASM_PATH = `${__dirname}/tree-sitter.wasm`;
const wasmLog = log_1.log.getSubLogger({ name: 'tree-sitter-wasm' });
/**
* Synchronous and (way) faster alternative to the {@link RShell} using tree-sitter.
*/
class TreeSitterExecutor {
name = 'tree-sitter';
parser;
static language;
/**
* Initializes the underlying tree-sitter parser. This only needs to be called once globally.
* @param overrideWasmPath - The path to the tree-sitter-r wasm file, which takes precedence over the config and default paths if set.
* @param overrideTreeSitterWasmPath - The path to the tree-sitter wasm file, which takes precedence over the config and default paths if set.
*/
static async initTreeSitter(overrideWasmPath, overrideTreeSitterWasmPath) {
const treeSitterWasmPath = overrideTreeSitterWasmPath ?? (0, config_1.getEngineConfig)('tree-sitter')?.treeSitterWasmPath ?? exports.DEFAULT_TREE_SITTER_WASM_PATH;
// noinspection JSUnusedGlobalSymbols - this is used by emscripten, see https://emscripten.org/docs/api_reference/module.html
await web_tree_sitter_1.default.init({
locateFile: (path, prefix) => {
// allow setting a custom path for the tree sitter wasm file
if (path.endsWith('tree-sitter.wasm')) {
return treeSitterWasmPath;
}
return prefix + path;
},
onAbort: (s) => wasmLog.error(`Tree-sitter wasm aborted: ${s}`),
print: (s) => wasmLog.debug(s),
printErr: (s) => wasmLog.error(s)
});
const wasmPath = overrideWasmPath ?? (0, config_1.getEngineConfig)('tree-sitter')?.wasmPath ?? exports.DEFAULT_TREE_SITTER_R_WASM_PATH;
TreeSitterExecutor.language = await web_tree_sitter_1.default.Language.load(wasmPath);
}
constructor() {
this.parser = new web_tree_sitter_1.default();
this.parser.setLanguage(TreeSitterExecutor.language);
}
rVersion() {
return Promise.resolve('none');
}
treeSitterVersion() {
return this.parser.getLanguage().version;
}
parse(request) {
let sourceCode;
if (request.request === 'file') {
sourceCode = fs_1.default.readFileSync(request.content, 'utf8');
}
else {
sourceCode = request.content;
}
return this.parser.parse(sourceCode);
}
close() {
this.parser.delete();
}
}
exports.TreeSitterExecutor = TreeSitterExecutor;
//# sourceMappingURL=tree-sitter-executor.js.map