Write a copy of SMAP to a new annotation

To make it available for dynamically attached JVMTI agents.

`@SourceDebugExtension` annotation value is equal to the
SourceDebugExtension attribute value, which is checked now for all box
tests. The difference is that the annotation stored in the constant
pool, which is available for dynamically attached JVMTI agents.

 #KT-53438 Fixed
This commit is contained in:
Alexander Udalov
2022-07-13 14:10:08 +02:00
parent 1e6f7f6d58
commit 87d3ce6ded
7 changed files with 109 additions and 13 deletions
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.codegen.inline.FileMapping;
import org.jetbrains.kotlin.codegen.inline.SMAPBuilder;
import org.jetbrains.kotlin.codegen.inline.SourceMapper;
import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings;
import org.jetbrains.kotlin.load.java.JvmAnnotationNames;
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin;
import org.jetbrains.org.objectweb.asm.*;
@@ -116,6 +117,14 @@ public abstract class AbstractClassBuilder implements ClassBuilder {
@Override
public void done() {
getVisitor().visitSource(sourceName, debugInfo);
if (debugInfo != null) {
AnnotationVisitor v =
getVisitor().visitAnnotation(JvmAnnotationNames.SOURCE_DEBUG_EXTENSION_DESC, false).visitArray("value");
for (String part : CodegenUtilKt.splitStringConstant(debugInfo)) {
v.visit(null, part);
}
v.visitEnd();
}
getVisitor().visitEnd();
}
@@ -70,15 +70,22 @@ class AnonymousObjectTransformer(
}
override fun visitAnnotation(desc: String, visible: Boolean): AnnotationVisitor? {
if (desc == JvmAnnotationNames.METADATA_DESC) {
// Empty inner class info because no inner classes are used in kotlin.Metadata and its arguments
val innerClassesInfo = FileBasedKotlinClass.InnerClassesInfo()
return FileBasedKotlinClass.convertAnnotationVisitor(metadataReader, desc, innerClassesInfo)
} else if (desc == DEBUG_METADATA_ANNOTATION_ASM_TYPE.descriptor) {
debugMetadataAnnotation = AnnotationNode(desc)
return debugMetadataAnnotation
when (desc) {
JvmAnnotationNames.METADATA_DESC -> {
// Empty inner class info because no inner classes are used in kotlin.Metadata and its arguments
val innerClassesInfo = FileBasedKotlinClass.InnerClassesInfo()
return FileBasedKotlinClass.convertAnnotationVisitor(metadataReader, desc, innerClassesInfo)
}
DEBUG_METADATA_ANNOTATION_ASM_TYPE.descriptor -> {
debugMetadataAnnotation = AnnotationNode(desc)
return debugMetadataAnnotation
}
JvmAnnotationNames.SOURCE_DEBUG_EXTENSION_DESC -> {
// The new value of @SourceDebugExtension will be written along with the new SMAP via ClassBuilder.visitSMAP.
return null
}
else -> return classBuilder.newAnnotation(desc, visible)
}
return classBuilder.newAnnotation(desc, visible)
}
override fun visitMethod(