From e59571c4826a86eaae6d3fecfcf429dd6f1476f3 Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Tue, 6 Aug 2019 17:54:33 +0300 Subject: [PATCH] ExpectActualUtils: add type arguments accessibility check for top level classes --- .../quickfix/expectactual/CreateExpectedFix.kt | 9 +++++++++ .../quickfix/expectactual/ExpectActualUtils.kt | 14 ++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateExpectedFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateExpectedFix.kt index a45414b4faf..7e16d95b6a0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateExpectedFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateExpectedFix.kt @@ -118,6 +118,10 @@ class CreateExpectedClassFix( ) : CreateExpectedFix(klass, outerExpectedClass, commonModule, block@{ project, element -> val originalElements = element.collectDeclarations(false).toList() val existingClasses = findClasses(originalElements + klass) + if (!element.checkTypeAccessibilityInModule(commonModule, existingClasses)) { + showUnknownTypesError(element) + return@block null + } val (members, declarationsWithNonExistentClasses) = originalElements.filterNot(KtNamedDeclaration::isAlwaysActual).partition { it.checkTypeAccessibilityInModule(commonModule, existingClasses) @@ -135,6 +139,11 @@ class CreateExpectedClassFix( }.let { selectedElements -> val selectedClasses = findClasses(selectedElements + klass) if (selectedClasses != existingClasses) { + if (!element.checkTypeAccessibilityInModule(commonModule, selectedClasses)) { + showUnknownTypesError(element) + return@block null + } + val (resultDeclarations, withErrors) = selectedElements.partition { it.checkTypeAccessibilityInModule(commonModule, selectedClasses) } 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 6bb41268cd8..042e9d1d5e8 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt @@ -323,8 +323,14 @@ class KotlinTypeInaccessibleException(val type: KotlinType) : Exception() { fun DeclarationDescriptor.checkTypeAccessibilityInModule( project: Project, module: Module, - existedClasses: Set = emptySet() -): Boolean = collectAllTypes().all { it?.canFindClassInModule(project, module, existedClasses) == true } + existingClasses: Set = emptySet() +): Boolean { + val existingClassesWithTypeParameters = if (this is ClassifierDescriptorWithTypeParameters) + existingClasses + declaredTypeParameters.map { it.fqNameOrNull()?.asString() ?: return false }.toSet() + else + existingClasses + return collectAllTypes().all { it?.canFindClassInModule(project, module, existingClassesWithTypeParameters) == true } +} private fun DeclarationDescriptor.collectAllTypes(): Sequence { return when (this) { @@ -346,8 +352,8 @@ private fun KotlinType.collectAllTypes(): Sequence = sequenceOf(fqName) .map(TypeProjection::getType) .flatMap(KotlinType::collectAllTypes) -fun KtNamedDeclaration.checkTypeAccessibilityInModule(module: Module, existedClasses: Set = emptySet()): Boolean { - return !hasPrivateModifier() && descriptor?.checkTypeAccessibilityInModule(project, module, existedClasses) == true +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()