[kotlin compiler][update] 1.2.40-dev-1038
This commit is contained in:
committed by
Vasily Levchenko
parent
f4e9eba447
commit
62a7c2d2a4
+3
-5
@@ -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() =
|
||||||
|
|||||||
+9
-11
@@ -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()
|
||||||
|
|||||||
+2
-3
@@ -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?
|
||||||
|
|||||||
+7
-13
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+98
-50
@@ -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) {
|
||||||
|
|||||||
+2
-2
@@ -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;
|
||||||
|
|
||||||
|
|||||||
+6
-6
@@ -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;
|
||||||
|
|||||||
+6
-4
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+15
-29
@@ -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>()
|
||||||
|
|||||||
+1
@@ -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
|
||||||
|
|||||||
+7
-4
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-4
@@ -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
|
||||||
|
|||||||
+1
-1
@@ -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
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
+4
-4
@@ -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()
|
||||||
|
|||||||
+5
-5
@@ -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
|
||||||
|
|||||||
+5
-4
@@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -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";
|
||||||
|
|
||||||
|
|||||||
+181
-13
@@ -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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user