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
@@ -141,7 +141,7 @@ public interface Errors {
// Exposed visibility group
DiagnosticFactory3<PsiElement, EffectiveVisibility, DescriptorWithRelation, EffectiveVisibility> EXPOSED_PROPERTY_TYPE = DiagnosticFactory3.create(ERROR);
DiagnosticFactory3<PsiElement, EffectiveVisibility, DescriptorWithRelation, EffectiveVisibility> EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR = DiagnosticFactory3.create(WARNING);
DiagnosticFactoryForDeprecation3<PsiElement, EffectiveVisibility, DescriptorWithRelation, EffectiveVisibility> EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR = DiagnosticFactoryForDeprecation3.create(LanguageFeature.ForbidExposingTypesInPrimaryConstructorProperties);
DiagnosticFactory3<PsiElement, EffectiveVisibility, DescriptorWithRelation, EffectiveVisibility> EXPOSED_FUNCTION_RETURN_TYPE = DiagnosticFactory3.create(ERROR);
DiagnosticFactory3<KtParameter, EffectiveVisibility, DescriptorWithRelation, EffectiveVisibility> EXPOSED_PARAMETER_TYPE = DiagnosticFactory3.create(ERROR);
DiagnosticFactory3<KtTypeReference, EffectiveVisibility, DescriptorWithRelation, EffectiveVisibility> EXPOSED_RECEIVER_TYPE = DiagnosticFactory3.create(ERROR);
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory3
import org.jetbrains.kotlin.diagnostics.DiagnosticFactoryForDeprecation3
import org.jetbrains.kotlin.diagnostics.Errors.*
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.visibilityModifier
@@ -52,6 +53,17 @@ class ExposedVisibilityChecker(
}
}
private fun <E : PsiElement> reportExposureForDeprecation(
diagnostic: DiagnosticFactoryForDeprecation3<E, EffectiveVisibility, DescriptorWithRelation, EffectiveVisibility>,
element: E,
elementVisibility: EffectiveVisibility,
restrictingDescriptor: DescriptorWithRelation
) {
val trace = trace ?: return
val restrictingVisibility = restrictingDescriptor.effectiveVisibility()
trace.report(diagnostic.on(languageVersionSettings, element, elementVisibility, restrictingDescriptor, restrictingVisibility))
}
// NB: does not check any members
fun checkClassHeader(klass: KtClassOrObject, classDescriptor: ClassDescriptor): Boolean {
var result = checkSupertypes(klass, classDescriptor)
@@ -62,6 +74,8 @@ class ExposedVisibilityChecker(
return result and checkFunction(constructor, constructorDescriptor)
}
// IMPORTANT: please don't remove this function (it's used in IDE)
@Suppress("unused")
fun checkDeclarationWithVisibility(
modifierListOwner: KtModifierListOwner,
descriptor: DeclarationDescriptorWithVisibility,
@@ -119,8 +133,11 @@ class ExposedVisibilityChecker(
val propertyOrClassVisibility = (propertyDescriptor ?: functionDescriptor.constructedClass).effectiveVisibility()
val restrictingByProperty = parameterDescriptor.type.leastPermissiveDescriptor(propertyOrClassVisibility)
if (restrictingByProperty != null) {
reportExposure(
EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR, valueParameter, propertyOrClassVisibility, restrictingByProperty
reportExposureForDeprecation(
EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR,
valueParameter.nameIdentifier ?: valueParameter,
propertyOrClassVisibility,
restrictingByProperty
)
result = false
}