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
This commit is contained in:
Alexander Udalov
2023-08-01 17:23:13 +02:00
committed by Space Team
parent 7fc3e60854
commit 954db5e70c
@@ -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 <D> FirBasedSymbol<out D>.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
}