FIR2IR: support reading of isNewPlaceForBodyGeneration in lazy class
This commit is contained in:
@@ -153,7 +153,7 @@ object FirSessionFactory {
|
||||
it.packagePartProvider,
|
||||
projectEnvironment.getKotlinClassFinder(it.scope),
|
||||
projectEnvironment.getFirJavaFacade(this, moduleData, it.scope),
|
||||
defaultDeseializationOrigin = FirDeclarationOrigin.Precompiled
|
||||
defaultDeserializationOrigin = FirDeclarationOrigin.Precompiled
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
+5
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.caches.createCache
|
||||
import org.jetbrains.kotlin.fir.caches.firCachesFactory
|
||||
import org.jetbrains.kotlin.fir.caches.getValue
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
||||
import org.jetbrains.kotlin.fir.isNewPlaceForBodyGeneration
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals
|
||||
import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
|
||||
@@ -88,11 +89,14 @@ abstract class AbstractFirDeserializedSymbolProvider(
|
||||
// ------------------------ Abstract members ------------------------
|
||||
|
||||
protected abstract fun computePackagePartsInfos(packageFqName: FqName): List<PackagePartsCacheData>
|
||||
|
||||
protected abstract fun extractClassMetadata(
|
||||
classId: ClassId,
|
||||
parentContext: FirDeserializationContext? = null
|
||||
): ClassMetadataFindResult?
|
||||
|
||||
protected abstract fun isNewPlaceForBodyGeneration(classProto: ProtoBuf.Class): Boolean
|
||||
|
||||
// ------------------------ Deserialization methods ------------------------
|
||||
|
||||
sealed class ClassMetadataFindResult {
|
||||
@@ -151,6 +155,7 @@ abstract class AbstractFirDeserializedSymbolProvider(
|
||||
origin = defaultDeserializationOrigin,
|
||||
deserializeNestedClass = this::getClass,
|
||||
)
|
||||
symbol.fir.isNewPlaceForBodyGeneration = isNewPlaceForBodyGeneration(classProto)
|
||||
symbol to postProcessor
|
||||
}
|
||||
null -> null to null
|
||||
|
||||
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.*
|
||||
import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull
|
||||
import org.jetbrains.kotlin.fir.isNewPlaceForBodyGeneration
|
||||
import org.jetbrains.kotlin.fir.isSubstitutionOrIntersectionOverride
|
||||
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
|
||||
import org.jetbrains.kotlin.fir.symbols.Fir2IrClassSymbol
|
||||
@@ -207,6 +208,9 @@ class Fir2IrLazyClass(
|
||||
override val moduleName: String?
|
||||
get() = fir.moduleName
|
||||
|
||||
override val isNewPlaceForBodyGeneration: Boolean
|
||||
get() = fir.isNewPlaceForBodyGeneration == true
|
||||
|
||||
private fun FirNamedFunctionSymbol.isAbstractMethodOfAny(): Boolean {
|
||||
val fir = fir
|
||||
if (fir.modality != Modality.ABSTRACT) return false
|
||||
|
||||
+6
@@ -19,6 +19,9 @@ import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.load.kotlin.*
|
||||
import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader
|
||||
import org.jetbrains.kotlin.metadata.ProtoBuf
|
||||
import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf
|
||||
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmFlags
|
||||
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion
|
||||
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
@@ -135,6 +138,9 @@ class JvmClassFileBasedSymbolProvider(
|
||||
)
|
||||
}
|
||||
|
||||
override fun isNewPlaceForBodyGeneration(classProto: ProtoBuf.Class): Boolean =
|
||||
JvmFlags.ARE_INTERFACE_METHOD_BODIES_INSIDE.get(classProto.getExtension(JvmProtoBuf.jvmClassFlags))
|
||||
|
||||
override fun getPackage(fqName: FqName): FqName? =
|
||||
javaFacade.getPackage(fqName)
|
||||
|
||||
|
||||
@@ -39,6 +39,9 @@ private object ContainingClassKey : FirDeclarationDataKey()
|
||||
var FirCallableDeclaration.containingClassForStaticMemberAttr: ConeClassLikeLookupTag? by FirDeclarationDataRegistry.data(ContainingClassKey)
|
||||
var FirRegularClass.containingClassForLocalAttr: ConeClassLikeLookupTag? by FirDeclarationDataRegistry.data(ContainingClassKey)
|
||||
|
||||
private object IsNewPlaceForBodyGeneration : FirDeclarationDataKey()
|
||||
var FirRegularClass.isNewPlaceForBodyGeneration: Boolean? by FirDeclarationDataRegistry.data(IsNewPlaceForBodyGeneration)
|
||||
|
||||
val FirCallableDeclaration.isIntersectionOverride: Boolean get() = origin == FirDeclarationOrigin.IntersectionOverride
|
||||
val FirCallableDeclaration.isSubstitutionOverride: Boolean get() = origin == FirDeclarationOrigin.SubstitutionOverride
|
||||
val FirCallableDeclaration.isSubstitutionOrIntersectionOverride: Boolean get() = isSubstitutionOverride || isIntersectionOverride
|
||||
@@ -123,4 +126,4 @@ private object CorrespondingProperty : FirDeclarationDataKey()
|
||||
/**
|
||||
* The corresponding [FirProperty] if the current value parameter is a `val` or `var` declared inside the primary constructor.
|
||||
*/
|
||||
var FirValueParameter.correspondingProperty: FirProperty? by FirDeclarationDataRegistry.data(CorrespondingProperty)
|
||||
var FirValueParameter.correspondingProperty: FirProperty? by FirDeclarationDataRegistry.data(CorrespondingProperty)
|
||||
|
||||
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.ir.builders.irExprBody
|
||||
import org.jetbrains.kotlin.ir.builders.irGet
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyClass
|
||||
import org.jetbrains.kotlin.ir.declarations.lazy.IrMaybeDeserializedClass
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrClassReferenceImpl
|
||||
@@ -82,8 +83,11 @@ fun IrSimpleFunction.isCompiledToJvmDefault(jvmDefaultMode: JvmDefaultMode): Boo
|
||||
}
|
||||
if (origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB) return false
|
||||
if (hasJvmDefault()) return true
|
||||
(parentAsClass as? IrLazyClass)?.classProto?.let {
|
||||
return JvmProtoBufUtil.isNewPlaceForBodyGeneration(it)
|
||||
when (val klass = parentAsClass) {
|
||||
is IrLazyClass -> klass.classProto?.let {
|
||||
return JvmProtoBufUtil.isNewPlaceForBodyGeneration(it)
|
||||
}
|
||||
is IrMaybeDeserializedClass -> return klass.isNewPlaceForBodyGeneration
|
||||
}
|
||||
return jvmDefaultMode.forAllMethodsWithBody
|
||||
}
|
||||
|
||||
+2
@@ -9,4 +9,6 @@ import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
||||
|
||||
interface IrMaybeDeserializedClass : IrDeclaration {
|
||||
val moduleName: String?
|
||||
|
||||
val isNewPlaceForBodyGeneration: Boolean
|
||||
}
|
||||
Vendored
-2
@@ -1,5 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// FIR status: fail
|
||||
// FULL_JDK
|
||||
// MODULE: lib
|
||||
// !JVM_DEFAULT_MODE: disable
|
||||
|
||||
compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvm8/defaults/interop/likeSpecialization.kt
Vendored
-2
@@ -1,5 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// FIR status: AbstractMethodError: UnspecializedFromDerived.test(Ljava/lang/Object;)Ljava/lang/Object;
|
||||
// WITH_STDLIB
|
||||
// JVM_TARGET: 1.8
|
||||
// MODULE: lib
|
||||
|
||||
Vendored
-2
@@ -1,5 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// FIR status: AbstractMethodError: Method Foo.call()Ljava/util/List; is abstract
|
||||
// FULL_JDK
|
||||
// WITH_STDLIB
|
||||
|
||||
|
||||
Vendored
-2
@@ -1,5 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// FIR status: AbstractMethodError: Foo.call()Ljava/util/List;
|
||||
// FULL_JDK
|
||||
// WITH_STDLIB
|
||||
|
||||
|
||||
-2
@@ -1,5 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// FIR status: AbstractMethodError: KInterface.superCall()Ljava/util/List;
|
||||
// FULL_JDK
|
||||
// WITH_STDLIB
|
||||
// JVM_TARGET: 1.8
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// FIR status: fail: method nonOverride was found in class DerivedClass
|
||||
// FULL_JDK
|
||||
// JVM_TARGET: 1.8
|
||||
// WITH_STDLIB
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// FIR status: NCDFE: Foo$DefaultImpls
|
||||
// FULL_JDK
|
||||
// JVM_TARGET: 1.8
|
||||
// WITH_STDLIB
|
||||
|
||||
-2
@@ -1,7 +1,5 @@
|
||||
// CHECK_BYTECODE_LISTING
|
||||
// TARGET_BACKEND: JVM
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// FIR status: NCDFE: Foo$DefaultImpls
|
||||
// JVM_TARGET: 1.8
|
||||
// WITH_STDLIB
|
||||
// MODULE: lib
|
||||
|
||||
Reference in New Issue
Block a user