[FIR] Fix reporting EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR warning

This commit is contained in:
Dmitriy Novozhilov
2021-03-16 19:12:25 +03:00
parent 21b1d97b30
commit de03124f50
14 changed files with 59 additions and 16 deletions
@@ -26,6 +26,8 @@ import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.*
import kotlin.properties.PropertyDelegateProvider
import kotlin.properties.ReadOnlyProperty
@Suppress("UNUSED_VARIABLE", "LocalVariableName", "ClassName", "unused")
@@ -133,9 +135,9 @@ object DIAGNOSTICS_LIST : DiagnosticList() {
val EXPOSED_VISIBILITY by object : DiagnosticGroup("Exposed visibility") {
val EXPOSED_TYPEALIAS_EXPANDED_TYPE by exposedVisibilityError<KtNamedDeclaration>(PositioningStrategy.DECLARATION_NAME)
val EXPOSED_FUNCTION_RETURN_TYPE by exposedVisibilityError<KtNamedDeclaration>(PositioningStrategy.DECLARATION_NAME)
val EXPOSED_RECEIVER_TYPE by exposedVisibilityError<KtTypeReference>()
val EXPOSED_PROPERTY_TYPE by exposedVisibilityError<KtNamedDeclaration>(PositioningStrategy.DECLARATION_NAME)
val EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR by exposedVisibilityWarning<KtNamedDeclaration>(PositioningStrategy.DECLARATION_NAME)
val EXPOSED_PARAMETER_TYPE by exposedVisibilityError<KtParameter>(/* // NB: for parameter FE 1.0 reports not on a name for some reason */)
val EXPOSED_SUPER_INTERFACE by exposedVisibilityError<KtTypeReference>()
val EXPOSED_SUPER_CLASS by exposedVisibilityError<KtTypeReference>()
@@ -508,10 +510,20 @@ object DIAGNOSTICS_LIST : DiagnosticList() {
}
}
private inline fun <reified P : PsiElement> DiagnosticGroup.exposedVisibilityError(
positioningStrategy: PositioningStrategy = PositioningStrategy.DEFAULT
) = error<FirSourceElement, P>(positioningStrategy) {
private val exposedVisibilityDiagnosticInit: DiagnosticBuilder.() -> Unit = {
parameter<FirEffectiveVisibility>("elementVisibility")
parameter<FirMemberDeclaration>("restrictingDeclaration")
parameter<FirEffectiveVisibility>("restrictingVisibility")
}
private inline fun <reified P : PsiElement> DiagnosticGroup.exposedVisibilityError(
positioningStrategy: PositioningStrategy = PositioningStrategy.DEFAULT
): PropertyDelegateProvider<Any?, ReadOnlyProperty<DiagnosticGroup, DiagnosticData>> {
return error<FirSourceElement, P>(positioningStrategy, exposedVisibilityDiagnosticInit)
}
private inline fun <reified P : PsiElement> DiagnosticGroup.exposedVisibilityWarning(
positioningStrategy: PositioningStrategy = PositioningStrategy.DEFAULT
): PropertyDelegateProvider<Any?, ReadOnlyProperty<DiagnosticGroup, DiagnosticData>> {
return warning<FirSourceElement, P>(positioningStrategy, exposedVisibilityDiagnosticInit)
}
@@ -133,6 +133,7 @@ object FirErrors {
val EXPOSED_FUNCTION_RETURN_TYPE by error3<FirSourceElement, KtNamedDeclaration, FirEffectiveVisibility, FirMemberDeclaration, FirEffectiveVisibility>(SourceElementPositioningStrategies.DECLARATION_NAME)
val EXPOSED_RECEIVER_TYPE by error3<FirSourceElement, KtTypeReference, FirEffectiveVisibility, FirMemberDeclaration, FirEffectiveVisibility>()
val EXPOSED_PROPERTY_TYPE by error3<FirSourceElement, KtNamedDeclaration, FirEffectiveVisibility, FirMemberDeclaration, FirEffectiveVisibility>(SourceElementPositioningStrategies.DECLARATION_NAME)
val EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR by warning3<FirSourceElement, KtNamedDeclaration, FirEffectiveVisibility, FirMemberDeclaration, FirEffectiveVisibility>(SourceElementPositioningStrategies.DECLARATION_NAME)
val EXPOSED_PARAMETER_TYPE by error3<FirSourceElement, KtParameter, FirEffectiveVisibility, FirMemberDeclaration, FirEffectiveVisibility>()
val EXPOSED_SUPER_INTERFACE by error3<FirSourceElement, KtTypeReference, FirEffectiveVisibility, FirMemberDeclaration, FirEffectiveVisibility>()
val EXPOSED_SUPER_CLASS by error3<FirSourceElement, KtTypeReference, FirEffectiveVisibility, FirMemberDeclaration, FirEffectiveVisibility>()
@@ -149,9 +149,14 @@ object FirExposedVisibilityDeclarationChecker : FirMemberDeclarationChecker() {
declaration.returnTypeRef.coneTypeSafe<ConeKotlinType>()
?.findVisibilityExposure(context, propertyVisibility)
if (restricting != null) {
val diagnostic = if (declaration.fromPrimaryConstructor == true) {
FirErrors.EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR
} else {
FirErrors.EXPOSED_PROPERTY_TYPE
}
reporter.reportOn(
declaration.source,
FirErrors.EXPOSED_PROPERTY_TYPE,
diagnostic,
propertyVisibility,
restricting,
restricting.getEffectiveVisibility(context),