yaml-language-server
Version:
88 lines • 3.87 kB
JavaScript
;
/*---------------------------------------------------------------------------------------------
* Copyright (c) Red Hat, Inc. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.YAML_DISABLE_PATTERN = void 0;
exports.parseDisableSpecifiers = parseDisableSpecifiers;
exports.shouldSuppressDiagnostic = shouldSuppressDiagnostic;
exports.filterSuppressedDiagnostics = filterSuppressedDiagnostics;
/**
* Pattern that matches a `# yaml-language-server-disable` comment.
*
* Usage in YAML files:
*
* - `# yaml-language-server-disable` - suppress ALL diagnostics on the next line
* - `# yaml-language-server-disable Incorrect type` - suppress diagnostics whose message contains "Incorrect type"
* - `# yaml-language-server-disable Incorrect type, not accepted` - suppress diagnostics matching any of the substrings
*
* Capture group 1 (optional) contains the comma-separated list of message
* substrings to match against. If absent, all diagnostics are suppressed.
*/
exports.YAML_DISABLE_PATTERN = /^\s*#\s*yaml-language-server-disable\b(.*)$/;
/**
* Parse the text after `yaml-language-server-disable` into an array of trimmed,
* lower-cased message substrings. Returns an empty array when no
* specifiers are provided (meaning "suppress all").
*/
function parseDisableSpecifiers(raw) {
const trimmed = raw.trim();
if (!trimmed) {
return [];
}
return trimmed
.split(',')
.map((s) => s.trim().toLowerCase())
.filter((s) => s.length > 0);
}
/**
* Determine whether a diagnostic should be suppressed based on the
* specifiers from a `# yaml-language-server-disable` comment.
*
* @param specifiers - Parsed specifiers (empty means suppress all).
* @param diagnosticMessage - The diagnostic's message text.
* @returns `true` if the diagnostic should be suppressed.
*/
function shouldSuppressDiagnostic(specifiers, diagnosticMessage) {
if (specifiers.length === 0) {
return true;
}
const lowerMessage = diagnosticMessage.toLowerCase();
return specifiers.some((spec) => lowerMessage.includes(spec));
}
/**
* Filters an array of diagnostics, removing any whose starting line is
* immediately preceded by a `# yaml-language-server-disable` comment.
*
* When the comment includes one or more comma-separated message substrings,
* only diagnostics whose message contains at least one of those substrings
* (case-insensitive) are suppressed. Without specifiers, all diagnostics
* on the next line are suppressed.
*
* @param diagnostics - The diagnostics to filter.
* @param getStartLine - Extracts the zero-based starting line number from a diagnostic.
* @param getMessage - Extracts the message string from a diagnostic.
* @param getLineText - Returns the text of a document line by its zero-based index,
* or `undefined` if the line is out of range.
* @returns A new array containing only the diagnostics that are not suppressed.
*/
function filterSuppressedDiagnostics(diagnostics, getStartLine, getMessage, getLineText) {
return diagnostics.filter((diag) => {
const line = getStartLine(diag);
if (line === 0) {
return true;
}
const prevLineText = getLineText(line - 1);
if (prevLineText === undefined) {
return true;
}
const match = exports.YAML_DISABLE_PATTERN.exec(prevLineText);
if (!match) {
return true;
}
const specifiers = parseDisableSpecifiers(match[1]);
return !shouldSuppressDiagnostic(specifiers, getMessage(diag));
});
}
//# sourceMappingURL=diagnostic-filter.js.map