Don't report incompatibility expect/actual errors on usual overloads

Divide incompatibility on two groups: strong and weak. Strong incompatibility means that if declaration with such incompatibility has no `actual` modifier then it's considered as usual overload and we'll not report any error on it.

 #KT-20540 Fixed
 #KT-20680 Fixed
This commit is contained in:
Mikhail Zarechenskiy
2017-10-11 19:28:53 +03:00
parent eb828e3497
commit d0cbd73307
13 changed files with 258 additions and 10 deletions
@@ -42,6 +42,13 @@ public final expect annotation class Foo6 : kotlin.Annotation {
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final expect annotation class Foo7 : kotlin.Annotation {
public constructor Foo7()
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
}
// -- Module: <m2-jvm> --
package
@@ -89,5 +96,14 @@ public final actual annotation class Foo5 : kotlin.Annotation {
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final actual annotation class Foo6 : kotlin.Annotation {
public constructor Foo6(/*0*/ s: kotlin.String = ...)
public final val s: kotlin.String
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 typealias Foo1 = Bar1
public typealias Foo4 = Bar2
public typealias Foo7 = Bar2
@@ -9,6 +9,8 @@ expect class Foo3
expect class Bar1()
expect class Bar2()
expect class Bar3()
expect class Bar4()
expect class Bar5()
// MODULE: m2-jvm(m1-common)
@@ -30,6 +32,14 @@ actual class Foo1(val s: String)
actual class Foo2(val p: String = "value", <!UNUSED_PARAMETER!>i<!>: Int)
actual typealias Foo3 = JavaFoo
actual class Bar1<!ACTUAL_WITHOUT_EXPECT!>(val s: String)<!>
actual class Bar2<!ACTUAL_WITHOUT_EXPECT!>(val p: String = "value", <!UNUSED_PARAMETER!>i<!>: Int)<!>
<!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>actual typealias Bar3 = JavaBar<!>
actual class <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>Bar1<!>(val s: String)
actual class <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>Bar2<!>(val p: String = "value", <!UNUSED_PARAMETER!>i<!>: Int)
actual typealias <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>Bar3<!> = JavaBar
actual class Bar4(val s: String) {
<!ACTUAL_MISSING!>constructor() : this("")<!>
}
actual class Bar5 {
actual constructor()
constructor(s: String)
}
@@ -22,6 +22,20 @@ public final expect class Bar3 {
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final expect class Bar4 {
public constructor Bar4()
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 expect class Bar5 {
public constructor Bar5()
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 expect class Foo1 {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
@@ -60,6 +74,23 @@ public final actual class Bar2 {
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final actual class Bar4 {
public constructor Bar4()
public constructor Bar4(/*0*/ s: kotlin.String)
public final val s: kotlin.String
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 actual class Bar5 {
public constructor Bar5()
public constructor Bar5(/*0*/ s: kotlin.String)
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 actual class Foo1 {
public constructor Foo1(/*0*/ s: kotlin.String)
public final val s: kotlin.String
@@ -0,0 +1,27 @@
// !LANGUAGE: +MultiPlatformProjects
// !DIAGNOSTICS: -UNUSED_PARAMETER
// MODULE: m1-common
// FILE: common.kt
expect fun foo1(x: Int)
expect fun foo2<!JVM:NO_ACTUAL_FOR_EXPECT!>(x: Int)<!>
expect class NoArgConstructor()
// MODULE: m2-jvm(m1-common)
// FILE: jvm.kt
actual fun foo1(x: Int) {}
fun foo1(x: Int, y: Int) {}
fun foo1(x: String) {}
fun foo2(x: Int, y: Int) {}
fun foo2(x: String) {}
actual class NoArgConstructor {
actual constructor()
actual constructor<!ACTUAL_WITHOUT_EXPECT!>(x: Int)<!>
constructor(x: String)
}
@@ -0,0 +1,31 @@
// -- Module: <m1-common> --
package
public expect fun foo1(/*0*/ x: kotlin.Int): kotlin.Unit
public expect fun foo2(/*0*/ x: kotlin.Int): kotlin.Unit
public final expect class NoArgConstructor {
public constructor NoArgConstructor()
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
}
// -- Module: <m2-jvm> --
package
public actual fun foo1(/*0*/ x: kotlin.Int): kotlin.Unit
public fun foo1(/*0*/ x: kotlin.Int, /*1*/ y: kotlin.Int): kotlin.Unit
public fun foo1(/*0*/ x: kotlin.String): kotlin.Unit
public fun foo2(/*0*/ x: kotlin.Int, /*1*/ y: kotlin.Int): kotlin.Unit
public fun foo2(/*0*/ x: kotlin.String): kotlin.Unit
public final actual class NoArgConstructor {
public constructor NoArgConstructor()
public constructor NoArgConstructor(/*0*/ x: kotlin.Int)
public constructor NoArgConstructor(/*0*/ x: kotlin.String)
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,23 @@
// !LANGUAGE: +MultiPlatformProjects
// !DIAGNOSTICS: -UNUSED_PARAMETER
// MODULE: m1-common
// FILE: common.kt
expect class Foo1
expect class Foo2
expect fun foo1(): Int
expect fun foo2(): Int
expect fun foo3<!JVM:NO_ACTUAL_FOR_EXPECT!>()<!>: Int
// MODULE: m2-jvm(m1-common)
// FILE: jvm.kt
<!ACTUAL_WITHOUT_EXPECT!>interface<!> Foo1
actual <!ACTUAL_WITHOUT_EXPECT!>interface<!> Foo2
actual fun foo1(): <!ACTUAL_WITHOUT_EXPECT!>String<!> = ""
fun <!ACTUAL_MISSING!>foo2<!>(): Int = 0
fun foo3(x: Int): String = ""
@@ -0,0 +1,38 @@
// -- Module: <m1-common> --
package
public expect fun foo1(): kotlin.Int
public expect fun foo2(): kotlin.Int
public expect fun foo3(): kotlin.Int
public final expect class Foo1 {
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 expect class Foo2 {
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
}
// -- Module: <m2-jvm> --
package
public actual fun foo1(): kotlin.String
public fun foo2(): kotlin.Int
public fun foo3(/*0*/ x: kotlin.Int): kotlin.String
public interface Foo1 {
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 actual interface Foo2 {
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
}
@@ -11,8 +11,8 @@ expect fun f4(s: () -> String)
expect inline fun f5(s: () -> String)
expect inline fun f6(crossinline s: () -> String)
expect fun f7(x: Any)
expect fun f8(vararg x: Any)
expect fun f7<!JVM:NO_ACTUAL_FOR_EXPECT!>(x: Any)<!>
expect fun f8<!JVM:NO_ACTUAL_FOR_EXPECT!>(vararg x: Any)<!>
// MODULE: m2-jvm(m1-common)
// FILE: jvm.kt