Introduce MemberScope::classifierNames and some implementations
It aims to help with further optimizations
This commit is contained in:
+1
@@ -58,6 +58,7 @@ class LazyPackageMemberScope(
|
|||||||
c.lookupTracker.record(from, thisDescriptor, name)
|
c.lookupTracker.record(from, thisDescriptor, name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getClassifierNames(): Set<Name>? = declarationProvider.getDeclarationNames()
|
||||||
override fun getFunctionNames() = declarationProvider.getDeclarationNames()
|
override fun getFunctionNames() = declarationProvider.getDeclarationNames()
|
||||||
override fun getVariableNames() = declarationProvider.getDeclarationNames()
|
override fun getVariableNames() = declarationProvider.getDeclarationNames()
|
||||||
|
|
||||||
|
|||||||
+5
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.load.java.structure.JavaPackage
|
|||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
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.resolve.scopes.flatMapClassifierNamesOrNull
|
||||||
import org.jetbrains.kotlin.storage.getValue
|
import org.jetbrains.kotlin.storage.getValue
|
||||||
import org.jetbrains.kotlin.util.collectionUtils.getFirstClassifierDiscriminateHeaders
|
import org.jetbrains.kotlin.util.collectionUtils.getFirstClassifierDiscriminateHeaders
|
||||||
import org.jetbrains.kotlin.util.collectionUtils.getFromAllScopes
|
import org.jetbrains.kotlin.util.collectionUtils.getFromAllScopes
|
||||||
@@ -76,6 +77,10 @@ class JvmPackageScope(
|
|||||||
addAll(javaScope.getVariableNames())
|
addAll(javaScope.getVariableNames())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getClassifierNames(): Set<Name>? = kotlinScopes.flatMapClassifierNamesOrNull()?.apply {
|
||||||
|
addAll(javaScope.getClassifierNames())
|
||||||
|
}
|
||||||
|
|
||||||
override fun printScopeStructure(p: Printer) {
|
override fun printScopeStructure(p: Printer) {
|
||||||
p.println(this::class.java.simpleName, " {")
|
p.println(this::class.java.simpleName, " {")
|
||||||
p.pushIndent()
|
p.pushIndent()
|
||||||
|
|||||||
+2
@@ -212,9 +212,11 @@ abstract class LazyJavaScope(protected val c: LazyJavaResolverContext) : MemberS
|
|||||||
|
|
||||||
private val functionNamesLazy by c.storageManager.createLazyValue { computeFunctionNames(DescriptorKindFilter.FUNCTIONS, null) }
|
private val functionNamesLazy by c.storageManager.createLazyValue { computeFunctionNames(DescriptorKindFilter.FUNCTIONS, null) }
|
||||||
private val propertyNamesLazy by c.storageManager.createLazyValue { computePropertyNames(DescriptorKindFilter.VARIABLES, null) }
|
private val propertyNamesLazy by c.storageManager.createLazyValue { computePropertyNames(DescriptorKindFilter.VARIABLES, null) }
|
||||||
|
private val classNamesLazy by c.storageManager.createLazyValue { computeClassNames(DescriptorKindFilter.CLASSIFIERS, null) }
|
||||||
|
|
||||||
override fun getFunctionNames() = functionNamesLazy
|
override fun getFunctionNames() = functionNamesLazy
|
||||||
override fun getVariableNames() = propertyNamesLazy
|
override fun getVariableNames() = propertyNamesLazy
|
||||||
|
override fun getClassifierNames() = classNamesLazy
|
||||||
|
|
||||||
override fun getContributedFunctions(name: Name, location: LookupLocation): Collection<SimpleFunctionDescriptor> {
|
override fun getContributedFunctions(name: Name, location: LookupLocation): Collection<SimpleFunctionDescriptor> {
|
||||||
if (name !in getFunctionNames()) return emptyList()
|
if (name !in getFunctionNames()) return emptyList()
|
||||||
|
|||||||
+6
@@ -310,6 +310,12 @@ public class EnumEntrySyntheticClassDescriptor extends ClassDescriptorBase {
|
|||||||
return enumMemberNames.invoke();
|
return enumMemberNames.invoke();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Set<Name> getClassifierNames() {
|
||||||
|
return Collections.emptySet();
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Set<Name> getVariableNames() {
|
public Set<Name> getVariableNames() {
|
||||||
|
|||||||
@@ -57,6 +57,8 @@ open class SubpackagesScope(private val moduleDescriptor: ModuleDescriptor, priv
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getClassifierNames(): Set<Name> = emptySet()
|
||||||
|
|
||||||
override fun printScopeStructure(p: Printer) {
|
override fun printScopeStructure(p: Printer) {
|
||||||
p.println(this::class.java.simpleName, " {")
|
p.println(this::class.java.simpleName, " {")
|
||||||
p.pushIndent()
|
p.pushIndent()
|
||||||
|
|||||||
@@ -55,6 +55,8 @@ abstract class AbstractScopeAdapter : MemberScope {
|
|||||||
|
|
||||||
override fun getFunctionNames() = workerScope.getFunctionNames()
|
override fun getFunctionNames() = workerScope.getFunctionNames()
|
||||||
override fun getVariableNames() = workerScope.getVariableNames()
|
override fun getVariableNames() = workerScope.getVariableNames()
|
||||||
|
override fun getClassifierNames() = workerScope.getClassifierNames()
|
||||||
|
|
||||||
|
|
||||||
override fun printScopeStructure(p: Printer) {
|
override fun printScopeStructure(p: Printer) {
|
||||||
p.println(this::class.java.simpleName, " {")
|
p.println(this::class.java.simpleName, " {")
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ class ChainedMemberScope(
|
|||||||
|
|
||||||
override fun getFunctionNames() = scopes.flatMapTo(mutableSetOf()) { it.getFunctionNames() }
|
override fun getFunctionNames() = scopes.flatMapTo(mutableSetOf()) { it.getFunctionNames() }
|
||||||
override fun getVariableNames() = scopes.flatMapTo(mutableSetOf()) { it.getVariableNames() }
|
override fun getVariableNames() = scopes.flatMapTo(mutableSetOf()) { it.getVariableNames() }
|
||||||
|
override fun getClassifierNames(): Set<Name>? = scopes.flatMapClassifierNamesOrNull()
|
||||||
|
|
||||||
override fun toString() = debugName
|
override fun toString() = debugName
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,10 @@ class InnerClassesScopeWrapper(val workerScope: MemberScope) : MemberScopeImpl()
|
|||||||
workerScope.printScopeStructure(p)
|
workerScope.printScopeStructure(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getFunctionNames() = workerScope.getFunctionNames()
|
||||||
|
override fun getVariableNames() = workerScope.getVariableNames()
|
||||||
|
override fun getClassifierNames() = workerScope.getClassifierNames()
|
||||||
|
|
||||||
override fun definitelyDoesNotContainName(name: Name) = workerScope.definitelyDoesNotContainName(name)
|
override fun definitelyDoesNotContainName(name: Name) = workerScope.definitelyDoesNotContainName(name)
|
||||||
|
|
||||||
override fun toString() = "Classes from $workerScope"
|
override fun toString() = "Classes from $workerScope"
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.*
|
|||||||
import org.jetbrains.kotlin.incremental.components.LookupLocation
|
import org.jetbrains.kotlin.incremental.components.LookupLocation
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.utils.Printer
|
import org.jetbrains.kotlin.utils.Printer
|
||||||
|
import org.jetbrains.kotlin.utils.addToStdlib.flatMapToNullable
|
||||||
import java.lang.reflect.Modifier
|
import java.lang.reflect.Modifier
|
||||||
|
|
||||||
interface MemberScope : ResolutionScope {
|
interface MemberScope : ResolutionScope {
|
||||||
@@ -32,6 +33,7 @@ interface MemberScope : ResolutionScope {
|
|||||||
*/
|
*/
|
||||||
fun getFunctionNames(): Set<Name>
|
fun getFunctionNames(): Set<Name>
|
||||||
fun getVariableNames(): Set<Name>
|
fun getVariableNames(): Set<Name>
|
||||||
|
fun getClassifierNames(): Set<Name>?
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is supposed to be used in tests and debug only
|
* Is supposed to be used in tests and debug only
|
||||||
@@ -45,6 +47,7 @@ interface MemberScope : ResolutionScope {
|
|||||||
|
|
||||||
override fun getFunctionNames() = emptySet<Name>()
|
override fun getFunctionNames() = emptySet<Name>()
|
||||||
override fun getVariableNames() = emptySet<Name>()
|
override fun getVariableNames() = emptySet<Name>()
|
||||||
|
override fun getClassifierNames() = emptySet<Name>()
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@@ -52,6 +55,11 @@ interface MemberScope : ResolutionScope {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun MemberScope.computeAllNames() = getClassifierNames()?.let { getFunctionNames() + getVariableNames() + it }
|
||||||
|
|
||||||
|
fun Collection<MemberScope>.flatMapClassifierNamesOrNull(): MutableSet<Name>? =
|
||||||
|
flatMapToNullable(hashSetOf(), MemberScope::getClassifierNames)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The same as getDescriptors(kindFilter, nameFilter) but the result is guaranteed to be filtered by kind and name.
|
* The same as getDescriptors(kindFilter, nameFilter) but the result is guaranteed to be filtered by kind and name.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -42,6 +42,8 @@ abstract class MemberScopeImpl : MemberScope {
|
|||||||
DescriptorKindFilter.VARIABLES, alwaysTrue()
|
DescriptorKindFilter.VARIABLES, alwaysTrue()
|
||||||
).filterIsInstance<VariableDescriptor>().mapTo(mutableSetOf()) { it.name }
|
).filterIsInstance<VariableDescriptor>().mapTo(mutableSetOf()) { it.name }
|
||||||
|
|
||||||
|
override fun getClassifierNames(): Set<Name>? = null
|
||||||
|
|
||||||
// This method should not be implemented here by default: every scope class has its unique structure pattern
|
// This method should not be implemented here by default: every scope class has its unique structure pattern
|
||||||
abstract override fun printScopeStructure(p: Printer)
|
abstract override fun printScopeStructure(p: Printer)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ class SubstitutingScope(private val workerScope: MemberScope, givenSubstitutor:
|
|||||||
|
|
||||||
override fun getFunctionNames() = workerScope.getFunctionNames()
|
override fun getFunctionNames() = workerScope.getFunctionNames()
|
||||||
override fun getVariableNames() = workerScope.getVariableNames()
|
override fun getVariableNames() = workerScope.getVariableNames()
|
||||||
|
override fun getClassifierNames() = workerScope.getClassifierNames()
|
||||||
|
|
||||||
override fun definitelyDoesNotContainName(name: Name) = workerScope.definitelyDoesNotContainName(name)
|
override fun definitelyDoesNotContainName(name: Name) = workerScope.definitelyDoesNotContainName(name)
|
||||||
|
|
||||||
|
|||||||
@@ -211,6 +211,12 @@ public class ErrorUtils {
|
|||||||
return emptySet();
|
return emptySet();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Set<Name> getClassifierNames() {
|
||||||
|
return emptySet();
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Collection<DeclarationDescriptor> getContributedDescriptors(
|
public Collection<DeclarationDescriptor> getContributedDescriptors(
|
||||||
@@ -284,6 +290,11 @@ public class ErrorUtils {
|
|||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Name> getClassifierNames() {
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean definitelyDoesNotContainName(@NotNull Name name) {
|
public boolean definitelyDoesNotContainName(@NotNull Name name) {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
+1
@@ -107,6 +107,7 @@ class MetadataPackageFragment(
|
|||||||
) {
|
) {
|
||||||
override fun hasClass(name: Name): Boolean = hasTopLevelClass(name)
|
override fun hasClass(name: Name): Boolean = hasTopLevelClass(name)
|
||||||
override fun definitelyDoesNotContainName(name: Name) = false
|
override fun definitelyDoesNotContainName(name: Name) = false
|
||||||
|
override fun getClassifierNames(): Set<Name>? = null
|
||||||
})
|
})
|
||||||
|
|
||||||
return ChainedMemberScope.create("Metadata scope", scopes)
|
return ChainedMemberScope.create("Metadata scope", scopes)
|
||||||
|
|||||||
+1
@@ -76,6 +76,7 @@ abstract class DeserializedMemberScope protected constructor(
|
|||||||
|
|
||||||
override fun getFunctionNames() = functionNamesLazy
|
override fun getFunctionNames() = functionNamesLazy
|
||||||
override fun getVariableNames() = variableNamesLazy
|
override fun getVariableNames() = variableNamesLazy
|
||||||
|
override fun getClassifierNames(): Set<Name>? = classNames + typeAliasNames
|
||||||
|
|
||||||
private inline fun <M : MessageLite> Collection<M>.groupByName(
|
private inline fun <M : MessageLite> Collection<M>.groupByName(
|
||||||
getNameIndex: (M) -> Int
|
getNameIndex: (M) -> Int
|
||||||
|
|||||||
@@ -138,3 +138,11 @@ fun <T, C : MutableCollection<in T>> Iterable<Iterable<T>>.flattenTo(c: C): C {
|
|||||||
}
|
}
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline fun <T, R, C : MutableCollection<in R>> Iterable<T>.flatMapToNullable(destination: C, transform: (T) -> Iterable<R>?): C? {
|
||||||
|
for (element in this) {
|
||||||
|
val list = transform(element) ?: return null
|
||||||
|
destination.addAll(list)
|
||||||
|
}
|
||||||
|
return destination
|
||||||
|
}
|
||||||
|
|||||||
@@ -253,6 +253,8 @@ private class ExtensionsScope(
|
|||||||
.toSet()
|
.toSet()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getClassifierNames() = null
|
||||||
|
|
||||||
override fun printScopeStructure(p: Printer) {
|
override fun printScopeStructure(p: Printer) {
|
||||||
p.println("Extensions for ${receiverClass.name} in:")
|
p.println("Extensions for ${receiverClass.name} in:")
|
||||||
contextScope.printStructure(p)
|
contextScope.printStructure(p)
|
||||||
|
|||||||
@@ -75,8 +75,8 @@ private class GlobalSyntheticPackageViewDescriptor(override val fqName: FqName,
|
|||||||
override fun getContributedFunctions(name: Name, location: LookupLocation): Collection<SimpleFunctionDescriptor> = shouldNotBeCalled()
|
override fun getContributedFunctions(name: Name, location: LookupLocation): Collection<SimpleFunctionDescriptor> = shouldNotBeCalled()
|
||||||
|
|
||||||
override fun getFunctionNames(): Set<Name> = shouldNotBeCalled()
|
override fun getFunctionNames(): Set<Name> = shouldNotBeCalled()
|
||||||
|
|
||||||
override fun getVariableNames(): Set<Name> = shouldNotBeCalled()
|
override fun getVariableNames(): Set<Name> = shouldNotBeCalled()
|
||||||
|
override fun getClassifierNames(): Set<Name> = shouldNotBeCalled()
|
||||||
|
|
||||||
override fun getContributedClassifier(name: Name, location: LookupLocation): ClassifierDescriptor? = shouldNotBeCalled()
|
override fun getContributedClassifier(name: Name, location: LookupLocation): ClassifierDescriptor? = shouldNotBeCalled()
|
||||||
|
|
||||||
@@ -130,4 +130,4 @@ private class GlobalSyntheticPackageViewDescriptor(override val fqName: FqName,
|
|||||||
override fun acceptVoid(visitor: DeclarationDescriptorVisitor<Void, Void>?) = shouldNotBeCalled()
|
override fun acceptVoid(visitor: DeclarationDescriptorVisitor<Void, Void>?) = shouldNotBeCalled()
|
||||||
|
|
||||||
override val annotations = Annotations.EMPTY
|
override val annotations = Annotations.EMPTY
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user