From 18e7272a1e0877ec474cdc3dfe4a898b6b7c1cfb Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 3 Feb 2016 12:05:53 +0300 Subject: [PATCH] Do not force overridden descriptors computation Currently 'overriddenDescriptors' of substituted function is lazy and in most cases it's unnecessary to compute it (it's enough to use the same field from 'original') --- .../org/jetbrains/kotlin/codegen/state/typeMappingUtil.kt | 2 +- .../load/java/sam/SamAdapterOverridabilityCondition.java | 2 +- .../src/org/jetbrains/kotlin/resolve/deprecationUtil.kt | 2 +- .../jetbrains/kotlin/load/java/specialBuiltinMembers.kt | 2 ++ .../jetbrains/kotlin/descriptors/FunctionDescriptor.java | 6 ++++++ .../kotlin/descriptors/impl/FunctionDescriptorImpl.java | 4 ++-- .../src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt | 8 ++++---- 7 files changed, 17 insertions(+), 9 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/typeMappingUtil.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/typeMappingUtil.kt index b26104be4e9..df42bebfbf4 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/typeMappingUtil.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/typeMappingUtil.kt @@ -77,7 +77,7 @@ fun getEffectiveVariance(parameterVariance: Variance, projectionKind: Variance): val CallableDescriptor?.isMethodWithDeclarationSiteWildcards: Boolean get() { if (this !is CallableMemberDescriptor) return false - return firstOverridden { + return original.firstOverridden(useOriginal = true) { METHODS_WITH_DECLARATION_SITE_WILDCARDS.contains(it.propertyIfAccessor.fqNameOrNull()) } != null } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SamAdapterOverridabilityCondition.java b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SamAdapterOverridabilityCondition.java index 4bffd441a53..d4a70cf2953 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SamAdapterOverridabilityCondition.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SamAdapterOverridabilityCondition.java @@ -117,7 +117,7 @@ public class SamAdapterOverridabilityCondition implements ExternalOverridability return new SamAdapterInfo(samAdapter, ownerType); } - for (CallableMemberDescriptor overridden : samAdapter.getOverriddenDescriptors()) { + for (CallableMemberDescriptor overridden : samAdapter.getOriginal().getOverriddenDescriptors()) { ClassDescriptor containingClass = (ClassDescriptor) overridden.getContainingDeclaration(); for (KotlinType immediateSupertype : TypeUtils.getImmediateSupertypes(ownerType)) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt index 3eb9956bb14..ddd83ec9ca9 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt @@ -99,7 +99,7 @@ private fun deprecationByOverridden(root: CallableMemberDescriptor): Deprecation visited.add(node) val deprecatedAnnotation = node.getDeprecationByAnnotation() - val overriddenDescriptors = node.overriddenDescriptors + val overriddenDescriptors = node.original.overriddenDescriptors when { deprecatedAnnotation != null -> { deprecations.add(deprecatedAnnotation) diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/specialBuiltinMembers.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/specialBuiltinMembers.kt index e5552b26f6c..13bb98fa026 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/specialBuiltinMembers.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/specialBuiltinMembers.kt @@ -142,6 +142,8 @@ object BuiltinMethodsWithSpecialGenericSignature { @JvmStatic fun CallableMemberDescriptor.getSpecialSignatureInfo(): SpecialSignatureInfo? { + if (name !in ERASED_VALUE_PARAMETERS_SHORT_NAMES) return null + val builtinFqName = firstOverridden { it is FunctionDescriptor && it.hasErasedValueParametersInJava }?.fqNameOrNull() ?: return null diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java index 00bbdd9d9eb..13a2714cb6a 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java @@ -35,6 +35,12 @@ public interface FunctionDescriptor extends CallableMemberDescriptor { @Override FunctionDescriptor substitute(@NotNull TypeSubstitutor substitutor); + /** + * This method should be used with q Wgreat care, because if descriptor is substituted one, calling 'getOverriddenDescriptors' + * may force lazy computation, that's unnecessary in most cases. + * So, if 'getOriginal().getOverriddenDescriptors()' is enough for you, please use it instead. + * @return + */ @Override @NotNull Collection getOverriddenDescriptors(); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java index 80da600af44..c1c2b4f5f57 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java @@ -196,7 +196,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo public boolean isOperator() { if (isOperator) return true; - for (FunctionDescriptor descriptor : getOverriddenDescriptors()) { + for (FunctionDescriptor descriptor : getOriginal().getOverriddenDescriptors()) { if (descriptor.isOperator()) return true; } @@ -207,7 +207,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo public boolean isInfix() { if (isInfix) return true; - for (FunctionDescriptor descriptor : getOverriddenDescriptors()) { + for (FunctionDescriptor descriptor : getOriginal().getOverriddenDescriptors()) { if (descriptor.isInfix()) return true; } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt index e7a0af2e497..7407f21da5c 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt @@ -210,14 +210,14 @@ val CallableMemberDescriptor.propertyIfAccessor: CallableMemberDescriptor fun CallableDescriptor.fqNameOrNull(): FqName? = fqNameUnsafe.check { it.isSafe }?.toSafe() fun CallableMemberDescriptor.firstOverridden( + useOriginal: Boolean = false, predicate: (CallableMemberDescriptor) -> Boolean ): CallableMemberDescriptor? { var result: CallableMemberDescriptor? = null return DFS.dfs(listOf(this), - object : DFS.Neighbors { - override fun getNeighbors(current: CallableMemberDescriptor?): Iterable { - return current?.overriddenDescriptors ?: emptyList() - } + { current -> + val descriptor = if (useOriginal) current?.original else current + descriptor?.overriddenDescriptors ?: emptyList() }, object : DFS.AbstractNodeHandler() { override fun beforeChildren(current: CallableMemberDescriptor) = result == null