From 09a1a8ce8fbba6b7e52f8b09e93477805d409e68 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Fri, 27 Jun 2014 20:41:08 +0400 Subject: [PATCH] Extract Function: Support extraction of expressions in delegation specifiers --- .../extractFunction/extractFunctionUtils.kt | 6 +++-- .../delegation/delegationByExpression.kt | 7 +++++ .../delegationByExpression.kt.after | 11 ++++++++ .../delegation/delegationByExpressionFull.kt | 6 +++++ .../delegationByExpressionFull.kt.after | 10 +++++++ .../delegation/delegationBySuperCall.kt | 5 ++++ .../delegation/delegationBySuperCall.kt.after | 9 +++++++ .../JetExtractionTestGenerated.java | 26 ++++++++++++++++++- 8 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 idea/testData/refactoring/extractFunction/delegation/delegationByExpression.kt create mode 100644 idea/testData/refactoring/extractFunction/delegation/delegationByExpression.kt.after create mode 100644 idea/testData/refactoring/extractFunction/delegation/delegationByExpressionFull.kt create mode 100644 idea/testData/refactoring/extractFunction/delegation/delegationByExpressionFull.kt.after create mode 100644 idea/testData/refactoring/extractFunction/delegation/delegationBySuperCall.kt create mode 100644 idea/testData/refactoring/extractFunction/delegation/delegationBySuperCall.kt.after diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt index b69f076d462..ed26a90a33b 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt @@ -65,6 +65,7 @@ import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.TraversalOrder import org.jetbrains.jet.lang.resolve.bindingContextUtil.getTargetFunctionDescriptor import com.intellij.psi.PsiWhiteSpace import org.jetbrains.jet.lang.resolve.OverridingUtil +import org.jetbrains.jet.lang.psi.psiUtil.isAncestor import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils private val DEFAULT_FUNCTION_NAME = "myFun" @@ -541,7 +542,7 @@ fun ExtractionData.performAnalysis(): AnalysisResult { val noContainerError = AnalysisResult(null, Status.CRITICAL_ERROR, listOf(ErrorMessage.NO_CONTAINER)) - val commonParent = PsiTreeUtil.findCommonParent(originalElements)!! + val commonParent = PsiTreeUtil.findCommonParent(originalElements) as JetElement val enclosingDeclaration = commonParent.getParentByType(javaClass(), true) val bodyElement = when (enclosingDeclaration) { @@ -550,7 +551,8 @@ fun ExtractionData.performAnalysis(): AnalysisResult { is JetParameter -> enclosingDeclaration.getDefaultValue() is JetClassInitializer -> enclosingDeclaration.getBody() is JetClass -> { - if (commonParent.isInsideOf(enclosingDeclaration.getDelegationSpecifiers())) enclosingDeclaration else return noContainerError + val delegationSpecifierList = enclosingDeclaration.getDelegationSpecifierList() + if (delegationSpecifierList.isAncestor(commonParent)) commonParent else return noContainerError } else -> return noContainerError } diff --git a/idea/testData/refactoring/extractFunction/delegation/delegationByExpression.kt b/idea/testData/refactoring/extractFunction/delegation/delegationByExpression.kt new file mode 100644 index 00000000000..0157c97a732 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/delegation/delegationByExpression.kt @@ -0,0 +1,7 @@ +// PARAM_TYPES: kotlin.Int +// PARAM_TYPES: kotlin.Int +trait T + +class A(a: Int, b: Int): T + +class B(a: Int, b: Int): T by A(a + b, a - b) \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/delegation/delegationByExpression.kt.after b/idea/testData/refactoring/extractFunction/delegation/delegationByExpression.kt.after new file mode 100644 index 00000000000..11bd6aa9b8d --- /dev/null +++ b/idea/testData/refactoring/extractFunction/delegation/delegationByExpression.kt.after @@ -0,0 +1,11 @@ +// PARAM_TYPES: kotlin.Int +// PARAM_TYPES: kotlin.Int +trait T + +class A(a: Int, b: Int): T + +class B(a: Int, b: Int): T by A(i(a, b), a - b) + +fun i(a: Int, b: Int): Int { + return a + b +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/delegation/delegationByExpressionFull.kt b/idea/testData/refactoring/extractFunction/delegation/delegationByExpressionFull.kt new file mode 100644 index 00000000000..4a9bb6359eb --- /dev/null +++ b/idea/testData/refactoring/extractFunction/delegation/delegationByExpressionFull.kt @@ -0,0 +1,6 @@ +// PARAM_TYPES: T +trait T + +class A(a: Int, b: Int): T + +class B(t: T): T by t \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/delegation/delegationByExpressionFull.kt.after b/idea/testData/refactoring/extractFunction/delegation/delegationByExpressionFull.kt.after new file mode 100644 index 00000000000..5f2bb9a4f87 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/delegation/delegationByExpressionFull.kt.after @@ -0,0 +1,10 @@ +// PARAM_TYPES: T +trait T + +class A(a: Int, b: Int): T + +class B(t: T): T by t(t) + +fun t(t: T): T { + return t +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/delegation/delegationBySuperCall.kt b/idea/testData/refactoring/extractFunction/delegation/delegationBySuperCall.kt new file mode 100644 index 00000000000..08d2d0ce774 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/delegation/delegationBySuperCall.kt @@ -0,0 +1,5 @@ +// PARAM_TYPES: kotlin.Int +// PARAM_TYPES: kotlin.Int +open class A(a: Int, b: Int) + +class B(a: Int, b: Int): A(a + b, a - b) \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/delegation/delegationBySuperCall.kt.after b/idea/testData/refactoring/extractFunction/delegation/delegationBySuperCall.kt.after new file mode 100644 index 00000000000..00097639f37 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/delegation/delegationBySuperCall.kt.after @@ -0,0 +1,9 @@ +// PARAM_TYPES: kotlin.Int +// PARAM_TYPES: kotlin.Int +open class A(a: Int, b: Int) + +class B(a: Int, b: Int): A(i(a, b), a - b) + +fun i(a: Int, b: Int): Int { + return a + b +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java index 86b51e1f2c6..8d9e8f1bcdd 100644 --- a/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java @@ -208,7 +208,7 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { } @TestMetadata("idea/testData/refactoring/extractFunction") - @InnerTestClasses({ExtractFunction.Basic.class, ExtractFunction.ControlFlow.class, ExtractFunction.DefaultContainer.class, ExtractFunction.Initializers.class, ExtractFunction.Parameters.class, ExtractFunction.TypeParameters.class}) + @InnerTestClasses({ExtractFunction.Basic.class, ExtractFunction.ControlFlow.class, ExtractFunction.DefaultContainer.class, ExtractFunction.Delegation.class, ExtractFunction.Initializers.class, ExtractFunction.Parameters.class, ExtractFunction.TypeParameters.class}) public static class ExtractFunction extends AbstractJetExtractionTest { public void testAllFilesPresentInExtractFunction() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/refactoring/extractFunction"), Pattern.compile("^(.+)\\.kt$"), true); @@ -687,6 +687,29 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { } + @TestMetadata("idea/testData/refactoring/extractFunction/delegation") + public static class Delegation extends AbstractJetExtractionTest { + public void testAllFilesPresentInDelegation() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/refactoring/extractFunction/delegation"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("delegationByExpression.kt") + public void testDelegationByExpression() throws Exception { + doExtractFunctionTest("idea/testData/refactoring/extractFunction/delegation/delegationByExpression.kt"); + } + + @TestMetadata("delegationByExpressionFull.kt") + public void testDelegationByExpressionFull() throws Exception { + doExtractFunctionTest("idea/testData/refactoring/extractFunction/delegation/delegationByExpressionFull.kt"); + } + + @TestMetadata("delegationBySuperCall.kt") + public void testDelegationBySuperCall() throws Exception { + doExtractFunctionTest("idea/testData/refactoring/extractFunction/delegation/delegationBySuperCall.kt"); + } + + } + @TestMetadata("idea/testData/refactoring/extractFunction/initializers") @InnerTestClasses({Initializers.Accessors.class, Initializers.Classes.class, Initializers.Functions.class, Initializers.Properties.class}) public static class Initializers extends AbstractJetExtractionTest { @@ -1204,6 +1227,7 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { suite.addTestSuite(Basic.class); suite.addTest(ControlFlow.innerSuite()); suite.addTestSuite(DefaultContainer.class); + suite.addTestSuite(Delegation.class); suite.addTest(Initializers.innerSuite()); suite.addTest(Parameters.innerSuite()); suite.addTestSuite(TypeParameters.class);