UNPKG

perlnavigator-server

Version:

Perl language server

79 lines 2.86 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.refineElement = exports.refineElementIfSub = void 0; const types_1 = require("./types"); const parser_1 = require("./parser"); const fs = require("fs"); const vscode_uri_1 = require("vscode-uri"); async function refineElementIfSub(elem, params, perlDoc) { if (![types_1.PerlSymbolKind.LocalSub, types_1.PerlSymbolKind.ImportedSub, types_1.PerlSymbolKind.Inherited, types_1.PerlSymbolKind.LocalMethod, types_1.PerlSymbolKind.Method].includes(elem.type)) { return; } if (elem.source == types_1.ElemSource.parser && params && elem.line == params.position.line) { // We're typing the actual signature or hovering over the definition. No pop-up needed. return; } return await refineElement(elem, perlDoc); } exports.refineElementIfSub = refineElementIfSub; async function refineElement(elem, perlDoc) { // Return back the original if you can't refine let refined = elem; if (elem.source == types_1.ElemSource.parser || elem.source == types_1.ElemSource.modHunter) { refined = elem; } else { const resolvedUri = await getUriFromElement(elem, perlDoc); if (!resolvedUri) return refined; let doc = await (0, parser_1.parseFromUri)(resolvedUri, types_1.ParseType.refinement); if (!doc) return refined; let refinedElems; if ([types_1.PerlSymbolKind.Package, types_1.PerlSymbolKind.Class].includes(elem.type)) { refinedElems = doc.elems.get(elem.name); } else { // Looks up Foo::Bar::baz by only the function name baz // Will fail if you have multiple same name functions in the same file. let match = elem.name.match(/\w+$/); if (match) { refinedElems = doc.elems.get(match[0]); } } if (refinedElems && refinedElems.length == 1) { refined = refinedElems[0]; } } return refined; } exports.refineElement = refineElement; async function getUriFromElement(elem, perlDoc) { if (await isFile(elem.uri)) return elem.uri; if (!elem.package) return; const elemResolved = perlDoc.elems.get(elem.package); if (!elemResolved) return; for (let potentialElem of elemResolved) { if (await isFile(potentialElem.uri)) { return potentialElem.uri; } } } async function isFile(uri) { const file = vscode_uri_1.default.parse(uri).fsPath; if (!file || file.length < 1) { return false; } try { const stats = await fs.promises.stat(file); return stats.isFile(); } catch (err) { // File or directory doesn't exist return false; } } //# sourceMappingURL=refinement.js.map