Skip to content

Commit 1b58fc6

Browse files
committed
Stop including enclosing brackets into the name of enum elements
The VBE ignores the outermost enclosing brackets both for references and declarations.
1 parent 175de28 commit 1b58fc6

File tree

2 files changed

+178
-1
lines changed

2 files changed

+178
-1
lines changed

Rubberduck.Parsing/VBA/DeclarationResolving/DeclarationSymbolsListener.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -829,7 +829,7 @@ public override void ExitEnumerationStmt(VBAParser.EnumerationStmtContext contex
829829
public override void EnterEnumerationStmt_Constant(VBAParser.EnumerationStmt_ConstantContext context)
830830
{
831831
AddDeclaration(CreateDeclaration(
832-
context.identifier().GetText(),
832+
WithBracketsRemoved(context.identifier().GetText()),
833833
"Long",
834834
Accessibility.Implicit,
835835
DeclarationType.EnumerationMember,
@@ -840,6 +840,16 @@ public override void EnterEnumerationStmt_Constant(VBAParser.EnumerationStmt_Con
840840
null));
841841
}
842842

843+
private static string WithBracketsRemoved(string enumElementName)
844+
{
845+
if (enumElementName.StartsWith("[") && enumElementName.EndsWith("]"))
846+
{
847+
return enumElementName.Substring(1, enumElementName.Length - 2);
848+
}
849+
850+
return enumElementName;
851+
}
852+
843853
public override void EnterOptionPrivateModuleStmt(VBAParser.OptionPrivateModuleStmtContext context)
844854
{
845855
((ProceduralModuleDeclaration)_moduleDeclaration).IsPrivateModule = true;

RubberduckTests/Grammar/ResolverTests.cs

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6857,5 +6857,172 @@ End Function
68576857
Assert.AreEqual(2, debugPrintReferences.Count());
68586858
}
68596859
}
6860+
6861+
[Category("Grammar")]
6862+
[Category("Resolver")]
6863+
[Test]
6864+
public void HiddenEnumVariableHasCorrectName()
6865+
{
6866+
var moduleCode = $@"
6867+
Private Enum SomeEnum
6868+
[_hiddenElement]
6869+
End Enum
6870+
6871+
Private Function Test() As Variant
6872+
Debug.Print SomeEnum.[_hiddenElement]
6873+
End Function
6874+
";
6875+
6876+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(moduleCode, out _);
6877+
6878+
using (var state = Resolve(vbe.Object))
6879+
{
6880+
var enumMember = state.DeclarationFinder.UserDeclarations(DeclarationType.EnumerationMember).Single();
6881+
var enumMemberName = enumMember.IdentifierName;
6882+
6883+
Assert.AreEqual("_hiddenElement", enumMemberName);
6884+
}
6885+
}
6886+
6887+
[Category("Grammar")]
6888+
[Category("Resolver")]
6889+
[Test]
6890+
public void HiddenEnumVariableHasReference()
6891+
{
6892+
var moduleCode = $@"
6893+
Private Enum SomeEnum
6894+
[_hiddenElement]
6895+
End Enum
6896+
6897+
Private Function Test() As Variant
6898+
Debug.Print SomeEnum.[_hiddenElement]
6899+
End Function
6900+
";
6901+
6902+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(moduleCode, out _);
6903+
6904+
using (var state = Resolve(vbe.Object))
6905+
{
6906+
var enumMember = state.DeclarationFinder.UserDeclarations(DeclarationType.EnumerationMember).Single();
6907+
var enumMemberReferences = enumMember.References;
6908+
6909+
Assert.AreEqual(1, enumMemberReferences.Count());
6910+
}
6911+
}
6912+
6913+
[Category("Grammar")]
6914+
[Category("Resolver")]
6915+
[Test]
6916+
[TestCase("nonHiddenElement")]
6917+
[TestCase("[nonHiddenElement]")]
6918+
public void NonHiddenBracketedEnumVariableHasCorrectName(string enumElementName)
6919+
{
6920+
var moduleCode = $@"
6921+
Private Enum SomeEnum
6922+
[{enumElementName}]
6923+
End Enum
6924+
";
6925+
6926+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(moduleCode, out _);
6927+
6928+
using (var state = Resolve(vbe.Object))
6929+
{
6930+
var enumMember = state.DeclarationFinder.UserDeclarations(DeclarationType.EnumerationMember).Single();
6931+
var enumMemberName = enumMember.IdentifierName;
6932+
6933+
Assert.AreEqual(enumElementName, enumMemberName);
6934+
}
6935+
}
6936+
6937+
[Category("Grammar")]
6938+
[Category("Resolver")]
6939+
[Test]
6940+
[TestCase("nonHiddenElement", "nonHiddenElement", 1)]
6941+
[TestCase("[nonHiddenElement]", "[nonHiddenElement]", 0)]
6942+
[TestCase("[nonHiddenElement]", "[[nonHiddenElement]]", 1)]
6943+
public void NonHiddenBracketedEnumVariableHasReference(string enumElementName, string referenceText, int expectedNumberOfReferences)
6944+
{
6945+
var moduleCode = $@"
6946+
Private Enum SomeEnum
6947+
[{enumElementName}]
6948+
End Enum
6949+
6950+
Private Function Test() As Variant
6951+
Debug.Print SomeEnum.{referenceText}
6952+
End Function
6953+
";
6954+
6955+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(moduleCode, out _);
6956+
6957+
using (var state = Resolve(vbe.Object))
6958+
{
6959+
var enumMember = state.DeclarationFinder.UserDeclarations(DeclarationType.EnumerationMember).Single();
6960+
var enumMemberReferences = enumMember.References;
6961+
6962+
Assert.AreEqual(expectedNumberOfReferences, enumMemberReferences.Count());
6963+
}
6964+
}
6965+
6966+
[Category("Grammar")]
6967+
[Category("Resolver")]
6968+
[Test]
6969+
public void BracketedEnumElementsCorrectElementReferenced()
6970+
{
6971+
var moduleCode = $@"
6972+
Private Enum SomeEnum
6973+
enumElement
6974+
[[enumElement]]
6975+
End Enum
6976+
6977+
Private Function Test() As Variant
6978+
Debug.Print SomeEnum.[enumElement]
6979+
End Function
6980+
";
6981+
6982+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(moduleCode, out _);
6983+
6984+
using (var state = Resolve(vbe.Object))
6985+
{
6986+
var module = state.DeclarationFinder
6987+
.AllModules.Single(qmn => qmn.ComponentType == ComponentType.StandardModule);
6988+
var enumMemberReference = state.DeclarationFinder
6989+
.IdentifierReferences(module)
6990+
.Single(reference => reference.Declaration.DeclarationType == DeclarationType.EnumerationMember);
6991+
6992+
var referencedDeclarationName = enumMemberReference.Declaration.IdentifierName;
6993+
6994+
Assert.AreEqual("enumElement", referencedDeclarationName);
6995+
}
6996+
}
6997+
6998+
[Category("Grammar")]
6999+
[Category("Resolver")]
7000+
[Test]
7001+
public void BracketedEnumElementsCorrectElementReferencedIdentifierName()
7002+
{
7003+
var moduleCode = $@"
7004+
Private Enum SomeEnum
7005+
enumElement
7006+
[[enumElement]]
7007+
End Enum
7008+
7009+
Private Function Test() As Variant
7010+
Debug.Print SomeEnum.[enumElement]
7011+
End Function
7012+
";
7013+
7014+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(moduleCode, out _);
7015+
7016+
using (var state = Resolve(vbe.Object))
7017+
{
7018+
var module = state.DeclarationFinder
7019+
.AllModules.Single(qmn => qmn.ComponentType == ComponentType.StandardModule);
7020+
var enumMemberReference = state.DeclarationFinder
7021+
.IdentifierReferences(module)
7022+
.Single(reference => reference.Declaration.DeclarationType == DeclarationType.EnumerationMember);
7023+
7024+
Assert.AreEqual("enumElement", enumMemberReference.IdentifierName);
7025+
}
7026+
}
68607027
}
68617028
}

0 commit comments

Comments
 (0)