search for method implementations with correct substitutor

This commit is contained in:
Anna Kozlova
2015-02-20 22:03:19 +01:00
parent 9fc640a8f0
commit 81ed04a7dc
3 changed files with 40 additions and 1 deletions

View File

@@ -40,7 +40,9 @@ import com.intellij.openapi.ui.popup.PopupChooserBuilder;
import com.intellij.openapi.util.Computable;
import com.intellij.psi.*;
import com.intellij.psi.search.searches.ClassInheritorsSearch;
import com.intellij.psi.util.MethodSignatureUtil;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.ui.components.JBList;
import com.intellij.util.IncorrectOperationException;
@@ -180,7 +182,9 @@ public class ImplementAbstractMethodHandler {
ArrayList<PsiClass> list = new ArrayList<PsiClass>();
for (PsiClass inheritor : ClassInheritorsSearch.search(psiClass, true)) {
if (!inheritor.isInterface()) {
PsiMethod method = inheritor.findMethodBySignature(myMethod, true);
final PsiSubstitutor classSubstitutor = TypeConversionUtil.getClassSubstitutor(psiClass, inheritor, PsiSubstitutor.EMPTY);
LOG.assertTrue(classSubstitutor != null);
PsiMethod method = MethodSignatureUtil.findMethodBySignature(inheritor, myMethod.getSignature(classSubstitutor), true);
if (method == null || !method.getContainingClass().equals(psiClass)) continue;
list.add(inheritor);
}

View File

@@ -0,0 +1,20 @@
// "Implement method 'foo'" "true"
abstract class A<T> {
abstract String foo(T t);
}
class B extends A<String> {
@Override
String foo(String s1) {
return null;
}
}
class ABC extends A<Integer> {
@Override
String foo(Integer integer) {
return null;
}
}

View File

@@ -0,0 +1,15 @@
// "Implement method 'foo'" "true"
abstract class A<T> {
abstract String f<caret>oo(T t);
}
class B extends A<String> {
@Override
String foo(String s1) {
return null;
}
}
class ABC extends A<Integer> {}