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, context: BindingContext,
dataFlowInfo: DataFlowInfo, dataFlowInfo: DataFlowInfo,
isInfixCall: Boolean): Collection<CallableDescriptor> { 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> public fun CallableDescriptor.substituteExtensionIfCallableWithImplicitReceiver(scope: JetScope, context: BindingContext, dataFlowInfo: DataFlowInfo): Collection<CallableDescriptor>
@@ -58,10 +64,16 @@ public fun CallableDescriptor.substituteExtensionIfCallable(
return listOf() return listOf()
} }
return SmartCastUtils.getSmartCastVariants(receiver, bindingContext, dataFlowInfo) val substitutors = SmartCastUtils.getSmartCastVariants(receiver, bindingContext, dataFlowInfo)
.stream()
.map { checkReceiverResolution(it, receiverParameter, getTypeParameters()) } .map { checkReceiverResolution(it, receiverParameter, getTypeParameters()) }
.filterNotNull() .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( private fun checkReceiverResolution(
@@ -52,6 +52,8 @@ public class DeclarationDescriptorLookupObject(
if (lookupObject.descriptor.getOriginal() != descriptor.getOriginal()) return false if (lookupObject.descriptor.getOriginal() != descriptor.getOriginal()) return false
if (descriptor !is CallableDescriptor) return true 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) return substitutionsEqual(descriptor as CallableDescriptor, lookupObject.descriptor as CallableDescriptor)
} }