Skip to content

Commit 9d78450

Browse files
committed
Store on references whether they are a procedure coercion reference
Note that the parameterized versions are technically not procedure coercions, but indexed default member accesses.
1 parent a44dd18 commit 9d78450

File tree

4 files changed

+41
-35
lines changed

4 files changed

+41
-35
lines changed

Rubberduck.Parsing/Symbols/Declaration.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,8 @@ public void AddReference(
366366
bool isIndexedDefaultMemberAccess = false,
367367
bool isNonIndexedDefaultMemberAccess = false,
368368
int defaultMemberRecursionDepth = 0,
369-
bool isArrayAccess = false
369+
bool isArrayAccess = false,
370+
bool isProcedureCoercion = false
370371
)
371372
{
372373
var oldReference = _references.FirstOrDefault(r =>
@@ -397,7 +398,8 @@ public void AddReference(
397398
isIndexedDefaultMemberAccess,
398399
isNonIndexedDefaultMemberAccess,
399400
defaultMemberRecursionDepth,
400-
isArrayAccess);
401+
isArrayAccess,
402+
isProcedureCoercion);
401403
_references.AddOrUpdate(newReference, 1, (key, value) => 1);
402404
}
403405

Rubberduck.Parsing/Symbols/IdentifierReference.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ public IdentifierReference(
2727
bool isIndexedDefaultMemberAccess = false,
2828
bool isNonIndexedDefaultMemberAccess = false,
2929
int defaultMemberRecursionDepth = 0,
30-
bool isArrayAccess = false)
30+
bool isArrayAccess = false,
31+
bool isProcedureCoercion = false)
3132
{
3233
ParentScoping = parentScopingDeclaration;
3334
ParentNonScoping = parentNonScopingDeclaration;
@@ -43,6 +44,7 @@ public IdentifierReference(
4344
IsNonIndexedDefaultMemberAccess = isNonIndexedDefaultMemberAccess;
4445
DefaultMemberRecursionDepth = defaultMemberRecursionDepth;
4546
IsArrayAccess = isArrayAccess;
47+
IsProcedureCoercion = isProcedureCoercion;
4648
Annotations = annotations ?? new List<IParseTreeAnnotation>();
4749
}
4850

@@ -71,6 +73,7 @@ public IdentifierReference(
7173
public bool IsIndexedDefaultMemberAccess { get; }
7274
public bool IsNonIndexedDefaultMemberAccess { get; }
7375
public bool IsDefaultMemberAccess => IsIndexedDefaultMemberAccess || IsNonIndexedDefaultMemberAccess;
76+
public bool IsProcedureCoercion { get; }
7477
public int DefaultMemberRecursionDepth { get; }
7578

7679
public bool IsArrayAccess { get; }

Rubberduck.Parsing/VBA/ReferenceManagement/BoundExpressionVisitor.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,8 @@ private void AddDefaultMemberReference(
455455
selection,
456456
FindIdentifierAnnotations(module, selection.StartLine),
457457
isNonIndexedDefaultMemberAccess: true,
458-
defaultMemberRecursionDepth: expression.DefaultMemberRecursionDepth);
458+
defaultMemberRecursionDepth: expression.DefaultMemberRecursionDepth,
459+
isProcedureCoercion: true);
459460
}
460461

461462
private void AddUnboundDefaultMemberReference(
@@ -481,7 +482,8 @@ private void AddUnboundDefaultMemberReference(
481482
FindIdentifierAnnotations(module, selection.StartLine),
482483
false,
483484
isNonIndexedDefaultMemberAccess: true,
484-
defaultMemberRecursionDepth: expression.DefaultMemberRecursionDepth);
485+
defaultMemberRecursionDepth: expression.DefaultMemberRecursionDepth,
486+
isProcedureCoercion: true);
485487
_declarationFinder.AddUnboundDefaultMemberAccess(reference);
486488
}
487489

RubberduckTests/Grammar/ResolverTests.cs

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4790,6 +4790,7 @@ End Sub
47904790
Assert.IsTrue(defaultMemberReference.IsNonIndexedDefaultMemberAccess);
47914791
Assert.AreEqual(1, defaultMemberReference.DefaultMemberRecursionDepth);
47924792
Assert.IsTrue(defaultMemberReference.IsAssignment);
4793+
Assert.IsFalse(defaultMemberReference.IsProcedureCoercion);
47934794
}
47944795
}
47954796

