Skip to content

Commit 45d08e0

Browse files
committed
Support for while/wend blocks
1 parent 95bbada commit 45d08e0

File tree

3 files changed

+49
-1
lines changed

3 files changed

+49
-1
lines changed

server/src/capabilities/diagnostics.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,12 @@ export class MultipleOperatorsDiagnostic extends BaseDiagnostic {
2727
constructor(range: Range) {
2828
super(range);
2929
}
30+
}
31+
32+
export class WhileWendDeprecatedDiagnostic extends BaseDiagnostic {
33+
message = "The Do...Loop statement provides a more structured and flexible way to perform looping.";
34+
severity = DiagnosticSeverity.Information;
35+
constructor(range: Range) {
36+
super(range);
37+
}
3038
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { ParserRuleContext } from 'antlr4ts';
2+
import { BaseContextSyntaxElement, HasDiagnosticCapability } from './base';
3+
import { TextDocument } from 'vscode-languageserver-textdocument';
4+
import { ValueStmtContext, WhileWendStmtContext } from '../../antlr/out/vbaParser';
5+
import { Diagnostic } from 'vscode-languageserver';
6+
import { WhileWendDeprecatedDiagnostic } from '../../capabilities/diagnostics';
7+
8+
9+
class BaseLoopElement extends BaseContextSyntaxElement {
10+
constructor(context: ParserRuleContext, document: TextDocument) {
11+
super(context, document);
12+
}
13+
}
14+
15+
16+
export class WhileWendLoopElement extends BaseLoopElement implements HasDiagnosticCapability {
17+
diagnostics: Diagnostic[] = [];
18+
valueStatement: ValueStatementElement;
19+
20+
constructor(context: WhileWendStmtContext, document: TextDocument) {
21+
super(context, document);
22+
this.valueStatement = new ValueStatementElement(context.valueStmt(), document);
23+
}
24+
25+
evaluateDiagnostics(): void {
26+
this.diagnostics.push(new WhileWendDeprecatedDiagnostic(this.valueStatement.range));
27+
}
28+
}
29+
30+
class ValueStatementElement extends BaseContextSyntaxElement {
31+
constructor(context: ValueStmtContext, document: TextDocument) {
32+
super(context, document);
33+
}
34+
}

server/src/project/parser/vbaSyntaxParser.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { ErrorNode } from 'antlr4ts/tree/ErrorNode';
66
import { ParseTreeWalker } from 'antlr4ts/tree/ParseTreeWalker';
77

88
import { vbaLexer as VbaLexer } from '../../antlr/out/vbaLexer';
9-
import { AttributeStmtContext, ConstStmtContext, EnumerationStmtContext, EnumerationStmt_ConstantContext, FoldingBlockStmtContext, MethodStmtContext, ModuleContext, ModuleHeaderContext, OperatorsStmtContext, TypeStmtContext, VariableStmtContext, vbaParser as VbaParser } from '../../antlr/out/vbaParser';
9+
import { AttributeStmtContext, ConstStmtContext, EnumerationStmtContext, EnumerationStmt_ConstantContext, FoldingBlockStmtContext, MethodStmtContext, ModuleContext, ModuleHeaderContext, OperatorsStmtContext, TypeStmtContext, VariableStmtContext, vbaParser as VbaParser, WhileWendStmtContext } from '../../antlr/out/vbaParser';
1010
import { vbaListener } from '../../antlr/out/vbaListener';
1111

1212
import { VbaClassDocument, VbaModuleDocument } from '../document';
@@ -16,6 +16,7 @@ import { ModuleElement } from '../elements/module';
1616
import { sleep } from '../../utils/helpers';
1717
import { CancellationToken } from 'vscode-languageserver';
1818
import { OperatorElement } from '../elements/operator';
19+
import { WhileWendLoopElement } from '../elements/flow';
1920

2021
export class SyntaxParser {
2122
private static _lockIdentifier = 0;
@@ -170,6 +171,11 @@ class VbaTreeWalkListener implements vbaListener {
170171
const element = new VariableDeclarationsElement(ctx, this.document.textDocument);
171172
element.declarations.forEach((e) => this.document.registerSymbolInformation(e));
172173
};
174+
175+
enterWhileWendStmt = (ctx: WhileWendStmtContext) => {
176+
const element = new WhileWendLoopElement(ctx, this.document.textDocument);
177+
this.document.registerDiagnosticElement(element);
178+
};
173179
}
174180

175181
class VbaErrorHandler extends DefaultErrorStrategy {

0 commit comments

Comments
 (0)