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 db5d4eff1be..7b45369a998 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 @@ -4110,12 +4110,6 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } - add(FirJvmErrors.JVM_DEFAULT_THROUGH_INHERITANCE) { firDiagnostic -> - JvmDefaultThroughInheritanceImpl( - firDiagnostic as KtPsiDiagnostic, - token, - ) - } add(FirJvmErrors.USAGE_OF_JVM_DEFAULT_THROUGH_SUPER_CALL) { firDiagnostic -> UsageOfJvmDefaultThroughSuperCallImpl( 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 31ab0d5fdd7..be1c442d15a 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 @@ -2859,10 +2859,6 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { abstract val annotation: String } - abstract class JvmDefaultThroughInheritance : KtFirDiagnostic() { - override val diagnosticClass get() = JvmDefaultThroughInheritance::class - } - abstract class UsageOfJvmDefaultThroughSuperCall : KtFirDiagnostic() { override val diagnosticClass get() = UsageOfJvmDefaultThroughSuperCall::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 8f87afb756d..74101bd66b0 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 @@ -3456,11 +3456,6 @@ internal class JvmDefaultInDeclarationImpl( override val token: ValidityToken, ) : KtFirDiagnostic.JvmDefaultInDeclaration(), KtAbstractFirDiagnostic -internal class JvmDefaultThroughInheritanceImpl( - override val firDiagnostic: KtPsiDiagnostic, - override val token: ValidityToken, -) : KtFirDiagnostic.JvmDefaultThroughInheritance(), KtAbstractFirDiagnostic - internal class UsageOfJvmDefaultThroughSuperCallImpl( override val firDiagnostic: KtPsiDiagnostic, override val token: ValidityToken, diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt index 21b602fdd9b..9de24a8e992 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt @@ -112,7 +112,6 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") { val JVM_DEFAULT_IN_DECLARATION by error(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) { parameter("annotation") } - val JVM_DEFAULT_THROUGH_INHERITANCE by error(PositioningStrategy.DECLARATION_SIGNATURE) val USAGE_OF_JVM_DEFAULT_THROUGH_SUPER_CALL by error() val NON_JVM_DEFAULT_OVERRIDES_JAVA_DEFAULT by warning(PositioningStrategy.DECLARATION_SIGNATURE) } diff --git a/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt b/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt index 032d4215f02..0bd7e625e1f 100644 --- a/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt +++ b/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt @@ -93,7 +93,6 @@ object FirJvmErrors { val JVM_DEFAULT_IN_JVM6_TARGET by error1() val JVM_DEFAULT_REQUIRED_FOR_OVERRIDE by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val JVM_DEFAULT_IN_DECLARATION by error1(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) - val JVM_DEFAULT_THROUGH_INHERITANCE by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val USAGE_OF_JVM_DEFAULT_THROUGH_SUPER_CALL by error0() val NON_JVM_DEFAULT_OVERRIDES_JAVA_DEFAULT by warning0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrorsDefaultMessages.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrorsDefaultMessages.kt index 1e0fe09ae18..5ab5586266b 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrorsDefaultMessages.kt @@ -36,7 +36,6 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_DEFAUL import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_DEFAULT_IN_JVM6_TARGET import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_DEFAULT_NOT_IN_INTERFACE import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_DEFAULT_REQUIRED_FOR_OVERRIDE -import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_DEFAULT_THROUGH_INHERITANCE import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_INLINE_WITHOUT_VALUE_CLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_PACKAGE_NAME_CANNOT_BE_EMPTY import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_PACKAGE_NAME_MUST_BE_VALID_NAME @@ -177,10 +176,6 @@ object FirJvmErrorsDefaultMessages : BaseDiagnosticRendererFactory() { ) map.put(JVM_DEFAULT_REQUIRED_FOR_OVERRIDE, "'@JvmDefault' is required for an override of a '@JvmDefault' member") map.put(JVM_DEFAULT_IN_DECLARATION, "Usage of ''@{0}'' is only allowed with -Xjvm-default option", STRING) - map.put( - JVM_DEFAULT_THROUGH_INHERITANCE, - "Inheritance from an interface with '@JvmDefault' members is only allowed with -Xjvm-default option" - ) map.put( USAGE_OF_JVM_DEFAULT_THROUGH_SUPER_CALL, "Super calls of '@JvmDefault' members are only allowed with -Xjvm-default option" diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmDefaultChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmDefaultChecker.kt index e5e26695cfa..87913d0d980 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmDefaultChecker.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmDefaultChecker.kt @@ -22,10 +22,8 @@ import org.jetbrains.kotlin.fir.declarations.utils.isInterface import org.jetbrains.kotlin.fir.declarations.utils.modality import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.java.jvmDefaultModeState -import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.scopes.getDirectOverriddenFunctions -import org.jetbrains.kotlin.fir.scopes.impl.FirClassUseSiteMemberScope import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirIntersectionCallableSymbol import org.jetbrains.kotlin.name.JvmNames.JVM_DEFAULT_CLASS_ID @@ -71,50 +69,9 @@ object FirJvmDefaultChecker : FirBasicDeclarationChecker() { } } - if (declaration is FirClass) { - val unsubstitutedScope = declaration.unsubstitutedScope(context) - val hasDeclaredJvmDefaults = unsubstitutedScope is FirClassUseSiteMemberScope && - unsubstitutedScope.directOverriddenFunctions.keys.any { - it.isCompiledToJvmDefault(jvmDefaultMode) - } - if (!hasDeclaredJvmDefaults && !declaration.checkJvmDefaultsInHierarchy(jvmDefaultMode, context)) { - reporter.reportOn(declaration.source, FirJvmErrors.JVM_DEFAULT_THROUGH_INHERITANCE, context) - } - } - checkNonJvmDefaultOverridesJavaDefault(defaultAnnotation, jvmDefaultMode, declaration, context, reporter) } - private fun FirDeclaration.checkJvmDefaultsInHierarchy(jvmDefaultMode: JvmDefaultMode, context: CheckerContext): Boolean { - if (jvmDefaultMode.isEnabled) return true - - if (this !is FirClass) return true - - val unsubstitutedScope = unsubstitutedScope(context) - if (unsubstitutedScope is FirClassUseSiteMemberScope) { - val directOverriddenFunctions = unsubstitutedScope.directOverriddenFunctions.flatMap { it.value }.toSet() - - for (key in unsubstitutedScope.overrideByBase.keys) { - if (directOverriddenFunctions.contains(key)) { - continue - } - - if (key.getOverriddenDeclarations().all { - it.modality == Modality.ABSTRACT || - !it.isCompiledToJvmDefaultWithProperMode(jvmDefaultMode) || - it.containingClass()?.toFirRegularClassSymbol(context.session)?.isInterface != true - } - ) { - continue - } - - return false - } - } - - return true - } - private fun checkNonJvmDefaultOverridesJavaDefault( defaultAnnotation: FirAnnotation?, jvmDefaultMode: JvmDefaultMode, diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/jvmDefaultInInheritance.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/jvmDefaultInInheritance.fir.kt index 6dfd972f415..35aeef20136 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/jvmDefaultInInheritance.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/jvmDefaultInInheritance.fir.kt @@ -6,12 +6,12 @@ interface A { } } -interface B : A { +interface B : A { } -open class Foo : B -open class Foo2 : B, A +open class Foo : B +open class Foo2 : B, A open class FooNoError : B { override fun test() { @@ -22,9 +22,9 @@ open class Foo2NoError : B, A { } } -class Bar : Foo() -class Bar2 : Foo(), A -class Bar3 : Foo(), B +class Bar : Foo() +class Bar2 : Foo(), A +class Bar3 : Foo(), B open class BarWithJvmDefault : B { @JvmDefault diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/superCall.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/superCall.fir.kt index 7886e3126e7..00676103d4a 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/superCall.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/superCall.fir.kt @@ -7,7 +7,7 @@ interface A { } // FILE: 2.kt -interface B : A { +interface B : A { } @@ -23,7 +23,7 @@ open class Foo : B { super.test() } } -open class Foo2 : B +open class Foo2 : B open class Bar : Foo2() { override fun test() { @@ -37,7 +37,7 @@ open class Bar2 : Bar() { } } -class ManySupers: Foo2(), B { +class ManySupers: Foo2(), B { fun foo() { super.test() super<B>.test() @@ -45,7 +45,7 @@ class ManySupers: Foo2(), B { } } -class ManySupers2: Foo2(), C { +class ManySupers2: Foo2(), C { fun foo() { super.test() super.test() @@ -53,7 +53,7 @@ class ManySupers2: Foo2(), C { } } -class ManySupers3: Bar2(), C { +class ManySupers3: Bar2(), C { fun foo() { super.test() super.test() diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/superCallAmbiguity.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/superCallAmbiguity.fir.kt index 6f2d7d8b24e..2587b5eb0a1 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/superCallAmbiguity.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/superCallAmbiguity.fir.kt @@ -10,9 +10,9 @@ interface B{ } } -interface AB: A, B +interface AB: A, B -interface BA: B, A +interface BA: B, A interface C : A, B { diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/superCallAmbiguity3.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/superCallAmbiguity3.fir.kt index 12f52930bc2..925c0d6707c 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/superCallAmbiguity3.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/superCallAmbiguity3.fir.kt @@ -9,8 +9,8 @@ interface A { interface B{ fun test() } -interface AB : A, B -interface BA : B, A +interface AB : A, B +interface BA : B, A class C : A, B { override fun test() { @@ -24,7 +24,7 @@ class D : B, A { } } -class E: B, A { +class E: B, A { fun foo() { super.test() }