diff --git a/build-common/src/org/jetbrains/kotlin/incremental/ProtoCompareGenerated.kt b/build-common/src/org/jetbrains/kotlin/incremental/ProtoCompareGenerated.kt
index e8a927ab9cf..0fb64c72cf0 100644
--- a/build-common/src/org/jetbrains/kotlin/incremental/ProtoCompareGenerated.kt
+++ b/build-common/src/org/jetbrains/kotlin/incremental/ProtoCompareGenerated.kt
@@ -200,6 +200,11 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR
}
}
+ if (old.hasExtension(JvmProtoBuf.anonymousObjectOriginName) != new.hasExtension(JvmProtoBuf.anonymousObjectOriginName)) return false
+ if (old.hasExtension(JvmProtoBuf.anonymousObjectOriginName)) {
+ if (!checkStringEquals(old.getExtension(JvmProtoBuf.anonymousObjectOriginName), new.getExtension(JvmProtoBuf.anonymousObjectOriginName))) return false
+ }
+
if (old.getExtensionCount(JsProtoBuf.classAnnotation) != new.getExtensionCount(JsProtoBuf.classAnnotation)) {
return false
}
@@ -249,6 +254,7 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR
VERSION_REQUIREMENT_TABLE,
JVM_EXT_CLASS_MODULE_NAME,
JVM_EXT_CLASS_LOCAL_VARIABLE_LIST,
+ JVM_EXT_ANONYMOUS_OBJECT_ORIGIN_NAME,
JS_EXT_CLASS_ANNOTATION_LIST,
JS_EXT_CLASS_CONTAINING_FILE_ID,
JAVA_EXT_IS_PACKAGE_PRIVATE_CLASS,
@@ -319,6 +325,11 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR
}
}
+ if (old.hasExtension(JvmProtoBuf.anonymousObjectOriginName) != new.hasExtension(JvmProtoBuf.anonymousObjectOriginName)) result.add(ProtoBufClassKind.JVM_EXT_ANONYMOUS_OBJECT_ORIGIN_NAME)
+ if (old.hasExtension(JvmProtoBuf.anonymousObjectOriginName)) {
+ if (!checkStringEquals(old.getExtension(JvmProtoBuf.anonymousObjectOriginName), new.getExtension(JvmProtoBuf.anonymousObjectOriginName))) result.add(ProtoBufClassKind.JVM_EXT_ANONYMOUS_OBJECT_ORIGIN_NAME)
+ }
+
if (old.getExtensionCount(JsProtoBuf.classAnnotation) != new.getExtensionCount(JsProtoBuf.classAnnotation)) {
result.add(ProtoBufClassKind.JS_EXT_CLASS_ANNOTATION_LIST)
}
@@ -1551,6 +1562,10 @@ fun ProtoBuf.Class.hashCode(stringIndexes: (Int) -> Int, fqNameIndexes: (Int) ->
hashCode = 31 * hashCode + getExtension(JvmProtoBuf.classLocalVariable, i).hashCode(stringIndexes, fqNameIndexes)
}
+ if (hasExtension(JvmProtoBuf.anonymousObjectOriginName)) {
+ hashCode = 31 * hashCode + stringIndexes(getExtension(JvmProtoBuf.anonymousObjectOriginName))
+ }
+
for(i in 0..getExtensionCount(JsProtoBuf.classAnnotation) - 1) {
hashCode = 31 * hashCode + getExtension(JsProtoBuf.classAnnotation, i).hashCode(stringIndexes, fqNameIndexes)
}
diff --git a/build-common/src/org/jetbrains/kotlin/incremental/protoDifferenceUtils.kt b/build-common/src/org/jetbrains/kotlin/incremental/protoDifferenceUtils.kt
index 6c070208987..fd983bb45bb 100644
--- a/build-common/src/org/jetbrains/kotlin/incremental/protoDifferenceUtils.kt
+++ b/build-common/src/org/jetbrains/kotlin/incremental/protoDifferenceUtils.kt
@@ -251,6 +251,9 @@ class DifferenceCalculatorForClass(
ProtoBufClassKind.BUILT_INS_EXT_CLASS_ANNOTATION_LIST -> {
isClassAffected = true
}
+ ProtoCompareGenerated.ProtoBufClassKind.JVM_EXT_ANONYMOUS_OBJECT_ORIGIN_NAME -> {
+ // Not affected, this extension is not used in the compiler
+ }
}
}
diff --git a/build-common/test/org/jetbrains/kotlin/serialization/jvm/DebugJvmProtoBuf.java b/build-common/test/org/jetbrains/kotlin/serialization/jvm/DebugJvmProtoBuf.java
index ba6ba876282..6cf872f3600 100644
--- a/build-common/test/org/jetbrains/kotlin/serialization/jvm/DebugJvmProtoBuf.java
+++ b/build-common/test/org/jetbrains/kotlin/serialization/jvm/DebugJvmProtoBuf.java
@@ -15,6 +15,7 @@ public final class DebugJvmProtoBuf {
registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.typeParameterAnnotation);
registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.classModuleName);
registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.classLocalVariable);
+ registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.anonymousObjectOriginName);
registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.packageModuleName);
registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.packageLocalVariable);
}
@@ -4599,6 +4600,22 @@ public final class DebugJvmProtoBuf {
.newFileScopedGeneratedExtension(
org.jetbrains.kotlin.serialization.DebugProtoBuf.Property.class,
org.jetbrains.kotlin.serialization.DebugProtoBuf.Property.getDefaultInstance());
+ public static final int ANONYMOUS_OBJECT_ORIGIN_NAME_FIELD_NUMBER = 103;
+ /**
+ * extend .org.jetbrains.kotlin.serialization.Class { ... }
+ *
+ *
+ * For anonymous objects from bodies of inline functions copied to the use site, the JVM internal name of the original + * anonymous object this class is copied from + *+ */ + public static final + org.jetbrains.kotlin.protobuf.GeneratedMessage.GeneratedExtension< + org.jetbrains.kotlin.serialization.DebugProtoBuf.Class, + java.lang.Integer> anonymousObjectOriginName = org.jetbrains.kotlin.protobuf.GeneratedMessage + .newFileScopedGeneratedExtension( + java.lang.Integer.class, + null); public static final int PACKAGE_MODULE_NAME_FIELD_NUMBER = 101; /** *
extend .org.jetbrains.kotlin.serialization.Package { ... }
@@ -4704,13 +4721,15 @@ public final class DebugJvmProtoBuf {
".serialization.Class\030e \001(\005B\004\230\265\030\001:u\n\024clas" +
"s_local_variable\022).org.jetbrains.kotlin." +
"serialization.Class\030f \003(\0132,.org.jetbrain" +
- "s.kotlin.serialization.Property:N\n\023packa",
- "ge_module_name\022+.org.jetbrains.kotlin.se" +
- "rialization.Package\030e \001(\005B\004\230\265\030\001:y\n\026packa" +
- "ge_local_variable\022+.org.jetbrains.kotlin" +
- ".serialization.Package\030f \003(\0132,.org.jetbr" +
- "ains.kotlin.serialization.PropertyB\022B\020De" +
- "bugJvmProtoBuf"
+ "s.kotlin.serialization.Property:U\n\034anony",
+ "mous_object_origin_name\022).org.jetbrains." +
+ "kotlin.serialization.Class\030g \001(\005B\004\230\265\030\001:N" +
+ "\n\023package_module_name\022+.org.jetbrains.ko" +
+ "tlin.serialization.Package\030e \001(\005B\004\230\265\030\001:y" +
+ "\n\026package_local_variable\022+.org.jetbrains" +
+ ".kotlin.serialization.Package\030f \003(\0132,.or" +
+ "g.jetbrains.kotlin.serialization.Propert" +
+ "yB\022B\020DebugJvmProtoBuf"
};
org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
new org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() {
@@ -4764,8 +4783,9 @@ public final class DebugJvmProtoBuf {
typeParameterAnnotation.internalInit(descriptor.getExtensions().get(5));
classModuleName.internalInit(descriptor.getExtensions().get(6));
classLocalVariable.internalInit(descriptor.getExtensions().get(7));
- packageModuleName.internalInit(descriptor.getExtensions().get(8));
- packageLocalVariable.internalInit(descriptor.getExtensions().get(9));
+ anonymousObjectOriginName.internalInit(descriptor.getExtensions().get(8));
+ packageModuleName.internalInit(descriptor.getExtensions().get(9));
+ packageLocalVariable.internalInit(descriptor.getExtensions().get(10));
org.jetbrains.kotlin.protobuf.ExtensionRegistry registry =
org.jetbrains.kotlin.protobuf.ExtensionRegistry.newInstance();
registry.add(org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.stringIdInTable);
@@ -4774,6 +4794,7 @@ public final class DebugJvmProtoBuf {
registry.add(org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.stringIdInTable);
registry.add(org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.stringIdInTable);
registry.add(org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.stringIdInTable);
+ registry.add(org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.stringIdInTable);
org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor
.internalUpdateFileDescriptor(descriptor, registry);
org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.getDescriptor();
diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java
index fece669dec5..a5f9861f989 100644
--- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java
+++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java
@@ -45,10 +45,7 @@ import org.jetbrains.org.objectweb.asm.*;
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter;
import org.jetbrains.org.objectweb.asm.commons.Method;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.isBoolean;
import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.isPrimitiveClass;
@@ -875,19 +872,24 @@ public class AsmUtil {
@NotNull DescriptorSerializer serializer,
@NotNull MessageLite message
) {
- byte[] bytes = serializer.serialize(message);
+ writeAnnotationData(av, message, (JvmStringTable) serializer.getStringTable());
+ }
- AnnotationVisitor data = av.visitArray(JvmAnnotationNames.METADATA_DATA_FIELD_NAME);
- for (String string : BitEncoding.encodeBytes(bytes)) {
- data.visit(null, string);
+ public static void writeAnnotationData(
+ @NotNull AnnotationVisitor av, @NotNull MessageLite message, @NotNull JvmStringTable stringTable
+ ) {
+ String[] data = BitEncoding.encodeBytes(DescriptorSerializer.serialize(message, stringTable));
+ AnnotationVisitor dataVisitor = av.visitArray(JvmAnnotationNames.METADATA_DATA_FIELD_NAME);
+ for (String string : data) {
+ dataVisitor.visit(null, string);
}
- data.visitEnd();
+ dataVisitor.visitEnd();
- AnnotationVisitor strings = av.visitArray(JvmAnnotationNames.METADATA_STRINGS_FIELD_NAME);
- for (String string : ((JvmStringTable) serializer.getStringTable()).getStrings()) {
- strings.visit(null, string);
+ AnnotationVisitor stringsVisitor = av.visitArray(JvmAnnotationNames.METADATA_STRINGS_FIELD_NAME);
+ for (String string : stringTable.getStrings()) {
+ stringsVisitor.visit(null, string);
}
- strings.visitEnd();
+ stringsVisitor.visitEnd();
}
@NotNull
diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.kt
index 6b2576a3174..b302663f6a2 100644
--- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.kt
+++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.kt
@@ -21,8 +21,18 @@ import org.jetbrains.kotlin.codegen.AsmUtil
import org.jetbrains.kotlin.codegen.ClassBuilder
import org.jetbrains.kotlin.codegen.StackValue
import org.jetbrains.kotlin.codegen.coroutines.COROUTINE_IMPL_ASM_TYPE
+import org.jetbrains.kotlin.codegen.serialization.JvmStringTable
+import org.jetbrains.kotlin.codegen.writeKotlinMetadata
+import org.jetbrains.kotlin.load.java.JvmAnnotationNames
+import org.jetbrains.kotlin.load.kotlin.FileBasedKotlinClass
+import org.jetbrains.kotlin.load.kotlin.JvmNameResolver
+import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader
+import org.jetbrains.kotlin.load.kotlin.header.ReadKotlinClassHeaderAnnotationVisitor
+import org.jetbrains.kotlin.protobuf.MessageLite
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin.Companion.NO_ORIGIN
+import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
+import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil
import org.jetbrains.org.objectweb.asm.*
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
import org.jetbrains.org.objectweb.asm.tree.*
@@ -47,6 +57,7 @@ class AnonymousObjectTransformer(
val innerClassNodes = ArrayListextend .org.jetbrains.kotlin.serialization.Class { ... }
+ *
+ * + * For anonymous objects from bodies of inline functions copied to the use site, the JVM internal name of the original + * anonymous object this class is copied from + *+ */ + public static final + org.jetbrains.kotlin.protobuf.GeneratedMessageLite.GeneratedExtension< + org.jetbrains.kotlin.serialization.ProtoBuf.Class, + java.lang.Integer> anonymousObjectOriginName = org.jetbrains.kotlin.protobuf.GeneratedMessageLite + .newSingularGeneratedExtension( + org.jetbrains.kotlin.serialization.ProtoBuf.Class.getDefaultInstance(), + 0, + null, + null, + 103, + org.jetbrains.kotlin.protobuf.WireFormat.FieldType.INT32, + java.lang.Integer.class); public static final int PACKAGE_MODULE_NAME_FIELD_NUMBER = 101; /** *
extend .org.jetbrains.kotlin.serialization.Package { ... }