提交 de03124f 编写于 作者: D Dmitriy Novozhilov

[FIR] Fix reporting EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR warning

上级 21b1d97b
......@@ -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),
......
......@@ -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
......
// IGNORE_FIR_DIAGNOSTICS
class MyObject private constructor(val delegate: Interface) : Interface by delegate {
constructor() : this(Delegate())
}
......
private enum class Foo { A, B }
class Bar private constructor(val <!EXPOSED_PROPERTY_TYPE!>foo<!>: Foo)
\ No newline at end of file
class Bar private constructor(val <!EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR!>foo<!>: Foo)
private enum class Foo { A, B }
class Bar(<!EXPOSED_PARAMETER_TYPE!>val <!EXPOSED_PROPERTY_TYPE!>foo<!>: Foo<!>)
\ No newline at end of file
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<!>
)
......@@ -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(),
......
......@@ -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
......
......@@ -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,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册