From 02b5fed3894a5cf4bf3d06b83f81f00615642b92 Mon Sep 17 00:00:00 2001 From: Roman Efremov Date: Mon, 26 Feb 2024 16:01:53 +0100 Subject: [PATCH] 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 --- .../api/fir/diagnostics/KtFirDataClassConverters.kt | 6 ++++++ .../kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt | 4 ++++ .../analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt | 5 +++++ .../checkers/generator/diagnostics/FirDiagnosticsList.kt | 1 + .../jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt | 1 + .../FirCustomEnumEntriesMigrationAccessChecker.kt | 6 +++++- .../fir/analysis/diagnostics/FirErrorsDefaultMessages.kt | 5 +++++ .../tests/enum/entries/entriesPropertyImport.fir.kt | 2 +- .../extensions/contextReceivers/priorityInTower.fir.kt | 2 +- 9 files changed, 29 insertions(+), 3 deletions(-) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index 97795825f1b..68a0351a3eb 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -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, diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index 628557966c2..b411b3d582a 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -3494,6 +3494,10 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = DeprecatedAccessToEntryPropertyFromEnum::class } + interface DeprecatedAccessToEntriesProperty : KtFirDiagnostic { + override val diagnosticClass get() = DeprecatedAccessToEntriesProperty::class + } + interface DeprecatedAccessToEnumEntryPropertyAsReference : KtFirDiagnostic { override val diagnosticClass get() = DeprecatedAccessToEnumEntryPropertyAsReference::class } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 1ee83ff95fe..f1e61e38ce9 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -4214,6 +4214,11 @@ internal class DeprecatedAccessToEntryPropertyFromEnumImpl( token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.DeprecatedAccessToEntryPropertyFromEnum +internal class DeprecatedAccessToEntriesPropertyImpl( + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.DeprecatedAccessToEntriesProperty + internal class DeprecatedAccessToEnumEntryPropertyAsReferenceImpl( firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 57992456ae0..0ee01843a93 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -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() val DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM by warning() + val DEPRECATED_ACCESS_TO_ENTRIES_PROPERTY by warning() val DEPRECATED_ACCESS_TO_ENUM_ENTRY_PROPERTY_AS_REFERENCE by warning(PositioningStrategy.REFERENCED_NAME_BY_QUALIFIED) val DEPRECATED_DECLARATION_OF_ENUM_ENTRY by warning() } diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 6bf2cb3e1b7..143151d69ae 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -883,6 +883,7 @@ object FirErrors { // Enum.entries resolve deprecations val DEPRECATED_ACCESS_TO_ENUM_ENTRY_COMPANION_PROPERTY: KtDiagnosticFactory0 by warning0() val DEPRECATED_ACCESS_TO_ENTRY_PROPERTY_FROM_ENUM: KtDiagnosticFactory0 by warning0() + val DEPRECATED_ACCESS_TO_ENTRIES_PROPERTY: KtDiagnosticFactory0 by warning0() val DEPRECATED_ACCESS_TO_ENUM_ENTRY_PROPERTY_AS_REFERENCE: KtDiagnosticFactory0 by warning0(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED) val DEPRECATED_DECLARATION_OF_ENUM_ENTRY: KtDiagnosticFactory0 by warning0() diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirCustomEnumEntriesMigrationAccessChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirCustomEnumEntriesMigrationAccessChecker.kt index 639494f22f7..346bb6eca54 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirCustomEnumEntriesMigrationAccessChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirCustomEnumEntriesMigrationAccessChecker.kt @@ -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) } } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt index b600f8ef77d..a947e065975 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt @@ -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." diff --git a/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyImport.fir.kt b/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyImport.fir.kt index 6302fe5b0a0..0760c3797aa 100644 --- a/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyImport.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyImport.fir.kt @@ -7,5 +7,5 @@ enum class MyEnum val entries = "local str" fun test() { - entries + entries } diff --git a/compiler/testData/diagnostics/tests/extensions/contextReceivers/priorityInTower.fir.kt b/compiler/testData/diagnostics/tests/extensions/contextReceivers/priorityInTower.fir.kt index 53cbc471dc2..a467fbf09d5 100644 --- a/compiler/testData/diagnostics/tests/extensions/contextReceivers/priorityInTower.fir.kt +++ b/compiler/testData/diagnostics/tests/extensions/contextReceivers/priorityInTower.fir.kt @@ -41,7 +41,7 @@ context(Bar) fun test3() = z context(Bar) -fun test4() = entries +fun test4() = entries context(Bar) fun Baz.test5() = w