fish-lsp
Version:
LSP implementation for fish/fish-shell
76 lines (75 loc) • 2.97 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isPossibleDiagnosticComment = isPossibleDiagnosticComment;
exports.detectInvalidDiagnosticCodes = detectInvalidDiagnosticCodes;
exports.checkForInvalidDiagnosticCodes = checkForInvalidDiagnosticCodes;
const vscode_languageserver_1 = require("vscode-languageserver");
const error_codes_1 = require("./error-codes");
const node_types_1 = require("../utils/node-types");
const logger_1 = require("../logger");
const DIAGNOSTIC_COMMENT_REGEX = /^#\s*@fish-lsp-(disable|enable)(?:-(next-line))?\s/;
function isPossibleDiagnosticComment(node) {
if (!(0, node_types_1.isComment)(node))
return false;
return DIAGNOSTIC_COMMENT_REGEX.test(node.text.trim());
}
function findCodes(text) {
const directiveMatch = text.match(/@fish-lsp-(?:disable|enable)(?:-next-line)?/);
if (!directiveMatch)
return [];
const codesStart = directiveMatch.index + directiveMatch[0].length;
const codesSection = text.slice(codesStart);
const result = [];
const codeRegex = /(\d+)/g;
let match;
while ((match = codeRegex.exec(codesSection)) !== null) {
result.push({
code: match[0],
startIndex: codesStart + match.index,
});
}
logger_1.logger.log('Found codes:', result, 'on text:', text);
logger_1.logger.log('Directive:', directiveMatch);
return result;
}
function detectInvalidDiagnosticCodes(node) {
if (!(0, node_types_1.isComment)(node))
return [];
const text = node.text.trim();
if (!DIAGNOSTIC_COMMENT_REGEX.test(text))
return [];
const codePositions = findCodes(text);
const diagnostics = [];
for (const { code, startIndex } of codePositions) {
const codeNum = parseInt(code, 10);
if (isNaN(codeNum) || !error_codes_1.ErrorCodes.allErrorCodes.includes(codeNum)) {
diagnostics.push({
severity: vscode_languageserver_1.DiagnosticSeverity.Warning,
range: {
start: {
line: node.startPosition.row,
character: node.startPosition.column + startIndex,
},
end: {
line: node.startPosition.row,
character: node.startPosition.column + startIndex + code.length,
},
},
message: `Invalid diagnostic code: '${code}'. Valid codes are: ${error_codes_1.ErrorCodes.allErrorCodes.join(', ')}.`,
source: 'fish-lsp',
code: 'invalidDiagnosticCode',
data: {
node,
invalidCode: code,
},
});
}
}
return diagnostics;
}
function checkForInvalidDiagnosticCodes(node) {
if (isPossibleDiagnosticComment(node)) {
return detectInvalidDiagnosticCodes(node);
}
return [];
}