Skip to content

Commit 14f957b

Browse files
committed
Set up infrastructure to store failed indexed default member accesses
1 parent 82c8b0d commit 14f957b

File tree

3 files changed

+139
-25
lines changed

3 files changed

+139
-25
lines changed

Rubberduck.Parsing/VBA/DeclarationCaching/DeclarationFinder.cs

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,26 +1047,32 @@ public void AddUnboundContext(Declaration parentDeclaration, VBAParser.LExpressi
10471047
(context is VBAParser.MemberAccessExprContext) ? (ParserRuleContext)context.children[0] : withExpression.Context,
10481048
annotations);
10491049

1050-
var failedResolutions = _newFailedResolutionStores.GetOrAdd(declaration.QualifiedModuleName, new ConcurrentFailedResolutionStore());
1051-
failedResolutions.AddUnresolvedMemberDeclaration(declaration);
1050+
var store = _newFailedResolutionStores.GetOrAdd(declaration.QualifiedModuleName, new ConcurrentFailedResolutionStore());
1051+
store.AddUnresolvedMemberDeclaration(declaration);
10521052
}
10531053

10541054
public void AddUnboundDefaultMemberAccess(IdentifierReference defaultMemberAccess)
10551055
{
1056-
var failedResolutions = _newFailedResolutionStores.GetOrAdd(defaultMemberAccess.QualifiedModuleName, new ConcurrentFailedResolutionStore());
1057-
failedResolutions.AddUnboundDefaultMemberAccess(defaultMemberAccess);
1056+
var store = _newFailedResolutionStores.GetOrAdd(defaultMemberAccess.QualifiedModuleName, new ConcurrentFailedResolutionStore());
1057+
store.AddUnboundDefaultMemberAccess(defaultMemberAccess);
10581058
}
10591059

10601060
public void AddFailedLetCoercionReference(IdentifierReference failedLetCoercion)
10611061
{
1062-
var failedResolutions = _newFailedResolutionStores.GetOrAdd(failedLetCoercion.QualifiedModuleName, new ConcurrentFailedResolutionStore());
1063-
failedResolutions.AddFailedLetCoercion(failedLetCoercion);
1062+
var store = _newFailedResolutionStores.GetOrAdd(failedLetCoercion.QualifiedModuleName, new ConcurrentFailedResolutionStore());
1063+
store.AddFailedLetCoercion(failedLetCoercion);
10641064
}
10651065

10661066
public void AddFailedProcedureCoercionReference(IdentifierReference failedProcedureCoercion)
10671067
{
1068-
var failedResolutions = _newFailedResolutionStores.GetOrAdd(failedProcedureCoercion.QualifiedModuleName, new ConcurrentFailedResolutionStore());
1069-
failedResolutions.AddFailedProcedureCoercion(failedProcedureCoercion);
1068+
var store = _newFailedResolutionStores.GetOrAdd(failedProcedureCoercion.QualifiedModuleName, new ConcurrentFailedResolutionStore());
1069+
store.AddFailedProcedureCoercion(failedProcedureCoercion);
1070+
}
1071+
1072+
public void AddFailedIndexedDefaultMemberResolution(IdentifierReference failedProcedureCoercion)
1073+
{
1074+
var store = _newFailedResolutionStores.GetOrAdd(failedProcedureCoercion.QualifiedModuleName, new ConcurrentFailedResolutionStore());
1075+
store.AddFailedIndexedDefaultMemberResolution(failedProcedureCoercion);
10701076
}
10711077

10721078
public Declaration OnBracketedExpression(string expression, ParserRuleContext context)
@@ -1592,5 +1598,24 @@ public IEnumerable<UnboundMemberDeclaration> UnresolvedMemberDeclarations()
15921598
return _failedResolutionStores.Values
15931599
.SelectMany(store => store.UnresolvedMemberDeclarations);
15941600
}
1601+
1602+
/// <summary>
1603+
/// Gets the failed indexed default member accesses in a module.
1604+
/// </summary>
1605+
public IReadOnlyCollection<IdentifierReference> FailedIndexedDefaultMemberAccesses(QualifiedModuleName module)
1606+
{
1607+
return _failedResolutionStores.TryGetValue(module, out var store)
1608+
? store.FailedIndexedDefaultMemberResolutions
1609+
: new HashSet<IdentifierReference>();
1610+
}
1611+
1612+
/// <summary>
1613+
/// Gets all failed indexed default member accesses.
1614+
/// </summary>
1615+
public IEnumerable<IdentifierReference> FailedIndexedDefaultMemberAccesses()
1616+
{
1617+
return _failedResolutionStores.Values
1618+
.SelectMany(store => store.FailedIndexedDefaultMemberResolutions);
1619+
}
15951620
}
15961621
}

