diff --git a/build-common/src/org/jetbrains/kotlin/incremental/ProtoCompareGenerated.kt b/build-common/src/org/jetbrains/kotlin/incremental/ProtoCompareGenerated.kt index f9e0cf05253..ffd07fd4033 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/ProtoCompareGenerated.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/ProtoCompareGenerated.kt @@ -206,6 +206,11 @@ open class ProtoCompareGenerated( if (!checkStringEquals(old.getExtension(JvmProtoBuf.anonymousObjectOriginName), new.getExtension(JvmProtoBuf.anonymousObjectOriginName))) return false } + if (old.hasExtension(JvmProtoBuf.generationOptions) != new.hasExtension(JvmProtoBuf.generationOptions)) return false + if (old.hasExtension(JvmProtoBuf.generationOptions)) { + if (old.getExtension(JvmProtoBuf.generationOptions) != new.getExtension(JvmProtoBuf.generationOptions)) return false + } + if (old.getExtensionCount(JsProtoBuf.classAnnotation) != new.getExtensionCount(JsProtoBuf.classAnnotation)) { return false } @@ -264,6 +269,7 @@ open class ProtoCompareGenerated( JVM_EXT_CLASS_MODULE_NAME, JVM_EXT_CLASS_LOCAL_VARIABLE_LIST, JVM_EXT_ANONYMOUS_OBJECT_ORIGIN_NAME, + JVM_EXT_GENERATION_OPTIONS, JS_EXT_CLASS_ANNOTATION_LIST, JS_EXT_CLASS_CONTAINING_FILE_ID, JAVA_EXT_IS_PACKAGE_PRIVATE_CLASS, @@ -332,6 +338,11 @@ open class ProtoCompareGenerated( if (!checkStringEquals(old.getExtension(JvmProtoBuf.anonymousObjectOriginName), new.getExtension(JvmProtoBuf.anonymousObjectOriginName))) result.add(ProtoBufClassKind.JVM_EXT_ANONYMOUS_OBJECT_ORIGIN_NAME) } + if (old.hasExtension(JvmProtoBuf.generationOptions) != new.hasExtension(JvmProtoBuf.generationOptions)) result.add(ProtoBufClassKind.JVM_EXT_GENERATION_OPTIONS) + if (old.hasExtension(JvmProtoBuf.generationOptions)) { + if (old.getExtension(JvmProtoBuf.generationOptions) != new.getExtension(JvmProtoBuf.generationOptions)) result.add(ProtoBufClassKind.JVM_EXT_GENERATION_OPTIONS) + } + if (old.getExtensionCount(JsProtoBuf.classAnnotation) != new.getExtensionCount(JsProtoBuf.classAnnotation)) { result.add(ProtoBufClassKind.JS_EXT_CLASS_ANNOTATION_LIST) } @@ -1735,6 +1746,10 @@ fun ProtoBuf.Class.hashCode(stringIndexes: (Int) -> Int, fqNameIndexes: (Int) -> hashCode = 31 * hashCode + stringIndexes(getExtension(JvmProtoBuf.anonymousObjectOriginName)) } + if (hasExtension(JvmProtoBuf.generationOptions)) { + hashCode = 31 * hashCode + getExtension(JvmProtoBuf.generationOptions) + } + for(i in 0..getExtensionCount(JsProtoBuf.classAnnotation) - 1) { hashCode = 31 * hashCode + getExtension(JsProtoBuf.classAnnotation, i).hashCode(stringIndexes, fqNameIndexes, typeById) } diff --git a/build-common/src/org/jetbrains/kotlin/incremental/protoDifferenceUtils.kt b/build-common/src/org/jetbrains/kotlin/incremental/protoDifferenceUtils.kt index 4df54345ff2..5631853ea28 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/protoDifferenceUtils.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/protoDifferenceUtils.kt @@ -273,6 +273,10 @@ class DifferenceCalculatorForClass( isClassAffected = true areSubclassesAffected = true } + ProtoBufClassKind.JVM_EXT_GENERATION_OPTIONS -> { + isClassAffected = true + areSubclassesAffected = true + } } } diff --git a/build-common/test/org/jetbrains/kotlin/metadata/jvm/DebugJvmProtoBuf.java b/build-common/test/org/jetbrains/kotlin/metadata/jvm/DebugJvmProtoBuf.java index ea3c339ad86..2876cb3c924 100644 --- a/build-common/test/org/jetbrains/kotlin/metadata/jvm/DebugJvmProtoBuf.java +++ b/build-common/test/org/jetbrains/kotlin/metadata/jvm/DebugJvmProtoBuf.java @@ -18,6 +18,7 @@ public final class DebugJvmProtoBuf { registry.add(org.jetbrains.kotlin.metadata.jvm.DebugJvmProtoBuf.classModuleName); registry.add(org.jetbrains.kotlin.metadata.jvm.DebugJvmProtoBuf.classLocalVariable); registry.add(org.jetbrains.kotlin.metadata.jvm.DebugJvmProtoBuf.anonymousObjectOriginName); + registry.add(org.jetbrains.kotlin.metadata.jvm.DebugJvmProtoBuf.generationOptions); registry.add(org.jetbrains.kotlin.metadata.jvm.DebugJvmProtoBuf.packageModuleName); registry.add(org.jetbrains.kotlin.metadata.jvm.DebugJvmProtoBuf.packageLocalVariable); } @@ -4650,6 +4651,21 @@ public final class DebugJvmProtoBuf { .newFileScopedGeneratedExtension( java.lang.Integer.class, null); + public static final int GENERATION_OPTIONS_FIELD_NUMBER = 104; + /** + * extend .org.jetbrains.kotlin.metadata.Class { ... } + * + *
+   * isFunctionBodyInInterface: 0 if actual body generated in DefaultImpl, 1 - otherwise (in interface default method)
+   * 
+ */ + public static final + org.jetbrains.kotlin.protobuf.GeneratedMessage.GeneratedExtension< + org.jetbrains.kotlin.metadata.DebugProtoBuf.Class, + java.lang.Integer> generationOptions = 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.metadata.Package { ... } @@ -4758,12 +4774,13 @@ public final class DebugJvmProtoBuf { "\'.org.jetbrains.kotlin.metadata.Property", ":P\n\034anonymous_object_origin_name\022$.org.j" + "etbrains.kotlin.metadata.Class\030g \001(\005B\004\230\265" + - "\030\001:I\n\023package_module_name\022&.org.jetbrain" + - "s.kotlin.metadata.Package\030e \001(\005B\004\230\265\030\001:o\n" + - "\026package_local_variable\022&.org.jetbrains." + - "kotlin.metadata.Package\030f \003(\0132\'.org.jetb" + - "rains.kotlin.metadata.PropertyB\022B\020DebugJ" + - "vmProtoBuf" + "\030\001:C\n\022generation_options\022$.org.jetbrains" + + ".kotlin.metadata.Class\030h \001(\005:\0010:I\n\023packa" + + "ge_module_name\022&.org.jetbrains.kotlin.me" + + "tadata.Package\030e \001(\005B\004\230\265\030\001:o\n\026package_lo" + + "cal_variable\022&.org.jetbrains.kotlin.meta" + + "data.Package\030f \003(\0132\'.org.jetbrains.kotli" + + "n.metadata.PropertyB\022B\020DebugJvmProtoBuf" }; org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { @@ -4820,8 +4837,9 @@ public final class DebugJvmProtoBuf { classModuleName.internalInit(descriptor.getExtensions().get(8)); classLocalVariable.internalInit(descriptor.getExtensions().get(9)); anonymousObjectOriginName.internalInit(descriptor.getExtensions().get(10)); - packageModuleName.internalInit(descriptor.getExtensions().get(11)); - packageLocalVariable.internalInit(descriptor.getExtensions().get(12)); + generationOptions.internalInit(descriptor.getExtensions().get(11)); + packageModuleName.internalInit(descriptor.getExtensions().get(12)); + packageLocalVariable.internalInit(descriptor.getExtensions().get(13)); org.jetbrains.kotlin.protobuf.ExtensionRegistry registry = org.jetbrains.kotlin.protobuf.ExtensionRegistry.newInstance(); registry.add(org.jetbrains.kotlin.metadata.DebugExtOptionsProtoBuf.stringIdInTable); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt index 0aedf4021f2..9d833e4e2f3 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt @@ -82,11 +82,17 @@ class JvmSerializerExtension @JvmOverloads constructor( if (moduleName != JvmProtoBufUtil.DEFAULT_MODULE_NAME) { proto.setExtension(JvmProtoBuf.classModuleName, stringTable.getStringIndex(moduleName)) } - + //TODO: local delegated properties val containerAsmType = if (DescriptorUtils.isInterface(descriptor)) typeMapper.mapDefaultImpls(descriptor) else typeMapper.mapClass(descriptor) writeLocalProperties(proto, containerAsmType, JvmProtoBuf.classLocalVariable) writeVersionRequirementForJvmDefaultIfNeeded(descriptor, proto, versionRequirementTable) + + if ((jvmDefaultMode == JvmDefaultMode.ALL_INCOMPATIBLE || jvmDefaultMode == JvmDefaultMode.ALL_COMPATIBILITY) && + isInterface(descriptor) + ) { + proto.setExtension(JvmProtoBuf.generationOptions, JvmFlags.getPropertyFlags(true)) + } } // Interfaces which have @JvmDefault members somewhere in the hierarchy need the compiler 1.2.40+ diff --git a/core/metadata.jvm/src/jvm_metadata.proto b/core/metadata.jvm/src/jvm_metadata.proto index 84d18938f34..40976600c22 100644 --- a/core/metadata.jvm/src/jvm_metadata.proto +++ b/core/metadata.jvm/src/jvm_metadata.proto @@ -127,6 +127,10 @@ extend 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 optional int32 anonymous_object_origin_name = 103 [(string_id_in_table) = true]; + + + // isFunctionBodyInInterface: 0 if actual body generated in DefaultImpl, 1 - otherwise (in interface default method) + optional int32 generation_options = 104 [default = 0]; } extend Package { diff --git a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/JvmProtoBuf.java b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/JvmProtoBuf.java index b66aa41938c..bcb6ed4d3c0 100644 --- a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/JvmProtoBuf.java +++ b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/JvmProtoBuf.java @@ -18,6 +18,7 @@ public final class JvmProtoBuf { registry.add(org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf.classModuleName); registry.add(org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf.classLocalVariable); registry.add(org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf.anonymousObjectOriginName); + registry.add(org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf.generationOptions); registry.add(org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf.packageModuleName); registry.add(org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf.packageLocalVariable); } @@ -3985,6 +3986,26 @@ public final class JvmProtoBuf { 103, org.jetbrains.kotlin.protobuf.WireFormat.FieldType.INT32, java.lang.Integer.class); + public static final int GENERATION_OPTIONS_FIELD_NUMBER = 104; + /** + * extend .org.jetbrains.kotlin.metadata.Class { ... } + * + *
+   * isFunctionBodyInInterface: 0 if actual body generated in DefaultImpl, 1 - otherwise (in interface default method)
+   * 
+ */ + public static final + org.jetbrains.kotlin.protobuf.GeneratedMessageLite.GeneratedExtension< + org.jetbrains.kotlin.metadata.ProtoBuf.Class, + java.lang.Integer> generationOptions = org.jetbrains.kotlin.protobuf.GeneratedMessageLite + .newSingularGeneratedExtension( + org.jetbrains.kotlin.metadata.ProtoBuf.Class.getDefaultInstance(), + 0, + null, + null, + 104, + 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.metadata.Package { ... } diff --git a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmFlags.kt b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmFlags.kt index 9559757ea7d..47849df6bd1 100644 --- a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmFlags.kt +++ b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmFlags.kt @@ -15,6 +15,9 @@ object JvmFlags { val IS_MOVED_FROM_INTERFACE_COMPANION = Flags.FlagField.booleanFirst() - fun getPropertyFlags(isMovedFromInterfaceCompanion: Boolean): Int = - IS_MOVED_FROM_INTERFACE_COMPANION.toFlags(isMovedFromInterfaceCompanion) + fun getPropertyFlags(booleanToIntFlag: Boolean): Int = + IS_MOVED_FROM_INTERFACE_COMPANION.toFlags(booleanToIntFlag) + + //Class + val IS_NEW_PLACE_FOR_BODY_GENERATION = Flags.FlagField.booleanFirst() } diff --git a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmProtoBufUtil.kt b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmProtoBufUtil.kt index 1c3228d7856..603983585a4 100644 --- a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmProtoBufUtil.kt +++ b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmProtoBufUtil.kt @@ -129,4 +129,8 @@ object JvmProtoBufUtil { @JvmStatic fun isMovedFromInterfaceCompanion(proto: ProtoBuf.Property): Boolean = JvmFlags.IS_MOVED_FROM_INTERFACE_COMPANION.get(proto.getExtension(JvmProtoBuf.flags)) + + @JvmStatic + fun isNewPlaceForBodyGeneration(proto: ProtoBuf.Class): Boolean = + JvmFlags.IS_NEW_PLACE_FOR_BODY_GENERATION.get(proto.getExtension(JvmProtoBuf.generationOptions)) }