Skip to content

Commit

Permalink
Member.findMethod use qualified type if possible
Browse files Browse the repository at this point in the history
When both methods have qualified types for parameters, use those instead
of only comparing the simple name (which can lead to false positive)

Fixes #2240
  • Loading branch information
mickaelistria authored and akurtakov committed Apr 1, 2024
1 parent b22237f commit 67e94ee
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
*******************************************************************************/
package org.eclipse.jdt.core.tests.dom;

import static org.junit.Assert.assertArrayEquals;

import java.io.File;
import java.io.IOException;

Expand Down Expand Up @@ -77,6 +79,7 @@
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.core.tests.model.AbstractJavaSearchTests;
import org.eclipse.jdt.core.tests.util.Util;
import org.eclipse.jdt.internal.core.Member;

import junit.framework.Test;

Expand Down Expand Up @@ -2910,4 +2913,27 @@ public void acceptAST(ICompilationUnit source, CompilationUnit ast) {
deleteFolder("/P/src/p");
}
}

public void testCorrectMethodFoundWithEqualSimpleName() throws CoreException {
this.workingCopies = new ICompilationUnit[1];
this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/MyIF.java",
"""
interface MyIF {
public void query(Foo.InnerKey fk, Bar.InnerKey bk, String s);
public void query/*here*/(Bar.InnerKey fk, Bar.InnerKey bk, String s);
}
class Foo {
static class InnerKey { }
}
class Bar {
static class InnerKey { }
}
""");
IType interfaceType = this.workingCopies[0].getType("MyIF");
IMethod secondMethod = interfaceType.getMethods()[1];
assertTrue("Wrong method selected", secondMethod.getParameterTypes()[0].contains("Bar"));
IMethod[] matchingMethods = Member.findMethods(secondMethod, interfaceType.getMethods());
assertArrayEquals(new IMethod[] { secondMethod }, matchingMethods);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

import org.eclipse.jdt.core.*;
import org.eclipse.jdt.core.compiler.CharOperation;
Expand Down Expand Up @@ -49,13 +50,26 @@ protected static boolean areSimilarMethods(
int params1Length = params1.length;
if (params1Length == params2.length) {
for (int i = 0; i < params1Length; i++) {
String simpleName1 =
simpleNames1 == null ?
Signature.getSimpleName(Signature.toString(Signature.getTypeErasure(params1[i]))) :
simpleNames1[i];
String simpleName2 = Signature.getSimpleName(Signature.toString(Signature.getTypeErasure(params2[i])));
if (!simpleName1.equals(simpleName2)) {
return false;
String typeErasureParam1Signature = Signature.getTypeErasure(params1[i]);
String typeErasureParam2Signature = Signature.getTypeErasure(params2[i]);
String param1Qualifier = Signature.getSignatureQualifier(typeErasureParam1Signature);
String param2Qualifier = Signature.getSignatureQualifier(typeErasureParam2Signature);
if (!param1Qualifier.isEmpty() && !param2Qualifier.isEmpty()) {
// both qualified -> compare qualified type
String qualifiedType1 = Signature.toString(typeErasureParam1Signature);
String qualifiedType2 = Signature.toString(typeErasureParam2Signature);
if (!Objects.equals(qualifiedType1, qualifiedType2)) {
return false;
}
} else { // at least 1 unqualified name -> only compare simple names
String simpleName1 =
simpleNames1 == null ?
Signature.getSimpleName(Signature.toString(typeErasureParam1Signature)) :
simpleNames1[i];
String simpleName2 = Signature.getSimpleName(Signature.toString(typeErasureParam2Signature));
if (!simpleName1.equals(simpleName2)) {
return false;
}
}
}
return true;
Expand Down

0 comments on commit 67e94ee

Please sign in to comment.