UNPKG

@abaplint/core

Version:
79 lines 3.03 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.LSPUtils = void 0; const nodes_1 = require("../abap/nodes"); const _identifier_1 = require("../abap/4_file_information/_identifier"); const _abap_object_1 = require("../objects/_abap_object"); const position_1 = require("../position"); const LServer = require("vscode-languageserver-types"); class LSPUtils { static getABAPFile(reg, filename) { const file = reg.getFileByName(filename); if (file === undefined) { return undefined; } const obj = reg.findObjectForFile(file); obj === null || obj === void 0 ? void 0 : obj.parse(); if (obj instanceof _abap_object_1.ABAPObject) { for (const abapfile of obj.getABAPFiles()) { if (abapfile.getFilename().toUpperCase() === filename.toUpperCase()) { return abapfile; } } } return undefined; } static tokenToRange(token) { return LServer.Range.create(token.getStart().getRow() - 1, token.getStart().getCol() - 1, token.getEnd().getRow() - 1, token.getEnd().getCol() - 1); } static positionToLS(pos) { return LServer.Position.create(pos.getRow() - 1, pos.getCol() - 1); } static identiferToLocation(identifier) { return { uri: identifier.getFilename(), range: LSPUtils.tokenToRange(identifier.getToken()), }; } static findCursor(reg, pos) { const file = LSPUtils.getABAPFile(reg, pos.textDocument.uri); if (file === undefined) { return undefined; } const search = new position_1.Position(pos.position.line + 1, pos.position.character + 1); for (const statement of file.getStatements()) { const res = this.buildStack(statement, search, [statement]); if (res !== undefined) { return { token: res.token, identifier: new _identifier_1.Identifier(res.token, file.getFilename()), stack: res.stack, snode: statement }; } } return undefined; } static buildStack(node, search, parents) { const stack = parents; for (const c of node.getChildren()) { if (c instanceof nodes_1.TokenNode) { const token = c.getFirstToken(); if (token.getRow() === search.getRow() && token.getCol() <= search.getCol() && token.getCol() + token.getStr().length > search.getCol()) { return { token, stack }; } } else { const res = this.buildStack(c, search, stack.concat([c])); if (res !== undefined) { return res; } } } return undefined; } } exports.LSPUtils = LSPUtils; //# sourceMappingURL=_lsp_utils.js.map