diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AbstractClassBuilder.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AbstractClassBuilder.java index 251191b28f4..6d199a43089 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AbstractClassBuilder.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AbstractClassBuilder.java @@ -115,9 +115,9 @@ public abstract class AbstractClassBuilder implements ClassBuilder { } @Override - public void done() { + public void done(boolean generateSmapCopyToAnnotation) { getVisitor().visitSource(sourceName, debugInfo); - if (debugInfo != null) { + if (generateSmapCopyToAnnotation && debugInfo != null) { AnnotationVisitor v = getVisitor().visitAnnotation(JvmAnnotationNames.SOURCE_DEBUG_EXTENSION_DESC, false).visitArray("value"); for (String part : CodegenUtilKt.splitStringConstant(debugInfo)) { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBuilder.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBuilder.java index d015313eeb1..242008b83a3 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBuilder.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBuilder.java @@ -57,7 +57,7 @@ public interface ClassBuilder { @NotNull AnnotationVisitor newAnnotation(@NotNull String desc, boolean visible); - void done(); + void done(boolean generateSmapCopyToAnnotation); @NotNull ClassVisitor getVisitor(); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBuilderOnDemand.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBuilderOnDemand.kt index 24b5e8d0ba9..b638ea2ab55 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBuilderOnDemand.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBuilderOnDemand.kt @@ -30,9 +30,9 @@ class ClassBuilderOnDemand(createClassBuilder: () -> ClassBuilder) : DelegatingC classBuilder() } - override fun done() { + override fun done(generateSmapCopyToAnnotation: Boolean) { if (isComputed) { - classBuilder().done() + classBuilder().done(generateSmapCopyToAnnotation) } } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassNameCollectionClassBuilderFactory.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassNameCollectionClassBuilderFactory.kt index 5b6374bc9f4..2f2d451882e 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassNameCollectionClassBuilderFactory.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassNameCollectionClassBuilderFactory.kt @@ -49,9 +49,9 @@ abstract class ClassNameCollectionClassBuilderFactory( super.defineClass(origin, version, access, name, signature, superName, interfaces) } - override fun done() { + override fun done(generateSmapCopyToAnnotation: Boolean) { handleClashingNames(classInternalName, classCreatedFor) - super.done() + super.done(generateSmapCopyToAnnotation) } } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/DelegatingClassBuilder.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/DelegatingClassBuilder.java index a9b403949f4..4850ea5f43a 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/DelegatingClassBuilder.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/DelegatingClassBuilder.java @@ -75,8 +75,8 @@ public abstract class DelegatingClassBuilder implements ClassBuilder { } @Override - public void done() { - getDelegate().done(); + public void done(boolean generateSmapCopyToAnnotation) { + getDelegate().done(generateSmapCopyToAnnotation); } @NotNull diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java index 6818a93106f..04689b818b3 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java @@ -47,8 +47,8 @@ import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature; import org.jetbrains.kotlin.resolve.source.KotlinSourceElementKt; import org.jetbrains.kotlin.storage.LockBasedStorageManager; import org.jetbrains.kotlin.storage.NotNullLazyValue; -import org.jetbrains.kotlin.types.error.ErrorUtils; import org.jetbrains.kotlin.types.KotlinType; +import org.jetbrains.kotlin.types.error.ErrorUtils; import org.jetbrains.org.objectweb.asm.Label; import org.jetbrains.org.objectweb.asm.MethodVisitor; import org.jetbrains.org.objectweb.asm.Opcodes; @@ -191,7 +191,7 @@ public abstract class MemberCodegen= ApiVersion.KOTLIN_1_4 && !configuration.getBoolean(JVMConfigurationKeys.NO_UNIFIED_NULL_CHECKS) + val generateSmapCopyToAnnotation: Boolean = !configuration.getBoolean(JVMConfigurationKeys.NO_SOURCE_DEBUG_EXTENSION) val functionsWithInlineClassReturnTypesMangled: Boolean = languageVersionSettings.supportsFeature(LanguageFeature.MangleClassMembersReturningInlineClasses) val shouldValidateIr = configuration.getBoolean(JVMConfigurationKeys.VALIDATE_IR) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/SignatureDumpingBuilderFactory.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/SignatureDumpingBuilderFactory.kt index fb91294e804..e5e1579e5e2 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/SignatureDumpingBuilderFactory.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/SignatureDumpingBuilderFactory.kt @@ -95,7 +95,7 @@ class SignatureDumpingBuilderFactory( return super.newField(origin, access, name, desc, signature, value) } - override fun done() { + override fun done(generateSmapCopyToAnnotation: Boolean) { if (firstClassWritten) outputStream.append(",\n") else firstClassWritten = true outputStream.append("\t{\n") origin.descriptor?.let { @@ -122,7 +122,7 @@ class SignatureDumpingBuilderFactory( }} outputStream.append("\n\t\t]\n\t}") - super.done() + super.done(generateSmapCopyToAnnotation) } } } @@ -148,4 +148,4 @@ private fun jsonEscape(value: String): String = buildString { } } } -} \ No newline at end of file +} diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/when/MappingClassesForWhenByEnumCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/when/MappingClassesForWhenByEnumCodegen.java index 800775b98c0..94d25c6c40d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/when/MappingClassesForWhenByEnumCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/when/MappingClassesForWhenByEnumCodegen.java @@ -60,7 +60,7 @@ public class MappingClassesForWhenByEnumCodegen { boolean publicAbi = mappings.stream().anyMatch(WhenByEnumsMapping::isPublicAbi); WriteAnnotationUtilKt.writeSyntheticClassMetadata(cb, state, publicAbi); - cb.done(); + cb.done(state.getGenerateSmapCopyToAnnotation()); } private static void generateFields(@NotNull ClassBuilder cb, @NotNull List mappings) { diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt index 6607efdd88f..0b70c01bce5 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt @@ -431,6 +431,12 @@ Also sets `-jvm-target` value equal to the selected JDK version""" ) var noUnifiedNullChecks: Boolean by FreezableVar(false) + @Argument( + value = "-Xno-source-debug-extension", + description = "Do not generate @kotlin.jvm.internal.SourceDebugExtension annotation on a class with the copy of SMAP" + ) + var noSourceDebugExtension: Boolean by FreezableVar(false) + @Argument( value = "-Xprofile", valueDescription = "", diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/builder/StubClassBuilder.java b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/builder/StubClassBuilder.java index 53d09e01f99..597453f0556 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/builder/StubClassBuilder.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/builder/StubClassBuilder.java @@ -193,11 +193,11 @@ public class StubClassBuilder extends AbstractClassBuilder { } @Override - public void done() { + public void done(boolean generateSmapCopyToAnnotation) { if (!isPackageClass) { StubElement pop = parentStack.pop(); assert pop == v.getResult() : "parentStack: got " + pop + ", expected " + v.getResult(); } - super.done(); + super.done(generateSmapCopyToAnnotation); } } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt index 39014d728fd..796c312332c 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt @@ -307,6 +307,7 @@ fun CompilerConfiguration.configureAdvancedJvmOptions(arguments: K2JVMCompilerAr put(JVMConfigurationKeys.NO_KOTLIN_NOTHING_VALUE_EXCEPTION, arguments.noKotlinNothingValueException) put(JVMConfigurationKeys.NO_RESET_JAR_TIMESTAMPS, arguments.noResetJarTimestamps) put(JVMConfigurationKeys.NO_UNIFIED_NULL_CHECKS, arguments.noUnifiedNullChecks) + put(JVMConfigurationKeys.NO_SOURCE_DEBUG_EXTENSION, arguments.noSourceDebugExtension) put(JVMConfigurationKeys.SERIALIZE_IR, JvmSerializeIrMode.fromString(arguments.serializeIr)) diff --git a/compiler/config.jvm/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java b/compiler/config.jvm/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java index 02159f13e58..44cca49e3f1 100644 --- a/compiler/config.jvm/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java +++ b/compiler/config.jvm/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java @@ -133,6 +133,9 @@ public class JVMConfigurationKeys { public static final CompilerConfigurationKey NO_UNIFIED_NULL_CHECKS = CompilerConfigurationKey.create("Use pre-1.4 exception types in null checks instead of java.lang.NPE"); + public static final CompilerConfigurationKey NO_SOURCE_DEBUG_EXTENSION = + CompilerConfigurationKey.create("Do not generate @kotlin.jvm.internal.SourceDebugExtension annotation on a class with the copy of SMAP"); + public static final CompilerConfigurationKey USE_OLD_INLINE_CLASSES_MANGLING_SCHEME = CompilerConfigurationKey.create("Use old, 1.4 version of inline classes mangling scheme"); diff --git a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt index 3928a18194a..2637d1dc6cc 100644 --- a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt +++ b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt @@ -215,7 +215,7 @@ class ClassCodegen private constructor( generateInnerAndOuterClasses() - visitor.done() + visitor.done(state.generateSmapCopyToAnnotation) jvmSignatureClashDetector.reportErrors(classOrigin) } diff --git a/compiler/testData/cli/jvm/extraHelp.out b/compiler/testData/cli/jvm/extraHelp.out index 1c045054f06..3aefb712fee 100644 --- a/compiler/testData/cli/jvm/extraHelp.out +++ b/compiler/testData/cli/jvm/extraHelp.out @@ -101,6 +101,7 @@ where advanced options include: -Xno-param-assertions Don't generate not-null assertions on parameters of methods accessible from Java -Xno-receiver-assertions Don't generate not-null assertion for extension receiver arguments of platform types -Xno-reset-jar-timestamps Do not reset jar entry timestamps to a fixed date + -Xno-source-debug-extension Do not generate @kotlin.jvm.internal.SourceDebugExtension annotation on a class with the copy of SMAP -Xno-unified-null-checks Use pre-1.4 exception types in null checks instead of java.lang.NPE. See KT-22275 for more details -Xnullability-annotations=@:{ignore/strict/warn} Specify behavior for specific Java nullability annotations (provided with fully qualified package name) diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableClinitClassBuilderInterceptorExtension.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableClinitClassBuilderInterceptorExtension.kt index ddd2a19e38a..72fb7fc1c06 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableClinitClassBuilderInterceptorExtension.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableClinitClassBuilderInterceptorExtension.kt @@ -99,7 +99,7 @@ class ParcelableClinitClassBuilderInterceptorExtension : ClassBuilderInterceptor super.defineClass(origin, version, access, name, signature, superName, interfaces) } - override fun done() { + override fun done(generateSmapCopyToAnnotation: Boolean) { if (!isClinitGenerated && currentClass != null && currentClassName != null) { val descriptor = bindingContext[BindingContext.CLASS, currentClass] if (descriptor != null && declarationOrigin.descriptor == descriptor && descriptor.isParcelize) { @@ -112,7 +112,7 @@ class ParcelableClinitClassBuilderInterceptorExtension : ClassBuilderInterceptor } } - super.done() + super.done(generateSmapCopyToAnnotation) } override fun newMethod( diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableCodegenExtension.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableCodegenExtension.kt index f10d3f81998..2247f5551cd 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableCodegenExtension.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableCodegenExtension.kt @@ -7,34 +7,30 @@ package org.jetbrains.kotlin.android.parcel import kotlinx.android.parcel.TypeParceler import org.jetbrains.kotlin.android.parcel.ParcelableResolveExtension.Companion.createMethod -import org.jetbrains.kotlin.android.parcel.serializers.* import org.jetbrains.kotlin.android.parcel.ParcelableSyntheticComponent.ComponentKind.* +import org.jetbrains.kotlin.android.parcel.serializers.* import org.jetbrains.kotlin.android.parcel.serializers.ParcelableExtensionBase.Companion.FILE_DESCRIPTOR_FQNAME import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.codegen.* +import org.jetbrains.kotlin.codegen.FunctionGenerationStrategy.CodegenBased +import org.jetbrains.kotlin.codegen.context.ClassContext import org.jetbrains.kotlin.codegen.extensions.ExpressionCodegenExtension import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns -import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin -import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature -import org.jetbrains.kotlin.codegen.ExpressionCodegen -import org.jetbrains.kotlin.codegen.FunctionGenerationStrategy.CodegenBased -import org.jetbrains.kotlin.codegen.ImplementationBodyCodegen -import org.jetbrains.kotlin.codegen.OwnerKind -import org.jetbrains.kotlin.codegen.context.ClassContext -import org.jetbrains.kotlin.codegen.writeSyntheticClassMetadata import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.ClassDescriptorImpl import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtElement +import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorFactory +import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.inline.InlineUtil +import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind +import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.types.KotlinType @@ -320,7 +316,7 @@ open class ParcelableCodegenExtension : ParcelableExtensionBase, ExpressionCodeg writeNewArrayMethod(codegenForCreator, parcelableClass, parcelableCreatorClassType, creatorClass, parcelerObject) writeCreateFromParcel(codegenForCreator, parcelableClass, parcelableCreatorClassType, creatorClass, parcelClassType, parcelAsmType, parcelerObject, properties) - classBuilderForCreator.done() + classBuilderForCreator.done(codegen.state.generateSmapCopyToAnnotation) } private fun writeCreatorConstructor(codegen: ImplementationBodyCodegen, creatorClass: ClassDescriptor, creatorAsmType: Type) { @@ -408,4 +404,4 @@ internal fun getTypeParcelers(annotations: Annotations): List