Extract Function: Support extraction of expressions in delegation
specifiers
This commit is contained in:
+4
-2
@@ -65,6 +65,7 @@ import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.TraversalOrder
|
|||||||
import org.jetbrains.jet.lang.resolve.bindingContextUtil.getTargetFunctionDescriptor
|
import org.jetbrains.jet.lang.resolve.bindingContextUtil.getTargetFunctionDescriptor
|
||||||
import com.intellij.psi.PsiWhiteSpace
|
import com.intellij.psi.PsiWhiteSpace
|
||||||
import org.jetbrains.jet.lang.resolve.OverridingUtil
|
import org.jetbrains.jet.lang.resolve.OverridingUtil
|
||||||
|
import org.jetbrains.jet.lang.psi.psiUtil.isAncestor
|
||||||
import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils
|
import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils
|
||||||
|
|
||||||
private val DEFAULT_FUNCTION_NAME = "myFun"
|
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 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<JetDeclaration>(), true)
|
val enclosingDeclaration = commonParent.getParentByType(javaClass<JetDeclaration>(), true)
|
||||||
val bodyElement = when (enclosingDeclaration) {
|
val bodyElement = when (enclosingDeclaration) {
|
||||||
@@ -550,7 +551,8 @@ fun ExtractionData.performAnalysis(): AnalysisResult {
|
|||||||
is JetParameter -> enclosingDeclaration.getDefaultValue()
|
is JetParameter -> enclosingDeclaration.getDefaultValue()
|
||||||
is JetClassInitializer -> enclosingDeclaration.getBody()
|
is JetClassInitializer -> enclosingDeclaration.getBody()
|
||||||
is JetClass -> {
|
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
|
else -> return noContainerError
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(<selection>a + b</selection>, a - b)
|
||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
// PARAM_TYPES: T
|
||||||
|
trait T
|
||||||
|
|
||||||
|
class A(a: Int, b: Int): T
|
||||||
|
|
||||||
|
class B(t: T): T by <selection>t</selection>
|
||||||
+10
@@ -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
|
||||||
|
}
|
||||||
@@ -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(<selection>a + b</selection>, a - b)
|
||||||
@@ -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
|
||||||
|
}
|
||||||
+25
-1
@@ -208,7 +208,7 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("idea/testData/refactoring/extractFunction")
|
@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 static class ExtractFunction extends AbstractJetExtractionTest {
|
||||||
public void testAllFilesPresentInExtractFunction() throws Exception {
|
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);
|
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")
|
@TestMetadata("idea/testData/refactoring/extractFunction/initializers")
|
||||||
@InnerTestClasses({Initializers.Accessors.class, Initializers.Classes.class, Initializers.Functions.class, Initializers.Properties.class})
|
@InnerTestClasses({Initializers.Accessors.class, Initializers.Classes.class, Initializers.Functions.class, Initializers.Properties.class})
|
||||||
public static class Initializers extends AbstractJetExtractionTest {
|
public static class Initializers extends AbstractJetExtractionTest {
|
||||||
@@ -1204,6 +1227,7 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest {
|
|||||||
suite.addTestSuite(Basic.class);
|
suite.addTestSuite(Basic.class);
|
||||||
suite.addTest(ControlFlow.innerSuite());
|
suite.addTest(ControlFlow.innerSuite());
|
||||||
suite.addTestSuite(DefaultContainer.class);
|
suite.addTestSuite(DefaultContainer.class);
|
||||||
|
suite.addTestSuite(Delegation.class);
|
||||||
suite.addTest(Initializers.innerSuite());
|
suite.addTest(Initializers.innerSuite());
|
||||||
suite.addTest(Parameters.innerSuite());
|
suite.addTest(Parameters.innerSuite());
|
||||||
suite.addTestSuite(TypeParameters.class);
|
suite.addTestSuite(TypeParameters.class);
|
||||||
|
|||||||
Reference in New Issue
Block a user