Minor refactoring: EffectiveVisibility

This commit is contained in:
Mikhail Glukhikh
2016-04-15 10:47:19 +03:00
parent 80e41c5298
commit ed4ccc6a19
2 changed files with 10 additions and 8 deletions
@@ -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()))
@@ -257,7 +257,7 @@ private fun ClassDescriptor.effectiveVisibility(classes: Set<ClassDescriptor>):
}
// 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<KotlinType>, ownRelation: RelationToType): Set<DescriptorWithRelation> {
if (this in types) return emptySet()
@@ -266,7 +266,7 @@ private fun KotlinType.dependentDescriptors(types: Set<KotlinType>, ownRelation:
return ownDependent + argumentDependent
}
fun Set<DescriptorWithRelation>.leastPermissive(base: EffectiveVisibility): DescriptorWithRelation? {
private fun Set<DescriptorWithRelation>.leastPermissive(base: EffectiveVisibility): DescriptorWithRelation? {
for (descriptorWithRelation in this) {
val currentVisibility = descriptorWithRelation.effectiveVisibility()
when (currentVisibility.relation(base)) {
@@ -279,6 +279,8 @@ fun Set<DescriptorWithRelation>.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)