Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/platform/languages/common/languageDiagnosticsService.ts
13401 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import type * as vscode from 'vscode';
7
import { createServiceIdentifier } from '../../../util/common/services';
8
import { isEqual } from '../../../util/vs/base/common/resources';
9
import { DiagnosticSeverity } from '../../../vscodeTypes';
10
11
export const ILanguageDiagnosticsService = createServiceIdentifier<ILanguageDiagnosticsService>('ILanguageDiagnosticService');
12
13
export interface ILanguageDiagnosticsService {
14
_serviceBrand: undefined;
15
onDidChangeDiagnostics: vscode.Event<vscode.DiagnosticChangeEvent>;
16
getDiagnostics(resource: vscode.Uri): vscode.Diagnostic[];
17
getAllDiagnostics(): [vscode.Uri, vscode.Diagnostic[]][];
18
waitForNewDiagnostics(resource: vscode.Uri, token: vscode.CancellationToken, timeout?: number): Promise<vscode.Diagnostic[]>;
19
}
20
21
export abstract class AbstractLanguageDiagnosticsService implements ILanguageDiagnosticsService {
22
23
declare readonly _serviceBrand: undefined;
24
25
abstract onDidChangeDiagnostics: vscode.Event<vscode.DiagnosticChangeEvent>;
26
27
abstract getDiagnostics(resource: vscode.Uri): vscode.Diagnostic[];
28
abstract getAllDiagnostics(): [vscode.Uri, vscode.Diagnostic[]][];
29
30
waitForNewDiagnostics(resource: vscode.Uri, token: vscode.CancellationToken, timeout: number = 5000): Promise<vscode.Diagnostic[]> {
31
let onCancellationRequest: vscode.Disposable;
32
let diagnosticsChangeListener: vscode.Disposable;
33
let timer: any;
34
return new Promise<vscode.Diagnostic[]>((resolve) => {
35
onCancellationRequest = token.onCancellationRequested(() => resolve([]));
36
timer = setTimeout(() => resolve(this.getDiagnostics(resource)), timeout);
37
diagnosticsChangeListener = this.onDidChangeDiagnostics(e => {
38
for (const uri of e.uris) {
39
if (isEqual(uri, resource)) {
40
resolve(this.getDiagnostics(resource));
41
break;
42
}
43
}
44
});
45
}).finally(() => {
46
onCancellationRequest.dispose();
47
diagnosticsChangeListener.dispose();
48
clearTimeout(timer);
49
});
50
}
51
}
52
53
/**
54
* Smallest range covering all of the diagnostics
55
* @param diagnostics diagnostics to cover
56
* @returns minimal covering range
57
*/
58
export function rangeSpanningDiagnostics(diagnostics: vscode.Diagnostic[]): vscode.Range {
59
return diagnostics.map(d => d.range).reduce((a, b) => a.union(b));
60
}
61
62
export function isError(diagnostics: vscode.Diagnostic) {
63
return diagnostics.severity === DiagnosticSeverity.Error;
64
}
65
66
export function getDiagnosticsAtSelection(diagnostics: vscode.Diagnostic[], selection: vscode.Range, severities: DiagnosticSeverity[] = [DiagnosticSeverity.Error, DiagnosticSeverity.Warning]): vscode.Diagnostic | undefined {
67
return diagnostics.find(d => d.range.contains(selection) && severities.includes(d.severity));
68
}
69
70