Optimizations

This commit is contained in:
Valentin Kipyatkov
2014-12-02 14:03:29 +03:00
parent 1d288e6dcc
commit 522ceee559
2 changed files with 17 additions and 3 deletions
@@ -39,7 +39,13 @@ public fun CallableDescriptor.substituteExtensionIfCallable(receivers: Collectio
context: BindingContext,
dataFlowInfo: DataFlowInfo,
isInfixCall: Boolean): Collection<CallableDescriptor> {
return receivers.flatMap { substituteExtensionIfCallable(it, isInfixCall, context, dataFlowInfo) }
val stream = receivers.stream().flatMap { substituteExtensionIfCallable(it, isInfixCall, context, dataFlowInfo).stream() }
if (getTypeParameters().isEmpty()) { // optimization for non-generic callables
return stream.firstOrNull()?.let { listOf(it) } ?: listOf()
}
else {
return stream.toList()
}
}
public fun CallableDescriptor.substituteExtensionIfCallableWithImplicitReceiver(scope: JetScope, context: BindingContext, dataFlowInfo: DataFlowInfo): Collection<CallableDescriptor>
@@ -58,10 +64,16 @@ public fun CallableDescriptor.substituteExtensionIfCallable(
return listOf()
}
return SmartCastUtils.getSmartCastVariants(receiver, bindingContext, dataFlowInfo)
val substitutors = SmartCastUtils.getSmartCastVariants(receiver, bindingContext, dataFlowInfo)
.stream()
.map { checkReceiverResolution(it, receiverParameter, getTypeParameters()) }
.filterNotNull()
.map { substitute(it) }
if (getTypeParameters().isEmpty()) { // optimization for non-generic callables
return if (substitutors.any()) listOf(this) else listOf()
}
else {
return substitutors.map { substitute(it) }.toList()
}
}
private fun checkReceiverResolution(
@@ -52,6 +52,8 @@ public class DeclarationDescriptorLookupObject(
if (lookupObject.descriptor.getOriginal() != descriptor.getOriginal()) return false
if (descriptor !is CallableDescriptor) return true
// optimization:
if (descriptor == (descriptor as CallableDescriptor).getOriginal() && lookupObject.descriptor == lookupObject.descriptor.getOriginal()) return true
return substitutionsEqual(descriptor as CallableDescriptor, lookupObject.descriptor as CallableDescriptor)
}