fish-lsp
Version:
LSP implementation for fish/fish-shell
64 lines (63 loc) • 2.26 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.runNoExecuteDiagnostic = runNoExecuteDiagnostic;
exports.getNoExecuteDiagnostics = getNoExecuteDiagnostics;
const vscode_languageserver_1 = require("vscode-languageserver");
const logger_1 = require("../logger");
const exec_1 = require("../utils/exec");
const error_codes_1 = require("./error-codes");
const NoExecuteErrorCode = error_codes_1.ErrorCodes.syntaxError;
function runNoExecuteDiagnostic(document) {
try {
const scriptContent = document.getText();
if (!scriptContent.trim()) {
return [];
}
const result = (0, exec_1.execFishNoExecute)(document.getFilePath());
if (result) {
logger_1.logger.log(`Fish --no-execute found output: ${result}`);
return fishOutputToDiagnostics(result, document);
}
return [];
}
catch (error) {
logger_1.logger.log(`Error in no-execute diagnostic: ${error}`);
return [];
}
}
function getNoExecuteDiagnostics(document) {
if (!document.uri.endsWith('.fish')) {
return [];
}
const diagnostics = runNoExecuteDiagnostic(document);
logger_1.logger.log(`No-execute diagnostics for ${document.uri}: ${diagnostics.length} issues found`);
return diagnostics;
}
const fishOutputToDiagnostics = (output, document) => {
const diagnostics = [];
const matches = getMatches(/^(.+) \(line (\d+)\): (.+)$/gm, output);
for (const match of matches) {
const lineNumber = Number.parseInt(match[2]);
const message = match[3];
const range = document.getLineRange(lineNumber - 1);
const diagnostic = {
severity: vscode_languageserver_1.DiagnosticSeverity.Error,
range,
message: `Fish syntax error: ${message}`,
source: 'fish-lsp',
code: NoExecuteErrorCode,
data: { isNoExecute: true, output },
};
diagnostics.push(diagnostic);
}
return diagnostics;
};
const getMatches = (pattern, text) => {
const results = [];
let match = pattern.exec(text);
while (match !== null) {
results.push(match);
match = pattern.exec(text);
}
return results;
};