UNPKG

greybel-languageserver-core

Version:
69 lines 2.82 kB
"use strict"; 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