Rubberduck.Parsing/VBA/ReferenceManagement/BoundExpressionVisitor.cs

Lines changed: 89 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -191,14 +191,21 @@ private void Visit(
191191
{
192192
Visit(expression.LExpression, module, scope, parent, hasExplicitLetStatement: hasExplicitLetStatement);
193193

194-
if (expression.Classification != ExpressionClassification.Unbound
195-
&& expression.ReferencedDeclaration != null)
194+
switch (expression.Classification)
196195
{
197-
AddDefaultMemberReference(expression, module, scope, parent, isAssignmentTarget, hasExplicitLetStatement, isSetAssignment);
198-
}
199-
else
200-
{
201-
AddUnboundDefaultMemberReference(expression, module, scope, parent, isAssignmentTarget, hasExplicitLetStatement, isSetAssignment);
196+
case ExpressionClassification.ResolutionFailed:
197+
AddFailedIndexedDefaultMemberReference(expression, module, scope, parent, isAssignmentTarget, hasExplicitLetStatement, expression.ArgumentList.HasArguments);
198+
break;
199+
case ExpressionClassification.Unbound:
200+
AddUnboundDefaultMemberReference(expression, module, scope, parent, isAssignmentTarget, hasExplicitLetStatement, isSetAssignment);
201+
break;
202+
default:
203+
if (expression.ReferencedDeclaration != null)
204+
{
205+
AddDefaultMemberReference(expression, module, scope, parent, isAssignmentTarget, hasExplicitLetStatement, isSetAssignment);
206+
}
207+
208+
break;
202209
}
203210
}
204211
else if (expression.Classification != ExpressionClassification.Unbound
@@ -343,6 +350,37 @@ private void AddUnboundDefaultMemberReference(
343350
_declarationFinder.AddUnboundDefaultMemberAccess(reference);
344351
}
345352

353+
private void AddFailedIndexedDefaultMemberReference(
354+
IndexExpression expression,
355+
QualifiedModuleName module,
356+
Declaration scope,
357+
Declaration parent,
358+
bool isAssignmentTarget,
359+
bool hasExplicitLetStatement,
360+
bool hasArguments)
361+
{
362+
var callSiteContext = expression.Context;
363+
var identifier = callSiteContext.GetText();
364+
var selection = callSiteContext.GetSelection();
365+
var callee = expression.ReferencedDeclaration;
366+
var reference = new IdentifierReference(
367+
module,
368+
scope,
369+
parent,
370+
identifier,
371+
selection,
372+
callSiteContext,
373+
callee,
374+
isAssignmentTarget,
375+
hasExplicitLetStatement,
376+
FindIdentifierAnnotations(module, selection.StartLine),
377+
false,
378+
isIndexedDefaultMemberAccess: hasArguments,
379+
isNonIndexedDefaultMemberAccess: !hasArguments,
380+
defaultMemberRecursionDepth: expression.DefaultMemberRecursionDepth);
381+
_declarationFinder.AddFailedIndexedDefaultMemberResolution(reference);
382+
}
383+
346384
private void Visit(
347385
DictionaryAccessExpression expression,
348386
QualifiedModuleName module,
@@ -360,15 +398,23 @@ private void Visit(
360398
Visit(containedExpression, module, scope, parent, hasExplicitLetStatement);
361399
}
362400

363-
if (expression.Classification != ExpressionClassification.Unbound
364-
&& expression.ReferencedDeclaration != null)
365-
{
366-
AddDefaultMemberReference(expression, module, scope, parent, isAssignmentTarget, hasExplicitLetStatement, isSetAssignment);
367-
}
368-
else
401+
switch (expression.Classification)
369402
{
370-
AddUnboundDefaultMemberReference(expression, module, scope, parent, isAssignmentTarget, hasExplicitLetStatement, isSetAssignment);
403+
case ExpressionClassification.ResolutionFailed:
404+
AddFailedIndexedDefaultMemberReference(expression, module, scope, parent, isAssignmentTarget, hasExplicitLetStatement);
405+
break;
406+
case ExpressionClassification.Unbound:
407+
AddUnboundDefaultMemberReference(expression, module, scope, parent, isAssignmentTarget, hasExplicitLetStatement, isSetAssignment);
408+
break;
409+
default:
410+
if (expression.ReferencedDeclaration != null)
411+
{
412+
AddDefaultMemberReference(expression, module, scope, parent, isAssignmentTarget, hasExplicitLetStatement, isSetAssignment);
413+
}
414+
415+
break;
371416
}
417+
372418
// Argument List not affected by being unbound.
373419
foreach (var argument in expression.ArgumentList.Arguments)
374420
{
@@ -483,6 +529,35 @@ private void AddDefaultMemberReference(
483529
defaultMemberRecursionDepth: expression.DefaultMemberRecursionDepth);
484530
}
485531

532+
private void AddFailedIndexedDefaultMemberReference(
533+
DictionaryAccessExpression expression,
534+
QualifiedModuleName module,
535+
Declaration scope,
536+
Declaration parent,
537+
bool isAssignmentTarget,
538+
bool hasExplicitLetStatement)
539+
{
540+
var callSiteContext = expression.Context;
541+
var identifier = callSiteContext.GetText();
542+
var selection = callSiteContext.GetSelection();
543+
var callee = expression.ReferencedDeclaration;
544+
var reference = new IdentifierReference(
545+
module,
546+
scope,
547+
parent,
548+
identifier,
549+
selection,
550+
callSiteContext,
551+
callee,
552+
isAssignmentTarget,
553+
hasExplicitLetStatement,
554+
FindIdentifierAnnotations(module, selection.StartLine),
555+
false,
556+
isIndexedDefaultMemberAccess: true,
557+
defaultMemberRecursionDepth: expression.DefaultMemberRecursionDepth);
558+
_declarationFinder.AddFailedIndexedDefaultMemberResolution(reference);
559+
}
560+
486561
private void Visit(
487562
LetCoercionDefaultMemberAccessExpression expression,
488563
QualifiedModuleName module,

Rubberduck.Parsing/VBA/ReferenceManagement/FailedResolutionStorage.cs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public interface IFailedResolutionStore
1111
IReadOnlyCollection<IdentifierReference> UnboundDefaultMemberAccesses { get; }
1212
IReadOnlyCollection<IdentifierReference> FailedLetCoercions { get; }
1313
IReadOnlyCollection<IdentifierReference> FailedProcedureCoercions { get; }
14+
IReadOnlyCollection<IdentifierReference> FailedIndexedDefaultMemberResolutions { get; }
1415
}
1516

1617
public interface IMutableFailedResolutionStore : IFailedResolutionStore
@@ -19,6 +20,7 @@ public interface IMutableFailedResolutionStore : IFailedResolutionStore
1920
void AddUnboundDefaultMemberAccess(IdentifierReference unboundDefaultMemberAccess);
2021
void AddFailedLetCoercion(IdentifierReference failedLetCoercion);
2122
void AddFailedProcedureCoercion(IdentifierReference failedProcedureCoercion);
23+
void AddFailedIndexedDefaultMemberResolution(IdentifierReference failedIndexedDefaultMemberResolution);
2224
}
2325

2426
public class FailedResolutionStore : IFailedResolutionStore
@@ -27,32 +29,37 @@ public class FailedResolutionStore : IFailedResolutionStore
2729
public IReadOnlyCollection<IdentifierReference> UnboundDefaultMemberAccesses { get; }
2830
public IReadOnlyCollection<IdentifierReference> FailedLetCoercions { get; }
2931
public IReadOnlyCollection<IdentifierReference> FailedProcedureCoercions { get; }
32+
public IReadOnlyCollection<IdentifierReference> FailedIndexedDefaultMemberResolutions { get; }
3033

3134
public FailedResolutionStore(
3235
IReadOnlyCollection<UnboundMemberDeclaration> unresolvedMemberDeclarations,
3336
IReadOnlyCollection<IdentifierReference> unboundDefaultMemberAccesses,
3437
IReadOnlyCollection<IdentifierReference> failedLetCoercions,
35-
IReadOnlyCollection<IdentifierReference> failedProcedureCoercions)
38+
IReadOnlyCollection<IdentifierReference> failedProcedureCoercions,
39+
IReadOnlyCollection<IdentifierReference> failedIndexedDefaultMemberResolutions)
3640
{
3741
UnresolvedMemberDeclarations = unresolvedMemberDeclarations;
3842
UnboundDefaultMemberAccesses = unboundDefaultMemberAccesses;
3943
FailedLetCoercions = failedLetCoercions;
4044
FailedProcedureCoercions = failedProcedureCoercions;
45+
FailedIndexedDefaultMemberResolutions = failedIndexedDefaultMemberResolutions;
4146
}
4247

4348
public FailedResolutionStore(IMutableFailedResolutionStore mutableStore)
4449
:this(
4550
mutableStore.UnresolvedMemberDeclarations.ToHashSet(),
4651
mutableStore.UnboundDefaultMemberAccesses.ToHashSet(),
4752
mutableStore.FailedLetCoercions.ToHashSet(),
48-
mutableStore.FailedProcedureCoercions.ToHashSet())
53+
mutableStore.FailedProcedureCoercions.ToHashSet(),
54+
mutableStore.FailedIndexedDefaultMemberResolutions.ToHashSet())
4955
{}
5056

