Skip to content

Commit 2c03f0a

Browse files
committed
removed redundant ResolveIdentifier method; project-scope declarations now exclude event declarations, and member calls outside With blocks now resolve correctly.
1 parent af4736d commit 2c03f0a

File tree

1 file changed

+23
-29
lines changed

1 file changed

+23
-29
lines changed

Rubberduck.Parsing/Symbols/IdentifierReferenceResolver.cs

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -266,10 +266,10 @@ private Declaration ResolveInternal(ParserRuleContext callSiteContext, Declarati
266266
}
267267
else
268268
{
269-
callee = FindLocalScopeDeclaration(identifierName, localScope)
270-
?? FindModuleScopeProcedure(identifierName, localScope, accessorType, isAssignmentTarget)
271-
?? FindModuleScopeDeclaration(identifierName, localScope)
272-
?? FindProjectScopeDeclaration(identifierName);
269+
callee = FindLocalScopeDeclaration(identifierName, localScope)
270+
?? FindModuleScopeProcedure(identifierName, localScope, accessorType, isAssignmentTarget)
271+
?? FindModuleScopeDeclaration(identifierName, localScope)
272+
?? FindProjectScopeDeclaration(identifierName);
273273
}
274274

275275
if (callee == null)
@@ -373,6 +373,8 @@ private Declaration ResolveInternal(VBAParser.ICS_S_MembersCallContext context,
373373
}
374374
parent = ResolveInternal(context.iCS_S_ProcedureOrArrayCall(), localScope, accessorType, hasExplicitLetStatement, isAssignmentTarget)
375375
?? ResolveInternal(context.iCS_S_VariableOrProcedureCall(), localScope, accessorType, hasExplicitLetStatement, isAssignmentTarget);
376+
377+
parent = ResolveType(parent);
376378
}
377379

378380
if (parent != null)
@@ -453,24 +455,6 @@ private Declaration ResolveInternal(VBAParser.ICS_B_ProcedureCallContext context
453455
return callee;
454456
}
455457

456-
private void ResolveIdentifier(VBAParser.AmbiguousIdentifierContext context)
457-
{
458-
if (context == null)
459-
{
460-
return;
461-
}
462-
463-
var identifier = ResolveInternal(context, _currentScope);
464-
if (identifier == null)
465-
{
466-
return;
467-
}
468-
469-
var reference = CreateReference(context, identifier);
470-
identifier.AddReference(reference);
471-
_alreadyResolved.Add(reference.Context);
472-
}
473-
474458
public void Resolve(VBAParser.ICS_B_ProcedureCallContext context)
475459
{
476460
if (_alreadyResolved.Contains(context))
@@ -544,6 +528,7 @@ public void Resolve(VBAParser.ICS_S_MembersCallContext context)
544528
{
545529
parent = ResolveInternal(context.iCS_S_ProcedureOrArrayCall(), _currentScope)
546530
?? ResolveInternal(context.iCS_S_VariableOrProcedureCall(), _currentScope);
531+
parent = ResolveType(parent);
547532
}
548533

549534
if (parent != null && parent.Context != null)
@@ -674,32 +659,32 @@ public void Resolve(VBAParser.ForEachStmtContext context)
674659

675660
public void Resolve(VBAParser.ImplementsStmtContext context)
676661
{
677-
ResolveIdentifier(context.ambiguousIdentifier());
662+
ResolveInternal(context.ambiguousIdentifier(), _currentScope);
678663
}
679664

680665
public void Resolve(VBAParser.RaiseEventStmtContext context)
681666
{
682-
ResolveIdentifier(context.ambiguousIdentifier());
667+
ResolveInternal(context.ambiguousIdentifier(), _currentScope);
683668
}
684669

685670
public void Resolve(VBAParser.ResumeStmtContext context)
686671
{
687-
ResolveIdentifier(context.ambiguousIdentifier());
672+
ResolveInternal(context.ambiguousIdentifier(), _currentScope);
688673
}
689674

690675
public void Resolve(VBAParser.FileNumberContext context)
691676
{
692-
ResolveIdentifier(context.ambiguousIdentifier());
677+
ResolveInternal(context.ambiguousIdentifier(), _currentScope);
693678
}
694679

695680
public void Resolve(VBAParser.ArgDefaultValueContext context)
696681
{
697-
ResolveIdentifier(context.ambiguousIdentifier());
682+
ResolveInternal(context.ambiguousIdentifier(), _currentScope);
698683
}
699684

700685
public void Resolve(VBAParser.FieldLengthContext context)
701686
{
702-
ResolveIdentifier(context.ambiguousIdentifier());
687+
ResolveInternal(context.ambiguousIdentifier(), _currentScope);
703688
}
704689

705690
public void Resolve(VBAParser.VsAssignContext context)
@@ -782,14 +767,22 @@ private Declaration FindModuleScopeDeclaration(string identifierName, Declaratio
782767
return matches.SingleOrDefault(item =>
783768
item.ParentScope == localScope.ParentScope
784769
&& !item.DeclarationType.HasFlag(DeclarationType.Member)
785-
&& !_moduleTypes.Contains(item.DeclarationType));
770+
&& !_moduleTypes.Contains(item.DeclarationType)
771+
&& (item.DeclarationType != DeclarationType.Event || IsLocalEvent(item, localScope)));
786772
}
787773
catch (InvalidOperationException)
788774
{
789775
return null;
790776
}
791777
}
792778

779+
private bool IsLocalEvent(Declaration item, Declaration localScope)
780+
{
781+
return item.DeclarationType == DeclarationType.Event
782+
&& localScope.Project == _currentScope.Project
783+
&& localScope.ComponentName == _currentScope.ComponentName;
784+
}
785+
793786
private Declaration FindModuleScopeProcedure(string identifierName, Declaration localScope, ContextAccessorType accessorType, bool isAssignmentTarget = false)
794787
{
795788
if (localScope == null)
@@ -818,6 +811,7 @@ private Declaration FindProjectScopeDeclaration(string identifierName)
818811
{
819812
return matches.SingleOrDefault(item =>
820813
!item.DeclarationType.HasFlag(DeclarationType.Member)
814+
&& item.DeclarationType != DeclarationType.Event // events can't be called outside the class they're declared in
821815
&& (item.Accessibility == Accessibility.Public
822816
|| item.Accessibility == Accessibility.Global
823817
|| _moduleTypes.Contains(item.DeclarationType) /* because static classes are accessed just like modules */));

0 commit comments

Comments
 (0)