diff --git a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/annotatedTypeArguments.kt b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/annotatedTypeArguments.kt new file mode 100644 index 00000000000..b2a46d6ba21 --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/annotatedTypeArguments.kt @@ -0,0 +1,38 @@ +// FILE: AnnotatedTypeArguments.java + +import org.jetbrains.annotations.*; + +interface P {} +interface L {} +interface S {} + +class AnnotatedTypeArguments { + + class A { + L, S>> foo(L, 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, @NotNull S>> foo(@NotNull L, @NotNull S>> x) {return null;} + } + + class C extends B { + // signature should be the same as in A + L, S>> foo(L, S>> x) {return null;} + } + + class D1 extends C { + // signature should be the same as in A, but annotated String-type should be platform + L, S>> foo(L, 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) + @NotNull + L, S>> foo(@Nullable L, S>> x) {return null;} + } +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/annotatedTypeArguments.txt b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/annotatedTypeArguments.txt new file mode 100644 index 00000000000..e5833bf45e6 --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/annotatedTypeArguments.txt @@ -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!, S<*>!>!>!): L!, 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.jetbrains.annotations.Nullable() public/*package*/ open override /*1*/ fun foo(/*0*/ org.jetbrains.annotations.NotNull() x: L, S<*>>!>): L, 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, S<*>>!>): L, 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, S<*>>!>): L, 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.jetbrains.annotations.NotNull() public/*package*/ open override /*1*/ fun foo(/*0*/ org.jetbrains.annotations.Nullable() x: L, S<*>>!>!): L, S<*>>!> + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/methodWithTypeParameter.kt b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/methodWithTypeParameter.kt new file mode 100644 index 00000000000..b676019d8fb --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/methodWithTypeParameter.kt @@ -0,0 +1,51 @@ +// FILE: Outer.java + +import org.jetbrains.annotations.*; + +interface X {} +interface Y {} + +class Outer { + class A { + V foo(K x) { return null; } + + X bar(Y x) { return null; } + } + + class B extends A { + // OK, non-platform types + @Override + @NotNull T2 foo(@Nullable T1 x) { return null; } + + // Parameter type is fully non-flexible (OK) + // Return type is `X?`. + // 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 + @Nullable X<@Nullable R> bar(@NotNull Y<@NotNull R> x) { return null; } + } + + class C extends B { + // OK, non-platform types + @Override + J foo(I x) { return null; } + + // Parameter type is fully non-flexible (OK) + // Return type is `X?`, same is in B + @Override + X bar(Y 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 + @NotNull + W foo(@Nullable U x) { return null; } + + + @Override + @NotNull X<@NotNull F> bar(@Nullable Y<@Nullable F> x) { return null; } + } +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/methodWithTypeParameter.txt b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/methodWithTypeParameter.txt new file mode 100644 index 00000000000..1621e611eb6 --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/methodWithTypeParameter.txt @@ -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 bar(/*0*/ x: Y!): X! + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public/*package*/ open fun 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 bar(/*0*/ org.jetbrains.annotations.NotNull() x: Y): X? + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + java.lang.Override() public/*package*/ open override /*1*/ fun foo(/*0*/ org.jetbrains.annotations.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 bar(/*0*/ x: Y): X? + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + java.lang.Override() public/*package*/ open override /*1*/ fun 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 bar(/*0*/ org.jetbrains.annotations.Nullable() x: Y!): X + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + java.lang.Override() org.jetbrains.annotations.NotNull() public/*package*/ open override /*1*/ fun foo(/*0*/ org.jetbrains.annotations.Nullable() x: U?): W + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/overriddenExtensions.kt b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/overriddenExtensions.kt new file mode 100644 index 00000000000..1cff51ea18f --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/overriddenExtensions.kt @@ -0,0 +1,63 @@ +// FILE: A.kt +open class A { + open fun String.foo(y: String?): Int = 1 + open fun String?.bar(y: String): Int = 1 +} + +class E : B1() { + fun baz() { + val x: String? = "" + + x.foo(x) + x.foo("") + x.bar(x) + x.bar("") + } + + override fun String.foo(y: String?): Int = 1 + override fun String?.bar(y: String): Int = 1 +} + +// FILE: B.java +import org.jetbrains.annotations.*; + +// Just inherit enhanced types +class B extends A { + @Override + int foo(String x, String y); + @Override + int bar(String x, String y); +} + +// FILE: B1.java +import org.jetbrains.annotations.*; + +// Just inherit enhanced types (annotations without conflicts) +class B1 extends A { + @Override + int foo(@NotNull String x, String y); + @Override + int bar(@Nullable String x, String y); +} + +// FILE: C.java +import org.jetbrains.annotations.*; + +// Conflicting annotations. Everything is flexible +class C extends A { + @Override + int foo(@Nullable String x, @NotNull String y); + @Override + int bar(@NotNull String x, @Nullable String y); +} + +// FILE: D.java +import org.jetbrains.annotations.*; + +// Just inherit enhanced types (annotations without conflicts) +class D extends B { + @Override + int foo(@Nullable String x, @Nullable String y); + @Override + int bar(@NotNull String x, @NotNull String y); +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/overriddenExtensions.txt b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/overriddenExtensions.txt new file mode 100644 index 00000000000..1813968a443 --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/overriddenExtensions.txt @@ -0,0 +1,56 @@ +package + +internal open class A { + public constructor A() + 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 + internal open fun kotlin.String?.bar(/*0*/ y: kotlin.String): kotlin.Int + internal open fun kotlin.String.foo(/*0*/ y: kotlin.String?): kotlin.Int +} + +public/*package*/ open class B : A { + public/*package*/ constructor B() + 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 + java.lang.Override() public/*package*/ open override /*1*/ fun kotlin.String?.bar(/*0*/ y: kotlin.String): kotlin.Int + java.lang.Override() public/*package*/ open override /*1*/ fun kotlin.String.foo(/*0*/ y: kotlin.String?): kotlin.Int +} + +public/*package*/ open class B1 : A { + public/*package*/ constructor B1() + 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 + java.lang.Override() public/*package*/ open override /*1*/ fun kotlin.String?.bar(/*0*/ y: kotlin.String): kotlin.Int + java.lang.Override() public/*package*/ open override /*1*/ fun kotlin.String.foo(/*0*/ y: kotlin.String?): kotlin.Int +} + +public/*package*/ open class C : A { + public/*package*/ constructor C() + 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 + java.lang.Override() public/*package*/ open override /*1*/ fun kotlin.String!.bar(/*0*/ org.jetbrains.annotations.Nullable() y: kotlin.String!): kotlin.Int + java.lang.Override() public/*package*/ open override /*1*/ fun kotlin.String!.foo(/*0*/ org.jetbrains.annotations.NotNull() y: kotlin.String!): kotlin.Int +} + +public/*package*/ open class D : B { + public/*package*/ constructor D() + 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 + java.lang.Override() public/*package*/ open override /*1*/ fun kotlin.String!.bar(/*0*/ org.jetbrains.annotations.NotNull() y: kotlin.String): kotlin.Int + java.lang.Override() public/*package*/ open override /*1*/ fun kotlin.String!.foo(/*0*/ org.jetbrains.annotations.Nullable() y: kotlin.String?): kotlin.Int +} + +internal final class E : B1 { + public constructor E() + internal final fun baz(): kotlin.Unit + 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 + internal open override /*1*/ fun kotlin.String?.bar(/*0*/ y: kotlin.String): kotlin.Int + internal open override /*1*/ fun kotlin.String.foo(/*0*/ y: kotlin.String?): kotlin.Int +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeDifferentConstructor.kt b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeDifferentConstructor.kt new file mode 100644 index 00000000000..c96a266a34f --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeDifferentConstructor.kt @@ -0,0 +1,37 @@ +// FILE: Outer.java + +import org.jetbrains.annotations.*; + +interface Base {} +interface Derived extends Base {} + +class Outer { + class A { + @Nullable Base<@NotNull String> foo() { return null; } + } + + class B extends A { + @Override + Base foo() {} + } + + class C extends A { + @Override + @NotNull Base foo() {} + } + + class D extends A { + @Override + Derived foo() {} + } + + class E extends A { + @Override + @NotNull Derived foo() {} + } + + class F extends A { + @Override + @NotNull Derived<@NotNull String> foo() {} + } +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeDifferentConstructor.txt b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeDifferentConstructor.txt new file mode 100644 index 00000000000..3de4b6bfdcd --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeDifferentConstructor.txt @@ -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.jetbrains.annotations.Nullable() public/*package*/ open fun foo(): Base? + 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? + 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.jetbrains.annotations.NotNull() public/*package*/ open override /*1*/ fun foo(): Base + 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? + 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.jetbrains.annotations.NotNull() public/*package*/ open override /*1*/ fun foo(): Derived + 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.jetbrains.annotations.NotNull() public/*package*/ open override /*1*/ fun foo(): Derived + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeOverrideInKotlin.kt b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeOverrideInKotlin.kt new file mode 100644 index 00000000000..a010f31db7c --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeOverrideInKotlin.kt @@ -0,0 +1,31 @@ +// FILE: A.java + +import org.jetbrains.annotations.*; + +public class A { + @Nullable Base<@NotNull String> foo() { return null; } +} + +// FILE: a.kt + +interface Base {} +interface Derived : Base {} + +fun bar1(): Derived = null!! +fun bar2(): Derived = null!! + +class B : A() { + override fun foo(): Base { return bar1(); } +} + +class C1 : A() { + override fun foo(): Derived { return bar1(); } +} + +class C2 : A() { + override fun foo(): Derived? { return bar1(); } +} + +class C3 : A() { + override fun foo(): Derived { return bar2(); } +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeOverrideInKotlin.txt b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeOverrideInKotlin.txt new file mode 100644 index 00000000000..e5613b2f150 --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeOverrideInKotlin.txt @@ -0,0 +1,56 @@ +package + +internal fun bar1(): Derived +internal fun bar2(): Derived + +public open class A { + public constructor A() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + org.jetbrains.annotations.Nullable() public/*package*/ open fun foo(): Base? + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal final class B : A { + public constructor B() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + internal open override /*1*/ fun foo(): Base + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal interface Base { + 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 +} + +internal final class C1 : A { + public constructor C1() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + internal open override /*1*/ fun foo(): Derived + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal final class C2 : A { + public constructor C2() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + internal open override /*1*/ fun foo(): Derived? + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal final class C3 : A { + public constructor C3() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + internal open override /*1*/ fun foo(): Derived + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal interface Derived : Base { + 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 +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/supertypeDifferentParameterNullability.kt b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/supertypeDifferentParameterNullability.kt new file mode 100644 index 00000000000..1d50f6f48ce --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/supertypeDifferentParameterNullability.kt @@ -0,0 +1,33 @@ +// FILE: A.java +import org.jetbrains.annotations.*; + +interface A { + void foo(@Nullable String x); +} + +// FILE: B.java +import org.jetbrains.annotations.*; + +interface B { + void foo(@NotNull String x); +} + +// FILE: C.kt + +class C1 : A, B { + override fun foo(x: String) {} +} + +class C2 : A, B { + override fun foo(x: String?) {} +} + +interface I : A, B + +class C3 : I { + override fun foo(x: String) {} +} + +class C4 : I { + override fun foo(x: String?) {} +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/supertypeDifferentParameterNullability.txt b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/supertypeDifferentParameterNullability.txt new file mode 100644 index 00000000000..2c6055689b2 --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/supertypeDifferentParameterNullability.txt @@ -0,0 +1,62 @@ +package + +public/*package*/ /*synthesized*/ fun A(/*0*/ function: (kotlin.String!) -> kotlin.Unit): A +public/*package*/ /*synthesized*/ fun B(/*0*/ function: (kotlin.String!) -> kotlin.Unit): B + +public/*package*/ interface A { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract fun foo(/*0*/ org.jetbrains.annotations.Nullable() x: kotlin.String?): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public/*package*/ interface B { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract fun foo(/*0*/ org.jetbrains.annotations.NotNull() x: kotlin.String): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal final class C1 : A, B { + public constructor C1() + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ fun foo(/*0*/ x: kotlin.String): kotlin.Unit + public abstract override /*1*/ /*fake_override*/ fun foo(/*0*/ org.jetbrains.annotations.Nullable() x: kotlin.String?): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal final class C2 : A, B { + public constructor C2() + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract override /*1*/ /*fake_override*/ fun foo(/*0*/ org.jetbrains.annotations.NotNull() x: kotlin.String): kotlin.Unit + public open override /*1*/ fun foo(/*0*/ x: kotlin.String?): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal final class C3 : I { + public constructor C3() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ fun foo(/*0*/ x: kotlin.String): kotlin.Unit + public abstract override /*1*/ /*fake_override*/ fun foo(/*0*/ org.jetbrains.annotations.Nullable() x: kotlin.String?): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal final class C4 : I { + public constructor C4() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract override /*1*/ /*fake_override*/ fun foo(/*0*/ org.jetbrains.annotations.NotNull() x: kotlin.String): kotlin.Unit + public open override /*1*/ fun foo(/*0*/ x: kotlin.String?): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal interface I : A, B { + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract override /*1*/ /*fake_override*/ fun foo(/*0*/ org.jetbrains.annotations.NotNull() x: kotlin.String): kotlin.Unit + public abstract override /*1*/ /*fake_override*/ fun foo(/*0*/ org.jetbrains.annotations.Nullable() x: kotlin.String?): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/supertypeDifferentReturnNullability.kt b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/supertypeDifferentReturnNullability.kt new file mode 100644 index 00000000000..fbc8c65470a --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/supertypeDifferentReturnNullability.kt @@ -0,0 +1,35 @@ +// FILE: A.java +import org.jetbrains.annotations.*; + +interface A { + @Nullable + String foo(); +} + +// FILE: B.java +import org.jetbrains.annotations.*; + +interface B { + @NotNull + String foo(); +} + +// FILE: C.kt + +class C1 : A, B { + override fun foo(): String? = "" +} + +class C2 : A, B { + override fun foo(): String = "" +} + +interface I : A, B + +class C3 : I { + override fun foo(): String? = "" +} + +class C4 : I { + override fun foo(): String = "" +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/supertypeDifferentReturnNullability.txt b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/supertypeDifferentReturnNullability.txt new file mode 100644 index 00000000000..20e5b74578a --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/supertypeDifferentReturnNullability.txt @@ -0,0 +1,57 @@ +package + +public/*package*/ /*synthesized*/ fun A(/*0*/ function: () -> kotlin.String!): A +public/*package*/ /*synthesized*/ fun B(/*0*/ function: () -> kotlin.String!): B + +public/*package*/ interface A { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + org.jetbrains.annotations.Nullable() public abstract fun foo(): kotlin.String? + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public/*package*/ interface B { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + org.jetbrains.annotations.NotNull() public abstract fun foo(): kotlin.String + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal final class C1 : A, B { + public constructor C1() + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*2*/ fun foo(): kotlin.String? + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal final class C2 : A, B { + public constructor C2() + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*2*/ fun foo(): kotlin.String + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal final class C3 : I { + public constructor C3() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ fun foo(): kotlin.String? + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal final class C4 : I { + public constructor C4() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ fun foo(): kotlin.String + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal interface I : A, B { + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + org.jetbrains.annotations.NotNull() public abstract override /*2*/ /*fake_override*/ fun foo(): kotlin.String + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index b5529a443fa..345a5ccaf38 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -10115,6 +10115,57 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } } + + @TestMetadata("compiler/testData/diagnostics/tests/platformTypes/typeEnhancement") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class TypeEnhancement extends AbstractJetDiagnosticsTest { + public void testAllFilesPresentInTypeEnhancement() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/platformTypes/typeEnhancement"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("annotatedTypeArguments.kt") + public void testAnnotatedTypeArguments() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/annotatedTypeArguments.kt"); + doTest(fileName); + } + + @TestMetadata("methodWithTypeParameter.kt") + public void testMethodWithTypeParameter() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/methodWithTypeParameter.kt"); + doTest(fileName); + } + + @TestMetadata("overriddenExtensions.kt") + public void testOverriddenExtensions() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/overriddenExtensions.kt"); + doTest(fileName); + } + + @TestMetadata("returnTypeDifferentConstructor.kt") + public void testReturnTypeDifferentConstructor() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeDifferentConstructor.kt"); + doTest(fileName); + } + + @TestMetadata("returnTypeOverrideInKotlin.kt") + public void testReturnTypeOverrideInKotlin() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/returnTypeOverrideInKotlin.kt"); + doTest(fileName); + } + + @TestMetadata("supertypeDifferentParameterNullability.kt") + public void testSupertypeDifferentParameterNullability() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/supertypeDifferentParameterNullability.kt"); + doTest(fileName); + } + + @TestMetadata("supertypeDifferentReturnNullability.kt") + public void testSupertypeDifferentReturnNullability() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/typeEnhancement/supertypeDifferentReturnNullability.kt"); + doTest(fileName); + } + } } @TestMetadata("compiler/testData/diagnostics/tests/recovery")