K2: introduce JavaTypeParameterDefaultRepresentationWithDNN exp. feature

#KT-66447 Fixed
This commit is contained in:
Mikhail Glukhikh
2024-03-11 18:09:43 +01:00
committed by Space Team
parent 4464385fa9
commit cd20f31810
35 changed files with 627 additions and 6 deletions
@@ -1,4 +1,5 @@
// FIR_IDENTICAL
// !LANGUAGE: -JavaTypeParameterDefaultRepresentationWithDNN
// ISSUE: KT-59138
// SKIP_TXT
// FILE: JavaClass.java
@@ -15,8 +16,8 @@ fun takeN(n: Number?): Int = 1
fun bar(n: Number?) {
fun takeN(n: Number): String = ""
// in K1, it was resolved to nullable takeN
// in K2, it would be resolved to not-nullable and may fail with NPE
// in K1 & K2, it is resolved to nullable takeN
// in K2 with DNN representation ON, it would be resolved to not-nullable and may fail with NPE
takeN(JavaClass.simpleId(n)).div(1)
takeN(JavaClass.simpleId(n)).<!UNRESOLVED_REFERENCE!>length<!>
}
@@ -0,0 +1,22 @@
// !LANGUAGE: +JavaTypeParameterDefaultRepresentationWithDNN
// ISSUE: KT-59138
// SKIP_TXT
// FILE: JavaClass.java
public class JavaClass {
public static <K> K simpleId(K k) { // fun <K> simpleId(k: K & Any..K?): K & Any..K? =
return k;
}
}
// FILE: main.kt
fun takeN(n: Number?): Int = 1
fun bar(n: Number?) {
fun takeN(n: Number): String = ""
// in K1 & K2, it is resolved to nullable takeN
// in K2 with DNN representation ON, it would be resolved to not-nullable and may fail with NPE
takeN(JavaClass.simpleId(n)).<!UNRESOLVED_REFERENCE!>div<!>(1)
takeN(JavaClass.simpleId(n)).length
}
@@ -0,0 +1,22 @@
// !LANGUAGE: +JavaTypeParameterDefaultRepresentationWithDNN
// ISSUE: KT-59138
// SKIP_TXT
// FILE: JavaClass.java
public class JavaClass {
public static <K> K simpleId(K k) { // fun <K> simpleId(k: K & Any..K?): K & Any..K? =
return k;
}
}
// FILE: main.kt
fun takeN(n: Number?): Int = 1
fun bar(n: Number?) {
fun takeN(n: Number): String = ""
// in K1 & K2, it is resolved to nullable takeN
// in K2 with DNN representation ON, it would be resolved to not-nullable and may fail with NPE
takeN(JavaClass.simpleId(n)).div(1)
takeN(JavaClass.simpleId(n)).<!UNRESOLVED_REFERENCE!>length<!>
}
+1
View File
@@ -1,5 +1,6 @@
// FIR_IDENTICAL
// FULL_JDK
// LANGUAGE: -JavaTypeParameterDefaultRepresentationWithDNN
// JVM_TARGET: 1.8
import java.util.concurrent.Future
@@ -0,0 +1,18 @@
// FULL_JDK
// LANGUAGE: +JavaTypeParameterDefaultRepresentationWithDNN
// JVM_TARGET: 1.8
import java.util.concurrent.Future
import java.util.concurrent.atomic.AtomicReference
fun foo(future: Future<String?>) {
future.get().length
}
fun bar(threadLocal: ThreadLocal<String?>) {
threadLocal.get().length
}
fun baz(ref: AtomicReference<String?>) {
ref.get().length
}
@@ -0,0 +1,18 @@
// FULL_JDK
// LANGUAGE: +JavaTypeParameterDefaultRepresentationWithDNN
// JVM_TARGET: 1.8
import java.util.concurrent.Future
import java.util.concurrent.atomic.AtomicReference
fun foo(future: Future<String?>) {
future.get()<!UNSAFE_CALL!>.<!>length
}
fun bar(threadLocal: ThreadLocal<String?>) {
threadLocal.get()<!UNSAFE_CALL!>.<!>length
}
fun baz(ref: AtomicReference<String?>) {
ref.get()<!UNSAFE_CALL!>.<!>length
}
@@ -1,4 +1,5 @@
// FULL_JDK
// LANGUAGE: -JavaTypeParameterDefaultRepresentationWithDNN
// ISSUE: KT-65184
// FILE: A.java
@@ -1,4 +1,5 @@
// FULL_JDK
// LANGUAGE: -JavaTypeParameterDefaultRepresentationWithDNN
// ISSUE: KT-65184
// FILE: A.java
@@ -0,0 +1,46 @@
// FULL_JDK
// LANGUAGE: +JavaTypeParameterDefaultRepresentationWithDNN
// ISSUE: KT-65184
// FILE: A.java
public class A<T> {
}
// FILE: B.java
public class B<T> extends A<T> {
}
// FILE: box.kt
import java.util.LinkedList
import java.util.Queue
fun bar(b: A<String>) {}
fun func(p: A<B<String>>) {
}
class X {
fun bar(b: Queue<String>) {}
}
fun test(x : X) {
x.bar(LinkedList<String?>())
bar(B<String?>())
func(A<B<String>>())
func(<!ARGUMENT_TYPE_MISMATCH!>A<B<String?>>()<!>)
func(<!ARGUMENT_TYPE_MISMATCH!>A<B<String?>?>()<!>)
func(<!ARGUMENT_TYPE_MISMATCH!>A<B<String>?>()<!>)
}
class C {
fun bar(b: Queue<String>) {}
}
fun test(c: C, jj: LinkedList<String?>) {
c.bar(jj)
}
@@ -0,0 +1,46 @@
// FULL_JDK
// LANGUAGE: +JavaTypeParameterDefaultRepresentationWithDNN
// ISSUE: KT-65184
// FILE: A.java
public class A<T> {
}
// FILE: B.java
public class B<T> extends A<T> {
}
// FILE: box.kt
import java.util.LinkedList
import java.util.Queue
fun bar(b: A<String>) {}
fun func(p: A<B<String>>) {
}
class X {
fun bar(b: Queue<String>) {}
}
fun test(x : X) {
x.bar(<!TYPE_MISMATCH!>LinkedList<String?>()<!>)
bar(<!TYPE_MISMATCH!>B<String?>()<!>)
func(A<B<String>>())
func(<!TYPE_MISMATCH!>A<B<String?>>()<!>)
func(<!TYPE_MISMATCH!>A<B<String?>?>()<!>)
func(<!TYPE_MISMATCH!>A<B<String>?>()<!>)
}
class C {
fun bar(b: Queue<String>) {}
}
fun test(c: C, jj: LinkedList<String?>) {
c.bar(<!TYPE_MISMATCH!>jj<!>)
}
@@ -1,5 +1,5 @@
// !SKIP_JAVAC
// !LANGUAGE: +ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated
// !LANGUAGE: +ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated -JavaTypeParameterDefaultRepresentationWithDNN
// FILE: SLRUMap.java
import org.jetbrains.annotations.NotNull;
@@ -1,5 +1,5 @@
// !SKIP_JAVAC
// !LANGUAGE: +ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated
// !LANGUAGE: +ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated -JavaTypeParameterDefaultRepresentationWithDNN
// FILE: SLRUMap.java
import org.jetbrains.annotations.NotNull;
@@ -0,0 +1,42 @@
// !SKIP_JAVAC
// !LANGUAGE: +ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated +JavaTypeParameterDefaultRepresentationWithDNN
// FILE: SLRUMap.java
import org.jetbrains.annotations.NotNull;
import java.util.List;
public interface SLRUMap<V> {
void takeV(@NotNull V value);
<E> void takeE(@NotNull E value);
void takeVList(@NotNull List<@NotNull V> value);
<E> void takeEList(@NotNull List<@NotNull E> value);
public <K> K id(K value) { return null; }
}
// FILE: main.kt
fun <V> SLRUMap<V>.getOrPut(value: V, l: List<V>) {
takeV(<!ARGUMENT_TYPE_MISMATCH!>value<!>)
takeVList(<!ARGUMENT_TYPE_MISMATCH!>l<!>)
takeE(<!ARGUMENT_TYPE_MISMATCH!>value<!>)
takeEList(<!ARGUMENT_TYPE_MISMATCH!>l<!>)
takeE(id(value))
if (value != null) {
takeV(value)
takeE(value)
takeE(id(value))
}
}
fun <V : Any> SLRUMap<V>.getOrPutNN(value: V, l: List<V>) {
takeV(value)
takeVList(l)
takeE(value)
takeEList(l)
takeE(id(value))
}
@@ -0,0 +1,42 @@
// !SKIP_JAVAC
// !LANGUAGE: +ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated +JavaTypeParameterDefaultRepresentationWithDNN
// FILE: SLRUMap.java
import org.jetbrains.annotations.NotNull;
import java.util.List;
public interface SLRUMap<V> {
void takeV(@NotNull V value);
<E> void takeE(@NotNull E value);
void takeVList(@NotNull List<@NotNull V> value);
<E> void takeEList(@NotNull List<@NotNull E> value);
public <K> K id(K value) { return null; }
}
// FILE: main.kt
fun <V> SLRUMap<V>.getOrPut(value: V, l: List<V>) {
takeV(<!TYPE_MISMATCH!>value<!>)
takeVList(<!TYPE_MISMATCH!>l<!>)
takeE(<!TYPE_MISMATCH!>value<!>)
takeEList(<!TYPE_MISMATCH!>l<!>)
takeE(<!TYPE_MISMATCH!>id(value)<!>)
if (value != null) {
takeV(<!DEBUG_INFO_SMARTCAST!>value<!>)
takeE(<!DEBUG_INFO_SMARTCAST!>value<!>)
takeE(id(value))
}
}
fun <V : Any> SLRUMap<V>.getOrPutNN(value: V, l: List<V>) {
takeV(value)
takeVList(l)
takeE(value)
takeEList(l)
takeE(id(value))
}
@@ -1,4 +1,5 @@
// FIR_IDENTICAL
// LANGUAGE: -JavaTypeParameterDefaultRepresentationWithDNN
// ISSUE: KT-58933
// FILE: J.java
public interface J<T> {
@@ -0,0 +1,15 @@
// LANGUAGE: +JavaTypeParameterDefaultRepresentationWithDNN
// ISSUE: KT-58933
// FILE: J.java
public interface J<T> {
void simple(T t);
void box(Box<T> box);
}
// FILE: test.kt
class Box<T>
class K<T> : J<T> {
override fun simple(t: T & Any) {}
override fun box(box: Box<T & Any>) {}
}
@@ -0,0 +1,15 @@
// LANGUAGE: +JavaTypeParameterDefaultRepresentationWithDNN
// ISSUE: KT-58933
// FILE: J.java
public interface J<T> {
void simple(T t);
void box(Box<T> box);
}
// FILE: test.kt
class Box<T>
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>class K<!><T> : J<T> {
<!NOTHING_TO_OVERRIDE!>override<!> fun simple(t: T & Any) {}
<!NOTHING_TO_OVERRIDE!>override<!> fun box(box: Box<T & Any>) {}
}
@@ -1,5 +1,6 @@
// FIR_IDENTICAL
// FULL_JDK
// LANGUAGE: -JavaTypeParameterDefaultRepresentationWithDNN
import java.util.Comparator;
@@ -0,0 +1,11 @@
// FIR_IDENTICAL
// FULL_JDK
// LANGUAGE: +JavaTypeParameterDefaultRepresentationWithDNN
import java.util.Comparator;
fun foo() {
Comparator.comparing<String?, Boolean?> {
it != ""
}
}
@@ -1,4 +1,5 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE
// LANGUAGE: -JavaTypeParameterDefaultRepresentationWithDNN
interface Foo
@@ -1,4 +1,5 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE
// LANGUAGE: -JavaTypeParameterDefaultRepresentationWithDNN
interface Foo
@@ -0,0 +1,10 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE
// LANGUAGE: +JavaTypeParameterDefaultRepresentationWithDNN
interface Foo
fun test() {
var nullable: Foo? = null
val foo: Collection<Foo> = java.util.Collections.singleton(nullable)
val foo1: Collection<Foo> = java.util.Collections.singleton(nullable!!)
}
@@ -0,0 +1,10 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE
// LANGUAGE: +JavaTypeParameterDefaultRepresentationWithDNN
interface Foo
fun test() {
var nullable: Foo? = null
val foo: Collection<Foo> = <!TYPE_MISMATCH!>java.util.Collections.singleton(nullable)<!>
val foo1: Collection<Foo> = java.util.Collections.singleton(nullable!!)
}
@@ -1,4 +1,5 @@
// FIR_IDENTICAL
// LANGUAGE: -JavaTypeParameterDefaultRepresentationWithDNN
// ISSUE: KT-57014
// FULL_JDK
// JVM_TARGET: 1.8
@@ -0,0 +1,14 @@
// LANGUAGE: +JavaTypeParameterDefaultRepresentationWithDNN
// ISSUE: KT-57014
// FULL_JDK
// JVM_TARGET: 1.8
import java.util.function.Supplier
fun main() {
val sam = Supplier<String> {
<!ARGUMENT_TYPE_MISMATCH!>foo()<!>
}
}
fun foo(): String? = null
@@ -0,0 +1,14 @@
// LANGUAGE: +JavaTypeParameterDefaultRepresentationWithDNN
// ISSUE: KT-57014
// FULL_JDK
// JVM_TARGET: 1.8
import java.util.function.Supplier
fun main() {
val sam = Supplier<String> {
foo()
}
}
fun foo(): String? = null