Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions .vscodeignore
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
# Project
.bin
.gitignore
.github/**
.eslintignore
.vscode/**
.travis.yml
scripts/**
**/tsconfig.json
**/tsconfig.base.json
contributing.md
Expand All @@ -26,6 +29,9 @@ sample*/**
**/test/**
**/testFixture/**

# Node modules
node_modules/antlr4ng-cli/**

# Client node modules
client/node_modules/**
!client/node_modules/vscode-jsonrpc/**
Expand All @@ -34,3 +40,11 @@ client/node_modules/**
!client/node_modules/vscode-languageserver-types/**
!client/node_modules/{minimatch,brace-expansion,concat-map,balanced-match}/**
!client/node_modules/{semver,lru-cache,yallist}/**

# Server node modules
server/node_modules/**
!server/node_modules/vscode-jsonrpc/**
!server/node_modules/vscode-languageserver/**
!server/node_modules/vscode-languageserver-protocol/**
!server/node_modules/vscode-languageserver-textdocument/**
!server/node_modules/vscode-languageserver-types/**
12 changes: 5 additions & 7 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

35 changes: 18 additions & 17 deletions server/src/antlr/vba.g4
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,8 @@ nameAttr
//---------------------------------------------------------------------------------------
// 5.1 Module Body Structure
// Everything from here down is user generated code.
proceduralModuleBody: proceduralModuleDeclarationSection? endOfLine* proceduralModuleCode;
classModuleBody: classModuleDeclarationSection? classModuleCode;
proceduralModuleBody: proceduralModuleCode;
classModuleBody: classModuleCode;
unrestrictedName
: reservedIdentifier
| name
Expand All @@ -121,17 +121,16 @@ untypedName

//---------------------------------------------------------------------------------------
// 5.2 Module Declaration Section Structure
proceduralModuleDeclarationSection
: (endOfLine+ proceduralModuleDeclarationElement)+
| ((endOfLine+ proceduralModuleDirectiveElement)* endOfLine+ defDirective) (proceduralModuleDeclarationElement endOfLineNoWs)*
;
classModuleDeclarationSection
: (classModuleDeclarationElement endOfLine+)+
| ((classModuleDirectiveElement endOfLine+)* defDirective) (classModuleDeclarationElement endOfLine+)*
;
// proceduralModuleDeclarationSection
// : (endOfLine+ proceduralModuleDeclarationElement)+
// | ((endOfLine+ proceduralModuleDirectiveElement)* endOfLine+ defDirective) (proceduralModuleDeclarationElement endOfLineNoWs)*
// ;
// classModuleDeclarationSection
// : (classModuleDeclarationElement endOfLine+)+
// | ((classModuleDirectiveElement endOfLine+)* defDirective) (classModuleDeclarationElement endOfLine+)*
// ;
proceduralModuleDirectiveElement
: commonOptionDirective
| optionPrivateDirective
: optionPrivateDirective
| defDirective
;
proceduralModuleDeclarationElement
Expand All @@ -140,18 +139,15 @@ proceduralModuleDeclarationElement
| publicConstDeclaration
| publicExternalProcedureDeclaration
| globalEnumDeclaration
| commonOptionDirective
| optionPrivateDirective
;
classModuleDirectiveElement
: commonOptionDirective
| defDirective
: defDirective
| implementsDirective
;
classModuleDeclarationElement
: commonModuleDeclarationElement
| eventDeclaration
| commonOptionDirective
| implementsDirective
;

Expand Down Expand Up @@ -360,8 +356,13 @@ classModuleCodeElement
// Added AttributeStatement.
commonModuleCodeElement
: remStatement
| procedureDeclaration
| attributeStatement
| procedureDeclaration
| commonOptionDirective
| proceduralModuleDirectiveElement
| proceduralModuleDeclarationElement
| classModuleDirectiveElement
| classModuleDeclarationElement
;
procedureDeclaration
: subroutineDeclaration
Expand Down
9 changes: 9 additions & 0 deletions server/src/capabilities/diagnostics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,4 +82,13 @@ export class MissingOptionExplicitDiagnostic extends BaseDiagnostic {
constructor(range: Range) {
super(range);
}
}

export class ElementOutOfPlaceDiagnostic extends BaseDiagnostic {
message: string;
severity = DiagnosticSeverity.Error;
constructor(range: Range, elementName: string) {
super(range);
this.message = `${elementName}s cannot appear below a Sub, Function, or Property declaration.`
}
}
36 changes: 23 additions & 13 deletions server/src/project/elements/memory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { ScopeElement } from './special';
import { VbaClassDocument, VbaModuleDocument } from '../document';
import { SymbolInformationFactory } from '../../capabilities/symbolInformation';
import '../../extensions/parserExtensions';
import { DuplicateDeclarationDiagnostic } from '../../capabilities/diagnostics';
import { DuplicateDeclarationDiagnostic, ElementOutOfPlaceDiagnostic } from '../../capabilities/diagnostics';



Expand Down Expand Up @@ -215,39 +215,49 @@ abstract class BaseEnumDeclarationElement extends ScopeElement implements HasSem

}

export class EnumDeclarationElement extends BaseEnumDeclarationElement implements ScopeElement {
export class EnumDeclarationElement extends BaseEnumDeclarationElement implements ScopeElement, HasDiagnosticCapability {
diagnostics: Diagnostic[] = [];
tokenType: SemanticTokenTypes;
isDeclaredAfterMethod: boolean;

get symbolInformation(): SymbolInformation {
return SymbolInformationFactory.create(
this, SymbolKind.Enum
);
}

constructor(context: EnumDeclarationContext, document: TextDocument) {
constructor(context: EnumDeclarationContext, document: TextDocument, isDeclaredAfterMethod: boolean) {
super(context, document);
this.tokenType = SemanticTokenTypes.enum;
this.isDeclaredAfterMethod = isDeclaredAfterMethod;
this.identifier = new IdentifierElement(context.untypedName().ambiguousIdentifier()!, document);
context.enumMemberList().enumElement().forEach(enumElementContext =>
this.pushDeclaredName(new EnumMemberDeclarationElement(enumElementContext.enumMember()!, document))
);
}

get symbolInformation(): SymbolInformation {
return SymbolInformationFactory.create(
this, SymbolKind.Enum
);
evaluateDiagnostics(): void {
if (this.isDeclaredAfterMethod) {
this.diagnostics.push(new ElementOutOfPlaceDiagnostic(this.range, 'Enum declaration'));
}
}

}

class EnumMemberDeclarationElement extends BaseEnumDeclarationElement {
tokenType: SemanticTokenTypes;

constructor(context: EnumMemberContext, document: TextDocument) {
super(context, document);
this.tokenType = SemanticTokenTypes.enumMember;
this.identifier = new IdentifierElement(context.untypedName().ambiguousIdentifier()!, document);
}

get symbolInformation(): SymbolInformation {
return SymbolInformationFactory.create(
this, SymbolKind.EnumMember
);
}

constructor(context: EnumMemberContext, document: TextDocument) {
super(context, document);
this.tokenType = SemanticTokenTypes.enumMember;
this.identifier = new IdentifierElement(context.untypedName().ambiguousIdentifier()!, document);
}
}

abstract class BaseVariableDeclarationStatementElement extends BaseContextSyntaxElement implements HasSemanticToken, HasSymbolInformation, NamedSyntaxElement {
Expand Down
64 changes: 31 additions & 33 deletions server/src/project/elements/module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@ abstract class BaseModuleElement extends ScopeElement implements HasSymbolInform
protected abstract _name: string;
symbolKind: SymbolKind;
diagnostics: Diagnostic[] = [];
context: ProceduralModuleContext | ClassModuleContext;

constructor(context: ProceduralModuleContext | ClassModuleContext, document: TextDocument, symbolKind: SymbolKind) {
super(context, document);
this.context = context;
this.symbolKind = symbolKind;
}

Expand All @@ -29,6 +31,32 @@ abstract class BaseModuleElement extends ScopeElement implements HasSymbolInform
}

abstract evaluateDiagnostics(): void;

protected get _hasOptionExplicit(): boolean {
const getCodeElements = () => {
if (this._isClassModule(this.context)) {
return this.context.classModuleBody().classModuleCode().classModuleCodeElement()
}
return this.context.proceduralModuleBody().proceduralModuleCode().proceduralModuleCodeElement();
}
const codeElements = getCodeElements()
if (!codeElements) {
return false;
}

for (const declaration of codeElements) {
const element = declaration.commonModuleCodeElement();
if (element && element.commonOptionDirective()?.optionExplicitDirective()) {
return true;
}
}

return false;
}

private _isClassModule(context: ProceduralModuleContext | ClassModuleContext): context is ClassModuleContext {
return 'classModuleHeader' in context;
}
}

export class ModuleElement extends BaseModuleElement {
Expand All @@ -42,7 +70,7 @@ export class ModuleElement extends BaseModuleElement {
}

evaluateDiagnostics(): void {
if (!this._hasOptionExplicit()) {
if (!this._hasOptionExplicit) {
const header = this.context.proceduralModuleHeader();
const startLine = header.stop?.line ?? 0 + 1;
this.diagnostics.push(new MissingOptionExplicitDiagnostic(
Expand All @@ -67,21 +95,6 @@ export class ModuleElement extends BaseModuleElement {

return name?.stripQuotes() ?? 'Unknown Module';
}

private _hasOptionExplicit(): boolean {
const moduleDeclarations = this.context.proceduralModuleBody().proceduralModuleDeclarationSection()?.proceduralModuleDeclarationElement();
if (!moduleDeclarations) {
return false;
}

for (const declaration of moduleDeclarations) {
if (declaration.commonOptionDirective()?.optionExplicitDirective()) {
return true;
}
}

return false;
}
}

export class ClassElement extends BaseModuleElement {
Expand All @@ -95,7 +108,7 @@ export class ClassElement extends BaseModuleElement {
}

evaluateDiagnostics(): void {
if (!this._hasOptionExplicit()) {
if (!this._hasOptionExplicit) {
const header = this.context.classModuleHeader();
const startLine = header.stop?.line ?? 0 + 1;
this.diagnostics.push(new MissingOptionExplicitDiagnostic(
Expand All @@ -121,21 +134,6 @@ export class ClassElement extends BaseModuleElement {
const nameAttribute = nameAttributes[0];
return nameAttribute.STRINGLITERAL().getText().stripQuotes();
}

private _hasOptionExplicit(): boolean {
const moduleDeclarations = this.context.classModuleBody().classModuleDeclarationSection()?.classModuleDeclarationElement();
if (!moduleDeclarations) {
return false;
}

for (const declaration of moduleDeclarations) {
if (declaration.commonOptionDirective()?.optionExplicitDirective()) {
return true;
}
}

return false;
}
}

export class IgnoredAttributeElement extends BaseContextSyntaxElement implements HasDiagnosticCapability {
Expand All @@ -148,7 +146,7 @@ export class IgnoredAttributeElement extends BaseContextSyntaxElement implements
evaluateDiagnostics(): void {
this.diagnostics.push(
new IgnoredAttributeDiagnostic(this.range)
)
);
}

}
Expand Down
Loading