K2: introduce JavaTypeParameterDefaultRepresentationWithDNN exp. feature
#KT-66447 Fixed
This commit is contained in:
committed by
Space Team
parent
4464385fa9
commit
cd20f31810
@@ -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<!>
|
||||
}
|
||||
|
||||
Vendored
+22
@@ -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
|
||||
}
|
||||
+22
@@ -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,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
|
||||
|
||||
+46
@@ -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)
|
||||
}
|
||||
+46
@@ -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<!>)
|
||||
}
|
||||
Vendored
+1
-1
@@ -1,5 +1,5 @@
|
||||
// !SKIP_JAVAC
|
||||
// !LANGUAGE: +ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated
|
||||
// !LANGUAGE: +ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated -JavaTypeParameterDefaultRepresentationWithDNN
|
||||
// FILE: SLRUMap.java
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
// !SKIP_JAVAC
|
||||
// !LANGUAGE: +ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated
|
||||
// !LANGUAGE: +ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated -JavaTypeParameterDefaultRepresentationWithDNN
|
||||
// FILE: SLRUMap.java
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
+42
@@ -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))
|
||||
}
|
||||
+42
@@ -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> {
|
||||
|
||||
+15
@@ -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>) {}
|
||||
}
|
||||
+15
@@ -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
@@ -1,5 +1,6 @@
|
||||
// FIR_IDENTICAL
|
||||
// FULL_JDK
|
||||
// LANGUAGE: -JavaTypeParameterDefaultRepresentationWithDNN
|
||||
|
||||
import java.util.Comparator;
|
||||
|
||||
|
||||
Vendored
+11
@@ -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
|
||||
|
||||
|
||||
Vendored
+10
@@ -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!!)
|
||||
}
|
||||
+10
@@ -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!!)
|
||||
}
|
||||
Vendored
+1
@@ -1,4 +1,5 @@
|
||||
// FIR_IDENTICAL
|
||||
// LANGUAGE: -JavaTypeParameterDefaultRepresentationWithDNN
|
||||
// ISSUE: KT-57014
|
||||
// FULL_JDK
|
||||
// JVM_TARGET: 1.8
|
||||
|
||||
+14
@@ -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
|
||||
+14
@@ -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
|
||||
Reference in New Issue
Block a user