@@ -4906,10 +4907,10 @@ End Sub
49064907
[Test]
49074908
[Category("Grammar")]
49084909
[Category("Resolver")]
4909-
public void ParameterizedProcedureCoercionDefaultMemberAccessReferenceToDefaultMemberOnEntireContext()
4910+
public void NonParameterizedProcedureCoercionDefaultMemberAccessReferenceToDefaultMemberOnEntireContext()
49104911
{
49114912
var class1Code = @"
4912-
Public Sub Foo(arg As Long)
4913+
Public Sub Foo()
49134914
Attribute Foo.VB_UserMemId = 0
49144915
End Sub
49154916
";
@@ -4924,7 +4925,7 @@ End Function
49244925
var moduleCode = $@"
49254926
Private Function Foo() As Variant
49264927
Dim cls As new Class2
4927-
cls.Baz 42
4928+
cls
49284929
End Function
49294930
49304931
Private Sub Bar(arg As Long)
@@ -4939,7 +4940,7 @@ End Sub
49394940
("Class2", class2Code, ComponentType.ClassModule),
49404941
("Module1", moduleCode, ComponentType.StandardModule));
49414942

4942-
var selection = new Selection(4, 5, 4, 12);
4943+
var selection = new Selection(4, 5, 4, 8);
49434944

49444945
using (var state = Resolve(vbe.Object))
49454946
{
@@ -4948,19 +4949,20 @@ End Sub
49484949
var defaultMemberReference = state.DeclarationFinder.IdentifierReferences(qualifiedSelection).Last();
49494950
var referencedDeclaration = defaultMemberReference.Declaration;
49504951

4951-
var expectedReferencedDeclarationName = "Class1.Foo";
4952+
var expectedReferencedDeclarationName = "Class2.Baz";
49524953
var actualReferencedDeclarationName = $"{referencedDeclaration.ComponentName}.{referencedDeclaration.IdentifierName}";
49534954

49544955
Assert.AreEqual(expectedReferencedDeclarationName, actualReferencedDeclarationName);
4955-
Assert.IsTrue(defaultMemberReference.IsIndexedDefaultMemberAccess);
4956+
Assert.IsTrue(defaultMemberReference.IsNonIndexedDefaultMemberAccess);
4957+
Assert.IsTrue(defaultMemberReference.IsProcedureCoercion);
49564958
Assert.AreEqual(1, defaultMemberReference.DefaultMemberRecursionDepth);
49574959
}
49584960
}
49594961

49604962
[Test]
49614963
[Category("Grammar")]
49624964
[Category("Resolver")]
4963-
public void NonParameterizedProcedureCoercionDefaultMemberAccessReferenceToDefaultMemberOnEntireContext()
4965+
public void NonParameterizedUnboundProcedureCoercionDefaultMemberAccessReferenceToDefaultMemberOnEntireContext()
49644966
{
49654967
var class1Code = @"
49664968
Public Sub Foo()
@@ -4977,7 +4979,7 @@ End Function
49774979

49784980
var moduleCode = $@"
49794981
Private Function Foo() As Variant
4980-
Dim cls As new Class2
4982+
Dim cls As Object
49814983
cls
49824984
End Function
49834985
@@ -4998,26 +5000,23 @@ End Sub
49985000
using (var state = Resolve(vbe.Object))
49995001
{
50005002
var module = state.DeclarationFinder.AllModules.First(qmn => qmn.ComponentName == "Module1");
5001-
var qualifiedSelection = new QualifiedSelection(module, selection);
5002-
var defaultMemberReference = state.DeclarationFinder.IdentifierReferences(qualifiedSelection).Last();
5003-
var referencedDeclaration = defaultMemberReference.Declaration;
5003+
var defaultMemberReference = state.DeclarationFinder
5004+
.UnboundDefaultMemberAccesses(module)
5005+
.Last(reference => reference.Selection.Equals(selection));
50045006

5005-
var expectedReferencedDeclarationName = "Class2.Baz";
5006-
var actualReferencedDeclarationName = $"{referencedDeclaration.ComponentName}.{referencedDeclaration.IdentifierName}";
5007-
5008-
Assert.AreEqual(expectedReferencedDeclarationName, actualReferencedDeclarationName);
50095007
Assert.IsTrue(defaultMemberReference.IsNonIndexedDefaultMemberAccess);
5008+
Assert.IsTrue(defaultMemberReference.IsProcedureCoercion);
50105009
Assert.AreEqual(1, defaultMemberReference.DefaultMemberRecursionDepth);
50115010
}
50125011
}
50135012

50145013
[Test]
50155014
[Category("Grammar")]
50165015
[Category("Resolver")]
5017-
public void ParameterizedProcedureCoercionDefaultMemberAccessReferenceToDefaultMemberOnEntireContext_ExplicitCall()
5016+
public void NonParameterizedProcedureCoercionDefaultMemberAccessReferenceToDefaultMemberOnEntireContext_ExplicitCall()
50185017
{
50195018
var class1Code = @"
5020-
Public Sub Foo(arg As Long)
5019+
Public Sub Foo()
50215020
Attribute Foo.VB_UserMemId = 0
50225021
End Sub
50235022
";
@@ -5032,7 +5031,7 @@ End Function
50325031
var moduleCode = $@"
50335032
Private Function Foo() As Variant
50345033
Dim cls As new Class2
5035-
Call cls.Baz(42)
5034+
Call cls
50365035
End Function
50375036
50385037
Private Sub Bar(arg As Long)
@@ -5047,7 +5046,7 @@ End Sub
50475046
("Class2", class2Code, ComponentType.ClassModule),
50485047
("Module1", moduleCode, ComponentType.StandardModule));
50495048

