diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/TypeAccessibilityCheckerImpl.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/TypeAccessibilityCheckerImpl.kt index ab1c5d3c38f..addcf9347a7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/TypeAccessibilityCheckerImpl.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/TypeAccessibilityCheckerImpl.kt @@ -32,26 +32,27 @@ class TypeAccessibilityCheckerImpl( override var existingFqNames: Collection = emptyList() ) : TypeAccessibilityChecker { private val scope by lazy { GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(targetModule, targetModule.isTestModule) } - private val builtInsModule by lazy { targetModule.toDescriptor() } + private var builtInsModule: ModuleDescriptor? = targetModule.toDescriptor() + get() = if (field?.isValid != false) field + else { + field = targetModule.toDescriptor() + field + } - override fun incorrectTypes(declaration: KtNamedDeclaration): Collection = - declaration.descriptor?.let { incorrectTypesInSequence(it.collectAllTypes(), false) } ?: listOf(null) + override fun incorrectTypes(declaration: KtNamedDeclaration): Collection = declaration.descriptor?.let { + incorrectTypesInSequence(it.collectAllTypes(), false) + } ?: listOf(null) - override fun incorrectTypes(descriptor: DeclarationDescriptor): Collection = - incorrectTypesInSequence(descriptor.collectAllTypes(), false) + override fun incorrectTypes(descriptor: DeclarationDescriptor): Collection = incorrectTypesInDescriptor(descriptor, false) override fun incorrectTypes(type: KotlinType): Collection = incorrectTypesInSequence(type.collectAllTypes(), false) override fun checkAccessibility(declaration: KtNamedDeclaration): Boolean = !declaration.hasPrivateModifier() && declaration.descriptor?.let { checkAccessibility(it) } == true - override fun checkAccessibility(descriptor: DeclarationDescriptor): Boolean = - runInContext(descriptor.additionalClasses(existingFqNames)) { - incorrectTypesInSequence(descriptor.collectAllTypes(), true).isEmpty() - } + override fun checkAccessibility(descriptor: DeclarationDescriptor): Boolean = incorrectTypesInDescriptor(descriptor, true).isEmpty() - override fun checkAccessibility(type: KotlinType): Boolean = - incorrectTypesInSequence(type.collectAllTypes(), true).isEmpty() + override fun checkAccessibility(type: KotlinType): Boolean = incorrectTypesInSequence(type.collectAllTypes(), true).isEmpty() override fun runInContext(fqNames: Collection, block: TypeAccessibilityChecker.() -> R): R { val oldValue = existingFqNames @@ -69,11 +70,16 @@ class TypeAccessibilityCheckerImpl( } else sequence.filter { !it.canFindClassInModule() }.toList() } + private fun incorrectTypesInDescriptor(descriptor: DeclarationDescriptor, lazy: Boolean) = + runInContext(descriptor.additionalClasses(existingFqNames)) { + incorrectTypesInSequence(descriptor.collectAllTypes(), lazy) + } + private fun FqName?.canFindClassInModule(): Boolean { val name = this?.asString() ?: return false return name in existingFqNames - || builtInsModule?.resolveClassByFqName(this, NoLookupLocation.FROM_BUILTINS) != null || KotlinFullClassNameIndex.getInstance()[name, project, scope].isNotEmpty() + || builtInsModule?.resolveClassByFqName(this, NoLookupLocation.FROM_BUILTINS) != null } }