Skip to content

Commit 3fee94d

Browse files
authored
(feat) support for diagnostic tags (#543)
1 parent 5f34419 commit 3fee94d

File tree

3 files changed

+64
-2
lines changed

3 files changed

+64
-2
lines changed

packages/language-server/src/plugins/typescript/features/DiagnosticsProvider.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import ts from 'typescript';
2-
import { Diagnostic, DiagnosticSeverity } from 'vscode-languageserver';
2+
import { Diagnostic, DiagnosticSeverity, DiagnosticTag } from 'vscode-languageserver';
33
import { Document, mapObjWithRangeToOriginal, getTextInRange } from '../../../lib/documents';
44
import { DiagnosticsProvider } from '../../interfaces';
55
import { LSAndTSDocResolver } from '../LSAndTSDocResolver';
@@ -35,19 +35,31 @@ export class DiagnosticsProviderImpl implements DiagnosticsProvider {
3535
const fragment = await tsDoc.getFragment();
3636

3737
return diagnostics
38-
.map((diagnostic) => ({
38+
.map<Diagnostic>((diagnostic) => ({
3939
range: convertRange(tsDoc, diagnostic),
4040
severity: mapSeverity(diagnostic.category),
4141
source: isTypescript ? 'ts' : 'js',
4242
message: ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n'),
4343
code: diagnostic.code,
44+
tags: this.getDiagnosticTag(diagnostic)
4445
}))
4546
.map((diagnostic) => mapObjWithRangeToOriginal(fragment, diagnostic))
4647
.filter(hasNoNegativeLines)
4748
.filter(isNoFalsePositive(document.getText(), tsDoc))
4849
.map(enhanceIfNecessary);
4950
}
5051

52+
private getDiagnosticTag(diagnostic: ts.Diagnostic) {
53+
const tags: DiagnosticTag[] = [];
54+
if (diagnostic.reportsUnnecessary) {
55+
tags.push(DiagnosticTag.Unnecessary);
56+
}
57+
if (diagnostic.reportsDeprecated) {
58+
tags.push(DiagnosticTag.Deprecated);
59+
}
60+
return tags;
61+
}
62+
5163
private getLSAndTSDoc(document: Document) {
5264
return this.lsAndTsDocResolver.getLSAndTSDoc(document);
5365
}

packages/language-server/test/plugins/typescript/features/DiagnosticsProvider.test.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ describe('DiagnosticsProvider', () => {
3838
},
3939
severity: 1,
4040
source: 'ts',
41+
tags: [],
4142
},
4243
]);
4344
});
@@ -62,6 +63,7 @@ describe('DiagnosticsProvider', () => {
6263
},
6364
severity: 1,
6465
source: 'js',
66+
tags: [],
6567
},
6668
]);
6769
});
@@ -109,4 +111,46 @@ describe('DiagnosticsProvider', () => {
109111
const diagnostics = await plugin.getDiagnostics(document);
110112
assert.deepStrictEqual(diagnostics, []);
111113
});
114+
115+
it('provide diagnostics tags', async () => {
116+
const { plugin, document } = setup('diagnostics-tag.svelte');
117+
const diagnostics = await plugin.getDiagnostics(document);
118+
119+
assert.deepStrictEqual(diagnostics, [
120+
{
121+
code: 6385,
122+
message: "'a' is deprecated",
123+
range: {
124+
end: {
125+
character: 5,
126+
line: 3,
127+
},
128+
start: {
129+
character: 4,
130+
line: 3,
131+
},
132+
},
133+
severity: 4,
134+
source: 'ts',
135+
tags: [2],
136+
},
137+
{
138+
code: 6133,
139+
message: "'c' is declared but its value is never read.",
140+
range: {
141+
end: {
142+
character: 9,
143+
line: 4,
144+
},
145+
start: {
146+
character: 8,
147+
line: 4,
148+
},
149+
},
150+
severity: 4,
151+
source: 'ts',
152+
tags: [1],
153+
},
154+
]);
155+
});
112156
});
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<script lang="ts">
2+
/**@deprecated*/
3+
let a;
4+
a;
5+
let c;
6+
</script>

0 commit comments

Comments
 (0)