From 3042a80fafe73ca6f6bec57acfe8009bd5c27b88 Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Wed, 24 Aug 2022 12:30:33 +0000 Subject: [PATCH] KT-39492: Ignore default values from Kotlin Metadata in KotlinMetadataArgumentVisitor ^KT-39492 Fixed ^KTIJ-18094 Fixed ^KTIJ-17632 Fixed Merge-request: KT-MR-6914 --- ...eadKotlinClassHeaderAnnotationVisitor.java | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java index e8ed6294175..f0187c4ee27 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java @@ -134,6 +134,15 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor public void visitEnd() { } + /** + * JVM bytecode format doesn't allow {@code null} as the annotation argument value, so we use the default value of the argument's type + * to signify that the argument is absent. So if we read an empty string, for example, we should interpret it as if there was no + * value at all. + *

+ * If we didn't, it could lead to problems for arguments like {@link ReadKotlinClassHeaderAnnotationVisitor#packageName} + * (corresponding to {@link kotlin.Metadata#pn}): the class could be loaded as if it's JVM package name is the default package, + * which makes no sense and leads to problems in IDE like KT-39492, KTIJ-18094. + */ private class KotlinMetadataArgumentVisitor implements AnnotationArgumentVisitor { @Override public void visit(@Nullable Name name, @Nullable Object value) { @@ -151,7 +160,7 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor } } else if (METADATA_EXTRA_STRING_FIELD_NAME.equals(string)) { - if (value instanceof String) { + if (value instanceof String && !((String) value).isEmpty()) { extraString = (String) value; } } @@ -161,7 +170,7 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor } } else if (METADATA_PACKAGE_NAME_FIELD_NAME.equals(string)) { - if (value instanceof String) { + if (value instanceof String && !((String) value).isEmpty()) { packageName = (String) value; } } @@ -191,7 +200,9 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor return new CollectStringArrayAnnotationVisitor() { @Override protected void visitEnd(@NotNull String[] result) { - data = result; + if (result.length > 0) { + data = result; + } } }; } @@ -201,7 +212,9 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor return new CollectStringArrayAnnotationVisitor() { @Override protected void visitEnd(@NotNull String[] result) { - strings = result; + if (result.length > 0) { + strings = result; + } } }; }