diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyPackageMemberScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyPackageMemberScope.kt index 3b86bcc1d2e..5ecd085013f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyPackageMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyPackageMemberScope.kt @@ -58,6 +58,7 @@ class LazyPackageMemberScope( c.lookupTracker.record(from, thisDescriptor, name) } + override fun getClassifierNames(): Set? = declarationProvider.getDeclarationNames() override fun getFunctionNames() = declarationProvider.getDeclarationNames() override fun getVariableNames() = declarationProvider.getDeclarationNames() diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/JvmPackageScope.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/JvmPackageScope.kt index 957ccb8a000..9e33002bbb0 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/JvmPackageScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/JvmPackageScope.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.load.java.structure.JavaPackage import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.MemberScope +import org.jetbrains.kotlin.resolve.scopes.flatMapClassifierNamesOrNull import org.jetbrains.kotlin.storage.getValue import org.jetbrains.kotlin.util.collectionUtils.getFirstClassifierDiscriminateHeaders import org.jetbrains.kotlin.util.collectionUtils.getFromAllScopes @@ -76,6 +77,10 @@ class JvmPackageScope( addAll(javaScope.getVariableNames()) } + override fun getClassifierNames(): Set? = kotlinScopes.flatMapClassifierNamesOrNull()?.apply { + addAll(javaScope.getClassifierNames()) + } + override fun printScopeStructure(p: Printer) { p.println(this::class.java.simpleName, " {") p.pushIndent() diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt index 23a40fca777..434f28ad9ed 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaScope.kt @@ -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 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 getVariableNames() = propertyNamesLazy + override fun getClassifierNames() = classNamesLazy override fun getContributedFunctions(name: Name, location: LookupLocation): Collection { if (name !in getFunctionNames()) return emptyList() diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/EnumEntrySyntheticClassDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/EnumEntrySyntheticClassDescriptor.java index 0e86a80fc8d..d44088542c7 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/EnumEntrySyntheticClassDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/EnumEntrySyntheticClassDescriptor.java @@ -310,6 +310,12 @@ public class EnumEntrySyntheticClassDescriptor extends ClassDescriptorBase { return enumMemberNames.invoke(); } + @NotNull + @Override + public Set getClassifierNames() { + return Collections.emptySet(); + } + @NotNull @Override public Set getVariableNames() { diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SubpackagesScope.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SubpackagesScope.kt index 643254d7d70..fbf0944f99f 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SubpackagesScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SubpackagesScope.kt @@ -57,6 +57,8 @@ open class SubpackagesScope(private val moduleDescriptor: ModuleDescriptor, priv return result } + override fun getClassifierNames(): Set = emptySet() + override fun printScopeStructure(p: Printer) { p.println(this::class.java.simpleName, " {") p.pushIndent() diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/AbstractScopeAdapter.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/AbstractScopeAdapter.kt index a23eed6efdd..b98f5f06998 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/AbstractScopeAdapter.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/AbstractScopeAdapter.kt @@ -55,6 +55,8 @@ abstract class AbstractScopeAdapter : MemberScope { override fun getFunctionNames() = workerScope.getFunctionNames() override fun getVariableNames() = workerScope.getVariableNames() + override fun getClassifierNames() = workerScope.getClassifierNames() + override fun printScopeStructure(p: Printer) { p.println(this::class.java.simpleName, " {") diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ChainedMemberScope.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ChainedMemberScope.kt index 8357efafd05..fd521dd5436 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ChainedMemberScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/ChainedMemberScope.kt @@ -43,6 +43,7 @@ class ChainedMemberScope( override fun getFunctionNames() = scopes.flatMapTo(mutableSetOf()) { it.getFunctionNames() } override fun getVariableNames() = scopes.flatMapTo(mutableSetOf()) { it.getVariableNames() } + override fun getClassifierNames(): Set? = scopes.flatMapClassifierNamesOrNull() override fun toString() = debugName diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt index c0add4fc0dc..10f0011be3d 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/InnerClassesScopeWrapper.kt @@ -40,6 +40,10 @@ class InnerClassesScopeWrapper(val workerScope: MemberScope) : MemberScopeImpl() 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 toString() = "Classes from $workerScope" diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/MemberScope.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/MemberScope.kt index 7666365671f..997a35a59e9 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/MemberScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/MemberScope.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.utils.Printer +import org.jetbrains.kotlin.utils.addToStdlib.flatMapToNullable import java.lang.reflect.Modifier interface MemberScope : ResolutionScope { @@ -32,6 +33,7 @@ interface MemberScope : ResolutionScope { */ fun getFunctionNames(): Set fun getVariableNames(): Set + fun getClassifierNames(): Set? /** * Is supposed to be used in tests and debug only @@ -45,6 +47,7 @@ interface MemberScope : ResolutionScope { override fun getFunctionNames() = emptySet() override fun getVariableNames() = emptySet() + override fun getClassifierNames() = emptySet() } companion object { @@ -52,6 +55,11 @@ interface MemberScope : ResolutionScope { } } +fun MemberScope.computeAllNames() = getClassifierNames()?.let { getFunctionNames() + getVariableNames() + it } + +fun Collection.flatMapClassifierNamesOrNull(): MutableSet? = + flatMapToNullable(hashSetOf(), MemberScope::getClassifierNames) + /** * The same as getDescriptors(kindFilter, nameFilter) but the result is guaranteed to be filtered by kind and name. */ diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/MemberScopeImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/MemberScopeImpl.kt index f54f05fea1b..773936d5a4d 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/MemberScopeImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/MemberScopeImpl.kt @@ -42,6 +42,8 @@ abstract class MemberScopeImpl : MemberScope { DescriptorKindFilter.VARIABLES, alwaysTrue() ).filterIsInstance().mapTo(mutableSetOf()) { it.name } + override fun getClassifierNames(): Set? = null + // This method should not be implemented here by default: every scope class has its unique structure pattern abstract override fun printScopeStructure(p: Printer) } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt index 28ede538058..d4cae2f38cb 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt @@ -81,6 +81,7 @@ class SubstitutingScope(private val workerScope: MemberScope, givenSubstitutor: override fun getFunctionNames() = workerScope.getFunctionNames() override fun getVariableNames() = workerScope.getVariableNames() + override fun getClassifierNames() = workerScope.getClassifierNames() override fun definitelyDoesNotContainName(name: Name) = workerScope.definitelyDoesNotContainName(name) diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java index a80682a6186..5edb0059cc1 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java @@ -211,6 +211,12 @@ public class ErrorUtils { return emptySet(); } + @NotNull + @Override + public Set getClassifierNames() { + return emptySet(); + } + @NotNull @Override public Collection getContributedDescriptors( @@ -284,6 +290,11 @@ public class ErrorUtils { throw new IllegalStateException(); } + @Override + public Set getClassifierNames() { + throw new IllegalStateException(); + } + @Override public boolean definitelyDoesNotContainName(@NotNull Name name) { return false; diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt index e0aff441439..f473c75eeaf 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt @@ -107,6 +107,7 @@ class MetadataPackageFragment( ) { override fun hasClass(name: Name): Boolean = hasTopLevelClass(name) override fun definitelyDoesNotContainName(name: Name) = false + override fun getClassifierNames(): Set? = null }) return ChainedMemberScope.create("Metadata scope", scopes) diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt index ebba36a8561..83cb57b6a1a 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt @@ -76,6 +76,7 @@ abstract class DeserializedMemberScope protected constructor( override fun getFunctionNames() = functionNamesLazy override fun getVariableNames() = variableNamesLazy + override fun getClassifierNames(): Set? = classNames + typeAliasNames private inline fun Collection.groupByName( getNameIndex: (M) -> Int diff --git a/core/util.runtime/src/org/jetbrains/kotlin/utils/addToStdlib.kt b/core/util.runtime/src/org/jetbrains/kotlin/utils/addToStdlib.kt index be639c80350..c364f463a81 100644 --- a/core/util.runtime/src/org/jetbrains/kotlin/utils/addToStdlib.kt +++ b/core/util.runtime/src/org/jetbrains/kotlin/utils/addToStdlib.kt @@ -138,3 +138,11 @@ fun > Iterable>.flattenTo(c: C): C { } return c } + +inline fun > Iterable.flatMapToNullable(destination: C, transform: (T) -> Iterable?): C? { + for (element in this) { + val list = transform(element) ?: return null + destination.addAll(list) + } + return destination +} diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/kdoc/resolveKDocLink.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/kdoc/resolveKDocLink.kt index 67912426e92..b66aedbaffa 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/kdoc/resolveKDocLink.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/kdoc/resolveKDocLink.kt @@ -253,6 +253,8 @@ private class ExtensionsScope( .toSet() } + override fun getClassifierNames() = null + override fun printScopeStructure(p: Printer) { p.println("Extensions for ${receiverClass.name} in:") contextScope.printStructure(p) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/kdoc/IdeSampleResolutionService.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/kdoc/IdeSampleResolutionService.kt index 0cc7a37c59d..f0da18e9181 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/kdoc/IdeSampleResolutionService.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/kdoc/IdeSampleResolutionService.kt @@ -75,8 +75,8 @@ private class GlobalSyntheticPackageViewDescriptor(override val fqName: FqName, override fun getContributedFunctions(name: Name, location: LookupLocation): Collection = shouldNotBeCalled() override fun getFunctionNames(): Set = shouldNotBeCalled() - override fun getVariableNames(): Set = shouldNotBeCalled() + override fun getClassifierNames(): Set = 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?) = shouldNotBeCalled() override val annotations = Annotations.EMPTY -} \ No newline at end of file +}