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:
committed by
Space Team
parent
7fc3e60854
commit
954db5e70c
+12
-3
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user