d4758014ec
Review: https://jetbrains.team/p/kt/reviews/11039/timeline For StrongIncompatible `actual` declaration is considered as overload and error reports on expected declaration. For WeakIncompatible the error is reported straight away Before the refactoring `areCompatibleClassScopes` returned just `Incompatible`. It is bad because StrongIncompatible isn't possible for classes (classes can't be overloaded). Now all class incompatibilities are weak. The commit has a minor impact on observable behavior (cases where we reported the compilation problems are still reported but on another elements): - We no longer report type parameter class incompatibilities on expect declaration, we report them only on actuals (it happened because all WeakIncompatible are reported only on actuals) - In a sense, Java implicit actualization was the only way to "overload" classes (it would be a redeclaration compilation problem, so it doesn't count as a valid "overload"). And since type parameters incompatibility was StrongIncompatible for classes, we counted them as "overloads" and didn't report incompatibility problems on Kotlin class. Now we do report. (see implicitJavaActualization_multipleActuals)
110 lines
5.6 KiB
Plaintext
Vendored
110 lines
5.6 KiB
Plaintext
Vendored
-- Common --
|
|
Exit code: OK
|
|
Output:
|
|
|
|
-- JVM --
|
|
Exit code: COMPILATION_ERROR
|
|
Output:
|
|
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:1:8: error: actual interface 'PClass' has no corresponding expected declaration
|
|
The following declaration is incompatible because class kinds are different (class, interface, object, enum, annotation):
|
|
public final expect class PClass
|
|
|
|
actual interface PClass
|
|
^
|
|
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:2:8: error: actual object 'PInterface' has no corresponding expected declaration
|
|
The following declaration is incompatible because class kinds are different (class, interface, object, enum, annotation):
|
|
public expect interface PInterface
|
|
|
|
actual object PInterface
|
|
^
|
|
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:3:8: error: actual enum class 'PObject' has no corresponding expected declaration
|
|
The following declaration is incompatible because class kinds are different (class, interface, object, enum, annotation):
|
|
public expect object PObject
|
|
|
|
actual enum class PObject
|
|
^
|
|
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:4:8: error: actual annotation class 'PEnumClass' has no corresponding expected declaration
|
|
The following declaration is incompatible because class kinds are different (class, interface, object, enum, annotation):
|
|
public final expect enum class PEnumClass : Enum<PEnumClass>
|
|
|
|
actual annotation class PEnumClass
|
|
^
|
|
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:5:8: error: actual class 'PAnnotationClass' has no corresponding expected declaration
|
|
The following declaration is incompatible because class kinds are different (class, interface, object, enum, annotation):
|
|
public final expect annotation class PAnnotationClass : Annotation
|
|
|
|
actual class PAnnotationClass
|
|
^
|
|
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:7:1: error: actual object 'PublicObject' has no corresponding expected declaration
|
|
The following declaration is incompatible because visibility is different:
|
|
public expect object PublicObject
|
|
|
|
internal actual object PublicObject
|
|
^
|
|
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:8:1: error: actual object 'InternalObject' has no corresponding expected declaration
|
|
The following declaration is incompatible because visibility is different:
|
|
internal expect object InternalObject
|
|
|
|
public actual object InternalObject
|
|
^
|
|
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:10:1: error: actual class 'OpenClass' has no corresponding expected declaration
|
|
The following declaration is incompatible because modality is different:
|
|
public open expect class OpenClass
|
|
|
|
final actual class OpenClass
|
|
^
|
|
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:11:1: error: actual class 'AbstractClass' has no corresponding expected declaration
|
|
The following declaration is incompatible because modality is different:
|
|
public abstract expect class AbstractClass
|
|
|
|
open actual class AbstractClass
|
|
^
|
|
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:12:1: error: actual class 'FinalClass' has no corresponding expected declaration
|
|
The following declaration is incompatible because modality is different:
|
|
public final expect class FinalClass
|
|
|
|
abstract actual class FinalClass
|
|
^
|
|
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:14:16: error: actual class 'C1' has no corresponding expected declaration
|
|
The following declaration is incompatible because number of type parameters is different:
|
|
public final expect class C1<A>
|
|
|
|
actual class C1<A, Extra>
|
|
^
|
|
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:15:16: error: actual class 'C2' has no corresponding expected declaration
|
|
The following declaration is incompatible because declaration-site variances of type parameters are different:
|
|
public final expect class C2<B>
|
|
|
|
actual class C2<out B>
|
|
^
|
|
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:16:16: error: actual class 'C3' has no corresponding expected declaration
|
|
The following declaration is incompatible because upper bounds of type parameters are different:
|
|
public final expect class C3<D, E : D>
|
|
|
|
actual class C3<D, E : D?>
|
|
^
|
|
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:18:20: error: actual typealias 'C4' has no corresponding expected declaration
|
|
The following declaration is incompatible because upper bounds of type parameters are different:
|
|
public final expect class C4<F>
|
|
|
|
actual typealias C4<F> = C4Impl<F>
|
|
^
|
|
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:21:39: error: actual class 'ExtendsNumber' has no corresponding expected declaration
|
|
The following declaration is incompatible because some supertypes are missing in the actual declaration:
|
|
public abstract expect class ExtendsNumber : Number
|
|
|
|
actual abstract class ExtendsNumber : Any()
|
|
^
|
|
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:23:1: error: actual interface 'FunInterface' has no corresponding expected declaration
|
|
The following declaration is incompatible because actual declaration for fun expect interface is not a functional interface:
|
|
public expect fun interface FunInterface
|
|
|
|
actual interface FunInterface {
|
|
^
|
|
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:31:1: error: actual typealias 'FunInterface2' has no corresponding expected declaration
|
|
The following declaration is incompatible because actual declaration for fun expect interface is not a functional interface:
|
|
public expect fun interface FunInterface2
|
|
|
|
actual typealias FunInterface2 = FunInterface2Typealias
|
|
^
|