Skip to content

Commit 411dfec

Browse files
committed
Fix testBug521240_001
Signed-off-by: Rob Stryker <[email protected]>
1 parent e8c9b55 commit 411dfec

File tree

1 file changed

+59
-31
lines changed

1 file changed

+59
-31
lines changed

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/core/search/matching/DOMMethodLocator.java

Lines changed: 59 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)