Add version requirements for declarations with !! types
^KT-26245 Related
This commit is contained in:
committed by
TeamCityServer
parent
403406f92d
commit
37813d9d82
+46
-3
@@ -50,6 +50,13 @@ class DescriptorSerializer private constructor(
|
|||||||
) {
|
) {
|
||||||
private val contractSerializer = ContractSerializer()
|
private val contractSerializer = ContractSerializer()
|
||||||
|
|
||||||
|
private var metDefinitelyNotNullTypeStack: MutableList<Boolean> = mutableListOf(false)
|
||||||
|
private var metDefinitelyNotNullType: Boolean
|
||||||
|
get() = metDefinitelyNotNullTypeStack.last()
|
||||||
|
set(value) {
|
||||||
|
metDefinitelyNotNullTypeStack[metDefinitelyNotNullTypeStack.lastIndex] = value
|
||||||
|
}
|
||||||
|
|
||||||
private fun createChildSerializer(descriptor: DeclarationDescriptor): DescriptorSerializer =
|
private fun createChildSerializer(descriptor: DeclarationDescriptor): DescriptorSerializer =
|
||||||
DescriptorSerializer(
|
DescriptorSerializer(
|
||||||
descriptor, Interner(typeParameters), extension, typeTable, versionRequirementTable,
|
descriptor, Interner(typeParameters), extension, typeTable, versionRequirementTable,
|
||||||
@@ -61,7 +68,16 @@ class DescriptorSerializer private constructor(
|
|||||||
|
|
||||||
private fun useTypeTable(): Boolean = extension.shouldUseTypeTable()
|
private fun useTypeTable(): Boolean = extension.shouldUseTypeTable()
|
||||||
|
|
||||||
fun classProto(classDescriptor: ClassDescriptor): ProtoBuf.Class.Builder {
|
private inline fun <T> withNewMetDefinitelyNotNullType(block: () -> T): T {
|
||||||
|
metDefinitelyNotNullTypeStack.add(false)
|
||||||
|
return try {
|
||||||
|
block()
|
||||||
|
} finally {
|
||||||
|
metDefinitelyNotNullTypeStack.removeAt(metDefinitelyNotNullTypeStack.lastIndex)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun classProto(classDescriptor: ClassDescriptor): ProtoBuf.Class.Builder = withNewMetDefinitelyNotNullType {
|
||||||
val builder = ProtoBuf.Class.newBuilder()
|
val builder = ProtoBuf.Class.newBuilder()
|
||||||
|
|
||||||
val flags = Flags.getClassFlags(
|
val flags = Flags.getClassFlags(
|
||||||
@@ -174,10 +190,17 @@ class DescriptorSerializer private constructor(
|
|||||||
|
|
||||||
writeVersionRequirementForInlineClasses(classDescriptor, builder, versionRequirementTable)
|
writeVersionRequirementForInlineClasses(classDescriptor, builder, versionRequirementTable)
|
||||||
|
|
||||||
|
if (metDefinitelyNotNullType) {
|
||||||
|
builder.addVersionRequirement(
|
||||||
|
writeLanguageVersionRequirement(LanguageFeature.DefinitelyNotNullTypeParameters, versionRequirementTable)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
val versionRequirementTableProto = versionRequirementTable.serialize()
|
val versionRequirementTableProto = versionRequirementTable.serialize()
|
||||||
if (versionRequirementTableProto != null) {
|
if (versionRequirementTableProto != null) {
|
||||||
builder.versionRequirementTable = versionRequirementTableProto
|
builder.versionRequirementTable = versionRequirementTableProto
|
||||||
}
|
}
|
||||||
|
|
||||||
return builder
|
return builder
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -294,6 +317,10 @@ class DescriptorSerializer private constructor(
|
|||||||
if (descriptor.hasInlineClassTypesInSignature()) {
|
if (descriptor.hasInlineClassTypesInSignature()) {
|
||||||
builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses))
|
builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (local.metDefinitelyNotNullType) {
|
||||||
|
builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.DefinitelyNotNullTypeParameters))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension.serializeProperty(descriptor, builder, versionRequirementTable, local)
|
extension.serializeProperty(descriptor, builder, versionRequirementTable, local)
|
||||||
@@ -377,6 +404,10 @@ class DescriptorSerializer private constructor(
|
|||||||
if (descriptor.hasInlineClassTypesInSignature()) {
|
if (descriptor.hasInlineClassTypesInSignature()) {
|
||||||
builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses))
|
builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (local.metDefinitelyNotNullType) {
|
||||||
|
builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.DefinitelyNotNullTypeParameters))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
contractSerializer.serializeContractOfFunctionIfAny(descriptor, builder, this)
|
contractSerializer.serializeContractOfFunctionIfAny(descriptor, builder, this)
|
||||||
@@ -413,6 +444,10 @@ class DescriptorSerializer private constructor(
|
|||||||
if (descriptor.hasInlineClassTypesInSignature()) {
|
if (descriptor.hasInlineClassTypesInSignature()) {
|
||||||
builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses))
|
builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (local.metDefinitelyNotNullType) {
|
||||||
|
builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.DefinitelyNotNullTypeParameters))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension.serializeConstructor(descriptor, builder, local)
|
extension.serializeConstructor(descriptor, builder, local)
|
||||||
@@ -442,7 +477,7 @@ class DescriptorSerializer private constructor(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun typeAliasProto(descriptor: TypeAliasDescriptor): ProtoBuf.TypeAlias.Builder? {
|
private fun typeAliasProto(descriptor: TypeAliasDescriptor): ProtoBuf.TypeAlias.Builder? = withNewMetDefinitelyNotNullType {
|
||||||
if (!extension.shouldSerializeTypeAlias(descriptor)) return null
|
if (!extension.shouldSerializeTypeAlias(descriptor)) return null
|
||||||
|
|
||||||
val builder = ProtoBuf.TypeAlias.newBuilder()
|
val builder = ProtoBuf.TypeAlias.newBuilder()
|
||||||
@@ -475,6 +510,11 @@ class DescriptorSerializer private constructor(
|
|||||||
|
|
||||||
versionRequirementTable?.run {
|
versionRequirementTable?.run {
|
||||||
builder.addAllVersionRequirement(serializeVersionRequirements(descriptor))
|
builder.addAllVersionRequirement(serializeVersionRequirements(descriptor))
|
||||||
|
if (local.metDefinitelyNotNullType) {
|
||||||
|
builder.addVersionRequirement(
|
||||||
|
writeLanguageVersionRequirement(LanguageFeature.DefinitelyNotNullTypeParameters, versionRequirementTable)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (annotation in descriptor.nonSourceAnnotations) {
|
for (annotation in descriptor.nonSourceAnnotations) {
|
||||||
@@ -600,7 +640,10 @@ class DescriptorSerializer private constructor(
|
|||||||
builder.typeParameter = getTypeParameterId(descriptor)
|
builder.typeParameter = getTypeParameterId(descriptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.flags = Flags.getTypeFlags(false, type is DefinitelyNotNullType)
|
if (type.unwrap() is DefinitelyNotNullType) {
|
||||||
|
metDefinitelyNotNullType = true
|
||||||
|
builder.flags = Flags.getTypeFlags(false, true)
|
||||||
|
}
|
||||||
|
|
||||||
assert(type.arguments.isEmpty()) { "Found arguments for type constructor build on type parameter: $descriptor" }
|
assert(type.arguments.isEmpty()) { "Found arguments for type constructor build on type parameter: $descriptor" }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
interface A<T> {
|
||||||
|
fun foo(x: T!!)
|
||||||
|
|
||||||
|
val w: T!!
|
||||||
|
}
|
||||||
|
|
||||||
|
class B<X>(r: X!!)
|
||||||
|
|
||||||
|
fun <K> inside() {
|
||||||
|
object : A<K> {
|
||||||
|
override fun foo(x: K!!) {
|
||||||
|
}
|
||||||
|
|
||||||
|
override val w: K!!
|
||||||
|
get() = TODO("")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <F> bar1(x: F!!) {}
|
||||||
|
fun <F> bar2(x: F) = x!!
|
||||||
|
|
||||||
|
val <E> E.nn: E!! get() = this!!
|
||||||
|
|
||||||
|
class Outer {
|
||||||
|
abstract class R1<T, F : T!!> : A<T!!>
|
||||||
|
abstract class R2<T, F : T!!> : A<T>
|
||||||
|
|
||||||
|
abstract class W<T> : A<T>
|
||||||
|
}
|
||||||
|
|
||||||
|
typealias Alias<R> = A<R!!>
|
||||||
@@ -138,6 +138,28 @@ abstract class AbstractVersionRequirementTest : TestCaseWithTmpdir() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun testDefinitelyNotNull() {
|
||||||
|
doTest(
|
||||||
|
VersionRequirement.Version(1, 6), DeprecationLevel.ERROR, null, ProtoBuf.VersionRequirement.VersionKind.LANGUAGE_VERSION, null,
|
||||||
|
customLanguageVersion = LanguageVersion.KOTLIN_1_6,
|
||||||
|
fqNamesWithRequirements = listOf(
|
||||||
|
"test.A.foo",
|
||||||
|
"test.A.w",
|
||||||
|
"test.B.<init>",
|
||||||
|
"test.bar1",
|
||||||
|
"test.bar2",
|
||||||
|
"test.nn",
|
||||||
|
"test.Outer.R1",
|
||||||
|
"test.Outer.R2",
|
||||||
|
"test.Alias",
|
||||||
|
),
|
||||||
|
fqNamesWithoutRequirement = listOf(
|
||||||
|
"test.Outer",
|
||||||
|
"test.Outer.W",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fun testLanguageVersionViaAnnotation() {
|
fun testLanguageVersionViaAnnotation() {
|
||||||
doTest(
|
doTest(
|
||||||
VersionRequirement.Version(1, 1), DeprecationLevel.WARNING, "message",
|
VersionRequirement.Version(1, 1), DeprecationLevel.WARNING, "message",
|
||||||
|
|||||||
Reference in New Issue
Block a user