[kotlin compiler][update] 1.2.40-dev-1038

This commit is contained in:
Vasily Levchenko
2018-03-21 11:59:52 +03:00
committed by Vasily Levchenko
parent f4e9eba447
commit 62a7c2d2a4
20 changed files with 363 additions and 163 deletions
@@ -17,12 +17,10 @@
package org.jetbrains.kotlin.backend.konan.descriptors package org.jetbrains.kotlin.backend.konan.descriptors
import org.jetbrains.kotlin.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.Name
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.metadata.KonanLinkData
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor
val DeserializedPropertyDescriptor.backingField: PropertyDescriptor? val DeserializedPropertyDescriptor.backingField: PropertyDescriptor?
get() = get() =
@@ -19,25 +19,23 @@ package org.jetbrains.kotlin.backend.konan.serialization
import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.Context
import org.jetbrains.kotlin.backend.konan.KonanIrDeserializationException import org.jetbrains.kotlin.backend.konan.KonanIrDeserializationException
import org.jetbrains.kotlin.backend.konan.descriptors.contributedMethods 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.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.descriptors.*
import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.ir.expressions.IrLoop 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.name.Name
import org.jetbrains.kotlin.resolve.calls.tasks.createSynthesizedInvokes import org.jetbrains.kotlin.resolve.calls.tasks.createSynthesizedInvokes
import org.jetbrains.kotlin.resolve.scopes.MemberScope 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.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 { internal fun DeserializedMemberDescriptor.nameTable(): ProtoBuf.QualifiedNameTable {
val pkg = this.findPackage() val pkg = this.findPackage()
@@ -17,15 +17,14 @@
package org.jetbrains.kotlin.backend.konan.serialization package org.jetbrains.kotlin.backend.konan.serialization
import org.jetbrains.kotlin.backend.konan.Context 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.descriptors.*
import org.jetbrains.kotlin.serialization.KonanDescriptorSerializer
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
import org.jetbrains.kotlin.ir.descriptors.IrTemporaryVariableDescriptor import org.jetbrains.kotlin.ir.descriptors.IrTemporaryVariableDescriptor
import org.jetbrains.kotlin.metadata.KonanIr
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.calls.inference.CapturedType import org.jetbrains.kotlin.resolve.calls.inference.CapturedType
import org.jetbrains.kotlin.resolve.calls.inference.isCaptured import org.jetbrains.kotlin.resolve.calls.inference.isCaptured
import org.jetbrains.kotlin.serialization.KonanIr
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
val DeclarationDescriptor.classOrPackage: DeclarationDescriptor? val DeclarationDescriptor.classOrPackage: DeclarationDescriptor?
@@ -17,24 +17,18 @@
package org.jetbrains.kotlin.backend.konan.serialization package org.jetbrains.kotlin.backend.konan.serialization
import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.descriptors.SourceElement
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.metadata.KonanLinkData
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.metadata.deserialization.NameResolver
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.serialization.deserialization.ClassData
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.ClassDataFinder import org.jetbrains.kotlin.serialization.deserialization.ClassDataFinder
import org.jetbrains.kotlin.serialization.deserialization.getClassId
class KonanClassDataFinder( class KonanClassDataFinder(
private val fragment: KonanLinkData.PackageFragment, private val fragment: KonanLinkData.LinkDataPackageFragment,
private val nameResolver: NameResolver private val nameResolver: NameResolver
) : ClassDataFinder { ) : ClassDataFinder {
override fun findClassData(classId: ClassId): ClassDataWithSource? { override fun findClassData(classId: ClassId): ClassData? {
val proto = fragment.classes val proto = fragment.classes
val nameList = proto.getClassNameList() val nameList = proto.getClassNameList()
@@ -47,7 +41,7 @@ class KonanClassDataFinder(
if (foundClass == null) if (foundClass == null)
error("Could not find data for serialized class ${classId}") error("Could not find data for serialized class ${classId}")
return ClassDataWithSource(ClassData(nameResolver, foundClass), SourceElement.NO_SOURCE) return ClassData(nameResolver, foundClass, SourceElement.NO_SOURCE)
} }
} }
@@ -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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotated 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.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.protobuf.MessageLite 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.DescriptorUtils.isEnumEntry
import org.jetbrains.kotlin.resolve.MemberComparator import org.jetbrains.kotlin.resolve.MemberComparator
import org.jetbrains.kotlin.resolve.RequireKotlinNames 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.checkers.KotlinVersionStringAnnotationValueChecker
import org.jetbrains.kotlin.resolve.constants.EnumValue import org.jetbrains.kotlin.resolve.constants.EnumValue
import org.jetbrains.kotlin.resolve.constants.IntValue import org.jetbrains.kotlin.resolve.constants.IntValue
import org.jetbrains.kotlin.resolve.constants.NullValue import org.jetbrains.kotlin.resolve.constants.NullValue
import org.jetbrains.kotlin.resolve.constants.StringValue 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.serialization.deserialization.descriptors.VersionRequirement
import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.typeUtil.contains 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.io.ByteArrayOutputStream
import java.util.* import java.util.*
@@ -52,18 +60,13 @@ class KonanDescriptorSerializer private constructor(
private val versionRequirementTable: MutableVersionRequirementTable, private val versionRequirementTable: MutableVersionRequirementTable,
private val serializeTypeTableToFunction: Boolean private val serializeTypeTableToFunction: Boolean
) { ) {
fun serialize(message: MessageLite): ByteArray { private val contractSerializer = ContractSerializer()
return ByteArrayOutputStream().apply {
stringTable.serializeTo(this)
message.writeTo(this)
}.toByteArray()
}
fun createChildSerializer(descriptor: DeclarationDescriptor): KonanDescriptorSerializer = fun createChildSerializer(descriptor: DeclarationDescriptor): KonanDescriptorSerializer =
KonanDescriptorSerializer(descriptor, Interner(typeParameters), extension, typeTable, versionRequirementTable, KonanDescriptorSerializer(descriptor, Interner(typeParameters), extension, typeTable, versionRequirementTable,
serializeTypeTableToFunction = false) serializeTypeTableToFunction = false)
val stringTable: StringTable val stringTable: DescriptorAwareStringTable
get() = extension.stringTable get() = extension.stringTable
private fun useTypeTable(): Boolean = extension.shouldUseTypeTable() private fun useTypeTable(): Boolean = extension.shouldUseTypeTable()
@@ -72,9 +75,11 @@ class KonanDescriptorSerializer private constructor(
val builder = ProtoBuf.Class.newBuilder() val builder = ProtoBuf.Class.newBuilder()
val flags = Flags.getClassFlags( val flags = Flags.getClassFlags(
hasAnnotations(classDescriptor), classDescriptor.visibility, classDescriptor.modality, classDescriptor.kind, hasAnnotations(classDescriptor),
classDescriptor.isInner, classDescriptor.isCompanionObject, classDescriptor.isData, classDescriptor.isExternal, ProtoEnumFlags.visibility(normalizeVisibility(classDescriptor)),
classDescriptor.isExpect, classDescriptor.isInline ProtoEnumFlags.modality(classDescriptor.modality),
ProtoEnumFlags.classKind(classDescriptor.kind, classDescriptor.isCompanionObject),
classDescriptor.isInner, classDescriptor.isData, classDescriptor.isExternal, classDescriptor.isExpect, classDescriptor.isInline
) )
if (flags != builder.flags) { if (flags != builder.flags) {
builder.flags = flags builder.flags = flags
@@ -102,18 +107,24 @@ class KonanDescriptorSerializer private constructor(
builder.addConstructor(constructorProto(descriptor)) builder.addConstructor(constructorProto(descriptor))
} }
for (descriptor in sort(DescriptorUtils.getAllDescriptors(classDescriptor.defaultType.memberScope))) { val callableMembers =
if (descriptor is CallableMemberDescriptor) { extension.customClassMembersProducer?.getCallableMembers(classDescriptor)
if (descriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) continue ?: sort(
DescriptorUtils.getAllDescriptors(classDescriptor.defaultType.memberScope)
.filterIsInstance<CallableMemberDescriptor>()
)
when (descriptor) { for (descriptor in callableMembers) {
is PropertyDescriptor -> builder.addProperty(propertyProto(descriptor)) if (descriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) continue
is FunctionDescriptor -> builder.addFunction(functionProto(descriptor))
} 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) { if (descriptor is TypeAliasDescriptor) {
builder.addTypeAlias(typeAliasProto(descriptor)) builder.addTypeAlias(typeAliasProto(descriptor))
} }
@@ -153,7 +164,6 @@ class KonanDescriptorSerializer private constructor(
} }
extension.serializeClass(classDescriptor, builder) extension.serializeClass(classDescriptor, builder)
return builder return builder
} }
@@ -164,15 +174,18 @@ class KonanDescriptorSerializer private constructor(
var hasGetter = false var hasGetter = false
var hasSetter = false var hasSetter = false
val lateInit = descriptor.isLateInit
val isConst = descriptor.isConst
val compileTimeConstant = descriptor.compileTimeInitializer val compileTimeConstant = descriptor.compileTimeInitializer
val hasConstant = compileTimeConstant != null && compileTimeConstant !is NullValue val hasConstant = compileTimeConstant != null && compileTimeConstant !is NullValue
val hasAnnotations = descriptor.annotations.getAllAnnotations().isNotEmpty() 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 val getter = descriptor.getter
if (getter != null) { if (getter != null) {
@@ -200,9 +213,12 @@ class KonanDescriptorSerializer private constructor(
} }
val flags = Flags.getPropertyFlags( val flags = Flags.getPropertyFlags(
hasAnnotations, descriptor.visibility, descriptor.modality, descriptor.kind, descriptor.isVar, hasAnnotations,
hasGetter, hasSetter, hasConstant, isConst, lateInit, descriptor.isExternal, ProtoEnumFlags.visibility(normalizeVisibility(descriptor)),
@Suppress("DEPRECATION") descriptor.isDelegated, descriptor.isExpect 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) { if (flags != builder.flags) {
builder.flags = flags builder.flags = flags
@@ -238,8 +254,10 @@ class KonanDescriptorSerializer private constructor(
else if (descriptor.isSuspendOrHasSuspendTypesInSignature()) { else if (descriptor.isSuspendOrHasSuspendTypesInSignature()) {
builder.versionRequirement = writeVersionRequirement(LanguageFeature.Coroutines) builder.versionRequirement = writeVersionRequirement(LanguageFeature.Coroutines)
} }
extension.serializeProperty(descriptor, builder) extension.serializeProperty(descriptor, builder)
/* Konan specific chunk */
if (extension is IrAwareExtension) { if (extension is IrAwareExtension) {
descriptor.getter?.onlyIf({needsSerializedIr}) { descriptor.getter?.onlyIf({needsSerializedIr}) {
extension.addGetterIR(builder, extension.addGetterIR(builder,
@@ -254,15 +272,25 @@ class KonanDescriptorSerializer private constructor(
return builder 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 { fun functionProto(descriptor: FunctionDescriptor): ProtoBuf.Function.Builder {
val builder = ProtoBuf.Function.newBuilder() val builder = ProtoBuf.Function.newBuilder()
val local = createChildSerializer(descriptor) val local = createChildSerializer(descriptor)
val flags = Flags.getFunctionFlags( val flags = Flags.getFunctionFlags(
hasAnnotations(descriptor), descriptor.visibility, descriptor.modality, descriptor.kind, descriptor.isOperator, hasAnnotations(descriptor),
descriptor.isInfix, descriptor.isInline, descriptor.isTailrec, descriptor.isExternal, descriptor.isSuspend, ProtoEnumFlags.visibility(normalizeVisibility(descriptor)),
descriptor.isExpect 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) { if (flags != builder.flags) {
builder.flags = flags builder.flags = flags
@@ -310,8 +338,12 @@ class KonanDescriptorSerializer private constructor(
builder.versionRequirement = writeVersionRequirement(LanguageFeature.Coroutines) builder.versionRequirement = writeVersionRequirement(LanguageFeature.Coroutines)
} }
// TODO: K/N & Contracts???
// contractSerializer.serializeContractOfFunctionIfAny(descriptor, builder, this)
//
extension.serializeFunction(descriptor, builder) extension.serializeFunction(descriptor, builder)
/* Konan specific chunk */
if (extension is IrAwareExtension && descriptor.needsSerializedIr) { if (extension is IrAwareExtension && descriptor.needsSerializedIr) {
extension.addFunctionIR(builder, extension.addFunctionIR(builder,
extension.serializeInlineBody(descriptor, local)) extension.serializeInlineBody(descriptor, local))
@@ -325,7 +357,9 @@ class KonanDescriptorSerializer private constructor(
val local = createChildSerializer(descriptor) 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) { if (flags != builder.flags) {
builder.flags = flags builder.flags = flags
} }
@@ -344,6 +378,7 @@ class KonanDescriptorSerializer private constructor(
extension.serializeConstructor(descriptor, builder) extension.serializeConstructor(descriptor, builder)
/* Konan specific chunk */
if (extension is IrAwareExtension && descriptor.needsSerializedIr) { if (extension is IrAwareExtension && descriptor.needsSerializedIr) {
extension.addConstructorIR(builder, extension.addConstructorIR(builder,
extension.serializeInlineBody(descriptor, local)) extension.serializeInlineBody(descriptor, local))
@@ -366,7 +401,7 @@ class KonanDescriptorSerializer private constructor(
val builder = ProtoBuf.TypeAlias.newBuilder() val builder = ProtoBuf.TypeAlias.newBuilder()
val local = createChildSerializer(descriptor) 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) { if (flags != builder.flags) {
builder.flags = flags builder.flags = flags
} }
@@ -393,6 +428,11 @@ class KonanDescriptorSerializer private constructor(
builder.setExpandedType(local.type(expandedType)) builder.setExpandedType(local.type(expandedType))
} }
val requirement = serializeVersionRequirement(descriptor)
if (requirement != null) {
builder.versionRequirement = requirement
}
builder.addAllAnnotation(descriptor.annotations.map { extension.annotationSerializer.serializeAnnotation(it) }) builder.addAllAnnotation(descriptor.annotations.map { extension.annotationSerializer.serializeAnnotation(it) })
return builder return builder
@@ -408,9 +448,10 @@ class KonanDescriptorSerializer private constructor(
private fun valueParameter(descriptor: ValueParameterDescriptor): ProtoBuf.ValueParameter.Builder { private fun valueParameter(descriptor: ValueParameterDescriptor): ProtoBuf.ValueParameter.Builder {
val builder = ProtoBuf.ValueParameter.newBuilder() val builder = ProtoBuf.ValueParameter.newBuilder()
val declaresDefaultValue = descriptor.declaresDefaultValue() || descriptor.isActualParameterWithExpectedDefault
val flags = Flags.getValueParameterFlags( val flags = Flags.getValueParameterFlags(
hasAnnotations(descriptor), descriptor.declaresDefaultValue(), hasAnnotations(descriptor), declaresDefaultValue, descriptor.isCrossinline, descriptor.isNoinline
descriptor.isCrossinline, descriptor.isNoinline
) )
if (flags != builder.flags) { if (flags != builder.flags) {
builder.flags = flags builder.flags = flags
@@ -472,9 +513,10 @@ class KonanDescriptorSerializer private constructor(
return builder return builder
} }
/* Konan needs public modifier */
public fun typeId(type: KotlinType) = typeTable[type(type)] 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() val builder = ProtoBuf.Type.newBuilder()
if (type.isError) { if (type.isError) {
@@ -650,17 +692,17 @@ class KonanDescriptorSerializer private constructor(
val level = (args[RequireKotlinNames.LEVEL] as? EnumValue)?.enumEntryName?.asString() val level = (args[RequireKotlinNames.LEVEL] as? EnumValue)?.enumEntryName?.asString()
when (level) { when (level) {
DeprecationLevel.ERROR.toString() -> { /* ERROR is the default level */ } DeprecationLevel.ERROR.name -> { /* ERROR is the default level */ }
DeprecationLevel.WARNING.toString() -> proto.level = ProtoBuf.VersionRequirement.Level.WARNING DeprecationLevel.WARNING.name -> proto.level = ProtoBuf.VersionRequirement.Level.WARNING
DeprecationLevel.HIDDEN.toString() -> proto.level = ProtoBuf.VersionRequirement.Level.HIDDEN DeprecationLevel.HIDDEN.name -> proto.level = ProtoBuf.VersionRequirement.Level.HIDDEN
} }
val versionKind = (args[RequireKotlinNames.VERSION_KIND] as? EnumValue)?.enumEntryName?.asString() val versionKind = (args[RequireKotlinNames.VERSION_KIND] as? EnumValue)?.enumEntryName?.asString()
when (versionKind) { when (versionKind) {
ProtoBuf.VersionRequirement.VersionKind.LANGUAGE_VERSION.toString() -> { /* LANGUAGE_VERSION is the default kind */ } ProtoBuf.VersionRequirement.VersionKind.LANGUAGE_VERSION.name -> { /* LANGUAGE_VERSION is the default kind */ }
ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION.toString() -> ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION.name ->
proto.versionKind = ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION 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 proto.versionKind = ProtoBuf.VersionRequirement.VersionKind.API_VERSION
} }
@@ -681,6 +723,15 @@ class KonanDescriptorSerializer private constructor(
private fun getTypeParameterId(descriptor: TypeParameterDescriptor): Int = private fun getTypeParameterId(descriptor: TypeParameterDescriptor): Int =
typeParameters.intern(descriptor) 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 { companion object {
@JvmStatic @JvmStatic
fun createTopLevel(extension: SerializerExtension): KonanDescriptorSerializer { fun createTopLevel(extension: SerializerExtension): KonanDescriptorSerializer {
@@ -719,15 +770,12 @@ class KonanDescriptorSerializer private constructor(
return serializer return serializer
} }
private fun getAccessorFlags(accessor: PropertyAccessorDescriptor): Int { @JvmStatic
return Flags.getAccessorFlags( fun serialize(message: MessageLite, stringTable: StringTable): ByteArray {
hasAnnotations(accessor), return ByteArrayOutputStream().apply {
accessor.visibility, stringTable.serializeTo(this)
accessor.modality, message.writeTo(this)
!accessor.isDefault, }.toByteArray()
accessor.isExternal,
accessor.isInline
)
} }
private fun variance(variance: Variance): ProtoBuf.TypeParameter.Variance = when (variance) { private fun variance(variance: Variance): ProtoBuf.TypeParameter.Variance = when (variance) {
@@ -1,8 +1,8 @@
syntax = "proto2"; 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 java_outer_classname = "KonanIr";
option optimize_for = LITE_RUNTIME; option optimize_for = LITE_RUNTIME;
@@ -1,6 +1,6 @@
syntax = "proto2"; 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. // This, and all the rest of the included proto files have ".proto1" extension.
// That allows us to construct the current file, // 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, // 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 the same namespace of renamed org.jetbrains.kotlin.protobuf packages.
// In case we merge to the main Kotlin workspace the scheme will be simplified. // 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 java_outer_classname = "KonanLinkData";
option optimize_for = LITE_RUNTIME; option optimize_for = LITE_RUNTIME;
@@ -71,11 +71,11 @@ message InlineIrBody {
// Konan Binary Linkdata structures. // Konan Binary Linkdata structures.
message PackageFragment { message LinkDataPackageFragment {
// Make if an index? // Make if an index?
required string fq_name = 1; required string fq_name = 1;
required Package package = 4; required Package package = 4;
required Classes classes = 5; required LinkDataClasses classes = 5;
required bool is_empty = 6; required bool is_empty = 6;
// To construct name resolver // To construct name resolver
@@ -83,13 +83,13 @@ message PackageFragment {
required StringTable string_table = 3; required StringTable string_table = 3;
} }
message Classes { message LinkDataClasses {
// Index in the QualifiedNameIndex table. // Index in the QualifiedNameIndex table.
repeated int32 class_name = 1; repeated int32 class_name = 1;
repeated Class classes = 2; repeated Class classes = 2;
} }
message Library { message LinkDataLibrary {
required string module_name = 1; required string module_name = 1;
repeated string package_fragment_name = 2; repeated string package_fragment_name = 2;
repeated string empty_package = 3; repeated string empty_package = 3;
@@ -20,10 +20,12 @@ import org.jetbrains.kotlin.backend.konan.library.KonanLibraryReader
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name 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.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.descriptors.DeserializedPackageMemberScope
import org.jetbrains.kotlin.serialization.deserialization.getClassId
import org.jetbrains.kotlin.serialization.deserialization.getName
import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.StorageManager
class KonanPackageFragment( class KonanPackageFragment(
@@ -34,11 +36,11 @@ class KonanPackageFragment(
// The proto field is lazy so that we can load only needed // The proto field is lazy so that we can load only needed
// packages from the library. // packages from the library.
private val protoForNames: KonanLinkData.PackageFragment by lazy { private val protoForNames: KonanLinkData.LinkDataPackageFragment by lazy {
parsePackageFragment(reader.packageMetadata(fqNameString)) parsePackageFragment(reader.packageMetadata(fqNameString))
} }
val proto: KonanLinkData.PackageFragment get() = protoForNames.also { val proto: KonanLinkData.LinkDataPackageFragment get() = protoForNames.also {
reader.markPackageAccessed(fqNameString) reader.markPackageAccessed(fqNameString)
} }
@@ -16,46 +16,32 @@
package org.jetbrains.kotlin.backend.konan.serialization 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.DeserializedKonanModule
import org.jetbrains.kotlin.backend.konan.descriptors.createKonanModuleDescriptor import org.jetbrains.kotlin.backend.konan.descriptors.createKonanModuleDescriptor
import org.jetbrains.kotlin.backend.konan.descriptors.isExpectMember import org.jetbrains.kotlin.backend.konan.descriptors.isExpectMember
import org.jetbrains.kotlin.backend.konan.library.KonanLibraryReader import org.jetbrains.kotlin.backend.konan.library.KonanLibraryReader
import org.jetbrains.kotlin.backend.konan.library.LinkData 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.config.languageVersionSettings
import org.jetbrains.kotlin.descriptors.* 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.ModuleDescriptorImpl
import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl
import org.jetbrains.kotlin.incremental.components.LookupTracker 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.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter 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.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.serialization.deserialization.*
import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.LockBasedStorageManager
import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.SimpleType 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 * This is Konan specific part of public descriptor
@@ -115,12 +101,12 @@ fun createKonanPackageFragmentProvider(
return provider return provider
} }
public fun parsePackageFragment(packageData: ByteArray): PackageFragment = public fun parsePackageFragment(packageData: ByteArray): LinkDataPackageFragment =
PackageFragment.parseFrom(packageData, LinkDataPackageFragment.parseFrom(packageData,
KonanSerializerProtocol.extensionRegistry) KonanSerializerProtocol.extensionRegistry)
public fun parseModuleHeader(libraryData: ByteArray): Library = public fun parseModuleHeader(libraryData: ByteArray): LinkDataLibrary =
Library.parseFrom(libraryData, LinkDataLibrary.parseFrom(libraryData,
KonanSerializerProtocol.extensionRegistry) KonanSerializerProtocol.extensionRegistry)
public fun emptyPackages(libraryData: ByteArray) public fun emptyPackages(libraryData: ByteArray)
@@ -161,7 +147,7 @@ internal class KonanSerializationUtil(val context: Context) {
var classSerializer: KonanDescriptorSerializer = topSerializer var classSerializer: KonanDescriptorSerializer = topSerializer
fun serializeClass(packageName: FqName, fun serializeClass(packageName: FqName,
builder: KonanLinkData.Classes.Builder, builder: KonanLinkData.LinkDataClasses.Builder,
classDescriptor: ClassDescriptor) { classDescriptor: ClassDescriptor) {
val previousSerializer = classSerializer val previousSerializer = classSerializer
@@ -185,7 +171,7 @@ internal class KonanSerializationUtil(val context: Context) {
} }
fun serializeClasses(packageName: FqName, fun serializeClasses(packageName: FqName,
builder: KonanLinkData.Classes.Builder, builder: KonanLinkData.LinkDataClasses.Builder,
descriptors: Collection<DeclarationDescriptor>) { descriptors: Collection<DeclarationDescriptor>) {
for (descriptor in descriptors) { for (descriptor in descriptors) {
@@ -196,7 +182,7 @@ internal class KonanSerializationUtil(val context: Context) {
} }
fun serializePackage(fqName: FqName, module: ModuleDescriptor) : fun serializePackage(fqName: FqName, module: ModuleDescriptor) :
KonanLinkData.PackageFragment? { KonanLinkData.LinkDataPackageFragment? {
// TODO: ModuleDescriptor should be able to return // TODO: ModuleDescriptor should be able to return
// the package only with the contents of that module, without dependencies // 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()) DescriptorUtils.getAllDescriptors(fragment.getMemberScope())
}.filter { !it.isExpectMember } }.filter { !it.isExpectMember }
val classesBuilder = KonanLinkData.Classes.newBuilder() val classesBuilder = KonanLinkData.LinkDataClasses.newBuilder()
serializeClasses(fqName, classesBuilder, classifierDescriptors) serializeClasses(fqName, classesBuilder, classifierDescriptors)
val classesProto = classesBuilder.build() val classesProto = classesBuilder.build()
@@ -226,7 +212,7 @@ internal class KonanSerializationUtil(val context: Context) {
val (stringTableProto, nameTableProto) = strings.buildProto() val (stringTableProto, nameTableProto) = strings.buildProto()
val isEmpty = members.isEmpty() && classifierDescriptors.isEmpty() val isEmpty = members.isEmpty() && classifierDescriptors.isEmpty()
val fragmentBuilder = KonanLinkData.PackageFragment.newBuilder() val fragmentBuilder = KonanLinkData.LinkDataPackageFragment.newBuilder()
val fragmentProto = fragmentBuilder val fragmentProto = fragmentBuilder
.setPackage(packageProto) .setPackage(packageProto)
@@ -253,7 +239,7 @@ internal class KonanSerializationUtil(val context: Context) {
} }
internal fun serializeModule(moduleDescriptor: ModuleDescriptor): LinkData { internal fun serializeModule(moduleDescriptor: ModuleDescriptor): LinkData {
val libraryProto = KonanLinkData.Library.newBuilder() val libraryProto = KonanLinkData.LinkDataLibrary.newBuilder()
libraryProto.moduleName = moduleDescriptor.name.asString() libraryProto.moduleName = moduleDescriptor.name.asString()
val fragments = mutableListOf<ByteArray>() val fragments = mutableListOf<ByteArray>()
val fragmentNames = mutableListOf<String>() val fragmentNames = mutableListOf<String>()
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.backend.konan.serialization
import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.Context
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.metadata.*
import org.jetbrains.kotlin.protobuf.ExtensionRegistryLite import org.jetbrains.kotlin.protobuf.ExtensionRegistryLite
import org.jetbrains.kotlin.serialization.* import org.jetbrains.kotlin.serialization.*
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
@@ -17,8 +17,11 @@
package org.jetbrains.kotlin.backend.konan.serialization package org.jetbrains.kotlin.backend.konan.serialization
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.serialization.StringTableImpl import org.jetbrains.kotlin.serialization.StringTableImpl
import org.jetbrains.kotlin.resolve.DescriptorUtils 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.getAllSuperClassifiers
import org.jetbrains.kotlin.resolve.descriptorUtil.module 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) { return if (descriptor.containingDeclaration is CallableMemberDescriptor) {
val superClassifiers = descriptor.getAllSuperClassifiers() val superClassifiers = descriptor.getAllSuperClassifiers()
.mapNotNull { it as ClassifierDescriptorWithTypeParameters } .mapNotNull { it as ClassifierDescriptorWithTypeParameters }
.filter { it != descriptor } .filter { it != descriptor }
.toList() .toList()
if (superClassifiers.size == 1) { if (superClassifiers.size == 1) {
getFqNameIndex(superClassifiers[0]) superClassifiers[0].classId
} else { } else {
val superClass = superClassifiers.find { !DescriptorUtils.isInterface(it) } val superClass = superClassifiers.find { !DescriptorUtils.isInterface(it) }
getFqNameIndex(superClass ?: descriptor.module.builtIns.any) superClass?.classId ?: ClassId.topLevel(descriptor.module.builtIns.any.fqNameSafe)
} }
} else { } else {
super.getFqNameIndexOfLocalAnonymousClass(descriptor) super.getLocalClassIdReplacement(descriptor)
} }
} }
} }
@@ -22,10 +22,12 @@ import org.jetbrains.kotlin.backend.common.push
import org.jetbrains.kotlin.backend.konan.descriptors.allContainingDeclarations import org.jetbrains.kotlin.backend.konan.descriptors.allContainingDeclarations
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
import org.jetbrains.kotlin.serialization.Flags import org.jetbrains.kotlin.metadata.deserialization.Flags
import org.jetbrains.kotlin.serialization.KonanIr import org.jetbrains.kotlin.metadata.KonanIr
import org.jetbrains.kotlin.serialization.KonanLinkData import org.jetbrains.kotlin.metadata.KonanLinkData
import org.jetbrains.kotlin.serialization.ProtoBuf 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.*
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.VersionRequirementTable import org.jetbrains.kotlin.serialization.deserialization.descriptors.VersionRequirementTable
@@ -30,7 +30,7 @@ import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl
import org.jetbrains.kotlin.ir.descriptors.IrTemporaryVariableDescriptor import org.jetbrains.kotlin.ir.descriptors.IrTemporaryVariableDescriptor
import org.jetbrains.kotlin.serialization.KonanDescriptorSerializer import org.jetbrains.kotlin.serialization.KonanDescriptorSerializer
import org.jetbrains.kotlin.serialization.KonanIr import org.jetbrains.kotlin.metadata.KonanIr
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
/* /*
@@ -18,10 +18,10 @@ package org.jetbrains.kotlin.backend.konan.serialization
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.serialization.deserialization.descriptors.* import org.jetbrains.kotlin.serialization.deserialization.descriptors.*
import org.jetbrains.kotlin.serialization.KonanIr import org.jetbrains.kotlin.metadata.KonanIr
import org.jetbrains.kotlin.serialization.KonanLinkData import org.jetbrains.kotlin.metadata.KonanLinkData
import org.jetbrains.kotlin.serialization.KonanLinkData.* import org.jetbrains.kotlin.metadata.KonanLinkData.*
import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.metadata.ProtoBuf
fun newUniqId(index: Long): KonanIr.UniqId = fun newUniqId(index: Long): KonanIr.UniqId =
KonanIr.UniqId.newBuilder().setIndex(index).build() KonanIr.UniqId.newBuilder().setIndex(index).build()
@@ -42,11 +42,11 @@ import org.jetbrains.kotlin.ir.util.createParameterDeclarations
import org.jetbrains.kotlin.ir.util.setOverrides import org.jetbrains.kotlin.ir.util.setOverrides
import org.jetbrains.kotlin.ir.util.setSuperSymbols import org.jetbrains.kotlin.ir.util.setSuperSymbols
import org.jetbrains.kotlin.serialization.KonanDescriptorSerializer import org.jetbrains.kotlin.serialization.KonanDescriptorSerializer
import org.jetbrains.kotlin.serialization.KonanIr import org.jetbrains.kotlin.metadata.KonanIr
import org.jetbrains.kotlin.serialization.KonanIr.IrConst.ValueCase.* import org.jetbrains.kotlin.metadata.KonanIr.IrConst.ValueCase.*
import org.jetbrains.kotlin.serialization.KonanIr.IrOperation.OperationCase.* import org.jetbrains.kotlin.metadata.KonanIr.IrOperation.OperationCase.*
import org.jetbrains.kotlin.serialization.KonanIr.IrVarargElement.VarargElementCase.* import org.jetbrains.kotlin.metadata.KonanIr.IrVarargElement.VarargElementCase.*
import org.jetbrains.kotlin.serialization.KonanLinkData import org.jetbrains.kotlin.metadata.KonanLinkData
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassConstructorDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassConstructorDescriptor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedSimpleFunctionDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedSimpleFunctionDescriptor
@@ -18,9 +18,10 @@ package org.jetbrains.kotlin.backend.konan.serialization
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable.QualifiedName import org.jetbrains.kotlin.metadata.ProtoBuf.QualifiedNameTable.QualifiedName
import org.jetbrains.kotlin.serialization.deserialization.NameResolverImpl import org.jetbrains.kotlin.metadata.deserialization.NameResolverImpl
import org.jetbrains.kotlin.serialization.deserialization.getClassId
// TODO Come up with a better file name. // TODO Come up with a better file name.
@@ -39,7 +40,7 @@ internal fun NameResolverImpl.getDescriptorByFqNameIndex(
QualifiedName.Kind.LOCAL -> QualifiedName.Kind.LOCAL ->
return module.findClassAcrossModuleDependencies(this.getClassId(fqNameIndex))!! return module.findClassAcrossModuleDependencies(this.getClassId(fqNameIndex))!!
QualifiedName.Kind.PACKAGE -> QualifiedName.Kind.PACKAGE ->
return module.getPackage(packageName) return module.getPackage(FqName(packageName))
} }
} }
@@ -15,7 +15,7 @@
*/ */
syntax = "proto2"; syntax = "proto2";
package org.jetbrains.kotlin.serialization; package org.jetbrains.kotlin.metadata;
import "org/jetbrains/kotlin/backend/konan/serialization/google_descriptor.proto1"; import "org/jetbrains/kotlin/backend/konan/serialization/google_descriptor.proto1";
@@ -14,8 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
syntax = "proto2"; package org.jetbrains.kotlin.metadata;
package org.jetbrains.kotlin.serialization;
import "org/jetbrains/kotlin/backend/konan/serialization/ext_options.proto1"; import "org/jetbrains/kotlin/backend/konan/serialization/ext_options.proto1";
@@ -122,7 +121,7 @@ message Type {
optional Type flexible_upper_bound = 5; optional Type flexible_upper_bound = 5;
optional int32 flexible_upper_bound_id = 8; 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 class_name = 6 [(fq_name_id_in_table) = true];
optional int32 type_parameter = 7; // id of the type parameter optional int32 type_parameter = 7; // id of the type parameter
@@ -133,12 +132,18 @@ message Type {
// Top level types are always fully expanded // Top level types are always fully expanded
optional int32 type_alias_name = 12 [(fq_name_id_in_table) = true]; 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 Type outer_type = 10;
optional int32 outer_type_id = 11; optional int32 outer_type_id = 11;
optional Type abbreviated_type = 13; optional Type abbreviated_type = 13;
optional int32 abbreviated_type_id = 14; optional int32 abbreviated_type_id = 14;
/*
suspend
*/
optional int32 flags = 1;
extensions 100 to 199; extensions 100 to 199;
} }
@@ -157,7 +162,7 @@ message TypeParameter {
optional Variance variance = 4 [default = INV]; optional Variance variance = 4 [default = INV];
repeated Type upper_bound = 5; repeated Type upper_bound = 5;
repeated int32 upper_bound_id = 6; repeated int32 upper_bound_id = 6 [packed = true];
extensions 100 to 999; extensions 100 to 999;
} }
@@ -181,6 +186,9 @@ message Class {
ClassKind ClassKind
isInner isInner
isData isData
isExternal
isExpect
isInline
*/ */
optional int32 flags = 1 [default = 6 /* public final class, no annotations */]; optional int32 flags = 1 [default = 6 /* public final class, no annotations */];
@@ -202,9 +210,16 @@ message Class {
repeated EnumEntry enum_entry = 13; 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; 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 { message Package {
@@ -214,6 +229,8 @@ message Package {
optional TypeTable type_table = 30; optional TypeTable type_table = 30;
optional VersionRequirementTable version_requirement_table = 32;
extensions 100 to 199; extensions 100 to 199;
} }
@@ -235,7 +252,10 @@ message Constructor {
repeated ValueParameter value_parameter = 2; repeated ValueParameter value_parameter = 2;
extensions 100 to 199; // Index into the VersionRequirementTable
optional int32 version_requirement = 31;
extensions 100 to 18999;
} }
message Function { message Function {
@@ -249,6 +269,8 @@ message Function {
isInline isInline
isTailrec isTailrec
isExternal isExternal
isSuspend
isExpect
*/ */
optional int32 flags = 9 [default = 6 /* public final function, no annotations */]; optional int32 flags = 9 [default = 6 /* public final function, no annotations */];
optional int32 old_flags = 1 [default = 6]; optional int32 old_flags = 1 [default = 6];
@@ -267,7 +289,12 @@ message Function {
optional TypeTable type_table = 30; 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 { message Property {
@@ -280,8 +307,11 @@ message Property {
hasGetter hasGetter
hasSetter hasSetter
isConst isConst
lateinit isLateinit
hasConstant hasConstant
isExternal
isDelegated
isExpect
*/ */
optional int32 flags = 11 [default = 518 /* public (6) final property with getter (512) */]; optional int32 flags = 11 [default = 518 /* public (6) final property with getter (512) */];
optional int32 old_flags = 1 [default = 2054]; optional int32 old_flags = 1 [default = 2054];
@@ -305,17 +335,24 @@ message Property {
isNotDefault isNotDefault
isExternal isExternal
isInline 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 { message ValueParameter {
/* /*
declaresDefault
hasAnnotations hasAnnotations
declaresDefault
isCrossinline isCrossinline
isNoinline isNoinline
*/ */
@@ -351,6 +388,9 @@ message TypeAlias {
repeated Annotation annotation = 8; repeated Annotation annotation = 8;
// Index into the VersionRequirementTable
optional int32 version_requirement = 31;
extensions 100 to 199; extensions 100 to 199;
} }
@@ -385,3 +425,131 @@ enum MemberKind {
DELEGATION = 2; DELEGATION = 2;
SYNTHESIZED = 3; 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;
}
+2 -2
View File
@@ -20,8 +20,8 @@ remoteRoot=konan_tests
#kotlinCompilerModule=org.jetbrains.kotlin:kotlin-compiler:1.1-SNAPSHOT #kotlinCompilerModule=org.jetbrains.kotlin:kotlin-compiler:1.1-SNAPSHOT
# Download artifacts of https://teamcity.jetbrains.com/viewType.html?buildTypeId=Kotlin_120_Compiler # Download artifacts of https://teamcity.jetbrains.com/viewType.html?buildTypeId=Kotlin_120_Compiler
testDataVersion=1226829:id 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 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-837 kotlinVersion=1.2.40-dev-1038
konanVersion=0.6.1 konanVersion=0.6.1
org.gradle.jvmargs='-Dfile.encoding=UTF-8' org.gradle.jvmargs='-Dfile.encoding=UTF-8'
@@ -30,7 +30,7 @@ import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.konan.file.File import org.jetbrains.kotlin.konan.file.File
import org.jetbrains.kotlin.konan.target.Distribution import org.jetbrains.kotlin.konan.target.Distribution
import org.jetbrains.kotlin.konan.target.PlatformManager 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 java.lang.System.out
import kotlin.system.exitProcess import kotlin.system.exitProcess
@@ -88,7 +88,7 @@ fun error(text: String) {
val defaultRepository = File(File.userHome, ".konan/klib") val defaultRepository = File(File.userHome, ".konan/klib")
open class ModuleDeserializer(val library: ByteArray) { open class ModuleDeserializer(val library: ByteArray) {
protected val moduleHeader: KonanLinkData.Library protected val moduleHeader: KonanLinkData.LinkDataLibrary
get() = parseModuleHeader(library) get() = parseModuleHeader(library)
val moduleName: String val moduleName: String