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:
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
+15
-8
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user