ExposedVisibilityChecker refactoring: extract 'reportExposure'
This commit is contained in:
@@ -16,10 +16,12 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.resolve
|
package org.jetbrains.kotlin.resolve
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
|
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory3
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticSink
|
import org.jetbrains.kotlin.diagnostics.DiagnosticSink
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticSink.DO_NOTHING
|
import org.jetbrains.kotlin.diagnostics.DiagnosticSink.DO_NOTHING
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors
|
import org.jetbrains.kotlin.diagnostics.Errors.*
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.types.TypeUtils
|
import org.jetbrains.kotlin.types.TypeUtils
|
||||||
import org.jetbrains.kotlin.types.isError
|
import org.jetbrains.kotlin.types.isError
|
||||||
@@ -28,6 +30,15 @@ import org.jetbrains.kotlin.types.isError
|
|||||||
// All functions return true if everything is OK, or false in case of any errors
|
// All functions return true if everything is OK, or false in case of any errors
|
||||||
class ExposedVisibilityChecker(private val trace: DiagnosticSink = DO_NOTHING) {
|
class ExposedVisibilityChecker(private val trace: DiagnosticSink = DO_NOTHING) {
|
||||||
|
|
||||||
|
private fun <E : PsiElement> reportExposure(
|
||||||
|
diagnostic: DiagnosticFactory3<E, EffectiveVisibility, DescriptorWithRelation, EffectiveVisibility>,
|
||||||
|
element: E,
|
||||||
|
elementVisibility: EffectiveVisibility,
|
||||||
|
restrictingDescriptor: DescriptorWithRelation
|
||||||
|
) {
|
||||||
|
trace.report(diagnostic.on(element, elementVisibility, restrictingDescriptor, restrictingDescriptor.effectiveVisibility()))
|
||||||
|
}
|
||||||
|
|
||||||
// NB: does not check any members
|
// NB: does not check any members
|
||||||
fun checkClassHeader(klass: KtClassOrObject, classDescriptor: ClassDescriptor): Boolean {
|
fun checkClassHeader(klass: KtClassOrObject, classDescriptor: ClassDescriptor): Boolean {
|
||||||
var result = checkSupertypes(klass, classDescriptor)
|
var result = checkSupertypes(klass, classDescriptor)
|
||||||
@@ -61,12 +72,7 @@ class ExposedVisibilityChecker(private val trace: DiagnosticSink = DO_NOTHING) {
|
|||||||
val typeAliasVisibility = typeAliasDescriptor.effectiveVisibility()
|
val typeAliasVisibility = typeAliasDescriptor.effectiveVisibility()
|
||||||
val restricting = expandedType.leastPermissiveDescriptor(typeAliasVisibility)
|
val restricting = expandedType.leastPermissiveDescriptor(typeAliasVisibility)
|
||||||
if (restricting != null) {
|
if (restricting != null) {
|
||||||
trace.report(
|
reportExposure(EXPOSED_TYPEALIAS_EXPANDED_TYPE, typeAlias.nameIdentifier ?: typeAlias, typeAliasVisibility, restricting)
|
||||||
Errors.EXPOSED_TYPEALIAS_EXPANDED_TYPE.on(
|
|
||||||
typeAlias.nameIdentifier ?: typeAlias,
|
|
||||||
typeAliasVisibility, restricting, restricting.effectiveVisibility()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,12 +87,7 @@ class ExposedVisibilityChecker(private val trace: DiagnosticSink = DO_NOTHING) {
|
|||||||
if (function !is KtConstructor<*>) {
|
if (function !is KtConstructor<*>) {
|
||||||
val restricting = functionDescriptor.returnType?.leastPermissiveDescriptor(functionVisibility)
|
val restricting = functionDescriptor.returnType?.leastPermissiveDescriptor(functionVisibility)
|
||||||
if (restricting != null) {
|
if (restricting != null) {
|
||||||
trace.report(
|
reportExposure(EXPOSED_FUNCTION_RETURN_TYPE, function.nameIdentifier ?: function, functionVisibility, restricting)
|
||||||
Errors.EXPOSED_FUNCTION_RETURN_TYPE.on(
|
|
||||||
function.nameIdentifier ?: function, functionVisibility,
|
|
||||||
restricting, restricting.effectiveVisibility()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
result = false
|
result = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -95,23 +96,15 @@ class ExposedVisibilityChecker(private val trace: DiagnosticSink = DO_NOTHING) {
|
|||||||
val valueParameter = function.valueParameters[i]
|
val valueParameter = function.valueParameters[i]
|
||||||
val restricting = parameterDescriptor.type.leastPermissiveDescriptor(functionVisibility)
|
val restricting = parameterDescriptor.type.leastPermissiveDescriptor(functionVisibility)
|
||||||
if (restricting != null) {
|
if (restricting != null) {
|
||||||
trace.report(
|
reportExposure(EXPOSED_PARAMETER_TYPE, valueParameter, functionVisibility, restricting)
|
||||||
Errors.EXPOSED_PARAMETER_TYPE.on(
|
|
||||||
valueParameter, functionVisibility,
|
|
||||||
restricting, restricting.effectiveVisibility()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
result = false
|
result = false
|
||||||
} else if (functionDescriptor is ClassConstructorDescriptor && valueParameter.hasValOrVar()) {
|
} else if (functionDescriptor is ClassConstructorDescriptor && valueParameter.hasValOrVar()) {
|
||||||
val propertyDescriptor = (trace as? BindingTrace)?.get(BindingContext.VALUE_PARAMETER_AS_PROPERTY, parameterDescriptor)
|
val propertyDescriptor = (trace as? BindingTrace)?.get(BindingContext.VALUE_PARAMETER_AS_PROPERTY, parameterDescriptor)
|
||||||
val propertyOrClassVisibility = (propertyDescriptor ?: functionDescriptor.constructedClass).effectiveVisibility()
|
val propertyOrClassVisibility = (propertyDescriptor ?: functionDescriptor.constructedClass).effectiveVisibility()
|
||||||
val restrictingByProperty = parameterDescriptor.type.leastPermissiveDescriptor(propertyOrClassVisibility)
|
val restrictingByProperty = parameterDescriptor.type.leastPermissiveDescriptor(propertyOrClassVisibility)
|
||||||
if (restrictingByProperty != null) {
|
if (restrictingByProperty != null) {
|
||||||
trace.report(
|
reportExposure(
|
||||||
Errors.EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR.on(
|
EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR, valueParameter, propertyOrClassVisibility, restrictingByProperty
|
||||||
valueParameter, propertyOrClassVisibility,
|
|
||||||
restrictingByProperty, restrictingByProperty.effectiveVisibility()
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
result = false
|
result = false
|
||||||
}
|
}
|
||||||
@@ -131,12 +124,7 @@ class ExposedVisibilityChecker(private val trace: DiagnosticSink = DO_NOTHING) {
|
|||||||
val restricting = propertyDescriptor.type.leastPermissiveDescriptor(propertyVisibility)
|
val restricting = propertyDescriptor.type.leastPermissiveDescriptor(propertyVisibility)
|
||||||
var result = true
|
var result = true
|
||||||
if (restricting != null) {
|
if (restricting != null) {
|
||||||
trace.report(
|
reportExposure(EXPOSED_PROPERTY_TYPE, property.nameIdentifier ?: property, propertyVisibility, restricting)
|
||||||
Errors.EXPOSED_PROPERTY_TYPE.on(
|
|
||||||
property.nameIdentifier ?: property, propertyVisibility,
|
|
||||||
restricting, restricting.effectiveVisibility()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
result = false
|
result = false
|
||||||
}
|
}
|
||||||
return result and checkMemberReceiver(property.receiverTypeReference, propertyDescriptor)
|
return result and checkMemberReceiver(property.receiverTypeReference, propertyDescriptor)
|
||||||
@@ -148,12 +136,7 @@ class ExposedVisibilityChecker(private val trace: DiagnosticSink = DO_NOTHING) {
|
|||||||
val memberVisibility = memberDescriptor.effectiveVisibility()
|
val memberVisibility = memberDescriptor.effectiveVisibility()
|
||||||
val restricting = receiverParameterDescriptor.type.leastPermissiveDescriptor(memberVisibility)
|
val restricting = receiverParameterDescriptor.type.leastPermissiveDescriptor(memberVisibility)
|
||||||
if (restricting != null) {
|
if (restricting != null) {
|
||||||
trace.report(
|
reportExposure(EXPOSED_RECEIVER_TYPE, typeReference, memberVisibility, restricting)
|
||||||
Errors.EXPOSED_RECEIVER_TYPE.on(
|
|
||||||
typeReference, memberVisibility,
|
|
||||||
restricting, restricting.effectiveVisibility()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
@@ -173,21 +156,9 @@ class ExposedVisibilityChecker(private val trace: DiagnosticSink = DO_NOTHING) {
|
|||||||
}
|
}
|
||||||
val restricting = superType.leastPermissiveDescriptor(classVisibility)
|
val restricting = superType.leastPermissiveDescriptor(classVisibility)
|
||||||
if (restricting != null) {
|
if (restricting != null) {
|
||||||
if (isInterface) {
|
reportExposure(
|
||||||
trace.report(
|
if (isInterface) EXPOSED_SUPER_INTERFACE else EXPOSED_SUPER_CLASS, delegationList[i], classVisibility, restricting
|
||||||
Errors.EXPOSED_SUPER_INTERFACE.on(
|
)
|
||||||
delegationList[i], classVisibility,
|
|
||||||
restricting, restricting.effectiveVisibility()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
trace.report(
|
|
||||||
Errors.EXPOSED_SUPER_CLASS.on(
|
|
||||||
delegationList[i], classVisibility,
|
|
||||||
restricting, restricting.effectiveVisibility()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
result = false
|
result = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -203,12 +174,7 @@ class ExposedVisibilityChecker(private val trace: DiagnosticSink = DO_NOTHING) {
|
|||||||
for (upperBound in typeParameterDescriptor.upperBounds) {
|
for (upperBound in typeParameterDescriptor.upperBounds) {
|
||||||
val restricting = upperBound.leastPermissiveDescriptor(classVisibility)
|
val restricting = upperBound.leastPermissiveDescriptor(classVisibility)
|
||||||
if (restricting != null) {
|
if (restricting != null) {
|
||||||
trace.report(
|
reportExposure(EXPOSED_TYPE_PARAMETER_BOUND, typeParameterList[i], classVisibility, restricting)
|
||||||
Errors.EXPOSED_TYPE_PARAMETER_BOUND.on(
|
|
||||||
typeParameterList[i], classVisibility,
|
|
||||||
restricting, restricting.effectiveVisibility()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
result = false
|
result = false
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user