UNPKG

@eagleoutice/flowr

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

69 lines 3.22 kB
"use strict"; 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