FIR2IR: support reading of isNewPlaceForBodyGeneration in lazy class

This commit is contained in:
Mikhail Glukhikh
2021-11-25 16:28:19 +03:00
parent c652cd2245
commit 4a8f00bc7c
15 changed files with 28 additions and 20 deletions
@@ -153,7 +153,7 @@ object FirSessionFactory {
it.packagePartProvider,
projectEnvironment.getKotlinClassFinder(it.scope),
projectEnvironment.getFirJavaFacade(this, moduleData, it.scope),
defaultDeseializationOrigin = FirDeclarationOrigin.Precompiled
defaultDeserializationOrigin = FirDeclarationOrigin.Precompiled
)
}
@@ -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
@@ -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
}
@@ -9,4 +9,6 @@ import org.jetbrains.kotlin.ir.declarations.IrDeclaration
interface IrMaybeDeserializedClass : IrDeclaration {
val moduleName: String?
val isNewPlaceForBodyGeneration: Boolean
}
@@ -1,5 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// FIR status: fail
// FULL_JDK
// MODULE: lib
// !JVM_DEFAULT_MODE: disable
@@ -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
@@ -1,5 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// FIR status: AbstractMethodError: Method Foo.call()Ljava/util/List; is abstract
// FULL_JDK
// WITH_STDLIB
@@ -1,5 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// FIR status: AbstractMethodError: Foo.call()Ljava/util/List;
// FULL_JDK
// WITH_STDLIB
@@ -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
@@ -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