[FIR] Implement warnings for java nullability type mismatch on override

#KT-56989
This commit is contained in:
Kirill Rakhman
2023-09-20 17:32:41 +02:00
committed by Space Team
parent a6fdeeb7df
commit 2df1e9dde6
21 changed files with 330 additions and 158 deletions
@@ -17,6 +17,8 @@ public class BaseClass {
public @Nullable Foo mixed(Foo x) { return null; }
public Foo explicitlyNullnessUnspecified(@NullnessUnspecified Foo x) { return null; }
public static Foo foo() { return null; }
}
@@ -24,7 +26,11 @@ public class BaseClass {
private val FOO = object : Foo {}
class Correct : BaseClass() {
open class IntermediateClass : BaseClass() {
open fun intermediateNotNull() = BaseClass.foo()
}
class Correct : IntermediateClass() {
override fun everythingNotNullable(x: Foo): Foo {
return FOO
}
@@ -44,24 +50,32 @@ class Correct : BaseClass() {
override fun explicitlyNullnessUnspecified(x: Foo): Foo {
return FOO
}
override fun intermediateNotNull(): Foo {
return FOO
}
}
class WrongReturnTypes : BaseClass() {
override fun everythingNotNullable(x: Foo): Foo? {
class WrongReturnTypes : IntermediateClass() {
<!WRONG_NULLABILITY_FOR_JAVA_OVERRIDE!>override<!> fun everythingNotNullable(x: Foo): Foo? {
return null
}
override fun explicitlyNullnessUnspecified(x: Foo): Foo? {
<!WRONG_NULLABILITY_FOR_JAVA_OVERRIDE!>override<!> fun explicitlyNullnessUnspecified(x: Foo): Foo? {
return null
}
<!WRONG_NULLABILITY_FOR_JAVA_OVERRIDE!>override<!> fun intermediateNotNull(): Foo? {
return null
}
}
class WrongParameter : BaseClass() {
override fun everythingNotNullable(x: Foo?): Foo {
class WrongParameter : IntermediateClass() {
<!WRONG_NULLABILITY_FOR_JAVA_OVERRIDE!>override<!> fun everythingNotNullable(x: Foo?): Foo {
return FOO
}
override fun everythingNullable(x: Foo): Foo? {
<!WRONG_NULLABILITY_FOR_JAVA_OVERRIDE!>override<!> fun everythingNullable(x: Foo): Foo? {
return null
}
@@ -69,11 +83,11 @@ class WrongParameter : BaseClass() {
return null
}
override fun mixed(x: Foo?): Foo? {
<!WRONG_NULLABILITY_FOR_JAVA_OVERRIDE!>override<!> fun mixed(x: Foo?): Foo? {
return null
}
override fun explicitlyNullnessUnspecified(x: Foo?): Foo {
return FOO
}
}
}
@@ -17,6 +17,8 @@ public class BaseClass {
public @Nullable Foo mixed(Foo x) { return null; }
public Foo explicitlyNullnessUnspecified(@NullnessUnspecified Foo x) { return null; }
public static Foo foo() { return null; }
}
@@ -24,7 +26,11 @@ public class BaseClass {
private val FOO = object : Foo {}
class Correct : BaseClass() {
open class IntermediateClass : BaseClass() {
open fun intermediateNotNull() = BaseClass.foo()
}
class Correct : IntermediateClass() {
override fun everythingNotNullable(x: Foo): Foo {
return FOO
}
@@ -44,9 +50,13 @@ class Correct : BaseClass() {
override fun explicitlyNullnessUnspecified(x: Foo): Foo {
return FOO
}
override fun intermediateNotNull(): Foo {
return FOO
}
}
class WrongReturnTypes : BaseClass() {
class WrongReturnTypes : IntermediateClass() {
<!WRONG_NULLABILITY_FOR_JAVA_OVERRIDE!>override<!> fun everythingNotNullable(x: Foo): Foo? {
return null
}
@@ -54,9 +64,13 @@ class WrongReturnTypes : BaseClass() {
<!WRONG_NULLABILITY_FOR_JAVA_OVERRIDE!>override<!> fun explicitlyNullnessUnspecified(x: Foo): Foo? {
return null
}
override fun intermediateNotNull(): Foo? {
return null
}
}
class WrongParameter : BaseClass() {
class WrongParameter : IntermediateClass() {
<!WRONG_NULLABILITY_FOR_JAVA_OVERRIDE!>override<!> fun everythingNotNullable(x: Foo?): Foo {
return FOO
}
@@ -12,9 +12,12 @@ private val FOO: FOO.`<no name provided>`
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
@org.jspecify.annotations.Nullable public open fun mixed(/*0*/ x: Foo!): @org.jspecify.annotations.Nullable Foo!
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public open fun foo(): Foo!
}
public final class Correct : BaseClass {
public final class Correct : IntermediateClass {
public constructor Correct()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ fun everythingNotNullable(/*0*/ x: Foo): Foo
@@ -22,6 +25,7 @@ public final class Correct : BaseClass {
public open override /*1*/ fun everythingUnknown(/*0*/ x: Foo?): Foo?
public open override /*1*/ fun explicitlyNullnessUnspecified(/*0*/ x: Foo): Foo
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ fun intermediateNotNull(): Foo
public open override /*1*/ fun mixed(/*0*/ x: Foo): Foo?
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -32,7 +36,20 @@ public interface Foo {
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class WrongParameter : BaseClass {
public open class IntermediateClass : BaseClass {
public constructor IntermediateClass()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun everythingNotNullable(/*0*/ x: Foo!): Foo!
@org.jspecify.annotations.Nullable public open override /*1*/ /*fake_override*/ fun everythingNullable(/*0*/ @org.jspecify.annotations.Nullable x: @org.jspecify.annotations.Nullable Foo!): @org.jspecify.annotations.Nullable Foo!
@org.jspecify.annotations.NullnessUnspecified public open override /*1*/ /*fake_override*/ fun everythingUnknown(/*0*/ @org.jspecify.annotations.NullnessUnspecified x: @org.jspecify.annotations.NullnessUnspecified Foo!): @org.jspecify.annotations.NullnessUnspecified Foo!
public open override /*1*/ /*fake_override*/ fun explicitlyNullnessUnspecified(/*0*/ @org.jspecify.annotations.NullnessUnspecified x: @org.jspecify.annotations.NullnessUnspecified Foo!): Foo!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open fun intermediateNotNull(): Foo!
@org.jspecify.annotations.Nullable public open override /*1*/ /*fake_override*/ fun mixed(/*0*/ x: Foo!): @org.jspecify.annotations.Nullable Foo!
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class WrongParameter : IntermediateClass {
public constructor WrongParameter()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ fun everythingNotNullable(/*0*/ x: Foo?): Foo
@@ -40,11 +57,12 @@ public final class WrongParameter : BaseClass {
public open override /*1*/ fun everythingUnknown(/*0*/ x: Foo): Foo?
public open override /*1*/ fun explicitlyNullnessUnspecified(/*0*/ x: Foo?): Foo
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun intermediateNotNull(): Foo!
public open override /*1*/ fun mixed(/*0*/ x: Foo?): Foo?
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class WrongReturnTypes : BaseClass {
public final class WrongReturnTypes : IntermediateClass {
public constructor WrongReturnTypes()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ fun everythingNotNullable(/*0*/ x: Foo): Foo?
@@ -52,6 +70,8 @@ public final class WrongReturnTypes : BaseClass {
@org.jspecify.annotations.NullnessUnspecified public open override /*1*/ /*fake_override*/ fun everythingUnknown(/*0*/ @org.jspecify.annotations.NullnessUnspecified x: @org.jspecify.annotations.NullnessUnspecified Foo!): @org.jspecify.annotations.NullnessUnspecified Foo!
public open override /*1*/ fun explicitlyNullnessUnspecified(/*0*/ x: Foo): Foo?
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ fun intermediateNotNull(): Foo?
@org.jspecify.annotations.Nullable public open override /*1*/ /*fake_override*/ fun mixed(/*0*/ x: Foo!): @org.jspecify.annotations.Nullable Foo!
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}