diff --git a/java/java-impl/src/com/intellij/codeInsight/CodeInsightUtil.java b/java/java-impl/src/com/intellij/codeInsight/CodeInsightUtil.java index 38babdfc1f53..59b820e44cbd 100644 --- a/java/java-impl/src/com/intellij/codeInsight/CodeInsightUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/CodeInsightUtil.java @@ -366,6 +366,12 @@ public class CodeInsightUtil { for (PsiTypeParameter inheritorParameter : PsiUtil.typeParametersIterable(inheritor)) { for (PsiTypeParameter baseParameter : PsiUtil.typeParametersIterable(baseClass)) { final PsiType substituted = superSubstitutor.substitute(baseParameter); + PsiClass inheritorCandidateParameter = PsiUtil.resolveClassInType(substituted); + if (inheritorCandidateParameter instanceof PsiTypeParameter && + ((PsiTypeParameter)inheritorCandidateParameter).getOwner() == inheritor && + inheritorCandidateParameter != inheritorParameter) { + continue; + } PsiType arg = baseSubstitutor.substitute(baseParameter); if (arg instanceof PsiWildcardType) { PsiType bound = ((PsiWildcardType)arg).getBound(); @@ -376,7 +382,7 @@ public class CodeInsightUtil { arg, true, PsiUtil.getLanguageLevel(context)); - if (PsiType.NULL.equals(substitution) || substitution != null && substitution.equalsToText(CommonClassNames.JAVA_LANG_OBJECT) || substitution instanceof PsiWildcardType) continue; + if (PsiType.NULL.equals(substitution) || substitution instanceof PsiWildcardType) continue; if (substitution == null) { result.consume(createType(inheritor, facade.getElementFactory().createRawSubstitutor(inheritor), arrayDim)); return true; diff --git a/java/java-tests/testData/codeInsight/completion/smartType/InferredObjects.java b/java/java-tests/testData/codeInsight/completion/smartType/InferredObjects.java new file mode 100644 index 000000000000..80b40cd6a154 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/smartType/InferredObjects.java @@ -0,0 +1,7 @@ +class M {} +class HM extends M {} +class Foo { + { + M m = new + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartType18CompletionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartType18CompletionTest.java index ff29b8d4f58b..1e294fca1397 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartType18CompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartType18CompletionTest.java @@ -233,6 +233,11 @@ public void testConvertToObjectStream() { assertOrderedEquals(myFixture.getLookupElementStrings(), "get2"); } + public void testInferredObjects() { + configureByTestName(); + assertOrderedEquals(myFixture.getLookupElementStrings(), "M", "HM"); + } + public void testSuggestMapInheritors() { doTest(); } public void testUnboundTypeArgs() { doTest(); }