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 e8ff31d49c2..045241b2986 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 @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.ForbiddenNamedArgumentsTarget +import org.jetbrains.kotlin.resolve.deprecation.Deprecation import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualCompatibility.Incompatible import org.jetbrains.kotlin.types.Variance import kotlin.properties.PropertyDelegateProvider @@ -239,6 +240,11 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { val DEPRECATED_SINCE_KOTLIN_WITH_DEPRECATED_LEVEL by error(PositioningStrategy.REFERENCED_NAME_BY_QUALIFIED) val DEPRECATED_SINCE_KOTLIN_OUTSIDE_KOTLIN_SUBPACKAGE by error(PositioningStrategy.REFERENCED_NAME_BY_QUALIFIED) + val OVERRIDE_DEPRECATION by warning(PositioningStrategy.DECLARATION_NAME) { + parameter("overridenSymbol") + parameter("deprecationInfo") + } + val ANNOTATION_ON_SUPERCLASS by deprecationError(LanguageFeature.ProhibitUseSiteTargetAnnotationsOnSuperTypes) val RESTRICTED_RETENTION_FOR_EXPRESSION_ANNOTATION by deprecationError(LanguageFeature.RestrictRetentionForExpressionAnnotations) val WRONG_ANNOTATION_TARGET by error { 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 c6c67f070fa..e90348becfc 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 @@ -83,6 +83,7 @@ import org.jetbrains.kotlin.psi.KtWhenCondition import org.jetbrains.kotlin.psi.KtWhenEntry import org.jetbrains.kotlin.psi.KtWhenExpression import org.jetbrains.kotlin.resolve.ForbiddenNamedArgumentsTarget +import org.jetbrains.kotlin.resolve.deprecation.Deprecation import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualCompatibility.Incompatible import org.jetbrains.kotlin.types.Variance @@ -221,6 +222,7 @@ object FirErrors { val DEPRECATED_SINCE_KOTLIN_WITHOUT_DEPRECATED by error0(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED) val DEPRECATED_SINCE_KOTLIN_WITH_DEPRECATED_LEVEL by error0(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED) val DEPRECATED_SINCE_KOTLIN_OUTSIDE_KOTLIN_SUBPACKAGE by error0(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED) + val OVERRIDE_DEPRECATION by warning2, Deprecation>(SourceElementPositioningStrategies.DECLARATION_NAME) val ANNOTATION_ON_SUPERCLASS by deprecationError0(ProhibitUseSiteTargetAnnotationsOnSuperTypes) val RESTRICTED_RETENTION_FOR_EXPRESSION_ANNOTATION by deprecationError0(RestrictRetentionForExpressionAnnotations) val WRONG_ANNOTATION_TARGET by error1() diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt index 42290a19124..691ae83aa39 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt @@ -169,6 +169,23 @@ object FirOverrideChecker : FirClassChecker() { } } + private fun FirCallableSymbol<*>.checkDeprecation( + reporter: DiagnosticReporter, + overriddenSymbols: List>, + context: CheckerContext + ) { + val ownDeprecation = this.deprecation + if (ownDeprecation == null || ownDeprecation.isNotEmpty()) return + for (overriddenSymbol in overriddenSymbols) { + val deprecationInfoFromOverridden = overriddenSymbol.deprecation ?: continue + val deprecationFromOverriddenSymbol = deprecationInfoFromOverridden.all + ?: deprecationInfoFromOverridden.bySpecificSite?.values?.firstOrNull() + ?: continue + reporter.reportOn(source, FirErrors.OVERRIDE_DEPRECATION, overriddenSymbol, deprecationFromOverriddenSymbol, context) + return + } + } + // See [OverrideResolver#isReturnTypeOkForOverride] private fun FirCallableSymbol<*>.checkReturnType( overriddenSymbols: List>, @@ -266,6 +283,8 @@ object FirOverrideChecker : FirClassChecker() { member.checkVisibility(containingClass, reporter, overriddenMemberSymbols, context) + member.checkDeprecation(reporter, overriddenMemberSymbols, context) + val restriction = member.checkReturnType( overriddenSymbols = overriddenMemberSymbols, typeCheckerState = typeCheckerState, 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 c3055d385a5..ab2057172b3 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 @@ -5,6 +5,8 @@ package org.jetbrains.kotlin.fir.analysis.diagnostics +import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages import org.jetbrains.kotlin.diagnostics.rendering.LanguageFeatureMessageRenderer import org.jetbrains.kotlin.diagnostics.rendering.Renderers.RENDER_POSITION_VARIANCE import org.jetbrains.kotlin.diagnostics.rendering.Renderers.STRING @@ -64,9 +66,9 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ARGUMENT_PASSED_T import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ARGUMENT_TYPE_MISMATCH import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ARRAY_EQUALITY_OPERATOR_CAN_BE_REPLACED_WITH_EQUALS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ASSIGNED_VALUE_IS_NEVER_READ -import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ASSIGNMENT_OPERATOR_SHOULD_RETURN_UNIT import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ASSIGNMENT_OPERATOR_SHOULD_RETURN_UNIT import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ASSIGNMENT_TYPE_MISMATCH import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ASSIGN_OPERATOR_AMBIGUITY import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.BACKING_FIELD_IN_INTERFACE @@ -318,6 +320,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.OTHER_ERROR import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.OUTER_CLASS_ARGUMENTS_REQUIRED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.OVERLOAD_RESOLUTION_AMBIGUITY import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.OVERRIDE_BY_INLINE +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.OVERRIDE_DEPRECATION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.OVERRIDING_FINAL_MEMBER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PACKAGE_CANNOT_BE_IMPORTED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED @@ -665,6 +668,12 @@ class FirDefaultErrorMessages { DEPRECATED_SINCE_KOTLIN_OUTSIDE_KOTLIN_SUBPACKAGE, "DeprecatedSinceKotlin annotation cannot be used outside 'kotlin' subpackages" ) + map.put( + OVERRIDE_DEPRECATION, + "This declaration overrides deprecated member but not marked as deprecated itself. Please add @Deprecated annotation or suppress", + TO_STRING, + TO_STRING + ) map.put(ANNOTATION_ON_SUPERCLASS, "Annotations on superclass are meaningless") map.put(WRONG_ANNOTATION_TARGET, "This annotation is not applicable to target ''{0}''", TO_STRING) map.put(INAPPLICABLE_TARGET_ON_PROPERTY, "''@{0}:'' annotations could be applied only to property declarations", TO_STRING) diff --git a/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_after.fir.kt b/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_after.fir.kt index 8a3a6a99a2a..b1a0c1a7b70 100644 --- a/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_after.fir.kt +++ b/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_after.fir.kt @@ -29,49 +29,49 @@ interface NotDeprecated { } open class WE : WarningDeprecated, ErrorDeprecated { - override fun f() { + override fun f() { } } open class WH : WarningDeprecated, HiddenDeprecated { - override fun f() { + override fun f() { } } open class EH : ErrorDeprecated, HiddenDeprecated { - override fun f() { + override fun f() { } } open class NW : WarningDeprecated, NotDeprecated { - override fun f() { + override fun f() { } } open class NE : ErrorDeprecated, NotDeprecated { - override fun f() { + override fun f() { } } open class NH : HiddenDeprecated, NotDeprecated { - override fun f() { + override fun f() { } } open class WEH: WarningDeprecated, ErrorDeprecated, HiddenDeprecated { - override fun f() { + override fun f() { } } open class NWEH: NotDeprecated, WarningDeprecated, ErrorDeprecated, HiddenDeprecated { - override fun f() { + override fun f() { } } @@ -89,12 +89,12 @@ interface E2: ErrorDeprecated interface W2: WarningDeprecated interface EW2: E2, W2 { - override fun f() { + override fun f() { } } interface HEW2: EW2, HiddenDeprecated { - override fun f() { + override fun f() { } } diff --git a/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_before.fir.kt b/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_before.fir.kt index 032fdd4cda6..3c9382f1b73 100644 --- a/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_before.fir.kt +++ b/compiler/testData/diagnostics/tests/deprecated/deprecatedInheritance_before.fir.kt @@ -29,49 +29,49 @@ interface NotDeprecated { } open class WE : WarningDeprecated, ErrorDeprecated { - override fun f() { + override fun f() { } } open class WH : WarningDeprecated, HiddenDeprecated { - override fun f() { + override fun f() { } } open class EH : ErrorDeprecated, HiddenDeprecated { - override fun f() { + override fun f() { } } open class NW : WarningDeprecated, NotDeprecated { - override fun f() { + override fun f() { } } open class NE : ErrorDeprecated, NotDeprecated { - override fun f() { + override fun f() { } } open class NH : HiddenDeprecated, NotDeprecated { - override fun f() { + override fun f() { } } open class WEH: WarningDeprecated, ErrorDeprecated, HiddenDeprecated { - override fun f() { + override fun f() { } } open class NWEH: NotDeprecated, WarningDeprecated, ErrorDeprecated, HiddenDeprecated { - override fun f() { + override fun f() { } } @@ -89,12 +89,12 @@ interface E2: ErrorDeprecated interface W2: WarningDeprecated interface EW2: E2, W2 { - override fun f() { + override fun f() { } } interface HEW2: EW2, HiddenDeprecated { - override fun f() { + override fun f() { } } diff --git a/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_after.fir.kt b/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_after.fir.kt index a131152f822..d9ea189ec99 100644 --- a/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_after.fir.kt +++ b/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_after.fir.kt @@ -32,48 +32,48 @@ open class SetterDeprecated { } class WD: WarningDeprecated() { - override var p: Int + override var p: Int get() = 3 set(value) {} } class ED: ErrorDeprecated() { - override var p: Int + override var p: Int get() = 3 set(value) { } } class GD: GetterDeprecated() { - override var p: Int + override var p: Int get() = 3 set(value) { } } class SD: SetterDeprecated() { - override var p: Int + override var p: Int get() = 3 set(value) { } } class SDH: SetterDeprecated(), HiddenDeprecated { - override var p: Int + override var p: Int get() = 3 set(value) { } } class EDH: ErrorDeprecated(), HiddenDeprecated { - override var p: Int + override var p: Int get() = 3 set(value) { } } class NED: ErrorDeprecated(), NoDeprecation { - override var p: Int + override var p: Int get() = 3 set(value) { } diff --git a/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_before.fir.kt b/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_before.fir.kt index 481c792c995..3bbd9590ae1 100644 --- a/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_before.fir.kt +++ b/compiler/testData/diagnostics/tests/deprecated/deprecatedPropertyInheritance_before.fir.kt @@ -32,48 +32,48 @@ open class SetterDeprecated { } class WD: WarningDeprecated() { - override var p: Int + override var p: Int get() = 3 set(value) {} } class ED: ErrorDeprecated() { - override var p: Int + override var p: Int get() = 3 set(value) { } } class GD: GetterDeprecated() { - override var p: Int + override var p: Int get() = 3 set(value) { } } class SD: SetterDeprecated() { - override var p: Int + override var p: Int get() = 3 set(value) { } } class SDH: SetterDeprecated(), HiddenDeprecated { - override var p: Int + override var p: Int get() = 3 set(value) { } } class EDH: ErrorDeprecated(), HiddenDeprecated { - override var p: Int + override var p: Int get() = 3 set(value) { } } class NED: ErrorDeprecated(), NoDeprecation { - override var p: Int + override var p: Int get() = 3 set(value) { } diff --git a/compiler/testData/diagnostics/tests/deprecated/javaDeprecated.fir.kt b/compiler/testData/diagnostics/tests/deprecated/javaDeprecated.fir.kt new file mode 100644 index 00000000000..c5a0270c50e --- /dev/null +++ b/compiler/testData/diagnostics/tests/deprecated/javaDeprecated.fir.kt @@ -0,0 +1,16 @@ +// !DIAGNOSTICS: -NO_VALUE_FOR_PARAMETER +// FILE: A.java + +@Deprecated +public class A { + @Deprecated + public String getFoo(String text) { + return text; + } +} + +// FILE: B.kt + +class B(private @property:Deprecated val foo: String) : A() { + override fun getFoo(text: String): String = super.getFoo(text + foo) +} diff --git a/compiler/testData/diagnostics/tests/deprecated/javaDeprecated.kt b/compiler/testData/diagnostics/tests/deprecated/javaDeprecated.kt index 9bc927af24d..e5f2771f5bc 100644 --- a/compiler/testData/diagnostics/tests/deprecated/javaDeprecated.kt +++ b/compiler/testData/diagnostics/tests/deprecated/javaDeprecated.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // !DIAGNOSTICS: -NO_VALUE_FOR_PARAMETER // FILE: A.java diff --git a/compiler/testData/diagnostics/tests/j+k/deprecations/forMixedOverride.fir.kt b/compiler/testData/diagnostics/tests/j+k/deprecations/forMixedOverride.fir.kt index 0ea05d21aa5..5e5d9fdb47a 100644 --- a/compiler/testData/diagnostics/tests/j+k/deprecations/forMixedOverride.fir.kt +++ b/compiler/testData/diagnostics/tests/j+k/deprecations/forMixedOverride.fir.kt @@ -16,7 +16,7 @@ interface WithDeprecation { } class A : J(), WithDeprecation { - override fun foo() {} + override fun foo() {} } fun main() { diff --git a/compiler/testData/diagnostics/tests/j+k/deprecations/forOverrides.fir.kt b/compiler/testData/diagnostics/tests/j+k/deprecations/forOverrides.fir.kt new file mode 100644 index 00000000000..35988819850 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/deprecations/forOverrides.fir.kt @@ -0,0 +1,23 @@ +// FILE: J.java +public interface J { + @Deprecated + public void foo(); + +} +// FILE: J2.java +public interface J2 extends J { + @Override + public void foo(); +} + +// FILE: main.kt + +interface A : J { + override fun foo() +} + +fun main(j: J, j2: J2, a: A) { + j.foo() + j2.foo() + a.foo() +} diff --git a/compiler/testData/diagnostics/tests/j+k/deprecations/forOverrides.kt b/compiler/testData/diagnostics/tests/j+k/deprecations/forOverrides.kt index 7cf76d9c189..022ec34e230 100644 --- a/compiler/testData/diagnostics/tests/j+k/deprecations/forOverrides.kt +++ b/compiler/testData/diagnostics/tests/j+k/deprecations/forOverrides.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // FILE: J.java public interface J { @Deprecated diff --git a/compiler/testData/diagnostics/tests/resolve/HiddenDeclarations.fir.kt b/compiler/testData/diagnostics/tests/resolve/HiddenDeclarations.fir.kt index fdd393fbd63..2e2f696be67 100644 --- a/compiler/testData/diagnostics/tests/resolve/HiddenDeclarations.fir.kt +++ b/compiler/testData/diagnostics/tests/resolve/HiddenDeclarations.fir.kt @@ -58,13 +58,13 @@ interface I { } class X : I { - override fun foo1() { + override fun foo1() { } } class B : A("") { // still can override it - override fun memberFun() { + override fun memberFun() { super.memberFun() // but cannot call super :) } } diff --git a/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt b/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt index ac8f5d7a539..351695f90d7 100644 --- a/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt +++ b/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.resolve.ForbiddenNamedArgumentsTarget +import org.jetbrains.kotlin.resolve.deprecation.Deprecation import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualCompatibility import org.jetbrains.kotlin.types.Variance import kotlin.reflect.KClass @@ -336,6 +337,7 @@ private object FirToKtConversionCreator { FqName::class, FirModuleData::class, ExpectActualCompatibility.Incompatible::class, + Deprecation::class, ) private val KType.kClass: KClass<*> 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 5bf7a64a3e2..0695baa4a35 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 @@ -761,6 +761,14 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.OVERRIDE_DEPRECATION) { firDiagnostic -> + OverrideDeprecationImpl( + firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firDiagnostic.b, + firDiagnostic as FirPsiDiagnostic, + token, + ) + } add(FirErrors.ANNOTATION_ON_SUPERCLASS.errorFactory) { firDiagnostic -> AnnotationOnSuperclassErrorImpl( firDiagnostic as FirPsiDiagnostic, 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 776d0e8f1e0..214ea92fc15 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 @@ -70,6 +70,7 @@ import org.jetbrains.kotlin.psi.KtWhenCondition import org.jetbrains.kotlin.psi.KtWhenEntry import org.jetbrains.kotlin.psi.KtWhenExpression import org.jetbrains.kotlin.resolve.ForbiddenNamedArgumentsTarget +import org.jetbrains.kotlin.resolve.deprecation.Deprecation import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualCompatibility.Incompatible import org.jetbrains.kotlin.types.Variance @@ -548,6 +549,12 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = DeprecatedSinceKotlinOutsideKotlinSubpackage::class } + abstract class OverrideDeprecation : KtFirDiagnostic() { + override val diagnosticClass get() = OverrideDeprecation::class + abstract val overridenSymbol: KtSymbol + abstract val deprecationInfo: Deprecation + } + abstract class AnnotationOnSuperclassError : KtFirDiagnostic() { override val diagnosticClass get() = AnnotationOnSuperclassError::class } 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 da59be53fc4..033e50fbdaa 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 @@ -72,6 +72,7 @@ import org.jetbrains.kotlin.psi.KtWhenCondition import org.jetbrains.kotlin.psi.KtWhenEntry import org.jetbrains.kotlin.psi.KtWhenExpression import org.jetbrains.kotlin.resolve.ForbiddenNamedArgumentsTarget +import org.jetbrains.kotlin.resolve.deprecation.Deprecation import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualCompatibility.Incompatible import org.jetbrains.kotlin.types.Variance @@ -876,6 +877,15 @@ internal class DeprecatedSinceKotlinOutsideKotlinSubpackageImpl( override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) } +internal class OverrideDeprecationImpl( + override val overridenSymbol: KtSymbol, + override val deprecationInfo: Deprecation, + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.OverrideDeprecation(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} + internal class AnnotationOnSuperclassErrorImpl( firDiagnostic: FirPsiDiagnostic, override val token: ValidityToken,