Pass KotlinBuiltIns into getExpectedTypePredicate utility

This commit is contained in:
Pavel V. Talanov
2015-09-16 15:27:42 +03:00
parent 0fc23fc426
commit d2a4235dd8
4 changed files with 16 additions and 11 deletions
@@ -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<TypePredicate?>()
fun addSubtypesOf(jetType: JetType?) = typePredicates.add(jetType?.getSubtypesPredicate())
@@ -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"
}
@@ -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
}
}
@@ -600,7 +600,7 @@ private fun ExtractionData.inferParametersInfo(
commonParent: PsiElement,
pseudocode: Pseudocode,
bindingContext: BindingContext,
targetScope: LexicalScope?,
targetScope: LexicalScope,
modifiedVarDescriptors: Set<VariableDescriptor>
): 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))
}
}