5050-
var selection = new Selection(4, 10, 4, 17);
5049+
var selection = new Selection(4, 10, 4, 13);
50515050

50525051
using (var state = Resolve(vbe.Object))
50535052
{
@@ -5056,19 +5055,20 @@ End Sub
50565055
var defaultMemberReference = state.DeclarationFinder.IdentifierReferences(qualifiedSelection).Last();
50575056
var referencedDeclaration = defaultMemberReference.Declaration;
50585057

5059-
var expectedReferencedDeclarationName = "Class1.Foo";
5058+
var expectedReferencedDeclarationName = "Class2.Baz";
50605059
var actualReferencedDeclarationName = $"{referencedDeclaration.ComponentName}.{referencedDeclaration.IdentifierName}";
50615060

50625061
Assert.AreEqual(expectedReferencedDeclarationName, actualReferencedDeclarationName);
5063-
Assert.IsTrue(defaultMemberReference.IsIndexedDefaultMemberAccess);
5062+
Assert.IsTrue(defaultMemberReference.IsNonIndexedDefaultMemberAccess);
5063+
Assert.IsTrue(defaultMemberReference.IsProcedureCoercion);
50645064
Assert.AreEqual(1, defaultMemberReference.DefaultMemberRecursionDepth);
50655065
}
50665066
}
50675067

50685068
[Test]
50695069
[Category("Grammar")]
50705070
[Category("Resolver")]
5071-
public void NonParameterizedProcedureCoercionDefaultMemberAccessReferenceToDefaultMemberOnEntireContext_ExplicitCall()
5071+
public void NonParameterizedUnboundProcedureCoercionDefaultMemberAccessReferenceToDefaultMemberOnEntireContext_ExplicitCall()
50725072
{
50735073
var class1Code = @"
50745074
Public Sub Foo()
@@ -5085,7 +5085,7 @@ End Function
50855085

50865086
var moduleCode = $@"
50875087
Private Function Foo() As Variant
5088-
Dim cls As new Class2
5088+
Dim cls As Object
50895089
Call cls
50905090
End Function
50915091
@@ -5106,15 +5106,12 @@ End Sub
51065106
using (var state = Resolve(vbe.Object))
51075107
{
51085108
var module = state.DeclarationFinder.AllModules.First(qmn => qmn.ComponentName == "Module1");
5109-
var qualifiedSelection = new QualifiedSelection(module, selection);
5110-
var defaultMemberReference = state.DeclarationFinder.IdentifierReferences(qualifiedSelection).Last();
5111-
var referencedDeclaration = defaultMemberReference.Declaration;
5109+
var defaultMemberReference = state.DeclarationFinder
5110+
.UnboundDefaultMemberAccesses(module)
5111+
.Last(reference => reference.Selection.Equals(selection));
51125112

5113-
var expectedReferencedDeclarationName = "Class2.Baz";
5114-
var actualReferencedDeclarationName = $"{referencedDeclaration.ComponentName}.{referencedDeclaration.IdentifierName}";
5115-
5116-
Assert.AreEqual(expectedReferencedDeclarationName, actualReferencedDeclarationName);
51175113
Assert.IsTrue(defaultMemberReference.IsNonIndexedDefaultMemberAccess);
5114+
Assert.IsTrue(defaultMemberReference.IsProcedureCoercion);
51185115
Assert.AreEqual(1, defaultMemberReference.DefaultMemberRecursionDepth);
51195116
}
51205117
}
@@ -5169,6 +5166,7 @@ End Sub
51695166

51705167
Assert.AreEqual(expectedReferencedDeclarationName, actualReferencedDeclarationName);
51715168
Assert.IsTrue(defaultMemberReference.IsNonIndexedDefaultMemberAccess);
5169+
Assert.IsTrue(defaultMemberReference.IsProcedureCoercion);
51725170
Assert.AreEqual(1, defaultMemberReference.DefaultMemberRecursionDepth);
51735171
}
51745172
}
@@ -5224,6 +5222,7 @@ End Sub
52245222

52255223
Assert.AreEqual(expectedReferencedDeclarationName, actualReferencedDeclarationName);
52265224
Assert.IsTrue(defaultMemberReference.IsNonIndexedDefaultMemberAccess);
5225+
Assert.IsTrue(defaultMemberReference.IsProcedureCoercion);
52275226
Assert.AreEqual(1, defaultMemberReference.DefaultMemberRecursionDepth);
52285227
}
52295228
}

0 commit comments

Comments
 (0)