greybel-languageserver-core
Version:
Core functionality of language server for GreyScript
69 lines • 2.82 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.activate = void 0;
const greybel_type_analyzer_1 = require("greybel-type-analyzer");
const miniscript_core_1 = require("miniscript-core");
const lookup_type_1 = require("../helper/lookup-type");
const tooltip_1 = require("../helper/tooltip");
const getClosestCallExpression = (astResult) => {
if (astResult.closest.type === miniscript_core_1.ASTType.CallExpression) {
return astResult.closest;
}
for (let index = astResult.outer.length - 1; index >= 0; index--) {
const current = astResult.outer[index];
if (current.type === miniscript_core_1.ASTType.CallExpression) {
return current;
}
}
return null;
};
function activate(context) {
context.connection.onSignatureHelp(async (params) => {
if (!context.getConfiguration().autocomplete) {
return;
}
const document = await context.fs.getTextDocument(params.textDocument.uri);
if (document == null) {
return;
}
const activeDocument = await context.documentManager.getLatest(document);
const helper = new lookup_type_1.LookupHelper(activeDocument, context);
const astResult = await helper.lookupAST(params.position);
if (!astResult) {
return;
}
// filter out root call expression for signature
const { closest } = astResult;
const closestCallExpr = getClosestCallExpression(astResult);
if (closestCallExpr === null) {
return;
}
const entity = await helper.lookupTypeInfo({
closest: closestCallExpr.base,
outer: closest.scope ? [closest.scope] : []
});
if (!entity ||
(!(0, greybel_type_analyzer_1.isFunctionType)(entity.item) &&
(!(0, greybel_type_analyzer_1.isUnionType)(entity.item) ||
!entity.item.variants.some(greybel_type_analyzer_1.isFunctionType)))) {
return;
}
// figure out argument position
const astArgs = closestCallExpr.arguments;
const selectedIndex = astArgs.findIndex((argItem) => {
const leftIndex = argItem.start.character - 1;
const rightIndex = argItem.end.character;
return (leftIndex <= params.position.character &&
rightIndex >= params.position.character);
});
const signatureHelp = {
activeParameter: selectedIndex === -1 ? 0 : selectedIndex,
signatures: [],
activeSignature: 0
};
signatureHelp.signatures.push(...(0, tooltip_1.createSignatureInfo)(entity));
return signatureHelp;
});
}
exports.activate = activate;
//# sourceMappingURL=signature.js.map