5157
public FailedResolutionStore()
5258
:this(
5359
new List<UnboundMemberDeclaration>(),
5460
new List<IdentifierReference>(),
5561
new List<IdentifierReference>(),
62+
new List<IdentifierReference>(),
5663
new List<IdentifierReference>())
5764
{}
5865
}
@@ -63,11 +70,13 @@ public class ConcurrentFailedResolutionStore : IMutableFailedResolutionStore
6370
private readonly ConcurrentBag<IdentifierReference> _unboundDefaultMemberAccesses = new ConcurrentBag<IdentifierReference>();
6471
private readonly ConcurrentBag<IdentifierReference> _failedLetCoercions = new ConcurrentBag<IdentifierReference>();
6572
private readonly ConcurrentBag<IdentifierReference> _failedProcedureCoercions = new ConcurrentBag<IdentifierReference>();
66-
73+
private readonly ConcurrentBag<IdentifierReference> _failedIndexedDefaultMemberResolutions = new ConcurrentBag<IdentifierReference>();
74+
6775
public IReadOnlyCollection<UnboundMemberDeclaration> UnresolvedMemberDeclarations => _unresolvedMemberDeclarations;
6876
public IReadOnlyCollection<IdentifierReference> UnboundDefaultMemberAccesses => _unboundDefaultMemberAccesses;
6977
public IReadOnlyCollection<IdentifierReference> FailedLetCoercions => _failedLetCoercions;
7078
public IReadOnlyCollection<IdentifierReference> FailedProcedureCoercions => _failedProcedureCoercions;
79+
public IReadOnlyCollection<IdentifierReference> FailedIndexedDefaultMemberResolutions => _failedIndexedDefaultMemberResolutions;
7180

7281
public void AddUnresolvedMemberDeclaration(UnboundMemberDeclaration unresolvedMemberDeclaration)
7382
{
@@ -88,5 +97,10 @@ public void AddFailedProcedureCoercion(IdentifierReference failedProcedureCoerci
8897
{
8998
_failedProcedureCoercions.Add(failedProcedureCoercion);
9099
}
100+
101+
public void AddFailedIndexedDefaultMemberResolution(IdentifierReference failedIndexedDefaultMemberResolution)
102+
{
103+
_failedIndexedDefaultMemberResolutions.Add(failedIndexedDefaultMemberResolution);
104+
}
91105
}
92106
}

0 commit comments

Comments
 (0)