[Core API] Introduce API for getting scopes with refinement

- All refinement-related methods are incapsulated in
ModuleAwareClassDescriptor

- most of classes implement it trivially by retning unchanged scope

- LazyClassDescriptor and DeserializedClassDescriptor have non-trivial
implementations of the refinement-related methods

- General idea is to return new scope which captures refiner and will
later use it to get correct content of itself (currently, refiner is
unused, and will be used for that in later commits)

- In order to not repeat similar work, those new instances of scopes are
cached in ScopeHolderForClass, which is essentially a cache of form
KotlinTypeRefiner -> MemberScope
This commit is contained in:
Denis Zharkov
2019-06-25 18:31:24 +03:00
committed by Dmitry Savvinov
parent d08bed888c
commit c20d565d93
16 changed files with 225 additions and 52 deletions
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.types.AbstractClassTypeConstructor import org.jetbrains.kotlin.types.AbstractClassTypeConstructor
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeConstructor import org.jetbrains.kotlin.types.TypeConstructor
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
/* /*
* This class introduces all attributes that are needed for synthetic classes/object so far. * This class introduces all attributes that are needed for synthetic classes/object so far.
@@ -88,7 +89,7 @@ class SyntheticClassOrObjectDescriptor(
override fun getConstructors() = listOf(_unsubstitutedPrimaryConstructor()) + secondaryConstructors override fun getConstructors() = listOf(_unsubstitutedPrimaryConstructor()) + secondaryConstructors
override fun getDeclaredTypeParameters() = typeParameters override fun getDeclaredTypeParameters() = typeParameters
override fun getStaticScope() = MemberScope.Empty override fun getStaticScope() = MemberScope.Empty
override fun getUnsubstitutedMemberScope() = unsubstitutedMemberScope override fun getUnsubstitutedMemberScope(kotlinTypeRefiner: KotlinTypeRefiner) = unsubstitutedMemberScope
override fun getSealedSubclasses() = emptyList<ClassDescriptor>() override fun getSealedSubclasses() = emptyList<ClassDescriptor>()
init { init {
@@ -48,6 +48,7 @@ import org.jetbrains.kotlin.storage.NotNullLazyValue;
import org.jetbrains.kotlin.storage.NullableLazyValue; import org.jetbrains.kotlin.storage.NullableLazyValue;
import org.jetbrains.kotlin.storage.StorageManager; import org.jetbrains.kotlin.storage.StorageManager;
import org.jetbrains.kotlin.types.*; import org.jetbrains.kotlin.types.*;
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
@@ -91,7 +92,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
private final NullableLazyValue<ClassDescriptorWithResolutionScopes> companionObjectDescriptor; private final NullableLazyValue<ClassDescriptorWithResolutionScopes> companionObjectDescriptor;
private final MemoizedFunctionToNotNull<KtObjectDeclaration, ClassDescriptor> extraCompanionObjectDescriptors; private final MemoizedFunctionToNotNull<KtObjectDeclaration, ClassDescriptor> extraCompanionObjectDescriptors;
private final LazyClassMemberScope unsubstitutedMemberScope; private final ScopesHolderForClass<LazyClassMemberScope> scopesHolderForClass;
private final MemberScope staticScope; private final MemberScope staticScope;
private final NullableLazyValue<Void> forceResolveAllContents; private final NullableLazyValue<Void> forceResolveAllContents;
@@ -127,7 +128,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
StorageManager storageManager = c.getStorageManager(); StorageManager storageManager = c.getStorageManager();
this.unsubstitutedMemberScope = createMemberScope(c, this.declarationProvider); this.scopesHolderForClass = createMemberScope(c, this.declarationProvider);
this.kind = classLikeInfo.getClassKind(); this.kind = classLikeInfo.getClassKind();
this.staticScope = kind == ClassKind.ENUM_CLASS ? new StaticScopeForKotlinEnum(storageManager, this) : MemberScope.Empty.INSTANCE; this.staticScope = kind == ClassKind.ENUM_CLASS ? new StaticScopeForKotlinEnum(storageManager, this) : MemberScope.Empty.INSTANCE;
@@ -308,17 +309,22 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
// NOTE: Called from constructor! // NOTE: Called from constructor!
@NotNull @NotNull
protected LazyClassMemberScope createMemberScope( protected ScopesHolderForClass<LazyClassMemberScope> createMemberScope(
@NotNull LazyClassContext c, @NotNull LazyClassContext c,
@NotNull ClassMemberDeclarationProvider declarationProvider @NotNull ClassMemberDeclarationProvider declarationProvider
) { ) {
return new LazyClassMemberScope(c, declarationProvider, this, c.getTrace()); return ScopesHolderForClass.Companion.create(
this,
c.getStorageManager(),
c.getKotlinTypeChecker().getKotlinTypeRefiner(),
kotlinTypeRefiner -> new LazyClassMemberScope(c, declarationProvider, this, c.getTrace(), kotlinTypeRefiner)
);
} }
@NotNull @NotNull
@Override @Override
public MemberScope getUnsubstitutedMemberScope() { public MemberScope getUnsubstitutedMemberScope(@NotNull KotlinTypeRefiner kotlinTypeRefiner) {
return unsubstitutedMemberScope; return scopesHolderForClass.getScope(kotlinTypeRefiner);
} }
@NotNull @NotNull
@@ -367,7 +373,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public Collection<CallableMemberDescriptor> getDeclaredCallableMembers() { public Collection<CallableMemberDescriptor> getDeclaredCallableMembers() {
return (Collection) CollectionsKt.filter( return (Collection) CollectionsKt.filter(
DescriptorUtils.getAllDescriptors(unsubstitutedMemberScope), DescriptorUtils.getAllDescriptors(getUnsubstitutedMemberScope()),
descriptor -> descriptor instanceof CallableMemberDescriptor descriptor -> descriptor instanceof CallableMemberDescriptor
&& ((CallableMemberDescriptor) descriptor).getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE && ((CallableMemberDescriptor) descriptor).getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE
); );
@@ -382,12 +388,12 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
@NotNull @NotNull
@Override @Override
public Collection<ClassConstructorDescriptor> getConstructors() { public Collection<ClassConstructorDescriptor> getConstructors() {
return unsubstitutedMemberScope.getConstructors(); return ((LazyClassMemberScope) getUnsubstitutedMemberScope()).getConstructors();
} }
@Override @Override
public ClassConstructorDescriptor getUnsubstitutedPrimaryConstructor() { public ClassConstructorDescriptor getUnsubstitutedPrimaryConstructor() {
return unsubstitutedMemberScope.getPrimaryConstructor(); return ((LazyClassMemberScope) getUnsubstitutedMemberScope()).getPrimaryConstructor();
} }
@NotNull @NotNull
@@ -40,14 +40,18 @@ import org.jetbrains.kotlin.resolve.scopes.LexicalScope
import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.storage.NotNullLazyValue import org.jetbrains.kotlin.storage.NotNullLazyValue
import org.jetbrains.kotlin.storage.NullableLazyValue import org.jetbrains.kotlin.storage.NullableLazyValue
import org.jetbrains.kotlin.storage.getValue
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
import org.jetbrains.kotlin.types.refinement.TypeRefinement
import java.util.* import java.util.*
open class LazyClassMemberScope( open class LazyClassMemberScope(
c: LazyClassContext, c: LazyClassContext,
declarationProvider: ClassMemberDeclarationProvider, declarationProvider: ClassMemberDeclarationProvider,
thisClass: ClassDescriptorWithResolutionScopes, thisClass: ClassDescriptorWithResolutionScopes,
trace: BindingTrace trace: BindingTrace,
private val kotlinTypeRefiner: KotlinTypeRefiner = c.kotlinTypeChecker.kotlinTypeRefiner
) : AbstractLazyMemberScope<ClassDescriptorWithResolutionScopes, ClassMemberDeclarationProvider>(c, declarationProvider, thisClass, trace) { ) : AbstractLazyMemberScope<ClassDescriptorWithResolutionScopes, ClassMemberDeclarationProvider>(c, declarationProvider, thisClass, trace) {
private val descriptorsFromDeclaredElements = storageManager.createLazyValue { private val descriptorsFromDeclaredElements = storageManager.createLazyValue {
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils.COROUTINES_PACKAGE_FQ_NAME_R
import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
import java.util.* import java.util.*
/** /**
@@ -82,7 +83,7 @@ class FunctionClassDescriptor(
override fun getTypeConstructor(): TypeConstructor = typeConstructor override fun getTypeConstructor(): TypeConstructor = typeConstructor
override fun getUnsubstitutedMemberScope() = memberScope override fun getUnsubstitutedMemberScope(kotlinTypeRefiner: KotlinTypeRefiner) = memberScope
override fun getCompanionObjectDescriptor() = null override fun getCompanionObjectDescriptor() = null
override fun getConstructors() = emptyList<ClassConstructorDescriptor>() override fun getConstructors() = emptyList<ClassConstructorDescriptor>()
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.types.ClassTypeConstructorImpl import org.jetbrains.kotlin.types.ClassTypeConstructorImpl
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
class NotFoundClasses(private val storageManager: StorageManager, private val module: ModuleDescriptor) { class NotFoundClasses(private val storageManager: StorageManager, private val module: ModuleDescriptor) {
/** /**
@@ -73,7 +74,7 @@ class NotFoundClasses(private val storageManager: StorageManager, private val mo
override fun isExternal() = false override fun isExternal() = false
override val annotations: Annotations get() = Annotations.EMPTY override val annotations: Annotations get() = Annotations.EMPTY
override fun getUnsubstitutedMemberScope() = MemberScope.Empty override fun getUnsubstitutedMemberScope(kotlinTypeRefiner: KotlinTypeRefiner) = MemberScope.Empty
override fun getStaticScope() = MemberScope.Empty override fun getStaticScope() = MemberScope.Empty
override fun getConstructors(): Collection<ClassConstructorDescriptor> = emptySet() override fun getConstructors(): Collection<ClassConstructorDescriptor> = emptySet()
override fun getUnsubstitutedPrimaryConstructor(): ClassConstructorDescriptor? = null override fun getUnsubstitutedPrimaryConstructor(): ClassConstructorDescriptor? = null
@@ -0,0 +1,56 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.descriptors
import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.storage.getValue
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
import org.jetbrains.kotlin.types.refinement.TypeRefinement
class ScopesHolderForClass<T : MemberScope> private constructor(
private val classDescriptor: ClassDescriptor,
storageManager: StorageManager,
private val scopeFactory: (KotlinTypeRefiner) -> T,
private val kotlinTypeRefinerForOwnerModule: KotlinTypeRefiner
) {
private val scopeForOwnerModule by storageManager.createLazyValue {
scopeFactory(kotlinTypeRefinerForOwnerModule)
}
@UseExperimental(TypeRefinement::class)
fun getScope(kotlinTypeRefiner: KotlinTypeRefiner): T {
/*
* That check doesn't break anything, because scopeForOwnerModule _will_ anyway refine supertypes from module of
* class descriptor.
*
* Without that fastpass there is problem wit recursion types such that:
*
* interface A<T : A<T>>
*
* interface B : B<T>
*
* In this case (without check) we start compute default type of class descriptor B, go to isRefinementNeededForTypeConstructor,
* ask for supertypes of B, see A<B>, ask default type of class B and fail with recursion problem
*/
if (!kotlinTypeRefiner.isRefinementNeededForModule(classDescriptor.module)) return scopeForOwnerModule
if (!kotlinTypeRefiner.isRefinementNeededForTypeConstructor(classDescriptor.typeConstructor)) return scopeForOwnerModule
return kotlinTypeRefiner.getOrPutScopeForClass(classDescriptor) { scopeFactory(kotlinTypeRefiner) }
}
companion object {
fun <T : MemberScope> create(
classDescriptor: ClassDescriptor,
storageManager: StorageManager,
kotlinTypeRefinerForOwnerModule: KotlinTypeRefiner,
scopeFactory: (KotlinTypeRefiner) -> T
): ScopesHolderForClass<T> {
return ScopesHolderForClass(classDescriptor, storageManager, scopeFactory, kotlinTypeRefinerForOwnerModule)
}
}
}
@@ -18,20 +18,21 @@ package org.jetbrains.kotlin.descriptors.impl;
import kotlin.jvm.functions.Function0; import kotlin.jvm.functions.Function0;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.descriptors.ClassDescriptor; import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorVisitor;
import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor;
import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.resolve.DescriptorUtils;
import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt;
import org.jetbrains.kotlin.resolve.scopes.InnerClassesScopeWrapper; import org.jetbrains.kotlin.resolve.scopes.InnerClassesScopeWrapper;
import org.jetbrains.kotlin.resolve.scopes.MemberScope; import org.jetbrains.kotlin.resolve.scopes.MemberScope;
import org.jetbrains.kotlin.resolve.scopes.SubstitutingScope; import org.jetbrains.kotlin.resolve.scopes.SubstitutingScope;
import org.jetbrains.kotlin.storage.NotNullLazyValue; import org.jetbrains.kotlin.storage.NotNullLazyValue;
import org.jetbrains.kotlin.storage.StorageManager; import org.jetbrains.kotlin.storage.StorageManager;
import org.jetbrains.kotlin.types.*; import org.jetbrains.kotlin.types.*;
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner;
import java.util.List; import java.util.List;
public abstract class AbstractClassDescriptor implements ClassDescriptor { public abstract class AbstractClassDescriptor extends ModuleAwareClassDescriptor {
private final Name name; private final Name name;
protected final NotNullLazyValue<SimpleType> defaultType; protected final NotNullLazyValue<SimpleType> defaultType;
private final NotNullLazyValue<MemberScope> unsubstitutedInnerClassesScope; private final NotNullLazyValue<MemberScope> unsubstitutedInnerClassesScope;
@@ -85,23 +86,41 @@ public abstract class AbstractClassDescriptor implements ClassDescriptor {
@NotNull @NotNull
@Override @Override
public MemberScope getMemberScope(@NotNull List<? extends TypeProjection> typeArguments) { public MemberScope getMemberScope(@NotNull List<? extends TypeProjection> typeArguments, @NotNull KotlinTypeRefiner kotlinTypeRefiner) {
assert typeArguments.size() == getTypeConstructor().getParameters().size() : "Illegal number of type arguments: expected " assert typeArguments.size() == getTypeConstructor().getParameters().size() : "Illegal number of type arguments: expected "
+ getTypeConstructor().getParameters().size() + " but was " + typeArguments.size() + getTypeConstructor().getParameters().size() + " but was " + typeArguments.size()
+ " for " + getTypeConstructor() + " " + getTypeConstructor().getParameters(); + " for " + getTypeConstructor() + " " + getTypeConstructor().getParameters();
if (typeArguments.isEmpty()) return getUnsubstitutedMemberScope(); if (typeArguments.isEmpty()) return getUnsubstitutedMemberScope(kotlinTypeRefiner);
TypeSubstitutor substitutor = TypeConstructorSubstitution.create(getTypeConstructor(), typeArguments).buildSubstitutor(); TypeSubstitutor substitutor = TypeConstructorSubstitution.create(getTypeConstructor(), typeArguments).buildSubstitutor();
return new SubstitutingScope(getUnsubstitutedMemberScope(), substitutor); return new SubstitutingScope(getUnsubstitutedMemberScope(kotlinTypeRefiner), substitutor);
}
@NotNull
@Override
public MemberScope getMemberScope(@NotNull TypeSubstitution typeSubstitution, @NotNull KotlinTypeRefiner kotlinTypeRefiner) {
if (typeSubstitution.isEmpty()) return getUnsubstitutedMemberScope(kotlinTypeRefiner);
TypeSubstitutor substitutor = TypeSubstitutor.create(typeSubstitution);
return new SubstitutingScope(getUnsubstitutedMemberScope(kotlinTypeRefiner), substitutor);
}
@NotNull
@Override
public MemberScope getMemberScope(@NotNull List<? extends TypeProjection> typeArguments) {
return getMemberScope(typeArguments, DescriptorUtilsKt.getKotlinTypeRefiner(DescriptorUtils.getContainingModule(this)));
} }
@NotNull @NotNull
@Override @Override
public MemberScope getMemberScope(@NotNull TypeSubstitution typeSubstitution) { public MemberScope getMemberScope(@NotNull TypeSubstitution typeSubstitution) {
if (typeSubstitution.isEmpty()) return getUnsubstitutedMemberScope(); return getMemberScope(typeSubstitution, DescriptorUtilsKt.getKotlinTypeRefiner(DescriptorUtils.getContainingModule(this)));
}
TypeSubstitutor substitutor = TypeSubstitutor.create(typeSubstitution); @NotNull
return new SubstitutingScope(getUnsubstitutedMemberScope(), substitutor); @Override
public MemberScope getUnsubstitutedMemberScope() {
return getUnsubstitutedMemberScope(DescriptorUtilsKt.getKotlinTypeRefiner(DescriptorUtils.getContainingModule(this)));
} }
@NotNull @NotNull
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.storage.StorageManager;
import org.jetbrains.kotlin.types.ClassTypeConstructorImpl; import org.jetbrains.kotlin.types.ClassTypeConstructorImpl;
import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.KotlinType;
import org.jetbrains.kotlin.types.TypeConstructor; import org.jetbrains.kotlin.types.TypeConstructor;
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
@@ -79,7 +80,7 @@ public class ClassDescriptorImpl extends ClassDescriptorBase {
@NotNull @NotNull
@Override @Override
public MemberScope getUnsubstitutedMemberScope() { public MemberScope getUnsubstitutedMemberScope(@NotNull KotlinTypeRefiner kotlinTypeRefiner) {
return unsubstitutedMemberScope; return unsubstitutedMemberScope;
} }
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.storage.StorageManager;
import org.jetbrains.kotlin.types.ClassTypeConstructorImpl; import org.jetbrains.kotlin.types.ClassTypeConstructorImpl;
import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.KotlinType;
import org.jetbrains.kotlin.types.TypeConstructor; import org.jetbrains.kotlin.types.TypeConstructor;
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner;
import org.jetbrains.kotlin.utils.Printer; import org.jetbrains.kotlin.utils.Printer;
import java.util.*; import java.util.*;
@@ -76,7 +77,7 @@ public class EnumEntrySyntheticClassDescriptor extends ClassDescriptorBase {
@NotNull @NotNull
@Override @Override
public MemberScope getUnsubstitutedMemberScope() { public MemberScope getUnsubstitutedMemberScope(@NotNull KotlinTypeRefiner kotlinTypeRefiner) {
return scope; return scope;
} }
@@ -12,24 +12,27 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.descriptors.annotations.Annotations;
import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.resolve.DescriptorUtils;
import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt;
import org.jetbrains.kotlin.resolve.scopes.MemberScope; import org.jetbrains.kotlin.resolve.scopes.MemberScope;
import org.jetbrains.kotlin.resolve.scopes.SubstitutingScope; import org.jetbrains.kotlin.resolve.scopes.SubstitutingScope;
import org.jetbrains.kotlin.storage.LockBasedStorageManager; import org.jetbrains.kotlin.storage.LockBasedStorageManager;
import org.jetbrains.kotlin.types.*; import org.jetbrains.kotlin.types.*;
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
public class LazySubstitutingClassDescriptor implements ClassDescriptor { public class LazySubstitutingClassDescriptor extends ModuleAwareClassDescriptor {
private final ClassDescriptor original; private final ModuleAwareClassDescriptor original;
private final TypeSubstitutor originalSubstitutor; private final TypeSubstitutor originalSubstitutor;
private TypeSubstitutor newSubstitutor; private TypeSubstitutor newSubstitutor;
private List<TypeParameterDescriptor> typeConstructorParameters; private List<TypeParameterDescriptor> typeConstructorParameters;
private List<TypeParameterDescriptor> declaredTypeParameters; private List<TypeParameterDescriptor> declaredTypeParameters;
private TypeConstructor typeConstructor; private TypeConstructor typeConstructor;
public LazySubstitutingClassDescriptor(ClassDescriptor descriptor, TypeSubstitutor substitutor) { public LazySubstitutingClassDescriptor(ModuleAwareClassDescriptor descriptor, TypeSubstitutor substitutor) {
this.original = descriptor; this.original = descriptor;
this.originalSubstitutor = substitutor; this.originalSubstitutor = substitutor;
} }
@@ -82,28 +85,46 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor {
@NotNull @NotNull
@Override @Override
public MemberScope getMemberScope(@NotNull List<? extends TypeProjection> typeArguments) { public MemberScope getMemberScope(@NotNull List<? extends TypeProjection> typeArguments, @NotNull KotlinTypeRefiner kotlinTypeRefiner) {
MemberScope memberScope = original.getMemberScope(typeArguments); MemberScope memberScope = original.getMemberScope(typeArguments, kotlinTypeRefiner);
if (originalSubstitutor.isEmpty()) { if (originalSubstitutor.isEmpty()) {
return memberScope; return memberScope;
} }
return new SubstitutingScope(memberScope, getSubstitutor()); return new SubstitutingScope(memberScope, getSubstitutor());
} }
@NotNull
@Override
public MemberScope getMemberScope(@NotNull TypeSubstitution typeSubstitution, @NotNull KotlinTypeRefiner kotlinTypeRefiner) {
MemberScope memberScope = original.getMemberScope(typeSubstitution, kotlinTypeRefiner);
if (originalSubstitutor.isEmpty()) {
return memberScope;
}
return new SubstitutingScope(memberScope, getSubstitutor());
}
@NotNull
@Override
public MemberScope getMemberScope(@NotNull List<? extends TypeProjection> typeArguments) {
return getMemberScope(typeArguments, DescriptorUtilsKt.getKotlinTypeRefiner(DescriptorUtils.getContainingModule(this)));
}
@NotNull @NotNull
@Override @Override
public MemberScope getMemberScope(@NotNull TypeSubstitution typeSubstitution) { public MemberScope getMemberScope(@NotNull TypeSubstitution typeSubstitution) {
MemberScope memberScope = original.getMemberScope(typeSubstitution); return getMemberScope(typeSubstitution, DescriptorUtilsKt.getKotlinTypeRefiner(DescriptorUtils.getContainingModule(this)));
if (originalSubstitutor.isEmpty()) {
return memberScope;
}
return new SubstitutingScope(memberScope, getSubstitutor());
} }
@NotNull @NotNull
@Override @Override
public MemberScope getUnsubstitutedMemberScope() { public MemberScope getUnsubstitutedMemberScope() {
MemberScope memberScope = original.getUnsubstitutedMemberScope(); return getUnsubstitutedMemberScope(DescriptorUtilsKt.getKotlinTypeRefiner(DescriptorUtils.getContainingModule(original)));
}
@NotNull
@Override
public MemberScope getUnsubstitutedMemberScope(@NotNull KotlinTypeRefiner kotlinTypeRefiner) {
MemberScope memberScope = original.getUnsubstitutedMemberScope(kotlinTypeRefiner);
if (originalSubstitutor.isEmpty()) { if (originalSubstitutor.isEmpty()) {
return memberScope; return memberScope;
} }
@@ -0,0 +1,45 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.descriptors.impl
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.impl.ModuleAwareClassDescriptor.Companion.getRefinedMemberScopeIfPossible
import org.jetbrains.kotlin.descriptors.impl.ModuleAwareClassDescriptor.Companion.getRefinedUnsubstitutedMemberScopeIfPossible
import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.types.TypeProjection
import org.jetbrains.kotlin.types.TypeSubstitution
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
abstract class ModuleAwareClassDescriptor : ClassDescriptor {
protected abstract fun getUnsubstitutedMemberScope(kotlinTypeRefiner: KotlinTypeRefiner): MemberScope
protected abstract fun getMemberScope(typeSubstitution: TypeSubstitution, kotlinTypeRefiner: KotlinTypeRefiner): MemberScope
protected abstract fun getMemberScope(typeArguments: List<TypeProjection>, kotlinTypeRefiner: KotlinTypeRefiner): MemberScope
companion object {
internal fun ClassDescriptor.getRefinedUnsubstitutedMemberScopeIfPossible(
kotlinTypeRefiner: KotlinTypeRefiner
): MemberScope =
(this as? ModuleAwareClassDescriptor)?.getUnsubstitutedMemberScope(kotlinTypeRefiner) ?: this.unsubstitutedMemberScope
internal fun ClassDescriptor.getRefinedMemberScopeIfPossible(
typeSubstitution: TypeSubstitution,
kotlinTypeRefiner: KotlinTypeRefiner
): MemberScope =
(this as? ModuleAwareClassDescriptor)?.getMemberScope(typeSubstitution, kotlinTypeRefiner) ?: this.getMemberScope(
typeSubstitution
)
}
}
fun ClassDescriptor.getRefinedUnsubstitutedMemberScopeIfPossible(
kotlinTypeRefiner: KotlinTypeRefiner
): MemberScope = getRefinedUnsubstitutedMemberScopeIfPossible(kotlinTypeRefiner)
fun ClassDescriptor.getRefinedMemberScopeIfPossible(
typeSubstitution: TypeSubstitution,
kotlinTypeRefiner: KotlinTypeRefiner
): MemberScope = getRefinedMemberScopeIfPossible(typeSubstitution, kotlinTypeRefiner)
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.resolve.scopes.MemberScope; import org.jetbrains.kotlin.resolve.scopes.MemberScope;
import org.jetbrains.kotlin.storage.StorageManager; import org.jetbrains.kotlin.storage.StorageManager;
import org.jetbrains.kotlin.types.*; import org.jetbrains.kotlin.types.*;
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner;
import java.util.*; import java.util.*;
@@ -162,7 +163,7 @@ public class MutableClassDescriptor extends ClassDescriptorBase {
@Override @Override
@NotNull @NotNull
public MemberScope getUnsubstitutedMemberScope() { public MemberScope getUnsubstitutedMemberScope(@NotNull KotlinTypeRefiner kotlinTypeRefiner) {
return MemberScope.Empty.INSTANCE; // used for getDefaultType return MemberScope.Empty.INSTANCE; // used for getDefaultType
} }
@@ -35,7 +35,9 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt;
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter; import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter;
import org.jetbrains.kotlin.resolve.scopes.MemberScope; import org.jetbrains.kotlin.resolve.scopes.MemberScope;
import org.jetbrains.kotlin.storage.LockBasedStorageManager; import org.jetbrains.kotlin.storage.LockBasedStorageManager;
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner;
import org.jetbrains.kotlin.types.error.ErrorSimpleFunctionDescriptorImpl; import org.jetbrains.kotlin.types.error.ErrorSimpleFunctionDescriptorImpl;
import org.jetbrains.kotlin.types.refinement.TypeRefinement;
import org.jetbrains.kotlin.utils.Printer; import org.jetbrains.kotlin.utils.Printer;
import java.util.Collection; import java.util.Collection;
@@ -372,13 +374,13 @@ public class ErrorUtils {
@NotNull @NotNull
@Override @Override
public MemberScope getMemberScope(@NotNull List<? extends TypeProjection> typeArguments) { public MemberScope getMemberScope(@NotNull List<? extends TypeProjection> typeArguments, @NotNull KotlinTypeRefiner kotlinTypeRefiner) {
return createErrorScope("Error scope for class " + getName() + " with arguments: " + typeArguments); return createErrorScope("Error scope for class " + getName() + " with arguments: " + typeArguments);
} }
@NotNull @NotNull
@Override @Override
public MemberScope getMemberScope(@NotNull TypeSubstitution typeSubstitution) { public MemberScope getMemberScope(@NotNull TypeSubstitution typeSubstitution, @NotNull KotlinTypeRefiner kotlinTypeRefiner) {
return createErrorScope("Error scope for class " + getName() + " with arguments: " + typeSubstitution); return createErrorScope("Error scope for class " + getName() + " with arguments: " + typeSubstitution);
} }
} }
@@ -27,6 +27,8 @@ import org.jetbrains.kotlin.serialization.deserialization.*
import org.jetbrains.kotlin.types.AbstractClassTypeConstructor import org.jetbrains.kotlin.types.AbstractClassTypeConstructor
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeConstructor import org.jetbrains.kotlin.types.TypeConstructor
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
import org.jetbrains.kotlin.types.refinement.TypeRefinement
import java.util.* import java.util.*
class DeserializedClassDescriptor( class DeserializedClassDescriptor(
@@ -52,7 +54,11 @@ class DeserializedClassDescriptor(
private val staticScope = if (kind == ClassKind.ENUM_CLASS) StaticScopeForKotlinEnum(c.storageManager, this) else MemberScope.Empty private val staticScope = if (kind == ClassKind.ENUM_CLASS) StaticScopeForKotlinEnum(c.storageManager, this) else MemberScope.Empty
private val typeConstructor = DeserializedClassTypeConstructor() private val typeConstructor = DeserializedClassTypeConstructor()
private val memberScope = DeserializedClassMemberScope()
private val memberScopeHolder =
ScopesHolderForClass.create(this, c.storageManager, c.components.kotlinTypeChecker.kotlinTypeRefiner, this::DeserializedClassMemberScope)
private val memberScope get() = memberScopeHolder.getScope(c.components.kotlinTypeChecker.kotlinTypeRefiner)
private val enumEntries = if (kind == ClassKind.ENUM_CLASS) EnumEntryClassDescriptors() else null private val enumEntries = if (kind == ClassKind.ENUM_CLASS) EnumEntryClassDescriptors() else null
private val containingDeclaration = outerContext.containingDeclaration private val containingDeclaration = outerContext.containingDeclaration
@@ -98,7 +104,8 @@ class DeserializedClassDescriptor(
override fun isExternal() = Flags.IS_EXTERNAL_CLASS.get(classProto.flags) override fun isExternal() = Flags.IS_EXTERNAL_CLASS.get(classProto.flags)
override fun getUnsubstitutedMemberScope(): MemberScope = memberScope override fun getUnsubstitutedMemberScope(kotlinTypeRefiner: KotlinTypeRefiner): MemberScope =
memberScopeHolder.getScope(kotlinTypeRefiner)
override fun getStaticScope() = staticScope override fun getStaticScope() = staticScope
@@ -200,7 +207,7 @@ class DeserializedClassDescriptor(
get() = SupertypeLoopChecker.EMPTY get() = SupertypeLoopChecker.EMPTY
} }
private inner class DeserializedClassMemberScope : DeserializedMemberScope( private inner class DeserializedClassMemberScope(private val kotlinTypeRefiner: KotlinTypeRefiner) : DeserializedMemberScope(
c, classProto.functionList, classProto.propertyList, classProto.typeAliasList, c, classProto.functionList, classProto.propertyList, classProto.typeAliasList,
classProto.nestedClassNameList.map(c.nameResolver::getName).let { { it } } // workaround KT-13454 classProto.nestedClassNameList.map(c.nameResolver::getName).let { { it } } // workaround KT-13454
) { ) {
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.resolve.lazy.ResolveSession
import org.jetbrains.kotlin.resolve.lazy.data.KtScriptInfo import org.jetbrains.kotlin.resolve.lazy.data.KtScriptInfo
import org.jetbrains.kotlin.resolve.lazy.declarations.ClassMemberDeclarationProvider import org.jetbrains.kotlin.resolve.lazy.declarations.ClassMemberDeclarationProvider
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassMemberScope
import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.LexicalScope
import org.jetbrains.kotlin.resolve.scopes.LexicalScopeImpl import org.jetbrains.kotlin.resolve.scopes.LexicalScopeImpl
import org.jetbrains.kotlin.resolve.scopes.LexicalScopeKind import org.jetbrains.kotlin.resolve.scopes.LexicalScopeKind
@@ -144,14 +145,19 @@ class LazyScriptDescriptor(
override fun <R, D> accept(visitor: DeclarationDescriptorVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: DeclarationDescriptorVisitor<R, D>, data: D): R =
visitor.visitScriptDescriptor(this, data) visitor.visitScriptDescriptor(this, data)
override fun createMemberScope(c: LazyClassContext, declarationProvider: ClassMemberDeclarationProvider): LazyScriptClassMemberScope = override fun createMemberScope(
LazyScriptClassMemberScope( c: LazyClassContext,
// Must be a ResolveSession for scripts declarationProvider: ClassMemberDeclarationProvider
c as ResolveSession, ): ScopesHolderForClass<LazyClassMemberScope> =
declarationProvider, ScopesHolderForClass.create(this, c.storageManager, c.kotlinTypeChecker.kotlinTypeRefiner) {
this, LazyScriptClassMemberScope(
c.trace // Must be a ResolveSession for scripts
) c as ResolveSession,
declarationProvider,
this,
c.trace
)
}
override fun getUnsubstitutedPrimaryConstructor() = super.getUnsubstitutedPrimaryConstructor()!! override fun getUnsubstitutedPrimaryConstructor() = super.getUnsubstitutedPrimaryConstructor()!!
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.resolve.scopes.MemberScopeImpl import org.jetbrains.kotlin.resolve.scopes.MemberScopeImpl
import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.LockBasedStorageManager
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
import org.jetbrains.kotlin.utils.Printer import org.jetbrains.kotlin.utils.Printer
import kotlin.script.experimental.api.ScriptCompilationConfiguration import kotlin.script.experimental.api.ScriptCompilationConfiguration
import kotlin.script.experimental.api.providedProperties import kotlin.script.experimental.api.providedProperties
@@ -42,7 +43,7 @@ class ScriptProvidedPropertiesDescriptor(script: LazyScriptDescriptor) :
) )
} }
override fun getUnsubstitutedMemberScope(): MemberScope = memberScope() override fun getUnsubstitutedMemberScope(kotlinTypeRefiner: KotlinTypeRefiner): MemberScope = memberScope()
val properties: () -> List<ScriptProvidedPropertyDescriptor> = script.resolveSession.storageManager.createLazyValue { val properties: () -> List<ScriptProvidedPropertyDescriptor> = script.resolveSession.storageManager.createLazyValue {
script.scriptCompilationConfiguration()[ScriptCompilationConfiguration.providedProperties].orEmpty().mapNotNull { (name, type) -> script.scriptCompilationConfiguration()[ScriptCompilationConfiguration.providedProperties].orEmpty().mapNotNull { (name, type) ->