fish-lsp
Version:
LSP implementation for fish/fish-shell
90 lines (89 loc) • 3.41 kB
JavaScript
;
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,
};
}