UNPKG

fish-lsp

Version:

LSP implementation for fish/fish-shell

71 lines (70 loc) 2.65 kB
"use strict"; 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; }