Skip to content

Commit d07b8b4

Browse files
committed
Fixed diagnostics and tests
1 parent 0dc4068 commit d07b8b4

File tree

6 files changed

+95
-22
lines changed

6 files changed

+95
-22
lines changed

client/src/test/diagnostics.test.ts

Lines changed: 77 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ import * as assert from 'assert';
88
import { getDocUri, activate, runOnActivate } from './helper';
99
import { toRange } from './util';
1010

11+
enum DiagnosticTag {
12+
Unnecessary = 1,
13+
Deprecated = 2
14+
}
15+
1116
suite('Should get module diagnostics', () => {
1217
test('diagnostics.module.missingNameAttributeError', async () => {
1318
await testDiagnostics(getDocUri('DiagnosticsMissingAttributeModule.bas'), [
@@ -41,15 +46,15 @@ suite('Should get module diagnostics', () => {
4146
source: 'ex'
4247
},
4348
{
44-
message: 'Unknown attribute \'VB_Creatable\' will be ignored.',
49+
message: 'Unknown attribute \'VB_Creatable\'.',
4550
range: toRange(3, 0, 3, 30),
46-
severity: vscode.DiagnosticSeverity.Warning,
51+
severity: vscode.DiagnosticSeverity.Error,
4752
source: 'ex'
4853
},
4954
{
50-
message: 'Unknown attribute \'VB_Foo\' will be ignored.',
55+
message: 'Unknown attribute \'VB_Foo\'.',
5156
range: toRange(4, 0, 4, 24),
52-
severity: vscode.DiagnosticSeverity.Warning,
57+
severity: vscode.DiagnosticSeverity.Error,
5358
source: 'ex'
5459
},
5560
{
@@ -70,6 +75,27 @@ suite('Should get module diagnostics', () => {
7075
severity: vscode.DiagnosticSeverity.Error,
7176
source: 'ex'
7277
},
78+
{
79+
message: 'Enum1 is declared but its value is never read.',
80+
range: toRange(29, 4, 29, 9),
81+
severity: vscode.DiagnosticSeverity.Hint,
82+
tags: [DiagnosticTag.Unnecessary],
83+
source: 'ex'
84+
},
85+
{
86+
message: 'Enum2 is declared but its value is never read.',
87+
range: toRange(30, 4, 30, 9),
88+
severity: vscode.DiagnosticSeverity.Hint,
89+
tags: [DiagnosticTag.Unnecessary],
90+
source: 'ex'
91+
},
92+
{
93+
message: 'Enum3 is declared but its value is never read.',
94+
range: toRange(31, 4, 31, 9),
95+
severity: vscode.DiagnosticSeverity.Hint,
96+
tags: [DiagnosticTag.Unnecessary],
97+
source: 'ex'
98+
},
7399
{
74100
message: 'Invalid syntax: InvalidSubCall(arg)',
75101
range: toRange(43, 4, 43, 23),
@@ -119,15 +145,22 @@ suite('Should get class diagnostics', () => {
119145
source: 'ex'
120146
},
121147
{
122-
message: 'Unknown attribute \'VB_Exxposed\' will be ignored.',
148+
message: 'Unknown attribute \'VB_Exxposed\'.',
123149
range: toRange(12, 0, 12, 29),
124-
severity: vscode.DiagnosticSeverity.Warning,
150+
severity: vscode.DiagnosticSeverity.Error,
125151
source: 'ex'
126152
},
127153
{
128-
message: 'Unknown attribute \'VB_Exxposed\' will be ignored.',
154+
message: 'Unknown attribute \'VB_Exxposed\'.',
129155
range: toRange(13, 0, 13, 29),
130-
severity: vscode.DiagnosticSeverity.Warning,
156+
severity: vscode.DiagnosticSeverity.Error,
157+
source: 'ex'
158+
},
159+
{
160+
message: 'SmkfeiondFoo is declared but its value is never read.',
161+
range: toRange(17, 11, 17, 23),
162+
severity: vscode.DiagnosticSeverity.Hint,
163+
tags: [DiagnosticTag.Unnecessary],
131164
source: 'ex'
132165
},
133166
{
@@ -142,11 +175,46 @@ suite('Should get class diagnostics', () => {
142175
severity: vscode.DiagnosticSeverity.Error,
143176
source: 'ex'
144177
},
178+
{
179+
message: 'GkiofseiFoo is declared but its value is never read.',
180+
range: toRange(25, 4, 25, 15),
181+
severity: vscode.DiagnosticSeverity.Hint,
182+
tags: [DiagnosticTag.Unnecessary],
183+
source: 'ex'
184+
},
145185
{
146186
message: 'Enum declarations cannot appear below a Sub, Function, or Property declaration.',
147187
range: toRange(37, 7, 41, 8),
148188
severity: vscode.DiagnosticSeverity.Error,
149189
source: 'ex'
190+
},
191+
{
192+
message: 'PewmfoiawFoo is declared but its value is never read.',
193+
range: toRange(37, 12, 37, 24),
194+
severity: vscode.DiagnosticSeverity.Hint,
195+
tags: [DiagnosticTag.Unnecessary],
196+
source: 'ex'
197+
},
198+
{
199+
message: 'Enum1 is declared but its value is never read.',
200+
range: toRange(38, 4, 38, 9),
201+
severity: vscode.DiagnosticSeverity.Hint,
202+
tags: [DiagnosticTag.Unnecessary],
203+
source: 'ex'
204+
},
205+
{
206+
message: 'Enum2 is declared but its value is never read.',
207+
range: toRange(39, 4, 39, 9),
208+
severity: vscode.DiagnosticSeverity.Hint,
209+
tags: [DiagnosticTag.Unnecessary],
210+
source: 'ex'
211+
},
212+
{
213+
message: 'Enum3 is declared but its value is never read.',
214+
range: toRange(40, 4, 40, 9),
215+
severity: vscode.DiagnosticSeverity.Hint,
216+
tags: [DiagnosticTag.Unnecessary],
217+
source: 'ex'
150218
}
151219
]);
152220
});
@@ -167,5 +235,6 @@ async function testDiagnostics(docUri: vscode.Uri, expectedDiagnostics: vscode.D
167235
assert.equal(actualDiagnostic.message, expectedDiagnostic.message, `Message: expected '${expectedDiagnostic.message}' got '${actualDiagnostic.message}'.`);
168236
assert.deepEqual(actualDiagnostic.range, expectedDiagnostic.range, `Range: expected '${JSON.stringify(expectedDiagnostic.range)}' got '${JSON.stringify(actualDiagnostic.range)}'.`);
169237
assert.equal(actualDiagnostic.severity, expectedDiagnostic.severity, `Severity: expected '${expectedDiagnostic.severity}' got '${actualDiagnostic.severity}'.`);
238+
assert.deepEqual(actualDiagnostic.tags, expectedDiagnostic.tags, `Tags: expected '${JSON.stringify(expectedDiagnostic.tags)}' got '${JSON.stringify(actualDiagnostic.tags)}'.`);
170239
});
171240
}

client/src/test/helper.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export let doc: vscode.TextDocument;
1010
export let editor: vscode.TextEditor;
1111
export let documentEol: string;
1212
export let platformEol: string;
13-
const TIMEOUTMS = 5000;
13+
const TIMEOUTMS = 10000;
1414

1515
/**
1616
* Activates the vscode.lsp-sample extension
@@ -35,10 +35,10 @@ async function sleep(ms: number) {
3535
return new Promise(resolve => setTimeout(resolve, ms));
3636
}
3737

38-
export async function runOnActivate<T>(action: () => T|Thenable<T>, test: (result: T) => boolean): Promise<T> {
38+
export async function runOnActivate<T>(action: () => T | Thenable<T>, test: (result: T) => boolean): Promise<T> {
3939
const timeout = getTimeout();
4040
while (Date.now() < timeout) {
41-
const result = await action();
41+
const result = await action();
4242
if (test(result)) {
4343
return result;
4444
}

server/src/capabilities/capabilities.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ export class SymbolInformationCapability extends BaseCapability {
117117

118118
export class IdentifierCapability extends BaseCapability {
119119
private get unformattedName(): string {
120-
return this.nameContext?.getText() ?? this.defaultName ?? "Unknown Element";
120+
const nameCtx = this.getNameContext ? this.getNameContext() : this.nameContext;
121+
return nameCtx?.getText() ?? this.defaultName ?? "Unknown Element";
121122
}
122123

123124
get name(): string {
@@ -349,7 +350,7 @@ export class ScopeItemCapability {
349350
const identifier = this.element?.identifierCapability;
350351
const diagnostics = this.element?.diagnosticCapability?.diagnostics;
351352
if (identifier && diagnostics) {
352-
diagnostics.push(new UnusedDiagnostic(identifier.range));
353+
diagnostics.push(new UnusedDiagnostic(identifier.range, identifier.name));
353354
}
354355
}
355356

server/src/capabilities/diagnostics.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,9 @@ export class MethodVariableIsPublicDiagnostic extends BaseDiagnostic {
141141

142142
// test
143143
export class UnexpectedLineEndingDiagnostic extends BaseDiagnostic {
144-
message = "Unexpected line ending.";
145144
severity = DiagnosticSeverity.Error;
146145
constructor(range: Range) {
147-
super(range);
146+
super(range, 'Unexpected line ending.');
148147
}
149148
}
150149

@@ -153,24 +152,24 @@ export class UnreachableCodeDiagnostic extends BaseDiagnostic {
153152
severity = DiagnosticSeverity.Hint;
154153
tags = [DiagnosticTag.Unnecessary];
155154
constructor(range: Range) {
156-
super(range);
155+
super(range, 'Unreachable code detected.');
157156
}
158157
}
159158

160159
// test
161160
export class UnusedDiagnostic extends BaseDiagnostic {
162161
severity = DiagnosticSeverity.Hint;
163162
tags = [DiagnosticTag.Unnecessary];
164-
constructor(range: Range) {
165-
super(range);
163+
constructor(range: Range, message: string) {
164+
super(range, `${message} is declared but its value is never read.`);
166165
}
167166
}
168167

169168

170169
export class UnknownAttributeDiagnostic extends BaseDiagnostic {
171170
severity = DiagnosticSeverity.Error;
172171
constructor(range: Range, attributeName: string) {
173-
super(range, `Unknown attribute '${attributeName}' will be ignored.`);
172+
super(range, `Unknown attribute '${attributeName}'.`);
174173
}
175174
}
176175

server/src/project/document.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,10 +134,14 @@ export abstract class BaseProjectDocument {
134134
// };
135135
// }
136136
languageServerDiagnostics() {
137+
const diagnostics = this.isClosed ? [] : this.diagnostics;
138+
Services.logger.debug(`Sending diagnostics for ${this.textDocument.uri}`);
139+
Services.logger.debug(JSON.stringify(diagnostics));
140+
137141
return {
138142
uri: this.textDocument.uri,
139143
version: this.version,
140-
diagnostics: this.isClosed ? [] : this.diagnostics
144+
diagnostics: diagnostics
141145
};
142146
}
143147

server/src/project/elements/module.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { TextDocument } from 'vscode-languageserver-textdocument';
33
import { Diagnostic, Range, SymbolKind } from 'vscode-languageserver';
44

55
// Antlr
6-
import { ParserRuleContext } from 'antlr4ng';
6+
import { ParserRuleContext, TerminalNode } from 'antlr4ng';
77
import {
88
ClassModuleCodeElementContext,
99
ClassModuleContext,
@@ -167,7 +167,7 @@ export class ClassElement extends BaseModuleElement<ClassModuleContext> {
167167
.classModuleCode()
168168
.classModuleCodeElement());
169169

170-
let getIdentifierNameContext;
170+
let getIdentifierNameContext = (): TerminalNode | undefined => undefined;
171171
if (ctx.classModuleHeader().nameAttr().length > 0) {
172172
getIdentifierNameContext = () => ctx
173173
.classModuleHeader()

0 commit comments

Comments
 (0)