diff --git a/editors/code/src/test/rust_diagnostics.test.ts b/editors/code/src/test/rust_diagnostics.test.ts index 5eb064b979..f27c58fe29 100644 --- a/editors/code/src/test/rust_diagnostics.test.ts +++ b/editors/code/src/test/rust_diagnostics.test.ts @@ -37,6 +37,7 @@ describe('mapRustDiagnosticToVsCode', () => { diagnostic.severity, vscode.DiagnosticSeverity.Error ); + assert.strictEqual(diagnostic.source, 'rustc'); assert.strictEqual( diagnostic.message, [ @@ -72,6 +73,7 @@ describe('mapRustDiagnosticToVsCode', () => { ].join('\n') ); assert.strictEqual(diagnostic.code, 'unused_variables'); + assert.strictEqual(diagnostic.source, 'rustc'); assert.deepStrictEqual(diagnostic.tags, [ vscode.DiagnosticTag.Unnecessary ]); @@ -101,6 +103,7 @@ describe('mapRustDiagnosticToVsCode', () => { 'this function takes 2 parameters but 3 parameters were supplied' ); assert.strictEqual(diagnostic.code, 'E0061'); + assert.strictEqual(diagnostic.source, 'rustc'); assert.strictEqual(diagnostic.tags, undefined); // One related information for the original definition @@ -125,6 +128,7 @@ describe('mapRustDiagnosticToVsCode', () => { diagnostic.severity, vscode.DiagnosticSeverity.Warning ); + assert.strictEqual(diagnostic.source, 'clippy'); assert.strictEqual( diagnostic.message, [ @@ -133,10 +137,7 @@ describe('mapRustDiagnosticToVsCode', () => { 'for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivially_copy_pass_by_ref' ].join('\n') ); - assert.strictEqual( - diagnostic.code, - 'clippy::trivially_copy_pass_by_ref' - ); + assert.strictEqual(diagnostic.code, 'trivially_copy_pass_by_ref'); assert.strictEqual(diagnostic.tags, undefined); // One related information for the lint definition diff --git a/editors/code/src/test/vscode_diagnostics.test.ts b/editors/code/src/test/vscode_diagnostics.test.ts index ca43456269..9c5d812fa3 100644 --- a/editors/code/src/test/vscode_diagnostics.test.ts +++ b/editors/code/src/test/vscode_diagnostics.test.ts @@ -35,6 +35,24 @@ describe('areDiagnosticsEqual', () => { assert(areDiagnosticsEqual(diagnostic1, diagnostic2)); }); + it('should treat diagnostics with different sources as inequal', () => { + const diagnostic1 = new vscode.Diagnostic( + range1, + 'Hello, world!', + vscode.DiagnosticSeverity.Error + ); + diagnostic1.source = 'rustc'; + + const diagnostic2 = new vscode.Diagnostic( + range1, + 'Hello, world!', + vscode.DiagnosticSeverity.Error + ); + diagnostic2.source = 'clippy'; + + assert(!areDiagnosticsEqual(diagnostic1, diagnostic2)); + }); + it('should treat diagnostics with different ranges as inequal', () => { const diagnostic1 = new vscode.Diagnostic( range1, diff --git a/editors/code/src/utils/rust_diagnostics.ts b/editors/code/src/utils/rust_diagnostics.ts index ed049c95ef..3c524cb378 100644 --- a/editors/code/src/utils/rust_diagnostics.ts +++ b/editors/code/src/utils/rust_diagnostics.ts @@ -187,8 +187,18 @@ export function mapRustDiagnosticToVsCode( const vd = new vscode.Diagnostic(location.range, rd.message, severity); - vd.source = 'rustc'; - vd.code = rd.code ? rd.code.code : undefined; + let source = 'rustc'; + let code = rd.code && rd.code.code; + if (code) { + // See if this is an RFC #2103 scoped lint (e.g. from Clippy) + const scopedCode = code.split('::'); + if (scopedCode.length === 2) { + [source, code] = scopedCode; + } + } + + vd.source = source; + vd.code = code; vd.relatedInformation = []; for (const secondarySpan of secondarySpans) {