From d1b33485a421f887a7253cd1d22b40fe4ab82e62 Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Tue, 20 Aug 2019 13:16:02 +0700 Subject: [PATCH] ExpectActualUtils: rename checkTypeInSequence to incorrectTypesInSequence & change return type --- .../expectactual/ExpectActualUtils.kt | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt index 2a8610eca19..11e85349f37 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt @@ -435,29 +435,39 @@ class KotlinTypeInaccessibleException(val type: KotlinType) : Exception() { get() = "Type ${type.getJetTypeFqName(true)} is not accessible from common code" } +fun KtNamedDeclaration.checkTypeAccessibilityInModule(module: Module, existingClasses: Set = emptySet()): Boolean { + return !hasPrivateModifier() && descriptor?.checkTypeAccessibilityInModule(project, module, existingClasses) == true +} + fun DeclarationDescriptor.checkTypeAccessibilityInModule( project: Project, module: Module, existingClasses: Set = emptySet() -): Boolean = checkTypeInSequence(collectAllTypes(), project, module, additionalClasses(existingClasses)) +): Boolean = incorrectTypesInSequence(collectAllTypes(), project, module, additionalClasses(existingClasses)).isEmpty() fun KotlinType.checkTypeAccessibilityInModule( project: Project, module: Module, existingClasses: Set = emptySet() -): Boolean = checkTypeInSequence(collectAllTypes(), project, module, existingClasses) +): Boolean = incorrectTypesInSequence(collectAllTypes(), project, module, existingClasses).isEmpty() -private fun checkTypeInSequence(sequence: Sequence, project: Project, module: Module, existingClasses: Set): Boolean { +private fun incorrectTypesInSequence( + sequence: Sequence, + project: Project, + module: Module, + existingClasses: Set, + lazy: Boolean = true +): List { val builtInsModule = module.toDescriptor() val scope = GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(module, module.isTestModule) - return sequence.all { fqName -> - if (fqName == null) return false - builtInsModule?.resolveClassByFqName(fqName, NoLookupLocation.FROM_BUILTINS) != null || fqName.canFindClassInModule( - project, - scope, - existingClasses - ) - } + fun predicate(fqName: FqName?): Boolean = fqName != null + && (builtInsModule?.resolveClassByFqName(fqName, NoLookupLocation.FROM_BUILTINS) != null + || fqName.canFindClassInModule(project, scope, existingClasses)) + + return if (lazy) { + for (fqName in sequence) if (!predicate(fqName)) return listOf(fqName) + emptyList() + } else sequence.filterNot(::predicate).toList() } private tailrec fun DeclarationDescriptor.additionalClasses(existingClasses: Set = emptySet()): Set = when (this) { @@ -499,10 +509,6 @@ private fun KotlinType.collectAllTypes(): Sequence = sequenceOf(fqName) fun KtNamedDeclaration.isAlwaysActual(): Boolean = safeAs()?.parent?.parent?.safeAs() ?.mustHaveValOrVar() ?: false -fun KtNamedDeclaration.checkTypeAccessibilityInModule(module: Module, existingClasses: Set = emptySet()): Boolean { - return !hasPrivateModifier() && descriptor?.checkTypeAccessibilityInModule(project, module, existingClasses) == true -} - val KotlinType.fqName: FqName? get() = constructor.declarationDescriptor?.fqNameOrNull() private fun FqName.canFindClassInModule(project: Project, scope: GlobalSearchScope, existedClasses: Set): Boolean {