Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/platform/markers/common/markers.ts
3296 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 { Event } from '../../../base/common/event.js';
7
import { IDisposable } from '../../../base/common/lifecycle.js';
8
import Severity from '../../../base/common/severity.js';
9
import { URI } from '../../../base/common/uri.js';
10
import { localize } from '../../../nls.js';
11
import { createDecorator } from '../../instantiation/common/instantiation.js';
12
13
export interface IMarkerReadOptions {
14
owner?: string;
15
resource?: URI;
16
severities?: number;
17
take?: number;
18
ignoreResourceFilters?: boolean;
19
}
20
21
export interface IMarkerService {
22
readonly _serviceBrand: undefined;
23
24
getStatistics(): MarkerStatistics;
25
26
changeOne(owner: string, resource: URI, markers: IMarkerData[]): void;
27
28
changeAll(owner: string, data: IResourceMarker[]): void;
29
30
remove(owner: string, resources: URI[]): void;
31
32
read(filter?: IMarkerReadOptions): IMarker[];
33
34
installResourceFilter(resource: URI, reason: string): IDisposable;
35
36
readonly onMarkerChanged: Event<readonly URI[]>;
37
}
38
39
/**
40
*
41
*/
42
export interface IRelatedInformation {
43
resource: URI;
44
message: string;
45
startLineNumber: number;
46
startColumn: number;
47
endLineNumber: number;
48
endColumn: number;
49
}
50
51
export const enum MarkerTag {
52
Unnecessary = 1,
53
Deprecated = 2
54
}
55
56
export enum MarkerSeverity {
57
Hint = 1,
58
Info = 2,
59
Warning = 4,
60
Error = 8,
61
}
62
63
export namespace MarkerSeverity {
64
65
export function compare(a: MarkerSeverity, b: MarkerSeverity): number {
66
return b - a;
67
}
68
69
const _displayStrings: { [value: number]: string } = Object.create(null);
70
_displayStrings[MarkerSeverity.Error] = localize('sev.error', "Error");
71
_displayStrings[MarkerSeverity.Warning] = localize('sev.warning', "Warning");
72
_displayStrings[MarkerSeverity.Info] = localize('sev.info', "Info");
73
74
export function toString(a: MarkerSeverity): string {
75
return _displayStrings[a] || '';
76
}
77
78
const _displayStringsPlural: { [value: number]: string } = Object.create(null);
79
_displayStringsPlural[MarkerSeverity.Error] = localize('sev.errors', "Errors");
80
_displayStringsPlural[MarkerSeverity.Warning] = localize('sev.warnings', "Warnings");
81
_displayStringsPlural[MarkerSeverity.Info] = localize('sev.infos', "Infos");
82
83
export function toStringPlural(a: MarkerSeverity): string {
84
return _displayStringsPlural[a] || '';
85
}
86
87
export function fromSeverity(severity: Severity): MarkerSeverity {
88
switch (severity) {
89
case Severity.Error: return MarkerSeverity.Error;
90
case Severity.Warning: return MarkerSeverity.Warning;
91
case Severity.Info: return MarkerSeverity.Info;
92
case Severity.Ignore: return MarkerSeverity.Hint;
93
}
94
}
95
96
export function toSeverity(severity: MarkerSeverity): Severity {
97
switch (severity) {
98
case MarkerSeverity.Error: return Severity.Error;
99
case MarkerSeverity.Warning: return Severity.Warning;
100
case MarkerSeverity.Info: return Severity.Info;
101
case MarkerSeverity.Hint: return Severity.Ignore;
102
}
103
}
104
}
105
106
/**
107
* A structure defining a problem/warning/etc.
108
*/
109
export interface IMarkerData {
110
code?: string | { value: string; target: URI };
111
severity: MarkerSeverity;
112
message: string;
113
source?: string;
114
startLineNumber: number;
115
startColumn: number;
116
endLineNumber: number;
117
endColumn: number;
118
modelVersionId?: number;
119
relatedInformation?: IRelatedInformation[];
120
tags?: MarkerTag[];
121
origin?: string | undefined;
122
}
123
124
export interface IResourceMarker {
125
resource: URI;
126
marker: IMarkerData;
127
}
128
129
export interface IMarker {
130
owner: string;
131
resource: URI;
132
severity: MarkerSeverity;
133
code?: string | { value: string; target: URI };
134
message: string;
135
source?: string;
136
startLineNumber: number;
137
startColumn: number;
138
endLineNumber: number;
139
endColumn: number;
140
modelVersionId?: number;
141
relatedInformation?: IRelatedInformation[];
142
tags?: MarkerTag[];
143
origin?: string | undefined;
144
}
145
146
export interface MarkerStatistics {
147
errors: number;
148
warnings: number;
149
infos: number;
150
unknowns: number;
151
}
152
153
export namespace IMarkerData {
154
const emptyString = '';
155
export function makeKey(markerData: IMarkerData): string {
156
return makeKeyOptionalMessage(markerData, true);
157
}
158
159
export function makeKeyOptionalMessage(markerData: IMarkerData, useMessage: boolean): string {
160
const result: string[] = [emptyString];
161
if (markerData.source) {
162
result.push(markerData.source.replace('¦', '\\¦'));
163
} else {
164
result.push(emptyString);
165
}
166
if (markerData.code) {
167
if (typeof markerData.code === 'string') {
168
result.push(markerData.code.replace('¦', '\\¦'));
169
} else {
170
result.push(markerData.code.value.replace('¦', '\\¦'));
171
}
172
} else {
173
result.push(emptyString);
174
}
175
if (markerData.severity !== undefined && markerData.severity !== null) {
176
result.push(MarkerSeverity.toString(markerData.severity));
177
} else {
178
result.push(emptyString);
179
}
180
181
// Modifed to not include the message as part of the marker key to work around
182
// https://github.com/microsoft/vscode/issues/77475
183
if (markerData.message && useMessage) {
184
result.push(markerData.message.replace('¦', '\\¦'));
185
} else {
186
result.push(emptyString);
187
}
188
if (markerData.startLineNumber !== undefined && markerData.startLineNumber !== null) {
189
result.push(markerData.startLineNumber.toString());
190
} else {
191
result.push(emptyString);
192
}
193
if (markerData.startColumn !== undefined && markerData.startColumn !== null) {
194
result.push(markerData.startColumn.toString());
195
} else {
196
result.push(emptyString);
197
}
198
if (markerData.endLineNumber !== undefined && markerData.endLineNumber !== null) {
199
result.push(markerData.endLineNumber.toString());
200
} else {
201
result.push(emptyString);
202
}
203
if (markerData.endColumn !== undefined && markerData.endColumn !== null) {
204
result.push(markerData.endColumn.toString());
205
} else {
206
result.push(emptyString);
207
}
208
result.push(emptyString);
209
return result.join('¦');
210
}
211
}
212
213
export const IMarkerService = createDecorator<IMarkerService>('markerService');
214
215