diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt index 8c2e1ef5fea..95f942b573b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt @@ -44,6 +44,7 @@ import org.jetbrains.kotlin.storage.getValue import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner import org.jetbrains.kotlin.types.refinement.TypeRefinement +import org.jetbrains.kotlin.utils.addToStdlib.flatMapToNullable import java.util.* open class LazyClassMemberScope( @@ -118,6 +119,7 @@ open class LazyClassMemberScope( by lazy(LazyThreadSafetyMode.PUBLICATION) { mutableSetOf().apply { addAll(declarationProvider.getDeclarationNames()) + addAll(c.syntheticResolveExtension.getSyntheticFunctionNames(thisDescriptor)) supertypes.flatMapTo(this) { it.memberScope.getFunctionNames() } @@ -126,6 +128,32 @@ open class LazyClassMemberScope( } } + private val _classifierNames: Set? + by lazy(LazyThreadSafetyMode.PUBLICATION) { + mutableSetOf().apply { + supertypes.flatMapToNullable(this) { + it.memberScope.getClassifierNames() + } ?: return@lazy null + + addAll(declarationProvider.getDeclarationNames()) + with(c.syntheticResolveExtension) { + getSyntheticCompanionObjectNameIfNeeded(thisDescriptor)?.let { add(it) } + addAll(getSyntheticNestedClassNames(thisDescriptor)) + } + } + } + + private val _allNames: Set? + by lazy(LazyThreadSafetyMode.PUBLICATION) { + val classifiers = getClassifierNames() ?: return@lazy null + + mutableSetOf().apply { + addAll(getVariableNames()) + addAll(getFunctionNames()) + addAll(classifiers) + } + } + private fun getDataClassRelatedFunctionNames(): Collection { val declarations = mutableListOf() addDataClassMethods(declarations, NoLookupLocation.WHEN_GET_ALL_DESCRIPTORS) @@ -134,6 +162,11 @@ open class LazyClassMemberScope( override fun getVariableNames() = _variableNames override fun getFunctionNames() = _functionNames + override fun getClassifierNames() = _classifierNames + + override fun definitelyDoesNotContainName(name: Name): Boolean { + return _allNames?.let { name !in it } ?: false + } private interface MemberExtractor { fun extract(extractFrom: KotlinType, name: Name): Collection diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/LexicalChainedScope.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/LexicalChainedScope.kt index 1d56325c13e..f85a76afd6f 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/LexicalChainedScope.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/scopes/LexicalChainedScope.kt @@ -90,4 +90,7 @@ class LexicalChainedScope @JvmOverloads constructor( p.println("}") } + override fun definitelyDoesNotContainName(name: Name): Boolean { + return memberScopes.all { it.definitelyDoesNotContainName(name) } + } } 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 d5c9a9d1253..84b5b361dc3 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/MemberScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/MemberScope.kt @@ -46,6 +46,8 @@ interface MemberScope : ResolutionScope { p.println("Empty member scope") } + override fun definitelyDoesNotContainName(name: Name): Boolean = true + override fun getFunctionNames() = emptySet() override fun getVariableNames() = emptySet() override fun getClassifierNames() = emptySet()