Extract Function: Allow to choose between function and property extraction

This commit is contained in:
Alexey Sedunov
2014-08-11 12:45:52 +04:00
parent 87de6cff23
commit 96dae07276
19 changed files with 314 additions and 100 deletions
@@ -38,6 +38,9 @@ import com.intellij.util.containers.ContainerUtil
import kotlin.test.assertEquals
import org.jetbrains.jet.plugin.JetLightCodeInsightFixtureTestCase
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
import org.jetbrains.jet.plugin.refactoring.extractFunction.ExtractKotlinFunctionHandlerHelper
import org.jetbrains.jet.plugin.refactoring.extractFunction.ExtractionGeneratorOptions
import org.jetbrains.jet.plugin.refactoring.extractFunction.ExtractableCodeDescriptor
public abstract class AbstractJetExtractionTest() : JetLightCodeInsightFixtureTestCase() {
override fun getProjectDescriptor() = LightCodeInsightFixtureTestCase.JAVA_LATEST
@@ -78,21 +81,32 @@ public abstract class AbstractJetExtractionTest() : JetLightCodeInsightFixtureTe
InTextDirectivesUtils.findLinesWithPrefixesRemoved(fileText, "// PARAM_DESCRIPTOR: ").joinToString()
val expectedTypes =
InTextDirectivesUtils.findLinesWithPrefixesRemoved(fileText, "// PARAM_TYPES: ").map { "[$it]" }.joinToString()
val extractAsProperty = InTextDirectivesUtils.isDirectiveDefined(fileText, "// EXTRACT_AS_PROPERTY")
val renderer = DescriptorRenderer.DEBUG_TEXT
val editor = fixture.getEditor()
selectElements(editor, file) { (elements, previousSibling) ->
ExtractKotlinFunctionHandler().doInvoke(editor, file, elements, explicitPreviousSibling ?: previousSibling) {
val allParameters = ContainerUtil.createMaybeSingletonList(it.receiverParameter) + it.parameters
val actualDescriptors = allParameters.map { renderer.render(it.originalDescriptor) }.joinToString()
val actualTypes = allParameters.map {
it.parameterTypeCandidates.map { renderer.renderType(it) }.joinToString(", ", "[", "]")
}.joinToString()
selectElements(editor, file) {(elements, previousSibling) ->
ExtractKotlinFunctionHandler(
helper = object : ExtractKotlinFunctionHandlerHelper() {
override fun adjustGeneratorOptions(options: ExtractionGeneratorOptions): ExtractionGeneratorOptions {
return options.copy(extractAsProperty = extractAsProperty)
}
assertEquals(expectedDescriptors, actualDescriptors, "Expected descriptors mismatch.")
assertEquals(expectedTypes, actualTypes, "Expected types mismatch.")
}
override fun adjustDescriptor(descriptor: ExtractableCodeDescriptor): ExtractableCodeDescriptor {
val allParameters = ContainerUtil.createMaybeSingletonList(descriptor.receiverParameter) + descriptor.parameters
val actualDescriptors = allParameters.map { renderer.render(it.originalDescriptor) }.joinToString()
val actualTypes = allParameters.map {
it.parameterTypeCandidates.map { renderer.renderType(it) }.joinToString(", ", "[", "]")
}.joinToString()
assertEquals(expectedDescriptors, actualDescriptors, "Expected descriptors mismatch.")
assertEquals(expectedTypes, actualTypes, "Expected types mismatch.")
return descriptor
}
}
).doInvoke(editor, file, elements, explicitPreviousSibling ?: previousSibling)
}
}
}
@@ -211,12 +211,40 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest {
}
@TestMetadata("idea/testData/refactoring/extractFunction")
@InnerTestClasses({ExtractFunction.Basic.class, ExtractFunction.ControlFlow.class, ExtractFunction.DefaultContainer.class, ExtractFunction.Delegation.class, ExtractFunction.Initializers.class, ExtractFunction.Parameters.class, ExtractFunction.TypeParameters.class})
@InnerTestClasses({ExtractFunction.AsProperty.class, 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);
}
@TestMetadata("idea/testData/refactoring/extractFunction/asProperty")
public static class AsProperty extends AbstractJetExtractionTest {
public void testAllFilesPresentInAsProperty() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/refactoring/extractFunction/asProperty"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("extractToClass.kt")
public void testExtractToClass() throws Exception {
doExtractFunctionTest("idea/testData/refactoring/extractFunction/asProperty/extractToClass.kt");
}
@TestMetadata("extractToFile.kt")
public void testExtractToFile() throws Exception {
doExtractFunctionTest("idea/testData/refactoring/extractFunction/asProperty/extractToFile.kt");
}
@TestMetadata("extractToFunction.kt")
public void testExtractToFunction() throws Exception {
doExtractFunctionTest("idea/testData/refactoring/extractFunction/asProperty/extractToFunction.kt");
}
@TestMetadata("extractWithParams.kt")
public void testExtractWithParams() throws Exception {
doExtractFunctionTest("idea/testData/refactoring/extractFunction/asProperty/extractWithParams.kt");
}
}
@TestMetadata("idea/testData/refactoring/extractFunction/basic")
public static class Basic extends AbstractJetExtractionTest {
public void testAllFilesPresentInBasic() throws Exception {
@@ -1311,6 +1339,7 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest {
public static Test innerSuite() {
TestSuite suite = new TestSuite("ExtractFunction");
suite.addTestSuite(ExtractFunction.class);
suite.addTestSuite(AsProperty.class);
suite.addTestSuite(Basic.class);
suite.addTest(ControlFlow.innerSuite());
suite.addTestSuite(DefaultContainer.class);