diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt index ebe8bbe62af..acdbabb9aff 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt @@ -70,7 +70,7 @@ class LazyJavaClassMemberScope( override fun computeMemberIndex(): MemberIndex { return object : ClassMemberIndex(jClass, { !it.isStatic }) { // For SAM-constructors - override fun getMethodNames(nameFilter: (Name) -> Boolean): Collection + override fun getMethodNames(nameFilter: (Name) -> Boolean): Set = super.getMethodNames(nameFilter) + computeClassNames(DescriptorKindFilter.CLASSIFIERS, nameFilter) } } @@ -660,10 +660,10 @@ class LazyJavaClassMemberScope( return super.getContributedVariables(name, location) } - override fun computeClassNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?): Collection + override fun computeClassNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?): Set = nestedClassIndex().keys + enumEntryIndex().keys - override fun computePropertyNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?): Collection { + override fun computePropertyNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?): Set { if (jClass.isAnnotationType) return memberIndex().getMethodNames(nameFilter ?: alwaysTrue()) return memberIndex().getAllFieldNames() + diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaPackageScope.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaPackageScope.kt index 5e12ef9bedb..8015cb7e49c 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaPackageScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaPackageScope.kt @@ -135,21 +135,21 @@ class LazyJavaPackageScope( override fun computeMemberIndex(): MemberIndex = object : MemberIndex by EMPTY_MEMBER_INDEX { // For SAM-constructors - override fun getMethodNames(nameFilter: (Name) -> Boolean): Collection = computeClassNames(DescriptorKindFilter.CLASSIFIERS, nameFilter) + override fun getMethodNames(nameFilter: (Name) -> Boolean): Set = computeClassNames(DescriptorKindFilter.CLASSIFIERS, nameFilter) } - override fun computeClassNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?): Collection { + override fun computeClassNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?): Set { // neither objects nor enum members can be in java package - if (!kindFilter.acceptsKinds(DescriptorKindFilter.NON_SINGLETON_CLASSIFIERS_MASK)) return listOf() + if (!kindFilter.acceptsKinds(DescriptorKindFilter.NON_SINGLETON_CLASSIFIERS_MASK)) return emptySet() - return jPackage.getClasses(nameFilter ?: alwaysTrue()).mapNotNull { klass -> + return jPackage.getClasses(nameFilter ?: alwaysTrue()).mapNotNullTo(linkedSetOf()) { klass -> if (klass.lightClassOriginKind == LightClassOriginKind.SOURCE) null else klass.name } } - override fun computeFunctionNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?): Collection { + override fun computeFunctionNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?): Set { // optimization: only SAM-constructors may exist in java package - if (kindFilter.excludes.contains(SamConstructorDescriptorKindExclude)) return listOf() + if (kindFilter.excludes.contains(SamConstructorDescriptorKindExclude)) return emptySet() return super.computeFunctionNames(kindFilter, nameFilter) } @@ -160,7 +160,7 @@ class LazyJavaPackageScope( }?.let { result.add(it) } } - override fun computePropertyNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?) = listOf() + override fun computePropertyNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?) = emptySet() // we don't use implementation from super which caches all descriptors and does not use filters override fun getContributedDescriptors(kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean): Collection { 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 7481f2ea7e7..89de53f2979 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 @@ -217,12 +217,12 @@ abstract class LazyJavaScope(protected val c: LazyJavaResolverContext) : MemberS override fun getContributedFunctions(name: Name, location: LookupLocation): Collection = functions(name) - protected open fun computeFunctionNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?): Collection + protected open fun computeFunctionNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?): Set = memberIndex().getMethodNames(nameFilter ?: alwaysTrue()) protected abstract fun computeNonDeclaredProperties(name: Name, result: MutableCollection) - protected abstract fun computePropertyNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?): Collection + protected abstract fun computePropertyNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?): Set private val properties = c.storageManager.createMemoizedFunction { name: Name -> @@ -328,7 +328,7 @@ abstract class LazyJavaScope(protected val c: LazyJavaResolverContext) : MemberS return result.toReadOnlyList() } - protected abstract fun computeClassNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?): Collection + protected abstract fun computeClassNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?): Set override fun toString() = "Lazy scope for $ownerDescriptor" diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaStaticClassScope.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaStaticClassScope.kt index 150969c8265..ed561736b95 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaStaticClassScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaStaticClassScope.kt @@ -42,7 +42,7 @@ class LazyJavaStaticClassScope( override fun computeMemberIndex(): MemberIndex { val delegate = ClassMemberIndex(jClass) { it.isStatic } return object : MemberIndex by delegate { - override fun getMethodNames(nameFilter: (Name) -> Boolean): Collection { + override fun getMethodNames(nameFilter: (Name) -> Boolean): Set { // Should be a super call, but KT-2860 return delegate.getMethodNames(nameFilter) + // For SAM-constructors @@ -51,17 +51,17 @@ class LazyJavaStaticClassScope( } } - override fun computeFunctionNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?): Collection { + override fun computeFunctionNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?): Set { if (jClass.isEnum) { return super.computeFunctionNames(kindFilter, nameFilter) + listOf(DescriptorUtils.ENUM_VALUE_OF, DescriptorUtils.ENUM_VALUES) } return super.computeFunctionNames(kindFilter, nameFilter) } - override fun computePropertyNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?): Collection = + override fun computePropertyNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?): Set = memberIndex().getAllFieldNames() - override fun computeClassNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?): Collection = listOf() + override fun computeClassNames(kindFilter: DescriptorKindFilter, nameFilter: ((Name) -> Boolean)?): Set = emptySet() override fun getContributedClassifier(name: Name, location: LookupLocation): ClassifierDescriptor? { // We don't need to track lookups here because we find nested/inner classes in LazyJavaClassMemberScope diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/MemberIndex.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/MemberIndex.kt index 0e7a33b2649..ee87924e619 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/MemberIndex.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/MemberIndex.kt @@ -27,18 +27,18 @@ import java.util.* interface MemberIndex { fun findMethodsByName(name: Name): Collection - fun getMethodNames(nameFilter: (Name) -> Boolean): Collection + fun getMethodNames(nameFilter: (Name) -> Boolean): Set fun findFieldByName(name: Name): JavaField? - fun getAllFieldNames(): Collection + fun getAllFieldNames(): Set } object EMPTY_MEMBER_INDEX : MemberIndex { override fun findMethodsByName(name: Name) = listOf() - override fun getMethodNames(nameFilter: (Name) -> Boolean) = listOf() + override fun getMethodNames(nameFilter: (Name) -> Boolean) = emptySet() override fun findFieldByName(name: Name): JavaField? = null - override fun getAllFieldNames() = listOf() + override fun getAllFieldNames() = emptySet() } private val ADDITIONAL_MEMBER_NAMES_MAP = mapOf( @@ -61,11 +61,11 @@ open class ClassMemberIndex(val jClass: JavaClass, val memberFilter: (JavaMember private val fields = jClass.fields.asSequence().filter(memberFilter).associateBy { m -> m.name } override fun findMethodsByName(name: Name): Collection = methods[name] ?: listOf() - override fun getMethodNames(nameFilter: (Name) -> Boolean): Collection = + override fun getMethodNames(nameFilter: (Name) -> Boolean): Set = jClass.getAllMemberNames(methodFilter) { methods } override fun findFieldByName(name: Name): JavaField? = fields[name] - override fun getAllFieldNames(): Collection = jClass.getAllMemberNames(memberFilter) { fields } + override fun getAllFieldNames(): Set = jClass.getAllMemberNames(memberFilter) { fields } } private fun JavaClass.getNonDeclaredMethodNames(): List {