diff --git a/packages/markers/src/browser/problem/problem-tree-model.spec.ts b/packages/markers/src/browser/problem/problem-tree-model.spec.ts index 6271d1bc4e95c..4fe2097c62dda 100644 --- a/packages/markers/src/browser/problem/problem-tree-model.spec.ts +++ b/packages/markers/src/browser/problem/problem-tree-model.spec.ts @@ -125,6 +125,15 @@ describe('Problem Tree', () => { expect(problemTree['sortMarkers'](nodeB, nodeA)).equals(10); }); + it('should sort markers based on owner if their severities, line numbers and columns are equal', () => { + const markerA = createMockMarker({ start: { line: 1, character: 10 }, end: { line: 1, character: 10 }, }, DiagnosticSeverity.Error, 'A'); + const markerB = createMockMarker({ start: { line: 1, character: 10 }, end: { line: 1, character: 10 } }, DiagnosticSeverity.Error, 'B'); + const nodeA = createMockMarkerNode(markerA); + const nodeB = createMockMarkerNode(markerB); + expect(problemTree['sortMarkers'](nodeA, nodeB)).equals(-1); + expect(problemTree['sortMarkers'](nodeB, nodeA)).equals(1); + }); + it('should not sort if markers are equal', () => { const markerA = createMockMarker({ start: { line: 0, character: 10 }, end: { line: 0, character: 10 } }, DiagnosticSeverity.Error); const markerB = createMockMarker({ start: { line: 0, character: 10 }, end: { line: 0, character: 10 } }, DiagnosticSeverity.Error); @@ -158,19 +167,23 @@ function createMockMarkerNode(marker: Marker): MarkerNode { * Create a mock diagnostic marker. * @param range the diagnostic range. * @param severity the diagnostic severity. + * @param owner the owner of the diagnostic (optional) * * @returns a mock diagnostic marker. */ -function createMockMarker(range: Range, severity: DiagnosticSeverity): Readonly> { + function createMockMarker(range: Range, severity: DiagnosticSeverity, owner?: string): Readonly> { const data: Diagnostic = { range: range, severity: severity, - message: 'message' + message: 'message', }; + if (!owner) { + owner = 'owner'; + } return Object.freeze({ uri: name, kind: 'marker', - owner: 'owner', + owner: owner, data }); } diff --git a/packages/markers/src/browser/problem/problem-tree-model.ts b/packages/markers/src/browser/problem/problem-tree-model.ts index 55a7b1c38282b..24eb5d55bfd1d 100644 --- a/packages/markers/src/browser/problem/problem-tree-model.ts +++ b/packages/markers/src/browser/problem/problem-tree-model.ts @@ -65,6 +65,11 @@ export class ProblemTree extends MarkerTree { if (columnNumber !== 0) { return columnNumber; } + // Sort by owner in alphabetical order + const owner = ProblemUtils.ownerCompare(markerA, markerB); + if (owner !== 0) { + return owner; + } return 0; } diff --git a/packages/markers/src/browser/problem/problem-utils.ts b/packages/markers/src/browser/problem/problem-utils.ts index def8661895e1f..265bae8812eb5 100644 --- a/packages/markers/src/browser/problem/problem-utils.ts +++ b/packages/markers/src/browser/problem/problem-utils.ts @@ -45,4 +45,12 @@ export namespace ProblemUtils { */ export const columnNumberCompare = (a: Marker, b: Marker): number => a.data.range.start.character - b.data.range.start.character; + /** + * Comparator for marker owner (source). + * - The order is alphabetical + * @param a the first marker for comparison. + * @param b the second marker for comparison. + */ + export const ownerCompare = (a: Marker, b: Marker): number => a.owner.localeCompare(b.owner); + }