Move and fix tests on typeEnhancement with TYPE_USE annotations

This commit is contained in:
Denis Zharkov
2016-03-16 12:51:08 +03:00
parent a644dd3ae9
commit e96024017f
13 changed files with 84 additions and 52 deletions
@@ -0,0 +1,38 @@
// FILE: AnnotatedTypeArguments.java
import org.checkerframework.checker.nullness.qual.*;
interface P<X, Y> {}
interface L<T> {}
interface S<T> {}
class AnnotatedTypeArguments {
class A {
L<P<L<String>, S<?>>> foo(L<P<L<String>, S<?>>> x) {return null;}
}
class B extends A {
// some complicated type tree
// return type and argument's type differ only by nullability of outermost type
@Nullable
L<P<@NonNull L<@Nullable String>, @NonNull S<?>>> foo(@NonNull L<P<@NonNull L<@Nullable String>, @NonNull S<?>>> x) {return null;}
}
class C extends B {
// signature should be the same as in A
L<P<L<String>, S<?>>> foo(L<P<L<String>, S<?>>> x) {return null;}
}
class D1 extends C {
// signature should be the same as in A, but annotated String-type should be platform
L<P<L<@NonNull String>, S<?>>> foo(L<P<L<@NonNull String>, S<?>>> x) {return null;}
}
class D2 extends C {
// return type refined to not-nullable
// argument type here same as in A except outermost type (it becomes flexible because of conflict)
@NonNull
L<P<L<String>, S<?>>> foo(@Nullable L<P<L<String>, S<?>>> x) {return null;}
}
}
@@ -0,0 +1,48 @@
package
public/*package*/ open class AnnotatedTypeArguments {
public/*package*/ constructor AnnotatedTypeArguments()
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/*package*/ open inner class A {
public/*package*/ constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open fun foo(/*0*/ x: L<P<L<kotlin.String!>!, S<*>!>!>!): L<P<L<kotlin.String!>!, S<*>!>!>!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public/*package*/ open inner class B : AnnotatedTypeArguments.A {
public/*package*/ constructor B()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@org.checkerframework.checker.nullness.qual.Nullable() public/*package*/ open override /*1*/ fun foo(/*0*/ @org.checkerframework.checker.nullness.qual.NonNull() x: L<P<L<kotlin.String?>, S<*>>!>): L<P<L<kotlin.String?>, S<*>>!>?
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public/*package*/ open inner class C : AnnotatedTypeArguments.B {
public/*package*/ constructor C()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open override /*1*/ fun foo(/*0*/ x: L<P<L<kotlin.String?>, S<*>>!>): L<P<L<kotlin.String?>, S<*>>!>?
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public/*package*/ open inner class D1 : AnnotatedTypeArguments.C {
public/*package*/ constructor D1()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open override /*1*/ fun foo(/*0*/ x: L<P<L<kotlin.String!>, S<*>>!>): L<P<L<kotlin.String!>, S<*>>!>?
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public/*package*/ open inner class D2 : AnnotatedTypeArguments.C {
public/*package*/ constructor D2()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@org.checkerframework.checker.nullness.qual.NonNull() public/*package*/ open override /*1*/ fun foo(/*0*/ @org.checkerframework.checker.nullness.qual.Nullable() x: L<P<L<kotlin.String?>, S<*>>!>!): L<P<L<kotlin.String?>, S<*>>!>
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
@@ -0,0 +1,51 @@
// FILE: Outer.java
import org.checkerframework.checker.nullness.qual.*;
interface X<T> {}
interface Y<T> {}
class Outer {
class A {
<K, V> V foo(K x) { return null; }
<T> X<T> bar(Y<T> x) { return null; }
}
class B extends A {
// OK, non-platform types
@Override
<T1, T2> @NonNull T2 foo(@Nullable T1 x) { return null; }
// Parameter type is fully non-flexible (OK)
// Return type is `X<R!>?`.
// The reason is that we do not treat it as equal to return type of A.bar because they are base on different type parameters,
// so type enhancing happens only for outermost type.
// TODO: We should properly compare equality with specific local equality axioms (as when calculating overriden descriptors)
@Override
<R> @Nullable X<@Nullable R> bar(@NonNull Y<@NonNull R> x) { return null; }
}
class C extends B {
// OK, non-platform types
@Override
<I, J> J foo(I x) { return null; }
// Parameter type is fully non-flexible (OK)
// Return type is `X<R!>?`, same is in B
@Override
<E> X<E> bar(Y<E> x) { return null; }
}
class D extends C {
// Return type is not-nullable, covariantly overridden, OK
// Parameter type is flexible, because of conflict with supertype, OK
@Override
@NonNull
<U, W> W foo(@Nullable U x) { return null; }
@Override
<F> @NonNull X<@NonNull F> bar(@Nullable Y<@Nullable F> x) { return null; }
}
}
@@ -0,0 +1,44 @@
package
public/*package*/ open class Outer {
public/*package*/ constructor Outer()
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/*package*/ open inner class A {
public/*package*/ constructor A()
public/*package*/ open fun </*0*/ T : kotlin.Any!> bar(/*0*/ x: Y<T!>!): X<T!>!
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open fun </*0*/ K : kotlin.Any!, /*1*/ V : kotlin.Any!> foo(/*0*/ x: K!): V!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public/*package*/ open inner class B : Outer.A {
public/*package*/ constructor B()
@java.lang.Override() public/*package*/ open override /*1*/ fun </*0*/ R : kotlin.Any!> bar(/*0*/ @org.checkerframework.checker.nullness.qual.NonNull() x: Y<R>): X<R!>?
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@java.lang.Override() public/*package*/ open override /*1*/ fun </*0*/ T1 : kotlin.Any!, /*1*/ T2 : kotlin.Any!> foo(/*0*/ @org.checkerframework.checker.nullness.qual.Nullable() x: T1?): T2
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public/*package*/ open inner class C : Outer.B {
public/*package*/ constructor C()
@java.lang.Override() public/*package*/ open override /*1*/ fun </*0*/ E : kotlin.Any!> bar(/*0*/ x: Y<E>): X<E!>?
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@java.lang.Override() public/*package*/ open override /*1*/ fun </*0*/ I : kotlin.Any!, /*1*/ J : kotlin.Any!> foo(/*0*/ x: I?): J
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public/*package*/ open inner class D : Outer.C {
public/*package*/ constructor D()
@java.lang.Override() public/*package*/ open override /*1*/ fun </*0*/ F : kotlin.Any!> bar(/*0*/ @org.checkerframework.checker.nullness.qual.Nullable() x: Y<F!>!): X<F!>
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@java.lang.Override() @org.checkerframework.checker.nullness.qual.NonNull() public/*package*/ open override /*1*/ fun </*0*/ U : kotlin.Any!, /*1*/ W : kotlin.Any!> foo(/*0*/ @org.checkerframework.checker.nullness.qual.Nullable() x: U?): W
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
@@ -0,0 +1,37 @@
// FILE: Outer.java
import org.checkerframework.checker.nullness.qual.*;
interface Base<T> {}
interface Derived<E> extends Base<E> {}
class Outer {
class A {
@Nullable Base<@NonNull String> foo() { return null; }
}
class B extends A {
@Override
Base<String> foo() {}
}
class C extends A {
@Override
@NonNull Base<String> foo() {}
}
class D extends A {
@Override
Derived<String> foo() {}
}
class E extends A {
@Override
@NonNull Derived<String> foo() {}
}
class F extends A {
@Override
@NonNull Derived<@NonNull String> foo() {}
}
}
@@ -0,0 +1,56 @@
package
public/*package*/ open class Outer {
public/*package*/ constructor Outer()
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/*package*/ open inner class A {
public/*package*/ constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@org.checkerframework.checker.nullness.qual.Nullable() public/*package*/ open fun foo(): Base<kotlin.String>?
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public/*package*/ open inner class B : Outer.A {
public/*package*/ constructor B()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@java.lang.Override() public/*package*/ open override /*1*/ fun foo(): Base<kotlin.String>?
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public/*package*/ open inner class C : Outer.A {
public/*package*/ constructor C()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@java.lang.Override() @org.checkerframework.checker.nullness.qual.NonNull() public/*package*/ open override /*1*/ fun foo(): Base<kotlin.String>
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public/*package*/ open inner class D : Outer.A {
public/*package*/ constructor D()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@java.lang.Override() public/*package*/ open override /*1*/ fun foo(): Derived<kotlin.String!>?
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public/*package*/ open inner class E : Outer.A {
public/*package*/ constructor E()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@java.lang.Override() @org.checkerframework.checker.nullness.qual.NonNull() public/*package*/ open override /*1*/ fun foo(): Derived<kotlin.String!>
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public/*package*/ open inner class F : Outer.A {
public/*package*/ constructor F()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@java.lang.Override() @org.checkerframework.checker.nullness.qual.NonNull() public/*package*/ open override /*1*/ fun foo(): Derived<kotlin.String!>
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
@@ -0,0 +1,31 @@
// FILE: A.java
import org.checkerframework.checker.nullness.qual.*
public class A {
@Nullable Base<@NonNull String> foo() { return null; }
}
// FILE: a.kt
interface Base<T> {}
interface Derived<E> : Base<E> {}
fun bar1(): Derived<String> = null!!
fun bar2(): Derived<String?> = null!!
class B : A() {
override fun foo(): Base<String> { return bar1(); }
}
class C1 : A() {
override fun foo(): Derived<String> { return bar1(); }
}
class C2 : A() {
override fun foo(): Derived<String>? { return bar1(); }
}
class C3 : A() {
override fun foo(): <!RETURN_TYPE_MISMATCH_ON_OVERRIDE!>Derived<String?><!> { return bar2(); }
}
@@ -0,0 +1,56 @@
package
public fun bar1(): Derived<kotlin.String>
public fun bar2(): Derived<kotlin.String?>
public open class A {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@org.checkerframework.checker.nullness.qual.Nullable() public/*package*/ open fun foo(): Base<kotlin.String>?
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class B : A {
public constructor B()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected open override /*1*/ fun foo(): Base<kotlin.String>
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface Base</*0*/ 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 C1 : A {
public constructor C1()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected open override /*1*/ fun foo(): Derived<kotlin.String>
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class C2 : A {
public constructor C2()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected open override /*1*/ fun foo(): Derived<kotlin.String>?
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class C3 : A {
public constructor C3()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected open override /*1*/ fun foo(): Derived<kotlin.String?>
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface Derived</*0*/ E> : Base<E> {
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,8 @@
// FILE: A.java
import org.checkerframework.checker.nullness.qual.*;
import java.util.*;
class A {
List<@NonNull String> foo() {}
}
@@ -0,0 +1,9 @@
package
public/*package*/ open class A {
public/*package*/ constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open fun foo(): kotlin.collections.(Mutable)List<kotlin.String>!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}