Skip to content

Commit 5cabb06

Browse files
committed
Support for ignored attributes
1 parent 093682e commit 5cabb06

File tree

5 files changed

+43
-11
lines changed

5 files changed

+43
-11
lines changed

server/src/antlr/vba.g4

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ classModule
7878
proceduralModuleHeader
7979
: endOfLine* nameAttr?
8080
;
81-
classModuleHeader: (endOfLine+ (classAttr | nameAttr))* WS?;
81+
classModuleHeader: (endOfLine+ (classAttr | nameAttr | ignoredAttr))* WS?;
8282

8383
// VBA Library Projects are allowed to have GoobalNamespace and creatable as true.
8484
classAttr
@@ -90,6 +90,10 @@ classAttr
9090
| ATTRIBUTE WS? VB_CUSTOMIZABLE WS? EQ WS? booleanLiteralIdentifier
9191
;
9292

93+
ignoredAttr
94+
: ATTRIBUTE WS? ambiguousIdentifier WS? EQ WS? expression
95+
;
96+
9397
nameAttr
9498
: ATTRIBUTE WS? VB_NAME WS? EQ WS? STRINGLITERAL
9599
;
@@ -2563,7 +2567,7 @@ STRINGLITERAL
25632567
;
25642568
25652569
INTEGERLITERAL
2566-
: [-]? (DIGIT DIGIT*
2570+
: MINUS? (DIGIT DIGIT*
25672571
| '&H' [0-9A-F]+
25682572
| '&' [O]? [0-7]+) [%&^]?
25692573
;

server/src/capabilities/diagnostics.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,14 @@ export class DuplicateAttributeDiagnostic extends BaseDiagnostic {
5757
}
5858
}
5959

60+
export class IgnoredAttributeDiagnostic extends BaseDiagnostic {
61+
message = "This attribute will be ignored.";
62+
severity = DiagnosticSeverity.Information;
63+
constructor(range: Range) {
64+
super(range);
65+
}
66+
}
67+
6068
export class MissingOptionExplicitDiagnostic extends BaseDiagnostic {
6169
message = "Option Explicit is missing from module header.";
6270
severity = DiagnosticSeverity.Warning;

server/src/project/elements/memory.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export abstract class DeclarationElement extends FoldableElement implements Scop
4040
}
4141

4242
const propertyDeclaration = new PropertyDeclarationElement(context, document.textDocument);
43-
const predeclaredElement = document.currentScopeElement.declaredNames.get(propertyDeclaration.identifier.text);
43+
const predeclaredElement = document.currentScopeElement?.declaredNames.get(propertyDeclaration.identifier.text);
4444
if (predeclaredElement && isPropertyDeclarationElement(predeclaredElement)) {
4545
predeclaredElement.addPropertyDeclaration(context, document.textDocument);
4646
return predeclaredElement;

server/src/project/elements/module.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { TextDocument } from 'vscode-languageserver-textdocument';
22
import { Diagnostic, Range, SymbolInformation, SymbolKind } from 'vscode-languageserver';
3-
import { ClassModuleContext, ProceduralModuleContext } from '../../antlr/out/vbaParser';
3+
import { ClassModuleContext, IgnoredAttrContext, ProceduralModuleContext } from '../../antlr/out/vbaParser';
44
import { BaseContextSyntaxElement, BaseSyntaxElement, HasDiagnosticCapability, HasSymbolInformation, ScopeElement } from './base';
55
import { SymbolInformationFactory } from '../../capabilities/symbolInformation';
6-
import { MissingAttributeDiagnostic, MissingOptionExplicitDiagnostic } from '../../capabilities/diagnostics';
6+
import { IgnoredAttributeDiagnostic, MissingAttributeDiagnostic, MissingOptionExplicitDiagnostic } from '../../capabilities/diagnostics';
77
import '../../extensions/stringExtensions';
88

99

@@ -138,6 +138,21 @@ export class ClassElement extends BaseModuleElement {
138138
}
139139
}
140140

141+
export class IgnoredAttributeElement extends BaseContextSyntaxElement implements HasDiagnosticCapability {
142+
diagnostics: Diagnostic[] = [];
143+
144+
constructor(context: IgnoredAttrContext, document: TextDocument) {
145+
super(context, document);
146+
}
147+
148+
evaluateDiagnostics(): void {
149+
this.diagnostics.push(
150+
new IgnoredAttributeDiagnostic(this.range)
151+
)
152+
}
153+
154+
}
155+
141156

142157
// export class ModuleElement2 extends BaseContextSyntaxElement implements HasSymbolInformation, HasAttribute, HasDiagnosticCapability {
143158
// private _hasName = false;

server/src/project/parser/vbaSyntaxParser.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import { TextDocument } from 'vscode-languageserver-textdocument';
22

33
import { vbaLexer } from '../../antlr/out/vbaLexer';
4-
import { ClassModuleContext, ModuleContext, ProceduralModuleBodyContext, ProceduralModuleContext, ProcedureDeclarationContext, vbaParser } from '../../antlr/out/vbaParser';
4+
import { ClassModuleContext, IgnoredAttrContext, ModuleContext, ProceduralModuleBodyContext, ProceduralModuleContext, ProcedureDeclarationContext, vbaParser } from '../../antlr/out/vbaParser';
55
import { vbaListener } from '../../antlr/out/vbaListener';
66

77
import { VbaClassDocument, VbaModuleDocument } from '../document';
88
import { FoldableElement } from '../elements/special';
99
import { sleep } from '../../utils/helpers';
1010
import { CancellationToken } from 'vscode-languageserver';
1111
import { CharStream, CommonTokenStream, ConsoleErrorListener, DefaultErrorStrategy, ParseTreeWalker, Parser, RecognitionException, Recognizer } from 'antlr4ng';
12-
import { ClassElement, ModuleElement } from '../elements/module';
12+
import { ClassElement, IgnoredAttributeElement, ModuleElement } from '../elements/module';
1313
import { DeclarationElement } from '../elements/memory';
1414

1515
export class SyntaxParser {
@@ -93,15 +93,20 @@ class VbaListener extends vbaListener {
9393
this.document = document;
9494
}
9595

96-
enterProceduralModule = (ctx: ProceduralModuleContext) => {
97-
const element = new ModuleElement(ctx, this.document.textDocument);
96+
enterClassModule = (ctx: ClassModuleContext) => {
97+
const element = new ClassElement(ctx, this.document.textDocument);
9898
this.document.registerSymbolInformation(element)
9999
.registerDiagnosticElement(element)
100100
.registerScopedElement(element);
101101
};
102102

103-
enterClassModule = (ctx: ClassModuleContext) => {
104-
const element = new ClassElement(ctx, this.document.textDocument);
103+
enterIgnoredAttr = (ctx: IgnoredAttrContext) => {
104+
const element = new IgnoredAttributeElement(ctx, this.document.textDocument);
105+
this.document.registerDiagnosticElement(element);
106+
};
107+
108+
enterProceduralModule = (ctx: ProceduralModuleContext) => {
109+
const element = new ModuleElement(ctx, this.document.textDocument);
105110
this.document.registerSymbolInformation(element)
106111
.registerDiagnosticElement(element)
107112
.registerScopedElement(element);

0 commit comments

Comments
 (0)