Extract Function: Support extraction of expressions in delegation

specifiers
This commit is contained in:
Alexey Sedunov
2014-06-27 20:41:08 +04:00
parent 1c75a5f642
commit 09a1a8ce8f
8 changed files with 77 additions and 3 deletions
@@ -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<JetDeclaration>(), 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
}
@@ -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>
@@ -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
}
@@ -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);