From 954db5e70ca9e30f7a504a31d466c2f8cef4b4ec Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 1 Aug 2023 17:23:13 +0200 Subject: [PATCH] K2: fix reporting of INTERFACE_CANT_CALL_DEFAULT_METHOD_VIA_SUPER Also detect deserialized Kotlin interfaces which have method bodies in the interface (as opposed to DefaultImpls), as K1's `isCompiledToJvmDefault` does. No test added because this fixes an existing test `CompileKotlinAgainstCustomBinariesTest.testJvmDefaultNonDefaultInheritanceSuperCall` for K2 (set LV to 2.0 there to check). #KT-60779 Fixed --- .../jvm/checkers/FirJvmAnnotationHelper.kt | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/FirJvmAnnotationHelper.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/FirJvmAnnotationHelper.kt index 1a490860edf..c27f309a036 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/FirJvmAnnotationHelper.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/FirJvmAnnotationHelper.kt @@ -8,16 +8,25 @@ package org.jetbrains.kotlin.fir.analysis.jvm.checkers import org.jetbrains.kotlin.config.JvmDefaultMode import org.jetbrains.kotlin.fir.FirAnnotationContainer import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId +import org.jetbrains.kotlin.fir.isNewPlaceForBodyGeneration import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol +import org.jetbrains.kotlin.fir.symbols.SymbolInternals +import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.name.StandardClassIds fun FirBasedSymbol.isCompiledToJvmDefault( session: FirSession, - jvmDefaultMode: JvmDefaultMode + jvmDefaultMode: JvmDefaultMode, ): Boolean where D : FirAnnotationContainer, D : FirDeclaration { if (getAnnotationByClassId(StandardClassIds.Annotations.JvmDefault, session) != null) return true - return jvmDefaultMode.forAllMethodsWithBody -} + val container = getContainingClassSymbol(session) + if (container !is FirRegularClassSymbol || container.origin.fromSource) return jvmDefaultMode.forAllMethodsWithBody + + // Opt-in is fine here because this flag is only possible for deserialized declarations, and it's set during deserialization. + @OptIn(SymbolInternals::class) + return container.fir.isNewPlaceForBodyGeneration == true +}