[Metadata] Add context receivers to metadata.proto

[Tests] Add JvmVersionRequirementTest
This commit is contained in:
Anastasiya Shadrina
2021-09-20 01:03:32 +07:00
committed by TeamCityServer
parent b3591e77be
commit d47cf315e7
10 changed files with 3500 additions and 502 deletions
@@ -100,6 +100,13 @@ class DescriptorSerializer private constructor(
builder.addTypeParameter(typeParameter(typeParameterDescriptor))
}
val contextReceivers = classDescriptor.contextReceivers
if (useTypeTable()) {
contextReceivers.forEach { builder.addContextReceiverTypeId(typeId(it.type)) }
} else {
contextReceivers.forEach { builder.addContextReceiverType(type(it.type)) }
}
if (!KotlinBuiltIns.isSpecialClassWithNoSupertypes(classDescriptor)) {
// Special classes (Any, Nothing) have no supertypes
for (supertype in classDescriptor.typeConstructor.supertypes) {
@@ -197,6 +204,12 @@ class DescriptorSerializer private constructor(
)
}
if (classDescriptor.contextReceivers.isNotEmpty()) {
builder.addVersionRequirement(
writeCompilerVersionRequirement(1, 6, 20, versionRequirementTable)
)
}
val versionRequirementTableProto = versionRequirementTable.serialize()
if (versionRequirementTableProto != null) {
builder.versionRequirementTable = versionRequirementTableProto
@@ -308,6 +321,13 @@ class DescriptorSerializer private constructor(
}
}
val contextReceivers = descriptor.contextReceiverParameters
if (useTypeTable()) {
contextReceivers.forEach { builder.addContextReceiverTypeId(local.typeId(it.type)) }
} else {
contextReceivers.forEach { builder.addContextReceiverType(local.type(it.type)) }
}
versionRequirementTable?.run {
builder.addAllVersionRequirement(serializeVersionRequirements(descriptor))
@@ -319,6 +339,10 @@ class DescriptorSerializer private constructor(
builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses))
}
if (descriptor.contextReceiverParameters.isNotEmpty()) {
builder.addVersionRequirement(writeCompilerVersionRequirement(1, 6, 20))
}
if (local.metDefinitelyNotNullType) {
builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes))
}
@@ -384,6 +408,13 @@ class DescriptorSerializer private constructor(
}
}
val contextReceivers = descriptor.contextReceiverParameters
if (useTypeTable()) {
contextReceivers.forEach { builder.addContextReceiverTypeId(local.typeId(it.type)) }
} else {
contextReceivers.forEach { builder.addContextReceiverType(local.type(it.type)) }
}
for (valueParameterDescriptor in descriptor.valueParameters) {
builder.addValueParameter(local.valueParameter(valueParameterDescriptor))
}
@@ -406,6 +437,10 @@ class DescriptorSerializer private constructor(
builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses))
}
if (descriptor.contextReceiverParameters.isNotEmpty()) {
builder.addVersionRequirement(writeCompilerVersionRequirement(1, 6, 20))
}
if (local.metDefinitelyNotNullType) {
builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes))
}
@@ -747,6 +782,9 @@ class DescriptorSerializer private constructor(
return writeLanguageVersionRequirement(languageFeature, this)
}
private fun MutableVersionRequirementTable.writeCompilerVersionRequirement(major: Int, minor: Int, patch: Int): Int =
writeCompilerVersionRequirement(major, minor, patch, this)
// Returns a list of indices into versionRequirementTable, or empty list if there's no @RequireKotlin on the descriptor
private fun MutableVersionRequirementTable.serializeVersionRequirements(descriptor: DeclarationDescriptor): List<Int> =
descriptor.annotations
@@ -898,6 +936,17 @@ class DescriptorSerializer private constructor(
)
}
fun writeCompilerVersionRequirement(
major: Int,
minor: Int,
patch: Int,
versionRequirementTable: MutableVersionRequirementTable
): Int = writeVersionRequirement(
major, minor, patch,
ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION,
versionRequirementTable
)
fun writeVersionRequirement(
major: Int,
minor: Int,