diff --git a/plugins/scripting/scripting-ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt b/plugins/scripting/scripting-ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt index 9b8f2b0083d..ca4a720591b 100644 --- a/plugins/scripting/scripting-ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt +++ b/plugins/scripting/scripting-ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.idea.resolve.getLanguageVersionSettings import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DelegatingBindingTrace +import org.jetbrains.kotlin.resolve.DescriptorEquivalenceForOverrides import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoBefore import org.jetbrains.kotlin.resolve.calls.CallResolver import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext @@ -87,6 +88,12 @@ class ShadowedDeclarationsFilter( return listOf(first) } + // Optimization: if the descriptors are structurally equivalent then there is no need to run resolve. + // This can happen when the classpath contains multiple copies of the same library. + if (descriptors.all { DescriptorEquivalenceForOverrides.areEquivalent(first, it, allowCopiesFromTheSameDeclaration = true) }) { + return listOf(first) + } + val isFunction = first is FunctionDescriptor val name = when (first) { is ConstructorDescriptor -> first.constructedClass.name