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.")