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