diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java index 4cbcf71719a..f65a8400fd3 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java @@ -785,7 +785,6 @@ public class AsmUtil { public static void writeKotlinSyntheticClassAnnotation(@NotNull ClassBuilder v, @NotNull GenerationState state) { AnnotationVisitor av = v.newAnnotation(asmDescByFqNameWithoutInnerClasses(KOTLIN_SYNTHETIC_CLASS), true); JvmCodegenUtil.writeAbiVersion(av); - JvmCodegenUtil.writeModuleName(av, state); av.visitEnd(); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java index d567d548f02..dbf80d33f1e 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java @@ -59,7 +59,8 @@ import java.util.List; import static org.jetbrains.kotlin.codegen.AsmUtil.*; import static org.jetbrains.kotlin.codegen.ExpressionCodegen.generateClassLiteralReference; -import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.*; +import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isConst; +import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.writeAbiVersion; import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.CLOSURE; import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.asmTypeForAnonymousClass; import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.*; @@ -222,9 +223,7 @@ public class ClosureCodegen extends MemberCodegen { writeKotlinSyntheticClassAnnotation(v, state); final DescriptorSerializer serializer = - DescriptorSerializer.createForLambda( - new JvmSerializerExtension(v.getSerializationBindings(), typeMapper, state.getUseTypeTableInSerializer()) - ); + DescriptorSerializer.createForLambda(new JvmSerializerExtension(v.getSerializationBindings(), state)); final ProtoBuf.Function functionProto = serializer.functionProto(funDescriptor).build(); @@ -240,7 +239,6 @@ public class ClosureCodegen extends MemberCodegen { AnnotationVisitor av = v.getVisitor().visitAnnotation(asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_FUNCTION), true); writeAbiVersion(av); writeAnnotationData(av, serializer, functionProto, true); - writeModuleName(av, state); av.visitEnd(); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index 8c9f9dd278e..acd4192cb0c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -252,9 +252,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { } final DescriptorSerializer serializer = - DescriptorSerializer.create(descriptor, new JvmSerializerExtension( - v.getSerializationBindings(), typeMapper, state.getUseTypeTableInSerializer() - )); + DescriptorSerializer.create(descriptor, new JvmSerializerExtension(v.getSerializationBindings(), state)); final ProtoBuf.Class classProto = serializer.classProto(descriptor).build(); @@ -272,7 +270,6 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { AnnotationVisitor av = v.getVisitor().visitAnnotation(asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_CLASS), true); writeAbiVersion(av); writeAnnotationData(av, serializer, classProto, true); - writeModuleName(av, state); av.visitEnd(); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java index ff11d70615e..a21f884413f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java @@ -28,10 +28,8 @@ import org.jetbrains.kotlin.codegen.context.CodegenContext; import org.jetbrains.kotlin.codegen.context.FacadePartWithSourceFile; import org.jetbrains.kotlin.codegen.context.MethodContext; import org.jetbrains.kotlin.codegen.context.RootContext; -import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.codegen.state.JetTypeMapper; import org.jetbrains.kotlin.descriptors.*; -import org.jetbrains.kotlin.load.java.JvmAbi; import org.jetbrains.kotlin.load.java.JvmAnnotationNames; import org.jetbrains.kotlin.load.kotlin.JvmMetadataVersion; import org.jetbrains.kotlin.load.kotlin.ModuleMapping; @@ -226,11 +224,4 @@ public class JvmCodegenUtil { public static void writeAbiVersion(@NotNull AnnotationVisitor av) { av.visit(JvmAnnotationNames.VERSION_FIELD_NAME, JvmMetadataVersion.INSTANCE.toArray()); } - - public static void writeModuleName(@NotNull AnnotationVisitor av, @NotNull GenerationState state) { - String name = state.getModuleName(); - if (!name.equals(JvmAbi.DEFAULT_MODULE_NAME)) { - av.visit(JvmAnnotationNames.MODULE_NAME_FIELD_NAME, name); - } - } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt index 07b700ff7ae..9fd7450b028 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt @@ -289,7 +289,6 @@ class MultifileClassCodegen( val av = classBuilder.newAnnotation(AsmUtil.asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_MULTIFILE_CLASS), true) JvmCodegenUtil.writeAbiVersion(av) - JvmCodegenUtil.writeModuleName(av, state) writePartNames(av, JvmAnnotationNames.FILE_PART_CLASS_NAMES_FIELD_NAME) av.visitEnd() } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt index 45382359294..f613088af05 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassPartCodegen.kt @@ -84,11 +84,7 @@ class MultifileClassPartCodegen( } } - val bindings = v.serializationBindings - - val serializer = DescriptorSerializer.createTopLevel( - JvmSerializerExtension(bindings, state.typeMapper, state.useTypeTableInSerializer) - ) + val serializer = DescriptorSerializer.createTopLevel(JvmSerializerExtension(v.serializationBindings, state)) val packageProto = serializer.packagePartProto(members).build() writeKotlinMetadata(v, KotlinClassHeader.Kind.MULTIFILE_CLASS_PART) { av -> diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java index 714fed99c23..ad90db77f5e 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartCodegen.java @@ -23,7 +23,6 @@ import kotlin.jvm.functions.Function1; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.codegen.annotation.AnnotatedSimple; import org.jetbrains.kotlin.codegen.context.FieldOwnerContext; -import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings; import org.jetbrains.kotlin.codegen.serialization.JvmSerializerExtension; import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; @@ -47,7 +46,6 @@ import java.util.List; import static org.jetbrains.kotlin.codegen.AsmUtil.asmDescByFqNameWithoutInnerClasses; import static org.jetbrains.kotlin.codegen.AsmUtil.writeAnnotationData; import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.writeAbiVersion; -import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.writeModuleName; import static org.jetbrains.org.objectweb.asm.Opcodes.*; public class PackagePartCodegen extends MemberCodegen { @@ -123,11 +121,8 @@ public class PackagePartCodegen extends MemberCodegen { } } - JvmSerializationBindings bindings = v.getSerializationBindings(); - - final DescriptorSerializer serializer = DescriptorSerializer.createTopLevel(new JvmSerializerExtension( - bindings, state.getTypeMapper(), state.getUseTypeTableInSerializer() - )); + final DescriptorSerializer serializer = + DescriptorSerializer.createTopLevel(new JvmSerializerExtension(v.getSerializationBindings(), state)); final ProtoBuf.Package packageProto = serializer.packagePartProto(members).build(); WriteAnnotationUtilKt.writeKotlinMetadata(v, KotlinClassHeader.Kind.FILE_FACADE, new Function1() { @@ -141,7 +136,6 @@ public class PackagePartCodegen extends MemberCodegen { AnnotationVisitor av = v.newAnnotation(asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_FILE_FACADE), true); writeAbiVersion(av); writeAnnotationData(av, serializer, packageProto, true); - writeModuleName(av, state); av.visitEnd(); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.java index 4b5323b0ca0..0a1a2e46405 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.java @@ -19,9 +19,10 @@ package org.jetbrains.kotlin.codegen.serialization; import com.intellij.openapi.util.Pair; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.codegen.state.JetTypeMapper; +import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor; +import org.jetbrains.kotlin.load.java.JvmAbi; import org.jetbrains.kotlin.load.java.lazy.types.RawTypeCapabilities; import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.serialization.AnnotationSerializer; @@ -41,12 +42,14 @@ public class JvmSerializerExtension extends SerializerExtension { private final StringTable stringTable; private final AnnotationSerializer annotationSerializer; private final boolean useTypeTable; + private final String moduleName; - public JvmSerializerExtension(@NotNull JvmSerializationBindings bindings, @NotNull JetTypeMapper typeMapper, boolean useTypeTable) { + public JvmSerializerExtension(@NotNull JvmSerializationBindings bindings, @NotNull GenerationState state) { this.bindings = bindings; - this.stringTable = new JvmStringTable(typeMapper); + this.stringTable = new JvmStringTable(state.getTypeMapper()); this.annotationSerializer = new AnnotationSerializer(stringTable); - this.useTypeTable = useTypeTable; + this.useTypeTable = state.getUseTypeTableInSerializer(); + this.moduleName = state.getModuleName(); } @NotNull @@ -60,6 +63,20 @@ public class JvmSerializerExtension extends SerializerExtension { return useTypeTable; } + @Override + public void serializeClass(@NotNull ClassDescriptor descriptor, @NotNull ProtoBuf.Class.Builder proto) { + if (!moduleName.equals(JvmAbi.DEFAULT_MODULE_NAME)) { + proto.setExtension(JvmProtoBuf.classModuleName, stringTable.getStringIndex(moduleName)); + } + } + + @Override + public void serializePackage(@NotNull ProtoBuf.Package.Builder proto) { + if (!moduleName.equals(JvmAbi.DEFAULT_MODULE_NAME)) { + proto.setExtension(JvmProtoBuf.packageModuleName, stringTable.getStringIndex(moduleName)); + } + } + @Override public void serializeType(@NotNull KotlinType type, @NotNull ProtoBuf.Type.Builder proto) { // TODO: don't store type annotations in our binary metadata on Java 8, use *TypeAnnotations attributes instead diff --git a/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt b/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt index b5dd0a26172..7dcf6813d6c 100644 --- a/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt +++ b/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt @@ -119,12 +119,13 @@ class BuiltInsSerializer(private val dependOnOldBuiltIns: Boolean) { private val onFileWrite: (bytesWritten: Int) -> Unit ) { private val fqName = packageView.fqName + private val fragments = packageView.fragments private val builtinsMessage = BuiltInsProtoBuf.BuiltIns.newBuilder() - private val extension = BuiltInsSerializerExtension() + private val extension = BuiltInsSerializerExtension(fragments) fun run() { serializeClasses(packageView.memberScope) - serializePackageFragments(packageView.fragments) + serializePackageFragments(fragments) serializeStringTable() serializeBuiltInsFile() } diff --git a/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializerExtension.kt b/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializerExtension.kt index 1e0442225ad..131b6283532 100644 --- a/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializerExtension.kt +++ b/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializerExtension.kt @@ -24,10 +24,12 @@ import org.jetbrains.kotlin.serialization.DescriptorSerializer import org.jetbrains.kotlin.serialization.KotlinSerializerExtensionBase import org.jetbrains.kotlin.serialization.ProtoBuf -class BuiltInsSerializerExtension : KotlinSerializerExtensionBase(BuiltInSerializerProtocol) { +class BuiltInsSerializerExtension( + private val packageFragments: Collection +) : KotlinSerializerExtensionBase(BuiltInSerializerProtocol) { override fun shouldUseTypeTable(): Boolean = true - override fun serializePackage(packageFragments: Collection, proto: ProtoBuf.Package.Builder) { + override fun serializePackage(proto: ProtoBuf.Package.Builder) { if (packageFragments.isEmpty()) return val classes = packageFragments.flatMap { diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java index 584d9e19e32..89d8184b06a 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.java @@ -587,7 +587,7 @@ public class DescriptorSerializer { builder.setTypeTable(typeTableProto); } - extension.serializePackage(fragments, builder); + extension.serializePackage(builder); return builder; } @@ -610,6 +610,8 @@ public class DescriptorSerializer { builder.setTypeTable(typeTableProto); } + extension.serializePackage(builder); + return builder; } diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtension.java b/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtension.java index 5e1ad776be7..eaf76c7a957 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtension.java +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtension.java @@ -20,8 +20,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.types.KotlinType; -import java.util.Collection; - public abstract class SerializerExtension { @NotNull public abstract StringTable getStringTable(); @@ -33,7 +31,7 @@ public abstract class SerializerExtension { public void serializeClass(@NotNull ClassDescriptor descriptor, @NotNull ProtoBuf.Class.Builder proto) { } - public void serializePackage(@NotNull Collection packageFragments, @NotNull ProtoBuf.Package.Builder proto) { + public void serializePackage(@NotNull ProtoBuf.Package.Builder proto) { } public void serializeConstructor(@NotNull ConstructorDescriptor descriptor, @NotNull ProtoBuf.Constructor.Builder proto) { diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/jvm/DebugJvmProtoBuf.java b/compiler/tests/org/jetbrains/kotlin/serialization/jvm/DebugJvmProtoBuf.java index eba2d827f44..998621a521d 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/jvm/DebugJvmProtoBuf.java +++ b/compiler/tests/org/jetbrains/kotlin/serialization/jvm/DebugJvmProtoBuf.java @@ -14,6 +14,8 @@ public final class DebugJvmProtoBuf { registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.isRaw); registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.typeParameterAnnotation); registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.classAnnotation); + registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.classModuleName); + registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.packageModuleName); } public interface StringTableTypesOrBuilder extends com.google.protobuf.MessageOrBuilder { @@ -4601,6 +4603,28 @@ public final class DebugJvmProtoBuf { .newFileScopedGeneratedExtension( org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation.class, org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation.getDefaultInstance()); + public static final int CLASS_MODULE_NAME_FIELD_NUMBER = 101; + /** + * extend .org.jetbrains.kotlin.serialization.Class { ... } + */ + public static final + com.google.protobuf.GeneratedMessage.GeneratedExtension< + org.jetbrains.kotlin.serialization.DebugProtoBuf.Class, + java.lang.Integer> classModuleName = com.google.protobuf.GeneratedMessage + .newFileScopedGeneratedExtension( + java.lang.Integer.class, + null); + public static final int PACKAGE_MODULE_NAME_FIELD_NUMBER = 101; + /** + * extend .org.jetbrains.kotlin.serialization.Package { ... } + */ + public static final + com.google.protobuf.GeneratedMessage.GeneratedExtension< + org.jetbrains.kotlin.serialization.DebugProtoBuf.Package, + java.lang.Integer> packageModuleName = com.google.protobuf.GeneratedMessage + .newFileScopedGeneratedExtension( + java.lang.Integer.class, + null); private static com.google.protobuf.Descriptors.Descriptor internal_static_org_jetbrains_kotlin_serialization_jvm_StringTableTypes_descriptor; private static @@ -4683,7 +4707,11 @@ public final class DebugJvmProtoBuf { "ion:s\n\020class_annotation\022).org.jetbrains." + "kotlin.serialization.Class\030d \003(\0132..org.j" + "etbrains.kotlin.serialization.Annotation" + - "B\022B\020DebugJvmProtoBuf" + ":J\n\021class_module_name\022).org.jetbrains.ko" + + "tlin.serialization.Class\030e \001(\005B\004\230\265\030\001:N\n\023", + "package_module_name\022+.org.jetbrains.kotl" + + "in.serialization.Package\030e \001(\005B\004\230\265\030\001B\022B\020" + + "DebugJvmProtoBuf" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { @@ -4727,12 +4755,16 @@ public final class DebugJvmProtoBuf { isRaw.internalInit(descriptor.getExtensions().get(4)); typeParameterAnnotation.internalInit(descriptor.getExtensions().get(5)); classAnnotation.internalInit(descriptor.getExtensions().get(6)); + classModuleName.internalInit(descriptor.getExtensions().get(7)); + packageModuleName.internalInit(descriptor.getExtensions().get(8)); com.google.protobuf.ExtensionRegistry registry = com.google.protobuf.ExtensionRegistry.newInstance(); 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); + registry.add(org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.stringIdInTable); + registry.add(org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.stringIdInTable); return registry; } }; diff --git a/core/descriptor.loader.java/src/jvm_descriptors.proto b/core/descriptor.loader.java/src/jvm_descriptors.proto index a3e7d9f55b6..0910354e74c 100644 --- a/core/descriptor.loader.java/src/jvm_descriptors.proto +++ b/core/descriptor.loader.java/src/jvm_descriptors.proto @@ -111,4 +111,11 @@ extend TypeParameter { extend Class { repeated Annotation class_annotation = 100; + + // If absent, assumed to be JvmAbi.DEFAULT_MODULE_NAME + optional int32 class_module_name = 101 [(string_id_in_table) = true]; +} + +extend Package { + optional int32 package_module_name = 101 [(string_id_in_table) = true]; } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/JvmAnnotationNames.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/JvmAnnotationNames.java index 65b167626bb..c2c5d413a4c 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/JvmAnnotationNames.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/JvmAnnotationNames.java @@ -49,7 +49,6 @@ public final class JvmAnnotationNames { public static final String METADATA_MULTIFILE_CLASS_NAME_FIELD_NAME = "xs"; public static final String DATA_FIELD_NAME = "data"; public static final String STRINGS_FIELD_NAME = "strings"; - public static final String MODULE_NAME_FIELD_NAME = "moduleName"; public static final Name DEFAULT_ANNOTATION_MEMBER_NAME = Name.identifier("value"); public static final Name DEPRECATED_ANNOTATION_MESSAGE = Name.identifier("message"); public static final Name TARGET_ANNOTATION_MEMBER_NAME = Name.identifier("allowedTargets"); diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/serialization/jvm/JvmProtoBuf.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/serialization/jvm/JvmProtoBuf.java index 362b7abc3dc..842c4a117c0 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/serialization/jvm/JvmProtoBuf.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/serialization/jvm/JvmProtoBuf.java @@ -14,6 +14,8 @@ public final class JvmProtoBuf { registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.isRaw); registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.typeParameterAnnotation); registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.classAnnotation); + registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.classModuleName); + registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.packageModuleName); } public interface StringTableTypesOrBuilder extends com.google.protobuf.MessageLiteOrBuilder { @@ -3816,6 +3818,36 @@ public final class JvmProtoBuf { 100, com.google.protobuf.WireFormat.FieldType.MESSAGE, false); + public static final int CLASS_MODULE_NAME_FIELD_NUMBER = 101; + /** + * extend .org.jetbrains.kotlin.serialization.Class { ... } + */ + public static final + com.google.protobuf.GeneratedMessageLite.GeneratedExtension< + org.jetbrains.kotlin.serialization.ProtoBuf.Class, + java.lang.Integer> classModuleName = com.google.protobuf.GeneratedMessageLite + .newSingularGeneratedExtension( + org.jetbrains.kotlin.serialization.ProtoBuf.Class.getDefaultInstance(), + 0, + null, + null, + 101, + com.google.protobuf.WireFormat.FieldType.INT32); + public static final int PACKAGE_MODULE_NAME_FIELD_NUMBER = 101; + /** + * extend .org.jetbrains.kotlin.serialization.Package { ... } + */ + public static final + com.google.protobuf.GeneratedMessageLite.GeneratedExtension< + org.jetbrains.kotlin.serialization.ProtoBuf.Package, + java.lang.Integer> packageModuleName = com.google.protobuf.GeneratedMessageLite + .newSingularGeneratedExtension( + org.jetbrains.kotlin.serialization.ProtoBuf.Package.getDefaultInstance(), + 0, + null, + null, + 101, + com.google.protobuf.WireFormat.FieldType.INT32); static { } diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/ReflectJvmMapping.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/ReflectJvmMapping.kt index 6937a035a0c..fb55786ab16 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/ReflectJvmMapping.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/ReflectJvmMapping.kt @@ -17,12 +17,16 @@ @file:JvmName("ReflectJvmMapping") package kotlin.reflect.jvm +import org.jetbrains.kotlin.load.java.JvmAbi +import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader +import org.jetbrains.kotlin.load.kotlin.reflect.ReflectKotlinClass +import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf +import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil import java.lang.reflect.* import java.util.* import kotlin.jvm.internal.KotlinFileFacade import kotlin.jvm.internal.Reflection import kotlin.reflect.* -import kotlin.reflect.jvm.internal.KCallableImpl import kotlin.reflect.jvm.internal.KTypeImpl import kotlin.reflect.jvm.internal.asKCallableImpl import kotlin.reflect.jvm.internal.asKPropertyImpl @@ -100,9 +104,19 @@ val Field.kotlinProperty: KProperty<*>? private fun Member.getKPackage(): KDeclarationContainer? { // TODO: support multifile classes - val fileFacade = declaringClass.getAnnotation(KotlinFileFacade::class.java) - return if (fileFacade != null) - Reflection.getOrCreateKotlinPackage(declaringClass, fileFacade.moduleName) + return if (declaringClass.getAnnotation(KotlinFileFacade::class.java) != null) { + val header = ReflectKotlinClass.create(declaringClass)?.classHeader + if (header != null && header.kind == KotlinClassHeader.Kind.FILE_FACADE && header.metadataVersion.isCompatible()) { + // TODO: avoid reading and parsing metadata twice (here and later in KPackageImpl#descriptor) + val (nameResolver, proto) = JvmProtoBufUtil.readPackageDataFrom(header.data!!, header.strings!!) + val moduleName = + if (proto.hasExtension(JvmProtoBuf.packageModuleName)) + nameResolver.getString(proto.getExtension(JvmProtoBuf.packageModuleName)) + else JvmAbi.DEFAULT_MODULE_NAME + Reflection.getOrCreateKotlinPackage(declaringClass, moduleName) + } + else null + } else null } @@ -121,7 +135,7 @@ val Method.kotlinFunction: KFunction<*>? return kotlinPackage.members.filterIsInstance>().firstOrNull { it.javaMethod == this } } - // For static bridge method generated for a jvmStatic function in the companion object, also try to find the latter + // For static bridge method generated for a @JvmStatic function in the companion object, also try to find the latter val companion = declaringClass.kotlin.companionObject if (companion != null) { companion.functions.firstOrNull { diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt index fc381c0e6df..a35914bc592 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt @@ -18,7 +18,6 @@ package kotlin.reflect.jvm.internal import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.PrimitiveType -import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.Visibilities @@ -28,8 +27,6 @@ import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor import org.jetbrains.kotlin.load.java.descriptors.JavaPropertyDescriptor import org.jetbrains.kotlin.load.java.sources.JavaSourceElement import org.jetbrains.kotlin.load.java.structure.reflect.* -import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinarySourceElement -import org.jetbrains.kotlin.load.kotlin.reflect.ReflectKotlinClass import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.platform.JavaToKotlinClassMap import org.jetbrains.kotlin.resolve.DescriptorUtils @@ -39,6 +36,7 @@ import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.deserialization.NameResolver import org.jetbrains.kotlin.serialization.deserialization.TypeTable import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil @@ -46,7 +44,6 @@ import java.lang.reflect.Constructor import java.lang.reflect.Field import java.lang.reflect.Member import java.lang.reflect.Method -import kotlin.jvm.internal.KotlinClass import kotlin.reflect.KotlinReflectionInternalError internal sealed class JvmFunctionSignature { @@ -113,15 +110,16 @@ internal sealed class JvmPropertySignature { else { val (name, desc) = JvmProtoBufUtil.getJvmFieldSignature(proto, nameResolver, typeTable) ?: - throw KotlinReflectionInternalError("No field signature for property: $descriptor") + throw KotlinReflectionInternalError("No field signature for property: $descriptor") val moduleSuffix = if (descriptor.visibility == Visibilities.INTERNAL && - descriptor.containingDeclaration is ClassDescriptor) { - val containingDeclaration = descriptor.containingDeclaration as ClassDescriptor - val sourceElement = containingDeclaration.source as KotlinJvmBinarySourceElement - val klass = (sourceElement.binaryClass as ReflectKotlinClass).klass - val moduleName = klass.getAnnotation(KotlinClass::class.java).moduleName + descriptor.containingDeclaration is DeserializedClassDescriptor) { + val classProto = (descriptor.containingDeclaration as DeserializedClassDescriptor).classProto + val moduleName = + if (classProto.hasExtension(JvmProtoBuf.classModuleName)) + nameResolver.getString(classProto.getExtension(JvmProtoBuf.classModuleName)) + else JvmAbi.DEFAULT_MODULE_NAME "$" + JvmAbi.sanitizeAsJavaIdentifier(moduleName) } else { diff --git a/generators/src/org/jetbrains/kotlin/generators/protobuf/GenerateProtoBufCompare.kt b/generators/src/org/jetbrains/kotlin/generators/protobuf/GenerateProtoBufCompare.kt index 6804b658d4c..f71b2615731 100644 --- a/generators/src/org/jetbrains/kotlin/generators/protobuf/GenerateProtoBufCompare.kt +++ b/generators/src/org/jetbrains/kotlin/generators/protobuf/GenerateProtoBufCompare.kt @@ -349,7 +349,7 @@ class GenerateProtoBufCompare { } override fun printOptionalField() { - p.println("if (old.hasExtension($fullFieldName) != new.hasExtension($fullFieldName)) return false") + p.println("if (old.hasExtension($fullFieldName) != new.hasExtension($fullFieldName)) $statement") p.println("if (old.hasExtension($fullFieldName)) {") p.printlnIfWithComparisonIndent(field, "getExtension($fullFieldName)", statement) p.println("}") diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/ProtoCompareGenerated.kt b/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/ProtoCompareGenerated.kt index ad8bf822ae9..1768649095e 100644 --- a/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/ProtoCompareGenerated.kt +++ b/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/ProtoCompareGenerated.kt @@ -44,12 +44,18 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR if (!checkEquals(old.typeTable, new.typeTable)) return false } + if (old.hasExtension(JvmProtoBuf.packageModuleName) != new.hasExtension(JvmProtoBuf.packageModuleName)) return false + if (old.hasExtension(JvmProtoBuf.packageModuleName)) { + if (!checkStringEquals(old.getExtension(JvmProtoBuf.packageModuleName), new.getExtension(JvmProtoBuf.packageModuleName))) return false + } + return true } enum class ProtoBufPackageKind { FUNCTION_LIST, PROPERTY_LIST, - TYPE_TABLE + TYPE_TABLE, + PACKAGE_MODULE_NAME } fun difference(old: ProtoBuf.Package, new: ProtoBuf.Package): EnumSet { @@ -64,6 +70,11 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR if (!checkEquals(old.typeTable, new.typeTable)) result.add(ProtoBufPackageKind.TYPE_TABLE) } + if (old.hasExtension(JvmProtoBuf.packageModuleName) != new.hasExtension(JvmProtoBuf.packageModuleName)) result.add(ProtoBufPackageKind.PACKAGE_MODULE_NAME) + if (old.hasExtension(JvmProtoBuf.packageModuleName)) { + if (!checkStringEquals(old.getExtension(JvmProtoBuf.packageModuleName), new.getExtension(JvmProtoBuf.packageModuleName))) result.add(ProtoBufPackageKind.PACKAGE_MODULE_NAME) + } + return result } @@ -107,6 +118,11 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR if (!checkEquals(old.getExtension(JvmProtoBuf.classAnnotation, i), new.getExtension(JvmProtoBuf.classAnnotation, i))) return false } + if (old.hasExtension(JvmProtoBuf.classModuleName) != new.hasExtension(JvmProtoBuf.classModuleName)) return false + if (old.hasExtension(JvmProtoBuf.classModuleName)) { + if (!checkStringEquals(old.getExtension(JvmProtoBuf.classModuleName), new.getExtension(JvmProtoBuf.classModuleName))) return false + } + return true } enum class ProtoBufClassKind { @@ -122,7 +138,8 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR PROPERTY_LIST, ENUM_ENTRY_LIST, TYPE_TABLE, - CLASS_ANNOTATION_LIST + CLASS_ANNOTATION_LIST, + CLASS_MODULE_NAME } fun difference(old: ProtoBuf.Class, new: ProtoBuf.Class): EnumSet { @@ -167,6 +184,11 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR if (!checkEquals(old.getExtension(JvmProtoBuf.classAnnotation, i), new.getExtension(JvmProtoBuf.classAnnotation, i))) result.add(ProtoBufClassKind.CLASS_ANNOTATION_LIST) } + if (old.hasExtension(JvmProtoBuf.classModuleName) != new.hasExtension(JvmProtoBuf.classModuleName)) result.add(ProtoBufClassKind.CLASS_MODULE_NAME) + if (old.hasExtension(JvmProtoBuf.classModuleName)) { + if (!checkStringEquals(old.getExtension(JvmProtoBuf.classModuleName), new.getExtension(JvmProtoBuf.classModuleName))) result.add(ProtoBufClassKind.CLASS_MODULE_NAME) + } + return result } @@ -804,6 +826,10 @@ fun ProtoBuf.Package.hashCode(stringIndexes: (Int) -> Int, fqNameIndexes: (Int) hashCode = 31 * hashCode + typeTable.hashCode(stringIndexes, fqNameIndexes) } + if (hasExtension(JvmProtoBuf.packageModuleName)) { + hashCode = 31 * hashCode + stringIndexes(getExtension(JvmProtoBuf.packageModuleName)) + } + return hashCode } @@ -860,6 +886,10 @@ fun ProtoBuf.Class.hashCode(stringIndexes: (Int) -> Int, fqNameIndexes: (Int) -> hashCode = 31 * hashCode + getExtension(JvmProtoBuf.classAnnotation, i).hashCode(stringIndexes, fqNameIndexes) } + if (hasExtension(JvmProtoBuf.classModuleName)) { + hashCode = 31 * hashCode + stringIndexes(getExtension(JvmProtoBuf.classModuleName)) + } + return hashCode }