From 62a7c2d2a4dc2d23e8ed5930b038e5f0ccc91603 Mon Sep 17 00:00:00 2001 From: Vasily Levchenko Date: Wed, 21 Mar 2018 11:59:52 +0300 Subject: [PATCH] [kotlin compiler][update] 1.2.40-dev-1038 --- .../kotlin/backend/konan/descriptors/utils.kt | 8 +- .../serialization/IrDescriptorDeserializer.kt | 20 +- .../serialization/IrDescriptorSerializer.kt | 5 +- .../serialization/KonanClassDataFinder.kt | 20 +- .../KonanDescriptorSerializer.kt | 148 ++++++++----- .../backend/konan/serialization/KonanIr.proto | 4 +- .../konan/serialization/KonanLinkData.proto | 12 +- .../serialization/KonanPackageFragment.kt | 10 +- .../serialization/KonanSerializationUtil.kt | 44 ++-- .../serialization/KonanSerializerExtension.kt | 1 + .../konan/serialization/KonanStringTable.kt | 11 +- .../LocalDeclarationDeserializer.kt | 10 +- .../LocalDeclarationSerializer.kt | 2 +- .../konan/serialization/ProtobufUtil.kt | 8 +- .../konan/serialization/SerializeIr.kt | 10 +- .../konan/serialization/StringTableUtil.kt | 9 +- .../konan/serialization/ext_options.proto1 | 2 +- .../{descriptors.proto1 => metadata.proto1} | 194 ++++++++++++++++-- gradle.properties | 4 +- .../org/jetbrains/kotlin/cli/klib/main.kt | 4 +- 20 files changed, 363 insertions(+), 163 deletions(-) rename backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/{descriptors.proto1 => metadata.proto1} (59%) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/utils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/utils.kt index 7342511abd6..ed0e4477f6a 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/utils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/utils.kt @@ -17,12 +17,10 @@ package org.jetbrains.kotlin.backend.konan.descriptors import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.serialization.deserialization.descriptors.* -import org.jetbrains.kotlin.serialization.KonanLinkData -import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.metadata.KonanLinkData +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor val DeserializedPropertyDescriptor.backingField: PropertyDescriptor? get() = diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrDescriptorDeserializer.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrDescriptorDeserializer.kt index 91df689faf9..96f9a2d55b4 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrDescriptorDeserializer.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrDescriptorDeserializer.kt @@ -19,25 +19,23 @@ package org.jetbrains.kotlin.backend.konan.serialization import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.KonanIrDeserializationException import org.jetbrains.kotlin.backend.konan.descriptors.contributedMethods -import org.jetbrains.kotlin.backend.konan.descriptors.isFunctionInvoke import org.jetbrains.kotlin.backend.konan.descriptors.findPackage -import org.jetbrains.kotlin.backend.konan.llvm.isExported +import org.jetbrains.kotlin.backend.konan.descriptors.isFunctionInvoke import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.ir.expressions.IrLoop +import org.jetbrains.kotlin.metadata.KonanIr +import org.jetbrains.kotlin.metadata.KonanIr.DeclarationDescriptor.DescriptorCase +import org.jetbrains.kotlin.metadata.KonanIr.KotlinDescriptor.Kind.* +import org.jetbrains.kotlin.metadata.ProtoBuf +import org.jetbrains.kotlin.metadata.deserialization.NameResolver +import org.jetbrains.kotlin.metadata.deserialization.NameResolverImpl import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.calls.tasks.createSynthesizedInvokes import org.jetbrains.kotlin.resolve.scopes.MemberScope -import org.jetbrains.kotlin.serialization.KonanIr -import org.jetbrains.kotlin.serialization.KonanIr.KotlinDescriptor -import org.jetbrains.kotlin.serialization.KonanIr.KotlinDescriptor.Kind.* -import org.jetbrains.kotlin.serialization.KonanIr.DeclarationDescriptor.* -import org.jetbrains.kotlin.serialization.KonanLinkData -import org.jetbrains.kotlin.serialization.ProtoBuf -import org.jetbrains.kotlin.serialization.deserialization.NameResolver -import org.jetbrains.kotlin.serialization.deserialization.NameResolverImpl import org.jetbrains.kotlin.serialization.deserialization.descriptors.* -import org.jetbrains.kotlin.types.* +import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.types.isError internal fun DeserializedMemberDescriptor.nameTable(): ProtoBuf.QualifiedNameTable { val pkg = this.findPackage() diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrDescriptorSerializer.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrDescriptorSerializer.kt index 4f9bf075d1b..1950b46a948 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrDescriptorSerializer.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrDescriptorSerializer.kt @@ -17,15 +17,14 @@ package org.jetbrains.kotlin.backend.konan.serialization import org.jetbrains.kotlin.backend.konan.Context -import org.jetbrains.kotlin.backend.konan.descriptors.* +import org.jetbrains.kotlin.backend.konan.descriptors.propertyIfAccessor import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.serialization.KonanDescriptorSerializer import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor import org.jetbrains.kotlin.ir.descriptors.IrTemporaryVariableDescriptor +import org.jetbrains.kotlin.metadata.KonanIr import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.calls.inference.CapturedType import org.jetbrains.kotlin.resolve.calls.inference.isCaptured -import org.jetbrains.kotlin.serialization.KonanIr import org.jetbrains.kotlin.types.KotlinType val DeclarationDescriptor.classOrPackage: DeclarationDescriptor? diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanClassDataFinder.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanClassDataFinder.kt index 9a9aeb91d85..e657bbda252 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanClassDataFinder.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanClassDataFinder.kt @@ -17,24 +17,18 @@ package org.jetbrains.kotlin.backend.konan.serialization import org.jetbrains.kotlin.descriptors.SourceElement -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.metadata.KonanLinkData +import org.jetbrains.kotlin.metadata.deserialization.NameResolver import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter -import org.jetbrains.kotlin.serialization.ClassData -import org.jetbrains.kotlin.serialization.ClassDataWithSource -import org.jetbrains.kotlin.serialization.DescriptorSerializer -import org.jetbrains.kotlin.serialization.KonanLinkData -import org.jetbrains.kotlin.serialization.StringTable -import org.jetbrains.kotlin.serialization.deserialization.NameResolver +import org.jetbrains.kotlin.serialization.deserialization.ClassData import org.jetbrains.kotlin.serialization.deserialization.ClassDataFinder +import org.jetbrains.kotlin.serialization.deserialization.getClassId class KonanClassDataFinder( - private val fragment: KonanLinkData.PackageFragment, + private val fragment: KonanLinkData.LinkDataPackageFragment, private val nameResolver: NameResolver ) : ClassDataFinder { - override fun findClassData(classId: ClassId): ClassDataWithSource? { + override fun findClassData(classId: ClassId): ClassData? { val proto = fragment.classes val nameList = proto.getClassNameList() @@ -47,7 +41,7 @@ class KonanClassDataFinder( if (foundClass == null) error("Could not find data for serialized class ${classId}") - return ClassDataWithSource(ClassData(nameResolver, foundClass), SourceElement.NO_SOURCE) + return ClassData(nameResolver, foundClass, SourceElement.NO_SOURCE) } } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanDescriptorSerializer.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanDescriptorSerializer.kt index 9f50fb9758b..198db93bc23 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanDescriptorSerializer.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanDescriptorSerializer.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2017 JetBrains s.r.o. + * Copyright 2010-2018 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,12 @@ import org.jetbrains.kotlin.builtins.transformSuspendFunctionToRuntimeFunctionTy import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotated +import org.jetbrains.kotlin.metadata.ProtoBuf +import org.jetbrains.kotlin.metadata.deserialization.Flags +import org.jetbrains.kotlin.metadata.serialization.Interner +import org.jetbrains.kotlin.metadata.serialization.MutableTypeTable +import org.jetbrains.kotlin.metadata.serialization.MutableVersionRequirementTable +import org.jetbrains.kotlin.metadata.serialization.StringTable import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.protobuf.MessageLite @@ -32,15 +38,17 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils.isEnumEntry import org.jetbrains.kotlin.resolve.MemberComparator import org.jetbrains.kotlin.resolve.RequireKotlinNames +import org.jetbrains.kotlin.resolve.calls.components.isActualParameterWithExpectedDefault import org.jetbrains.kotlin.resolve.checkers.KotlinVersionStringAnnotationValueChecker import org.jetbrains.kotlin.resolve.constants.EnumValue import org.jetbrains.kotlin.resolve.constants.IntValue import org.jetbrains.kotlin.resolve.constants.NullValue import org.jetbrains.kotlin.resolve.constants.StringValue +import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags import org.jetbrains.kotlin.serialization.deserialization.descriptors.VersionRequirement import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.typeUtil.contains -import org.jetbrains.kotlin.utils.Interner +import org.jetbrains.kotlin.metadata.serialization.* import java.io.ByteArrayOutputStream import java.util.* @@ -52,18 +60,13 @@ class KonanDescriptorSerializer private constructor( private val versionRequirementTable: MutableVersionRequirementTable, private val serializeTypeTableToFunction: Boolean ) { - fun serialize(message: MessageLite): ByteArray { - return ByteArrayOutputStream().apply { - stringTable.serializeTo(this) - message.writeTo(this) - }.toByteArray() - } + private val contractSerializer = ContractSerializer() fun createChildSerializer(descriptor: DeclarationDescriptor): KonanDescriptorSerializer = KonanDescriptorSerializer(descriptor, Interner(typeParameters), extension, typeTable, versionRequirementTable, serializeTypeTableToFunction = false) - val stringTable: StringTable + val stringTable: DescriptorAwareStringTable get() = extension.stringTable private fun useTypeTable(): Boolean = extension.shouldUseTypeTable() @@ -72,9 +75,11 @@ class KonanDescriptorSerializer private constructor( val builder = ProtoBuf.Class.newBuilder() val flags = Flags.getClassFlags( - hasAnnotations(classDescriptor), classDescriptor.visibility, classDescriptor.modality, classDescriptor.kind, - classDescriptor.isInner, classDescriptor.isCompanionObject, classDescriptor.isData, classDescriptor.isExternal, - classDescriptor.isExpect, classDescriptor.isInline + hasAnnotations(classDescriptor), + ProtoEnumFlags.visibility(normalizeVisibility(classDescriptor)), + ProtoEnumFlags.modality(classDescriptor.modality), + ProtoEnumFlags.classKind(classDescriptor.kind, classDescriptor.isCompanionObject), + classDescriptor.isInner, classDescriptor.isData, classDescriptor.isExternal, classDescriptor.isExpect, classDescriptor.isInline ) if (flags != builder.flags) { builder.flags = flags @@ -102,18 +107,24 @@ class KonanDescriptorSerializer private constructor( builder.addConstructor(constructorProto(descriptor)) } - for (descriptor in sort(DescriptorUtils.getAllDescriptors(classDescriptor.defaultType.memberScope))) { - if (descriptor is CallableMemberDescriptor) { - if (descriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) continue + val callableMembers = + extension.customClassMembersProducer?.getCallableMembers(classDescriptor) + ?: sort( + DescriptorUtils.getAllDescriptors(classDescriptor.defaultType.memberScope) + .filterIsInstance() + ) - when (descriptor) { - is PropertyDescriptor -> builder.addProperty(propertyProto(descriptor)) - is FunctionDescriptor -> builder.addFunction(functionProto(descriptor)) - } + for (descriptor in callableMembers) { + if (descriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) continue + + when (descriptor) { + is PropertyDescriptor -> builder.addProperty(propertyProto(descriptor)) + is FunctionDescriptor -> builder.addFunction(functionProto(descriptor)) } } - for (descriptor in sort(DescriptorUtils.getAllDescriptors(classDescriptor.unsubstitutedInnerClassesScope))) { + val nestedClassifiers = sort(DescriptorUtils.getAllDescriptors(classDescriptor.unsubstitutedInnerClassesScope)) + for (descriptor in nestedClassifiers) { if (descriptor is TypeAliasDescriptor) { builder.addTypeAlias(typeAliasProto(descriptor)) } @@ -153,7 +164,6 @@ class KonanDescriptorSerializer private constructor( } extension.serializeClass(classDescriptor, builder) - return builder } @@ -164,15 +174,18 @@ class KonanDescriptorSerializer private constructor( var hasGetter = false var hasSetter = false - val lateInit = descriptor.isLateInit - val isConst = descriptor.isConst val compileTimeConstant = descriptor.compileTimeInitializer val hasConstant = compileTimeConstant != null && compileTimeConstant !is NullValue val hasAnnotations = descriptor.annotations.getAllAnnotations().isNotEmpty() - val propertyFlags = Flags.getAccessorFlags(hasAnnotations, descriptor.visibility, descriptor.modality, false, false, false) + val propertyFlags = Flags.getAccessorFlags( + hasAnnotations, + ProtoEnumFlags.visibility(normalizeVisibility(descriptor)), + ProtoEnumFlags.modality(descriptor.modality), + false, false, false + ) val getter = descriptor.getter if (getter != null) { @@ -200,9 +213,12 @@ class KonanDescriptorSerializer private constructor( } val flags = Flags.getPropertyFlags( - hasAnnotations, descriptor.visibility, descriptor.modality, descriptor.kind, descriptor.isVar, - hasGetter, hasSetter, hasConstant, isConst, lateInit, descriptor.isExternal, - @Suppress("DEPRECATION") descriptor.isDelegated, descriptor.isExpect + hasAnnotations, + ProtoEnumFlags.visibility(normalizeVisibility(descriptor)), + ProtoEnumFlags.modality(descriptor.modality), + ProtoEnumFlags.memberKind(descriptor.kind), + descriptor.isVar, hasGetter, hasSetter, hasConstant, descriptor.isConst, descriptor.isLateInit, descriptor.isExternal, + @Suppress("DEPRECATION") descriptor.isDelegated, descriptor.isExpect ) if (flags != builder.flags) { builder.flags = flags @@ -238,8 +254,10 @@ class KonanDescriptorSerializer private constructor( else if (descriptor.isSuspendOrHasSuspendTypesInSignature()) { builder.versionRequirement = writeVersionRequirement(LanguageFeature.Coroutines) } + extension.serializeProperty(descriptor, builder) + /* Konan specific chunk */ if (extension is IrAwareExtension) { descriptor.getter?.onlyIf({needsSerializedIr}) { extension.addGetterIR(builder, @@ -254,15 +272,25 @@ class KonanDescriptorSerializer private constructor( return builder } + private fun normalizeVisibility(descriptor: DeclarationDescriptorWithVisibility) = + // It can be necessary for Java classes serialization having package-private visibility + if (extension.shouldUseNormalizedVisibility()) + descriptor.visibility.normalize() + else + descriptor.visibility + fun functionProto(descriptor: FunctionDescriptor): ProtoBuf.Function.Builder { val builder = ProtoBuf.Function.newBuilder() val local = createChildSerializer(descriptor) val flags = Flags.getFunctionFlags( - hasAnnotations(descriptor), descriptor.visibility, descriptor.modality, descriptor.kind, descriptor.isOperator, - descriptor.isInfix, descriptor.isInline, descriptor.isTailrec, descriptor.isExternal, descriptor.isSuspend, - descriptor.isExpect + hasAnnotations(descriptor), + ProtoEnumFlags.visibility(normalizeVisibility(descriptor)), + ProtoEnumFlags.modality(descriptor.modality), + ProtoEnumFlags.memberKind(descriptor.kind), + descriptor.isOperator, descriptor.isInfix, descriptor.isInline, descriptor.isTailrec, descriptor.isExternal, + descriptor.isSuspend, descriptor.isExpect ) if (flags != builder.flags) { builder.flags = flags @@ -310,8 +338,12 @@ class KonanDescriptorSerializer private constructor( builder.versionRequirement = writeVersionRequirement(LanguageFeature.Coroutines) } + // TODO: K/N & Contracts??? + // contractSerializer.serializeContractOfFunctionIfAny(descriptor, builder, this) + // extension.serializeFunction(descriptor, builder) + /* Konan specific chunk */ if (extension is IrAwareExtension && descriptor.needsSerializedIr) { extension.addFunctionIR(builder, extension.serializeInlineBody(descriptor, local)) @@ -325,7 +357,9 @@ class KonanDescriptorSerializer private constructor( val local = createChildSerializer(descriptor) - val flags = Flags.getConstructorFlags(hasAnnotations(descriptor), descriptor.visibility, !descriptor.isPrimary) + val flags = Flags.getConstructorFlags( + hasAnnotations(descriptor), ProtoEnumFlags.visibility(normalizeVisibility(descriptor)), !descriptor.isPrimary + ) if (flags != builder.flags) { builder.flags = flags } @@ -344,6 +378,7 @@ class KonanDescriptorSerializer private constructor( extension.serializeConstructor(descriptor, builder) + /* Konan specific chunk */ if (extension is IrAwareExtension && descriptor.needsSerializedIr) { extension.addConstructorIR(builder, extension.serializeInlineBody(descriptor, local)) @@ -366,7 +401,7 @@ class KonanDescriptorSerializer private constructor( val builder = ProtoBuf.TypeAlias.newBuilder() val local = createChildSerializer(descriptor) - val flags = Flags.getTypeAliasFlags(hasAnnotations(descriptor), descriptor.visibility) + val flags = Flags.getTypeAliasFlags(hasAnnotations(descriptor), ProtoEnumFlags.visibility(normalizeVisibility(descriptor))) if (flags != builder.flags) { builder.flags = flags } @@ -393,6 +428,11 @@ class KonanDescriptorSerializer private constructor( builder.setExpandedType(local.type(expandedType)) } + val requirement = serializeVersionRequirement(descriptor) + if (requirement != null) { + builder.versionRequirement = requirement + } + builder.addAllAnnotation(descriptor.annotations.map { extension.annotationSerializer.serializeAnnotation(it) }) return builder @@ -408,9 +448,10 @@ class KonanDescriptorSerializer private constructor( private fun valueParameter(descriptor: ValueParameterDescriptor): ProtoBuf.ValueParameter.Builder { val builder = ProtoBuf.ValueParameter.newBuilder() + val declaresDefaultValue = descriptor.declaresDefaultValue() || descriptor.isActualParameterWithExpectedDefault + val flags = Flags.getValueParameterFlags( - hasAnnotations(descriptor), descriptor.declaresDefaultValue(), - descriptor.isCrossinline, descriptor.isNoinline + hasAnnotations(descriptor), declaresDefaultValue, descriptor.isCrossinline, descriptor.isNoinline ) if (flags != builder.flags) { builder.flags = flags @@ -472,9 +513,10 @@ class KonanDescriptorSerializer private constructor( return builder } + /* Konan needs public modifier */ public fun typeId(type: KotlinType) = typeTable[type(type)] - private fun type(type: KotlinType): ProtoBuf.Type.Builder { + internal fun type(type: KotlinType): ProtoBuf.Type.Builder { val builder = ProtoBuf.Type.newBuilder() if (type.isError) { @@ -650,17 +692,17 @@ class KonanDescriptorSerializer private constructor( val level = (args[RequireKotlinNames.LEVEL] as? EnumValue)?.enumEntryName?.asString() when (level) { - DeprecationLevel.ERROR.toString() -> { /* ERROR is the default level */ } - DeprecationLevel.WARNING.toString() -> proto.level = ProtoBuf.VersionRequirement.Level.WARNING - DeprecationLevel.HIDDEN.toString() -> proto.level = ProtoBuf.VersionRequirement.Level.HIDDEN + DeprecationLevel.ERROR.name -> { /* ERROR is the default level */ } + DeprecationLevel.WARNING.name -> proto.level = ProtoBuf.VersionRequirement.Level.WARNING + DeprecationLevel.HIDDEN.name -> proto.level = ProtoBuf.VersionRequirement.Level.HIDDEN } val versionKind = (args[RequireKotlinNames.VERSION_KIND] as? EnumValue)?.enumEntryName?.asString() when (versionKind) { - ProtoBuf.VersionRequirement.VersionKind.LANGUAGE_VERSION.toString() -> { /* LANGUAGE_VERSION is the default kind */ } - ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION.toString() -> + ProtoBuf.VersionRequirement.VersionKind.LANGUAGE_VERSION.name -> { /* LANGUAGE_VERSION is the default kind */ } + ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION.name -> proto.versionKind = ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION - ProtoBuf.VersionRequirement.VersionKind.API_VERSION.toString() -> + ProtoBuf.VersionRequirement.VersionKind.API_VERSION.name -> proto.versionKind = ProtoBuf.VersionRequirement.VersionKind.API_VERSION } @@ -681,6 +723,15 @@ class KonanDescriptorSerializer private constructor( private fun getTypeParameterId(descriptor: TypeParameterDescriptor): Int = typeParameters.intern(descriptor) + private fun getAccessorFlags(accessor: PropertyAccessorDescriptor): Int = Flags.getAccessorFlags( + hasAnnotations(accessor), + ProtoEnumFlags.visibility(normalizeVisibility(accessor)), + ProtoEnumFlags.modality(accessor.modality), + !accessor.isDefault, + accessor.isExternal, + accessor.isInline + ) + companion object { @JvmStatic fun createTopLevel(extension: SerializerExtension): KonanDescriptorSerializer { @@ -719,15 +770,12 @@ class KonanDescriptorSerializer private constructor( return serializer } - private fun getAccessorFlags(accessor: PropertyAccessorDescriptor): Int { - return Flags.getAccessorFlags( - hasAnnotations(accessor), - accessor.visibility, - accessor.modality, - !accessor.isDefault, - accessor.isExternal, - accessor.isInline - ) + @JvmStatic + fun serialize(message: MessageLite, stringTable: StringTable): ByteArray { + return ByteArrayOutputStream().apply { + stringTable.serializeTo(this) + message.writeTo(this) + }.toByteArray() } private fun variance(variance: Variance): ProtoBuf.TypeParameter.Variance = when (variance) { diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIr.proto b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIr.proto index 090ddf2c912..30e7c542c91 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIr.proto +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIr.proto @@ -1,8 +1,8 @@ syntax = "proto2"; -package org.jetbrains.kotlin.serialization; +package org.jetbrains.kotlin.metadata; -import "org/jetbrains/kotlin/backend/konan/serialization/descriptors.proto1"; +import "org/jetbrains/kotlin/backend/konan/serialization/metadata.proto1"; option java_outer_classname = "KonanIr"; option optimize_for = LITE_RUNTIME; diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanLinkData.proto b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanLinkData.proto index d09842233c1..2eab2646038 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanLinkData.proto +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanLinkData.proto @@ -1,6 +1,6 @@ syntax = "proto2"; -package org.jetbrains.kotlin.serialization; +package org.jetbrains.kotlin.metadata; // This, and all the rest of the included proto files have ".proto1" extension. // That allows us to construct the current file, @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.serialization; // The issue here is that we need to co-exist with the big Kotlin, // in the same namespace of renamed org.jetbrains.kotlin.protobuf packages. // In case we merge to the main Kotlin workspace the scheme will be simplified. -import "org/jetbrains/kotlin/backend/konan/serialization/descriptors.proto1"; +import "org/jetbrains/kotlin/backend/konan/serialization/metadata.proto1"; option java_outer_classname = "KonanLinkData"; option optimize_for = LITE_RUNTIME; @@ -71,11 +71,11 @@ message InlineIrBody { // Konan Binary Linkdata structures. -message PackageFragment { +message LinkDataPackageFragment { // Make if an index? required string fq_name = 1; required Package package = 4; - required Classes classes = 5; + required LinkDataClasses classes = 5; required bool is_empty = 6; // To construct name resolver @@ -83,13 +83,13 @@ message PackageFragment { required StringTable string_table = 3; } -message Classes { +message LinkDataClasses { // Index in the QualifiedNameIndex table. repeated int32 class_name = 1; repeated Class classes = 2; } -message Library { +message LinkDataLibrary { required string module_name = 1; repeated string package_fragment_name = 2; repeated string empty_package = 3; diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanPackageFragment.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanPackageFragment.kt index 948d91d72c3..8fd21c2e9e7 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanPackageFragment.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanPackageFragment.kt @@ -20,10 +20,12 @@ import org.jetbrains.kotlin.backend.konan.library.KonanLibraryReader import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.serialization.KonanLinkData +import org.jetbrains.kotlin.metadata.KonanLinkData import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragment -import org.jetbrains.kotlin.serialization.deserialization.NameResolverImpl +import org.jetbrains.kotlin.metadata.deserialization.NameResolverImpl import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope +import org.jetbrains.kotlin.serialization.deserialization.getClassId +import org.jetbrains.kotlin.serialization.deserialization.getName import org.jetbrains.kotlin.storage.StorageManager class KonanPackageFragment( @@ -34,11 +36,11 @@ class KonanPackageFragment( // The proto field is lazy so that we can load only needed // packages from the library. - private val protoForNames: KonanLinkData.PackageFragment by lazy { + private val protoForNames: KonanLinkData.LinkDataPackageFragment by lazy { parsePackageFragment(reader.packageMetadata(fqNameString)) } - val proto: KonanLinkData.PackageFragment get() = protoForNames.also { + val proto: KonanLinkData.LinkDataPackageFragment get() = protoForNames.also { reader.markPackageAccessed(fqNameString) } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializationUtil.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializationUtil.kt index 9fdea88795a..4ca604973c9 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializationUtil.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializationUtil.kt @@ -16,46 +16,32 @@ package org.jetbrains.kotlin.backend.konan.serialization -import org.jetbrains.kotlin.backend.konan.* +import org.jetbrains.kotlin.backend.konan.Context +import org.jetbrains.kotlin.backend.konan.createInteropLibrary import org.jetbrains.kotlin.backend.konan.descriptors.DeserializedKonanModule import org.jetbrains.kotlin.backend.konan.descriptors.createKonanModuleDescriptor import org.jetbrains.kotlin.backend.konan.descriptors.isExpectMember import org.jetbrains.kotlin.backend.konan.library.KonanLibraryReader import org.jetbrains.kotlin.backend.konan.library.LinkData -import org.jetbrains.kotlin.backend.konan.llvm.base64Decode -import org.jetbrains.kotlin.backend.konan.llvm.base64Encode -import org.jetbrains.kotlin.backend.konan.llvm.isExported -import org.jetbrains.kotlin.config.CompilerConfiguration -import org.jetbrains.kotlin.config.LanguageVersion import org.jetbrains.kotlin.config.LanguageVersionSettings -import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl -import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl import org.jetbrains.kotlin.incremental.components.LookupTracker -import org.jetbrains.kotlin.ir.descriptors.IrTemporaryVariableDescriptor +import org.jetbrains.kotlin.metadata.KonanLinkData +import org.jetbrains.kotlin.metadata.KonanLinkData.* +import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter -import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.serialization.KonanDescriptorSerializer -import org.jetbrains.kotlin.serialization.KonanLinkData -import org.jetbrains.kotlin.serialization.KonanLinkData.* -import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.deserialization.* import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.SimpleType -import java.util.zip.GZIPInputStream -import java.util.zip.GZIPOutputStream -import java.io.InputStream -import java.io.ByteArrayInputStream -import java.io.ByteArrayOutputStream /* * This is Konan specific part of public descriptor @@ -115,12 +101,12 @@ fun createKonanPackageFragmentProvider( return provider } -public fun parsePackageFragment(packageData: ByteArray): PackageFragment = - PackageFragment.parseFrom(packageData, +public fun parsePackageFragment(packageData: ByteArray): LinkDataPackageFragment = + LinkDataPackageFragment.parseFrom(packageData, KonanSerializerProtocol.extensionRegistry) -public fun parseModuleHeader(libraryData: ByteArray): Library = - Library.parseFrom(libraryData, +public fun parseModuleHeader(libraryData: ByteArray): LinkDataLibrary = + LinkDataLibrary.parseFrom(libraryData, KonanSerializerProtocol.extensionRegistry) public fun emptyPackages(libraryData: ByteArray) @@ -161,7 +147,7 @@ internal class KonanSerializationUtil(val context: Context) { var classSerializer: KonanDescriptorSerializer = topSerializer fun serializeClass(packageName: FqName, - builder: KonanLinkData.Classes.Builder, + builder: KonanLinkData.LinkDataClasses.Builder, classDescriptor: ClassDescriptor) { val previousSerializer = classSerializer @@ -185,7 +171,7 @@ internal class KonanSerializationUtil(val context: Context) { } fun serializeClasses(packageName: FqName, - builder: KonanLinkData.Classes.Builder, + builder: KonanLinkData.LinkDataClasses.Builder, descriptors: Collection) { for (descriptor in descriptors) { @@ -196,7 +182,7 @@ internal class KonanSerializationUtil(val context: Context) { } fun serializePackage(fqName: FqName, module: ModuleDescriptor) : - KonanLinkData.PackageFragment? { + KonanLinkData.LinkDataPackageFragment? { // TODO: ModuleDescriptor should be able to return // the package only with the contents of that module, without dependencies @@ -214,7 +200,7 @@ internal class KonanSerializationUtil(val context: Context) { DescriptorUtils.getAllDescriptors(fragment.getMemberScope()) }.filter { !it.isExpectMember } - val classesBuilder = KonanLinkData.Classes.newBuilder() + val classesBuilder = KonanLinkData.LinkDataClasses.newBuilder() serializeClasses(fqName, classesBuilder, classifierDescriptors) val classesProto = classesBuilder.build() @@ -226,7 +212,7 @@ internal class KonanSerializationUtil(val context: Context) { val (stringTableProto, nameTableProto) = strings.buildProto() val isEmpty = members.isEmpty() && classifierDescriptors.isEmpty() - val fragmentBuilder = KonanLinkData.PackageFragment.newBuilder() + val fragmentBuilder = KonanLinkData.LinkDataPackageFragment.newBuilder() val fragmentProto = fragmentBuilder .setPackage(packageProto) @@ -253,7 +239,7 @@ internal class KonanSerializationUtil(val context: Context) { } internal fun serializeModule(moduleDescriptor: ModuleDescriptor): LinkData { - val libraryProto = KonanLinkData.Library.newBuilder() + val libraryProto = KonanLinkData.LinkDataLibrary.newBuilder() libraryProto.moduleName = moduleDescriptor.name.asString() val fragments = mutableListOf() val fragmentNames = mutableListOf() diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializerExtension.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializerExtension.kt index 7ba88cfbf63..ce98b38e804 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializerExtension.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanSerializerExtension.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.backend.konan.serialization import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.metadata.* import org.jetbrains.kotlin.protobuf.ExtensionRegistryLite import org.jetbrains.kotlin.serialization.* import org.jetbrains.kotlin.types.KotlinType diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanStringTable.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanStringTable.kt index 736d75dff83..d0c91ef19d0 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanStringTable.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanStringTable.kt @@ -17,8 +17,11 @@ package org.jetbrains.kotlin.backend.konan.serialization import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.serialization.StringTableImpl import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.descriptorUtil.classId +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.getAllSuperClassifiers import org.jetbrains.kotlin.resolve.descriptorUtil.module @@ -35,20 +38,20 @@ class KonanStringTable : StringTableImpl() { } } - override fun getFqNameIndexOfLocalAnonymousClass(descriptor: ClassifierDescriptorWithTypeParameters): Int { + override fun getLocalClassIdReplacement(descriptor: ClassifierDescriptorWithTypeParameters): ClassId? { return if (descriptor.containingDeclaration is CallableMemberDescriptor) { val superClassifiers = descriptor.getAllSuperClassifiers() .mapNotNull { it as ClassifierDescriptorWithTypeParameters } .filter { it != descriptor } .toList() if (superClassifiers.size == 1) { - getFqNameIndex(superClassifiers[0]) + superClassifiers[0].classId } else { val superClass = superClassifiers.find { !DescriptorUtils.isInterface(it) } - getFqNameIndex(superClass ?: descriptor.module.builtIns.any) + superClass?.classId ?: ClassId.topLevel(descriptor.module.builtIns.any.fqNameSafe) } } else { - super.getFqNameIndexOfLocalAnonymousClass(descriptor) + super.getLocalClassIdReplacement(descriptor) } } } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/LocalDeclarationDeserializer.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/LocalDeclarationDeserializer.kt index 54eff72895f..e04af466d01 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/LocalDeclarationDeserializer.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/LocalDeclarationDeserializer.kt @@ -22,10 +22,12 @@ import org.jetbrains.kotlin.backend.common.push import org.jetbrains.kotlin.backend.konan.descriptors.allContainingDeclarations import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor -import org.jetbrains.kotlin.serialization.Flags -import org.jetbrains.kotlin.serialization.KonanIr -import org.jetbrains.kotlin.serialization.KonanLinkData -import org.jetbrains.kotlin.serialization.ProtoBuf +import org.jetbrains.kotlin.metadata.deserialization.Flags +import org.jetbrains.kotlin.metadata.KonanIr +import org.jetbrains.kotlin.metadata.KonanLinkData +import org.jetbrains.kotlin.metadata.ProtoBuf +import org.jetbrains.kotlin.metadata.deserialization.NameResolverImpl +import org.jetbrains.kotlin.metadata.deserialization.TypeTable import org.jetbrains.kotlin.serialization.deserialization.* import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.VersionRequirementTable diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/LocalDeclarationSerializer.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/LocalDeclarationSerializer.kt index 17a4c282ce9..ac09aa19d58 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/LocalDeclarationSerializer.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/LocalDeclarationSerializer.kt @@ -30,7 +30,7 @@ import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl import org.jetbrains.kotlin.ir.descriptors.IrTemporaryVariableDescriptor import org.jetbrains.kotlin.serialization.KonanDescriptorSerializer -import org.jetbrains.kotlin.serialization.KonanIr +import org.jetbrains.kotlin.metadata.KonanIr import org.jetbrains.kotlin.types.KotlinType /* diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/ProtobufUtil.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/ProtobufUtil.kt index 344499d2154..bb8ecf1d18f 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/ProtobufUtil.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/ProtobufUtil.kt @@ -18,10 +18,10 @@ package org.jetbrains.kotlin.backend.konan.serialization import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.serialization.deserialization.descriptors.* -import org.jetbrains.kotlin.serialization.KonanIr -import org.jetbrains.kotlin.serialization.KonanLinkData -import org.jetbrains.kotlin.serialization.KonanLinkData.* -import org.jetbrains.kotlin.serialization.ProtoBuf +import org.jetbrains.kotlin.metadata.KonanIr +import org.jetbrains.kotlin.metadata.KonanLinkData +import org.jetbrains.kotlin.metadata.KonanLinkData.* +import org.jetbrains.kotlin.metadata.ProtoBuf fun newUniqId(index: Long): KonanIr.UniqId = KonanIr.UniqId.newBuilder().setIndex(index).build() diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/SerializeIr.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/SerializeIr.kt index d5015c0491b..b214ff8a4a2 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/SerializeIr.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/SerializeIr.kt @@ -42,11 +42,11 @@ import org.jetbrains.kotlin.ir.util.createParameterDeclarations import org.jetbrains.kotlin.ir.util.setOverrides import org.jetbrains.kotlin.ir.util.setSuperSymbols import org.jetbrains.kotlin.serialization.KonanDescriptorSerializer -import org.jetbrains.kotlin.serialization.KonanIr -import org.jetbrains.kotlin.serialization.KonanIr.IrConst.ValueCase.* -import org.jetbrains.kotlin.serialization.KonanIr.IrOperation.OperationCase.* -import org.jetbrains.kotlin.serialization.KonanIr.IrVarargElement.VarargElementCase.* -import org.jetbrains.kotlin.serialization.KonanLinkData +import org.jetbrains.kotlin.metadata.KonanIr +import org.jetbrains.kotlin.metadata.KonanIr.IrConst.ValueCase.* +import org.jetbrains.kotlin.metadata.KonanIr.IrOperation.OperationCase.* +import org.jetbrains.kotlin.metadata.KonanIr.IrVarargElement.VarargElementCase.* +import org.jetbrains.kotlin.metadata.KonanLinkData import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassConstructorDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedSimpleFunctionDescriptor diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/StringTableUtil.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/StringTableUtil.kt index 7165dca9d39..5e0a89ab49c 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/StringTableUtil.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/StringTableUtil.kt @@ -18,9 +18,10 @@ package org.jetbrains.kotlin.backend.konan.serialization import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.serialization.ProtoBuf -import org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable.QualifiedName -import org.jetbrains.kotlin.serialization.deserialization.NameResolverImpl +import org.jetbrains.kotlin.metadata.ProtoBuf +import org.jetbrains.kotlin.metadata.ProtoBuf.QualifiedNameTable.QualifiedName +import org.jetbrains.kotlin.metadata.deserialization.NameResolverImpl +import org.jetbrains.kotlin.serialization.deserialization.getClassId // TODO Come up with a better file name. @@ -39,7 +40,7 @@ internal fun NameResolverImpl.getDescriptorByFqNameIndex( QualifiedName.Kind.LOCAL -> return module.findClassAcrossModuleDependencies(this.getClassId(fqNameIndex))!! QualifiedName.Kind.PACKAGE -> - return module.getPackage(packageName) + return module.getPackage(FqName(packageName)) } } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/ext_options.proto1 b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/ext_options.proto1 index c6a865ecd4c..086e3ffa2b2 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/ext_options.proto1 +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/ext_options.proto1 @@ -15,7 +15,7 @@ */ syntax = "proto2"; -package org.jetbrains.kotlin.serialization; +package org.jetbrains.kotlin.metadata; import "org/jetbrains/kotlin/backend/konan/serialization/google_descriptor.proto1"; diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/descriptors.proto1 b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/metadata.proto1 similarity index 59% rename from backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/descriptors.proto1 rename to backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/metadata.proto1 index 115e4c6d72f..0917f4a7022 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/descriptors.proto1 +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/metadata.proto1 @@ -14,8 +14,7 @@ * limitations under the License. */ -syntax = "proto2"; -package org.jetbrains.kotlin.serialization; +package org.jetbrains.kotlin.metadata; import "org/jetbrains/kotlin/backend/konan/serialization/ext_options.proto1"; @@ -122,7 +121,7 @@ message Type { optional Type flexible_upper_bound = 5; optional int32 flexible_upper_bound_id = 8; - // Only one of the following values should be present + // Only one of [class_name, type_parameter, type_parameter_name, type_alias_name] should be present optional int32 class_name = 6 [(fq_name_id_in_table) = true]; optional int32 type_parameter = 7; // id of the type parameter @@ -133,12 +132,18 @@ message Type { // Top level types are always fully expanded optional int32 type_alias_name = 12 [(fq_name_id_in_table) = true]; + // Outer type may be present only if class_name or type_alias_name is present optional Type outer_type = 10; optional int32 outer_type_id = 11; optional Type abbreviated_type = 13; optional int32 abbreviated_type_id = 14; + /* + suspend + */ + optional int32 flags = 1; + extensions 100 to 199; } @@ -157,7 +162,7 @@ message TypeParameter { optional Variance variance = 4 [default = INV]; repeated Type upper_bound = 5; - repeated int32 upper_bound_id = 6; + repeated int32 upper_bound_id = 6 [packed = true]; extensions 100 to 999; } @@ -181,6 +186,9 @@ message Class { ClassKind isInner isData + isExternal + isExpect + isInline */ optional int32 flags = 1 [default = 6 /* public final class, no annotations */]; @@ -202,9 +210,16 @@ message Class { repeated EnumEntry enum_entry = 13; + repeated int32 sealed_subclass_fq_name = 16 [packed = true, (fq_name_id_in_table) = true]; + optional TypeTable type_table = 30; - extensions 100 to 199; + // Index into the VersionRequirementTable + optional int32 version_requirement = 31; + + optional VersionRequirementTable version_requirement_table = 32; + + extensions 100 to 18999; } message Package { @@ -214,6 +229,8 @@ message Package { optional TypeTable type_table = 30; + optional VersionRequirementTable version_requirement_table = 32; + extensions 100 to 199; } @@ -235,7 +252,10 @@ message Constructor { repeated ValueParameter value_parameter = 2; - extensions 100 to 199; + // Index into the VersionRequirementTable + optional int32 version_requirement = 31; + + extensions 100 to 18999; } message Function { @@ -249,6 +269,8 @@ message Function { isInline isTailrec isExternal + isSuspend + isExpect */ optional int32 flags = 9 [default = 6 /* public final function, no annotations */]; optional int32 old_flags = 1 [default = 6]; @@ -267,7 +289,12 @@ message Function { optional TypeTable type_table = 30; - extensions 100 to 199; + // Index into the VersionRequirementTable + optional int32 version_requirement = 31; + + optional Contract contract = 32; + + extensions 100 to 18999; } message Property { @@ -280,8 +307,11 @@ message Property { hasGetter hasSetter isConst - lateinit + isLateinit hasConstant + isExternal + isDelegated + isExpect */ optional int32 flags = 11 [default = 518 /* public (6) final property with getter (512) */]; optional int32 old_flags = 1 [default = 2054]; @@ -305,17 +335,24 @@ message Property { isNotDefault isExternal isInline - */ - optional int32 getter_flags = 7 /* absent => same as property */; - optional int32 setter_flags = 8 /* absent => same as property */; - extensions 100 to 199; + If getter_flags or setter_flags are absent, their value should be computed as follows: + - hasAnnotations, Visibility, Modality have the same value as in the property flags + - all other flags are false + */ + optional int32 getter_flags = 7; + optional int32 setter_flags = 8; + + // Index into the VersionRequirementTable + optional int32 version_requirement = 31; + + extensions 100 to 18999; } message ValueParameter { /* - declaresDefault hasAnnotations + declaresDefault isCrossinline isNoinline */ @@ -351,6 +388,9 @@ message TypeAlias { repeated Annotation annotation = 8; + // Index into the VersionRequirementTable + optional int32 version_requirement = 31; + extensions 100 to 199; } @@ -385,3 +425,131 @@ enum MemberKind { DELEGATION = 2; SYNTHESIZED = 3; } + +message VersionRequirement { + enum Level { + WARNING = 0; + ERROR = 1; + HIDDEN = 2; + } + + enum VersionKind { + LANGUAGE_VERSION = 0; + COMPILER_VERSION = 1; + API_VERSION = 2; + } + + // Kotlin version, since which this declaration is accessible, in the following format (encoded version is "major.minor.patch"): + // (patch << 7) + (minor << 3) + major + // Compilers with version less than this value should report a diagnostic if this declaration is selected as the resolution result + optional int32 version = 1; + + // Version in base 256, in case we run out of space to store the version in the optimized form. Has priority over 'version'. + // (patch << 16) + (minor << 8) + major + optional int32 version_full = 2; + + // Level of the reported diagnostic + optional Level level = 3 [default = ERROR]; + + // Error code, to be looked up on the website + optional int32 error_code = 4; + + // Diagnostic message + optional int32 message = 5 [(string_id_in_table) = true]; + + // Which version is this requirement for. For example, if version_kind = API_VERSION, this declaration requires the API version + // (the "-api-version" argument value when compiling the call site) to be of at least the specified value + optional VersionKind version_kind = 6 [default = LANGUAGE_VERSION]; +} + +message VersionRequirementTable { + repeated VersionRequirement requirement = 1; +} + +// A part of the package, which is used to serialize .kjsm/.meta.js, .kotlin_builtins and .kotlin_metadata files. +// Is not used in the JVM back-end +message PackageFragment { + optional StringTable strings = 1; + optional QualifiedNameTable qualified_names = 2; + + optional Package package = 3; + + repeated Class class = 4; + + extensions 100 to 199; +} + + + +message Contract { + repeated Effect effect = 1; +} + +message Effect { + // This enum controls which effect this message contains and how 'effectConstructorArguments' + // should be parsed. + // Each enum value documented in the following syntax: "EffectName(arg1: T1, arg2: T2, ...)" + // Those arguments are expected to be found in 'effectConstructorArguments' in exactly the same + // order and amount as defined by signature, otherwise message should be dropped. + enum EffectType { + // Returns(value: ConstantValue?) + RETURNS_CONSTANT = 0; + + // CallsInPlace(callable: ParameterReference) + // Additionally, InvocationKind in the field 'kind' may be provided to define exact amount of invocations. + CALLS = 1; + + // ReturnsNotNull() + RETURNS_NOT_NULL = 2; + } + optional EffectType effect_type = 1; + + repeated Expression effect_constructor_argument = 2; + + // If present, then whole message is clause of form 'Effect -> Expression', where 'Effect' + // is given by other fields in this message, and 'Expression' is stored in this field. + optional Expression conclusion_of_conditional_effect = 3; + + enum InvocationKind { + AT_MOST_ONCE = 0; + EXACTLY_ONCE = 1; + AT_LEAST_ONCE = 2; + } + optional InvocationKind kind = 4; +} + +// We use some trickery to optimize memory footprint of contract-expressions: +// exact type of Expression is determined based on its contents. +message Expression { + /* + isNegated => this expression should be negated + isIsNullPredicate => this expression is IsNullPredicate with 'variableName' as argument + */ + optional int32 flags = 1; + + // stored as index in valueParameters list of owner-function in 1-indexation + // Index '0' is reserved for extension receiver + optional int32 value_parameter_reference = 2; + + enum ConstantValue { + TRUE = 0; + FALSE = 1; + NULL = 2; + } + optional ConstantValue constant_value = 3; + + // present => this expression is IsInstancePredicate, with 'variableName' as LHS + // and with type encoded in either one of next two fields as RHS. + optional Type is_instance_type = 4; + optional int32 is_instance_type_id = 5; + + // non-empty => this expression is boolean formula of form 'andArguments[0] && andArguments[1] && ...' + // Additionally, if first argument of formula is primitive expression (i.e. predicate or value), + // it is optimized and embedded straight into this message + repeated Expression and_argument = 6; + + // non-empty => this expression is boolean formula of form 'orArguments[0] || andArguments[1] || ...' + // Additionally, if first argument of formula is primitive expression (i.e. predicate or value), + // it is optimized and embedded straight into this message. + repeated Expression or_argument = 7; +} diff --git a/gradle.properties b/gradle.properties index 960416bd36c..188347dcc2a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,8 +20,8 @@ remoteRoot=konan_tests #kotlinCompilerModule=org.jetbrains.kotlin:kotlin-compiler:1.1-SNAPSHOT # Download artifacts of https://teamcity.jetbrains.com/viewType.html?buildTypeId=Kotlin_120_Compiler testDataVersion=1226829:id -kotlinCompilerRepo=https://teamcity.jetbrains.com/guestAuth/app/rest/builds/buildType:(id:Kotlin_dev_CompilerAllPlugins),number:1.2.40-dev-837/artifacts/content/maven -kotlinVersion=1.2.40-dev-837 +kotlinCompilerRepo=https://teamcity.jetbrains.com/guestAuth/app/rest/builds/buildType:(id:Kotlin_dev_CompilerAllPlugins),number:1.2.40-dev-1038/artifacts/content/maven +kotlinVersion=1.2.40-dev-1038 konanVersion=0.6.1 org.gradle.jvmargs='-Dfile.encoding=UTF-8' diff --git a/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt b/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt index cc57be75487..1b91f39c4d8 100644 --- a/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt +++ b/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt @@ -30,7 +30,7 @@ import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.konan.file.File import org.jetbrains.kotlin.konan.target.Distribution import org.jetbrains.kotlin.konan.target.PlatformManager -import org.jetbrains.kotlin.serialization.KonanLinkData +import org.jetbrains.kotlin.metadata.KonanLinkData import java.lang.System.out import kotlin.system.exitProcess @@ -88,7 +88,7 @@ fun error(text: String) { val defaultRepository = File(File.userHome, ".konan/klib") open class ModuleDeserializer(val library: ByteArray) { - protected val moduleHeader: KonanLinkData.Library + protected val moduleHeader: KonanLinkData.LinkDataLibrary get() = parseModuleHeader(library) val moduleName: String