[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
@@ -170,6 +170,10 @@ open class ProtoCompareGenerated(
if (!checkEqualsClassNestedClassName(old, new)) return false if (!checkEqualsClassNestedClassName(old, new)) return false
if (!checkEqualsClassContextReceiverType(old, new)) return false
if (!checkEqualsClassContextReceiverTypeId(old, new)) return false
if (!checkEqualsClassConstructor(old, new)) return false if (!checkEqualsClassConstructor(old, new)) return false
if (!checkEqualsClassFunction(old, new)) return false if (!checkEqualsClassFunction(old, new)) return false
@@ -275,6 +279,8 @@ open class ProtoCompareGenerated(
SUPERTYPE_LIST, SUPERTYPE_LIST,
SUPERTYPE_ID_LIST, SUPERTYPE_ID_LIST,
NESTED_CLASS_NAME_LIST, NESTED_CLASS_NAME_LIST,
CONTEXT_RECEIVER_TYPE_LIST,
CONTEXT_RECEIVER_TYPE_ID_LIST,
CONSTRUCTOR_LIST, CONSTRUCTOR_LIST,
FUNCTION_LIST, FUNCTION_LIST,
PROPERTY_LIST, PROPERTY_LIST,
@@ -320,6 +326,10 @@ open class ProtoCompareGenerated(
if (!checkEqualsClassNestedClassName(old, new)) result.add(ProtoBufClassKind.NESTED_CLASS_NAME_LIST) if (!checkEqualsClassNestedClassName(old, new)) result.add(ProtoBufClassKind.NESTED_CLASS_NAME_LIST)
if (!checkEqualsClassContextReceiverType(old, new)) result.add(ProtoBufClassKind.CONTEXT_RECEIVER_TYPE_LIST)
if (!checkEqualsClassContextReceiverTypeId(old, new)) result.add(ProtoBufClassKind.CONTEXT_RECEIVER_TYPE_ID_LIST)
if (!checkEqualsClassConstructor(old, new)) result.add(ProtoBufClassKind.CONSTRUCTOR_LIST) if (!checkEqualsClassConstructor(old, new)) result.add(ProtoBufClassKind.CONSTRUCTOR_LIST)
if (!checkEqualsClassFunction(old, new)) result.add(ProtoBufClassKind.FUNCTION_LIST) if (!checkEqualsClassFunction(old, new)) result.add(ProtoBufClassKind.FUNCTION_LIST)
@@ -453,6 +463,10 @@ open class ProtoCompareGenerated(
if (!checkEquals(oldTypeTable.getType(old.receiverTypeId), newTypeTable.getType(new.receiverTypeId))) return false if (!checkEquals(oldTypeTable.getType(old.receiverTypeId), newTypeTable.getType(new.receiverTypeId))) return false
} }
if (!checkEqualsFunctionContextReceiverType(old, new)) return false
if (!checkEqualsFunctionContextReceiverTypeId(old, new)) return false
if (!checkEqualsFunctionValueParameter(old, new)) return false if (!checkEqualsFunctionValueParameter(old, new)) return false
if (!checkEqualsFunctionVersionRequirement(old, new)) return false if (!checkEqualsFunctionVersionRequirement(old, new)) return false
@@ -552,6 +566,10 @@ open class ProtoCompareGenerated(
if (!checkEquals(oldTypeTable.getType(old.receiverTypeId), newTypeTable.getType(new.receiverTypeId))) return false if (!checkEquals(oldTypeTable.getType(old.receiverTypeId), newTypeTable.getType(new.receiverTypeId))) return false
} }
if (!checkEqualsPropertyContextReceiverType(old, new)) return false
if (!checkEqualsPropertyContextReceiverTypeId(old, new)) return false
if (old.hasSetterValueParameter() != new.hasSetterValueParameter()) return false if (old.hasSetterValueParameter() != new.hasSetterValueParameter()) return false
if (old.hasSetterValueParameter()) { if (old.hasSetterValueParameter()) {
if (!checkEquals(old.setterValueParameter, new.setterValueParameter)) return false if (!checkEquals(old.setterValueParameter, new.setterValueParameter)) return false
@@ -1367,6 +1385,26 @@ open class ProtoCompareGenerated(
return true return true
} }
open fun checkEqualsClassContextReceiverType(old: ProtoBuf.Class, new: ProtoBuf.Class): Boolean {
if (old.contextReceiverTypeCount != new.contextReceiverTypeCount) return false
for(i in 0..old.contextReceiverTypeCount - 1) {
if (!checkEquals(old.getContextReceiverType(i), new.getContextReceiverType(i))) return false
}
return true
}
open fun checkEqualsClassContextReceiverTypeId(old: ProtoBuf.Class, new: ProtoBuf.Class): Boolean {
if (old.contextReceiverTypeIdCount != new.contextReceiverTypeIdCount) return false
for(i in 0..old.contextReceiverTypeIdCount - 1) {
if (!checkEquals(oldTypeTable.getType(old.getContextReceiverTypeId(i)), newTypeTable.getType(new.getContextReceiverTypeId(i)))) return false
}
return true
}
open fun checkEqualsClassConstructor(old: ProtoBuf.Class, new: ProtoBuf.Class): Boolean { open fun checkEqualsClassConstructor(old: ProtoBuf.Class, new: ProtoBuf.Class): Boolean {
if (old.constructorCount != new.constructorCount) return false if (old.constructorCount != new.constructorCount) return false
@@ -1447,6 +1485,26 @@ open class ProtoCompareGenerated(
return true return true
} }
open fun checkEqualsFunctionContextReceiverType(old: ProtoBuf.Function, new: ProtoBuf.Function): Boolean {
if (old.contextReceiverTypeCount != new.contextReceiverTypeCount) return false
for(i in 0..old.contextReceiverTypeCount - 1) {
if (!checkEquals(old.getContextReceiverType(i), new.getContextReceiverType(i))) return false
}
return true
}
open fun checkEqualsFunctionContextReceiverTypeId(old: ProtoBuf.Function, new: ProtoBuf.Function): Boolean {
if (old.contextReceiverTypeIdCount != new.contextReceiverTypeIdCount) return false
for(i in 0..old.contextReceiverTypeIdCount - 1) {
if (!checkEquals(oldTypeTable.getType(old.getContextReceiverTypeId(i)), newTypeTable.getType(new.getContextReceiverTypeId(i)))) return false
}
return true
}
open fun checkEqualsFunctionValueParameter(old: ProtoBuf.Function, new: ProtoBuf.Function): Boolean { open fun checkEqualsFunctionValueParameter(old: ProtoBuf.Function, new: ProtoBuf.Function): Boolean {
if (old.valueParameterCount != new.valueParameterCount) return false if (old.valueParameterCount != new.valueParameterCount) return false
@@ -1477,6 +1535,26 @@ open class ProtoCompareGenerated(
return true return true
} }
open fun checkEqualsPropertyContextReceiverType(old: ProtoBuf.Property, new: ProtoBuf.Property): Boolean {
if (old.contextReceiverTypeCount != new.contextReceiverTypeCount) return false
for(i in 0..old.contextReceiverTypeCount - 1) {
if (!checkEquals(old.getContextReceiverType(i), new.getContextReceiverType(i))) return false
}
return true
}
open fun checkEqualsPropertyContextReceiverTypeId(old: ProtoBuf.Property, new: ProtoBuf.Property): Boolean {
if (old.contextReceiverTypeIdCount != new.contextReceiverTypeIdCount) return false
for(i in 0..old.contextReceiverTypeIdCount - 1) {
if (!checkEquals(oldTypeTable.getType(old.getContextReceiverTypeId(i)), newTypeTable.getType(new.getContextReceiverTypeId(i)))) return false
}
return true
}
open fun checkEqualsPropertyVersionRequirement(old: ProtoBuf.Property, new: ProtoBuf.Property): Boolean { open fun checkEqualsPropertyVersionRequirement(old: ProtoBuf.Property, new: ProtoBuf.Property): Boolean {
if (old.versionRequirementCount != new.versionRequirementCount) return false if (old.versionRequirementCount != new.versionRequirementCount) return false
@@ -1742,6 +1820,14 @@ fun ProtoBuf.Class.hashCode(stringIndexes: (Int) -> Int, fqNameIndexes: (Int) ->
hashCode = 31 * hashCode + stringIndexes(getNestedClassName(i)) hashCode = 31 * hashCode + stringIndexes(getNestedClassName(i))
} }
for(i in 0..contextReceiverTypeCount - 1) {
hashCode = 31 * hashCode + getContextReceiverType(i).hashCode(stringIndexes, fqNameIndexes, typeById)
}
for(i in 0..contextReceiverTypeIdCount - 1) {
hashCode = 31 * hashCode + typeById(getContextReceiverTypeId(i)).hashCode(stringIndexes, fqNameIndexes, typeById)
}
for(i in 0..constructorCount - 1) { for(i in 0..constructorCount - 1) {
hashCode = 31 * hashCode + getConstructor(i).hashCode(stringIndexes, fqNameIndexes, typeById) hashCode = 31 * hashCode + getConstructor(i).hashCode(stringIndexes, fqNameIndexes, typeById)
} }
@@ -1858,6 +1944,14 @@ fun ProtoBuf.Function.hashCode(stringIndexes: (Int) -> Int, fqNameIndexes: (Int)
hashCode = 31 * hashCode + typeById(receiverTypeId).hashCode(stringIndexes, fqNameIndexes, typeById) hashCode = 31 * hashCode + typeById(receiverTypeId).hashCode(stringIndexes, fqNameIndexes, typeById)
} }
for(i in 0..contextReceiverTypeCount - 1) {
hashCode = 31 * hashCode + getContextReceiverType(i).hashCode(stringIndexes, fqNameIndexes, typeById)
}
for(i in 0..contextReceiverTypeIdCount - 1) {
hashCode = 31 * hashCode + typeById(getContextReceiverTypeId(i)).hashCode(stringIndexes, fqNameIndexes, typeById)
}
for(i in 0..valueParameterCount - 1) { for(i in 0..valueParameterCount - 1) {
hashCode = 31 * hashCode + getValueParameter(i).hashCode(stringIndexes, fqNameIndexes, typeById) hashCode = 31 * hashCode + getValueParameter(i).hashCode(stringIndexes, fqNameIndexes, typeById)
} }
@@ -1938,6 +2032,14 @@ fun ProtoBuf.Property.hashCode(stringIndexes: (Int) -> Int, fqNameIndexes: (Int)
hashCode = 31 * hashCode + typeById(receiverTypeId).hashCode(stringIndexes, fqNameIndexes, typeById) hashCode = 31 * hashCode + typeById(receiverTypeId).hashCode(stringIndexes, fqNameIndexes, typeById)
} }
for(i in 0..contextReceiverTypeCount - 1) {
hashCode = 31 * hashCode + getContextReceiverType(i).hashCode(stringIndexes, fqNameIndexes, typeById)
}
for(i in 0..contextReceiverTypeIdCount - 1) {
hashCode = 31 * hashCode + typeById(getContextReceiverTypeId(i)).hashCode(stringIndexes, fqNameIndexes, typeById)
}
if (hasSetterValueParameter()) { if (hasSetterValueParameter()) {
hashCode = 31 * hashCode + setterValueParameter.hashCode(stringIndexes, fqNameIndexes, typeById) hashCode = 31 * hashCode + setterValueParameter.hashCode(stringIndexes, fqNameIndexes, typeById)
} }
@@ -295,6 +295,11 @@ class DifferenceCalculatorForClass(
ProtoBufClassKind.INLINE_CLASS_UNDERLYING_TYPE_ID -> { ProtoBufClassKind.INLINE_CLASS_UNDERLYING_TYPE_ID -> {
isClassAffected = true isClassAffected = true
} }
ProtoBufClassKind.CONTEXT_RECEIVER_TYPE_LIST,
ProtoBufClassKind.CONTEXT_RECEIVER_TYPE_ID_LIST -> {
isClassAffected = true
areSubclassesAffected = true
}
} }
} }
File diff suppressed because it is too large Load Diff
@@ -120,6 +120,9 @@
"supertypeIdMemoizedSerializedSize": -1, "supertypeIdMemoizedSerializedSize": -1,
"nestedClassName_": [], "nestedClassName_": [],
"nestedClassNameMemoizedSerializedSize": -1, "nestedClassNameMemoizedSerializedSize": -1,
"contextReceiverType_": [],
"contextReceiverTypeId_": [],
"contextReceiverTypeIdMemoizedSerializedSize": -1,
"constructor_": [ "constructor_": [
{ {
"unknownFields": { "unknownFields": {
@@ -283,6 +286,9 @@
"memoizedHashCode": 0 "memoizedHashCode": 0
}, },
"receiverTypeId_": 0, "receiverTypeId_": 0,
"contextReceiverType_": [],
"contextReceiverTypeId_": [],
"contextReceiverTypeIdMemoizedSerializedSize": -1,
"valueParameter_": [], "valueParameter_": [],
"typeTable_": { "typeTable_": {
"unknownFields": { "unknownFields": {
@@ -458,6 +464,9 @@
"memoizedHashCode": 0 "memoizedHashCode": 0
}, },
"receiverTypeId_": 0, "receiverTypeId_": 0,
"contextReceiverType_": [],
"contextReceiverTypeId_": [],
"contextReceiverTypeIdMemoizedSerializedSize": -1,
"valueParameter_": [], "valueParameter_": [],
"typeTable_": { "typeTable_": {
"unknownFields": { "unknownFields": {
@@ -635,6 +644,9 @@
"memoizedHashCode": 0 "memoizedHashCode": 0
}, },
"receiverTypeId_": 0, "receiverTypeId_": 0,
"contextReceiverType_": [],
"contextReceiverTypeId_": [],
"contextReceiverTypeIdMemoizedSerializedSize": -1,
"setterValueParameter_": { "setterValueParameter_": {
"unknownFields": { "unknownFields": {
"bytes": [], "bytes": [],
@@ -860,6 +872,9 @@
"memoizedHashCode": 0 "memoizedHashCode": 0
}, },
"receiverTypeId_": 0, "receiverTypeId_": 0,
"contextReceiverType_": [],
"contextReceiverTypeId_": [],
"contextReceiverTypeIdMemoizedSerializedSize": -1,
"setterValueParameter_": { "setterValueParameter_": {
"unknownFields": { "unknownFields": {
"bytes": [], "bytes": [],
@@ -100,6 +100,13 @@ class DescriptorSerializer private constructor(
builder.addTypeParameter(typeParameter(typeParameterDescriptor)) 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)) { if (!KotlinBuiltIns.isSpecialClassWithNoSupertypes(classDescriptor)) {
// Special classes (Any, Nothing) have no supertypes // Special classes (Any, Nothing) have no supertypes
for (supertype in classDescriptor.typeConstructor.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() val versionRequirementTableProto = versionRequirementTable.serialize()
if (versionRequirementTableProto != null) { if (versionRequirementTableProto != null) {
builder.versionRequirementTable = versionRequirementTableProto 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 { versionRequirementTable?.run {
builder.addAllVersionRequirement(serializeVersionRequirements(descriptor)) builder.addAllVersionRequirement(serializeVersionRequirements(descriptor))
@@ -319,6 +339,10 @@ class DescriptorSerializer private constructor(
builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses))
} }
if (descriptor.contextReceiverParameters.isNotEmpty()) {
builder.addVersionRequirement(writeCompilerVersionRequirement(1, 6, 20))
}
if (local.metDefinitelyNotNullType) { if (local.metDefinitelyNotNullType) {
builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes)) 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) { for (valueParameterDescriptor in descriptor.valueParameters) {
builder.addValueParameter(local.valueParameter(valueParameterDescriptor)) builder.addValueParameter(local.valueParameter(valueParameterDescriptor))
} }
@@ -406,6 +437,10 @@ class DescriptorSerializer private constructor(
builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses))
} }
if (descriptor.contextReceiverParameters.isNotEmpty()) {
builder.addVersionRequirement(writeCompilerVersionRequirement(1, 6, 20))
}
if (local.metDefinitelyNotNullType) { if (local.metDefinitelyNotNullType) {
builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes)) builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes))
} }
@@ -747,6 +782,9 @@ class DescriptorSerializer private constructor(
return writeLanguageVersionRequirement(languageFeature, this) 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 // 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> = private fun MutableVersionRequirementTable.serializeVersionRequirements(descriptor: DeclarationDescriptor): List<Int> =
descriptor.annotations 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( fun writeVersionRequirement(
major: Int, major: Int,
minor: 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 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
)
}
} }
+9
View File
@@ -225,6 +225,9 @@ message Class {
repeated int32 nested_class_name = 7 [packed = true, (name_id_in_table) = true]; repeated int32 nested_class_name = 7 [packed = true, (name_id_in_table) = true];
repeated Type context_receiver_type = 20;
repeated int32 context_receiver_type_id = 21 [packed = true, (type_id_in_table) = true];
repeated Constructor constructor = 8; repeated Constructor constructor = 8;
repeated Function function = 9; repeated Function function = 9;
repeated Property property = 10; repeated Property property = 10;
@@ -316,6 +319,9 @@ message Function {
optional Type receiver_type = 5; optional Type receiver_type = 5;
optional int32 receiver_type_id = 8 [(type_id_in_table) = true]; optional int32 receiver_type_id = 8 [(type_id_in_table) = true];
repeated Type context_receiver_type = 10;
repeated int32 context_receiver_type_id = 11 [packed = true, (type_id_in_table) = true];
repeated ValueParameter value_parameter = 6; repeated ValueParameter value_parameter = 6;
optional TypeTable type_table = 30; optional TypeTable type_table = 30;
@@ -357,6 +363,9 @@ message Property {
optional Type receiver_type = 5; optional Type receiver_type = 5;
optional int32 receiver_type_id = 10 [(type_id_in_table) = true]; optional int32 receiver_type_id = 10 [(type_id_in_table) = true];
repeated Type context_receiver_type = 12;
repeated int32 context_receiver_type_id = 13 [packed = true, (type_id_in_table) = true];
optional ValueParameter setter_value_parameter = 6; optional ValueParameter setter_value_parameter = 6;
/* /*
File diff suppressed because it is too large Load Diff