Optimize LazyScopeAdapter internals

This commit is contained in:
Ilya Chernikov
2020-06-02 23:05:02 +02:00
parent c2ede13d5a
commit c720fa5793
5 changed files with 24 additions and 14 deletions
@@ -440,9 +440,9 @@ class TypeResolver(
private fun getScopeForTypeParameter(c: TypeResolutionContext, typeParameterDescriptor: TypeParameterDescriptor): MemberScope { private fun getScopeForTypeParameter(c: TypeResolutionContext, typeParameterDescriptor: TypeParameterDescriptor): MemberScope {
return when { return when {
c.checkBounds -> TypeIntersector.getUpperBoundsAsType(typeParameterDescriptor).memberScope c.checkBounds -> TypeIntersector.getUpperBoundsAsType(typeParameterDescriptor).memberScope
else -> LazyScopeAdapter(LockBasedStorageManager.NO_LOCKS.createLazyValue { else -> LazyScopeAdapter {
TypeIntersector.getUpperBoundsAsType(typeParameterDescriptor).memberScope TypeIntersector.getUpperBoundsAsType(typeParameterDescriptor).memberScope
}) }
} }
} }
@@ -281,12 +281,12 @@ open class WrappedTypeParameterDescriptor(
private val _defaultType: SimpleType by lazy { private val _defaultType: SimpleType by lazy {
KotlinTypeFactory.simpleTypeWithNonTrivialMemberScope( KotlinTypeFactory.simpleTypeWithNonTrivialMemberScope(
Annotations.EMPTY, typeConstructor, emptyList(), false, Annotations.EMPTY, typeConstructor, emptyList(), false,
LazyScopeAdapter(LockBasedStorageManager.NO_LOCKS.createLazyValue { LazyScopeAdapter {
TypeIntersectionScope.create( TypeIntersectionScope.create(
"Scope for type parameter " + name.asString(), "Scope for type parameter " + name.asString(),
upperBounds upperBounds
) )
}) }
) )
} }
@@ -72,14 +72,14 @@ public abstract class AbstractTypeParameterDescriptor extends DeclarationDescrip
return KotlinTypeFactory.simpleTypeWithNonTrivialMemberScope( return KotlinTypeFactory.simpleTypeWithNonTrivialMemberScope(
Annotations.Companion.getEMPTY(), Annotations.Companion.getEMPTY(),
getTypeConstructor(), Collections.<TypeProjection>emptyList(), false, getTypeConstructor(), Collections.<TypeProjection>emptyList(), false,
new LazyScopeAdapter(storageManager.createLazyValue( new LazyScopeAdapter(
new Function0<MemberScope>() { new Function0<MemberScope>() {
@Override @Override
public MemberScope invoke() { public MemberScope invoke() {
return TypeIntersectionScope.create("Scope for type parameter " + name.asString(), getUpperBounds()); return TypeIntersectionScope.create("Scope for type parameter " + name.asString(), getUpperBounds());
} }
} }
)) )
); );
} }
}); });
@@ -37,16 +37,15 @@ class LazyPackageViewDescriptorImpl(
module.packageFragmentProvider.getPackageFragments(fqName) module.packageFragmentProvider.getPackageFragments(fqName)
} }
override val memberScope: MemberScope = LazyScopeAdapter(storageManager.createLazyValue { override val memberScope: MemberScope = LazyScopeAdapter(storageManager) {
if (fragments.isEmpty()) { if (fragments.isEmpty()) {
MemberScope.Empty MemberScope.Empty
} } else {
else {
// Packages from SubpackagesScope are got via getContributedDescriptors(DescriptorKindFilter.PACKAGES, MemberScope.ALL_NAME_FILTER) // Packages from SubpackagesScope are got via getContributedDescriptors(DescriptorKindFilter.PACKAGES, MemberScope.ALL_NAME_FILTER)
val scopes = fragments.map { it.getMemberScope() } + SubpackagesScope(module, fqName) 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? { override fun getContainingDeclaration(): PackageViewDescriptor? {
return if (fqName.isRoot) null else module.getPackage(fqName.parent()) return if (fqName.isRoot) null else module.getPackage(fqName.parent())
@@ -16,9 +16,20 @@
package org.jetbrains.kotlin.resolve.scopes 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<MemberScope>) : AbstractScopeAdapter() {
override val workerScope: MemberScope override val workerScope: MemberScope
get() = scope() get() = lazyScope()
} }