Path: blob/main/extensions/copilot/src/platform/languages/common/languageDiagnosticsService.ts
13401 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 type * as vscode from 'vscode';6import { createServiceIdentifier } from '../../../util/common/services';7import { isEqual } from '../../../util/vs/base/common/resources';8import { DiagnosticSeverity } from '../../../vscodeTypes';910export const ILanguageDiagnosticsService = createServiceIdentifier<ILanguageDiagnosticsService>('ILanguageDiagnosticService');1112export interface ILanguageDiagnosticsService {13_serviceBrand: undefined;14onDidChangeDiagnostics: vscode.Event<vscode.DiagnosticChangeEvent>;15getDiagnostics(resource: vscode.Uri): vscode.Diagnostic[];16getAllDiagnostics(): [vscode.Uri, vscode.Diagnostic[]][];17waitForNewDiagnostics(resource: vscode.Uri, token: vscode.CancellationToken, timeout?: number): Promise<vscode.Diagnostic[]>;18}1920export abstract class AbstractLanguageDiagnosticsService implements ILanguageDiagnosticsService {2122declare readonly _serviceBrand: undefined;2324abstract onDidChangeDiagnostics: vscode.Event<vscode.DiagnosticChangeEvent>;2526abstract getDiagnostics(resource: vscode.Uri): vscode.Diagnostic[];27abstract getAllDiagnostics(): [vscode.Uri, vscode.Diagnostic[]][];2829waitForNewDiagnostics(resource: vscode.Uri, token: vscode.CancellationToken, timeout: number = 5000): Promise<vscode.Diagnostic[]> {30let onCancellationRequest: vscode.Disposable;31let diagnosticsChangeListener: vscode.Disposable;32let timer: any;33return new Promise<vscode.Diagnostic[]>((resolve) => {34onCancellationRequest = token.onCancellationRequested(() => resolve([]));35timer = setTimeout(() => resolve(this.getDiagnostics(resource)), timeout);36diagnosticsChangeListener = this.onDidChangeDiagnostics(e => {37for (const uri of e.uris) {38if (isEqual(uri, resource)) {39resolve(this.getDiagnostics(resource));40break;41}42}43});44}).finally(() => {45onCancellationRequest.dispose();46diagnosticsChangeListener.dispose();47clearTimeout(timer);48});49}50}5152/**53* Smallest range covering all of the diagnostics54* @param diagnostics diagnostics to cover55* @returns minimal covering range56*/57export function rangeSpanningDiagnostics(diagnostics: vscode.Diagnostic[]): vscode.Range {58return diagnostics.map(d => d.range).reduce((a, b) => a.union(b));59}6061export function isError(diagnostics: vscode.Diagnostic) {62return diagnostics.severity === DiagnosticSeverity.Error;63}6465export function getDiagnosticsAtSelection(diagnostics: vscode.Diagnostic[], selection: vscode.Range, severities: DiagnosticSeverity[] = [DiagnosticSeverity.Error, DiagnosticSeverity.Warning]): vscode.Diagnostic | undefined {66return diagnostics.find(d => d.range.contains(selection) && severities.includes(d.severity));67}686970