UNPKG

fish-lsp

Version:

LSP implementation for fish/fish-shell

90 lines (89 loc) 3.41 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildCommentCompletions = buildCommentCompletions; const vscode_languageserver_1 = require("vscode-languageserver"); const static_items_1 = require("./static-items"); const comments_handler_1 = require("../../diagnostics/comments-handler"); const list_1 = require("./list"); function buildCommentCompletions(line, position, node, data, word) { // FishCompletionItem.createData(data.uri, line, ,detail, documentation) const hashIndex = line.indexOf('#'); // Create range from the # character to cursor const range = vscode_languageserver_1.Range.create(vscode_languageserver_1.Position.create(position.line, hashIndex), position); // Command to retrigger completion const retriggerCommand = { title: 'Suggest', command: 'editor.action.triggerSuggest', }; const completions = []; if (position.line === 0) { completions.push(...static_items_1.StaticItems.shebang.map(item => { item.textEdit = vscode_languageserver_1.TextEdit.replace(range, item.label); return item; })); } /** * add diagnostic comment strings: * `# @fish-lsp-disable` */ const diagnosticComment = getCommentDiagnostics(line, position.line); if (!diagnosticComment) { completions.push(...static_items_1.StaticItems.comment.map((item) => { item.textEdit = vscode_languageserver_1.TextEdit.replace(range, `${item.label} `); item.command = retriggerCommand; return item; })); } /** * add diagnostic codes to the completion list * `# @fish-lsp-disable 1001` */ if (diagnosticComment) { if (diagnosticComment?.codes) { const codeStrings = diagnosticComment?.codes.map(code => code.toString()); completions.push(...static_items_1.StaticItems.diagnostic .filter(item => !codeStrings.includes(item.label)) .map((item) => { item.command = retriggerCommand; item.insertText = `${item.label} `; return item; })); } } const completionData = { word, position, uri: data.uri, line, }; return list_1.FishCompletionList.create(false, completionData, completions); } function getCommentDiagnostics(line, lineNumber) { const match = line.trim().match(comments_handler_1.DIAGNOSTIC_COMMENT_REGEX); if (!match) return null; const [, action, nextLine, codesStr] = match; const codeStrings = codesStr ? codesStr.trim().split(/\s+/) : []; // Parse the diagnostic codes if present const parsedCodes = codeStrings .map(codeStr => parseInt(codeStr, 10)) .filter(code => !isNaN(code)); const validCodes = []; const invalidCodes = []; codeStrings.forEach((codeStr, idx) => { const code = parsedCodes[idx]; if (code && !isNaN(code) && (0, comments_handler_1.isValidErrorCode)(code)) { validCodes.push(code); } else { invalidCodes.push(codeStr); } }); return { action: action, target: nextLine ? 'next-line' : 'line', codes: validCodes, lineNumber: lineNumber, invalidCodes: invalidCodes.length > 0 ? invalidCodes : undefined, }; }