diff --git a/java/java-tests/testData/codeInsight/overrideImplement/ImplementedConstructorsExcluded.java b/java/java-tests/testData/codeInsight/overrideImplement/ImplementedConstructorsExcluded.java new file mode 100644 index 000000000000..90669650f2fb --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/ImplementedConstructorsExcluded.java @@ -0,0 +1,9 @@ +class A { + A() { } + A(String s) { } +} + +class B extends A { + B() { super(); } + +} diff --git a/java/java-tests/testData/codeInsight/overrideImplement/afterAnnotation.java b/java/java-tests/testData/codeInsight/overrideImplement/afterAnnotation.java new file mode 100644 index 000000000000..8016d8f8e61f --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/afterAnnotation.java @@ -0,0 +1,12 @@ +@interface ff{ + String f() default ""; +} +class d implements ff { + public String f() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + public Class annotationType() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } +} diff --git a/java/java-tests/testData/codeInsight/overrideImplement/afterClone.java b/java/java-tests/testData/codeInsight/overrideImplement/afterClone.java new file mode 100644 index 000000000000..26dc3b01cd08 --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/afterClone.java @@ -0,0 +1,12 @@ +class Gen { + protected Gen clone() { + return null; + } +} + +class X2 extends Gen { + @Override + protected Gen clone() { + return super.clone(); //To change body of overridden methods use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/overrideImplement/afterIncomplete.java b/java/java-tests/testData/codeInsight/overrideImplement/afterIncomplete.java new file mode 100644 index 000000000000..2fa121138200 --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/afterIncomplete.java @@ -0,0 +1,5 @@ +class S implements Runnable { + public void run() { + //To change body of implemented methods use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/overrideImplement/afterLongFinalParameterList.java b/java/java-tests/testData/codeInsight/overrideImplement/afterLongFinalParameterList.java new file mode 100644 index 000000000000..3b7a72724ab0 --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/afterLongFinalParameterList.java @@ -0,0 +1,16 @@ +public interface A { + void foo(String pppppppppppp1, String pppppppppppp2,String pppppppppppp3,String pppppppppppp4,String pppppppppppp5,String pppppppppppp6,String pppppppppppp7,String pppppppppppp8); +} + +abstract class B implements A{ + public void foo(final String pppppppppppp1, + final String pppppppppppp2, + final String pppppppppppp3, + final String pppppppppppp4, + final String pppppppppppp5, + final String pppppppppppp6, + final String pppppppppppp7, + final String pppppppppppp8) { + //To change body of implemented methods use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/overrideImplement/afterLongParameterList.java b/java/java-tests/testData/codeInsight/overrideImplement/afterLongParameterList.java new file mode 100644 index 000000000000..a7d899ac22d7 --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/afterLongParameterList.java @@ -0,0 +1,15 @@ +public interface A { + void foo(String p1, String p2,String p3,String p4,String p5,String p6,String p7); +} + +abstract class B implements A{ + public void foo(String p1, + String p2, + String p3, + String p4, + String p5, + String p6, + String p7) { + //To change body of implemented methods use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/overrideImplement/afterOnTheLineWithExistingExpression.java b/java/java-tests/testData/codeInsight/overrideImplement/afterOnTheLineWithExistingExpression.java new file mode 100644 index 000000000000..4a4e29890f1d --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/afterOnTheLineWithExistingExpression.java @@ -0,0 +1,12 @@ +abstract class Base { + void foo(){} +} + +class Sub extends Base { + int it; + + @Override + void foo() { + super.foo(); //To change body of overridden methods use File | Settings | File Templates. + } +} diff --git a/java/java-tests/testData/codeInsight/overrideImplement/afterSimple.java b/java/java-tests/testData/codeInsight/overrideImplement/afterSimple.java new file mode 100644 index 000000000000..304ee1017746 --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/afterSimple.java @@ -0,0 +1,10 @@ +abstract class IX { + void foo(){} +} + +class XXC extends IX { + @Override + void foo() { + super.foo(); //To change body of overridden methods use File | Settings | File Templates. + } +} diff --git a/java/java-tests/testData/codeInsight/overrideImplement/afterSubstitutionInTypeParametersList.java b/java/java-tests/testData/codeInsight/overrideImplement/afterSubstitutionInTypeParametersList.java new file mode 100644 index 000000000000..1cd672e15a67 --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/afterSubstitutionInTypeParametersList.java @@ -0,0 +1,10 @@ +abstract class IX { + abstract void foo(){} +} + +class XXC extends IX { + @Override + void foo() { + //To change body of implemented methods use File | Settings | File Templates. + } +} diff --git a/java/java-tests/testData/codeInsight/overrideImplement/afterTestMissed.java b/java/java-tests/testData/codeInsight/overrideImplement/afterTestMissed.java new file mode 100644 index 000000000000..e4fad9bee34d --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/afterTestMissed.java @@ -0,0 +1,11 @@ +class f{ + @org.testng.annotations.BeforeMethod + String foo() {return "";} +} + +class ff extends f { + @Override + String foo() { + return super.foo(); //To change body of overridden methods use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/overrideImplement/afterWildcard.java b/java/java-tests/testData/codeInsight/overrideImplement/afterWildcard.java new file mode 100644 index 000000000000..9c398383c995 --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/afterWildcard.java @@ -0,0 +1,9 @@ +interface Function { + R fun(S s); +} + +class Bar extends Function{ + public Object fun(String s) { + return null; //To change body of implemented methods use File | Settings | File Templates. + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/overrideImplement/beforeAnnotation.java b/java/java-tests/testData/codeInsight/overrideImplement/beforeAnnotation.java new file mode 100644 index 000000000000..83884ffad04b --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/beforeAnnotation.java @@ -0,0 +1,9 @@ +@interface ff{ + String f() default ""; +} +class d implements ff { + + public Class annotationType() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } +} diff --git a/java/java-tests/testData/codeInsight/overrideImplement/beforeClone.java b/java/java-tests/testData/codeInsight/overrideImplement/beforeClone.java new file mode 100644 index 000000000000..5bf63564fdca --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/beforeClone.java @@ -0,0 +1,9 @@ +class Gen { + protected Gen clone() { + return null; + } +} + +class X2 extends Gen { + +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/overrideImplement/beforeIncomplete.java b/java/java-tests/testData/codeInsight/overrideImplement/beforeIncomplete.java new file mode 100644 index 000000000000..1b10ffdb8a9b --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/beforeIncomplete.java @@ -0,0 +1 @@ +class S implements Runnable \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/overrideImplement/beforeLongFinalParameterList.java b/java/java-tests/testData/codeInsight/overrideImplement/beforeLongFinalParameterList.java new file mode 100644 index 000000000000..1b940e1a0869 --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/beforeLongFinalParameterList.java @@ -0,0 +1,7 @@ +public interface A { + void foo(String pppppppppppp1, String pppppppppppp2,String pppppppppppp3,String pppppppppppp4,String pppppppppppp5,String pppppppppppp6,String pppppppppppp7,String pppppppppppp8); +} + +abstract class B implements A{ + +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/overrideImplement/beforeLongParameterList.java b/java/java-tests/testData/codeInsight/overrideImplement/beforeLongParameterList.java new file mode 100644 index 000000000000..7e77ad9dfb9a --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/beforeLongParameterList.java @@ -0,0 +1,7 @@ +public interface A { + void foo(String p1, String p2,String p3,String p4,String p5,String p6,String p7); +} + +abstract class B implements A{ + +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/overrideImplement/beforeOnTheLineWithExistingExpression.java b/java/java-tests/testData/codeInsight/overrideImplement/beforeOnTheLineWithExistingExpression.java new file mode 100644 index 000000000000..1a7c6dca4945 --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/beforeOnTheLineWithExistingExpression.java @@ -0,0 +1,7 @@ +abstract class Base { + void foo(){} +} + +class Sub extends Base { + int it; +} diff --git a/java/java-tests/testData/codeInsight/overrideImplement/beforeSimple.java b/java/java-tests/testData/codeInsight/overrideImplement/beforeSimple.java new file mode 100644 index 000000000000..406ddfa08b2e --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/beforeSimple.java @@ -0,0 +1,7 @@ +abstract class IX { + void foo(){} +} + +class XXC extends IX { + +} diff --git a/java/java-tests/testData/codeInsight/overrideImplement/beforeSubstitutionInTypeParametersList.java b/java/java-tests/testData/codeInsight/overrideImplement/beforeSubstitutionInTypeParametersList.java new file mode 100644 index 000000000000..66f3d8ece993 --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/beforeSubstitutionInTypeParametersList.java @@ -0,0 +1,7 @@ +abstract class IX { + abstract void foo(){} +} + +class XXC extends IX { + +} diff --git a/java/java-tests/testData/codeInsight/overrideImplement/beforeTestMissed.java b/java/java-tests/testData/codeInsight/overrideImplement/beforeTestMissed.java new file mode 100644 index 000000000000..ba7012f494fb --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/beforeTestMissed.java @@ -0,0 +1,8 @@ +class f{ + @org.testng.annotations.BeforeMethod + String foo() {return "";} +} + +class ff extends f { + +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/overrideImplement/beforeWildcard.java b/java/java-tests/testData/codeInsight/overrideImplement/beforeWildcard.java new file mode 100644 index 000000000000..12f49d5b22e1 --- /dev/null +++ b/java/java-tests/testData/codeInsight/overrideImplement/beforeWildcard.java @@ -0,0 +1,7 @@ +interface Function { + R fun(S s); +} + +class Bar extends Function{ + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/OverrideImplementTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/OverrideImplementTest.java new file mode 100644 index 000000000000..5153cf9e0393 --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/codeInsight/OverrideImplementTest.java @@ -0,0 +1,118 @@ +package com.intellij.codeInsight; + +import com.intellij.codeInsight.generation.OverrideImplementUtil; +import com.intellij.codeInsight.generation.PsiMethodMember; +import com.intellij.lang.java.JavaLanguage; +import com.intellij.pom.java.LanguageLevel; +import com.intellij.psi.*; +import com.intellij.psi.codeStyle.CodeStyleSettings; +import com.intellij.psi.codeStyle.CodeStyleSettingsManager; +import com.intellij.psi.codeStyle.CommonCodeStyleSettings; +import com.intellij.psi.util.MethodSignature; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.TypeConversionUtil; +import com.intellij.testFramework.LightCodeInsightTestCase; +import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; + +import java.util.Collection; +import java.util.Collections; + +/** + * @author ven + */ +public class OverrideImplementTest extends LightCodeInsightTestCase { + @Override + protected void setUp() throws Exception { + super.setUp(); + setLanguageLevel(LanguageLevel.JDK_1_5); + } + + public void testSimple() throws Exception { doTest(true); } + public void testAnnotation() throws Exception { doTest(true); } + public void testIncomplete() throws Exception { doTest(false); } + public void testSubstitutionInTypeParametersList() throws Exception { doTest(false); } + public void testTestMissed() throws Exception { doTest(false); } + public void testWildcard() throws Exception { doTest(false); } + + public void testLongFinalParameterList() throws Exception { + CodeStyleSettings codeStyleSettings = CodeStyleSettingsManager.getSettings(getProject()).clone(); + + try { + CommonCodeStyleSettings javaSettings = codeStyleSettings.getCommonSettings(JavaLanguage.INSTANCE); + codeStyleSettings.RIGHT_MARGIN = 80; + javaSettings.KEEP_LINE_BREAKS = true; + codeStyleSettings.GENERATE_FINAL_PARAMETERS = true; + javaSettings.METHOD_PARAMETERS_WRAP = CommonCodeStyleSettings.WRAP_ON_EVERY_ITEM; + + CodeStyleSettingsManager.getInstance(getProject()).setTemporarySettings(codeStyleSettings); + + doTest(false); + } + finally { + CodeStyleSettingsManager.getInstance(getProject()).dropTemporarySettings(); + } + } + + public void testLongParameterList() throws Exception { + CodeStyleSettings codeStyleSettings = CodeStyleSettingsManager.getSettings(getProject()).clone(); + + try { + CommonCodeStyleSettings javaSettings = codeStyleSettings.getCommonSettings(JavaLanguage.INSTANCE); + codeStyleSettings.RIGHT_MARGIN = 80; + javaSettings.KEEP_LINE_BREAKS = false; + codeStyleSettings.GENERATE_FINAL_PARAMETERS = false; + javaSettings.METHOD_PARAMETERS_WRAP = CommonCodeStyleSettings.WRAP_ON_EVERY_ITEM; + CodeStyleSettingsManager.getInstance(getProject()).setTemporarySettings(codeStyleSettings); + + doTest(false); + } + finally { + CodeStyleSettingsManager.getInstance(getProject()).dropTemporarySettings(); + } + } + + public void testClone() throws Exception { + doTest(false); + } + + public void testOnTheLineWithExistingExpression() throws Exception { + doTest(false); + } + + public void testImplementedConstructorsExcluded() throws Exception { + String name = getTestName(false); + configureByFile("/codeInsight/overrideImplement/" + name + ".java"); + int offset = getEditor().getCaretModel().getOffset(); + PsiElement context = getFile().findElementAt(offset); + PsiClass psiClass = PsiTreeUtil.getParentOfType(context, PsiClass.class); + assert psiClass != null; + + final Collection signatures = OverrideImplementUtil.getMethodSignaturesToOverride(psiClass); + final Collection strings = ContainerUtil.map(signatures, new Function() { + public String fun(MethodSignature signature) { return signature.toString(); } + }); + + assertTrue(strings.toString(), strings.contains("HierarchicalMethodSignatureImpl: A([PsiType:String])")); + assertFalse(strings.toString(), strings.contains("HierarchicalMethodSignatureImpl: A([])")); + } + + private void doTest(boolean copyJavadoc) throws Exception { + String name = getTestName(false); + configureByFile("/codeInsight/overrideImplement/before" + name + ".java"); + int offset = getEditor().getCaretModel().getOffset(); + PsiElement context = getFile().findElementAt(offset); + PsiClass psiClass = PsiTreeUtil.getParentOfType(context, PsiClass.class); + assert psiClass != null; + PsiClassType[] implement = psiClass.getImplementsListTypes(); + final PsiClass superClass = implement.length == 0 ? psiClass.getSuperClass() : implement[0].resolve(); + assert superClass != null; + PsiMethod method = superClass.getMethods()[0]; + final PsiMethodMember member2Override = new PsiMethodMember(method, + TypeConversionUtil.getSuperClassSubstitutor(superClass, psiClass, + PsiSubstitutor.EMPTY)); + OverrideImplementUtil.overrideOrImplementMethodsInRightPlace(getEditor(), psiClass, Collections.singletonList(member2Override), + copyJavadoc, true); + checkResultByFile("/codeInsight/overrideImplement/after" + name + ".java"); + } +} \ No newline at end of file