Extract Function: Support multiple output values

This commit is contained in:
Alexey Sedunov
2014-09-04 17:28:25 +04:00
parent 7a15a88288
commit 76433571f8
68 changed files with 1293 additions and 319 deletions
@@ -41,6 +41,11 @@ 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
import com.intellij.testFramework.LightPlatformTestCase
import org.jetbrains.jet.testing.ConfigLibraryUtil
import org.jetbrains.jet.plugin.PluginTestCaseBase
import org.jetbrains.jet.plugin.refactoring.extractFunction.ExtractionData
import org.jetbrains.jet.plugin.refactoring.extractFunction.ExtractionOptions
public abstract class AbstractJetExtractionTest() : JetLightCodeInsightFixtureTestCase() {
override fun getProjectDescriptor() = LightCodeInsightFixtureTestCase.JAVA_LATEST
@@ -76,19 +81,31 @@ public abstract class AbstractJetExtractionTest() : JetLightCodeInsightFixtureTe
}
)
val fileText = file.getText()
val fileText = file.getText() ?: ""
val expectedDescriptors =
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 extractionOptions = InTextDirectivesUtils.findListWithPrefixes(fileText, "// OPTIONS: ").let {
if (it.isNotEmpty()) {
[suppress("CAST_NEVER_SUCCEEDS")]
val args = it.map { it.toBoolean() }.copyToArray() as Array<Any?>
javaClass<ExtractionOptions>().getConstructors()[0].newInstance(*args) as ExtractionOptions
} else ExtractionOptions.DEFAULT
}
val renderer = DescriptorRenderer.DEBUG_TEXT
val editor = fixture.getEditor()
selectElements(editor, file) {(elements, previousSibling) ->
ExtractKotlinFunctionHandler(
helper = object : ExtractKotlinFunctionHandlerHelper() {
override fun adjustExtractionData(data: ExtractionData): ExtractionData {
return data.copy(options = extractionOptions)
}
override fun adjustGeneratorOptions(options: ExtractionGeneratorOptions): ExtractionGeneratorOptions {
return options.copy(extractAsProperty = extractAsProperty)
}
@@ -120,6 +137,10 @@ public abstract class AbstractJetExtractionTest() : JetLightCodeInsightFixtureTe
val file = fixture.configureByFile(mainFile.getName()) as JetFile
if (InTextDirectivesUtils.findStringWithPrefixes(file.getText(), "// WITH_RUNTIME") != null) {
ConfigLibraryUtil.configureKotlinRuntime(myModule, PluginTestCaseBase.fullJdk())
}
try {
action(file)
@@ -715,21 +715,69 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/refactoring/extractFunction/controlFlow/outputValues"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("multipleOutputValues.kt")
public void testMultipleOutputValues() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/outputValues/multipleOutputValues.kt");
@TestMetadata("genericPair.kt")
public void testGenericPair() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/outputValues/genericPair.kt");
doExtractFunctionTest(fileName);
}
@TestMetadata("multipleOutputValuesWithIf.kt")
public void testMultipleOutputValuesWithIf() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/outputValues/multipleOutputValuesWithIf.kt");
@TestMetadata("initializersAndUpdate.kt")
public void testInitializersAndUpdate() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/outputValues/initializersAndUpdate.kt");
doExtractFunctionTest(fileName);
}
@TestMetadata("multipleOutputValuesWithWhen.kt")
public void testMultipleOutputValuesWithWhen() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/outputValues/multipleOutputValuesWithWhen.kt");
@TestMetadata("nestedNonInlinableCall.kt")
public void testNestedNonInlinableCall() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/outputValues/nestedNonInlinableCall.kt");
doExtractFunctionTest(fileName);
}
@TestMetadata("outputValueWithExpression.kt")
public void testOutputValueWithExpression() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValueWithExpression.kt");
doExtractFunctionTest(fileName);
}
@TestMetadata("outputValueWithReturn.kt")
public void testOutputValueWithReturn() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValueWithReturn.kt");
doExtractFunctionTest(fileName);
}
@TestMetadata("outputValuesWithExpression.kt")
public void testOutputValuesWithExpression() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValuesWithExpression.kt");
doExtractFunctionTest(fileName);
}
@TestMetadata("pair.kt")
public void testPair() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/outputValues/pair.kt");
doExtractFunctionTest(fileName);
}
@TestMetadata("pairOfInitalizersWithNonLocalUsages.kt")
public void testPairOfInitalizersWithNonLocalUsages() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/outputValues/pairOfInitalizersWithNonLocalUsages.kt");
doExtractFunctionTest(fileName);
}
@TestMetadata("pairWithIf.kt")
public void testPairWithIf() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/outputValues/pairWithIf.kt");
doExtractFunctionTest(fileName);
}
@TestMetadata("pairWithNameClash.kt")
public void testPairWithNameClash() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/outputValues/pairWithNameClash.kt");
doExtractFunctionTest(fileName);
}
@TestMetadata("pairWithWhen.kt")
public void testPairWithWhen() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/outputValues/pairWithWhen.kt");
doExtractFunctionTest(fileName);
}
@@ -763,6 +811,30 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest {
doExtractFunctionTest(fileName);
}
@TestMetadata("tooManyOutputValues.kt")
public void testTooManyOutputValues() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/outputValues/tooManyOutputValues.kt");
doExtractFunctionTest(fileName);
}
@TestMetadata("tooManyOutputValuesAsList.kt")
public void testTooManyOutputValuesAsList() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/outputValues/tooManyOutputValuesAsList.kt");
doExtractFunctionTest(fileName);
}
@TestMetadata("triple.kt")
public void testTriple() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/outputValues/triple.kt");
doExtractFunctionTest(fileName);
}
@TestMetadata("usedAndUnusedOutputValues.kt")
public void testUsedAndUnusedOutputValues() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/outputValues/usedAndUnusedOutputValues.kt");
doExtractFunctionTest(fileName);
}
@TestMetadata("valuesUsedInLambdaOnly.kt")
public void testValuesUsedInLambdaOnly() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/outputValues/valuesUsedInLambdaOnly.kt");
@@ -849,12 +921,6 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest {
doExtractFunctionTest(fileName);
}
@TestMetadata("multipleInitalizersWithNonLocalUsages.kt")
public void testMultipleInitalizersWithNonLocalUsages() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/unextractable/multipleInitalizersWithNonLocalUsages.kt");
doExtractFunctionTest(fileName);
}
@TestMetadata("multipleJumps.kt")
public void testMultipleJumps() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/unextractable/multipleJumps.kt");
@@ -867,18 +933,6 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest {
doExtractFunctionTest(fileName);
}
@TestMetadata("outputValueWithExpression.kt")
public void testOutputValueWithExpression() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/unextractable/outputValueWithExpression.kt");
doExtractFunctionTest(fileName);
}
@TestMetadata("outputValueWithReturn.kt")
public void testOutputValueWithReturn() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/unextractable/outputValueWithReturn.kt");
doExtractFunctionTest(fileName);
}
@TestMetadata("variablesOutOfScope.kt")
public void testVariablesOutOfScope() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/controlFlow/unextractable/variablesOutOfScope.kt");