[Metadata] Add context receivers to metadata.proto
[Tests] Add JvmVersionRequirementTest
This commit is contained in:
committed by
TeamCityServer
parent
b3591e77be
commit
d47cf315e7
+15
@@ -120,6 +120,9 @@
|
||||
"supertypeIdMemoizedSerializedSize": -1,
|
||||
"nestedClassName_": [],
|
||||
"nestedClassNameMemoizedSerializedSize": -1,
|
||||
"contextReceiverType_": [],
|
||||
"contextReceiverTypeId_": [],
|
||||
"contextReceiverTypeIdMemoizedSerializedSize": -1,
|
||||
"constructor_": [
|
||||
{
|
||||
"unknownFields": {
|
||||
@@ -283,6 +286,9 @@
|
||||
"memoizedHashCode": 0
|
||||
},
|
||||
"receiverTypeId_": 0,
|
||||
"contextReceiverType_": [],
|
||||
"contextReceiverTypeId_": [],
|
||||
"contextReceiverTypeIdMemoizedSerializedSize": -1,
|
||||
"valueParameter_": [],
|
||||
"typeTable_": {
|
||||
"unknownFields": {
|
||||
@@ -458,6 +464,9 @@
|
||||
"memoizedHashCode": 0
|
||||
},
|
||||
"receiverTypeId_": 0,
|
||||
"contextReceiverType_": [],
|
||||
"contextReceiverTypeId_": [],
|
||||
"contextReceiverTypeIdMemoizedSerializedSize": -1,
|
||||
"valueParameter_": [],
|
||||
"typeTable_": {
|
||||
"unknownFields": {
|
||||
@@ -635,6 +644,9 @@
|
||||
"memoizedHashCode": 0
|
||||
},
|
||||
"receiverTypeId_": 0,
|
||||
"contextReceiverType_": [],
|
||||
"contextReceiverTypeId_": [],
|
||||
"contextReceiverTypeIdMemoizedSerializedSize": -1,
|
||||
"setterValueParameter_": {
|
||||
"unknownFields": {
|
||||
"bytes": [],
|
||||
@@ -860,6 +872,9 @@
|
||||
"memoizedHashCode": 0
|
||||
},
|
||||
"receiverTypeId_": 0,
|
||||
"contextReceiverType_": [],
|
||||
"contextReceiverTypeId_": [],
|
||||
"contextReceiverTypeIdMemoizedSerializedSize": -1,
|
||||
"setterValueParameter_": {
|
||||
"unknownFields": {
|
||||
"bytes": [],
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
package test
|
||||
|
||||
interface A
|
||||
interface B
|
||||
|
||||
context(A, B)
|
||||
class ClassWithCR {
|
||||
context(A, B)
|
||||
val memberPropWithCR: Any?
|
||||
get() = null
|
||||
|
||||
context(A, B)
|
||||
fun memberFunWithCR() {}
|
||||
}
|
||||
|
||||
context(A, B)
|
||||
fun topLevelFunWithCR() {}
|
||||
|
||||
context(A, B)
|
||||
val topLevelPropWithCR: Any?
|
||||
get() = null
|
||||
@@ -169,4 +169,18 @@ class JvmVersionRequirementTest : AbstractVersionRequirementTest() {
|
||||
shouldBeSingleRequirement = false
|
||||
)
|
||||
}
|
||||
|
||||
fun testContextReceivers() {
|
||||
doTest(
|
||||
VersionRequirement.Version(1, 6, 20), DeprecationLevel.ERROR, null, COMPILER_VERSION, null,
|
||||
fqNamesWithRequirements = listOf(
|
||||
"test.ClassWithCR",
|
||||
"test.ClassWithCR.memberPropWithCR",
|
||||
"test.ClassWithCR.memberFunWithCR",
|
||||
"test.topLevelFunWithCR",
|
||||
"test.topLevelPropWithCR"
|
||||
),
|
||||
customLanguageVersion = LanguageVersion.KOTLIN_1_7
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user