perlnavigator-server
Version:
Perl language server
79 lines • 2.86 kB
JavaScript
;
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