Path: blob/main/extensions/markdown-language-features/src/languageFeatures/diagnostics.ts
3292 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import * as vscode from 'vscode';6import { CommandManager } from '../commandManager';789// Copied from markdown language service10export enum DiagnosticCode {11link_noSuchReferences = 'link.no-such-reference',12link_noSuchHeaderInOwnFile = 'link.no-such-header-in-own-file',13link_noSuchFile = 'link.no-such-file',14link_noSuchHeaderInFile = 'link.no-such-header-in-file',15}161718class AddToIgnoreLinksQuickFixProvider implements vscode.CodeActionProvider {1920private static readonly _addToIgnoreLinksCommandId = '_markdown.addToIgnoreLinks';2122private static readonly _metadata: vscode.CodeActionProviderMetadata = {23providedCodeActionKinds: [24vscode.CodeActionKind.QuickFix25],26};2728public static register(selector: vscode.DocumentSelector, commandManager: CommandManager): vscode.Disposable {29const reg = vscode.languages.registerCodeActionsProvider(selector, new AddToIgnoreLinksQuickFixProvider(), AddToIgnoreLinksQuickFixProvider._metadata);30const commandReg = commandManager.register({31id: AddToIgnoreLinksQuickFixProvider._addToIgnoreLinksCommandId,32execute(resource: vscode.Uri, path: string) {33const settingId = 'validate.ignoredLinks';34const config = vscode.workspace.getConfiguration('markdown', resource);35const paths = new Set(config.get<string[]>(settingId, []));36paths.add(path);37config.update(settingId, [...paths], vscode.ConfigurationTarget.WorkspaceFolder);38}39});40return vscode.Disposable.from(reg, commandReg);41}4243provideCodeActions(document: vscode.TextDocument, _range: vscode.Range | vscode.Selection, context: vscode.CodeActionContext, _token: vscode.CancellationToken): vscode.ProviderResult<(vscode.CodeAction | vscode.Command)[]> {44const fixes: vscode.CodeAction[] = [];4546for (const diagnostic of context.diagnostics) {47switch (diagnostic.code) {48case DiagnosticCode.link_noSuchReferences:49case DiagnosticCode.link_noSuchHeaderInOwnFile:50case DiagnosticCode.link_noSuchFile:51case DiagnosticCode.link_noSuchHeaderInFile: {52const hrefText = (diagnostic as any).data?.hrefText;53if (hrefText) {54const fix = new vscode.CodeAction(55vscode.l10n.t("Exclude '{0}' from link validation.", hrefText),56vscode.CodeActionKind.QuickFix);5758fix.command = {59command: AddToIgnoreLinksQuickFixProvider._addToIgnoreLinksCommandId,60title: '',61arguments: [document.uri, hrefText],62};63fixes.push(fix);64}65break;66}67}68}6970return fixes;71}72}7374function registerMarkdownStatusItem(selector: vscode.DocumentSelector, commandManager: CommandManager): vscode.Disposable {75const statusItem = vscode.languages.createLanguageStatusItem('markdownStatus', selector);7677const enabledSettingId = 'validate.enabled';78const commandId = '_markdown.toggleValidation';7980const commandSub = commandManager.register({81id: commandId,82execute: (enabled: boolean) => {83vscode.workspace.getConfiguration('markdown').update(enabledSettingId, enabled);84}85});8687const update = () => {88const activeDoc = vscode.window.activeTextEditor?.document;89const markdownDoc = activeDoc?.languageId === 'markdown' ? activeDoc : undefined;9091const enabled = vscode.workspace.getConfiguration('markdown', markdownDoc).get(enabledSettingId);92if (enabled) {93statusItem.text = vscode.l10n.t('Markdown link validation enabled');94statusItem.command = {95command: commandId,96arguments: [false],97title: vscode.l10n.t('Disable'),98tooltip: vscode.l10n.t('Disable validation of Markdown links'),99};100} else {101statusItem.text = vscode.l10n.t('Markdown link validation disabled');102statusItem.command = {103command: commandId,104arguments: [true],105title: vscode.l10n.t('Enable'),106tooltip: vscode.l10n.t('Enable validation of Markdown links'),107};108}109};110update();111112return vscode.Disposable.from(113statusItem,114commandSub,115vscode.workspace.onDidChangeConfiguration(e => {116if (e.affectsConfiguration('markdown.' + enabledSettingId)) {117update();118}119}),120);121}122123export function registerDiagnosticSupport(124selector: vscode.DocumentSelector,125commandManager: CommandManager,126): vscode.Disposable {127return vscode.Disposable.from(128AddToIgnoreLinksQuickFixProvider.register(selector, commandManager),129registerMarkdownStatusItem(selector, commandManager),130);131}132133134