[API Usage] Refine supertypes when getting content of member scope

This commit is contained in:
Dmitry Savvinov
2019-07-10 15:41:29 +03:00
parent 1d61d75225
commit 9047ddfc2f
2 changed files with 17 additions and 7 deletions
@@ -76,7 +76,7 @@ open class LazyClassMemberScope(
protected open fun computeExtraDescriptors(location: LookupLocation): Collection<DeclarationDescriptor> { protected open fun computeExtraDescriptors(location: LookupLocation): Collection<DeclarationDescriptor> {
val result = ArrayList<DeclarationDescriptor>() val result = ArrayList<DeclarationDescriptor>()
for (supertype in thisDescriptor.typeConstructor.supertypes) { for (supertype in supertypes) {
for (descriptor in supertype.memberScope.getContributedDescriptors()) { for (descriptor in supertype.memberScope.getContributedDescriptors()) {
if (descriptor is FunctionDescriptor) { if (descriptor is FunctionDescriptor) {
result.addAll(getContributedFunctions(descriptor.name, location)) result.addAll(getContributedFunctions(descriptor.name, location))
@@ -96,11 +96,16 @@ open class LazyClassMemberScope(
return result return result
} }
val supertypes by storageManager.createLazyValue {
@UseExperimental(TypeRefinement::class)
kotlinTypeRefiner.refineSupertypes(thisDescriptor)
}
private val _variableNames: MutableSet<Name> private val _variableNames: MutableSet<Name>
by lazy(LazyThreadSafetyMode.PUBLICATION) { by lazy(LazyThreadSafetyMode.PUBLICATION) {
mutableSetOf<Name>().apply { mutableSetOf<Name>().apply {
addAll(declarationProvider.getDeclarationNames()) addAll(declarationProvider.getDeclarationNames())
thisDescriptor.typeConstructor.supertypes.flatMapTo(this) { supertypes.flatMapTo(this) {
it.memberScope.getVariableNames() it.memberScope.getVariableNames()
} }
} }
@@ -110,7 +115,7 @@ open class LazyClassMemberScope(
by lazy(LazyThreadSafetyMode.PUBLICATION) { by lazy(LazyThreadSafetyMode.PUBLICATION) {
mutableSetOf<Name>().apply { mutableSetOf<Name>().apply {
addAll(declarationProvider.getDeclarationNames()) addAll(declarationProvider.getDeclarationNames())
thisDescriptor.typeConstructor.supertypes.flatMapTo(this) { supertypes.flatMapTo(this) {
it.memberScope.getFunctionNames() it.memberScope.getFunctionNames()
} }
@@ -203,7 +208,7 @@ open class LazyClassMemberScope(
val location = NoLookupLocation.FOR_ALREADY_TRACKED val location = NoLookupLocation.FOR_ALREADY_TRACKED
val fromSupertypes = arrayListOf<SimpleFunctionDescriptor>() val fromSupertypes = arrayListOf<SimpleFunctionDescriptor>()
for (supertype in thisDescriptor.typeConstructor.supertypes) { for (supertype in supertypes) {
fromSupertypes.addAll(supertype.memberScope.getContributedFunctions(name, location)) fromSupertypes.addAll(supertype.memberScope.getContributedFunctions(name, location))
} }
result.addAll(generateDelegatingDescriptors(name, EXTRACT_FUNCTIONS, result)) result.addAll(generateDelegatingDescriptors(name, EXTRACT_FUNCTIONS, result))
@@ -345,7 +350,7 @@ open class LazyClassMemberScope(
// Members from supertypes // Members from supertypes
val fromSupertypes = ArrayList<PropertyDescriptor>() val fromSupertypes = ArrayList<PropertyDescriptor>()
for (supertype in thisDescriptor.typeConstructor.supertypes) { for (supertype in supertypes) {
fromSupertypes.addAll(supertype.memberScope.getContributedVariables(name, NoLookupLocation.FOR_ALREADY_TRACKED)) fromSupertypes.addAll(supertype.memberScope.getContributedVariables(name, NoLookupLocation.FOR_ALREADY_TRACKED))
} }
result.addAll(generateDelegatingDescriptors(name, EXTRACT_PROPERTIES, result)) result.addAll(generateDelegatingDescriptors(name, EXTRACT_PROPERTIES, result))
@@ -217,6 +217,11 @@ class DeserializedClassDescriptor(
computeDescriptors(DescriptorKindFilter.ALL, MemberScope.ALL_NAME_FILTER, NoLookupLocation.WHEN_GET_ALL_DESCRIPTORS) computeDescriptors(DescriptorKindFilter.ALL, MemberScope.ALL_NAME_FILTER, NoLookupLocation.WHEN_GET_ALL_DESCRIPTORS)
} }
private val refinedSupertypes = c.storageManager.createLazyValue {
@UseExperimental(TypeRefinement::class)
kotlinTypeRefiner.refineSupertypes(classDescriptor)
}
override fun getContributedDescriptors( override fun getContributedDescriptors(
kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean
): Collection<DeclarationDescriptor> = allDescriptors() ): Collection<DeclarationDescriptor> = allDescriptors()
@@ -233,7 +238,7 @@ class DeserializedClassDescriptor(
override fun computeNonDeclaredFunctions(name: Name, functions: MutableCollection<SimpleFunctionDescriptor>) { override fun computeNonDeclaredFunctions(name: Name, functions: MutableCollection<SimpleFunctionDescriptor>) {
val fromSupertypes = ArrayList<SimpleFunctionDescriptor>() val fromSupertypes = ArrayList<SimpleFunctionDescriptor>()
for (supertype in classDescriptor.getTypeConstructor().supertypes) { for (supertype in refinedSupertypes()) {
fromSupertypes.addAll(supertype.memberScope.getContributedFunctions(name, NoLookupLocation.FOR_ALREADY_TRACKED)) fromSupertypes.addAll(supertype.memberScope.getContributedFunctions(name, NoLookupLocation.FOR_ALREADY_TRACKED))
} }
@@ -247,7 +252,7 @@ class DeserializedClassDescriptor(
override fun computeNonDeclaredProperties(name: Name, descriptors: MutableCollection<PropertyDescriptor>) { override fun computeNonDeclaredProperties(name: Name, descriptors: MutableCollection<PropertyDescriptor>) {
val fromSupertypes = ArrayList<PropertyDescriptor>() val fromSupertypes = ArrayList<PropertyDescriptor>()
for (supertype in classDescriptor.getTypeConstructor().supertypes) { for (supertype in refinedSupertypes()) {
fromSupertypes.addAll(supertype.memberScope.getContributedVariables(name, NoLookupLocation.FOR_ALREADY_TRACKED)) fromSupertypes.addAll(supertype.memberScope.getContributedVariables(name, NoLookupLocation.FOR_ALREADY_TRACKED))
} }
generateFakeOverrides(name, fromSupertypes, descriptors) generateFakeOverrides(name, fromSupertypes, descriptors)