From 8f726b7db65d3d9527cdb2fb682c195ad1446dbf Mon Sep 17 00:00:00 2001 From: Ryan Cumming Date: Sun, 30 Jun 2019 10:49:07 +1000 Subject: Include primary span label in VS Code diagnostics In most cases the primary label span repeats information found elsewhere in the diagnostic. For example, with E0061: ``` { "message": "this function takes 2 parameters but 3 parameters were supplied", "spans": [{"label": "expected 2 parameters"}] } ``` However, with some mismatched type errors (E0308) the expected type only appears in the primary span's label, e.g.: ``` { "message": "mismatched types", "spans": [{"label": "expected usize, found u32"}] } ``` I initially added the primary span label to the message unconditionally. However, for most error types the child diagnostics repeat the primary span label with more detail. `rustc` also renders the duplicate text but because the span label and child diagnostics appear in visually distinct places it's not as confusing. This takes a heuristic approach where it will only add the primary span label if there are no child message lines. --- .../code/src/test/utils/diagnotics/rust.test.ts | 29 +++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'editors/code/src/test/utils/diagnotics') diff --git a/editors/code/src/test/utils/diagnotics/rust.test.ts b/editors/code/src/test/utils/diagnotics/rust.test.ts index b555a4819..7fb003fe2 100644 --- a/editors/code/src/test/utils/diagnotics/rust.test.ts +++ b/editors/code/src/test/utils/diagnotics/rust.test.ts @@ -108,7 +108,10 @@ describe('mapRustDiagnosticToVsCode', () => { ); assert.strictEqual( diagnostic.message, - 'this function takes 2 parameters but 3 parameters were supplied' + [ + 'this function takes 2 parameters but 3 parameters were supplied', + 'expected 2 parameters' + ].join('\n') ); assert.strictEqual(diagnostic.code, 'E0061'); assert.strictEqual(diagnostic.source, 'rustc'); @@ -170,4 +173,28 @@ describe('mapRustDiagnosticToVsCode', () => { SuggestionApplicability.Unspecified ); }); + + it('should map a mismatched type error', () => { + const { diagnostic, suggestedFixes } = mapFixtureToVsCode( + 'error/E0308' + ); + + assert.strictEqual( + diagnostic.severity, + vscode.DiagnosticSeverity.Error + ); + assert.strictEqual( + diagnostic.message, + ['mismatched types', 'expected usize, found u32'].join('\n') + ); + assert.strictEqual(diagnostic.code, 'E0308'); + assert.strictEqual(diagnostic.source, 'rustc'); + assert.strictEqual(diagnostic.tags, undefined); + + // No related information + assert.deepStrictEqual(diagnostic.relatedInformation, []); + + // There are no suggested fixes + assert.strictEqual(suggestedFixes.length, 0); + }); }); -- cgit v1.2.3