[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.lexer.KtModifierKeywordToken
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
import kotlin.properties.PropertyDelegateProvider
|
||||||
|
import kotlin.properties.ReadOnlyProperty
|
||||||
|
|
||||||
|
|
||||||
@Suppress("UNUSED_VARIABLE", "LocalVariableName", "ClassName", "unused")
|
@Suppress("UNUSED_VARIABLE", "LocalVariableName", "ClassName", "unused")
|
||||||
@@ -133,9 +135,9 @@ object DIAGNOSTICS_LIST : DiagnosticList() {
|
|||||||
val EXPOSED_VISIBILITY by object : DiagnosticGroup("Exposed visibility") {
|
val EXPOSED_VISIBILITY by object : DiagnosticGroup("Exposed visibility") {
|
||||||
val EXPOSED_TYPEALIAS_EXPANDED_TYPE by exposedVisibilityError<KtNamedDeclaration>(PositioningStrategy.DECLARATION_NAME)
|
val EXPOSED_TYPEALIAS_EXPANDED_TYPE by exposedVisibilityError<KtNamedDeclaration>(PositioningStrategy.DECLARATION_NAME)
|
||||||
val EXPOSED_FUNCTION_RETURN_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_RECEIVER_TYPE by exposedVisibilityError<KtTypeReference>()
|
||||||
val EXPOSED_PROPERTY_TYPE by exposedVisibilityError<KtNamedDeclaration>(PositioningStrategy.DECLARATION_NAME)
|
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_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_INTERFACE by exposedVisibilityError<KtTypeReference>()
|
||||||
val EXPOSED_SUPER_CLASS 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(
|
private val exposedVisibilityDiagnosticInit: DiagnosticBuilder.() -> Unit = {
|
||||||
positioningStrategy: PositioningStrategy = PositioningStrategy.DEFAULT
|
|
||||||
) = error<FirSourceElement, P>(positioningStrategy) {
|
|
||||||
parameter<FirEffectiveVisibility>("elementVisibility")
|
parameter<FirEffectiveVisibility>("elementVisibility")
|
||||||
parameter<FirMemberDeclaration>("restrictingDeclaration")
|
parameter<FirMemberDeclaration>("restrictingDeclaration")
|
||||||
parameter<FirEffectiveVisibility>("restrictingVisibility")
|
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_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_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 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_PARAMETER_TYPE by error3<FirSourceElement, KtParameter, FirEffectiveVisibility, FirMemberDeclaration, FirEffectiveVisibility>()
|
||||||
val EXPOSED_SUPER_INTERFACE by error3<FirSourceElement, KtTypeReference, 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>()
|
val EXPOSED_SUPER_CLASS by error3<FirSourceElement, KtTypeReference, FirEffectiveVisibility, FirMemberDeclaration, FirEffectiveVisibility>()
|
||||||
|
|||||||
+6
-1
@@ -149,9 +149,14 @@ object FirExposedVisibilityDeclarationChecker : FirMemberDeclarationChecker() {
|
|||||||
declaration.returnTypeRef.coneTypeSafe<ConeKotlinType>()
|
declaration.returnTypeRef.coneTypeSafe<ConeKotlinType>()
|
||||||
?.findVisibilityExposure(context, propertyVisibility)
|
?.findVisibilityExposure(context, propertyVisibility)
|
||||||
if (restricting != null) {
|
if (restricting != null) {
|
||||||
|
val diagnostic = if (declaration.fromPrimaryConstructor == true) {
|
||||||
|
FirErrors.EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR
|
||||||
|
} else {
|
||||||
|
FirErrors.EXPOSED_PROPERTY_TYPE
|
||||||
|
}
|
||||||
reporter.reportOn(
|
reporter.reportOn(
|
||||||
declaration.source,
|
declaration.source,
|
||||||
FirErrors.EXPOSED_PROPERTY_TYPE,
|
diagnostic,
|
||||||
propertyVisibility,
|
propertyVisibility,
|
||||||
restricting,
|
restricting,
|
||||||
restricting.getEffectiveVisibility(context),
|
restricting.getEffectiveVisibility(context),
|
||||||
|
|||||||
+2
-4
@@ -6,14 +6,11 @@
|
|||||||
package org.jetbrains.kotlin.fir.lightTree.fir
|
package org.jetbrains.kotlin.fir.lightTree.fir
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.*
|
import org.jetbrains.kotlin.fir.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
|
||||||
import org.jetbrains.kotlin.fir.declarations.builder.buildProperty
|
import org.jetbrains.kotlin.fir.declarations.builder.buildProperty
|
||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
|
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
|
||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter
|
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.DiagnosticKind
|
||||||
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
|
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
|
||||||
import org.jetbrains.kotlin.fir.expressions.builder.buildQualifiedAccessExpression
|
import org.jetbrains.kotlin.fir.expressions.builder.buildQualifiedAccessExpression
|
||||||
@@ -88,6 +85,7 @@ class ValueParameter(
|
|||||||
if (firValueParameter.isVararg) {
|
if (firValueParameter.isVararg) {
|
||||||
this.isFromVararg = true
|
this.isFromVararg = true
|
||||||
}
|
}
|
||||||
|
this.fromPrimaryConstructor = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -466,6 +466,7 @@ open class RawFirBuilder(
|
|||||||
if (firParameter.isVararg) {
|
if (firParameter.isVararg) {
|
||||||
isFromVararg = true
|
isFromVararg = true
|
||||||
}
|
}
|
||||||
|
fromPrimaryConstructor = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -177,11 +177,12 @@ val FirMemberDeclaration.containerSource: SourceElement?
|
|||||||
}
|
}
|
||||||
|
|
||||||
private object IsFromVarargKey : FirDeclarationDataKey()
|
private object IsFromVarargKey : FirDeclarationDataKey()
|
||||||
|
|
||||||
private object IsReferredViaField : FirDeclarationDataKey()
|
private object IsReferredViaField : FirDeclarationDataKey()
|
||||||
|
private object IsFromPrimaryConstructor : FirDeclarationDataKey()
|
||||||
|
|
||||||
var FirProperty.isFromVararg: Boolean? by FirDeclarationDataRegistry.data(IsFromVarargKey)
|
var FirProperty.isFromVararg: Boolean? by FirDeclarationDataRegistry.data(IsFromVarargKey)
|
||||||
var FirProperty.isReferredViaField: Boolean? by FirDeclarationDataRegistry.data(IsReferredViaField)
|
var FirProperty.isReferredViaField: Boolean? by FirDeclarationDataRegistry.data(IsReferredViaField)
|
||||||
|
var FirProperty.fromPrimaryConstructor: Boolean? by FirDeclarationDataRegistry.data(IsFromPrimaryConstructor)
|
||||||
|
|
||||||
// See [BindingContext.BACKING_FIELD_REQUIRED]
|
// See [BindingContext.BACKING_FIELD_REQUIRED]
|
||||||
val FirProperty.hasBackingField: Boolean
|
val FirProperty.hasBackingField: Boolean
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_FIR_DIAGNOSTICS
|
|
||||||
class MyObject private constructor(val delegate: Interface) : Interface by delegate {
|
class MyObject private constructor(val delegate: Interface) : Interface by delegate {
|
||||||
constructor() : this(Delegate())
|
constructor() : this(Delegate())
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1,3 +1,3 @@
|
|||||||
private enum class Foo { A, B }
|
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 }
|
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
|
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)
|
constructor(<!EXPOSED_PARAMETER_TYPE!>xx: My?<!>, <!EXPOSED_PARAMETER_TYPE!>x: My<!>): this(xx ?: x)
|
||||||
|
|
||||||
|
|||||||
@@ -4,13 +4,13 @@
|
|||||||
private class Bar
|
private class Bar
|
||||||
|
|
||||||
sealed class SealedFoo(
|
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!>private val y: Bar<!>,
|
||||||
<!EXPOSED_PARAMETER_TYPE!>z: Bar<!>
|
<!EXPOSED_PARAMETER_TYPE!>z: Bar<!>
|
||||||
)
|
)
|
||||||
|
|
||||||
abstract class AbstractFoo(
|
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!>private val y: Bar<!>,
|
||||||
<!EXPOSED_PARAMETER_TYPE!>z: Bar<!>
|
<!EXPOSED_PARAMETER_TYPE!>z: Bar<!>
|
||||||
)
|
)
|
||||||
|
|||||||
+9
@@ -457,6 +457,15 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
|
|||||||
token,
|
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 ->
|
add(FirErrors.EXPOSED_PARAMETER_TYPE) { firDiagnostic ->
|
||||||
ExposedParameterTypeImpl(
|
ExposedParameterTypeImpl(
|
||||||
firDiagnostic.a.toVisibility(),
|
firDiagnostic.a.toVisibility(),
|
||||||
|
|||||||
+7
@@ -330,6 +330,13 @@ sealed class KtFirDiagnostic<PSI: PsiElement> : KtDiagnosticWithPsi<PSI> {
|
|||||||
abstract val restrictingVisibility: Visibility
|
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>() {
|
abstract class ExposedParameterType : KtFirDiagnostic<KtParameter>() {
|
||||||
override val diagnosticClass get() = ExposedParameterType::class
|
override val diagnosticClass get() = ExposedParameterType::class
|
||||||
abstract val elementVisibility: Visibility
|
abstract val elementVisibility: Visibility
|
||||||
|
|||||||
+10
@@ -529,6 +529,16 @@ internal class ExposedPropertyTypeImpl(
|
|||||||
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
|
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(
|
internal class ExposedParameterTypeImpl(
|
||||||
override val elementVisibility: Visibility,
|
override val elementVisibility: Visibility,
|
||||||
override val restrictingDeclaration: KtSymbol,
|
override val restrictingDeclaration: KtSymbol,
|
||||||
|
|||||||
Reference in New Issue
Block a user