@@ -416,6 +416,36 @@ private Declaration Resolve(VBAParser.ICS_S_MembersCallContext context)
416
416
return Resolve ( context , out discarded ) ;
417
417
}
418
418
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
+
419
449
public override void EnterVsAssign ( VBAParser . VsAssignContext context )
420
450
{
421
451
/* named parameter syntax */
@@ -566,10 +596,12 @@ private Declaration GetClosestScopeDeclaration(IEnumerable<Declaration> declarat
566
596
return matches [ 0 ] ;
567
597
}
568
598
569
- var memberProcedureCallContext = context . Parent . Parent as VBAParser . ImplicitCallStmt_InBlockContext ;
599
+ var memberProcedureCallContext = context . Parent as VBAParser . ICS_B_MemberProcedureCallContext ;
570
600
if ( memberProcedureCallContext != null )
571
601
{
572
- var parentMemberName = memberProcedureCallContext . Stop . Text ; // bug right here
602
+ return Resolve ( memberProcedureCallContext ) ;
603
+ var parent = memberProcedureCallContext ;
604
+ var parentMemberName = memberProcedureCallContext . ambiguousIdentifier ( ) . GetText ( ) ;
573
605
var matchingParents = _declarations . Items . Where ( d => d . IdentifierName == parentMemberName
574
606
&& ( d . DeclarationType == DeclarationType . Class || d . DeclarationType == DeclarationType . UserDefinedType ) ) ;
575
607
0 commit comments