@abaplint/core
Version:
abaplint - Core API
79 lines • 3.03 kB
JavaScript
;
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