diff --git a/idea/ide-common/src/org/jetbrains/jet/plugin/util/extensionsUtils.kt b/idea/ide-common/src/org/jetbrains/jet/plugin/util/extensionsUtils.kt index b944260ba39..8b1716f7cb2 100644 --- a/idea/ide-common/src/org/jetbrains/jet/plugin/util/extensionsUtils.kt +++ b/idea/ide-common/src/org/jetbrains/jet/plugin/util/extensionsUtils.kt @@ -39,7 +39,13 @@ public fun CallableDescriptor.substituteExtensionIfCallable(receivers: Collectio context: BindingContext, dataFlowInfo: DataFlowInfo, isInfixCall: Boolean): Collection { - 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 @@ -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( diff --git a/idea/src/org/jetbrains/jet/plugin/completion/DeclarationDescriptorLookupObject.kt b/idea/src/org/jetbrains/jet/plugin/completion/DeclarationDescriptorLookupObject.kt index e51ac2ca416..f19d840a8ae 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/DeclarationDescriptorLookupObject.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/DeclarationDescriptorLookupObject.kt @@ -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) }