diff --git a/idea/testData/codeInsight/overrideImplement/complexMultiOverride.kt b/idea/testData/codeInsight/overrideImplement/complexMultiOverride.kt new file mode 100644 index 00000000000..ad0274b083d --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/complexMultiOverride.kt @@ -0,0 +1,9 @@ +open class Base() { + open val method : (A?) -> A = { it!! } + open fun foo(value : B) : B = value + open fun bar(value : () -> C) : (String) -> C = { value() } +} + +class C : Base() { + +} diff --git a/idea/testData/codeInsight/overrideImplement/complexMultiOverride.kt.after b/idea/testData/codeInsight/overrideImplement/complexMultiOverride.kt.after new file mode 100644 index 00000000000..db408631ed8 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/complexMultiOverride.kt.after @@ -0,0 +1,16 @@ +open class Base() { + open val method : (A?) -> A = { it!! } + open fun foo(value : B) : B = value + open fun bar(value : () -> C) : (String) -> C = { value() } +} + +class C : Base() { + + override fun bar(value : () -> Unit) : (String) -> Unit { + return super.bar(value) + } + override fun foo(value : C) : C { + return super.foo(value) + } + override val method : (String?) -> String = ? +} diff --git a/idea/testData/codeInsight/overrideImplement/functionProperty.kt b/idea/testData/codeInsight/overrideImplement/functionProperty.kt index c8adcbdfe9b..120b33b00d1 100644 --- a/idea/testData/codeInsight/overrideImplement/functionProperty.kt +++ b/idea/testData/codeInsight/overrideImplement/functionProperty.kt @@ -4,5 +4,5 @@ trait A { } fun some() : A { - return object A {} -} \ No newline at end of file + return object : A {} +} diff --git a/idea/testData/codeInsight/overrideImplement/functionProperty.kt.after b/idea/testData/codeInsight/overrideImplement/functionProperty.kt.after index 74d3266d01a..b95f8d72d9f 100644 --- a/idea/testData/codeInsight/overrideImplement/functionProperty.kt.after +++ b/idea/testData/codeInsight/overrideImplement/functionProperty.kt.after @@ -4,7 +4,7 @@ trait A { } fun some() : A { - return object A { + return object : A { override val method : () -> Unit? = ? } -} \ No newline at end of file +} diff --git a/idea/testData/codeInsight/overrideImplement/multiOverride.kt b/idea/testData/codeInsight/overrideImplement/multiOverride.kt new file mode 100644 index 00000000000..dfa8e828d09 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/multiOverride.kt @@ -0,0 +1,8 @@ +trait A { + fun foo(value : String) : Int = 0 + fun bar() : String = "hello" +} + +class C : A { + +} diff --git a/idea/testData/codeInsight/overrideImplement/multiOverride.kt.after b/idea/testData/codeInsight/overrideImplement/multiOverride.kt.after new file mode 100644 index 00000000000..f0b36d9c17c --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/multiOverride.kt.after @@ -0,0 +1,14 @@ +trait A { + fun foo(value : String) : Int = 0 + fun bar() : String = "hello" +} + +class C : A { + + override fun bar() : String { + return super.bar() + } + override fun foo(value : String) : Int { + return super.foo(value) + } +} diff --git a/idea/testData/codeInsight/overrideImplement/overrideFunctionProperty.kt b/idea/testData/codeInsight/overrideImplement/overrideFunctionProperty.kt new file mode 100644 index 00000000000..508e0d84fb8 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/overrideFunctionProperty.kt @@ -0,0 +1,7 @@ +open class A() { + open val method : () -> Unit? = {println("hello")} +} + +fun some() : A { + return object : A() {} +} diff --git a/idea/testData/codeInsight/overrideImplement/overrideFunctionProperty.kt.after b/idea/testData/codeInsight/overrideImplement/overrideFunctionProperty.kt.after new file mode 100644 index 00000000000..7f23763bfbb --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/overrideFunctionProperty.kt.after @@ -0,0 +1,9 @@ +open class A() { + open val method : () -> Unit? = {println("hello")} +} + +fun some() : A { + return object : A() { + override val method : () -> Unit? = ? + } +} diff --git a/idea/testData/codeInsight/overrideImplement/overrideGenericFunction.kt b/idea/testData/codeInsight/overrideImplement/overrideGenericFunction.kt new file mode 100644 index 00000000000..b659459316a --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/overrideGenericFunction.kt @@ -0,0 +1,7 @@ +trait A { + fun foo(value : T) : Unit = println(value) +} + +class C : A { + +} diff --git a/idea/testData/codeInsight/overrideImplement/overrideGenericFunction.kt.after b/idea/testData/codeInsight/overrideImplement/overrideGenericFunction.kt.after new file mode 100644 index 00000000000..d975c86a707 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/overrideGenericFunction.kt.after @@ -0,0 +1,10 @@ +trait A { + fun foo(value : T) : Unit = println(value) +} + +class C : A { + + override fun foo(value : C) { + super.foo(value) + } +} diff --git a/idea/testData/codeInsight/overrideImplement/overrideJavaMethod/foo/A.java b/idea/testData/codeInsight/overrideImplement/overrideJavaMethod/foo/A.java new file mode 100644 index 00000000000..fdd6435fe06 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/overrideJavaMethod/foo/A.java @@ -0,0 +1,23 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package foo; + +class A { + int getAnswer(String[] array, int number, Object value) { + return 42; + } +} diff --git a/idea/testData/codeInsight/overrideImplement/overrideJavaMethod/foo/Impl.kt b/idea/testData/codeInsight/overrideImplement/overrideJavaMethod/foo/Impl.kt new file mode 100644 index 00000000000..9c69e549ef2 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/overrideJavaMethod/foo/Impl.kt @@ -0,0 +1,5 @@ +import foo.A + +class C : A() { + +} diff --git a/idea/testData/codeInsight/overrideImplement/overrideJavaMethod/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/overrideJavaMethod/foo/Impl.kt.after new file mode 100644 index 00000000000..b7f2f9b943a --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/overrideJavaMethod/foo/Impl.kt.after @@ -0,0 +1,8 @@ +import foo.A + +class C : A() { + + override fun getAnswer(array : Array?, number : Int, value : Any?) : Int { + return super.getAnswer(array, number, value) + } +} diff --git a/idea/testData/codeInsight/overrideImplement/overrideNonUnitFunction.kt b/idea/testData/codeInsight/overrideImplement/overrideNonUnitFunction.kt new file mode 100644 index 00000000000..625bea2ea7f --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/overrideNonUnitFunction.kt @@ -0,0 +1,7 @@ +trait A { + fun foo(value : String) : Int = 0 +} + +class C : A { + +} diff --git a/idea/testData/codeInsight/overrideImplement/overrideNonUnitFunction.kt.after b/idea/testData/codeInsight/overrideImplement/overrideNonUnitFunction.kt.after new file mode 100644 index 00000000000..16529214f7d --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/overrideNonUnitFunction.kt.after @@ -0,0 +1,10 @@ +trait A { + fun foo(value : String) : Int = 0 +} + +class C : A { + + override fun foo(value : String) : Int { + return super.foo(value) + } +} diff --git a/idea/testData/codeInsight/overrideImplement/overrideRespectCaretPosition.kt b/idea/testData/codeInsight/overrideImplement/overrideRespectCaretPosition.kt new file mode 100644 index 00000000000..91b415ea32d --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/overrideRespectCaretPosition.kt @@ -0,0 +1,16 @@ +open class A() { + open fun foo(value : Int) : Unit = println(value) + open val bar : Int = 0 +} + +class C : A() { + val constant = 42 + // Some comment + + /* + Some another comment + */ + fun someAnotherFunction() { + + } +} diff --git a/idea/testData/codeInsight/overrideImplement/overrideRespectCaretPosition.kt.after b/idea/testData/codeInsight/overrideImplement/overrideRespectCaretPosition.kt.after new file mode 100644 index 00000000000..d57ab79081f --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/overrideRespectCaretPosition.kt.after @@ -0,0 +1,20 @@ +open class A() { + open fun foo(value : Int) : Unit = println(value) + open val bar : Int = 0 +} + +class C : A() { + val constant = 42 + // Some comment + override val bar : Int = 0 + override fun foo(value : Int) { + super.foo(value) + } + + /* + Some another comment + */ + fun someAnotherFunction() { + + } +} diff --git a/idea/testData/codeInsight/overrideImplement/overrideUnitFunction.kt b/idea/testData/codeInsight/overrideImplement/overrideUnitFunction.kt new file mode 100644 index 00000000000..60755b6601b --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/overrideUnitFunction.kt @@ -0,0 +1,7 @@ +trait A { + fun foo(value : String) : Unit = 0 +} + +class C : A { + +} diff --git a/idea/testData/codeInsight/overrideImplement/overrideUnitFunction.kt.after b/idea/testData/codeInsight/overrideImplement/overrideUnitFunction.kt.after new file mode 100644 index 00000000000..ddead6d200b --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/overrideUnitFunction.kt.after @@ -0,0 +1,10 @@ +trait A { + fun foo(value : String) : Unit = 0 +} + +class C : A { + + override fun foo(value : String) { + super.foo(value) + } +} diff --git a/idea/testData/codeInsight/overrideImplement/traitGenericOverride.kt b/idea/testData/codeInsight/overrideImplement/traitGenericImplement.kt similarity index 100% rename from idea/testData/codeInsight/overrideImplement/traitGenericOverride.kt rename to idea/testData/codeInsight/overrideImplement/traitGenericImplement.kt diff --git a/idea/testData/codeInsight/overrideImplement/traitGenericOverride.kt.after b/idea/testData/codeInsight/overrideImplement/traitGenericImplement.kt.after similarity index 100% rename from idea/testData/codeInsight/overrideImplement/traitGenericOverride.kt.after rename to idea/testData/codeInsight/overrideImplement/traitGenericImplement.kt.after diff --git a/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java b/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java index b25cbc8641f..947c1ed9f03 100644 --- a/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java @@ -35,6 +35,7 @@ import java.util.Set; /** * @author yole + * @author slukjanov aka Frostman */ public class OverrideImplementTest extends LightCodeInsightFixtureTestCase { @NotNull @@ -50,69 +51,125 @@ public class OverrideImplementTest extends LightCodeInsightFixtureTestCase { } public void testFunctionMethod() { - doFileTest(); + doImplementFileTest(); } public void testFunctionProperty() { - doFileTest(); + doImplementFileTest(); } public void testJavaInterfaceMethod() { - doDirectoryTest(); + doImplementDirectoryTest(); } public void testJavaParameters() { - doDirectoryTest(); + doImplementDirectoryTest(); } public void testGenericMethod() { - doFileTest(); + doImplementFileTest(); } public void testProperty() { - doFileTest(); + doImplementFileTest(); } - public void testTraitGenericOverride() { - doFileTest(); + public void testTraitGenericImplement() { + doImplementFileTest(); } public void testRespectCaretPosition() { - doMultiFileTest(); + doMultiImplementFileTest(); } public void testGenerateMulti() { - doMultiFileTest(); + doMultiImplementFileTest(); } public void testTraitNullableFunction() { - doFileTest(); + doImplementFileTest(); } - private void doFileTest() { + public void testOverrideUnitFunction() { + doOverrideFileTest(); + } + + public void testOverrideNonUnitFunction() { + doOverrideFileTest(); + } + + public void testOverrideFunctionProperty() { + doOverrideFileTest(); + } + + public void testOverrideGenericFunction() { + doOverrideFileTest(); + } + + public void testMultiOverride() { + doMultiOverrideFileTest(); + } + + public void testComplexMultiOverride() { + doMultiOverrideFileTest(); + } + + public void testOverrideRespectCaretPosition() { + doMultiOverrideFileTest(); + } + + public void testOverrideJavaMethod() { + doOverrideDirectoryTest(); + } + + private void doImplementFileTest() { + doFileTest(new ImplementMethodsHandler()); + } + + private void doOverrideFileTest() { + doFileTest(new OverrideMethodsHandler()); + } + + private void doMultiImplementFileTest() { + doMultiFileTest(new ImplementMethodsHandler()); + } + + private void doMultiOverrideFileTest() { + doMultiFileTest(new OverrideMethodsHandler()); + } + + private void doImplementDirectoryTest() { + doDirectoryTest(new ImplementMethodsHandler()); + } + + private void doOverrideDirectoryTest() { + doDirectoryTest(new OverrideMethodsHandler()); + } + + private void doFileTest(OverrideImplementMethodsHandler handler) { myFixture.configureByFile(getTestName(true) + ".kt"); - doImplement(); + doOverrideImplement(handler); myFixture.checkResultByFile(getTestName(true) + ".kt.after"); } - private void doMultiFileTest() { + private void doMultiFileTest(OverrideImplementMethodsHandler handler) { myFixture.configureByFile(getTestName(true) + ".kt"); - doMultiImplement(); + doMultiOverrideImplement(handler); myFixture.checkResultByFile(getTestName(true) + ".kt.after"); } - private void doDirectoryTest() { + private void doDirectoryTest(OverrideImplementMethodsHandler handler) { myFixture.copyDirectoryToProject(getTestName(true), ""); myFixture.configureFromTempProjectFile("foo/Impl.kt"); - doImplement(); + doOverrideImplement(handler); myFixture.checkResultByFile(getTestName(true) + "/foo/Impl.kt.after"); } - private void doImplement() { + private void doOverrideImplement(OverrideImplementMethodsHandler handler) { final PsiElement elementAtCaret = myFixture.getFile().findElementAt(myFixture.getEditor().getCaretModel().getOffset()); final JetClassOrObject classOrObject = PsiTreeUtil.getParentOfType(elementAtCaret, JetClassOrObject.class); assertNotNull("Caret should be inside class or object", classOrObject); - final Set descriptors = new ImplementMethodsHandler().collectMethodsToGenerate(classOrObject); + final Set descriptors = handler.collectMethodsToGenerate(classOrObject); assertEquals("Invalid number of available descriptors for override", 1, descriptors.size()); new WriteCommandAction(myFixture.getProject(), myFixture.getFile()) { @Override @@ -124,11 +181,11 @@ public class OverrideImplementTest extends LightCodeInsightFixtureTestCase { }.execute(); } - private void doMultiImplement() { + private void doMultiOverrideImplement(OverrideImplementMethodsHandler handler) { final PsiElement elementAtCaret = myFixture.getFile().findElementAt(myFixture.getEditor().getCaretModel().getOffset()); final JetClassOrObject classOrObject = PsiTreeUtil.getParentOfType(elementAtCaret, JetClassOrObject.class); assertNotNull("Caret should be inside class or object", classOrObject); - final Set descriptors = new ImplementMethodsHandler().collectMethodsToGenerate(classOrObject); + final Set descriptors = handler.collectMethodsToGenerate(classOrObject); final ArrayList descriptorsList = new ArrayList(descriptors); Collections.sort(descriptorsList, new Comparator() {