Fix inaccurate report of DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM

It can be reported not only from within the enum, but also from
top-level functions. Add separate diagnostic for such cases.

^KT-64488
This commit is contained in:
Roman Efremov
2024-02-26 16:01:53 +01:00
committed by Space Team
parent 34d87465ac
commit 02b5fed389
9 changed files with 29 additions and 3 deletions
@@ -5019,6 +5019,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
token,
)
}
add(FirErrors.DEPRECATED_ACCESS_TO_ENTRIES_PROPERTY) { firDiagnostic ->
DeprecatedAccessToEntriesPropertyImpl(
firDiagnostic as KtPsiDiagnostic,
token,
)
}
add(FirErrors.DEPRECATED_ACCESS_TO_ENUM_ENTRY_PROPERTY_AS_REFERENCE) { firDiagnostic ->
DeprecatedAccessToEnumEntryPropertyAsReferenceImpl(
firDiagnostic as KtPsiDiagnostic,
@@ -3494,6 +3494,10 @@ sealed interface KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
override val diagnosticClass get() = DeprecatedAccessToEntryPropertyFromEnum::class
}
interface DeprecatedAccessToEntriesProperty : KtFirDiagnostic<PsiElement> {
override val diagnosticClass get() = DeprecatedAccessToEntriesProperty::class
}
interface DeprecatedAccessToEnumEntryPropertyAsReference : KtFirDiagnostic<PsiElement> {
override val diagnosticClass get() = DeprecatedAccessToEnumEntryPropertyAsReference::class
}
@@ -4214,6 +4214,11 @@ internal class DeprecatedAccessToEntryPropertyFromEnumImpl(
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<PsiElement>(firDiagnostic, token), KtFirDiagnostic.DeprecatedAccessToEntryPropertyFromEnum
internal class DeprecatedAccessToEntriesPropertyImpl(
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<PsiElement>(firDiagnostic, token), KtFirDiagnostic.DeprecatedAccessToEntriesProperty
internal class DeprecatedAccessToEnumEntryPropertyAsReferenceImpl(
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
@@ -1777,6 +1777,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
val ENUM_ENTRIES_DEPRECATIONS by object : DiagnosticGroup("Enum.entries resolve deprecations") {
val DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY by warning<PsiElement>()
val DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM by warning<PsiElement>()
val DEPRECATED_ACCESS_TO_ENTRIES_PROPERTY by warning<PsiElement>()
val DEPRECATED_ACCESS_TO_ENUM_ENTRY_PROPERTY_AS_REFERENCE by warning<PsiElement>(PositioningStrategy.REFERENCED_NAME_BY_QUALIFIED)
val DEPRECATED_DECLARATION_OF_ENUM_ENTRY by warning<KtEnumEntry>()
}
@@ -883,6 +883,7 @@ object FirErrors {
// Enum.entries resolve deprecations
val DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY: KtDiagnosticFactory0 by warning0<PsiElement>()
val DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM: KtDiagnosticFactory0 by warning0<PsiElement>()
val DEPRECATED_ACCESS_TO_ENTRIES_PROPERTY: KtDiagnosticFactory0 by warning0<PsiElement>()
val DEPRECATED_ACCESS_TO_ENUM_ENTRY_PROPERTY_AS_REFERENCE: KtDiagnosticFactory0 by warning0<PsiElement>(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED)
val DEPRECATED_DECLARATION_OF_ENUM_ENTRY: KtDiagnosticFactory0 by warning0<KtEnumEntry>()
@@ -12,6 +12,8 @@ import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.utils.isEnumClass
import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
import org.jetbrains.kotlin.fir.references.toResolvedPropertySymbol
@@ -27,8 +29,10 @@ object FirCustomEnumEntriesMigrationAccessChecker : FirPropertyAccessExpressionC
// This 'if' is needed just to choose one of two diagnostics
if (expression.dispatchReceiver is FirResolvedQualifier || expression.extensionReceiver is FirResolvedQualifier) {
reporter.reportOn(expression.source, FirErrors.DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY, context)
} else {
} else if (context.containingDeclarations.any { it is FirClass && it.isEnumClass }) {
reporter.reportOn(expression.source, FirErrors.DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM, context)
} else {
reporter.reportOn(expression.source, FirErrors.DEPRECATED_ACCESS_TO_ENTRIES_PROPERTY, context)
}
}
}
@@ -190,6 +190,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DELEGATE_USES_EXT
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DELEGATION_IN_INTERFACE
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DELEGATION_NOT_TO_INTERFACE
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DELEGATION_SUPER_CALL_IN_ENUM_CONSTRUCTOR
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_ACCESS_TO_ENTRIES_PROPERTY
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_ACCESS_TO_ENUM_ENTRY_PROPERTY_AS_REFERENCE
@@ -2586,6 +2587,10 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() {
DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM,
"Ambiguous access to the 'entries' property from within the enum is deprecated. Please add the explicit qualifier to the call."
)
map.put(
DEPRECATED_ACCESS_TO_ENTRIES_PROPERTY,
"Ambiguous access to the 'entries' property is deprecated. In the future, it will be shadowed by enum 'entries' property. Please resolve the ambiguity (e.g. by adding explicit qualifier to the call)."
)
map.put(
DEPRECATED_ACCESS_TO_ENUM_ENTRY_PROPERTY_AS_REFERENCE,
"Ambiguous access to the 'entries' property is deprecated. Please specify the type of the referenced expression explicitly."
@@ -7,5 +7,5 @@ enum class MyEnum
val entries = "local str"
fun test() {
<!DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM!>entries<!>
<!DEPRECATED_ACCESS_TO_ENTRIES_PROPERTY!>entries<!>
}
@@ -41,7 +41,7 @@ context(Bar)
fun test3() = z
context(Bar)
fun test4() = <!DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM!>entries<!>
fun test4() = <!DEPRECATED_ACCESS_TO_ENTRIES_PROPERTY!>entries<!>
context(Bar)
fun Baz.test5() = w