JVM: reduce usages of GenerationState in favor of JvmBackendConfig

To help in decoupling JVM IR from the old JVM backend.
This commit is contained in:
Alexander Udalov
2023-09-16 23:49:47 +02:00
committed by Space Team
parent c3010dd599
commit 72b5123fc8
55 changed files with 106 additions and 104 deletions
@@ -295,7 +295,7 @@ public class ClosureCodegen extends MemberCodegen<KtElement> {
boolean publicAbi = InlineUtil.isInPublicInlineScope(frontendFunDescriptor); boolean publicAbi = InlineUtil.isInPublicInlineScope(frontendFunDescriptor);
WriteAnnotationUtilKt.writeKotlinMetadata(v, state, KotlinClassHeader.Kind.SYNTHETIC_CLASS, publicAbi, 0, av -> { WriteAnnotationUtilKt.writeKotlinMetadata(v, state.getConfig(), KotlinClassHeader.Kind.SYNTHETIC_CLASS, publicAbi, 0, av -> {
writeAnnotationData(av, serializer, functionProto); writeAnnotationData(av, serializer, functionProto);
return Unit.INSTANCE; return Unit.INSTANCE;
}); });
@@ -79,7 +79,7 @@ class CodeFragmentCodegen private constructor(
} }
override fun generateKotlinMetadataAnnotation() { override fun generateKotlinMetadataAnnotation() {
writeSyntheticClassMetadata(v, state, false) writeSyntheticClassMetadata(v, state.config, false)
} }
private fun genConstructor() { private fun genConstructor() {
@@ -43,7 +43,6 @@ import org.jetbrains.kotlin.codegen.when.SwitchCodegen;
import org.jetbrains.kotlin.codegen.when.SwitchCodegenProvider; import org.jetbrains.kotlin.codegen.when.SwitchCodegenProvider;
import org.jetbrains.kotlin.config.ApiVersion; import org.jetbrains.kotlin.config.ApiVersion;
import org.jetbrains.kotlin.config.JVMAssertionsMode; import org.jetbrains.kotlin.config.JVMAssertionsMode;
import org.jetbrains.kotlin.config.JVMConfigurationKeys;
import org.jetbrains.kotlin.config.LanguageFeature; import org.jetbrains.kotlin.config.LanguageFeature;
import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor; import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor;
@@ -2662,7 +2661,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
CallableMethod method = typeMapper.mapToCallableMethod(fd, superCall, null, resolvedCall); CallableMethod method = typeMapper.mapToCallableMethod(fd, superCall, null, resolvedCall);
if (method.getAsmMethod().getName().contains("-") && if (method.getAsmMethod().getName().contains("-") &&
!state.getConfiguration().getBoolean(JVMConfigurationKeys.USE_OLD_INLINE_CLASSES_MANGLING_SCHEME) !state.getConfig().getUseOldManglingSchemeForFunctionsWithInlineClassesInSignatures()
) { ) {
Boolean classFileContainsMethod = Boolean classFileContainsMethod =
InlineClassesCodegenUtilKt.classFileContainsMethod(fd, state, method.getAsmMethod()); InlineClassesCodegenUtilKt.classFileContainsMethod(fd, state, method.getAsmMethod());
@@ -2890,7 +2889,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
JvmMethodSignature signature = typeMapper.mapSignatureWithGeneric(functionDescriptor, sourceCompiler.getContext().getContextKind()); JvmMethodSignature signature = typeMapper.mapSignatureWithGeneric(functionDescriptor, sourceCompiler.getContext().getContextKind());
if (signature.getAsmMethod().getName().contains("-") && if (signature.getAsmMethod().getName().contains("-") &&
!state.getConfiguration().getBoolean(JVMConfigurationKeys.USE_OLD_INLINE_CLASSES_MANGLING_SCHEME) !state.getConfig().getUseOldManglingSchemeForFunctionsWithInlineClassesInSignatures()
) { ) {
Boolean classFileContainsMethod = Boolean classFileContainsMethod =
InlineClassesCodegenUtilKt.classFileContainsMethod(functionDescriptor, state, signature.getAsmMethod()); InlineClassesCodegenUtilKt.classFileContainsMethod(functionDescriptor, state, signature.getAsmMethod());
@@ -309,7 +309,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
boolean publicAbi = InlineUtil.isInPublicInlineScope(descriptor); boolean publicAbi = InlineUtil.isInPublicInlineScope(descriptor);
WriteAnnotationUtilKt.writeKotlinMetadata(v, state, KotlinClassHeader.Kind.CLASS, publicAbi, 0, av -> { WriteAnnotationUtilKt.writeKotlinMetadata(v, state.getConfig(), KotlinClassHeader.Kind.CLASS, publicAbi, 0, av -> {
writeAnnotationData(av, serializer, classProto); writeAnnotationData(av, serializer, classProto);
return Unit.INSTANCE; return Unit.INSTANCE;
}); });
@@ -140,7 +140,7 @@ class InterfaceImplBodyCodegen(
override fun generateKotlinMetadataAnnotation() { override fun generateKotlinMetadataAnnotation() {
(v as InterfaceImplClassBuilder).stopCounting() (v as InterfaceImplClassBuilder).stopCounting()
writeSyntheticClassMetadata(v, state, false) writeSyntheticClassMetadata(v, state.config, false)
} }
override fun done() { override fun done() {
@@ -390,7 +390,7 @@ class MultifileClassCodegenImpl(
facadeClassType: Type, facadeClassType: Type,
kotlinPackageFqName: FqName kotlinPackageFqName: FqName
) { ) {
writeKotlinMetadata(classBuilder, state, KotlinClassHeader.Kind.MULTIFILE_CLASS, false, flags) { av -> writeKotlinMetadata(classBuilder, state.config, KotlinClassHeader.Kind.MULTIFILE_CLASS, false, flags) { av ->
val arv = av.visitArray(JvmAnnotationNames.METADATA_DATA_FIELD_NAME) val arv = av.visitArray(JvmAnnotationNames.METADATA_DATA_FIELD_NAME)
for (internalName in partInternalNames) { for (internalName in partInternalNames) {
arv.visit(null, internalName) arv.visit(null, internalName)
@@ -96,7 +96,7 @@ class MultifileClassPartCodegen(
val extraFlags = if (shouldGeneratePartHierarchy) JvmAnnotationNames.METADATA_MULTIFILE_PARTS_INHERIT_FLAG else 0 val extraFlags = if (shouldGeneratePartHierarchy) JvmAnnotationNames.METADATA_MULTIFILE_PARTS_INHERIT_FLAG else 0
writeKotlinMetadata(v, state, KotlinClassHeader.Kind.MULTIFILE_CLASS_PART, false, extraFlags) { av -> writeKotlinMetadata(v, state.config, KotlinClassHeader.Kind.MULTIFILE_CLASS_PART, false, extraFlags) { av ->
DescriptorAsmUtil.writeAnnotationData(av, serializer, packageProto) DescriptorAsmUtil.writeAnnotationData(av, serializer, packageProto)
av.visit(JvmAnnotationNames.METADATA_MULTIFILE_CLASS_NAME_FIELD_NAME, facadeClassType.internalName) av.visit(JvmAnnotationNames.METADATA_MULTIFILE_CLASS_NAME_FIELD_NAME, facadeClassType.internalName)
@@ -107,7 +107,7 @@ public class PackagePartCodegen extends MemberCodegen<KtFile> {
protected void generateKotlinMetadataAnnotation() { protected void generateKotlinMetadataAnnotation() {
Pair<DescriptorSerializer, ProtoBuf.Package> serializedPart = serializePackagePartMembers(this, packagePartType); Pair<DescriptorSerializer, ProtoBuf.Package> serializedPart = serializePackagePartMembers(this, packagePartType);
WriteAnnotationUtilKt.writeKotlinMetadata(v, state, KotlinClassHeader.Kind.FILE_FACADE, false, 0, av -> { WriteAnnotationUtilKt.writeKotlinMetadata(v, state.getConfig(), KotlinClassHeader.Kind.FILE_FACADE, false, 0, av -> {
writeAnnotationData(av, serializedPart.getFirst(), serializedPart.getSecond()); writeAnnotationData(av, serializedPart.getFirst(), serializedPart.getSecond());
FqName kotlinPackageFqName = element.getPackageFqName(); FqName kotlinPackageFqName = element.getPackageFqName();
@@ -210,7 +210,7 @@ class PropertyReferenceCodegen(
} }
override fun generateKotlinMetadataAnnotation() { override fun generateKotlinMetadataAnnotation() {
writeSyntheticClassMetadata(v, state, InlineUtil.isInPublicInlineScope(classDescriptor)) writeSyntheticClassMetadata(v, state.config, InlineUtil.isInPublicInlineScope(classDescriptor))
} }
fun putInstanceOnStack(receiverValue: StackValue?): StackValue { fun putInstanceOnStack(receiverValue: StackValue?): StackValue {
@@ -138,7 +138,7 @@ public class SamWrapperCodegen {
); );
cv.visitSource(file.getName(), null); cv.visitSource(file.getName(), null);
WriteAnnotationUtilKt.writeSyntheticClassMetadata(cv, state, isInsideInline); WriteAnnotationUtilKt.writeSyntheticClassMetadata(cv, state.getConfig(), isInsideInline);
generateInnerClassInformation(file, asmType, cv); generateInnerClassInformation(file, asmType, cv);
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.codegen.context.ScriptContext
import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.METHOD_FOR_FUNCTION import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.METHOD_FOR_FUNCTION
import org.jetbrains.kotlin.codegen.serialization.JvmSerializerExtension import org.jetbrains.kotlin.codegen.serialization.JvmSerializerExtension
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ScriptDescriptor import org.jetbrains.kotlin.descriptors.ScriptDescriptor
import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.load.java.JvmAnnotationNames
@@ -71,10 +70,10 @@ class ScriptCodegen private constructor(
override fun generateKotlinMetadataAnnotation() { override fun generateKotlinMetadataAnnotation() {
val serializer = DescriptorSerializer.create( val serializer = DescriptorSerializer.create(
scriptDescriptor, JvmSerializerExtension(v.serializationBindings, state), null, scriptDescriptor, JvmSerializerExtension(v.serializationBindings, state), null,
state.configuration.languageVersionSettings, state.config.languageVersionSettings,
) )
val classProto = serializer.classProto(scriptDescriptor).build() val classProto = serializer.classProto(scriptDescriptor).build()
writeKotlinMetadata(v, state, KotlinClassHeader.Kind.CLASS, false, JvmAnnotationNames.METADATA_SCRIPT_FLAG) { av -> writeKotlinMetadata(v, state.config, KotlinClassHeader.Kind.CLASS, false, JvmAnnotationNames.METADATA_SCRIPT_FLAG) { av ->
DescriptorAsmUtil.writeAnnotationData(av, serializer, classProto) DescriptorAsmUtil.writeAnnotationData(av, serializer, classProto)
} }
} }
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.codegen
import org.jetbrains.kotlin.backend.common.output.OutputFile import org.jetbrains.kotlin.backend.common.output.OutputFile
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies
import org.jetbrains.kotlin.load.kotlin.loadModuleMapping import org.jetbrains.kotlin.load.kotlin.loadModuleMapping
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
@@ -51,7 +50,7 @@ fun JvmModuleProtoBuf.Module.Builder.addDataFromCompiledModule(
}.orEmpty() }.orEmpty()
val serializer = DescriptorSerializer.createTopLevel( val serializer = DescriptorSerializer.createTopLevel(
JvmOptionalAnnotationSerializerExtension(stringTable), state.configuration.languageVersionSettings, JvmOptionalAnnotationSerializerExtension(stringTable), state.config.languageVersionSettings,
) )
for (descriptor in optionalAnnotationClassDescriptors) { for (descriptor in optionalAnnotationClassDescriptors) {
addOptionalAnnotationClass(serializer.classProto(descriptor)) addOptionalAnnotationClass(serializer.classProto(descriptor))
@@ -674,7 +674,7 @@ private fun generateLambdaForRunSuspend(
visitEnd() visitEnd()
} }
writeSyntheticClassMetadata(lambdaBuilder, state, false) writeSyntheticClassMetadata(lambdaBuilder, state.config, false)
lambdaBuilder.done(state.config.generateSmapCopyToAnnotation) lambdaBuilder.done(state.config.generateSmapCopyToAnnotation)
return lambdaBuilder.thisName return lambdaBuilder.thisName
@@ -701,7 +701,7 @@ class CoroutineCodegenForNamedFunction private constructor(
override fun generateKotlinMetadataAnnotation() { override fun generateKotlinMetadataAnnotation() {
val publicAbi = InlineUtil.isInPublicInlineScope(classDescriptor) val publicAbi = InlineUtil.isInPublicInlineScope(classDescriptor)
writeKotlinMetadata(v, state, KotlinClassHeader.Kind.SYNTHETIC_CLASS, publicAbi, 0) { av -> writeKotlinMetadata(v, state.config, KotlinClassHeader.Kind.SYNTHETIC_CLASS, publicAbi, 0) { av ->
val serializer = DescriptorSerializer.createForLambda( val serializer = DescriptorSerializer.createForLambda(
JvmSerializerExtension(v.serializationBindings, state), state.languageVersionSettings, JvmSerializerExtension(v.serializationBindings, state), state.languageVersionSettings,
) )
@@ -242,7 +242,7 @@ class AnonymousObjectTransformer(
val publicAbi = inliningContext.callSiteInfo.isInPublicInlineScope val publicAbi = inliningContext.callSiteInfo.isInPublicInlineScope
writeKotlinMetadata( writeKotlinMetadata(
classBuilder, classBuilder,
state, state.config,
header.kind, header.kind,
publicAbi, publicAbi,
header.extraInt and JvmAnnotationNames.METADATA_PUBLIC_ABI_FLAG.inv() header.extraInt and JvmAnnotationNames.METADATA_PUBLIC_ABI_FLAG.inv()
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.codegen.inline
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
import org.jetbrains.kotlin.codegen.* import org.jetbrains.kotlin.codegen.*
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.codegen.state.JvmBackendConfig
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor
@@ -27,9 +28,12 @@ import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
import org.jetbrains.org.objectweb.asm.tree.FieldInsnNode import org.jetbrains.org.objectweb.asm.tree.FieldInsnNode
class PsiInlineIntrinsicsSupport( class PsiInlineIntrinsicsSupport(
override val state: GenerationState, private val state: GenerationState,
private val reportErrorsOn: KtElement, private val reportErrorsOn: KtElement,
) : ReifiedTypeInliner.IntrinsicsSupport<KotlinType> { ) : ReifiedTypeInliner.IntrinsicsSupport<KotlinType> {
override val config: JvmBackendConfig
get() = state.config
override fun putClassInstance(v: InstructionAdapter, type: KotlinType) { override fun putClassInstance(v: InstructionAdapter, type: KotlinType) {
DescriptorAsmUtil.putJavaLangClassInstance(v, state.typeMapper.mapType(type), type, state.typeMapper) DescriptorAsmUtil.putJavaLangClassInstance(v, state.typeMapper.mapType(type), type, state.typeMapper)
} }
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.codegen.context.*
import org.jetbrains.kotlin.codegen.coroutines.getOrCreateJvmSuspendFunctionView import org.jetbrains.kotlin.codegen.coroutines.getOrCreateJvmSuspendFunctionView
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.incremental.KotlinLookupLocation import org.jetbrains.kotlin.incremental.KotlinLookupLocation
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
@@ -223,7 +222,7 @@ class PsiSourceCompilerForInline(
// This is all available in the `Callable` passed to `PsiInlineCodegen.genCallInner`, but it's not forwarded through the inliner... // This is all available in the `Callable` passed to `PsiInlineCodegen.genCallInner`, but it's not forwarded through the inliner...
var result = state.typeMapper.mapDefaultMethod(functionDescriptor, context.contextKind) var result = state.typeMapper.mapDefaultMethod(functionDescriptor, context.contextKind)
if (result.name.contains("-") && if (result.name.contains("-") &&
!state.configuration.getBoolean(JVMConfigurationKeys.USE_OLD_INLINE_CLASSES_MANGLING_SCHEME) && !state.config.useOldManglingSchemeForFunctionsWithInlineClassesInSignatures &&
classFileContainsMethod(functionDescriptor, state, result) == false classFileContainsMethod(functionDescriptor, state, result) == false
) { ) {
state.typeMapper.useOldManglingRulesForFunctionAcceptingInlineClass = true state.typeMapper.useOldManglingRulesForFunctionAcceptingInlineClass = true
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.codegen.generateIsCheck
import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicMethods import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicMethods
import org.jetbrains.kotlin.codegen.optimization.common.intConstant import org.jetbrains.kotlin.codegen.optimization.common.intConstant
import org.jetbrains.kotlin.codegen.signature.BothSignatureWriter import org.jetbrains.kotlin.codegen.signature.BothSignatureWriter
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.JvmBackendConfig
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.jvm.AsmTypes
@@ -56,7 +56,7 @@ class ReifiedTypeInliner<KT : KotlinTypeMarker>(
interface IntrinsicsSupport<KT : KotlinTypeMarker> { interface IntrinsicsSupport<KT : KotlinTypeMarker> {
val state: GenerationState val config: JvmBackendConfig
fun putClassInstance(v: InstructionAdapter, type: KT) fun putClassInstance(v: InstructionAdapter, type: KT)
@@ -84,7 +84,7 @@ private fun <KT : KotlinTypeMarker> TypeSystemCommonBackendContext.generateTypeO
intrinsicsSupport.reportSuspendTypeUnsupported() intrinsicsSupport.reportSuspendTypeUnsupported()
} }
if (intrinsicsSupport.state.config.stableTypeOf) { if (intrinsicsSupport.config.stableTypeOf) {
if (intrinsicsSupport.isMutableCollectionType(type)) { if (intrinsicsSupport.isMutableCollectionType(type)) {
v.invokestatic(REFLECTION, "mutableCollectionType", Type.getMethodDescriptor(K_TYPE, K_TYPE), false) v.invokestatic(REFLECTION, "mutableCollectionType", Type.getMethodDescriptor(K_TYPE, K_TYPE), false)
} else if (type.typeConstructor().isNothingConstructor()) { } else if (type.typeConstructor().isNothingConstructor()) {
@@ -58,7 +58,7 @@ public class MappingClassesForWhenByEnumCodegen {
generateInitialization(cb, mappings); generateInitialization(cb, mappings);
boolean publicAbi = mappings.stream().anyMatch(WhenByEnumsMapping::isPublicAbi); boolean publicAbi = mappings.stream().anyMatch(WhenByEnumsMapping::isPublicAbi);
WriteAnnotationUtilKt.writeSyntheticClassMetadata(cb, state, publicAbi); WriteAnnotationUtilKt.writeSyntheticClassMetadata(cb, state.getConfig(), publicAbi);
cb.done(state.getConfig().getGenerateSmapCopyToAnnotation()); cb.done(state.getConfig().getGenerateSmapCopyToAnnotation());
} }
@@ -16,7 +16,7 @@
package org.jetbrains.kotlin.codegen package org.jetbrains.kotlin.codegen
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.JvmBackendConfig
import org.jetbrains.kotlin.config.JvmAnalysisFlags import org.jetbrains.kotlin.config.JvmAnalysisFlags
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.load.java.JvmAnnotationNames
@@ -26,19 +26,19 @@ import org.jetbrains.org.objectweb.asm.AnnotationVisitor
fun writeKotlinMetadata( fun writeKotlinMetadata(
cb: ClassBuilder, cb: ClassBuilder,
state: GenerationState, config: JvmBackendConfig,
kind: KotlinClassHeader.Kind, kind: KotlinClassHeader.Kind,
publicAbi: Boolean, publicAbi: Boolean,
extraFlags: Int, extraFlags: Int,
action: (AnnotationVisitor) -> Unit action: (AnnotationVisitor) -> Unit
) { ) {
val av = cb.newAnnotation(JvmAnnotationNames.METADATA_DESC, true) val av = cb.newAnnotation(JvmAnnotationNames.METADATA_DESC, true)
av.visit(JvmAnnotationNames.METADATA_VERSION_FIELD_NAME, state.config.metadataVersion.toArray()) av.visit(JvmAnnotationNames.METADATA_VERSION_FIELD_NAME, config.metadataVersion.toArray())
if (!state.config.metadataVersion.isAtLeast(1, 5, 0)) { if (!config.metadataVersion.isAtLeast(1, 5, 0)) {
av.visit("bv", JvmBytecodeBinaryVersion.INSTANCE.toArray()) av.visit("bv", JvmBytecodeBinaryVersion.INSTANCE.toArray())
} }
av.visit(JvmAnnotationNames.KIND_FIELD_NAME, kind.id) av.visit(JvmAnnotationNames.KIND_FIELD_NAME, kind.id)
var flags = extraFlags or generateLanguageVersionSettingsBasedMetadataFlags(state.languageVersionSettings) var flags = extraFlags or generateLanguageVersionSettingsBasedMetadataFlags(config.languageVersionSettings)
if (publicAbi) { if (publicAbi) {
flags = flags or JvmAnnotationNames.METADATA_PUBLIC_ABI_FLAG flags = flags or JvmAnnotationNames.METADATA_PUBLIC_ABI_FLAG
} }
@@ -49,8 +49,8 @@ fun writeKotlinMetadata(
av.visitEnd() av.visitEnd()
} }
fun writeSyntheticClassMetadata(cb: ClassBuilder, state: GenerationState, publicAbi: Boolean) { fun writeSyntheticClassMetadata(cb: ClassBuilder, config: JvmBackendConfig, publicAbi: Boolean) {
writeKotlinMetadata(cb, state, KotlinClassHeader.Kind.SYNTHETIC_CLASS, publicAbi, 0) { _ -> writeKotlinMetadata(cb, config, KotlinClassHeader.Kind.SYNTHETIC_CLASS, publicAbi, 0) { _ ->
// Do nothing // Do nothing
} }
} }
@@ -62,7 +62,7 @@ fun makeFirMetadataSerializerForIrClass(
approximator, approximator,
makeElementSerializer( makeElementSerializer(
irClass.metadata, components.session, components.scopeSession, firSerializerExtension, approximator, parent, irClass.metadata, components.session, components.scopeSession, firSerializerExtension, approximator, parent,
context.state.configuration.languageVersionSettings, context.config.languageVersionSettings,
), ),
irActualizedResult irActualizedResult
) )
@@ -23,6 +23,8 @@ import org.jetbrains.kotlin.codegen.VersionIndependentOpcodes
import org.jetbrains.kotlin.codegen.addRecordComponent import org.jetbrains.kotlin.codegen.addRecordComponent
import org.jetbrains.kotlin.codegen.inline.* import org.jetbrains.kotlin.codegen.inline.*
import org.jetbrains.kotlin.codegen.signature.JvmSignatureWriter import org.jetbrains.kotlin.codegen.signature.JvmSignatureWriter
import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.codegen.state.JvmBackendConfig
import org.jetbrains.kotlin.codegen.writeKotlinMetadata import org.jetbrains.kotlin.codegen.writeKotlinMetadata
import org.jetbrains.kotlin.config.JvmAnalysisFlags import org.jetbrains.kotlin.config.JvmAnalysisFlags
import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.config.JvmTarget
@@ -83,7 +85,8 @@ class ClassCodegen private constructor(
} }
val smap = context.getSourceMapper(irClass) val smap = context.getSourceMapper(irClass)
private val state get() = context.state private val state: GenerationState get() = context.state
private val config: JvmBackendConfig = context.config
private val innerClasses = mutableSetOf<IrClass>() private val innerClasses = mutableSetOf<IrClass>()
val typeMapper = val typeMapper =
@@ -112,15 +115,15 @@ class ClassCodegen private constructor(
private val jvmSignatureClashDetector = JvmSignatureClashDetector(this) private val jvmSignatureClashDetector = JvmSignatureClashDetector(this)
private val visitor = state.factory.newVisitor(irClass.descriptorOrigin, type, irClass.fileParent.loadSourceFilesInfo()).apply { private val visitor = state.factory.newVisitor(irClass.descriptorOrigin, type, irClass.fileParent.loadSourceFilesInfo()).apply {
val signature = typeMapper.mapClassSignature(irClass, type, context.state.classBuilderMode.generateBodies) val signature = typeMapper.mapClassSignature(irClass, type, state.classBuilderMode.generateBodies)
// Ensure that the backend only produces class names that would be valid in the frontend for JVM. // Ensure that the backend only produces class names that would be valid in the frontend for JVM.
if (context.state.classBuilderMode.generateBodies && signature.hasInvalidName()) { if (state.classBuilderMode.generateBodies && signature.hasInvalidName()) {
throw IllegalStateException("Generating class with invalid name '${type.className}': ${irClass.dump()}") throw IllegalStateException("Generating class with invalid name '${type.className}': ${irClass.dump()}")
} }
defineClass( defineClass(
irClass.psiElement, irClass.psiElement,
state.config.classFileVersion, config.classFileVersion,
irClass.getFlags(context.state.languageVersionSettings), irClass.getFlags(config.languageVersionSettings),
signature.name, signature.name,
signature.javaGenericSignature, signature.javaGenericSignature,
signature.superclassName, signature.superclassName,
@@ -150,9 +153,9 @@ class ClassCodegen private constructor(
if (shouldSkipCodeGenerationAccordingToGenerationFilter()) return if (shouldSkipCodeGenerationAccordingToGenerationFilter()) return
// Generate PermittedSubclasses attribute for sealed class. // Generate PermittedSubclasses attribute for sealed class.
if (state.languageVersionSettings.supportsFeature(LanguageFeature.JvmPermittedSubclassesAttributeForSealed) && if (config.languageVersionSettings.supportsFeature(LanguageFeature.JvmPermittedSubclassesAttributeForSealed) &&
irClass.modality == Modality.SEALED && irClass.modality == Modality.SEALED &&
state.config.target >= JvmTarget.JVM_17 config.target >= JvmTarget.JVM_17
) { ) {
generatePermittedSubclasses() generatePermittedSubclasses()
} }
@@ -203,7 +206,7 @@ class ClassCodegen private constructor(
generateKotlinMetadataAnnotation() generateKotlinMetadataAnnotation()
if (withinInline || !smap.isTrivial) { if (withinInline || !smap.isTrivial) {
visitor.visitSMAP(smap, !context.state.languageVersionSettings.supportsFeature(LanguageFeature.CorrectSourceMappingSyntax)) visitor.visitSMAP(smap, !config.languageVersionSettings.supportsFeature(LanguageFeature.CorrectSourceMappingSyntax))
} else { } else {
smap.sourceInfo!!.sourceFileName?.let { smap.sourceInfo!!.sourceFileName?.let {
visitor.visitSource(it, null) visitor.visitSource(it, null)
@@ -214,7 +217,7 @@ class ClassCodegen private constructor(
generateInnerAndOuterClasses() generateInnerAndOuterClasses()
visitor.done(state.config.generateSmapCopyToAnnotation) visitor.done(config.generateSmapCopyToAnnotation)
jvmSignatureClashDetector.reportErrors() jvmSignatureClashDetector.reportErrors()
} }
@@ -282,8 +285,8 @@ class ClassCodegen private constructor(
val isMultifileClassOrPart = kind == KotlinClassHeader.Kind.MULTIFILE_CLASS || kind == KotlinClassHeader.Kind.MULTIFILE_CLASS_PART val isMultifileClassOrPart = kind == KotlinClassHeader.Kind.MULTIFILE_CLASS || kind == KotlinClassHeader.Kind.MULTIFILE_CLASS_PART
var extraFlags = JvmBackendExtension.Default.generateMetadataExtraFlags(state.config.abiStability) var extraFlags = JvmBackendExtension.Default.generateMetadataExtraFlags(config.abiStability)
if (isMultifileClassOrPart && state.languageVersionSettings.getFlag(JvmAnalysisFlags.inheritMultifileParts)) { if (isMultifileClassOrPart && config.languageVersionSettings.getFlag(JvmAnalysisFlags.inheritMultifileParts)) {
extraFlags = extraFlags or JvmAnnotationNames.METADATA_MULTIFILE_PARTS_INHERIT_FLAG extraFlags = extraFlags or JvmAnnotationNames.METADATA_MULTIFILE_PARTS_INHERIT_FLAG
} }
if (metadata is MetadataSource.Script) { if (metadata is MetadataSource.Script) {
@@ -303,7 +306,7 @@ class ClassCodegen private constructor(
val isPublicAbi = irClass.symbol in context.publicAbiSymbols || irClass.isInlineSamWrapper || val isPublicAbi = irClass.symbol in context.publicAbiSymbols || irClass.isInlineSamWrapper ||
type.isAnonymousClass && irClass.isInPublicInlineScope type.isAnonymousClass && irClass.isInPublicInlineScope
writeKotlinMetadata(visitor, state, kind, isPublicAbi, extraFlags) { av -> writeKotlinMetadata(visitor, context.config, kind, isPublicAbi, extraFlags) { av ->
if (metadata != null) { if (metadata != null) {
metadataSerializer.serialize(metadata)?.let { (proto, stringTable) -> metadataSerializer.serialize(metadata)?.let { (proto, stringTable) ->
DescriptorAsmUtil.writeAnnotationData(av, proto, stringTable) DescriptorAsmUtil.writeAnnotationData(av, proto, stringTable)
@@ -346,7 +349,7 @@ class ClassCodegen private constructor(
if (field.origin == IrDeclarationOrigin.PROPERTY_DELEGATE) null if (field.origin == IrDeclarationOrigin.PROPERTY_DELEGATE) null
else methodSignatureMapper.mapFieldSignature(field) else methodSignatureMapper.mapFieldSignature(field)
val fieldName = field.name.asString() val fieldName = field.name.asString()
val flags = field.computeFieldFlags(context, state.languageVersionSettings) val flags = field.computeFieldFlags(context, config.languageVersionSettings)
val fv = visitor.newField( val fv = visitor.newField(
field.descriptorOrigin, flags, fieldName, fieldType.descriptor, field.descriptorOrigin, flags, fieldName, fieldType.descriptor,
fieldSignature, (field.initializer?.expression as? IrConst<*>)?.value fieldSignature, (field.initializer?.expression as? IrConst<*>)?.value
@@ -33,8 +33,7 @@ internal fun MethodNode.acceptWithStateMachine(
obtainContinuationClassBuilder: () -> ClassBuilder, obtainContinuationClassBuilder: () -> ClassBuilder,
) { ) {
val context = classCodegen.context val context = classCodegen.context
val state = context.state val languageVersionSettings = context.config.languageVersionSettings
val languageVersionSettings = state.languageVersionSettings
assert(languageVersionSettings.supportsFeature(LanguageFeature.ReleaseCoroutines)) { "Experimental coroutines are unsupported in JVM_IR backend" } assert(languageVersionSettings.supportsFeature(LanguageFeature.ReleaseCoroutines)) { "Experimental coroutines are unsupported in JVM_IR backend" }
val lineNumber = if (irFunction.startOffset >= 0) { val lineNumber = if (irFunction.startOffset >= 0) {
@@ -28,8 +28,9 @@ import org.jetbrains.kotlin.codegen.inline.ReifiedTypeInliner.OperationKind.SAFE
import org.jetbrains.kotlin.codegen.intrinsics.TypeIntrinsics import org.jetbrains.kotlin.codegen.intrinsics.TypeIntrinsics
import org.jetbrains.kotlin.codegen.pseudoInsns.fakeAlwaysFalseIfeq import org.jetbrains.kotlin.codegen.pseudoInsns.fakeAlwaysFalseIfeq
import org.jetbrains.kotlin.codegen.pseudoInsns.fixStackAndJump import org.jetbrains.kotlin.codegen.pseudoInsns.fixStackAndJump
import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.codegen.state.JvmBackendConfig
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.diagnostics.BackendErrors import org.jetbrains.kotlin.diagnostics.BackendErrors
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
@@ -153,7 +154,8 @@ class ExpressionCodegen(
val typeMapper = classCodegen.typeMapper val typeMapper = classCodegen.typeMapper
val methodSignatureMapper = classCodegen.methodSignatureMapper val methodSignatureMapper = classCodegen.methodSignatureMapper
val state = context.state val state: GenerationState = context.state
val config: JvmBackendConfig = context.config
override val visitor: InstructionAdapter override val visitor: InstructionAdapter
get() = mv get() = mv
@@ -217,7 +219,7 @@ class ExpressionCodegen(
mv.visitCode() mv.visitCode()
val startLabel = markNewLabel() val startLabel = markNewLabel()
val info = BlockInfo() val info = BlockInfo()
if (context.state.classBuilderMode.generateBodies) { if (state.classBuilderMode.generateBodies) {
if (irFunction.isMultifileBridge()) { if (irFunction.isMultifileBridge()) {
// Multifile bridges need to have line number 1 to be filtered out by the intellij debugging filters. // Multifile bridges need to have line number 1 to be filtered out by the intellij debugging filters.
mv.visitLineNumber(1, startLabel) mv.visitLineNumber(1, startLabel)
@@ -281,7 +283,7 @@ class ExpressionCodegen(
} }
private fun generateNonNullAssertions() { private fun generateNonNullAssertions() {
if (state.config.isParamAssertionsDisabled) if (config.isParamAssertionsDisabled)
return return
if ((DescriptorVisibilities.isPrivate(irFunction.visibility) && !shouldGenerateNonNullAssertionsForPrivateFun(irFunction)) || if ((DescriptorVisibilities.isPrivate(irFunction.visibility) && !shouldGenerateNonNullAssertionsForPrivateFun(irFunction)) ||
@@ -341,7 +343,7 @@ class ExpressionCodegen(
if (!expandedType.isNullable() && !isPrimitive(asmType)) { if (!expandedType.isNullable() && !isPrimitive(asmType)) {
mv.load(findLocalIndex(param.symbol), asmType) mv.load(findLocalIndex(param.symbol), asmType)
mv.aconst(param.name.asString()) mv.aconst(param.name.asString())
val methodName = if (state.config.unifiedNullChecks) "checkNotNullParameter" else "checkParameterIsNotNull" val methodName = if (config.unifiedNullChecks) "checkNotNullParameter" else "checkParameterIsNotNull"
mv.invokestatic(JvmSymbols.INTRINSICS_CLASS_NAME, methodName, "(Ljava/lang/Object;Ljava/lang/String;)V", false) mv.invokestatic(JvmSymbols.INTRINSICS_CLASS_NAME, methodName, "(Ljava/lang/Object;Ljava/lang/String;)V", false)
} }
} }
@@ -371,7 +373,7 @@ class ExpressionCodegen(
getNameForReceiverParameter( getNameForReceiverParameter(
irFunction.toIrBasedDescriptor(), irFunction.toIrBasedDescriptor(),
state.bindingContext, state.bindingContext,
context.configuration.languageVersionSettings context.config.languageVersionSettings
) )
} else { } else {
param.name.asString() param.name.asString()
@@ -985,7 +987,7 @@ class ExpressionCodegen(
} }
private fun generateGlobalReturnFlagIfPossible(expression: IrExpression, label: String) { private fun generateGlobalReturnFlagIfPossible(expression: IrExpression, label: String) {
if (state.config.isInlineDisabled) { if (config.isInlineDisabled) {
context.ktDiagnosticReporter.at(expression, irFunction).report(BackendErrors.NON_LOCAL_RETURN_IN_DISABLED_INLINE) context.ktDiagnosticReporter.at(expression, irFunction).report(BackendErrors.NON_LOCAL_RETURN_IN_DISABLED_INLINE)
genThrow(mv, "java/lang/UnsupportedOperationException", "Non-local returns are not allowed with inlining disabled") genThrow(mv, "java/lang/UnsupportedOperationException", "Non-local returns are not allowed with inlining disabled")
} else { } else {
@@ -1444,7 +1446,7 @@ class ExpressionCodegen(
val gapEnd = afterJumpLabel ?: endOfFinallyCode val gapEnd = afterJumpLabel ?: endOfFinallyCode
tryWithFinallyInfo.gaps.add(gapStart to gapEnd) tryWithFinallyInfo.gaps.add(gapStart to gapEnd)
if (state.languageVersionSettings.supportsFeature(LanguageFeature.ProperFinally)) { if (config.languageVersionSettings.supportsFeature(LanguageFeature.ProperFinally)) {
for (it in nestedTryWithoutFinally) { for (it in nestedTryWithoutFinally) {
it.gaps.add(gapStart to gapEnd) it.gaps.add(gapStart to gapEnd)
} }
@@ -1581,8 +1583,8 @@ class ExpressionCodegen(
mappings, mappings,
IrInlineIntrinsicsSupport(classCodegen, element, irFunction.fileParent), IrInlineIntrinsicsSupport(classCodegen, element, irFunction.fileParent),
context.typeSystem, context.typeSystem,
state.languageVersionSettings, config.languageVersionSettings,
state.config.unifiedNullChecks, config.unifiedNullChecks,
) )
return IrInlineCodegen(this, state, callee, signature, mappings, sourceCompiler, reifiedTypeInliner) return IrInlineCodegen(this, state, callee, signature, mappings, sourceCompiler, reifiedTypeInliner)
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.backend.jvm.mapping.mapTypeAsDeclaration
import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.AsmUtil
import org.jetbrains.kotlin.codegen.inline.* import org.jetbrains.kotlin.codegen.inline.*
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.codegen.state.JvmBackendConfig
import org.jetbrains.kotlin.codegen.visitAnnotableParameterCount import org.jetbrains.kotlin.codegen.visitAnnotableParameterCount
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
@@ -71,7 +72,7 @@ class FunctionCodegen(private val irFunction: IrFunction, private val classCodeg
val methodVisitor: MethodVisitor = wrapWithMaxLocalCalc(methodNode) val methodVisitor: MethodVisitor = wrapWithMaxLocalCalc(methodNode)
if (context.config.generateParametersMetadata && !isSynthetic) { if (context.config.generateParametersMetadata && !isSynthetic) {
generateParameterNames(irFunction, methodVisitor, context.state) generateParameterNames(irFunction, methodVisitor, context.config)
} }
if (irFunction.isWithAnnotations) { if (irFunction.isWithAnnotations) {
@@ -211,7 +212,7 @@ class FunctionCodegen(private val irFunction: IrFunction, private val classCodeg
} }
private fun getThrownExceptions(function: IrFunction): List<String>? { private fun getThrownExceptions(function: IrFunction): List<String>? {
if (context.state.languageVersionSettings.supportsFeature(LanguageFeature.DoNotGenerateThrowsForDelegatedKotlinMembers) && if (context.config.languageVersionSettings.supportsFeature(LanguageFeature.DoNotGenerateThrowsForDelegatedKotlinMembers) &&
function.origin == IrDeclarationOrigin.DELEGATED_MEMBER function.origin == IrDeclarationOrigin.DELEGATED_MEMBER
) return null ) return null
@@ -335,9 +336,9 @@ private fun IrValueParameter.isSyntheticMarkerParameter(): Boolean =
origin == IrDeclarationOrigin.DEFAULT_CONSTRUCTOR_MARKER || origin == IrDeclarationOrigin.DEFAULT_CONSTRUCTOR_MARKER ||
origin == JvmLoweredDeclarationOrigin.SYNTHETIC_MARKER_PARAMETER origin == JvmLoweredDeclarationOrigin.SYNTHETIC_MARKER_PARAMETER
private fun generateParameterNames(irFunction: IrFunction, mv: MethodVisitor, state: GenerationState) { private fun generateParameterNames(irFunction: IrFunction, mv: MethodVisitor, config: JvmBackendConfig) {
irFunction.extensionReceiverParameter?.let { irFunction.extensionReceiverParameter?.let {
mv.visitParameter(irFunction.extensionReceiverName(state), 0) mv.visitParameter(irFunction.extensionReceiverName(config), 0)
} }
for (irParameter in irFunction.valueParameters) { for (irParameter in irFunction.valueParameters) {
// A construct emitted by a Java compiler must be marked as synthetic if it does not correspond to a construct declared // A construct emitted by a Java compiler must be marked as synthetic if it does not correspond to a construct declared
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.backend.jvm.ir.getCallableReferenceTopLevelFlag
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.AsmUtil
import org.jetbrains.kotlin.codegen.inline.ReifiedTypeInliner import org.jetbrains.kotlin.codegen.inline.ReifiedTypeInliner
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.JvmBackendConfig
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.descriptors.toIrBasedKotlinType import org.jetbrains.kotlin.ir.descriptors.toIrBasedKotlinType
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
@@ -41,8 +41,8 @@ class IrInlineIntrinsicsSupport(
private val reportErrorsOn: IrExpression, private val reportErrorsOn: IrExpression,
private val containingFile: IrFile, private val containingFile: IrFile,
) : ReifiedTypeInliner.IntrinsicsSupport<IrType> { ) : ReifiedTypeInliner.IntrinsicsSupport<IrType> {
override val state: GenerationState override val config: JvmBackendConfig
get() = classCodegen.context.state get() = classCodegen.context.config
// todo: this likely need to be moved up as IrInlineIntrinsicsSupport is recreated every time in getOrCreateCallGenerator // todo: this likely need to be moved up as IrInlineIntrinsicsSupport is recreated every time in getOrCreateCallGenerator
private val pluginExtensions = IrGenerationExtension.getInstances(classCodegen.context.state.project) private val pluginExtensions = IrGenerationExtension.getInstances(classCodegen.context.state.project)
@@ -195,7 +195,7 @@ class PrimitiveComparison(
val b = right.accept(codegen, data).materializedAt(parameterType, right.type) val b = right.accept(codegen, data).materializedAt(parameterType, right.type)
val useNonIEEE754Comparison = val useNonIEEE754Comparison =
!codegen.context.state.languageVersionSettings.supportsFeature(LanguageFeature.ProperIeee754Comparisons) !codegen.context.config.languageVersionSettings.supportsFeature(LanguageFeature.ProperIeee754Comparisons)
&& (parameterType == Type.FLOAT_TYPE || parameterType == Type.DOUBLE_TYPE) && (parameterType == Type.FLOAT_TYPE || parameterType == Type.DOUBLE_TYPE)
&& (left.isSmartcastFromHigherThanNullable(codegen.context) || right.isSmartcastFromHigherThanNullable(codegen.context)) && (left.isSmartcastFromHigherThanNullable(codegen.context) || right.isSmartcastFromHigherThanNullable(codegen.context))
@@ -189,7 +189,7 @@ class Ieee754Equals(val operandType: Type) : IntrinsicMethod() {
val arg1isNullable = arg1Type.isNullable() val arg1isNullable = arg1Type.isNullable()
val useNonIEEE754Comparison = val useNonIEEE754Comparison =
!classCodegen.context.state.languageVersionSettings.supportsFeature(LanguageFeature.ProperIeee754Comparisons) !classCodegen.context.config.languageVersionSettings.supportsFeature(LanguageFeature.ProperIeee754Comparisons)
&& (arg0.isSmartcastFromHigherThanNullable(classCodegen.context) || arg1.isSmartcastFromHigherThanNullable(classCodegen.context)) && (arg0.isSmartcastFromHigherThanNullable(classCodegen.context) || arg1.isSmartcastFromHigherThanNullable(classCodegen.context))
return when { return when {
@@ -31,7 +31,7 @@ object IrCheckNotNull : IntrinsicMethod() {
private fun ExpressionCodegen.checkTopValueForNull() { private fun ExpressionCodegen.checkTopValueForNull() {
mv.dup() mv.dup()
if (state.config.unifiedNullChecks) { if (config.unifiedNullChecks) {
mv.invokestatic(IntrinsicMethods.INTRINSICS_CLASS_NAME, "checkNotNull", "(Ljava/lang/Object;)V", false) mv.invokestatic(IntrinsicMethods.INTRINSICS_CLASS_NAME, "checkNotNull", "(Ljava/lang/Object;)V", false)
} else { } else {
val ifNonNullLabel = Label() val ifNonNullLabel = Label()
@@ -28,7 +28,7 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
internal class ApiVersionIsAtLeastEvaluationLowering(val context: JvmBackendContext) : FileLoweringPass, internal class ApiVersionIsAtLeastEvaluationLowering(val context: JvmBackendContext) : FileLoweringPass,
IrElementTransformer<ApiVersionIsAtLeastEvaluationLowering.Data> { IrElementTransformer<ApiVersionIsAtLeastEvaluationLowering.Data> {
private val apiVersion = context.state.languageVersionSettings.apiVersion.version private val apiVersion = context.config.languageVersionSettings.apiVersion.version
data class Data(val currentFunction: IrFunction?, val isInsideInlinedBlock: Boolean) data class Data(val currentFunction: IrFunction?, val isInsideInlinedBlock: Boolean)
@@ -89,7 +89,7 @@ private class EnumClassLowering(private val context: JvmBackendContext) : ClassL
override fun lower(irClass: IrClass) { override fun lower(irClass: IrClass) {
if (!irClass.isEnumClass) return if (!irClass.isEnumClass) return
// Also protected by API version check as it relies on EnumEntries in standard library // Also protected by API version check as it relies on EnumEntries in standard library
EnumClassTransformer(irClass, context.state.languageVersionSettings.supportsFeature(LanguageFeature.EnumEntries)).run() EnumClassTransformer(irClass, context.config.languageVersionSettings.supportsFeature(LanguageFeature.EnumEntries)).run()
} }
private inner class EnumClassTransformer(private val irClass: IrClass, private val supportsEnumEntries: Boolean) { private inner class EnumClassTransformer(private val irClass: IrClass, private val supportsEnumEntries: Boolean) {
@@ -68,7 +68,7 @@ internal val enumExternalEntriesPhase = makeIrFilePhase(
class EnumExternalEntriesLowering(private val context: JvmBackendContext) : FileLoweringPass, IrElementTransformerVoidWithContext() { class EnumExternalEntriesLowering(private val context: JvmBackendContext) : FileLoweringPass, IrElementTransformerVoidWithContext() {
override fun lower(irFile: IrFile) { override fun lower(irFile: IrFile) {
if (!context.state.languageVersionSettings.supportsFeature(LanguageFeature.EnumEntries)) { if (!context.config.languageVersionSettings.supportsFeature(LanguageFeature.EnumEntries)) {
return return
} }
irFile.transformChildrenVoid(this) irFile.transformChildrenVoid(this)
@@ -93,7 +93,7 @@ private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPa
val isMultifilePart = fileClassInfo.withJvmMultifileClass val isMultifilePart = fileClassInfo.withJvmMultifileClass
val onlyPrivateDeclarationsAndFeatureIsEnabled = val onlyPrivateDeclarationsAndFeatureIsEnabled =
context.state.languageVersionSettings.supportsFeature(LanguageFeature.PackagePrivateFileClassesWithAllPrivateMembers) && fileClassMembers context.config.languageVersionSettings.supportsFeature(LanguageFeature.PackagePrivateFileClassesWithAllPrivateMembers) && fileClassMembers
.all { .all {
val isPrivate = it is IrDeclarationWithVisibility && DescriptorVisibilities.isPrivate(it.visibility) val isPrivate = it is IrDeclarationWithVisibility && DescriptorVisibilities.isPrivate(it.visibility)
val isInlineOnly = it.hasAnnotation(INLINE_ONLY_ANNOTATION_FQ_NAME) val isInlineOnly = it.hasAnnotation(INLINE_ONLY_ANNOTATION_FQ_NAME)
@@ -101,7 +101,7 @@ private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPa
} }
val fileClassOrigin = val fileClassOrigin =
if (!isMultifilePart || context.state.languageVersionSettings.getFlag(JvmAnalysisFlags.inheritMultifileParts)) if (!isMultifilePart || context.config.languageVersionSettings.getFlag(JvmAnalysisFlags.inheritMultifileParts))
IrDeclarationOrigin.FILE_CLASS IrDeclarationOrigin.FILE_CLASS
else else
IrDeclarationOrigin.SYNTHETIC_FILE_CLASS IrDeclarationOrigin.SYNTHETIC_FILE_CLASS
@@ -75,10 +75,10 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext)
context.config.lambdasScheme == JvmClosureGenerationScheme.INDY context.config.lambdasScheme == JvmClosureGenerationScheme.INDY
private val shouldGenerateLightweightLambdas = private val shouldGenerateLightweightLambdas =
shouldGenerateIndyLambdas && context.state.languageVersionSettings.supportsFeature(LanguageFeature.LightweightLambdas) shouldGenerateIndyLambdas && context.config.languageVersionSettings.supportsFeature(LanguageFeature.LightweightLambdas)
private val isJavaSamConversionWithEqualsHashCode = private val isJavaSamConversionWithEqualsHashCode =
context.state.languageVersionSettings.supportsFeature(LanguageFeature.JavaSamConversionEqualsHashCode) context.config.languageVersionSettings.supportsFeature(LanguageFeature.JavaSamConversionEqualsHashCode)
override fun visitBlock(expression: IrBlock): IrExpression { override fun visitBlock(expression: IrBlock): IrExpression {
if (!expression.origin.isLambda) if (!expression.origin.isLambda)
@@ -51,7 +51,7 @@ internal val generateMultifileFacadesPhase = makeCustomPhase<JvmBackendContext,
// In -Xmultifile-parts-inherit mode, instead of generating "bridge" methods in the facade which call into parts, // In -Xmultifile-parts-inherit mode, instead of generating "bridge" methods in the facade which call into parts,
// we construct an inheritance chain such that all part members are present as fake overrides in the facade. // we construct an inheritance chain such that all part members are present as fake overrides in the facade.
val shouldGeneratePartHierarchy = context.state.languageVersionSettings.getFlag(JvmAnalysisFlags.inheritMultifileParts) val shouldGeneratePartHierarchy = context.config.languageVersionSettings.getFlag(JvmAnalysisFlags.inheritMultifileParts)
input.files.addAll( input.files.addAll(
generateMultifileFacades(input, context, shouldGeneratePartHierarchy, functionDelegates) generateMultifileFacades(input, context, shouldGeneratePartHierarchy, functionDelegates)
) )
@@ -382,7 +382,7 @@ internal class JvmInlineClassLowering(context: JvmBackendContext) : JvmValueClas
if (!isSingleFieldValueClass) return false if (!isSingleFieldValueClass) return false
// Before version 1.4, we cannot rely on the Result.equals-impl0 method // Before version 1.4, we cannot rely on the Result.equals-impl0 method
return !isClassWithFqName(StandardNames.RESULT_FQ_NAME) || return !isClassWithFqName(StandardNames.RESULT_FQ_NAME) ||
context.state.languageVersionSettings.apiVersion >= ApiVersion.KOTLIN_1_4 context.config.languageVersionSettings.apiVersion >= ApiVersion.KOTLIN_1_4
} }
override fun visitGetField(expression: IrGetField): IrExpression { override fun visitGetField(expression: IrGetField): IrExpression {
@@ -56,7 +56,7 @@ open class JvmInventNamesForLocalClasses(
} }
override fun sanitizeNameIfNeeded(name: String): String { override fun sanitizeNameIfNeeded(name: String): String {
return JvmCodegenUtil.sanitizeNameIfNeeded(name, context.state.languageVersionSettings) return JvmCodegenUtil.sanitizeNameIfNeeded(name, context.config.languageVersionSettings)
} }
override fun putLocalClassName(declaration: IrAttributeContainer, localClassName: String) { override fun putLocalClassName(declaration: IrAttributeContainer, localClassName: String) {
@@ -132,7 +132,7 @@ private class JvmOverloadsAnnotationLowering(val context: JvmBackendContext) : C
name = oldFunction.name name = oldFunction.name
visibility = oldFunction.visibility visibility = oldFunction.visibility
modality = modality =
if (context.state.languageVersionSettings.supportsFeature(LanguageFeature.GenerateJvmOverloadsAsFinal)) Modality.FINAL if (context.config.languageVersionSettings.supportsFeature(LanguageFeature.GenerateJvmOverloadsAsFinal)) Modality.FINAL
else oldFunction.modality else oldFunction.modality
returnType = oldFunction.returnType returnType = oldFunction.returnType
isInline = oldFunction.isInline isInline = oldFunction.isInline
@@ -218,7 +218,7 @@ class JvmPropertiesLowering(private val backendContext: JvmBackendContext) : IrE
private fun JvmBackendContext.computeSyntheticMethodName(property: IrProperty, suffix: String): String { private fun JvmBackendContext.computeSyntheticMethodName(property: IrProperty, suffix: String): String {
val baseName = val baseName =
if (state.languageVersionSettings.supportsFeature(LanguageFeature.UseGetterNameForPropertyAnnotationsMethodOnJvm)) { if (config.languageVersionSettings.supportsFeature(LanguageFeature.UseGetterNameForPropertyAnnotationsMethodOnJvm)) {
val getter = property.getter val getter = property.getter
if (getter != null) { if (getter != null) {
val needsMangling = val needsMangling =
@@ -38,7 +38,7 @@ internal val singleAbstractMethodPhase = makeIrFilePhase(
private class JvmSingleAbstractMethodLowering(context: JvmBackendContext) : SingleAbstractMethodLowering(context) { private class JvmSingleAbstractMethodLowering(context: JvmBackendContext) : SingleAbstractMethodLowering(context) {
private val isJavaSamConversionWithEqualsHashCode = private val isJavaSamConversionWithEqualsHashCode =
context.state.languageVersionSettings.supportsFeature(LanguageFeature.JavaSamConversionEqualsHashCode) context.config.languageVersionSettings.supportsFeature(LanguageFeature.JavaSamConversionEqualsHashCode)
override val inInlineFunctionScope: Boolean override val inInlineFunctionScope: Boolean
get() = allScopes.any { (it.irElement as? IrDeclaration)?.isInPublicInlineScope == true } get() = allScopes.any { (it.irElement as? IrDeclaration)?.isInPublicInlineScope == true }
@@ -10,14 +10,13 @@ import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
import org.jetbrains.kotlin.backend.jvm.JvmLoweredStatementOrigin import org.jetbrains.kotlin.backend.jvm.JvmLoweredStatementOrigin
import org.jetbrains.kotlin.backend.jvm.ir.defaultValue import org.jetbrains.kotlin.backend.jvm.ir.defaultValue
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrFunctionReference import org.jetbrains.kotlin.ir.expressions.IrFunctionReference
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
class JvmTailrecLowering(context: JvmBackendContext) : TailrecLowering(context) { class JvmTailrecLowering(context: JvmBackendContext) : TailrecLowering(context) {
override val useProperComputationOrderOfTailrecDefaultParameters: Boolean = override val useProperComputationOrderOfTailrecDefaultParameters: Boolean =
context.ir.context.configuration.languageVersionSettings.supportsFeature(LanguageFeature.ProperComputationOrderOfTailrecDefaultParameters) context.config.languageVersionSettings.supportsFeature(LanguageFeature.ProperComputationOrderOfTailrecDefaultParameters)
override fun followFunctionReference(reference: IrFunctionReference): Boolean = override fun followFunctionReference(reference: IrFunctionReference): Boolean =
reference.origin == JvmLoweredStatementOrigin.INLINE_LAMBDA reference.origin == JvmLoweredStatementOrigin.INLINE_LAMBDA
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
import org.jetbrains.kotlin.backend.jvm.ir.getJvmNameFromAnnotation import org.jetbrains.kotlin.backend.jvm.ir.getJvmNameFromAnnotation
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
@@ -69,7 +68,7 @@ private class MainMethodGenerationLowering(private val context: JvmBackendContex
* ``` * ```
*/ */
override fun lower(irClass: IrClass) { override fun lower(irClass: IrClass) {
if (!context.configuration.languageVersionSettings.supportsFeature(LanguageFeature.ExtendedMainConvention)) return if (!context.config.languageVersionSettings.supportsFeature(LanguageFeature.ExtendedMainConvention)) return
if (!irClass.isFileClass) return if (!irClass.isFileClass) return
irClass.functions.find { it.isMainMethod() }?.let { mainMethod -> irClass.functions.find { it.isMainMethod() }?.let { mainMethod ->
@@ -66,7 +66,7 @@ private class ObjectClassLowering(val context: JvmBackendContext) : ClassLowerin
// Mark object instance field as deprecated if the object visibility is private or protected, // Mark object instance field as deprecated if the object visibility is private or protected,
// and ProperVisibilityForCompanionObjectInstanceField language feature is not enabled. // and ProperVisibilityForCompanionObjectInstanceField language feature is not enabled.
if (!context.state.languageVersionSettings.supportsFeature(LanguageFeature.ProperVisibilityForCompanionObjectInstanceField) && if (!context.config.languageVersionSettings.supportsFeature(LanguageFeature.ProperVisibilityForCompanionObjectInstanceField) &&
(irClass.visibility == DescriptorVisibilities.PRIVATE || irClass.visibility == DescriptorVisibilities.PROTECTED) (irClass.visibility == DescriptorVisibilities.PRIVATE || irClass.visibility == DescriptorVisibilities.PROTECTED)
) { ) {
context.createJvmIrBuilder(irClass.symbol).run { context.createJvmIrBuilder(irClass.symbol).run {
@@ -35,7 +35,7 @@ internal val polymorphicSignaturePhase = makeIrFilePhase(
private class PolymorphicSignatureLowering(val context: JvmBackendContext) : IrElementTransformer<PolymorphicSignatureLowering.Data>, private class PolymorphicSignatureLowering(val context: JvmBackendContext) : IrElementTransformer<PolymorphicSignatureLowering.Data>,
FileLoweringPass { FileLoweringPass {
override fun lower(irFile: IrFile) { override fun lower(irFile: IrFile) {
if (context.state.languageVersionSettings.supportsFeature(LanguageFeature.PolymorphicSignature)) if (context.config.languageVersionSettings.supportsFeature(LanguageFeature.PolymorphicSignature))
irFile.transformChildren(this, Data(null)) irFile.transformChildren(this, Data(null))
} }
@@ -81,9 +81,8 @@ internal class LambdaMetafactoryArgumentsBuilder(
private val context: JvmBackendContext, private val context: JvmBackendContext,
private val crossinlineLambdas: Set<IrSimpleFunction> private val crossinlineLambdas: Set<IrSimpleFunction>
) { ) {
private val isJavaSamConversionWithEqualsHashCode = private val isJavaSamConversionWithEqualsHashCode =
context.state.languageVersionSettings.supportsFeature(LanguageFeature.JavaSamConversionEqualsHashCode) context.config.languageVersionSettings.supportsFeature(LanguageFeature.JavaSamConversionEqualsHashCode)
/** /**
* @see java.lang.invoke.LambdaMetafactory * @see java.lang.invoke.LambdaMetafactory
@@ -111,7 +111,7 @@ class JvmBackendContext(
override val mapping: Mapping = DefaultMapping() override val mapping: Mapping = DefaultMapping()
val ktDiagnosticReporter = KtDiagnosticReporterWithImplicitIrBasedContext(state.diagnosticReporter, state.languageVersionSettings) val ktDiagnosticReporter = KtDiagnosticReporterWithImplicitIrBasedContext(state.diagnosticReporter, config.languageVersionSettings)
override val ir = JvmIr(this.symbolTable) override val ir = JvmIr(this.symbolTable)
@@ -38,7 +38,7 @@ class MemoizedInlineClassReplacements(
val originalFunctionForMethodReplacement: MutableMap<IrFunction, IrFunction> = ConcurrentHashMap() val originalFunctionForMethodReplacement: MutableMap<IrFunction, IrFunction> = ConcurrentHashMap()
private val mangleCallsToJavaMethodsWithValueClasses = private val mangleCallsToJavaMethodsWithValueClasses =
context.state.languageVersionSettings.supportsFeature(LanguageFeature.MangleCallsToJavaMethodsWithValueClasses) context.config.languageVersionSettings.supportsFeature(LanguageFeature.MangleCallsToJavaMethodsWithValueClasses)
/** /**
* Get a replacement for a function or a constructor. * Get a replacement for a function or a constructor.
@@ -165,7 +165,7 @@ class MemoizedInlineClassReplacements(
dispatchReceiverParameter = function.dispatchReceiverParameter?.copyTo(this, index = -1) dispatchReceiverParameter = function.dispatchReceiverParameter?.copyTo(this, index = -1)
extensionReceiverParameter = function.extensionReceiverParameter?.copyTo( extensionReceiverParameter = function.extensionReceiverParameter?.copyTo(
// The function's name will be mangled, so preserve the old receiver name. // The function's name will be mangled, so preserve the old receiver name.
this, index = -1, name = Name.identifier(function.extensionReceiverName(context.state)) this, index = -1, name = Name.identifier(function.extensionReceiverName(context.config))
) )
contextReceiverParametersCount = function.contextReceiverParametersCount contextReceiverParametersCount = function.contextReceiverParametersCount
valueParameters = function.valueParameters.mapIndexed { index, parameter -> valueParameters = function.valueParameters.mapIndexed { index, parameter ->
@@ -200,7 +200,7 @@ class MemoizedInlineClassReplacements(
} }
function.extensionReceiverParameter?.let { function.extensionReceiverParameter?.let {
newValueParameters += it.copyTo( newValueParameters += it.copyTo(
this, index = newValueParameters.size, name = Name.identifier(function.extensionReceiverName(context.state)), this, index = newValueParameters.size, name = Name.identifier(function.extensionReceiverName(context.config)),
origin = IrDeclarationOrigin.MOVED_EXTENSION_RECEIVER origin = IrDeclarationOrigin.MOVED_EXTENSION_RECEIVER
) )
} }
@@ -140,7 +140,7 @@ class MemoizedMultiFieldValueClassReplacements(
newFlattenedParameters.addAll(contextReceivers) newFlattenedParameters.addAll(contextReceivers)
sourceFunction.extensionReceiverParameter?.let { sourceFunction.extensionReceiverParameter?.let {
val newParameters = it.grouped( val newParameters = it.grouped(
sourceFunction.extensionReceiverName(context.state), sourceFunction.extensionReceiverName(context.config),
substitutionMap, substitutionMap,
targetFunction, targetFunction,
IrDeclarationOrigin.MOVED_EXTENSION_RECEIVER, IrDeclarationOrigin.MOVED_EXTENSION_RECEIVER,
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.codegen.ASSERTIONS_DISABLED_FIELD_NAME
import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.AsmUtil
import org.jetbrains.kotlin.codegen.inline.coroutines.FOR_INLINE_SUFFIX import org.jetbrains.kotlin.codegen.inline.coroutines.FOR_INLINE_SUFFIX
import org.jetbrains.kotlin.codegen.mangleNameIfNeeded import org.jetbrains.kotlin.codegen.mangleNameIfNeeded
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.JvmBackendConfig
import org.jetbrains.kotlin.config.JvmDefaultMode import org.jetbrains.kotlin.config.JvmDefaultMode
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
@@ -504,8 +504,8 @@ val IrDeclaration.psiElement: PsiElement?
val IrMemberAccessExpression<*>.psiElement: PsiElement? val IrMemberAccessExpression<*>.psiElement: PsiElement?
get() = (symbol.descriptor.original as? DeclarationDescriptorWithSource)?.psiElement get() = (symbol.descriptor.original as? DeclarationDescriptorWithSource)?.psiElement
fun IrFunction.extensionReceiverName(state: GenerationState): String { fun IrFunction.extensionReceiverName(config: JvmBackendConfig): String {
if (!state.languageVersionSettings.supportsFeature(LanguageFeature.NewCapturedReceiverFieldNamingConvention)) { if (!config.languageVersionSettings.supportsFeature(LanguageFeature.NewCapturedReceiverFieldNamingConvention)) {
return AsmUtil.RECEIVER_PARAMETER_NAME return AsmUtil.RECEIVER_PARAMETER_NAME
} }
@@ -107,7 +107,7 @@ open class IrTypeMapper(private val context: JvmBackendContext) : KotlinTypeMapp
return JvmCodegenUtil.sanitizeNameIfNeeded( return JvmCodegenUtil.sanitizeNameIfNeeded(
computeClassInternalNameAsString(irClass), computeClassInternalNameAsString(irClass),
context.state.languageVersionSettings context.config.languageVersionSettings
) )
} }
@@ -104,7 +104,7 @@ class MethodSignatureMapper(private val context: JvmBackendContext, private val
private fun IrType.isJavaLangRecord() = getClass()!!.hasEqualFqName(JAVA_LANG_RECORD_FQ_NAME) private fun IrType.isJavaLangRecord() = getClass()!!.hasEqualFqName(JAVA_LANG_RECORD_FQ_NAME)
private fun mangleMemberNameIfRequired(name: String, function: IrSimpleFunction): String { private fun mangleMemberNameIfRequired(name: String, function: IrSimpleFunction): String {
val newName = JvmCodegenUtil.sanitizeNameIfNeeded(name, context.state.languageVersionSettings) val newName = JvmCodegenUtil.sanitizeNameIfNeeded(name, context.config.languageVersionSettings)
val suffix = if (function.isTopLevel) { val suffix = if (function.isTopLevel) {
if (function.isInvisibleInMultifilePart()) function.parentAsClass.name.asString() else null if (function.isInvisibleInMultifilePart()) function.parentAsClass.name.asString() else null
@@ -34,7 +34,7 @@ class DescriptorMetadataSerializer(
) : MetadataSerializer { ) : MetadataSerializer {
private val serializerExtension = JvmSerializerExtension(serializationBindings, context.state, context.defaultTypeMapper) private val serializerExtension = JvmSerializerExtension(serializationBindings, context.state, context.defaultTypeMapper)
private val serializer: DescriptorSerializer? = run { private val serializer: DescriptorSerializer? = run {
val languageVersionSettings = context.state.configuration.languageVersionSettings val languageVersionSettings = context.config.languageVersionSettings
when (val metadata = irClass.metadata) { when (val metadata = irClass.metadata) {
is DescriptorMetadataSource.Class -> DescriptorSerializer.create( is DescriptorMetadataSource.Class -> DescriptorSerializer.create(
metadata.descriptor, serializerExtension, (parent as? DescriptorMetadataSerializer)?.serializer, metadata.descriptor, serializerExtension, (parent as? DescriptorMetadataSerializer)?.serializer,
@@ -310,7 +310,7 @@ open class ParcelableCodegenExtension : ParcelableExtensionBase, ExpressionCodeg
codegen.v.visitInnerClass(creatorAsmType.internalName, containerAsmType.internalName, "Creator", ACC_PUBLIC or ACC_STATIC) codegen.v.visitInnerClass(creatorAsmType.internalName, containerAsmType.internalName, "Creator", ACC_PUBLIC or ACC_STATIC)
codegenForCreator.v.visitInnerClass(creatorAsmType.internalName, containerAsmType.internalName, "Creator", ACC_PUBLIC or ACC_STATIC) codegenForCreator.v.visitInnerClass(creatorAsmType.internalName, containerAsmType.internalName, "Creator", ACC_PUBLIC or ACC_STATIC)
writeSyntheticClassMetadata(classBuilderForCreator, codegen.state, InlineUtil.isInPublicInlineScope(parcelableClass)) writeSyntheticClassMetadata(classBuilderForCreator, codegen.state.config, InlineUtil.isInPublicInlineScope(parcelableClass))
writeCreatorConstructor(codegenForCreator, creatorClass, creatorAsmType) writeCreatorConstructor(codegenForCreator, creatorClass, creatorAsmType)
writeNewArrayMethod(codegenForCreator, parcelableClass, parcelableCreatorClassType, creatorClass, parcelerObject) writeNewArrayMethod(codegenForCreator, parcelableClass, parcelableCreatorClassType, creatorClass, parcelerObject)
@@ -772,7 +772,7 @@ internal fun createSingletonLambda(
areturn(kSerializerType) areturn(kSerializerType)
} }
writeSyntheticClassMetadata(lambdaClassBuilder, lambdaCodegen.state, false) writeSyntheticClassMetadata(lambdaClassBuilder, lambdaCodegen.state.config, false)
lambdaClassBuilder.done(lambdaCodegen.state.config.generateSmapCopyToAnnotation) lambdaClassBuilder.done(lambdaCodegen.state.config.generateSmapCopyToAnnotation)
return lambdaType return lambdaType