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.config.JvmDefaultMode
|
||||||
import org.jetbrains.kotlin.fir.FirAnnotationContainer
|
import org.jetbrains.kotlin.fir.FirAnnotationContainer
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
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.FirDeclaration
|
||||||
import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId
|
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.FirBasedSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||||
import org.jetbrains.kotlin.name.StandardClassIds
|
import org.jetbrains.kotlin.name.StandardClassIds
|
||||||
|
|
||||||
fun <D> FirBasedSymbol<out D>.isCompiledToJvmDefault(
|
fun <D> FirBasedSymbol<out D>.isCompiledToJvmDefault(
|
||||||
session: FirSession,
|
session: FirSession,
|
||||||
jvmDefaultMode: JvmDefaultMode
|
jvmDefaultMode: JvmDefaultMode,
|
||||||
): Boolean where D : FirAnnotationContainer, D : FirDeclaration {
|
): Boolean where D : FirAnnotationContainer, D : FirDeclaration {
|
||||||
if (getAnnotationByClassId(StandardClassIds.Annotations.JvmDefault, session) != null) return true
|
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