diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/extractFunctionForDebuggerUtil.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/extractFunctionForDebuggerUtil.kt index feba97a8050..0f0ae148eba 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/extractFunctionForDebuggerUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/evaluate/extractFunctionForDebuggerUtil.kt @@ -103,7 +103,7 @@ fun getFunctionForExtractedFragment( val config = ExtractionGeneratorConfiguration( validationResult.descriptor, - ExtractionGeneratorOptions(inTempFile = true, flexibleTypesAllowed = true) + ExtractionGeneratorOptions(inTempFile = true, flexibleTypesAllowed = true, allowDummyName = true) ) return config.generateDeclaration() } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractFunction/ui/KotlinExtractFunctionDialog.form b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractFunction/ui/KotlinExtractFunctionDialog.form index 8ee1995b941..9aeb9a38b53 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractFunction/ui/KotlinExtractFunctionDialog.form +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractFunction/ui/KotlinExtractFunctionDialog.form @@ -99,14 +99,16 @@ - + - + + + diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractFunction/ui/KotlinExtractFunctionDialog.java b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractFunction/ui/KotlinExtractFunctionDialog.java index 1fe0ffe0765..63d7dd608e1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractFunction/ui/KotlinExtractFunctionDialog.java +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractFunction/ui/KotlinExtractFunctionDialog.java @@ -16,19 +16,19 @@ package org.jetbrains.kotlin.idea.refactoring.introduce.extractFunction.ui; -import com.intellij.openapi.editor.event.DocumentAdapter; -import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.psi.PsiElement; -import com.intellij.ui.EditorTextField; +import com.intellij.refactoring.ui.NameSuggestionsField; import com.intellij.ui.TitledSeparator; +import com.intellij.util.ArrayUtil; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.MultiMap; import kotlin.Function0; import kotlin.Function1; import kotlin.Unit; import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.idea.JetFileType; import org.jetbrains.kotlin.idea.refactoring.JetNameSuggester; import org.jetbrains.kotlin.idea.refactoring.JetRefactoringBundle; import org.jetbrains.kotlin.idea.refactoring.RefactoringPackage; @@ -36,6 +36,7 @@ import org.jetbrains.kotlin.idea.refactoring.introduce.extractionEngine.*; import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers; import javax.swing.*; +import java.awt.*; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.ArrayList; @@ -48,7 +49,8 @@ public class KotlinExtractFunctionDialog extends DialogWrapper { private TitledSeparator inputParametersPanel; private JComboBox visibilityBox; private KotlinFunctionSignatureComponent signaturePreviewField; - private EditorTextField functionNameField; + private JPanel functionNamePanel; + private NameSuggestionsField functionNameField; private JLabel functionNameLabel; private KotlinParameterTablePanel parameterTablePanel; @@ -85,7 +87,7 @@ public class KotlinExtractFunctionDialog extends DialogWrapper { } private String getFunctionName() { - return functionNameField.getText(); + return functionNameField.getEnteredName(); } private String getVisibility() { @@ -118,17 +120,21 @@ public class KotlinExtractFunctionDialog extends DialogWrapper { protected void init() { super.init(); - functionNameLabel.setLabelFor(functionNameField); - - functionNameField.setText(originalDescriptor.getDescriptor().getName()); - functionNameField.addDocumentListener( - new DocumentAdapter() { + functionNameField = new NameSuggestionsField( + ArrayUtil.toStringArray(originalDescriptor.getDescriptor().getSuggestedNames()), + project, + JetFileType.INSTANCE + ); + functionNameField.addDataChangedListener( + new NameSuggestionsField.DataChanged() { @Override - public void documentChanged(DocumentEvent event) { + public void dataChanged() { update(); } } ); + functionNamePanel.add(functionNameField, BorderLayout.CENTER); + functionNameLabel.setLabelFor(functionNameField); boolean enableVisibility = isVisibilitySectionAvailable(); visibilityBox.setEnabled(enableVisibility); diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractableCodeDescriptor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractableCodeDescriptor.kt index ecc7880aa54..1472c8fc85b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractableCodeDescriptor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractableCodeDescriptor.kt @@ -363,7 +363,8 @@ val propertyTargets: List = listOf(ExtractionTarget.PROPERTY_W data class ExtractionGeneratorOptions( val inTempFile: Boolean = false, val target: ExtractionTarget = ExtractionTarget.FUNCTION, - val flexibleTypesAllowed: Boolean = false + val flexibleTypesAllowed: Boolean = false, + val allowDummyName: Boolean = false ) { default object { val DEFAULT = ExtractionGeneratorOptions() diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractableAnalysisUtil.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractableAnalysisUtil.kt index d33358bc7bc..2b224e40f9d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractableAnalysisUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractableAnalysisUtil.kt @@ -72,8 +72,8 @@ import org.jetbrains.kotlin.resolve.calls.callUtil.* import org.jetbrains.kotlin.diagnostics.* import java.util.logging.* import com.intellij.openapi.diagnostic.Logger +import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypeAndBranch -private val DEFAULT_FUNCTION_NAME = "myFun" private val DEFAULT_RETURN_TYPE = KotlinBuiltIns.getInstance().getUnitType() private val DEFAULT_PARAMETER_TYPE = KotlinBuiltIns.getInstance().getNullableAnyType() @@ -804,19 +804,6 @@ fun ExtractionData.performAnalysis(): AnalysisResult { val enclosingDeclaration = commonParent.getStrictParentOfType()!! checkDeclarationsMovingOutOfScope(enclosingDeclaration, controlFlow, bindingContext)?.let { messages.add(it) } - val functionNameValidator = - JetNameValidatorImpl( - targetSibling.getParent(), - if (targetSibling is JetClassInitializer) targetSibling.getParent() else targetSibling, - if (options.extractAsProperty) JetNameValidatorImpl.Target.PROPERTIES else JetNameValidatorImpl.Target.FUNCTIONS_AND_CLASSES - ) - val functionNames = if (returnType.isDefault()) { - Collections.emptyList() - } - else { - JetNameSuggester.suggestNames(returnType, functionNameValidator, DEFAULT_FUNCTION_NAME).toList() - } - controlFlow.jumpOutputValue?.elementToInsertAfterCall?.accept( object : JetTreeVisitorVoid() { override fun visitSimpleNameExpression(expression: JetSimpleNameExpression) { @@ -834,7 +821,7 @@ fun ExtractionData.performAnalysis(): AnalysisResult { ExtractableCodeDescriptor( this, bindingContext, - functionNames, + suggestFunctionNames(returnType), getDefaultVisibility(), adjustedParameters.sortBy { it.name }, receiverParameter, @@ -847,6 +834,29 @@ fun ExtractionData.performAnalysis(): AnalysisResult { ) } +private fun ExtractionData.suggestFunctionNames(returnType: JetType): List { + val functionNames = LinkedHashSet() + + val validator = + JetNameValidatorImpl( + targetSibling.getParent(), + if (targetSibling is JetClassInitializer) targetSibling.getParent() else targetSibling, + if (options.extractAsProperty) JetNameValidatorImpl.Target.PROPERTIES else JetNameValidatorImpl.Target.FUNCTIONS_AND_CLASSES + ) + if (!returnType.isDefault()) { + functionNames.addAll(JetNameSuggester.suggestNamesForType(returnType, validator)) + } + + getExpressions().singleOrNull()?.let { expr -> + val property = expr.getStrictParentOfType() + if (property?.getInitializer() == expr) { + property?.getName()?.let { functionNames.add(validator.validateName("get" + it.capitalize())) } + } + } + + return functionNames.toList() +} + private fun JetNamedDeclaration.getGeneratedBody() = when (this) { is JetNamedFunction -> getBodyExpression() diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractorUtil.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractorUtil.kt index 382b88718b2..675310521a1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractorUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractorUtil.kt @@ -90,7 +90,7 @@ fun ExtractionGeneratorConfiguration.getDeclarationText( builder.receiver(it.getParameterType(descriptor.extractionData.options.allowSpecialClassNames).typeAsString()) } - builder.name(if (descriptor.name != "") descriptor.name else DEFAULT_FUNCTION_NAME) + builder.name(if (descriptor.name == "" && generatorOptions.allowDummyName) "myFun" else descriptor.name) descriptor.parameters.forEach { parameter -> builder.param(parameter.name, diff --git a/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValueWithExpression.kt b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValueWithExpression.kt index f99364a56a4..72926f99601 100644 --- a/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValueWithExpression.kt +++ b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValueWithExpression.kt @@ -1,4 +1,5 @@ // WITH_RUNTIME +// SUGGESTED_NAMES: pair, getT // PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int // PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo diff --git a/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValueWithExpression.kt.after b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValueWithExpression.kt.after index 83c536c67f6..5e3ad3d9ff9 100644 --- a/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValueWithExpression.kt.after +++ b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValueWithExpression.kt.after @@ -1,4 +1,5 @@ // WITH_RUNTIME +// SUGGESTED_NAMES: pair, getT // PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int // PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo diff --git a/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValueWithSingleLineExpression.kt b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValueWithSingleLineExpression.kt index dceab27b2df..b060c44b4cc 100644 --- a/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValueWithSingleLineExpression.kt +++ b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValueWithSingleLineExpression.kt @@ -1,3 +1,4 @@ +// SUGGESTED_NAMES: pair, getT // WITH_RUNTIME // PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int diff --git a/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValueWithSingleLineExpression.kt.after b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValueWithSingleLineExpression.kt.after index 58eda2ca8d1..ee0dbe9ac7c 100644 --- a/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValueWithSingleLineExpression.kt.after +++ b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValueWithSingleLineExpression.kt.after @@ -1,3 +1,4 @@ +// SUGGESTED_NAMES: pair, getT // WITH_RUNTIME // PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int diff --git a/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValuesWithExpression.kt b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValuesWithExpression.kt index 4a264a7a773..107ea59a6c0 100644 --- a/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValuesWithExpression.kt +++ b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValuesWithExpression.kt @@ -1,4 +1,5 @@ // WITH_RUNTIME +// SUGGESTED_NAMES: triple, getT // PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int diff --git a/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValuesWithExpression.kt.after b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValuesWithExpression.kt.after index e648f946624..ce00ee1b370 100644 --- a/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValuesWithExpression.kt.after +++ b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/outputValuesWithExpression.kt.after @@ -1,4 +1,5 @@ // WITH_RUNTIME +// SUGGESTED_NAMES: triple, getT // PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int diff --git a/idea/testData/refactoring/extractFunction/controlFlow/throws/evalExpressionWithThrow.kt b/idea/testData/refactoring/extractFunction/controlFlow/throws/evalExpressionWithThrow.kt index 582d835301d..ffb9e3fd745 100644 --- a/idea/testData/refactoring/extractFunction/controlFlow/throws/evalExpressionWithThrow.kt +++ b/idea/testData/refactoring/extractFunction/controlFlow/throws/evalExpressionWithThrow.kt @@ -1,3 +1,4 @@ +// SUGGESTED_NAMES: i, getT // PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int // PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo diff --git a/idea/testData/refactoring/extractFunction/controlFlow/throws/evalExpressionWithThrow.kt.after b/idea/testData/refactoring/extractFunction/controlFlow/throws/evalExpressionWithThrow.kt.after index 28d8f02f08f..bf472a990f1 100644 --- a/idea/testData/refactoring/extractFunction/controlFlow/throws/evalExpressionWithThrow.kt.after +++ b/idea/testData/refactoring/extractFunction/controlFlow/throws/evalExpressionWithThrow.kt.after @@ -1,3 +1,4 @@ +// SUGGESTED_NAMES: i, getT // PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int // PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo diff --git a/idea/testData/refactoring/extractFunction/duplicates/branchingMatch1.kt b/idea/testData/refactoring/extractFunction/duplicates/branchingMatch1.kt index 0283a436a13..9edd990a2e2 100644 --- a/idea/testData/refactoring/extractFunction/duplicates/branchingMatch1.kt +++ b/idea/testData/refactoring/extractFunction/duplicates/branchingMatch1.kt @@ -1,4 +1,5 @@ // WITH_RUNTIME +// SUGGESTED_NAMES: i, getT // PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int // PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in test diff --git a/idea/testData/refactoring/extractFunction/duplicates/branchingMatch1.kt.after b/idea/testData/refactoring/extractFunction/duplicates/branchingMatch1.kt.after index ec442991a57..dff6bae9cfc 100644 --- a/idea/testData/refactoring/extractFunction/duplicates/branchingMatch1.kt.after +++ b/idea/testData/refactoring/extractFunction/duplicates/branchingMatch1.kt.after @@ -1,4 +1,5 @@ // WITH_RUNTIME +// SUGGESTED_NAMES: i, getT // PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int // PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in test diff --git a/idea/testData/refactoring/extractFunction/duplicates/insertAfterDuplicates.kt b/idea/testData/refactoring/extractFunction/duplicates/insertAfterDuplicates.kt index f04c2f54c86..5ba380b697e 100644 --- a/idea/testData/refactoring/extractFunction/duplicates/insertAfterDuplicates.kt +++ b/idea/testData/refactoring/extractFunction/duplicates/insertAfterDuplicates.kt @@ -1,3 +1,4 @@ +// SUGGESTED_NAMES: i, getX class A { val x = 1 + 1 val y = 1 + 1 diff --git a/idea/testData/refactoring/extractFunction/duplicates/insertAfterDuplicates.kt.after b/idea/testData/refactoring/extractFunction/duplicates/insertAfterDuplicates.kt.after index 0a6e62dc762..803c3b4cb5d 100644 --- a/idea/testData/refactoring/extractFunction/duplicates/insertAfterDuplicates.kt.after +++ b/idea/testData/refactoring/extractFunction/duplicates/insertAfterDuplicates.kt.after @@ -1,3 +1,4 @@ +// SUGGESTED_NAMES: i, getX class A { val x = i() val y = i() diff --git a/idea/testData/refactoring/extractFunction/duplicates/insertBeforeDuplicates.kt b/idea/testData/refactoring/extractFunction/duplicates/insertBeforeDuplicates.kt index 94919a9e38d..4bbcd843f63 100644 --- a/idea/testData/refactoring/extractFunction/duplicates/insertBeforeDuplicates.kt +++ b/idea/testData/refactoring/extractFunction/duplicates/insertBeforeDuplicates.kt @@ -1,3 +1,4 @@ +// SUGGESTED_NAMES: i, getY fun foo() { val x = 1 + 1 val y = 1 + 1 diff --git a/idea/testData/refactoring/extractFunction/duplicates/insertBeforeDuplicates.kt.after b/idea/testData/refactoring/extractFunction/duplicates/insertBeforeDuplicates.kt.after index ec6be0d48af..73471d54810 100644 --- a/idea/testData/refactoring/extractFunction/duplicates/insertBeforeDuplicates.kt.after +++ b/idea/testData/refactoring/extractFunction/duplicates/insertBeforeDuplicates.kt.after @@ -1,3 +1,4 @@ +// SUGGESTED_NAMES: i, getY fun foo() { val x = i() val y = i() diff --git a/idea/testData/refactoring/extractFunction/duplicates/nestedStrongMatch.kt b/idea/testData/refactoring/extractFunction/duplicates/nestedStrongMatch.kt index 6a5df23232f..5f488a2afcb 100644 --- a/idea/testData/refactoring/extractFunction/duplicates/nestedStrongMatch.kt +++ b/idea/testData/refactoring/extractFunction/duplicates/nestedStrongMatch.kt @@ -1,3 +1,4 @@ +// SUGGESTED_NAMES: i, getY // SIBLING: fun main(args: Array) { val x = 1 + 1 diff --git a/idea/testData/refactoring/extractFunction/duplicates/nestedStrongMatch.kt.after b/idea/testData/refactoring/extractFunction/duplicates/nestedStrongMatch.kt.after index 9f6cf9ef4ed..848ec41d86f 100644 --- a/idea/testData/refactoring/extractFunction/duplicates/nestedStrongMatch.kt.after +++ b/idea/testData/refactoring/extractFunction/duplicates/nestedStrongMatch.kt.after @@ -1,3 +1,4 @@ +// SUGGESTED_NAMES: i, getY // SIBLING: fun main(args: Array) { val x = i() diff --git a/idea/testData/refactoring/extractFunction/parameters/candidateTypes/flexibleTypesWithNull.kt b/idea/testData/refactoring/extractFunction/parameters/candidateTypes/flexibleTypesWithNull.kt index 1e522fabc5d..ae641c2ad01 100644 --- a/idea/testData/refactoring/extractFunction/parameters/candidateTypes/flexibleTypesWithNull.kt +++ b/idea/testData/refactoring/extractFunction/parameters/candidateTypes/flexibleTypesWithNull.kt @@ -1,4 +1,5 @@ // WITH_RUNTIME +// SUGGESTED_NAMES: i, getN // PARAM_TYPES: String?, String, kotlin.CharSequence?, CharSequence // PARAM_DESCRIPTOR: val property: (String..String?) defined in test fun test() { diff --git a/idea/testData/refactoring/extractFunction/parameters/candidateTypes/flexibleTypesWithNull.kt.after b/idea/testData/refactoring/extractFunction/parameters/candidateTypes/flexibleTypesWithNull.kt.after index c937a1cf21d..c2e5bc1ee69 100644 --- a/idea/testData/refactoring/extractFunction/parameters/candidateTypes/flexibleTypesWithNull.kt.after +++ b/idea/testData/refactoring/extractFunction/parameters/candidateTypes/flexibleTypesWithNull.kt.after @@ -1,4 +1,5 @@ // WITH_RUNTIME +// SUGGESTED_NAMES: i, getN // PARAM_TYPES: String?, String, kotlin.CharSequence?, CharSequence // PARAM_DESCRIPTOR: val property: (String..String?) defined in test fun test() { diff --git a/idea/testData/refactoring/extractFunction/parameters/candidateTypes/flexibleTypesWithoutNull.kt b/idea/testData/refactoring/extractFunction/parameters/candidateTypes/flexibleTypesWithoutNull.kt index e95f1420d5e..6130d9bf142 100644 --- a/idea/testData/refactoring/extractFunction/parameters/candidateTypes/flexibleTypesWithoutNull.kt +++ b/idea/testData/refactoring/extractFunction/parameters/candidateTypes/flexibleTypesWithoutNull.kt @@ -1,4 +1,5 @@ // WITH_RUNTIME +// SUGGESTED_NAMES: i, getN // PARAM_TYPES: String, CharSequence // PARAM_DESCRIPTOR: val property: (String..String?) defined in test fun test() { diff --git a/idea/testData/refactoring/extractFunction/parameters/candidateTypes/flexibleTypesWithoutNull.kt.after b/idea/testData/refactoring/extractFunction/parameters/candidateTypes/flexibleTypesWithoutNull.kt.after index e5d8c2e4f9f..7764b89d20a 100644 --- a/idea/testData/refactoring/extractFunction/parameters/candidateTypes/flexibleTypesWithoutNull.kt.after +++ b/idea/testData/refactoring/extractFunction/parameters/candidateTypes/flexibleTypesWithoutNull.kt.after @@ -1,4 +1,5 @@ // WITH_RUNTIME +// SUGGESTED_NAMES: i, getN // PARAM_TYPES: String, CharSequence // PARAM_DESCRIPTOR: val property: (String..String?) defined in test fun test() { diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/AbstractJetExtractionTest.kt b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/AbstractJetExtractionTest.kt index 867b10e9666..701e7412462 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/AbstractJetExtractionTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/AbstractJetExtractionTest.kt @@ -110,6 +110,7 @@ public abstract class AbstractJetExtractionTest() : JetLightCodeInsightFixtureTe ) val fileText = file.getText() ?: "" + val expectedNames = InTextDirectivesUtils.findListWithPrefixes(fileText, "// SUGGESTED_NAMES: ") val expectedDescriptors = InTextDirectivesUtils.findLinesWithPrefixesRemoved(fileText, "// PARAM_DESCRIPTOR: ").joinToString() val expectedTypes = @@ -136,12 +137,16 @@ public abstract class AbstractJetExtractionTest() : JetLightCodeInsightFixtureTe descriptor: ExtractableCodeDescriptor, generatorOptions: ExtractionGeneratorOptions ): ExtractionGeneratorConfiguration { + val actualNames = descriptor.suggestedNames val allParameters = emptyOrSingletonList(descriptor.receiverParameter) + descriptor.parameters val actualDescriptors = allParameters.map { renderer.render(it.originalDescriptor) }.joinToString() val actualTypes = allParameters.map { it.getParameterTypeCandidates(false).map { renderer.renderType(it) }.joinToString(", ", "[", "]") }.joinToString() + if (actualNames.size() != 1 || expectedNames.isNotEmpty()) { + assertEquals(expectedNames, actualNames, "Expected names mismatch.") + } assertEquals(expectedDescriptors, actualDescriptors, "Expected descriptors mismatch.") assertEquals(expectedTypes, actualTypes, "Expected types mismatch.")