From 177394f6ef24894d3ebfc5f4edaa46629da3914b Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Tue, 11 May 2021 18:23:21 +0300 Subject: [PATCH] [FIR] Implement DEPRECATED_SINCE_KOTLIN_WITH_DEPRECATED_LEVEL, fix tests --- .../diagnostics/FirDiagnosticsList.kt | 1 + .../fir/analysis/diagnostics/FirErrors.kt | 1 + .../declaration/FirAnnotationChecker.kt | 23 +++++++++++++++++-- .../diagnostics/FirDefaultErrorMessages.kt | 5 ++++ .../deprecatedSinceKotlinDeclaration.fir.kt | 8 +++---- .../diagnostics/KtFirDataClassConverters.kt | 6 +++++ .../api/fir/diagnostics/KtFirDiagnostics.kt | 4 ++++ .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 7 ++++++ 8 files changed, 49 insertions(+), 6 deletions(-) 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 5674170f027..1bdb0a2532e 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 @@ -160,6 +160,7 @@ object DIAGNOSTICS_LIST : DiagnosticList() { val DEPRECATED_SINCE_KOTLIN_WITH_UNORDERED_VERSIONS by error() val DEPRECATED_SINCE_KOTLIN_WITHOUT_ARGUMENTS by error() val DEPRECATED_SINCE_KOTLIN_WITHOUT_DEPRECATED by error() + val DEPRECATED_SINCE_KOTLIN_WITH_DEPRECATED_LEVEL by error() } val EXPOSED_VISIBILITY by object : DiagnosticGroup("Exposed visibility") { 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 1347adecf01..b985e64e98f 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 @@ -166,6 +166,7 @@ object FirErrors { val DEPRECATED_SINCE_KOTLIN_WITH_UNORDERED_VERSIONS by error0() val DEPRECATED_SINCE_KOTLIN_WITHOUT_ARGUMENTS by error0() val DEPRECATED_SINCE_KOTLIN_WITHOUT_DEPRECATED by error0() + val DEPRECATED_SINCE_KOTLIN_WITH_DEPRECATED_LEVEL by error0() // Exposed visibility val EXPOSED_TYPEALIAS_EXPANDED_TYPE by error3(SourceElementPositioningStrategies.DECLARATION_NAME) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirAnnotationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirAnnotationChecker.kt index 54993269e88..18552043d7f 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirAnnotationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirAnnotationChecker.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.expressions.argumentMapping import org.jetbrains.kotlin.fir.resolve.fqName import org.jetbrains.kotlin.name.FqName @@ -25,6 +26,7 @@ object FirAnnotationChecker : FirAnnotatedDeclarationChecker() { ) { var deprecatedCall: FirAnnotationCall? = null var deprecatedSinceKotlinCall: FirAnnotationCall? = null + for (annotation in declaration.annotations) { val fqName = annotation.fqName(context.session) if (fqName == deprecatedClassId) { @@ -34,8 +36,25 @@ object FirAnnotationChecker : FirAnnotatedDeclarationChecker() { } } - if (deprecatedSinceKotlinCall != null && deprecatedCall == null) { - reporter.reportOn(deprecatedSinceKotlinCall.source, FirErrors.DEPRECATED_SINCE_KOTLIN_WITHOUT_DEPRECATED, context) + if (deprecatedSinceKotlinCall != null) { + if (deprecatedCall == null) { + reporter.reportOn(deprecatedSinceKotlinCall.source, FirErrors.DEPRECATED_SINCE_KOTLIN_WITHOUT_DEPRECATED, context) + } else { + val argumentMapping = deprecatedCall.argumentMapping ?: return + var report = false + for ((_, value) in argumentMapping) { + report = value.name.identifier == "level" + if (report) + break + } + if (report) { + reporter.reportOn( + deprecatedSinceKotlinCall.source, + FirErrors.DEPRECATED_SINCE_KOTLIN_WITH_DEPRECATED_LEVEL, + context + ) + } + } } } } \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt index 36900eaa1f5..aae6ed265fa 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt @@ -88,6 +88,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DELEGATION_SUPER_ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_MODIFIER_PAIR import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_SINCE_KOTLIN_WITHOUT_ARGUMENTS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_SINCE_KOTLIN_WITHOUT_DEPRECATED +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_SINCE_KOTLIN_WITH_DEPRECATED_LEVEL import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_SINCE_KOTLIN_WITH_UNORDERED_VERSIONS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_TYPE_PARAMETER_SYNTAX import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DESERIALIZATION_ERROR @@ -443,6 +444,10 @@ class FirDefaultErrorMessages : DefaultErrorMessages.Extension { DEPRECATED_SINCE_KOTLIN_WITHOUT_DEPRECATED, " DeprecatedSinceKotlin annotation can be used only together with Deprecated annotation" ) + map.put( + DEPRECATED_SINCE_KOTLIN_WITH_DEPRECATED_LEVEL, + "DeprecatedSinceKotlin annotation can be used only with unspecified deprecation level of Deprecated annotation" + ) // Exposed visibility group // # map.put( diff --git a/compiler/testData/diagnostics/tests/deprecated/deprecatedSinceKotlin/deprecatedSinceKotlinDeclaration.fir.kt b/compiler/testData/diagnostics/tests/deprecated/deprecatedSinceKotlin/deprecatedSinceKotlinDeclaration.fir.kt index 3422c5f0248..b5b4766706f 100644 --- a/compiler/testData/diagnostics/tests/deprecated/deprecatedSinceKotlin/deprecatedSinceKotlinDeclaration.fir.kt +++ b/compiler/testData/diagnostics/tests/deprecated/deprecatedSinceKotlin/deprecatedSinceKotlinDeclaration.fir.kt @@ -9,19 +9,19 @@ fun good() {} class Clazz @Deprecated("", level = DeprecationLevel.WARNING) -@DeprecatedSinceKotlin() +@DeprecatedSinceKotlin() fun fooWarning() {} @Deprecated("", ReplaceWith(""), DeprecationLevel.WARNING) -@DeprecatedSinceKotlin() +@DeprecatedSinceKotlin() fun fooDefaultWarning() {} @Deprecated("", level = DeprecationLevel.ERROR) -@DeprecatedSinceKotlin() +@DeprecatedSinceKotlin() fun fooError() {} @Deprecated("", level = DeprecationLevel.HIDDEN) -@DeprecatedSinceKotlin() +@DeprecatedSinceKotlin() fun fooHidden() {} @Deprecated("") diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt index 44c5d757f05..2eed107629a 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -545,6 +545,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.DEPRECATED_SINCE_KOTLIN_WITH_DEPRECATED_LEVEL) { firDiagnostic -> + DeprecatedSinceKotlinWithDeprecatedLevelImpl( + firDiagnostic as FirPsiDiagnostic<*>, + token, + ) + } add(FirErrors.EXPOSED_TYPEALIAS_EXPANDED_TYPE) { firDiagnostic -> ExposedTypealiasExpandedTypeImpl( firDiagnostic.a, diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt index 9ce73e4ff66..4ddc8330f2b 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt @@ -392,6 +392,10 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = DeprecatedSinceKotlinWithoutDeprecated::class } + abstract class DeprecatedSinceKotlinWithDeprecatedLevel : KtFirDiagnostic() { + override val diagnosticClass get() = DeprecatedSinceKotlinWithDeprecatedLevel::class + } + abstract class ExposedTypealiasExpandedType : KtFirDiagnostic() { override val diagnosticClass get() = ExposedTypealiasExpandedType::class abstract val elementVisibility: EffectiveVisibility diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index a68339be16c..12c419ecb71 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -633,6 +633,13 @@ internal class DeprecatedSinceKotlinWithoutDeprecatedImpl( override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) } +internal class DeprecatedSinceKotlinWithDeprecatedLevelImpl( + firDiagnostic: FirPsiDiagnostic<*>, + override val token: ValidityToken, +) : KtFirDiagnostic.DeprecatedSinceKotlinWithDeprecatedLevel(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) +} + internal class ExposedTypealiasExpandedTypeImpl( override val elementVisibility: EffectiveVisibility, override val restrictingDeclaration: KtSymbol,