[FIR] Fix reporting EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR warning
This commit is contained in:
+16
-4
@@ -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>()
|
||||
|
||||
+6
-1
@@ -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),
|
||||
|
||||
+2
-4
@@ -6,14 +6,11 @@
|
||||
package org.jetbrains.kotlin.fir.lightTree.fir
|
||||
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter
|
||||
import org.jetbrains.kotlin.fir.declarations.isFromVararg
|
||||
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
||||
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.buildQualifiedAccessExpression
|
||||
@@ -88,6 +85,7 @@ class ValueParameter(
|
||||
if (firValueParameter.isVararg) {
|
||||
this.isFromVararg = true
|
||||
}
|
||||
this.fromPrimaryConstructor = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -466,6 +466,7 @@ open class RawFirBuilder(
|
||||
if (firParameter.isVararg) {
|
||||
isFromVararg = true
|
||||
}
|
||||
fromPrimaryConstructor = true
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -177,11 +177,12 @@ val FirMemberDeclaration.containerSource: SourceElement?
|
||||
}
|
||||
|
||||
private object IsFromVarargKey : FirDeclarationDataKey()
|
||||
|
||||
private object IsReferredViaField : FirDeclarationDataKey()
|
||||
private object IsFromPrimaryConstructor : FirDeclarationDataKey()
|
||||
|
||||
var FirProperty.isFromVararg: Boolean? by FirDeclarationDataRegistry.data(IsFromVarargKey)
|
||||
var FirProperty.isReferredViaField: Boolean? by FirDeclarationDataRegistry.data(IsReferredViaField)
|
||||
var FirProperty.fromPrimaryConstructor: Boolean? by FirDeclarationDataRegistry.data(IsFromPrimaryConstructor)
|
||||
|
||||
// See [BindingContext.BACKING_FIELD_REQUIRED]
|
||||
val FirProperty.hasBackingField: Boolean
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// IGNORE_FIR_DIAGNOSTICS
|
||||
class MyObject private constructor(val delegate: Interface) : Interface by delegate {
|
||||
constructor() : this(Delegate())
|
||||
}
|
||||
|
||||
+1
-1
@@ -1,3 +1,3 @@
|
||||
private enum class Foo { A, B }
|
||||
|
||||
class Bar private constructor(val <!EXPOSED_PROPERTY_TYPE!>foo<!>: Foo)
|
||||
class Bar private constructor(val <!EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR!>foo<!>: Foo)
|
||||
|
||||
+1
-1
@@ -1,3 +1,3 @@
|
||||
private enum class Foo { A, B }
|
||||
|
||||
class Bar(<!EXPOSED_PARAMETER_TYPE!>val <!EXPOSED_PROPERTY_TYPE!>foo<!>: Foo<!>)
|
||||
class Bar(<!EXPOSED_PARAMETER_TYPE!>val <!EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR!>foo<!>: Foo<!>)
|
||||
|
||||
@@ -6,7 +6,7 @@ public interface Your: <!EXPOSED_SUPER_INTERFACE!>My<!> {
|
||||
fun <T: Base> foo(): T
|
||||
}
|
||||
|
||||
public class Derived<T: <!EXPOSED_TYPE_PARAMETER_BOUND!>My<!>>(<!EXPOSED_PARAMETER_TYPE!>val <!EXPOSED_PROPERTY_TYPE!>x<!>: My<!>): <!EXPOSED_SUPER_CLASS!>Base<!>() {
|
||||
public class Derived<T: <!EXPOSED_TYPE_PARAMETER_BOUND!>My<!>>(<!EXPOSED_PARAMETER_TYPE!>val <!EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR!>x<!>: My<!>): <!EXPOSED_SUPER_CLASS!>Base<!>() {
|
||||
|
||||
constructor(<!EXPOSED_PARAMETER_TYPE!>xx: My?<!>, <!EXPOSED_PARAMETER_TYPE!>x: My<!>): this(xx ?: x)
|
||||
|
||||
|
||||
@@ -4,13 +4,13 @@
|
||||
private class Bar
|
||||
|
||||
sealed class SealedFoo(
|
||||
<!EXPOSED_PARAMETER_TYPE!>val <!EXPOSED_PROPERTY_TYPE!>x<!>: Bar<!>,
|
||||
<!EXPOSED_PARAMETER_TYPE!>val <!EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR!>x<!>: Bar<!>,
|
||||
<!EXPOSED_PARAMETER_TYPE!>private val y: Bar<!>,
|
||||
<!EXPOSED_PARAMETER_TYPE!>z: Bar<!>
|
||||
)
|
||||
|
||||
abstract class AbstractFoo(
|
||||
<!EXPOSED_PARAMETER_TYPE!>val <!EXPOSED_PROPERTY_TYPE!>x<!>: Bar<!>,
|
||||
<!EXPOSED_PARAMETER_TYPE!>val <!EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR!>x<!>: Bar<!>,
|
||||
<!EXPOSED_PARAMETER_TYPE!>private val y: Bar<!>,
|
||||
<!EXPOSED_PARAMETER_TYPE!>z: Bar<!>
|
||||
)
|
||||
|
||||
+9
@@ -457,6 +457,15 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
|
||||
token,
|
||||
)
|
||||
}
|
||||
add(FirErrors.EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR) { firDiagnostic ->
|
||||
ExposedPropertyTypeInConstructorImpl(
|
||||
firDiagnostic.a.toVisibility(),
|
||||
firSymbolBuilder.buildSymbol(firDiagnostic.b as FirDeclaration),
|
||||
firDiagnostic.c.toVisibility(),
|
||||
firDiagnostic as FirPsiDiagnostic<*>,
|
||||
token,
|
||||
)
|
||||
}
|
||||
add(FirErrors.EXPOSED_PARAMETER_TYPE) { firDiagnostic ->
|
||||
ExposedParameterTypeImpl(
|
||||
firDiagnostic.a.toVisibility(),
|
||||
|
||||
+7
@@ -330,6 +330,13 @@ sealed class KtFirDiagnostic<PSI: PsiElement> : KtDiagnosticWithPsi<PSI> {
|
||||
abstract val restrictingVisibility: Visibility
|
||||
}
|
||||
|
||||
abstract class ExposedPropertyTypeInConstructor : KtFirDiagnostic<KtNamedDeclaration>() {
|
||||
override val diagnosticClass get() = ExposedPropertyTypeInConstructor::class
|
||||
abstract val elementVisibility: Visibility
|
||||
abstract val restrictingDeclaration: KtSymbol
|
||||
abstract val restrictingVisibility: Visibility
|
||||
}
|
||||
|
||||
abstract class ExposedParameterType : KtFirDiagnostic<KtParameter>() {
|
||||
override val diagnosticClass get() = ExposedParameterType::class
|
||||
abstract val elementVisibility: Visibility
|
||||
|
||||
+10
@@ -529,6 +529,16 @@ internal class ExposedPropertyTypeImpl(
|
||||
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
|
||||
}
|
||||
|
||||
internal class ExposedPropertyTypeInConstructorImpl(
|
||||
override val elementVisibility: Visibility,
|
||||
override val restrictingDeclaration: KtSymbol,
|
||||
override val restrictingVisibility: Visibility,
|
||||
firDiagnostic: FirPsiDiagnostic<*>,
|
||||
override val token: ValidityToken,
|
||||
) : KtFirDiagnostic.ExposedPropertyTypeInConstructor(), KtAbstractFirDiagnostic<KtNamedDeclaration> {
|
||||
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
|
||||
}
|
||||
|
||||
internal class ExposedParameterTypeImpl(
|
||||
override val elementVisibility: Visibility,
|
||||
override val restrictingDeclaration: KtSymbol,
|
||||
|
||||
Reference in New Issue
Block a user