Skip to content

Commit f06fcbe

Browse files
committed
Fixed in-block ambiguous call resolution
1 parent 043cf59 commit f06fcbe

File tree

1 file changed

+34
-2
lines changed

1 file changed

+34
-2
lines changed

Rubberduck.Parsing/Symbols/IdentifierReferenceListener.cs

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,36 @@ private Declaration Resolve(VBAParser.ICS_S_MembersCallContext context)
416416
return Resolve(context, out discarded);
417417
}
418418

419+
private Declaration Resolve(VBAParser.ICS_B_ProcedureCallContext context)
420+
{
421+
var name = context.certainIdentifier().GetText();
422+
return FindProcedureDeclaration(name, context.certainIdentifier()); // note: is this a StackOverflowException waiting to bite me?
423+
}
424+
425+
private Declaration Resolve(VBAParser.ICS_B_MemberProcedureCallContext context)
426+
{
427+
var parent = context.implicitCallStmt_InStmt();
428+
var parentCall = Resolve(parent.iCS_S_VariableOrProcedureCall())
429+
?? Resolve(parent.iCS_S_ProcedureOrArrayCall())
430+
?? Resolve(parent.iCS_S_DictionaryCall())
431+
?? Resolve(parent.iCS_S_MembersCall());
432+
433+
if (parentCall == null)
434+
{
435+
return null;
436+
}
437+
438+
var type = _declarations[parentCall.AsTypeName].SingleOrDefault(item =>
439+
item.DeclarationType == DeclarationType.Class
440+
//|| item.DeclarationType == DeclarationType.Module
441+
|| item.DeclarationType == DeclarationType.UserDefinedType);
442+
443+
var members = _declarations.FindMembers(type);
444+
var name = context.ambiguousIdentifier().GetText();
445+
446+
return members.SingleOrDefault(m => m.IdentifierName == name);
447+
}
448+
419449
public override void EnterVsAssign(VBAParser.VsAssignContext context)
420450
{
421451
/* named parameter syntax */
@@ -566,10 +596,12 @@ private Declaration GetClosestScopeDeclaration(IEnumerable<Declaration> declarat
566596
return matches[0];
567597
}
568598

569-
var memberProcedureCallContext = context.Parent.Parent as VBAParser.ImplicitCallStmt_InBlockContext;
599+
var memberProcedureCallContext = context.Parent as VBAParser.ICS_B_MemberProcedureCallContext;
570600
if (memberProcedureCallContext != null)
571601
{
572-
var parentMemberName = memberProcedureCallContext.Stop.Text; // bug right here
602+
return Resolve(memberProcedureCallContext);
603+
var parent = memberProcedureCallContext;
604+
var parentMemberName = memberProcedureCallContext.ambiguousIdentifier().GetText();
573605
var matchingParents = _declarations.Items.Where(d => d.IdentifierName == parentMemberName
574606
&& (d.DeclarationType == DeclarationType.Class || d.DeclarationType == DeclarationType.UserDefinedType));
575607

0 commit comments

Comments
 (0)