UNPKG

fish-lsp

Version:

LSP implementation for fish/fish-shell

64 lines (63 loc) 2.26 kB
"use strict"; 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; };