Convert EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR into deprecation error

#KT-28078 Fixed
This commit is contained in:
Mikhail Glukhikh
2021-10-21 12:40:55 +03:00
parent a969e5af50
commit 8bd0b237b7
22 changed files with 150 additions and 32 deletions
@@ -10377,6 +10377,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
runTest("compiler/testData/diagnostics/tests/exposed/propertyInPrivateConstructor.kt");
}
@Test
@TestMetadata("propertyInPrivateConstructorError.kt")
public void testPropertyInPrivateConstructorError() throws Exception {
runTest("compiler/testData/diagnostics/tests/exposed/propertyInPrivateConstructorError.kt");
}
@Test
@TestMetadata("propertyInSimpleConstructor.kt")
public void testPropertyInSimpleConstructor() throws Exception {
@@ -10377,6 +10377,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
runTest("compiler/testData/diagnostics/tests/exposed/propertyInPrivateConstructor.kt");
}
@Test
@TestMetadata("propertyInPrivateConstructorError.kt")
public void testPropertyInPrivateConstructorError() throws Exception {
runTest("compiler/testData/diagnostics/tests/exposed/propertyInPrivateConstructorError.kt");
}
@Test
@TestMetadata("propertyInSimpleConstructor.kt")
public void testPropertyInSimpleConstructor() throws Exception {
@@ -326,7 +326,9 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
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_PROPERTY_TYPE_IN_CONSTRUCTOR by exposedVisibilityDeprecationError<KtNamedDeclaration>(
LanguageFeature.ForbidExposingTypesInPrimaryConstructorProperties, 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>()
@@ -1378,4 +1380,11 @@ private inline fun <reified P : PsiElement> AbstractDiagnosticGroup.exposedVisib
return warning<P>(positioningStrategy, exposedVisibilityDiagnosticInit)
}
private inline fun <reified P : PsiElement> AbstractDiagnosticGroup.exposedVisibilityDeprecationError(
languageFeature: LanguageFeature,
positioningStrategy: PositioningStrategy = PositioningStrategy.DEFAULT
): PropertyDelegateProvider<Any?, ReadOnlyProperty<AbstractDiagnosticGroup, DeprecationDiagnosticData>> {
return deprecationError<P>(languageFeature, positioningStrategy, exposedVisibilityDiagnosticInit)
}
typealias Symbol = FirBasedSymbol<*>
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.analysis.diagnostics
import com.intellij.psi.PsiElement
import com.intellij.psi.impl.source.tree.LeafPsiElement
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageFeature.ForbidExposingTypesInPrimaryConstructorProperties
import org.jetbrains.kotlin.config.LanguageFeature.ProhibitAssigningSingleElementsToVarargsInNamedForm
import org.jetbrains.kotlin.config.LanguageFeature.ProhibitConfusingSyntaxInWhenBranches
import org.jetbrains.kotlin.config.LanguageFeature.ProhibitInvisibleAbstractMethodsInSuperclasses
@@ -266,7 +267,7 @@ object FirErrors {
val EXPOSED_FUNCTION_RETURN_TYPE by error3<KtNamedDeclaration, EffectiveVisibility, FirBasedSymbol<*>, EffectiveVisibility>(SourceElementPositioningStrategies.DECLARATION_NAME)
val EXPOSED_RECEIVER_TYPE by error3<KtTypeReference, EffectiveVisibility, FirBasedSymbol<*>, EffectiveVisibility>()
val EXPOSED_PROPERTY_TYPE by error3<KtNamedDeclaration, EffectiveVisibility, FirBasedSymbol<*>, EffectiveVisibility>(SourceElementPositioningStrategies.DECLARATION_NAME)
val EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR by warning3<KtNamedDeclaration, EffectiveVisibility, FirBasedSymbol<*>, EffectiveVisibility>(SourceElementPositioningStrategies.DECLARATION_NAME)
val EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR by deprecationError3<KtNamedDeclaration, EffectiveVisibility, FirBasedSymbol<*>, EffectiveVisibility>(ForbidExposingTypesInPrimaryConstructorProperties, SourceElementPositioningStrategies.DECLARATION_NAME)
val EXPOSED_PARAMETER_TYPE by error3<KtParameter, EffectiveVisibility, FirBasedSymbol<*>, EffectiveVisibility>()
val EXPOSED_SUPER_INTERFACE by error3<KtTypeReference, EffectiveVisibility, FirBasedSymbol<*>, EffectiveVisibility>()
val EXPOSED_SUPER_CLASS by error3<KtTypeReference, EffectiveVisibility, FirBasedSymbol<*>, EffectiveVisibility>()
@@ -145,19 +145,25 @@ object FirExposedVisibilityDeclarationChecker : FirBasicDeclarationChecker() {
if (propertyVisibility == EffectiveVisibility.Local) return
declaration.returnTypeRef.coneTypeSafe<ConeKotlinType>()
?.findVisibilityExposure(context, propertyVisibility)?.let { (restricting, restrictingVisibility) ->
val diagnostic = if (declaration.fromPrimaryConstructor == true) {
FirErrors.EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR
if (declaration.fromPrimaryConstructor == true) {
reporter.reportOn(
declaration.source,
FirErrors.EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR,
propertyVisibility,
restricting,
restrictingVisibility,
context
)
} else {
FirErrors.EXPOSED_PROPERTY_TYPE
reporter.reportOn(
declaration.source,
FirErrors.EXPOSED_PROPERTY_TYPE,
propertyVisibility,
restricting,
restrictingVisibility,
context
)
}
reporter.reportOn(
declaration.source,
diagnostic,
propertyVisibility,
restricting,
restrictingVisibility,
context
)
}
checkMemberReceiver(declaration.receiverTypeRef, declaration, reporter, context)
}