@@ -719,14 +719,30 @@ public IMethodBinding getDOMASTMethodBinding(MethodPattern methodPattern, AST as
719719 String typeName = !declaringPackage .isEmpty () && declaringQualification .length () > declaringPackage .length () && declaringQualification .startsWith (declaringPackage )
720720 ? declaringPackage + '.' + declaringQualification .substring (declaringPackage .length () + 1 ).replace ('.' , '$' ) + '$' + simpleName
721721 : declaringQualification + '.' + simpleName ;
722+ String [] parameterTypeSignaturesArr = null ;
723+ if ( methodPattern .parametersTypeSignatures != null ) {
724+ parameterTypeSignaturesArr =
725+ Arrays .stream (methodPattern .parametersTypeSignatures )
726+ .map (x -> x == null || x .length == 0 || x [0 ] == null ? "" : new String (x [0 ]))
727+ .toArray (String []::new );
728+ }
722729 if (typeName .startsWith ("." )) {
723730 typeName = typeName .substring (1 );
724731 }
725732 var type = ast .resolveWellKnownType (typeName );
726- if (type != null ) {
733+ if (type != null ) {
727734 for (IMethodBinding method : type .getDeclaredMethods ()) {
728- if (Objects .equals (method .getJavaElement (), methodPattern .focus )) {
729- return method ;
735+ if ( methodPattern .focus != null ) {
736+ // Pattern has a focus so we can check there
737+ if (Objects .equals (method .getJavaElement (), methodPattern .focus )) {
738+ return method ;
739+ }
740+ } else {
741+ // Have to do a manual match. Yuck
742+ String selectorName = methodPattern .selector == null ? null : new String (methodPattern .selector );
743+ if ( methodBindingMatchesNameAndParams (method , selectorName , parameterTypeSignaturesArr )) {
744+ return method ;
745+ }
730746 }
731747 }
732748 }
@@ -754,38 +770,50 @@ private IMethodBinding findMethodBindingFromFocus(MethodPattern methodPattern, A
754770 found = JdtCoreDomPackagePrivateUtility .findUnresolvedBindingForType (ast , "Q" + typeName + ";" );
755771 }
756772 if ( found instanceof ITypeBinding tb && methodPattern .focus instanceof IMethod im ) {
757- String needleName = im .getElementName ();
758- String [] parameterTypeSignatures = im .getParameterTypes ();
759- int parameterCount = parameterTypeSignatures .length ;
760- IMethodBinding [] mb = tb .getDeclaredMethods ();
761- for ( int i = 0 ; i < mb .length ; i ++ ) {
762- String workingName = mb [i ].getName ();
763- if ( workingName .equals (needleName )) {
764- ITypeBinding [] params = mb [i ].getParameterTypes ();
765- int l2 = params .length ;
766- if ( parameterCount == l2 ) {
767- boolean failed = false ;
768- for ( int j = 0 ; j < params .length && !failed ; j ++ ) {
769- String sigJ = SignatureUtils .getSignature (params [j ]);
770- boolean eq = sigJ .equals (parameterTypeSignatures [j ]);
771- boolean eq2 = parameterTypeSignatures [j ].startsWith ("Q" ) && sigJ .endsWith (parameterTypeSignatures [j ].substring (1 ));
772- if ( !eq && !eq2 ) {
773- // Let's do a more intensive search
774- String noDollarsFromBinding = sigJ .replaceAll ("\\ $" , "." );
775- String noDollarsFromFocus = parameterTypeSignatures [j ].replaceAll ("\\ $" , "." );
776- boolean eq3 = parameterTypeSignatures [j ].startsWith ("Q" ) && noDollarsFromBinding .endsWith (noDollarsFromFocus .substring (1 ));
777- if ( !eq3 )
778- failed = true ;
779- }
780- }
781- if ( !failed ) {
782- return mb [i ];
783- }
773+ return findMethodFromTypeBindingThatMatches (tb , im );
774+ }
775+ return null ;
776+ }
777+
778+ private IMethodBinding findMethodFromTypeBindingThatMatches (ITypeBinding tb , IMethod im ) {
779+ String needleName = im .getElementName ();
780+ String [] parameterTypeSignatures = im .getParameterTypes ();
781+ IMethodBinding [] mb = tb .getDeclaredMethods ();
782+ for ( int i = 0 ; i < mb .length ; i ++ ) {
783+ if ( methodBindingMatchesNameAndParams (mb [i ], needleName , parameterTypeSignatures )) {
784+ return mb [i ];
785+ }
786+ }
787+ return null ;
788+ }
789+
790+ private boolean methodBindingMatchesNameAndParams (IMethodBinding mb , String needleName , String [] parameterTypeSignatures ) {
791+ int parameterCount = parameterTypeSignatures .length ;
792+ String workingName = mb .getName ();
793+ if ( workingName .equals (needleName )) {
794+ ITypeBinding [] params = mb .getParameterTypes ();
795+ int l2 = params .length ;
796+ if ( parameterCount == l2 ) {
797+ boolean failed = false ;
798+ for ( int j = 0 ; j < params .length && !failed ; j ++ ) {
799+ String sigJ = SignatureUtils .getSignature (params [j ]);
800+ boolean eq = sigJ .equals (parameterTypeSignatures [j ]);
801+ boolean eq2 = parameterTypeSignatures [j ].startsWith ("Q" ) && sigJ .endsWith (parameterTypeSignatures [j ].substring (1 ));
802+ if ( !eq && !eq2 ) {
803+ // Let's do a more intensive search
804+ String noDollarsFromBinding = sigJ .replaceAll ("\\ $" , "." );
805+ String noDollarsFromFocus = parameterTypeSignatures [j ].replaceAll ("\\ $" , "." );
806+ boolean eq3 = parameterTypeSignatures [j ].startsWith ("Q" ) && noDollarsFromBinding .endsWith (noDollarsFromFocus .substring (1 ));
807+ if ( !eq3 )
808+ failed = true ;
784809 }
785810 }
811+ if ( !failed ) {
812+ return true ;
813+ }
786814 }
787815 }
788- return null ;
816+ return false ;
789817 }
790818
791819 private int computeResolveLevel (org .eclipse .jdt .core .dom .ASTNode node , IBinding binding , MatchLocator locator ) {
0 commit comments