From 79ccfeaa1db4a3b56767ee7b6b5fc577a5733fef Mon Sep 17 00:00:00 2001 From: Heyward Fann Date: Tue, 18 Jun 2024 16:41:16 +0800 Subject: [PATCH] fix(diagnostic): stack hl groups (#5046) Closes https://github.com/fannheyward/coc-rust-analyzer/issues/1227 --- .../modules/diagnosticBuffer.test.ts | 6 +++-- src/diagnostic/buffer.ts | 6 +++-- src/diagnostic/util.ts | 27 ++++++++++++------- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/__tests__/modules/diagnosticBuffer.test.ts b/src/__tests__/modules/diagnosticBuffer.test.ts index c0735d9c414..b0218cb6e51 100644 --- a/src/__tests__/modules/diagnosticBuffer.test.ts +++ b/src/__tests__/modules/diagnosticBuffer.test.ts @@ -140,7 +140,7 @@ describe('diagnostic buffer', () => { buf.updateHighlights('', [diagnostic]) await nvim.resumeNotification() let res = await nvim.call('nvim_buf_get_extmarks', [buf.bufnr, ns, 0, -1, {}]) as [number, number, number][] - expect(res.length).toBe(1) + expect(res.length).toBe(2) }) it('should not refresh for empty diagnostics', async () => { @@ -370,11 +370,13 @@ describe('diagnostic buffer', () => { diagnostics[0].tags = [DiagnosticTag.Unnecessary] diagnostics[1].tags = [DiagnosticTag.Deprecated] let res = buf.getHighlightItems(diagnostics) - expect(res.length).toBe(5) + expect(res.length).toBe(7) expect(res.map(o => o.hlGroup)).toEqual([ 'CocUnusedHighlight', + 'CocWarningHighlight', 'CocErrorHighlight', 'CocDeprecatedHighlight', + 'CocWarningHighlight', 'CocHintHighlight', 'CocErrorHighlight' ]) diff --git a/src/diagnostic/buffer.ts b/src/diagnostic/buffer.ts index 15a55002a7e..e78ab0ddb9a 100644 --- a/src/diagnostic/buffer.ts +++ b/src/diagnostic/buffer.ts @@ -559,8 +559,10 @@ export class DiagnosticBuffer implements SyncItem { let res: HighlightItem[] = [] for (let i = 0; i < Math.min(this._config.highlightLimit, diagnostics.length); i++) { let diagnostic = diagnostics[i] - let hlGroup = getHighlightGroup(diagnostic) - this.doc.addHighlights(res, hlGroup, diagnostic.range) + let hlGroups = getHighlightGroup(diagnostic) + for (const hlGroup of hlGroups) { + this.doc.addHighlights(res, hlGroup, diagnostic.range) + } } // needed for iteration performance and since diagnostic highlight may cross lines. res.sort((a, b) => { diff --git a/src/diagnostic/util.ts b/src/diagnostic/util.ts index 5f819914e59..47b9e487805 100644 --- a/src/diagnostic/util.ts +++ b/src/diagnostic/util.ts @@ -158,24 +158,31 @@ export function sortDiagnostics(a: Diagnostic, b: Diagnostic): number { return a.source > b.source ? 1 : -1 } -export function getHighlightGroup(diagnostic: Diagnostic): DiagnosticHighlight { +export function getHighlightGroup(diagnostic: Diagnostic): DiagnosticHighlight[] { + let hlGroups: DiagnosticHighlight[] = [] let tags = diagnostic.tags || [] if (tags.includes(DiagnosticTag.Deprecated)) { - return DiagnosticHighlight.Deprecated + hlGroups.push(DiagnosticHighlight.Deprecated) } if (tags.includes(DiagnosticTag.Unnecessary)) { - return DiagnosticHighlight.Unused + hlGroups.push(DiagnosticHighlight.Unused) } switch (diagnostic.severity) { - case DiagnosticSeverity.Warning: - return DiagnosticHighlight.Warning - case DiagnosticSeverity.Information: - return DiagnosticHighlight.Information case DiagnosticSeverity.Hint: - return DiagnosticHighlight.Hint - default: - return DiagnosticHighlight.Error + hlGroups.push(DiagnosticHighlight.Hint) + break + case DiagnosticSeverity.Information: + hlGroups.push(DiagnosticHighlight.Information) + break + case DiagnosticSeverity.Warning: + hlGroups.push(DiagnosticHighlight.Warning) + break + case DiagnosticSeverity.Error: + hlGroups.push(DiagnosticHighlight.Error) + break } + + return hlGroups } export function adjustDiagnostics(diagnostics: ReadonlyArray, edit: TextEdit): ReadonlyArray {