Add -X argument to disable generation of @SourceDebugExtension

This will be used in tests in the subsequent commit.
This commit is contained in:
Alexander Udalov
2022-07-17 02:22:11 +02:00
parent 87d3ce6ded
commit 7dad47cd76
31 changed files with 62 additions and 55 deletions
@@ -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)) {
@@ -57,7 +57,7 @@ public interface ClassBuilder {
@NotNull
AnnotationVisitor newAnnotation(@NotNull String desc, boolean visible);
void done();
void done(boolean generateSmapCopyToAnnotation);
@NotNull
ClassVisitor getVisitor();
@@ -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)
}
}
}
@@ -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)
}
}
}
@@ -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
@@ -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<T extends KtPureElement/* TODO: & KtDeclarat
v.visitSMAP(getOrCreateSourceMapper(), !state.getLanguageVersionSettings().supportsFeature(LanguageFeature.CorrectSourceMappingSyntax));
}
v.done();
v.done(state.getGenerateSmapCopyToAnnotation());
}
public void genSimpleMember(@NotNull KtDeclaration declaration) {
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.backend.common.CodegenUtil
import org.jetbrains.kotlin.codegen.context.FieldOwnerContext
import org.jetbrains.kotlin.codegen.context.MethodContext
import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.config.IncrementalCompilation
import org.jetbrains.kotlin.config.JvmAnalysisFlags
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
@@ -345,7 +344,7 @@ class MultifileClassCodegenImpl(
}
private fun done() {
classBuilder.done()
classBuilder.done(state.generateSmapCopyToAnnotation)
if (classBuilder.isComputed) {
state.afterIndependentPart()
}
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.codegen;
import kotlin.text.StringsKt;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.backend.common.CodegenUtil;
import org.jetbrains.kotlin.backend.common.SamType;
import org.jetbrains.kotlin.codegen.context.ClassContext;
import org.jetbrains.kotlin.codegen.context.CodegenContext;
import org.jetbrains.kotlin.codegen.state.GenerationState;
@@ -38,7 +39,6 @@ import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKt;
import org.jetbrains.kotlin.resolve.scopes.MemberScope;
import org.jetbrains.kotlin.storage.LockBasedStorageManager;
import org.jetbrains.kotlin.types.KotlinType;
import org.jetbrains.kotlin.backend.common.SamType;
import org.jetbrains.kotlin.util.OperatorNameConventions;
import org.jetbrains.org.objectweb.asm.Label;
import org.jetbrains.org.objectweb.asm.MethodVisitor;
@@ -166,7 +166,7 @@ public class SamWrapperCodegen {
generateDelegatesToDefaultImpl(asmType, classDescriptor, samType.getClassDescriptor(), functionCodegen, state);
}
cv.done();
cv.done(state.getGenerateSmapCopyToAnnotation());
return asmType;
}
@@ -71,7 +71,7 @@ abstract class SignatureCollectingClassBuilderFactory(
return super.newMethod(origin, access, name, desc, signature, exceptions)
}
override fun done() {
override fun done(generateSmapCopyToAnnotation: Boolean) {
for ((signature, elementsAndDescriptors) in signatures.entrySet()) {
if (elementsAndDescriptors.size == 1) continue // no clash
handleClashingSignatures(ConflictingJvmDeclarationsData(
@@ -82,7 +82,7 @@ abstract class SignatureCollectingClassBuilderFactory(
))
}
onClassDone(classCreatedFor, classInternalName, signatures)
super.done()
super.done(generateSmapCopyToAnnotation)
}
}
@@ -656,7 +656,7 @@ private fun generateLambdaForRunSuspend(
writeSyntheticClassMetadata(lambdaBuilder, state, false)
lambdaBuilder.done()
lambdaBuilder.done(state.generateSmapCopyToAnnotation)
return lambdaBuilder.thisName
}
@@ -729,4 +729,4 @@ fun String.encodedUTF8Size(): Int {
}
}
return result
}
}
@@ -228,7 +228,7 @@ class AnonymousObjectTransformer(
if (continuationClassName == transformationInfo.oldClassName) {
coroutineTransformer.registerClassBuilder(continuationClassName)
} else {
classBuilder.done()
classBuilder.done(state.generateSmapCopyToAnnotation)
}
return transformationResult
@@ -207,7 +207,7 @@ class MethodInliner(
}
for (classBuilder in childInliningContext.continuationBuilders.values) {
classBuilder.done()
classBuilder.done(inliningContext.state.generateSmapCopyToAnnotation)
}
} else {
result.addNotChangedClass(oldClassName)
@@ -104,7 +104,7 @@ class WhenMappingTransformer(
transformedClinit.signature, transformedClinit.exceptions.toTypedArray()
)
transformedClinit.accept(result)
classBuilder.done()
classBuilder.done(state.generateSmapCopyToAnnotation)
return transformationResult
}
@@ -65,7 +65,7 @@ class SamWrapperTransformer(transformationInfo: SamWrapperTransformationInfo, pr
}
}, ClassReader.SKIP_FRAMES)
classBuilder.done()
classBuilder.done(inliningContext.state.generateSmapCopyToAnnotation)
return transformationResult
}
@@ -142,7 +142,7 @@ class CoroutineTransformer(
}
fun replaceFakesWithReals(node: MethodNode) {
findFakeContinuationConstructorClassName(node)?.let(::unregisterClassBuilder)?.let(ClassBuilder::done)
findFakeContinuationConstructorClassName(node)?.let(::unregisterClassBuilder)?.done(state.generateSmapCopyToAnnotation)
replaceFakeContinuationsWithRealOnes(
node, if (!inliningContext.isContinuation) getLastParameterIndex(node.desc, node.access) else 0
)
@@ -322,6 +322,7 @@ class GenerationState private constructor(
val unifiedNullChecks: Boolean =
languageVersionSettings.apiVersion >= 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)
@@ -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 {
}
}
}
}
}
@@ -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<WhenByEnumsMapping> mappings) {
@@ -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 = "<profilerPath:command:outputDir>",
@@ -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);
}
}
@@ -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))
@@ -133,6 +133,9 @@ public class JVMConfigurationKeys {
public static final CompilerConfigurationKey<Boolean> NO_UNIFIED_NULL_CHECKS =
CompilerConfigurationKey.create("Use pre-1.4 exception types in null checks instead of java.lang.NPE");
public static final CompilerConfigurationKey<Boolean> 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<Boolean> USE_OLD_INLINE_CLASSES_MANGLING_SCHEME =
CompilerConfigurationKey.create("Use old, 1.4 version of inline classes mangling scheme");
@@ -215,7 +215,7 @@ class ClassCodegen private constructor(
generateInnerAndOuterClasses()
visitor.done()
visitor.done(state.generateSmapCopyToAnnotation)
jvmSignatureClashDetector.reportErrors(classOrigin)
}
+1
View File
@@ -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=@<fq.name>:{ignore/strict/warn}
Specify behavior for specific Java nullability annotations (provided with fully qualified package name)
@@ -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(
@@ -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<TypeParcelerMappin
}
return serializers
}
}
@@ -78,7 +78,7 @@ abstract class AbstractAndroidOnDestroyClassBuilderInterceptorExtension : ClassB
super.defineClass(origin, version, access, name, signature, superName, interfaces)
}
override fun done() {
override fun done(generateSmapCopyToAnnotation: Boolean) {
if (hasCache && !hasOnDestroy) {
val mv = newMethod(
JvmDeclarationOrigin.NO_ORIGIN, Opcodes.ACC_PUBLIC or Opcodes.ACC_SYNTHETIC, ON_DESTROY_METHOD_NAME, "()V",
@@ -91,7 +91,7 @@ abstract class AbstractAndroidOnDestroyClassBuilderInterceptorExtension : ClassB
mv.visitMaxs(1, 1)
mv.visitEnd()
}
super.done()
super.done(generateSmapCopyToAnnotation)
}
override fun newMethod(
@@ -172,7 +172,7 @@ class JvmAbiClassBuilderInterceptor : ClassBuilderInterceptorExtension {
}
}
override fun done() {
override fun done(generateSmapCopyToAnnotation: Boolean) {
// Remove local or anonymous classes unless they are in the scope of an inline function and
// strip non-inline methods from all other classes.
when {
@@ -185,7 +185,7 @@ class JvmAbiClassBuilderInterceptor : ClassBuilderInterceptorExtension {
abiClassInfo[internalName] = AbiClassInfo.Stripped(methodInfos)
}
}
super.done()
super.done(generateSmapCopyToAnnotation)
}
private val isWhenMappingClass: Boolean
@@ -762,7 +762,7 @@ internal fun createSingletonLambda(
}
writeSyntheticClassMetadata(lambdaClassBuilder, lambdaCodegen.state, false)
lambdaClassBuilder.done()
lambdaClassBuilder.done(lambdaCodegen.state.generateSmapCopyToAnnotation)
return lambdaType
}
@@ -81,7 +81,7 @@ class ParcelizeClinitClassBuilderInterceptorExtension : ClassBuilderInterceptorE
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) {
@@ -94,7 +94,7 @@ class ParcelizeClinitClassBuilderInterceptorExtension : ClassBuilderInterceptorE
}
}
super.done()
super.done(generateSmapCopyToAnnotation)
}
override fun newMethod(
@@ -340,7 +340,7 @@ open class ParcelizeCodegenExtension : ParcelizeExtensionBase, ExpressionCodegen
parcelAsmType, parcelerObject, properties
)
classBuilderForCreator.done()
classBuilderForCreator.done(codegen.state.generateSmapCopyToAnnotation)
}
private fun writeCreatorConstructor(codegen: ImplementationBodyCodegen, creatorClass: ClassDescriptor, creatorAsmType: Type) {