From ed4ccc6a19061214c801219a076117a8bf7f80d5 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 15 Apr 2016 10:47:19 +0300 Subject: [PATCH] Minor refactoring: EffectiveVisibility --- .../jetbrains/kotlin/resolve/DeclarationsChecker.kt | 12 ++++++------ .../kotlin/descriptors/EffectiveVisibility.kt | 6 ++++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt index 703ac23a7ee..562c2c60833 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt @@ -278,7 +278,7 @@ class DeclarationsChecker( classDescriptor.declaredTypeParameters.forEachIndexed { i, typeParameterDescriptor -> if (i >= typeParameterList.size) return for (upperBound in typeParameterDescriptor.upperBounds) { - val restricting = upperBound.dependentDescriptors().leastPermissive(classVisibility) + val restricting = upperBound.leastPermissiveDescriptor(classVisibility) if (restricting != null) { trace.report(EXPOSED_TYPE_PARAMETER_BOUND.on(typeParameterList[i], classVisibility, restricting, restricting.effectiveVisibility())) @@ -299,7 +299,7 @@ class DeclarationsChecker( if (superIsInterface != isInterface) { return@forEachIndexed } - val restricting = superType.dependentDescriptors().leastPermissive(classVisibility) + val restricting = superType.leastPermissiveDescriptor(classVisibility) if (restricting != null) { if (isInterface) { trace.report(EXPOSED_SUPER_INTERFACE.on(delegationList[i], classVisibility, @@ -627,7 +627,7 @@ class DeclarationsChecker( if (typeReference == null) return val receiverParameterDescriptor = memberDescriptor.extensionReceiverParameter ?: return val memberVisibility = memberDescriptor.effectiveVisibility() - val restricting = receiverParameterDescriptor.type.dependentDescriptors().leastPermissive(memberVisibility) + val restricting = receiverParameterDescriptor.type.leastPermissiveDescriptor(memberVisibility) if (restricting != null) { trace.report(EXPOSED_RECEIVER_TYPE.on(typeReference, memberVisibility, restricting, restricting.effectiveVisibility())) @@ -636,7 +636,7 @@ class DeclarationsChecker( private fun checkPropertyExposedType(property: KtProperty, propertyDescriptor: PropertyDescriptor) { val propertyVisibility = propertyDescriptor.effectiveVisibility() - val restricting = propertyDescriptor.type.dependentDescriptors().leastPermissive(propertyVisibility) + val restricting = propertyDescriptor.type.leastPermissiveDescriptor(propertyVisibility) if (restricting != null) { trace.report(EXPOSED_PROPERTY_TYPE.on(property.nameIdentifier ?: property, propertyVisibility, restricting, restricting.effectiveVisibility())) @@ -707,14 +707,14 @@ class DeclarationsChecker( private fun checkFunctionExposedType(function: KtFunction, functionDescriptor: FunctionDescriptor) { val functionVisibility = functionDescriptor.effectiveVisibility() if (function !is KtConstructor<*>) { - val restricting = functionDescriptor.returnType?.dependentDescriptors()?.leastPermissive(functionVisibility) + val restricting = functionDescriptor.returnType?.leastPermissiveDescriptor(functionVisibility) if (restricting != null) { trace.report(EXPOSED_FUNCTION_RETURN_TYPE.on(function.nameIdentifier ?: function, functionVisibility, restricting, restricting.effectiveVisibility())) } } functionDescriptor.valueParameters.forEachIndexed { i, parameterDescriptor -> - val restricting = parameterDescriptor.type.dependentDescriptors().leastPermissive(functionVisibility) + val restricting = parameterDescriptor.type.leastPermissiveDescriptor(functionVisibility) if (restricting != null && i < function.valueParameters.size) { trace.report(EXPOSED_PARAMETER_TYPE.on(function.valueParameters[i], functionVisibility, restricting, restricting.effectiveVisibility())) diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/EffectiveVisibility.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/EffectiveVisibility.kt index 157477844ea..3e2b6c66bfc 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/EffectiveVisibility.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/EffectiveVisibility.kt @@ -257,7 +257,7 @@ private fun ClassDescriptor.effectiveVisibility(classes: Set): } // Should collect all dependent classifier descriptors, to get verbose diagnostic -fun KotlinType.dependentDescriptors() = dependentDescriptors(emptySet(), CONSTRUCTOR) +private fun KotlinType.dependentDescriptors() = dependentDescriptors(emptySet(), CONSTRUCTOR) private fun KotlinType.dependentDescriptors(types: Set, ownRelation: RelationToType): Set { if (this in types) return emptySet() @@ -266,7 +266,7 @@ private fun KotlinType.dependentDescriptors(types: Set, ownRelation: return ownDependent + argumentDependent } -fun Set.leastPermissive(base: EffectiveVisibility): DescriptorWithRelation? { +private fun Set.leastPermissive(base: EffectiveVisibility): DescriptorWithRelation? { for (descriptorWithRelation in this) { val currentVisibility = descriptorWithRelation.effectiveVisibility() when (currentVisibility.relation(base)) { @@ -279,6 +279,8 @@ fun Set.leastPermissive(base: EffectiveVisibility): Desc return null } +fun KotlinType.leastPermissiveDescriptor(base: EffectiveVisibility) = dependentDescriptors().leastPermissive(base) + fun DeclarationDescriptorWithVisibility.effectiveVisibility(): EffectiveVisibility = lowerBound(visibility.effectiveVisibility(this.containingDeclaration as? ClassDescriptor), (this.containingDeclaration as? ClassDescriptor)?.effectiveVisibility() ?: Public)