Code simplification
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user