Skip to content

Commit 3f3b95d

Browse files
committed
Replace comment semtoks with unreachable diags
1 parent 19bce2c commit 3f3b95d

File tree

4 files changed

+24
-62
lines changed

4 files changed

+24
-62
lines changed

server/src/capabilities/diagnostics.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,15 @@ export class UnexpectedLineEndingDiagnostic extends BaseDiagnostic {
8484
}
8585
}
8686

87+
// test
88+
export class UnreachableCodeDiagnostic extends BaseDiagnostic {
89+
severity = DiagnosticSeverity.Hint;
90+
tags = [DiagnosticTag.Unnecessary];
91+
constructor(range: Range) {
92+
super(range);
93+
}
94+
}
95+
8796

8897
export class IgnoredAttributeDiagnostic extends BaseDiagnostic {
8998
severity = DiagnosticSeverity.Warning;

server/src/project/document.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,7 @@ export abstract class BaseProjectDocument {
153153
languageServerDiagnostics(): DocumentDiagnosticReport {
154154
return {
155155
kind: DocumentDiagnosticReportKind.Full,
156-
items: this.hasDiagnosticElements
157-
.map((e) => e.diagnosticCapability.diagnostics).flat(1)
156+
items: this.diagnostics
158157
};
159158
}
160159

server/src/project/elements/precompiled.ts

Lines changed: 9 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
// Core
2-
import { Range, SemanticTokenTypes } from 'vscode-languageserver';
32
import { TextDocument } from 'vscode-languageserver-textdocument';
43

54
// Antlr
6-
import { ParserRuleContext } from 'antlr4ng';
75
import { CompilerConditionalBlockContext, CompilerDefaultBlockContext, CompilerIfBlockContext } from '../../antlr/out/vbapreParser';
86

97
// Project
10-
import { SemanticTokenCapability } from '../../capabilities/capabilities';
11-
import { BaseContextSyntaxElement, HasSemanticTokenCapability } from '../elements/base';
8+
import { DiagnosticCapability } from '../../capabilities/capabilities';
9+
import { BaseContextSyntaxElement } from '../elements/base';
10+
import { UnreachableCodeDiagnostic } from '../../capabilities/diagnostics';
1211

1312

1413
export class CompilerLogicalBlock extends BaseContextSyntaxElement<CompilerIfBlockContext> {
@@ -29,6 +28,7 @@ export class CompilerLogicalBlock extends BaseContextSyntaxElement<CompilerIfBlo
2928
resolved = true;
3029
continue;
3130
}
31+
block.deactivate();
3232
this.inactiveBlocks.push(block);
3333
}
3434
}
@@ -47,31 +47,6 @@ class CompilerConditionBlock extends BaseContextSyntaxElement<CompilerConditiona
4747
return this.context.rule.compilerBlockContent()?.getText().split('\n') ?? [];
4848
}
4949

50-
get linesToComments(): GenericCommentElement[] {
51-
const rowX = this.context.range.start.line;
52-
const rowY = this.context.range.end.line;
53-
54-
// Iterate the rows -- test what happens when you get to the end of the document.
55-
// May require a try catch where the default offset is the character count of the document.
56-
const result: GenericCommentElement[] = [];
57-
for (let i = rowX; i < rowY; i++) {
58-
const posX = this.context.document.offsetAt({ line: i, character: 0 });
59-
const posY = this.context.document.offsetAt({ line: i + 1, character: 0 }) - 1;
60-
61-
const lineRange = Range.create(
62-
this.context.document.positionAt(posX),
63-
this.context.document.positionAt(posY)
64-
);
65-
result.push(new GenericCommentElement(
66-
this.context.rule,
67-
this.context.document,
68-
lineRange)
69-
);
70-
}
71-
72-
return result;
73-
}
74-
7550
get conditionResult(): boolean {
7651
// Default "Else" block is always true.
7752
const ctx = this.context.rule;
@@ -90,6 +65,11 @@ class CompilerConditionBlock extends BaseContextSyntaxElement<CompilerConditiona
9065
return result;
9166
}
9267

68+
deactivate(): void {
69+
this.diagnosticCapability = new DiagnosticCapability(this);
70+
this.diagnosticCapability.diagnostics.push(new UnreachableCodeDiagnostic(this.context.range))
71+
}
72+
9373
/** Transpiles a VBA expression into Typescript. */
9474
private transpileVbaToTypescript(exp: string): string {
9575
// Convert the environment constant to boolean.
@@ -118,14 +98,3 @@ class CompilerConditionBlock extends BaseContextSyntaxElement<CompilerConditiona
11898
return result;
11999
}
120100
}
121-
122-
123-
export class GenericCommentElement extends BaseContextSyntaxElement<ParserRuleContext> implements HasSemanticTokenCapability {
124-
semanticTokenCapability: SemanticTokenCapability;
125-
126-
constructor(ctx: ParserRuleContext, doc: TextDocument, range?: Range) {
127-
super(ctx, doc);
128-
const textLen = range ? doc.offsetAt(range.end) - doc.offsetAt(range.start) + 1 : undefined;
129-
this.semanticTokenCapability = new SemanticTokenCapability(this, SemanticTokenTypes.comment, [], range, textLen)
130-
}
131-
}

server/src/project/parser/vbaListener.ts

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import {
3131

3232
// Project
3333
import { DuplicateOperatorElement, WhileLoopElement } from '../elements/flow';
34-
import { CompilerLogicalBlock, GenericCommentElement } from '../elements/precompiled';
34+
import { CompilerLogicalBlock } from '../elements/precompiled';
3535
import { ClassElement, ModuleElement, ModuleIgnoredAttributeElement } from '../elements/module';
3636
import { DocumentSettings, VbaClassDocument, VbaModuleDocument } from '../document';
3737
import { FunctionDeclarationElement, PropertyGetDeclarationElement, PropertyLetDeclarationElement, PropertySetDeclarationElement, SubDeclarationElement } from '../elements/procedure';
@@ -214,25 +214,10 @@ export class VbaPreListener extends vbapreListener {
214214
const doc = this.common.document;
215215
const docprops = this.common.documentSettings;
216216
const element = new CompilerLogicalBlock(ctx, doc.textDocument, docprops);
217-
218-
// Register block subtraction and comment tokens.
219-
element.inactiveBlocks.forEach(b => {
220-
doc.registerSubtractElement(b);
221-
b.linesToComments.forEach(c =>
222-
doc.registerSemanticToken(c)
223-
.registerSemanticToken(c)
224-
);
225-
});
226-
}
227-
228-
enterCompilerElseStatement = (ctx: CompilerElseStatementContext) => this.registerSemanticComment(ctx);
229-
enterCompilerEndIfStatement = (ctx: CompilerEndIfStatementContext) => this.registerSemanticComment(ctx);
230-
enterCompilerConditionalStatement = (ctx: CompilerConditionalStatementContext) => this.registerSemanticComment(ctx);
231-
232-
private registerSemanticComment(ctx: ParserRuleContext) {
233-
const doc = this.common.document;
234-
const element = new GenericCommentElement(ctx, doc.textDocument);
235-
doc.registerSubtractElement(element);
217+
element.inactiveBlocks.forEach(
218+
b => doc.registerElement(b)
219+
.registerSubtractElement(b)
220+
);
236221
}
237222
}
238223

0 commit comments

Comments
 (0)