Code simplification

This commit is contained in:
Valentin Kipyatkov
2014-11-28 13:52:37 +03:00
parent 07cfc173f9
commit 79cfa1f84e
@@ -33,6 +33,7 @@ import org.jetbrains.jet.lang.resolve.calls.inference.ConstraintsUtil
import org.jetbrains.jet.lang.resolve.name.Name import org.jetbrains.jet.lang.resolve.name.Name
import org.jetbrains.jet.utils.addIfNotNull import org.jetbrains.jet.utils.addIfNotNull
import java.util.HashSet import java.util.HashSet
import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor
public fun CallableDescriptor.isExtensionCallable(receivers: Collection<ReceiverValue>, public fun CallableDescriptor.isExtensionCallable(receivers: Collection<ReceiverValue>,
context: BindingContext, context: BindingContext,
@@ -49,36 +50,30 @@ public fun CallableDescriptor.isExtensionCallable(
bindingContext: BindingContext, bindingContext: BindingContext,
dataFlowInfo: DataFlowInfo dataFlowInfo: DataFlowInfo
): Boolean { ): Boolean {
assert(getExtensionReceiverParameter() != null) val receiverParameter = getExtensionReceiverParameter()!!
if (!receiver.exists()) return false
if (isInfixCall && (this !is SimpleFunctionDescriptor || getValueParameters().size() != 1)) { if (isInfixCall && (this !is SimpleFunctionDescriptor || getValueParameters().size() != 1)) {
return false return false
} }
return SmartCastUtils.getSmartCastVariants(receiver, bindingContext, dataFlowInfo) return SmartCastUtils.getSmartCastVariants(receiver, bindingContext, dataFlowInfo)
.any { checkReceiverResolution(receiver, it, this) } .any { checkReceiverResolution(it, receiverParameter, getTypeParameters()) }
} }
private fun checkReceiverResolution(receiverArgument: ReceiverValue, receiverType: JetType, callableDescriptor: CallableDescriptor): Boolean { private fun checkReceiverResolution(
val receiverParameter = callableDescriptor.getExtensionReceiverParameter() receiverType: JetType,
receiverParameter: ReceiverParameterDescriptor,
if (!receiverArgument.exists() && receiverParameter == null) { typeParameters: List<TypeParameterDescriptor>
// Both receivers do not exist ): Boolean {
return true
}
if (!(receiverArgument.exists() && receiverParameter != null)) {
return false
}
val typeNamesInReceiver = HashSet<Name>() val typeNamesInReceiver = HashSet<Name>()
typeNamesInReceiver.addUsedTypeNames(receiverParameter.getType()) typeNamesInReceiver.addUsedTypeNames(receiverParameter.getType())
val constraintSystem = ConstraintSystemImpl() val constraintSystem = ConstraintSystemImpl()
val typeVariables = LinkedHashMap<TypeParameterDescriptor, Variance>() val typeVariables = LinkedHashMap<TypeParameterDescriptor, Variance>()
for (typeParameterDescriptor in callableDescriptor.getTypeParameters()) { for (typeParameter in typeParameters) {
if (typeNamesInReceiver.contains(typeParameterDescriptor.getName())) { if (typeNamesInReceiver.contains(typeParameter.getName())) {
typeVariables.put(typeParameterDescriptor, Variance.INVARIANT) typeVariables.put(typeParameter, Variance.INVARIANT)
} }
} }
constraintSystem.registerTypeVariables(typeVariables) constraintSystem.registerTypeVariables(typeVariables)