diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/pseudocode/pseudocodeUtils.kt b/compiler/frontend/src/org/jetbrains/kotlin/cfg/pseudocode/pseudocodeUtils.kt index 60e6286a3e5..8826fc145ae 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/pseudocode/pseudocodeUtils.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/pseudocode/pseudocodeUtils.kt @@ -69,10 +69,12 @@ fun getReceiverTypePredicate(resolvedCall: ResolvedCall<*>, receiverValue: Recei return null } -public fun getExpectedTypePredicate(value: PseudoValue, bindingContext: BindingContext): TypePredicate { +public fun getExpectedTypePredicate( + value: PseudoValue, + bindingContext: BindingContext, + builtIns: KotlinBuiltIns +): TypePredicate { val pseudocode = value.createdAt?.owner ?: return AllTypes - val builtIns = KotlinBuiltIns.getInstance() - val typePredicates = LinkedHashSet() fun addSubtypesOf(jetType: JetType?) = typePredicates.add(jetType?.getSubtypesPredicate()) diff --git a/compiler/tests/org/jetbrains/kotlin/cfg/AbstractPseudoValueTest.kt b/compiler/tests/org/jetbrains/kotlin/cfg/AbstractPseudoValueTest.kt index fd9474c8796..c1dbdb4a3ad 100644 --- a/compiler/tests/org/jetbrains/kotlin/cfg/AbstractPseudoValueTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/cfg/AbstractPseudoValueTest.kt @@ -16,15 +16,16 @@ package org.jetbrains.kotlin.cfg +import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.cfg.pseudocode.PseudoValue import org.jetbrains.kotlin.cfg.pseudocode.PseudocodeImpl +import org.jetbrains.kotlin.cfg.pseudocode.TypePredicate +import org.jetbrains.kotlin.cfg.pseudocode.getExpectedTypePredicate +import org.jetbrains.kotlin.cfg.pseudocode.instructions.eval.InstructionWithValue import org.jetbrains.kotlin.psi.JetElement import org.jetbrains.kotlin.psi.JetTreeVisitorVoid import org.jetbrains.kotlin.resolve.BindingContext import java.util.* -import org.jetbrains.kotlin.cfg.pseudocode.TypePredicate -import org.jetbrains.kotlin.cfg.pseudocode.getExpectedTypePredicate -import org.jetbrains.kotlin.cfg.pseudocode.instructions.eval.InstructionWithValue public abstract class AbstractPseudoValueTest : AbstractPseudocodeTest() { override fun dumpInstructions(pseudocode: PseudocodeImpl, out: StringBuilder, bindingContext: BindingContext) { @@ -49,7 +50,9 @@ public abstract class AbstractPseudoValueTest : AbstractPseudocodeTest() { element?.getText()?.replace("\\s+".toRegex(), " ") ?: "" fun valueDecl(value: PseudoValue): String { - val typePredicate = expectedTypePredicateMap.getOrPut(value) { getExpectedTypePredicate(value, bindingContext) } + val typePredicate = expectedTypePredicateMap.getOrPut(value) { + getExpectedTypePredicate(value, bindingContext, KotlinBuiltIns.getInstance()) + } return "${value.debugName}: $typePredicate" } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/typeUtils.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/typeUtils.kt index 5e1161dffcd..9c1860cd800 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/typeUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/typeUtils.kt @@ -198,7 +198,7 @@ fun JetExpression.guessTypes( } else -> { pseudocode?.getElementValue(this)?.let { - getExpectedTypePredicate(it, context).getRepresentativeTypes().toTypedArray() + getExpectedTypePredicate(it, context, module.builtIns).getRepresentativeTypes().toTypedArray() } ?: arrayOf() // can't infer anything } } 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 617172c7764..6afdb11bf88 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 @@ -600,7 +600,7 @@ private fun ExtractionData.inferParametersInfo( commonParent: PsiElement, pseudocode: Pseudocode, bindingContext: BindingContext, - targetScope: LexicalScope?, + targetScope: LexicalScope, modifiedVarDescriptors: Set ): ParametersInfo { val info = ParametersInfo() @@ -769,7 +769,7 @@ private fun ExtractionData.inferParametersInfo( val instruction = pseudocode.getElementValue(callElement)?.createdAt as? InstructionWithReceivers val receiverValue = instruction?.receiverValues?.entrySet()?.singleOrNull { it.getValue() == receiverToExtract }?.getKey() if (receiverValue != null) { - parameter.addTypePredicate(getExpectedTypePredicate(receiverValue, bindingContext)) + parameter.addTypePredicate(getExpectedTypePredicate(receiverValue, bindingContext, targetScope.ownerDescriptor.builtIns)) } } else if (extractFunctionRef) { @@ -777,7 +777,7 @@ private fun ExtractionData.inferParametersInfo( } else { pseudocode.getElementValuesRecursively(originalRef).forEach { - parameter.addTypePredicate(getExpectedTypePredicate(it, bindingContext)) + parameter.addTypePredicate(getExpectedTypePredicate(it, bindingContext, targetScope.ownerDescriptor.builtIns)) } }