diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java index 60a9855b45e9..800db37461d2 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java @@ -52,6 +52,7 @@ import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiFormatUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; +import com.intellij.psi.util.TypeConversionUtil; import com.intellij.psi.xml.XmlToken; import com.intellij.psi.xml.XmlTokenType; import com.intellij.util.IncorrectOperationException; @@ -510,8 +511,16 @@ public class JavaCompletionUtil { PsiType castType = castTypeItem.getPsiType(); if (plainQualifier instanceof PsiClassType && castType instanceof PsiClassType) { PsiMethod method = (PsiMethod)o; - PsiSubstitutor plainSub = ((PsiClassType)plainQualifier).resolveGenerics().getSubstitutor(); - PsiSubstitutor castSub = ((PsiClassType)castType).resolveGenerics().getSubstitutor(); + PsiClassType.ClassResolveResult plainResult = ((PsiClassType)plainQualifier).resolveGenerics(); + PsiClass plainClass = plainResult.getElement(); + PsiClass castClass = ((PsiClassType)castType).resolveGenerics().getElement(); + + if (castClass == null || plainClass == null || !castClass.isInheritor(plainClass, true)) { + return item; + } + + PsiSubstitutor plainSub = plainResult.getSubstitutor(); + PsiSubstitutor castSub = TypeConversionUtil.getSuperClassSubstitutor(plainClass, (PsiClassType)castType); if (method.getSignature(plainSub).equals(method.getSignature(castSub)) && plainSub.substitute(method.getReturnType()).equals(castSub.substitute(method.getReturnType()))) { return item; diff --git a/java/java-tests/testData/codeInsight/completion/normal/ListArrayListCast.java b/java/java-tests/testData/codeInsight/completion/normal/ListArrayListCast.java new file mode 100644 index 000000000000..d559cf0c9048 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/ListArrayListCast.java @@ -0,0 +1,10 @@ +import java.util.List; +import java.util.ArrayList; + +public class A { + void foo(List l) { + if (l instanceof ArrayList) { + l.ge + } + } +} diff --git a/java/java-tests/testData/codeInsight/completion/normal/ListArrayListCast_after.java b/java/java-tests/testData/codeInsight/completion/normal/ListArrayListCast_after.java new file mode 100644 index 000000000000..7c4d5a7faf0a --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/ListArrayListCast_after.java @@ -0,0 +1,10 @@ +import java.util.List; +import java.util.ArrayList; + +public class A { + void foo(List l) { + if (l instanceof ArrayList) { + l.get() + } + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy index fc87669f19bb..49f4a214442c 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy @@ -1324,4 +1324,6 @@ public class ListUtils { } + public void testListArrayListCast() { doTest('\n') } + }