Path: blob/main/extensions/markdown-language-features/src/languageFeatures/diagnostics.ts
5237 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';7import { isMarkdownFile } from '../util/file';8910// Copied from markdown language service11export enum DiagnosticCode {12link_noSuchReferences = 'link.no-such-reference',13link_noSuchHeaderInOwnFile = 'link.no-such-header-in-own-file',14link_noSuchFile = 'link.no-such-file',15link_noSuchHeaderInFile = 'link.no-such-header-in-file',16}171819class AddToIgnoreLinksQuickFixProvider implements vscode.CodeActionProvider {2021private static readonly _addToIgnoreLinksCommandId = '_markdown.addToIgnoreLinks';2223private static readonly _metadata: vscode.CodeActionProviderMetadata = {24providedCodeActionKinds: [25vscode.CodeActionKind.QuickFix26],27};2829public static register(selector: vscode.DocumentSelector, commandManager: CommandManager): vscode.Disposable {30const reg = vscode.languages.registerCodeActionsProvider(selector, new AddToIgnoreLinksQuickFixProvider(), AddToIgnoreLinksQuickFixProvider._metadata);31const commandReg = commandManager.register({32id: AddToIgnoreLinksQuickFixProvider._addToIgnoreLinksCommandId,33execute(resource: vscode.Uri, path: string) {34const settingId = 'validate.ignoredLinks';35const config = vscode.workspace.getConfiguration('markdown', resource);36const paths = new Set(config.get<string[]>(settingId, []));37paths.add(path);38config.update(settingId, [...paths], vscode.ConfigurationTarget.WorkspaceFolder);39}40});41return vscode.Disposable.from(reg, commandReg);42}4344provideCodeActions(document: vscode.TextDocument, _range: vscode.Range | vscode.Selection, context: vscode.CodeActionContext, _token: vscode.CancellationToken): vscode.ProviderResult<(vscode.CodeAction | vscode.Command)[]> {45const fixes: vscode.CodeAction[] = [];4647for (const diagnostic of context.diagnostics) {48switch (diagnostic.code) {49case DiagnosticCode.link_noSuchReferences:50case DiagnosticCode.link_noSuchHeaderInOwnFile:51case DiagnosticCode.link_noSuchFile:52case DiagnosticCode.link_noSuchHeaderInFile: {53// eslint-disable-next-line local/code-no-any-casts54const hrefText = (diagnostic as any).data?.hrefText;55if (hrefText) {56const fix = new vscode.CodeAction(57vscode.l10n.t("Exclude '{0}' from link validation.", hrefText),58vscode.CodeActionKind.QuickFix);5960fix.command = {61command: AddToIgnoreLinksQuickFixProvider._addToIgnoreLinksCommandId,62title: '',63arguments: [document.uri, hrefText],64};65fixes.push(fix);66}67break;68}69}70}7172return fixes;73}74}7576function registerMarkdownStatusItem(selector: vscode.DocumentSelector, commandManager: CommandManager): vscode.Disposable {77const statusItem = vscode.languages.createLanguageStatusItem('markdownStatus', selector);7879const enabledSettingId = 'validate.enabled';80const commandId = '_markdown.toggleValidation';8182const commandSub = commandManager.register({83id: commandId,84execute: (enabled: boolean) => {85vscode.workspace.getConfiguration('markdown').update(enabledSettingId, enabled);86}87});8889const update = () => {90const activeDoc = vscode.window.activeTextEditor?.document;91const markdownDoc = activeDoc && isMarkdownFile(activeDoc) ? activeDoc : undefined;9293const enabled = vscode.workspace.getConfiguration('markdown', markdownDoc).get(enabledSettingId);94if (enabled) {95statusItem.text = vscode.l10n.t('Markdown link validation enabled');96statusItem.command = {97command: commandId,98arguments: [false],99title: vscode.l10n.t('Disable'),100tooltip: vscode.l10n.t('Disable validation of Markdown links'),101};102} else {103statusItem.text = vscode.l10n.t('Markdown link validation disabled');104statusItem.command = {105command: commandId,106arguments: [true],107title: vscode.l10n.t('Enable'),108tooltip: vscode.l10n.t('Enable validation of Markdown links'),109};110}111};112update();113114return vscode.Disposable.from(115statusItem,116commandSub,117vscode.workspace.onDidChangeConfiguration(e => {118if (e.affectsConfiguration('markdown.' + enabledSettingId)) {119update();120}121}),122);123}124125export function registerDiagnosticSupport(126selector: vscode.DocumentSelector,127commandManager: CommandManager,128): vscode.Disposable {129return vscode.Disposable.from(130AddToIgnoreLinksQuickFixProvider.register(selector, commandManager),131registerMarkdownStatusItem(selector, commandManager),132);133}134135136