@abaplint/core
Version:
abaplint - Core API
66 lines • 2.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.InlayHints = void 0;
const LServer = require("vscode-languageserver-types");
const _lsp_utils_1 = require("./_lsp_utils");
const syntax_1 = require("../abap/5_syntax/syntax");
const _abap_object_1 = require("../objects/_abap_object");
const _reference_1 = require("../abap/5_syntax/_reference");
const _typed_identifier_1 = require("../abap/types/_typed_identifier");
const types_1 = require("../abap/types");
class InlayHints {
constructor(reg) {
this.reg = reg;
}
list(textDocument, settings = { inferredTypes: true }) {
const file = _lsp_utils_1.LSPUtils.getABAPFile(this.reg, textDocument.uri);
if (file === undefined) {
return [];
}
const obj = this.reg.findObjectForFile(file);
if (obj === undefined || !(obj instanceof _abap_object_1.ABAPObject)) {
return [];
}
const top = new syntax_1.SyntaxLogic(this.reg, obj).run().spaghetti.getTop();
const ret = [];
if (settings.inferredTypes === true) {
const implicit = this.findImplicitReferences(top);
for (const i of implicit) {
let label = undefined;
if (i.resolved instanceof _typed_identifier_1.TypedIdentifier) {
label = "TYPE " + i.resolved.getType().toABAP();
}
else if (i.resolved instanceof types_1.ClassDefinition) {
label = "TYPE REF TO " + i.resolved.getName();
}
if (label === undefined) {
continue;
}
ret.push({
label: label,
tooltip: "Inferred type",
kind: LServer.InlayHintKind.Type,
paddingLeft: true,
paddingRight: true,
position: _lsp_utils_1.LSPUtils.positionToLS(i.position.getEnd()),
});
}
}
return ret;
}
findImplicitReferences(node) {
const ret = [];
for (const r of node.getData().references) {
if (r.referenceType === _reference_1.ReferenceType.InferredType ||
r.referenceType === _reference_1.ReferenceType.DataWriteReference) {
ret.push(r);
}
}
for (const c of node.getChildren()) {
ret.push(...this.findImplicitReferences(c));
}
return ret;
}
}
exports.InlayHints = InlayHints;
//# sourceMappingURL=inlay_hints.js.map