Path: blob/main/src/vs/platform/markers/common/markers.ts
3296 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 { Event } from '../../../base/common/event.js';6import { IDisposable } from '../../../base/common/lifecycle.js';7import Severity from '../../../base/common/severity.js';8import { URI } from '../../../base/common/uri.js';9import { localize } from '../../../nls.js';10import { createDecorator } from '../../instantiation/common/instantiation.js';1112export interface IMarkerReadOptions {13owner?: string;14resource?: URI;15severities?: number;16take?: number;17ignoreResourceFilters?: boolean;18}1920export interface IMarkerService {21readonly _serviceBrand: undefined;2223getStatistics(): MarkerStatistics;2425changeOne(owner: string, resource: URI, markers: IMarkerData[]): void;2627changeAll(owner: string, data: IResourceMarker[]): void;2829remove(owner: string, resources: URI[]): void;3031read(filter?: IMarkerReadOptions): IMarker[];3233installResourceFilter(resource: URI, reason: string): IDisposable;3435readonly onMarkerChanged: Event<readonly URI[]>;36}3738/**39*40*/41export interface IRelatedInformation {42resource: URI;43message: string;44startLineNumber: number;45startColumn: number;46endLineNumber: number;47endColumn: number;48}4950export const enum MarkerTag {51Unnecessary = 1,52Deprecated = 253}5455export enum MarkerSeverity {56Hint = 1,57Info = 2,58Warning = 4,59Error = 8,60}6162export namespace MarkerSeverity {6364export function compare(a: MarkerSeverity, b: MarkerSeverity): number {65return b - a;66}6768const _displayStrings: { [value: number]: string } = Object.create(null);69_displayStrings[MarkerSeverity.Error] = localize('sev.error', "Error");70_displayStrings[MarkerSeverity.Warning] = localize('sev.warning', "Warning");71_displayStrings[MarkerSeverity.Info] = localize('sev.info', "Info");7273export function toString(a: MarkerSeverity): string {74return _displayStrings[a] || '';75}7677const _displayStringsPlural: { [value: number]: string } = Object.create(null);78_displayStringsPlural[MarkerSeverity.Error] = localize('sev.errors', "Errors");79_displayStringsPlural[MarkerSeverity.Warning] = localize('sev.warnings', "Warnings");80_displayStringsPlural[MarkerSeverity.Info] = localize('sev.infos', "Infos");8182export function toStringPlural(a: MarkerSeverity): string {83return _displayStringsPlural[a] || '';84}8586export function fromSeverity(severity: Severity): MarkerSeverity {87switch (severity) {88case Severity.Error: return MarkerSeverity.Error;89case Severity.Warning: return MarkerSeverity.Warning;90case Severity.Info: return MarkerSeverity.Info;91case Severity.Ignore: return MarkerSeverity.Hint;92}93}9495export function toSeverity(severity: MarkerSeverity): Severity {96switch (severity) {97case MarkerSeverity.Error: return Severity.Error;98case MarkerSeverity.Warning: return Severity.Warning;99case MarkerSeverity.Info: return Severity.Info;100case MarkerSeverity.Hint: return Severity.Ignore;101}102}103}104105/**106* A structure defining a problem/warning/etc.107*/108export interface IMarkerData {109code?: string | { value: string; target: URI };110severity: MarkerSeverity;111message: string;112source?: string;113startLineNumber: number;114startColumn: number;115endLineNumber: number;116endColumn: number;117modelVersionId?: number;118relatedInformation?: IRelatedInformation[];119tags?: MarkerTag[];120origin?: string | undefined;121}122123export interface IResourceMarker {124resource: URI;125marker: IMarkerData;126}127128export interface IMarker {129owner: string;130resource: URI;131severity: MarkerSeverity;132code?: string | { value: string; target: URI };133message: string;134source?: string;135startLineNumber: number;136startColumn: number;137endLineNumber: number;138endColumn: number;139modelVersionId?: number;140relatedInformation?: IRelatedInformation[];141tags?: MarkerTag[];142origin?: string | undefined;143}144145export interface MarkerStatistics {146errors: number;147warnings: number;148infos: number;149unknowns: number;150}151152export namespace IMarkerData {153const emptyString = '';154export function makeKey(markerData: IMarkerData): string {155return makeKeyOptionalMessage(markerData, true);156}157158export function makeKeyOptionalMessage(markerData: IMarkerData, useMessage: boolean): string {159const result: string[] = [emptyString];160if (markerData.source) {161result.push(markerData.source.replace('¦', '\\¦'));162} else {163result.push(emptyString);164}165if (markerData.code) {166if (typeof markerData.code === 'string') {167result.push(markerData.code.replace('¦', '\\¦'));168} else {169result.push(markerData.code.value.replace('¦', '\\¦'));170}171} else {172result.push(emptyString);173}174if (markerData.severity !== undefined && markerData.severity !== null) {175result.push(MarkerSeverity.toString(markerData.severity));176} else {177result.push(emptyString);178}179180// Modifed to not include the message as part of the marker key to work around181// https://github.com/microsoft/vscode/issues/77475182if (markerData.message && useMessage) {183result.push(markerData.message.replace('¦', '\\¦'));184} else {185result.push(emptyString);186}187if (markerData.startLineNumber !== undefined && markerData.startLineNumber !== null) {188result.push(markerData.startLineNumber.toString());189} else {190result.push(emptyString);191}192if (markerData.startColumn !== undefined && markerData.startColumn !== null) {193result.push(markerData.startColumn.toString());194} else {195result.push(emptyString);196}197if (markerData.endLineNumber !== undefined && markerData.endLineNumber !== null) {198result.push(markerData.endLineNumber.toString());199} else {200result.push(emptyString);201}202if (markerData.endColumn !== undefined && markerData.endColumn !== null) {203result.push(markerData.endColumn.toString());204} else {205result.push(emptyString);206}207result.push(emptyString);208return result.join('¦');209}210}211212export const IMarkerService = createDecorator<IMarkerService>('markerService');213214215