From c720fa57939f7ed14637dbc2cfdafe5778903ad9 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Tue, 2 Jun 2020 23:05:02 +0200 Subject: [PATCH] Optimize LazyScopeAdapter internals --- .../jetbrains/kotlin/resolve/TypeResolver.kt | 4 ++-- .../kotlin/ir/descriptors/WrappedDescriptors.kt | 4 ++-- .../impl/AbstractTypeParameterDescriptor.java | 4 ++-- .../impl/LazyPackageViewDescriptorImpl.kt | 9 ++++----- .../kotlin/resolve/scopes/LazyScopeAdapter.kt | 17 ++++++++++++++--- 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt index 16c78075f4a..cef043dcd1e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt @@ -440,9 +440,9 @@ class TypeResolver( private fun getScopeForTypeParameter(c: TypeResolutionContext, typeParameterDescriptor: TypeParameterDescriptor): MemberScope { return when { c.checkBounds -> TypeIntersector.getUpperBoundsAsType(typeParameterDescriptor).memberScope - else -> LazyScopeAdapter(LockBasedStorageManager.NO_LOCKS.createLazyValue { + else -> LazyScopeAdapter { TypeIntersector.getUpperBoundsAsType(typeParameterDescriptor).memberScope - }) + } } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/WrappedDescriptors.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/WrappedDescriptors.kt index 1f1f19fb3a4..a9c6de13ef3 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/WrappedDescriptors.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/WrappedDescriptors.kt @@ -281,12 +281,12 @@ open class WrappedTypeParameterDescriptor( private val _defaultType: SimpleType by lazy { KotlinTypeFactory.simpleTypeWithNonTrivialMemberScope( Annotations.EMPTY, typeConstructor, emptyList(), false, - LazyScopeAdapter(LockBasedStorageManager.NO_LOCKS.createLazyValue { + LazyScopeAdapter { TypeIntersectionScope.create( "Scope for type parameter " + name.asString(), upperBounds ) - }) + } ) } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractTypeParameterDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractTypeParameterDescriptor.java index 5f6d81c9086..0114ad669a0 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractTypeParameterDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractTypeParameterDescriptor.java @@ -72,14 +72,14 @@ public abstract class AbstractTypeParameterDescriptor extends DeclarationDescrip return KotlinTypeFactory.simpleTypeWithNonTrivialMemberScope( Annotations.Companion.getEMPTY(), getTypeConstructor(), Collections.emptyList(), false, - new LazyScopeAdapter(storageManager.createLazyValue( + new LazyScopeAdapter( new Function0() { @Override public MemberScope invoke() { return TypeIntersectionScope.create("Scope for type parameter " + name.asString(), getUpperBounds()); } } - )) + ) ); } }); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazyPackageViewDescriptorImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazyPackageViewDescriptorImpl.kt index cc6018450c5..ad642ef7540 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazyPackageViewDescriptorImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazyPackageViewDescriptorImpl.kt @@ -37,16 +37,15 @@ class LazyPackageViewDescriptorImpl( module.packageFragmentProvider.getPackageFragments(fqName) } - override val memberScope: MemberScope = LazyScopeAdapter(storageManager.createLazyValue { + override val memberScope: MemberScope = LazyScopeAdapter(storageManager) { if (fragments.isEmpty()) { MemberScope.Empty - } - else { + } else { // Packages from SubpackagesScope are got via getContributedDescriptors(DescriptorKindFilter.PACKAGES, MemberScope.ALL_NAME_FILTER) val scopes = fragments.map { it.getMemberScope() } + SubpackagesScope(module, fqName) - ChainedMemberScope("package view scope for $fqName in ${module.name}", scopes) + ChainedMemberScope.create("package view scope for $fqName in ${module.name}", scopes) } - }) + } override fun getContainingDeclaration(): PackageViewDescriptor? { return if (fqName.isRoot) null else module.getPackage(fqName.parent()) diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/LazyScopeAdapter.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/LazyScopeAdapter.kt index 0f017fc0a8a..aea4b83ce3c 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/LazyScopeAdapter.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/LazyScopeAdapter.kt @@ -16,9 +16,20 @@ package org.jetbrains.kotlin.resolve.scopes -import org.jetbrains.kotlin.storage.NotNullLazyValue +import org.jetbrains.kotlin.storage.LockBasedStorageManager +import org.jetbrains.kotlin.storage.StorageManager + +class LazyScopeAdapter @JvmOverloads constructor( + storageManager: StorageManager = LockBasedStorageManager.NO_LOCKS, + getScope: () -> MemberScope +) : AbstractScopeAdapter() { + + private val lazyScope = storageManager.createLazyValue{ + getScope().let { + if (it is AbstractScopeAdapter) it.getActualScope() else it + } + } -class LazyScopeAdapter(private val scope: NotNullLazyValue) : AbstractScopeAdapter() { override val workerScope: MemberScope - get() = scope() + get() = lazyScope() }