Skip to content

Commit 61c6db9

Browse files
authored
Merge pull request #5230 from MDoerner/FixEnumMemberResolution
Fix enum member resolution
2 parents d5c9b77 + 3eb9f92 commit 61c6db9

File tree

4 files changed

+226
-4
lines changed

4 files changed

+226
-4
lines changed

Rubberduck.Parsing/Binding/Bindings/MemberAccessDefaultBinding.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public MemberAccessDefaultBinding(
3434
parent,
3535
expression,
3636
null,
37-
Identifier.GetName(expression.unrestrictedIdentifier()),
37+
expression.unrestrictedIdentifier().GetText(),
3838
statementContext,
3939
unrestrictedNameContext)
4040
{

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;

Rubberduck.Parsing/VBA/ReferenceManagement/BoundExpressionVisitor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,8 @@ private void Visit(
123123
bool isSetAssignment)
124124
{
125125
var callSiteContext = expression.Context;
126-
var identifier = expression.Context.GetText();
127126
var callee = expression.ReferencedDeclaration;
127+
var identifier = callee.IdentifierName;
128128
var selection = callSiteContext.GetSelection();
129129
expression.ReferencedDeclaration.AddReference(
130130
module,
@@ -163,8 +163,8 @@ private void Visit(
163163
}
164164

165165
var callSiteContext = expression.UnrestrictedNameContext;
166-
var identifier = expression.UnrestrictedNameContext.GetText();
167166
var callee = expression.ReferencedDeclaration;
167+
var identifier = callee.IdentifierName;
168168
var selection = callSiteContext.GetSelection();
169169
expression.ReferencedDeclaration.AddReference(
170170
module,

RubberduckTests/Grammar/ResolverTests.cs

Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6857,5 +6857,217 @@ 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+
[TestCase("")]
6919+
public void NonHiddenBracketedEnumVariableHasCorrectName(string enumElementName)
6920+
{
6921+
var moduleCode = $@"
6922+
Private Enum SomeEnum
6923+
[{enumElementName}]
6924+
End Enum
6925+
";
6926+
6927+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(moduleCode, out _);
6928+
6929+
using (var state = Resolve(vbe.Object))
6930+
{
6931+
var enumMember = state.DeclarationFinder.UserDeclarations(DeclarationType.EnumerationMember).Single();
6932+
var enumMemberName = enumMember.IdentifierName;
6933+
6934+
Assert.AreEqual(enumElementName, enumMemberName);
6935+
}
6936+
}
6937+
6938+
[Category("Grammar")]
6939+
[Category("Resolver")]
6940+
[Test]
6941+
[TestCase("nonHiddenElement", "SomeEnum.nonHiddenElement", 1)]
6942+
[TestCase("[nonHiddenElement]", "SomeEnum.[nonHiddenElement]", 0)]
6943+
[TestCase("[nonHiddenElement]", "SomeEnum.[[nonHiddenElement]]", 1)]
6944+
[TestCase("nonHiddenElement", "nonHiddenElement", 1)]
6945+
[TestCase("[nonHiddenElement]", "[[nonHiddenElement]]", 1)]
6946+
[TestCase("", "SomeEnum.[]", 1)]
6947+
[TestCase("", "[]", 1)]
6948+
public void NonHiddenBracketedEnumVariableHasReference(string enumElementName, string referenceText, int expectedNumberOfReferences)
6949+
{
6950+
var moduleCode = $@"
6951+
Private Enum SomeEnum
6952+
[{enumElementName}]
6953+
End Enum
6954+
6955+
Private Function Test() As Variant
6956+
Debug.Print {referenceText}
6957+
End Function
6958+
";
6959+
6960+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(moduleCode, out _);
6961+
6962+
using (var state = Resolve(vbe.Object))
6963+
{
6964+
var enumMember = state.DeclarationFinder.UserDeclarations(DeclarationType.EnumerationMember).Single();
6965+
var enumMemberReferences = enumMember.References;
6966+
6967+
Assert.AreEqual(expectedNumberOfReferences, enumMemberReferences.Count());
6968+
}
6969+
}
6970+
6971+
[Category("Grammar")]
6972+
[Category("Resolver")]
6973+
[Test]
6974+
public void BracketedEnumElementsCorrectElementReferenced()
6975+
{
6976+
var moduleCode = $@"
6977+
Private Enum SomeEnum
6978+
enumElement
6979+
[[enumElement]]
6980+
End Enum
6981+
6982+
Private Function Test() As Variant
6983+
Debug.Print SomeEnum.[enumElement]
6984+
End Function
6985+
";
6986+
6987+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(moduleCode, out _);
6988+
6989+
using (var state = Resolve(vbe.Object))
6990+
{
6991+
var module = state.DeclarationFinder
6992+
.AllModules.Single(qmn => qmn.ComponentType == ComponentType.StandardModule);
6993+
var enumMemberReference = state.DeclarationFinder
6994+
.IdentifierReferences(module)
6995+
.Single(reference => reference.Declaration.DeclarationType == DeclarationType.EnumerationMember);
6996+
6997+
var referencedDeclarationName = enumMemberReference.Declaration.IdentifierName;
6998+
6999+
Assert.AreEqual("enumElement", referencedDeclarationName);
7000+
}
7001+
}
7002+
7003+
[Category("Grammar")]
7004+
[Category("Resolver")]
7005+
[Test]
7006+
public void BracketedEnumElementsCorrectElementReferencedIdentifierName()
7007+
{
7008+
var moduleCode = $@"
7009+
Private Enum SomeEnum
7010+
enumElement
7011+
[[enumElement]]
7012+
End Enum
7013+
7014+
Private Function Test() As Variant
7015+
Debug.Print SomeEnum.[enumElement]
7016+
End Function
7017+
";
7018+
7019+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(moduleCode, out _);
7020+
7021+
using (var state = Resolve(vbe.Object))
7022+
{
7023+
var module = state.DeclarationFinder
7024+
.AllModules.Single(qmn => qmn.ComponentType == ComponentType.StandardModule);
7025+
var enumMemberReference = state.DeclarationFinder
7026+
.IdentifierReferences(module)
7027+
.Single(reference => reference.Declaration.DeclarationType == DeclarationType.EnumerationMember);
7028+
7029+
Assert.AreEqual("enumElement", enumMemberReference.IdentifierName);
7030+
}
7031+
}
7032+
7033+
[Category("Grammar")]
7034+
[Category("Resolver")]
7035+
[Test]
7036+
[TestCase("TestModule.[Foo]", "Foo")]
7037+
[TestCase("TestModule.[Bar] 23", "Bar")]
7038+
[TestCase("Debug.Print TestModule.[Baz](42)", "Baz")]
7039+
[TestCase("[Foo]", "Foo")]
7040+
[TestCase("[Bar] 23", "Bar")]
7041+
[TestCase("Debug.Print [Baz](42)", "Baz")]
7042+
public void BracketedMemberExpressionCorrectReferencedIdentifierName(string statement, string expectedReferenceText)
7043+
{
7044+
var moduleCode = $@"
7045+
Private Sub Foo()
7046+
End Sub
7047+
7048+
Private Sub Bar(arg As Long)
7049+
End Sub
7050+
7051+
Private Function Baz(arg As Long) As Long
7052+
End Function
7053+
7054+
Private Function Test() As Variant
7055+
{statement}
7056+
End Function
7057+
";
7058+
7059+
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(moduleCode, "TestModule", out _);
7060+
7061+
using (var state = Resolve(vbe.Object))
7062+
{
7063+
var module = state.DeclarationFinder
7064+
.AllModules.Single(qmn => qmn.ComponentType == ComponentType.StandardModule);
7065+
var enumMemberReference = state.DeclarationFinder
7066+
.IdentifierReferences(module)
7067+
.Single(reference => reference.Declaration.DeclarationType.HasFlag(DeclarationType.Member));
7068+
7069+
Assert.AreEqual(expectedReferenceText, enumMemberReference.IdentifierName);
7070+
}
7071+
}
68607072
}
68617073
}

0 commit comments

Comments
 (0)