fish-lsp
Version:
LSP implementation for fish/fish-shell
71 lines (70 loc) • 2.65 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getStatusInlayHints = getStatusInlayHints;
exports.findReturnNodes = findReturnNodes;
exports.getReturnStatusValue = getReturnStatusValue;
const vscode_languageserver_1 = require("vscode-languageserver");
const snippets_1 = require("./utils/snippets");
const node_types_1 = require("./utils/node-types");
const tree_sitter_1 = require("./utils/tree-sitter");
async function getStatusInlayHints(root) {
const hints = [];
const returnStatements = (0, tree_sitter_1.findChildNodes)(root, node_types_1.isReturn);
for (const returnStmt of returnStatements) {
const status = getReturnStatusValue(returnStmt);
if (status) {
hints.push({
position: {
line: returnStmt.endPosition.row,
character: returnStmt.endPosition.column,
},
kind: vscode_languageserver_1.InlayHintKind.Parameter,
label: ` → ${status.inlineValue}`,
paddingLeft: true,
tooltip: {
kind: 'markdown',
value: `Status code ${status.tooltip.code}: ${status.tooltip.description}`,
},
});
}
}
return hints;
}
function findReturnNodes(root) {
const nodes = [];
const queue = [root];
while (queue.length > 0) {
const node = queue.shift();
if ((0, node_types_1.isReturn)(node)) {
nodes.push(node);
}
queue.push(...node.children);
}
return nodes;
}
function getStatusDescription(status) {
const statusMap = {
0: 'Success',
1: 'General error',
2: 'Misuse of shell builtins',
126: 'Command invoked cannot execute',
127: 'Command not found',
128: 'Invalid exit argument',
130: 'Script terminated by Control-C',
};
return statusMap[status] || `Exit code ${status}`;
}
function getReturnStatusValue(returnNode) {
const statusArg = returnNode.children.find(child => !(0, node_types_1.isCommand)(child) && !(0, node_types_1.isCommandName)(child) && child.type === 'integer');
if (!statusArg?.text)
return undefined;
const statusInfo = snippets_1.PrebuiltDocumentationMap.getByName(statusArg.text).pop();
const statusInfoShort = getStatusDescription(statusArg.text);
return statusInfoShort ? {
inlineValue: statusInfoShort,
tooltip: {
code: statusInfo?.name || statusArg.text,
description: statusInfo?.description || statusInfoShort,
},
} : undefined;
}