提交 375ef990 编写于 作者: J Johannes Rieken
上级 64955f13
......@@ -31,10 +31,6 @@ function compareResourceMarkers(a: ResourceMarkers, b: ResourceMarkers): number
return res;
}
function compareMarkers(a: Marker, b: Marker): number {
return MarkerSeverity.compare(a.marker.severity, b.marker.severity)
|| Range.compareRangesUsingStarts(a.marker, b.marker);
}
export class ResourceMarkers {
......@@ -42,7 +38,8 @@ export class ResourceMarkers {
readonly name: string;
private markersMap = new ResourceMap<Marker[]>();
private _markersMap = new ResourceMap<Marker[]>();
private _cachedMarkers: Marker[] | undefined;
private _total: number = 0;
constructor(readonly id: string, readonly resource: URI) {
......@@ -51,32 +48,43 @@ export class ResourceMarkers {
}
get markers(): readonly Marker[] {
return flatten([...this.markersMap.values()]);
if (!this._cachedMarkers) {
this._cachedMarkers = mergeSort(flatten([...this._markersMap.values()]), ResourceMarkers._compareMarkers);
}
return this._cachedMarkers;
}
has(uri: URI) {
return this.markersMap.has(uri);
return this._markersMap.has(uri);
}
set(uri: URI, marker: Marker[]) {
this.delete(uri);
if (isNonEmptyArray(marker)) {
this.markersMap.set(uri, marker);
this._markersMap.set(uri, marker);
this._total += marker.length;
this._cachedMarkers = undefined;
}
}
delete(uri: URI) {
let array = this.markersMap.get(uri);
let array = this._markersMap.get(uri);
if (array) {
this._total -= array.length;
this.markersMap.delete(uri);
this._cachedMarkers = undefined;
this._markersMap.delete(uri);
}
}
get total() {
return this._total;
}
private static _compareMarkers(a: Marker, b: Marker): number {
return MarkerSeverity.compare(a.marker.severity, b.marker.severity)
|| extUri.compare(a.resource, b.resource)
|| Range.compareRangesUsingStarts(a.marker, b.marker);
}
}
export class Marker {
......@@ -169,7 +177,7 @@ export class MarkersModel {
change.updated.add(resourceMarkers);
}
const markersCountByKey = new Map<string, number>();
const markers = mergeSort(rawMarkers.map((rawMarker) => {
const markers = rawMarkers.map((rawMarker) => {
const key = IMarkerData.makeKey(rawMarker);
const index = markersCountByKey.get(key) || 0;
markersCountByKey.set(key, index + 1);
......@@ -182,7 +190,7 @@ export class MarkersModel {
}
return new Marker(markerId, rawMarker, relatedInformation);
}), compareMarkers);
});
this._total -= resourceMarkers.total;
resourceMarkers.set(resource, markers);
......
......@@ -163,6 +163,29 @@ suite('MarkersModel Test', () => {
assert.equal(model.total, 2);
});
test('Problems are no sorted correctly #99135', function () {
const model = new TestMarkersModel([]);
assert.equal(model.total, 0);
const document = URI.parse('foo://test/path/file');
const frag1 = URI.parse('foo://test/path/file#1');
const frag2 = URI.parse('foo://test/path/file#2');
model.setResourceMarkers([[frag1, [
{ ...aMarker(), resource: frag1 },
{ ...aMarker(undefined, MarkerSeverity.Warning), resource: frag1 },
]]]);
model.setResourceMarkers([[frag2, [
{ ...aMarker(), resource: frag2 }
]]]);
assert.equal(model.total, 3);
const markers = model.getResourceMarkers(document)?.markers;
assert.deepEqual(markers?.map(m => m.marker.severity), [MarkerSeverity.Error, MarkerSeverity.Error, MarkerSeverity.Warning]);
assert.deepEqual(markers?.map(m => m.marker.resource.toString()), [frag1.toString(), frag2.toString(), frag1.toString()]);
});
function compareResource(a: ResourceMarkers, b: string): boolean {
return a.resource.toString() === URI.file(b).toString();
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册