From 6cb2146d314217ceae56cac99e03de78bbedc2bf Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Tue, 5 Feb 2019 19:55:59 +0300 Subject: [PATCH] Remove 'allowSpecialClassNames' extraction option --- .../ui/ExtractFunctionParameterTablePanel.kt | 6 ++--- .../ExtractableCodeDescriptor.kt | 6 ++--- .../extractionEngine/ExtractionData.kt | 1 - .../extractableAnalysisUtil.kt | 25 ++++++------------- .../extractionEngine/extractorUtil.kt | 19 +++----------- .../extractionEngine/inferParameterInfo.kt | 6 ++--- .../outputValues/tooManyOutputValuesAsList.kt | 2 +- .../tooManyOutputValuesAsList.kt.after | 2 +- .../capturedFunctions/deeplyLocalFun.kt | 2 +- .../capturedFunctions/deeplyLocalFun.kt.after | 2 +- .../capturedFunctions/localExtensionFun.kt | 2 +- .../localExtensionFun.kt.after | 2 +- .../localExtensionFunChainedCalls.kt | 2 +- .../localExtensionFunChainedCalls.kt.after | 2 +- .../localExtensionFunInfixCall.kt | 2 +- .../localExtensionFunInfixCall.kt.after | 2 +- .../parameters/capturedFunctions/localFun.kt | 2 +- .../capturedFunctions/localFun.kt.after | 2 +- .../introduce/AbstractExtractionTest.kt | 2 +- 19 files changed, 32 insertions(+), 57 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractFunction/ui/ExtractFunctionParameterTablePanel.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractFunction/ui/ExtractFunctionParameterTablePanel.kt index cfadb7286dc..2bef69a7682 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractFunction/ui/ExtractFunctionParameterTablePanel.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractFunction/ui/ExtractFunctionParameterTablePanel.kt @@ -36,7 +36,7 @@ open class ExtractFunctionParameterTablePanel : AbstractParameterTablePanel(originalParameter) { - var type = originalParameter.getParameterType(false) + var type = originalParameter.parameterType init { name = if (isReceiver) "" else originalParameter.name @@ -78,7 +78,7 @@ open class ExtractFunctionParameterTablePanel : AbstractParameterTablePanel super.isCellEditable(rowIndex, columnIndex) && !info.isReceiver - PARAMETER_TYPE_COLUMN -> isEnabled && info.isEnabled && info.originalParameter.getParameterTypeCandidates(false).size > 1 + PARAMETER_TYPE_COLUMN -> isEnabled && info.isEnabled && info.originalParameter.getParameterTypeCandidates().size > 1 else -> super.isCellEditable(rowIndex, columnIndex) } } 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 748d5ea230a..1c24fa338c0 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 @@ -56,9 +56,9 @@ interface Parameter { val mirrorVarName: String? val receiverCandidate: Boolean - fun getParameterType(allowSpecialClassNames: Boolean): KotlinType + val parameterType: KotlinType - fun getParameterTypeCandidates(allowSpecialClassNames: Boolean): List + fun getParameterTypeCandidates(): List fun copy(name: String, parameterType: KotlinType): Parameter } @@ -167,7 +167,7 @@ interface OutputValue { val parameter: Parameter, override val originalExpressions: List ) : OutputValue { - override val valueType: KotlinType get() = parameter.getParameterType(false) + override val valueType: KotlinType get() = parameter.parameterType } class Initializer( diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionData.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionData.kt index a1a7afe1807..e22b3a10d77 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionData.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionData.kt @@ -58,7 +58,6 @@ data class ExtractionOptions( val inferUnitTypeForUnusedValues: Boolean = true, val enableListBoxing: Boolean = false, val extractAsProperty: Boolean = false, - val allowSpecialClassNames: Boolean = false, val captureLocalFunctions: Boolean = false, val canWrapInWith: Boolean = false ) { 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 8f2d2f02b04..2437cbc9607 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 @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.idea.refactoring.introduce.extractionEngine -import com.intellij.openapi.diagnostic.Logger import com.intellij.psi.PsiElement import com.intellij.psi.PsiNamedElement import com.intellij.psi.util.PsiTreeUtil @@ -159,8 +158,7 @@ private fun ExtractionData.getResultTypeAndExpressions( val resultTypes = instructions.mapNotNull(::instructionToType) val commonSupertype = if (resultTypes.isNotEmpty()) CommonSupertypes.commonSupertype(resultTypes) else module.builtIns.defaultReturnType - val resultType = - if (options.allowSpecialClassNames) commonSupertype else commonSupertype.approximateWithResolvableType(targetScope, false) + val resultType = commonSupertype.approximateWithResolvableType(targetScope, false) val expressions = instructions.mapNotNull { instructionToExpression(it, false) } @@ -482,9 +480,6 @@ internal fun KotlinType.processTypeIfExtractable( extractable } - options.allowSpecialClassNames && typeToCheck.isSpecial() -> - extractable - typeToCheck.isError -> false @@ -536,7 +531,7 @@ internal class MutableParameter( } else originalType } - private val parameterTypeCandidates: List by lazy { + private val allParameterTypeCandidates: List by lazy { writable = false val typePredicate = and(typePredicates) @@ -562,17 +557,12 @@ internal class MutableParameter( typeSet.toList() } - override fun getParameterTypeCandidates(allowSpecialClassNames: Boolean): List { - return if (!allowSpecialClassNames) { - parameterTypeCandidates.filter { it.isExtractable(targetScope) } - } else { - parameterTypeCandidates - } + override fun getParameterTypeCandidates(): List { + return allParameterTypeCandidates.filter { it.isExtractable(targetScope) } } - override fun getParameterType(allowSpecialClassNames: Boolean): KotlinType { - return getParameterTypeCandidates(allowSpecialClassNames).firstOrNull() ?: defaultType - } + override val parameterType: KotlinType + get() = getParameterTypeCandidates().firstOrNull() ?: defaultType override fun copy(name: String, parameterType: KotlinType): Parameter = DelegatingParameter(this, name, parameterType) } @@ -580,10 +570,9 @@ internal class MutableParameter( private class DelegatingParameter( val original: Parameter, override val name: String, - val parameterType: KotlinType + override val parameterType: KotlinType ) : Parameter by original { override fun copy(name: String, parameterType: KotlinType): Parameter = DelegatingParameter(original, name, parameterType) - override fun getParameterType(allowSpecialClassNames: Boolean) = parameterType } private fun ExtractionData.checkDeclarationsMovingOutOfScope( 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 41b28c128ee..6b493818a0e 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 @@ -46,7 +46,6 @@ import org.jetbrains.kotlin.idea.util.psi.patternMatching.UnificationResult.Weak import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.KtPsiFactory.CallableBuilder -import org.jetbrains.kotlin.psi.codeFragmentUtil.DEBUG_TYPE_REFERENCE_STRING import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.resolve.DescriptorUtils @@ -97,16 +96,10 @@ private fun buildSignature(config: ExtractionGeneratorConfiguration, renderer: D } ) - fun KotlinType.typeAsString(): String { - return if (config.descriptor.extractionData.options.allowSpecialClassNames && isSpecial()) { - DEBUG_TYPE_REFERENCE_STRING - } else { - renderer.renderType(this) - } - } + fun KotlinType.typeAsString() = renderer.renderType(this) config.descriptor.receiverParameter?.let { - val receiverType = it.getParameterType(config.descriptor.extractionData.options.allowSpecialClassNames) + val receiverType = it.parameterType val receiverTypeAsString = receiverType.typeAsString() receiver(if (receiverType.isFunctionType) "($receiverTypeAsString)" else receiverTypeAsString) } @@ -114,10 +107,7 @@ private fun buildSignature(config: ExtractionGeneratorConfiguration, renderer: D name(config.generatorOptions.dummyName ?: config.descriptor.name) config.descriptor.parameters.forEach { parameter -> - param( - parameter.name, - parameter.getParameterType(config.descriptor.extractionData.options.allowSpecialClassNames).typeAsString() - ) + param(parameter.name, parameter.parameterType.typeAsString()) } with(config.descriptor.returnType) { @@ -225,8 +215,7 @@ fun ExtractableCodeDescriptor.findDuplicates(): List { return if (matched) newControlFlow else null } - val unifierParameters = - parameters.map { UnifierParameter(it.originalDescriptor, it.getParameterType(extractionData.options.allowSpecialClassNames)) } + val unifierParameters = parameters.map { UnifierParameter(it.originalDescriptor, it.parameterType) } val unifier = KotlinPsiUnifier(unifierParameters, true) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/inferParameterInfo.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/inferParameterInfo.kt index d0d5d56e70b..659123ef331 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/inferParameterInfo.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/inferParameterInfo.kt @@ -149,15 +149,13 @@ internal fun ExtractionData.inferParametersInfo( val existingParameterNames = hashSetOf() for ((descriptorToExtract, parameter) in extractedDescriptorToParameter) { if (!parameter - .getParameterType(options.allowSpecialClassNames) + .parameterType .processTypeIfExtractable(info.typeParameters, info.nonDenotableTypes, options, targetScope) ) continue with(parameter) { if (currentName == null) { - currentName = - KotlinNameSuggester.suggestNamesByType(getParameterType(options.allowSpecialClassNames), varNameValidator, "p") - .first() + currentName = KotlinNameSuggester.suggestNamesByType(parameterType, varNameValidator, "p").first() } require(currentName != null) diff --git a/idea/testData/refactoring/extractFunction/controlFlow/outputValues/tooManyOutputValuesAsList.kt b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/tooManyOutputValuesAsList.kt index fe771a31823..9bc74b3cdff 100644 --- a/idea/testData/refactoring/extractFunction/controlFlow/outputValues/tooManyOutputValuesAsList.kt +++ b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/tooManyOutputValuesAsList.kt @@ -1,5 +1,5 @@ // WITH_RUNTIME -// OPTIONS: true, true, false, false, false, false +// OPTIONS: true, true, false, false, false // PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int diff --git a/idea/testData/refactoring/extractFunction/controlFlow/outputValues/tooManyOutputValuesAsList.kt.after b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/tooManyOutputValuesAsList.kt.after index 43e5b4bfe0d..7634c02eb94 100644 --- a/idea/testData/refactoring/extractFunction/controlFlow/outputValues/tooManyOutputValuesAsList.kt.after +++ b/idea/testData/refactoring/extractFunction/controlFlow/outputValues/tooManyOutputValuesAsList.kt.after @@ -1,5 +1,5 @@ // WITH_RUNTIME -// OPTIONS: true, true, false, false, false, false +// OPTIONS: true, true, false, false, false // PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int diff --git a/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/deeplyLocalFun.kt b/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/deeplyLocalFun.kt index b7c5f54310e..4aed143b1e1 100644 --- a/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/deeplyLocalFun.kt +++ b/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/deeplyLocalFun.kt @@ -1,4 +1,4 @@ -// OPTIONS: true, false, false, false, true, false +// OPTIONS: true, false, false, true, false // PARAM_DESCRIPTOR: local final fun baz(m: kotlin.Int): kotlin.Int defined in foo.bar // PARAM_DESCRIPTOR: value-parameter n: kotlin.Int defined in foo // PARAM_TYPES: (m: kotlin.Int) -> kotlin.Int diff --git a/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/deeplyLocalFun.kt.after b/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/deeplyLocalFun.kt.after index 1c80f2bdaa3..f1315bb35bf 100644 --- a/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/deeplyLocalFun.kt.after +++ b/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/deeplyLocalFun.kt.after @@ -1,4 +1,4 @@ -// OPTIONS: true, false, false, false, true, false +// OPTIONS: true, false, false, true, false // PARAM_DESCRIPTOR: local final fun baz(m: kotlin.Int): kotlin.Int defined in foo.bar // PARAM_DESCRIPTOR: value-parameter n: kotlin.Int defined in foo // PARAM_TYPES: (m: kotlin.Int) -> kotlin.Int diff --git a/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFun.kt b/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFun.kt index f5f07262791..b78189f5b21 100644 --- a/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFun.kt +++ b/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFun.kt @@ -1,4 +1,4 @@ -// OPTIONS: true, false, false, false, true, false +// OPTIONS: true, false, false, true, false // PARAM_DESCRIPTOR: value-parameter n: kotlin.Int defined in foo // PARAM_DESCRIPTOR: local final fun kotlin.Int.bar(m: kotlin.Int): kotlin.Int defined in foo // PARAM_TYPES: kotlin.Int diff --git a/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFun.kt.after b/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFun.kt.after index 37419d9df33..83c47498d1e 100644 --- a/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFun.kt.after +++ b/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFun.kt.after @@ -1,4 +1,4 @@ -// OPTIONS: true, false, false, false, true, false +// OPTIONS: true, false, false, true, false // PARAM_DESCRIPTOR: value-parameter n: kotlin.Int defined in foo // PARAM_DESCRIPTOR: local final fun kotlin.Int.bar(m: kotlin.Int): kotlin.Int defined in foo // PARAM_TYPES: kotlin.Int diff --git a/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFunChainedCalls.kt b/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFunChainedCalls.kt index 4124916bf68..ad04ea81393 100644 --- a/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFunChainedCalls.kt +++ b/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFunChainedCalls.kt @@ -1,4 +1,4 @@ -// OPTIONS: true, false, false, false, true, false +// OPTIONS: true, false, false, true, false // PARAM_DESCRIPTOR: value-parameter n: kotlin.Int defined in foo // PARAM_DESCRIPTOR: local final fun kotlin.Int.bar1(m: kotlin.Int): kotlin.Int defined in foo // PARAM_DESCRIPTOR: local final fun kotlin.Int.bar2(m: kotlin.Int): kotlin.Int defined in foo diff --git a/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFunChainedCalls.kt.after b/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFunChainedCalls.kt.after index 6f14a88dbe9..6a2fa11dd48 100644 --- a/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFunChainedCalls.kt.after +++ b/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFunChainedCalls.kt.after @@ -1,4 +1,4 @@ -// OPTIONS: true, false, false, false, true, false +// OPTIONS: true, false, false, true, false // PARAM_DESCRIPTOR: value-parameter n: kotlin.Int defined in foo // PARAM_DESCRIPTOR: local final fun kotlin.Int.bar1(m: kotlin.Int): kotlin.Int defined in foo // PARAM_DESCRIPTOR: local final fun kotlin.Int.bar2(m: kotlin.Int): kotlin.Int defined in foo diff --git a/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFunInfixCall.kt b/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFunInfixCall.kt index ce3d1772688..8ef42ae5003 100644 --- a/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFunInfixCall.kt +++ b/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFunInfixCall.kt @@ -1,4 +1,4 @@ -// OPTIONS: true, false, false, false, true, false +// OPTIONS: true, false, false, true, false // PARAM_DESCRIPTOR: value-parameter n: kotlin.Int defined in foo // PARAM_DESCRIPTOR: local final fun kotlin.Int.bar(m: kotlin.Int): kotlin.Int defined in foo // PARAM_TYPES: kotlin.Int diff --git a/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFunInfixCall.kt.after b/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFunInfixCall.kt.after index 862ee14178d..35d29f08d43 100644 --- a/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFunInfixCall.kt.after +++ b/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localExtensionFunInfixCall.kt.after @@ -1,4 +1,4 @@ -// OPTIONS: true, false, false, false, true, false +// OPTIONS: true, false, false, true, false // PARAM_DESCRIPTOR: value-parameter n: kotlin.Int defined in foo // PARAM_DESCRIPTOR: local final fun kotlin.Int.bar(m: kotlin.Int): kotlin.Int defined in foo // PARAM_TYPES: kotlin.Int diff --git a/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localFun.kt b/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localFun.kt index 0ebb67a78ca..5fc7b46cfd5 100644 --- a/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localFun.kt +++ b/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localFun.kt @@ -1,4 +1,4 @@ -// OPTIONS: true, false, false, false, true, false +// OPTIONS: true, false, false, true, false // PARAM_DESCRIPTOR: local final fun bar(m: kotlin.Int): kotlin.Int defined in foo // PARAM_DESCRIPTOR: value-parameter n: kotlin.Int defined in foo // PARAM_TYPES: (m: kotlin.Int) -> kotlin.Int diff --git a/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localFun.kt.after b/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localFun.kt.after index 802abc4db4f..879550df749 100644 --- a/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localFun.kt.after +++ b/idea/testData/refactoring/extractFunction/parameters/capturedFunctions/localFun.kt.after @@ -1,4 +1,4 @@ -// OPTIONS: true, false, false, false, true, false +// OPTIONS: true, false, false, true, false // PARAM_DESCRIPTOR: local final fun bar(m: kotlin.Int): kotlin.Int defined in foo // PARAM_DESCRIPTOR: value-parameter n: kotlin.Int defined in foo // PARAM_TYPES: (m: kotlin.Int) -> kotlin.Int diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/AbstractExtractionTest.kt b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/AbstractExtractionTest.kt index d046e06e94a..8748f64da7b 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/AbstractExtractionTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/AbstractExtractionTest.kt @@ -435,7 +435,7 @@ fun doExtractFunction(fixture: CodeInsightTestFixture, file: KtFile) { val allParameters = listOfNotNull(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(", ", "[", "]") + it.getParameterTypeCandidates().map { renderer.renderType(it) }.joinToString(", ", "[", "]") }.joinToString() if (actualNames.size != 1 || expectedNames.isNotEmpty()) {