Implement deprecation cycle for proper refinement rhs type in assignments for java fields

^KT-46727 Fixed
This commit is contained in:
Victor Petukhov
2021-09-24 12:51:25 +03:00
parent 0cb56be14f
commit e30d467304
17 changed files with 420 additions and 39 deletions
@@ -1,3 +1,4 @@
// !LANGUAGE: +RefineTypeCheckingOnAssignmentsToJavaFields
// WITH_RUNTIME
// FILE: Foo.java
@@ -25,6 +26,7 @@ public class Foo3<T> {
fun takeStarFoo(x: Foo<*>) {
x.value = <!ASSIGNMENT_TYPE_MISMATCH!>"test"<!>
x.value <!NONE_APPLICABLE!>+=<!> "test"
}
fun main1() {
@@ -42,6 +44,7 @@ public class Bar<T> {
fun takeStarBar(x: Bar<*>) {
<!SETTER_PROJECTED_OUT!>x.value<!> = "test"
x.value <!UNRESOLVED_REFERENCE!>+=<!> "test"
}
fun main2() {
@@ -55,6 +58,7 @@ fun main2() {
fun takeStarFoo2(x: Foo2<*>) {
x.value = <!ASSIGNMENT_TYPE_MISMATCH!>"test"<!>
x.value <!UNRESOLVED_REFERENCE!>+=<!> "test"
}
fun main3() {
@@ -71,6 +75,7 @@ public class Bar2<T> {
fun takeStarBar2(x: Bar2<*>) {
<!SETTER_PROJECTED_OUT!>x.value<!> = "test"
x.value <!UNRESOLVED_REFERENCE!>+=<!> "test"
}
fun main4() {
@@ -84,6 +89,7 @@ fun main4() {
fun takeStarFoo3(x: Foo3<*>) {
x.value = <!ASSIGNMENT_TYPE_MISMATCH!>"test"<!>
x.value <!NONE_APPLICABLE!>+=<!> "test"
}
fun main5() {
@@ -101,6 +107,7 @@ class Bar3<T> {
fun takeStarBar3(x: Bar3<*>) {
<!SETTER_PROJECTED_OUT!>x.value<!> = "test"
x.value <!UNRESOLVED_REFERENCE!>+=<!> "test"
}
fun main6() {
@@ -1,3 +1,4 @@
// !LANGUAGE: +RefineTypeCheckingOnAssignmentsToJavaFields
// WITH_RUNTIME
// FILE: Foo.java
@@ -25,6 +26,7 @@ public class Foo3<T> {
fun takeStarFoo(x: Foo<*>) {
x.value = <!TYPE_MISMATCH("Nothing!; String")!>"test"<!>
x.value <!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>+=<!> "test"
}
fun main1() {
@@ -42,6 +44,7 @@ public class Bar<T> {
fun takeStarBar(x: Bar<*>) {
<!SETTER_PROJECTED_OUT!>x.value<!> = "test"
x.value <!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>+=<!> "test"
}
fun main2() {
@@ -55,6 +58,7 @@ fun main2() {
fun takeStarFoo2(x: Foo2<*>) {
x.value = <!TYPE_MISMATCH("Nothing?; String")!>"test"<!>
x.value <!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>+=<!> "test"
}
fun main3() {
@@ -71,6 +75,7 @@ public class Bar2<T> {
fun takeStarBar2(x: Bar2<*>) {
x.value = <!TYPE_MISMATCH_DUE_TO_TYPE_PROJECTIONS("Nothing?; String; Bar2<CapturedType(*)>; public final var value: T? defined in Bar2")!>"test"<!>
x.value <!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>+=<!> "test"
}
fun main4() {
@@ -84,6 +89,7 @@ fun main4() {
fun takeStarFoo3(x: Foo3<*>) {
x.value = <!TYPE_MISMATCH("Nothing; String")!>"test"<!>
x.value <!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>+=<!> "test"
}
fun main5() {
@@ -101,6 +107,7 @@ class Bar3<T> {
fun takeStarBar3(x: Bar3<*>) {
x.value = <!TYPE_MISMATCH_DUE_TO_TYPE_PROJECTIONS("Nothing?; String; Bar3<CapturedType(*)>; public final var value: T? defined in Bar3")!>"test"<!>
x.value <!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>+=<!> "test"
}
fun main6() {
@@ -5,8 +5,10 @@ public fun main2(): kotlin.Unit
public fun main3(): kotlin.Unit
public fun main4(): kotlin.Unit
public fun main5(): kotlin.Unit
public fun main6(): kotlin.Unit
public fun takeStarBar(/*0*/ x: Bar<*>): kotlin.Unit
public fun takeStarBar2(/*0*/ x: Bar2<*>): kotlin.Unit
public fun takeStarBar3(/*0*/ x: Bar3<*>): kotlin.Unit
public fun takeStarFoo(/*0*/ x: Foo<*>): kotlin.Unit
public fun takeStarFoo2(/*0*/ x: Foo2<*>): kotlin.Unit
public fun takeStarFoo3(/*0*/ x: Foo3<*>): kotlin.Unit
@@ -27,6 +29,14 @@ public final class Bar2</*0*/ T> {
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class Bar3</*0*/ T> {
public constructor Bar3</*0*/ T>()
@field:kotlin.jvm.JvmField public final var value: T?
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public open class Foo</*0*/ T : kotlin.Any!> {
public constructor Foo</*0*/ T : kotlin.Any!>()
public final var value: T!
@@ -45,7 +55,7 @@ public open class Foo2</*0*/ T : kotlin.Any!> {
public open class Foo3</*0*/ T : kotlin.Any!> {
public constructor Foo3</*0*/ T : kotlin.Any!>()
@org.jetbrains.annotations.Nullable public final var value: T?
@org.jetbrains.annotations.NotNull public final var value: T
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
@@ -0,0 +1,118 @@
// !LANGUAGE: -RefineTypeCheckingOnAssignmentsToJavaFields
// WITH_RUNTIME
// FILE: Foo.java
public class Foo<T> {
public T value;
}
// FILE: Foo2.java
import org.jetbrains.annotations.Nullable;
public class Foo2<T> {
public @Nullable T value;
}
// FILE: Foo3.java
import org.jetbrains.annotations.NotNull;
public class Foo3<T> {
public @NotNull T value;
}
// FILE: main.kt
// --- from Java --- //
fun takeStarFoo(x: Foo<*>) {
x.value = <!ASSIGNMENT_TYPE_MISMATCH!>"test"<!>
x.value <!NONE_APPLICABLE!>+=<!> "test"
}
fun main1() {
val foo = Foo<Int>()
foo.value = 1
takeStarFoo(foo)
println(foo.value) // CCE: String cannot be cast to Number
}
// --- from Kotlin --- //
public class Bar<T> {
var value: T = null as T
}
fun takeStarBar(x: Bar<*>) {
<!SETTER_PROJECTED_OUT!>x.value<!> = "test"
x.value <!UNRESOLVED_REFERENCE!>+=<!> "test"
}
fun main2() {
val bar = Bar<Int>()
bar.value = 1
takeStarBar(bar)
println(bar.value) // CCE: String cannot be cast to Number
}
// --- from Java (nullable) --- //
fun takeStarFoo2(x: Foo2<*>) {
x.value = <!ASSIGNMENT_TYPE_MISMATCH!>"test"<!>
x.value <!UNRESOLVED_REFERENCE!>+=<!> "test"
}
fun main3() {
val foo = Foo2<Int>()
foo.value = 1
takeStarFoo2(foo)
println(foo.value) // CCE: String cannot be cast to Number
}
// --- from Kotlin (nullable) --- //
public class Bar2<T> {
var value: T? = null
}
fun takeStarBar2(x: Bar2<*>) {
<!SETTER_PROJECTED_OUT!>x.value<!> = "test"
x.value <!UNRESOLVED_REFERENCE!>+=<!> "test"
}
fun main4() {
val bar = Bar2<Int>()
bar.value = 1
takeStarBar2(bar)
println(bar.value) // CCE: String cannot be cast to Number
}
// --- from Java (not-null) --- //
fun takeStarFoo3(x: Foo3<*>) {
x.value = <!ASSIGNMENT_TYPE_MISMATCH!>"test"<!>
x.value <!NONE_APPLICABLE!>+=<!> "test"
}
fun main5() {
val foo = Foo3<Int>()
foo.value = 1
takeStarFoo3(foo)
println(foo.value) // CCE: String cannot be cast to Number
}
// --- from Kotlin (field) --- //
class Bar3<T> {
@JvmField
var value: T? = null
}
fun takeStarBar3(x: Bar3<*>) {
<!SETTER_PROJECTED_OUT!>x.value<!> = "test"
x.value <!UNRESOLVED_REFERENCE!>+=<!> "test"
}
fun main6() {
val bar = Bar3<Int>()
bar.value = 1
takeStarBar3(bar)
println(bar.value) // CCE: String cannot be cast to Number
}
@@ -0,0 +1,118 @@
// !LANGUAGE: -RefineTypeCheckingOnAssignmentsToJavaFields
// WITH_RUNTIME
// FILE: Foo.java
public class Foo<T> {
public T value;
}
// FILE: Foo2.java
import org.jetbrains.annotations.Nullable;
public class Foo2<T> {
public @Nullable T value;
}
// FILE: Foo3.java
import org.jetbrains.annotations.NotNull;
public class Foo3<T> {
public @NotNull T value;
}
// FILE: main.kt
// --- from Java --- //
fun takeStarFoo(x: Foo<*>) {
<!TYPE_MISMATCH_WARNING("Nothing!; String")!>x.value = "test"<!>
<!TYPE_MISMATCH_WARNING("Nothing!; String")!><!SMARTCAST_IMPOSSIBLE!>x.value<!> += "test"<!>
}
fun main1() {
val foo = Foo<Int>()
foo.value = 1
takeStarFoo(foo)
println(foo.value) // CCE: String cannot be cast to Number
}
// --- from Kotlin --- //
public class Bar<T> {
var value: T = null <!UNCHECKED_CAST!>as T<!>
}
fun takeStarBar(x: Bar<*>) {
<!SETTER_PROJECTED_OUT!>x.value<!> = "test"
x.value <!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>+=<!> "test"
}
fun main2() {
val bar = Bar<Int>()
bar.value = 1
takeStarBar(bar)
println(bar.value) // CCE: String cannot be cast to Number
}
// --- from Java (nullable) --- //
fun takeStarFoo2(x: Foo2<*>) {
<!TYPE_MISMATCH_WARNING("Nothing?; String")!>x.value = "test"<!>
<!TYPE_MISMATCH_WARNING("Nothing?; String")!><!SMARTCAST_IMPOSSIBLE!>x.value<!> += "test"<!>
}
fun main3() {
val foo = Foo2<Int>()
foo.value = 1
takeStarFoo2(foo)
println(foo.value) // CCE: String cannot be cast to Number
}
// --- from Kotlin (nullable) --- //
public class Bar2<T> {
var value: T? = null
}
fun takeStarBar2(x: Bar2<*>) {
x.value = <!TYPE_MISMATCH_DUE_TO_TYPE_PROJECTIONS("Nothing?; String; Bar2<CapturedType(*)>; public final var value: T? defined in Bar2")!>"test"<!>
x.value <!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>+=<!> "test"
}
fun main4() {
val bar = Bar2<Int>()
bar.value = 1
takeStarBar2(bar)
println(bar.value) // CCE: String cannot be cast to Number
}
// --- from Java (not-null) --- //
fun takeStarFoo3(x: Foo3<*>) {
<!TYPE_MISMATCH_WARNING("Nothing; String")!>x.value = "test"<!>
<!TYPE_MISMATCH_WARNING("Nothing; String")!><!SMARTCAST_IMPOSSIBLE!>x.value<!> += "test"<!>
}
fun main5() {
val foo = Foo3<Int>()
foo.value = 1
takeStarFoo3(foo)
println(foo.value) // CCE: String cannot be cast to Number
}
// --- from Kotlin (field) --- //
class Bar3<T> {
@JvmField
var value: T? = null
}
fun takeStarBar3(x: Bar3<*>) {
x.value = <!TYPE_MISMATCH_DUE_TO_TYPE_PROJECTIONS("Nothing?; String; Bar3<CapturedType(*)>; public final var value: T? defined in Bar3")!>"test"<!>
x.value <!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>+=<!> "test"
}
fun main6() {
val bar = Bar3<Int>()
bar.value = 1
takeStarBar3(bar)
println(bar.value) // CCE: String cannot be cast to Number
}
@@ -0,0 +1,62 @@
package
public fun main1(): kotlin.Unit
public fun main2(): kotlin.Unit
public fun main3(): kotlin.Unit
public fun main4(): kotlin.Unit
public fun main5(): kotlin.Unit
public fun main6(): kotlin.Unit
public fun takeStarBar(/*0*/ x: Bar<*>): kotlin.Unit
public fun takeStarBar2(/*0*/ x: Bar2<*>): kotlin.Unit
public fun takeStarBar3(/*0*/ x: Bar3<*>): kotlin.Unit
public fun takeStarFoo(/*0*/ x: Foo<*>): kotlin.Unit
public fun takeStarFoo2(/*0*/ x: Foo2<*>): kotlin.Unit
public fun takeStarFoo3(/*0*/ x: Foo3<*>): kotlin.Unit
public final class Bar</*0*/ T> {
public constructor Bar</*0*/ T>()
public final var value: T
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class Bar2</*0*/ T> {
public constructor Bar2</*0*/ T>()
public final var value: T?
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class Bar3</*0*/ T> {
public constructor Bar3</*0*/ T>()
@field:kotlin.jvm.JvmField public final var value: T?
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public open class Foo</*0*/ T : kotlin.Any!> {
public constructor Foo</*0*/ T : kotlin.Any!>()
public final var value: T!
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public open class Foo2</*0*/ T : kotlin.Any!> {
public constructor Foo2</*0*/ T : kotlin.Any!>()
@org.jetbrains.annotations.Nullable public final var value: T?
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public open class Foo3</*0*/ T : kotlin.Any!> {
public constructor Foo3</*0*/ T : kotlin.Any!>()
@org.jetbrains.annotations.NotNull public final var value: T
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}