Prohibit unsafe covariant conversion for collections invariant in Java

This commit is contained in:
Denis Zharkov
2015-08-28 19:09:07 +03:00
parent 6dc08f76a6
commit 632e336782
23 changed files with 543 additions and 1 deletions
@@ -0,0 +1,16 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
// FILE: A.java
import java.util.*;
public class A {
void foo(List<Object> x) {}
}
// FILE: main.kt
abstract class B : MutableList<String>
fun main(a: A, b: B) {
a.foo(<!JAVA_TYPE_MISMATCH!>b<!>)
a.foo(b as List<Any>)
}
@@ -0,0 +1,39 @@
package
internal fun main(/*0*/ a: A, /*1*/ b: B): kotlin.Unit
public open class A {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open fun foo(/*0*/ x: kotlin.(Mutable)List<kotlin.Any!>!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
internal abstract class B : kotlin.MutableList<kotlin.String> {
public constructor B()
public abstract override /*1*/ /*fake_override*/ fun add(/*0*/ index: kotlin.Int, /*1*/ element: kotlin.String): kotlin.Unit
public abstract override /*1*/ /*fake_override*/ fun add(/*0*/ e: kotlin.String): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun addAll(/*0*/ c: kotlin.Collection<kotlin.String>): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun addAll(/*0*/ index: kotlin.Int, /*1*/ c: kotlin.Collection<kotlin.String>): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit
public abstract override /*1*/ /*fake_override*/ fun contains(/*0*/ o: kotlin.Any?): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun containsAll(/*0*/ c: kotlin.Collection<kotlin.Any?>): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun get(/*0*/ index: kotlin.Int): kotlin.String
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public abstract override /*1*/ /*fake_override*/ fun indexOf(/*0*/ o: kotlin.Any?): kotlin.Int
public abstract override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun iterator(): kotlin.MutableIterator<kotlin.String>
public abstract override /*1*/ /*fake_override*/ fun lastIndexOf(/*0*/ o: kotlin.Any?): kotlin.Int
public abstract override /*1*/ /*fake_override*/ fun listIterator(): kotlin.MutableListIterator<kotlin.String>
public abstract override /*1*/ /*fake_override*/ fun listIterator(/*0*/ index: kotlin.Int): kotlin.MutableListIterator<kotlin.String>
public abstract override /*1*/ /*fake_override*/ fun remove(/*0*/ o: kotlin.Any?): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun remove(/*0*/ index: kotlin.Int): kotlin.String
public abstract override /*1*/ /*fake_override*/ fun removeAll(/*0*/ c: kotlin.Collection<kotlin.Any?>): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun retainAll(/*0*/ c: kotlin.Collection<kotlin.Any?>): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun set(/*0*/ index: kotlin.Int, /*1*/ element: kotlin.String): kotlin.String
public abstract override /*1*/ /*fake_override*/ fun size(): kotlin.Int
public abstract override /*1*/ /*fake_override*/ fun subList(/*0*/ fromIndex: kotlin.Int, /*1*/ toIndex: kotlin.Int): kotlin.MutableList<kotlin.String>
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,14 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
// FILE: A.java
import java.util.*;
public class A {
void foo(List x) {}
}
// FILE: main.kt
fun main(a: A, ml: MutableList<String>, l: List<String>) {
a.foo(ml)
a.foo(l)
}
@@ -0,0 +1,11 @@
package
internal fun main(/*0*/ a: A, /*1*/ ml: kotlin.MutableList<kotlin.String>, /*2*/ l: kotlin.List<kotlin.String>): kotlin.Unit
public open class A {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open fun foo(/*0*/ x: kotlin.(Mutable)List<(raw) kotlin.Any?>!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,67 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
// FILE: A.java
import java.util.*;
public class A {
void foo(List<Object> x) {}
void foo(Iterable<Object> x) {}
void foo(Iterator<Object> x) {}
void foo(Set<Object> x) {}
void foo(Map<Object, Object> x) {}
void foo(Map.Entry<Object, Object> x) {}
void foo(List<List<Object>> x) {}
}
// FILE: main.kt
fun main(
a: A,
ml: MutableList<String>, l: List<String>,
ms: MutableSet<String>, s: Set<String>,
mm: MutableMap<Any, String>, m: Map<Any, String>,
mme: MutableMap.MutableEntry<Any, String>, me: Map.Entry<Any, String>,
mll: MutableList<MutableList<String>>, ll: List<List<String>>
) {
// Lists
a.foo(<!JAVA_TYPE_MISMATCH!>ml<!>)
a.foo(l)
a.foo(<!UNCHECKED_CAST!>ml as MutableList<Any><!>)
a.foo(l as List<Any>)
// Iterables
val mit: MutableIterable<String> = ml
val it: Iterable<String> = ml
a.foo(mit)
a.foo(it)
// Iterators
a.foo(ml.iterator())
a.foo(l.iterator())
// Sets
a.foo(<!JAVA_TYPE_MISMATCH!>ms<!>)
a.foo(s)
a.foo(<!UNCHECKED_CAST!>ms as MutableSet<Any><!>)
a.foo(s as Set<Any>)
// Maps
a.foo(<!JAVA_TYPE_MISMATCH!>mm<!>)
a.foo(m)
a.foo(<!UNCHECKED_CAST!>mm as MutableMap<Any, Any><!>)
a.foo(m as Map<Any, Any>)
// Map entries
a.foo(<!JAVA_TYPE_MISMATCH!>mme<!>)
a.foo(me)
a.foo(<!UNCHECKED_CAST!>mme as MutableMap.MutableEntry<Any, Any><!>)
a.foo(me as Map.Entry<Any, Any>)
// Lists of lists
a.foo(<!JAVA_TYPE_MISMATCH!>mll<!>)
a.foo(ll)
a.foo(<!UNCHECKED_CAST!>mll as MutableList<MutableList<Any>><!>)
a.foo(ll as List<List<Any>>)
}
@@ -0,0 +1,17 @@
package
internal fun main(/*0*/ a: A, /*1*/ ml: kotlin.MutableList<kotlin.String>, /*2*/ l: kotlin.List<kotlin.String>, /*3*/ ms: kotlin.MutableSet<kotlin.String>, /*4*/ s: kotlin.Set<kotlin.String>, /*5*/ mm: kotlin.MutableMap<kotlin.Any, kotlin.String>, /*6*/ m: kotlin.Map<kotlin.Any, kotlin.String>, /*7*/ mme: kotlin.MutableMap.MutableEntry<kotlin.Any, kotlin.String>, /*8*/ me: kotlin.Map.Entry<kotlin.Any, kotlin.String>, /*9*/ mll: kotlin.MutableList<kotlin.MutableList<kotlin.String>>, /*10*/ ll: kotlin.List<kotlin.List<kotlin.String>>): kotlin.Unit
public open class A {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open fun foo(/*0*/ x: kotlin.(Mutable)Iterable<kotlin.Any!>!): kotlin.Unit
public/*package*/ open fun foo(/*0*/ x: kotlin.(Mutable)Iterator<kotlin.Any!>!): kotlin.Unit
public/*package*/ open fun foo(/*0*/ x: kotlin.(Mutable)List<kotlin.(Mutable)List<kotlin.Any!>!>!): kotlin.Unit
public/*package*/ open fun foo(/*0*/ x: kotlin.(Mutable)List<kotlin.Any!>!): kotlin.Unit
public/*package*/ open fun foo(/*0*/ x: kotlin.(Mutable)Map.(Mutable)Entry<kotlin.Any!, kotlin.Any!>!): kotlin.Unit
public/*package*/ open fun foo(/*0*/ x: kotlin.(Mutable)Map<kotlin.Any!, kotlin.Any!>!): kotlin.Unit
public/*package*/ open fun foo(/*0*/ x: kotlin.(Mutable)Set<kotlin.Any!>!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,16 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
// FILE: A.java
import java.util.*;
public class A {
void foo(List<Object> x) {}
}
// FILE: main.kt
fun main(a: A, ml: Any) {
if (ml is <!CANNOT_CHECK_FOR_ERASED!>MutableList<String><!>) {
a.foo(<!JAVA_TYPE_MISMATCH, DEBUG_INFO_SMARTCAST!>ml<!>)
a.foo(<!UNCHECKED_CAST!>ml as List<Any><!>)
}
}
@@ -0,0 +1,11 @@
package
internal fun main(/*0*/ a: A, /*1*/ ml: kotlin.Any): kotlin.Unit
public open class A {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open fun foo(/*0*/ x: kotlin.(Mutable)List<kotlin.Any!>!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,18 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
// FILE: A.java
import java.util.*;
public class A {
void foo(List<? super String> x) {}
void bar(List<? super Object> x) {}
}
// FILE: main.kt
fun main(a: A, ml: MutableList<String>, l: List<String>) {
a.foo(ml)
a.foo(l)
a.bar(<!JAVA_TYPE_MISMATCH!>ml<!>)
a.bar(l)
}
@@ -0,0 +1,12 @@
package
internal fun main(/*0*/ a: A, /*1*/ ml: kotlin.MutableList<kotlin.String>, /*2*/ l: kotlin.List<kotlin.String>): kotlin.Unit
public open class A {
public constructor A()
public/*package*/ open fun bar(/*0*/ x: kotlin.(Mutable)List<in kotlin.Any!>!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open fun foo(/*0*/ x: kotlin.(Mutable)List<in kotlin.String!>!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,17 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
// FILE: A.java
import java.util.*;
public class A {
void foo(Out<Object> x) {}
void bar(Out<? extends Object> x) {}
}
// FILE: main.kt
public class Out<out T>()
fun main(a: A, o: Out<String>) {
a.foo(o)
a.bar(o)
}
@@ -0,0 +1,19 @@
package
internal fun main(/*0*/ a: A, /*1*/ o: Out<kotlin.String>): kotlin.Unit
public open class A {
public constructor A()
public/*package*/ open fun bar(/*0*/ x: Out<kotlin.Any!>!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open fun foo(/*0*/ x: Out<kotlin.Any!>!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class Out</*0*/ out T> {
public constructor Out</*0*/ out 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,14 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
// FILE: A.java
import java.util.*;
public class A {
void foo(List<Object> x) {}
List<String> bar() {}
}
// FILE: main.kt
fun main(a: A) {
a.foo(<!JAVA_TYPE_MISMATCH!>a.bar()<!>)
}
@@ -0,0 +1,12 @@
package
internal fun main(/*0*/ a: A): kotlin.Unit
public open class A {
public constructor A()
public/*package*/ open fun bar(): kotlin.(Mutable)List<kotlin.String!>!
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open fun foo(/*0*/ x: kotlin.(Mutable)List<kotlin.Any!>!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,49 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
// FILE: A.java
import java.util.*;
public class A {
void foo(List<?> x) {}
void foo(Iterable<?> x) {}
void foo(Iterator<?> x) {}
void foo(Set<?> x) {}
void foo(Map<?, ?> x) {}
void foo(Map.Entry<?, ?> x) {}
}
// FILE: main.kt
fun main(
a: A,
ml: MutableList<String>, l: List<String>,
ms: MutableSet<String>, s: Set<String>,
mm: MutableMap<Any, String>, m: Map<Any, String>,
mme: MutableMap.MutableEntry<Any, String>, me: Map.Entry<Any, String>
) {
// Lists
a.foo(ml)
a.foo(l)
// Iterables
val mit: MutableIterable<String> = ml
val it: Iterable<String> = ml
a.foo(mit)
a.foo(it)
// Iterators
a.foo(ml.iterator())
a.foo(l.iterator())
// Sets
a.foo(ms)
a.foo(s)
// Maps
a.foo(mm)
a.foo(m)
// Map entries
a.foo(mme)
a.foo(me)
}
@@ -0,0 +1,16 @@
package
internal fun main(/*0*/ a: A, /*1*/ ml: kotlin.MutableList<kotlin.String>, /*2*/ l: kotlin.List<kotlin.String>, /*3*/ ms: kotlin.MutableSet<kotlin.String>, /*4*/ s: kotlin.Set<kotlin.String>, /*5*/ mm: kotlin.MutableMap<kotlin.Any, kotlin.String>, /*6*/ m: kotlin.Map<kotlin.Any, kotlin.String>, /*7*/ mme: kotlin.MutableMap.MutableEntry<kotlin.Any, kotlin.String>, /*8*/ me: kotlin.Map.Entry<kotlin.Any, kotlin.String>): kotlin.Unit
public open class A {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open fun foo(/*0*/ x: kotlin.(Mutable)Iterable<*>!): kotlin.Unit
public/*package*/ open fun foo(/*0*/ x: kotlin.(Mutable)Iterator<*>!): kotlin.Unit
public/*package*/ open fun foo(/*0*/ x: kotlin.(Mutable)List<*>!): kotlin.Unit
public/*package*/ open fun foo(/*0*/ x: kotlin.(Mutable)Map.(Mutable)Entry<*, *>!): kotlin.Unit
public/*package*/ open fun foo(/*0*/ x: kotlin.(Mutable)Map<*, *>!): kotlin.Unit
public/*package*/ open fun foo(/*0*/ x: kotlin.(Mutable)Set<*>!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}