From 4a8f00bc7cc1ade8787cb1324414b8da8426373e Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 25 Nov 2021 16:28:19 +0300 Subject: [PATCH] FIR2IR: support reading of isNewPlaceForBodyGeneration in lazy class --- .../org/jetbrains/kotlin/fir/session/FirSessionFactory.kt | 2 +- .../AbstractFirDeserializedSymbolProvider.kt | 5 +++++ .../src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt | 4 ++++ .../deserialization/JvmClassFileBasedSymbolProvider.kt | 6 ++++++ .../fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt | 5 ++++- .../src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrUtils.kt | 8 ++++++-- .../ir/declarations/lazy/IrMaybeDeserializedClass.kt | 2 ++ .../jvm8/defaults/interop/likeMemberClash.kt | 2 -- .../jvm8/defaults/interop/likeSpecialization.kt | 2 -- .../jvm8/defaults/interop/newAndOldSchemes.kt | 2 -- .../jvm8/defaults/interop/newAndOldSchemes3.kt | 2 -- .../jvm8/defaults/interop/newSchemeWithJvmDefault.kt | 2 -- .../box/jvm8/defaults/nonDefaultInheritance/simple.kt | 2 -- .../box/jvm8/defaults/nonDefaultInheritance/simple2.kt | 2 -- .../jvm8/defaults/nonDefaultInheritance/specialization.kt | 2 -- 15 files changed, 28 insertions(+), 20 deletions(-) diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt index f2555edce33..28e88ff39d2 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt @@ -153,7 +153,7 @@ object FirSessionFactory { it.packagePartProvider, projectEnvironment.getKotlinClassFinder(it.scope), projectEnvironment.getFirJavaFacade(this, moduleData, it.scope), - defaultDeseializationOrigin = FirDeclarationOrigin.Precompiled + defaultDeserializationOrigin = FirDeclarationOrigin.Precompiled ) } diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt index 7b657118777..f16442ad685 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/AbstractFirDeserializedSymbolProvider.kt @@ -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 + 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 diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt index 4495a2c4c0f..d321440388f 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt @@ -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 diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmClassFileBasedSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmClassFileBasedSymbolProvider.kt index 51c16db65fd..ac58c0af159 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmClassFileBasedSymbolProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/JvmClassFileBasedSymbolProvider.kt @@ -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) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt index 82ed2b4791f..4205c39e287 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt @@ -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) \ No newline at end of file +var FirValueParameter.correspondingProperty: FirProperty? by FirDeclarationDataRegistry.data(CorrespondingProperty) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrUtils.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrUtils.kt index 83d8ba681b7..8fc7091f770 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrUtils.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrUtils.kt @@ -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 } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrMaybeDeserializedClass.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrMaybeDeserializedClass.kt index 6ce2e70899a..d97b3a80a58 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrMaybeDeserializedClass.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrMaybeDeserializedClass.kt @@ -9,4 +9,6 @@ import org.jetbrains.kotlin.ir.declarations.IrDeclaration interface IrMaybeDeserializedClass : IrDeclaration { val moduleName: String? + + val isNewPlaceForBodyGeneration: Boolean } \ No newline at end of file diff --git a/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvm8/defaults/interop/likeMemberClash.kt b/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvm8/defaults/interop/likeMemberClash.kt index 564806d9991..d58bd9a6287 100644 --- a/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvm8/defaults/interop/likeMemberClash.kt +++ b/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvm8/defaults/interop/likeMemberClash.kt @@ -1,5 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR -// FIR status: fail // FULL_JDK // MODULE: lib // !JVM_DEFAULT_MODE: disable diff --git a/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvm8/defaults/interop/likeSpecialization.kt b/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvm8/defaults/interop/likeSpecialization.kt index d1efef4ab84..1ea3cf339ab 100644 --- a/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvm8/defaults/interop/likeSpecialization.kt +++ b/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvm8/defaults/interop/likeSpecialization.kt @@ -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 diff --git a/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvm8/defaults/interop/newAndOldSchemes.kt b/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvm8/defaults/interop/newAndOldSchemes.kt index fe804657387..cc17071aca8 100644 --- a/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvm8/defaults/interop/newAndOldSchemes.kt +++ b/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvm8/defaults/interop/newAndOldSchemes.kt @@ -1,5 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR -// FIR status: AbstractMethodError: Method Foo.call()Ljava/util/List; is abstract // FULL_JDK // WITH_STDLIB diff --git a/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvm8/defaults/interop/newAndOldSchemes3.kt b/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvm8/defaults/interop/newAndOldSchemes3.kt index a39a1588dc8..d798f1ab9e7 100644 --- a/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvm8/defaults/interop/newAndOldSchemes3.kt +++ b/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvm8/defaults/interop/newAndOldSchemes3.kt @@ -1,5 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR -// FIR status: AbstractMethodError: Foo.call()Ljava/util/List; // FULL_JDK // WITH_STDLIB diff --git a/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvm8/defaults/interop/newSchemeWithJvmDefault.kt b/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvm8/defaults/interop/newSchemeWithJvmDefault.kt index d8e9418bda3..4db2348e588 100644 --- a/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvm8/defaults/interop/newSchemeWithJvmDefault.kt +++ b/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvm8/defaults/interop/newSchemeWithJvmDefault.kt @@ -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 diff --git a/compiler/testData/codegen/box/jvm8/defaults/nonDefaultInheritance/simple.kt b/compiler/testData/codegen/box/jvm8/defaults/nonDefaultInheritance/simple.kt index 8856847ba06..4171625d2b8 100644 --- a/compiler/testData/codegen/box/jvm8/defaults/nonDefaultInheritance/simple.kt +++ b/compiler/testData/codegen/box/jvm8/defaults/nonDefaultInheritance/simple.kt @@ -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 diff --git a/compiler/testData/codegen/box/jvm8/defaults/nonDefaultInheritance/simple2.kt b/compiler/testData/codegen/box/jvm8/defaults/nonDefaultInheritance/simple2.kt index ff185c58120..e017df524a5 100644 --- a/compiler/testData/codegen/box/jvm8/defaults/nonDefaultInheritance/simple2.kt +++ b/compiler/testData/codegen/box/jvm8/defaults/nonDefaultInheritance/simple2.kt @@ -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 diff --git a/compiler/testData/codegen/box/jvm8/defaults/nonDefaultInheritance/specialization.kt b/compiler/testData/codegen/box/jvm8/defaults/nonDefaultInheritance/specialization.kt index 26b44e3e00c..d1e5751a8e6 100644 --- a/compiler/testData/codegen/box/jvm8/defaults/nonDefaultInheritance/specialization.kt +++ b/compiler/testData/codegen/box/jvm8/defaults/nonDefaultInheritance/specialization.kt @@ -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