From 6dddedeb396e615dcb18ac238154076260aedbdd Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 14 Jul 2015 20:41:15 +0300 Subject: [PATCH] override/implement: do not add type parameters from super method if supercalss was erased (IDEA-142453) --- .../codeInsight/generation/GenerateMembersUtil.java | 2 +- .../afterRawInheritanceWithMethodTypeParameters.java | 12 ++++++++++++ ...beforeRawInheritanceWithMethodTypeParameters.java | 9 +++++++++ .../codeInsight/OverrideImplement15Test.java | 5 ++++- 4 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/overrideImplement/afterRawInheritanceWithMethodTypeParameters.java create mode 100644 java/java-tests/testData/codeInsight/overrideImplement/beforeRawInheritanceWithMethodTypeParameters.java diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java index c511566d4757..e336657a7cfa 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java @@ -312,7 +312,7 @@ public class GenerateMembersUtil { @Nullable PsiTypeParameterList targetTypeParameterList, @NotNull PsiSubstitutor substitutor, @NotNull PsiMethod sourceMethod) { - if (sourceTypeParameterList == null || targetTypeParameterList == null) { + if (sourceTypeParameterList == null || targetTypeParameterList == null || PsiUtil.isRawSubstitutor(sourceMethod, substitutor)) { return substitutor; } diff --git a/java/java-tests/testData/codeInsight/overrideImplement/afterRawInheritanceWithMethodTypeParameters.java b/java/java-tests/testData/codeInsight/overrideImplement/afterRawInheritanceWithMethodTypeParameters.java new file mode 100644 index 000000000000..839cd4b89ebf --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/afterRawInheritanceWithMethodTypeParameters.java @@ -0,0 +1,12 @@ +class Foo { + S foo(T foo) { + return null; + } +} + +class Bar extends Foo { + @Override + Object foo(Object foo) { + return super.foo(foo); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/overrideImplement/beforeRawInheritanceWithMethodTypeParameters.java b/java/java-tests/testData/codeInsight/overrideImplement/beforeRawInheritanceWithMethodTypeParameters.java new file mode 100644 index 000000000000..727f5d56e538 --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/beforeRawInheritanceWithMethodTypeParameters.java @@ -0,0 +1,9 @@ +class Foo { + S foo(T foo) { + return null; + } +} + +class Bar extends Foo { + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/OverrideImplement15Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/OverrideImplement15Test.java index f0c40c723f11..eda785e6569b 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/OverrideImplement15Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/OverrideImplement15Test.java @@ -16,6 +16,7 @@ package com.intellij.codeInsight; import com.intellij.codeInsight.generation.JavaOverrideMethodsHandler; +import com.intellij.codeInsight.generation.OverrideImplementExploreUtil; import com.intellij.codeInsight.generation.OverrideImplementUtil; import com.intellij.codeInsight.generation.PsiMethodMember; import com.intellij.codeInsight.intention.impl.ImplementAbstractMethodHandler; @@ -68,6 +69,7 @@ public class OverrideImplement15Test extends LightCodeInsightTestCase { public void testMultipleInterfaceInheritance() { doTest(false); } public void testResolveTypeParamConflict() { doTest(false); } public void testRawInheritance() { doTest(false); } + public void testRawInheritanceWithMethodTypeParameters() { doTest(false); } public void testLongFinalParameterList() { CodeStyleSettings codeStyleSettings = CodeStyleSettingsManager.getSettings(getProject()).clone(); @@ -156,7 +158,8 @@ public class OverrideImplement15Test extends LightCodeInsightTestCase { assert superClass != null; PsiMethod method = superClass.getMethods()[0]; final PsiSubstitutor substitutor = TypeConversionUtil.getSuperClassSubstitutor(superClass, psiClass, PsiSubstitutor.EMPTY); - final List candidates = Collections.singletonList(new PsiMethodMember(method, substitutor)); + final List candidates = Collections.singletonList(new PsiMethodMember(method, + OverrideImplementExploreUtil.correctSubstitutor(method, substitutor))); OverrideImplementUtil.overrideOrImplementMethodsInRightPlace(getEditor(), psiClass, candidates, copyJavadoc, true); } else {