Check platform<->impl declaration compatibility

For each platform declaration, there must be at least one impl declaration in
the module with the compatible signature; similarly, for each impl declaration,
there must be at least one platform declaration with the compatible signature.

Note that currently the presence of the 'impl' modifier is not checked yet.

Also, the sad fact is that if you have platform and impl declarations which are
not compatible, you get two errors: on the platform delcaration and on the impl
declaration. This needs to be addressed as well
This commit is contained in:
Alexander Udalov
2016-11-21 11:29:02 +03:00
parent ad59d5a1c8
commit 8d3f6f1ce7
29 changed files with 1217 additions and 39 deletions
@@ -0,0 +1,25 @@
platform class PClass
platform interface PInterface
platform object PObject
platform enum class PEnumClass
platform annotation class PAnnotationClass
internal platform object InternalObject
public platform object PublicObject
private platform object PrivateObject
open platform class OpenClass
abstract platform class AbstractClass
final platform class FinalClass
// platform data class DataClass(val x: Int)
platform class NonDataClass(x: Int)
platform class C1<A>
platform class C2<B>
platform class C3<D, E : D>
platform class C4<F>
platform abstract class ExtendsNumber : Number
@@ -0,0 +1,25 @@
impl interface PClass
impl object PInterface
impl enum class PObject
impl annotation class PEnumClass
impl class PAnnotationClass
private impl object InternalObject
internal impl object PublicObject
public impl object PrivateObject
final impl class OpenClass
open impl class AbstractClass
abstract impl class FinalClass
// impl class DataClass(val x: Int)
impl data class NonDataClass(val x: Int)
impl class C1<A, Extra>
impl class C2<out B>
impl class C3<D, E : D?>
impl typealias C4<F> = C4Impl<F>
class C4Impl<F : Number>
impl abstract class ExtendsNumber : Any()
@@ -0,0 +1,143 @@
-- Common --
Exit code: OK
Output:
-- JVM --
Exit code: COMPILATION_ERROR
Output:
compiler/testData/multiplatform/incompatibleClasses/common.kt:1:16: error: no definition is found for platform declaration 'PClass'
The following declaration is incompatible because class kinds are different (class, interface, object, enum, annotation):
public impl interface PClass
platform class PClass
^
compiler/testData/multiplatform/incompatibleClasses/common.kt:2:20: error: no definition is found for platform declaration 'PInterface'
The following declaration is incompatible because class kinds are different (class, interface, object, enum, annotation):
public impl object PInterface
platform interface PInterface
^
compiler/testData/multiplatform/incompatibleClasses/common.kt:3:10: error: no definition is found for platform declaration 'PObject'
The following declaration is incompatible because class kinds are different (class, interface, object, enum, annotation):
public final impl enum class PObject : Enum<PObject>
platform object PObject
^
compiler/testData/multiplatform/incompatibleClasses/common.kt:4:21: error: no definition is found for platform declaration 'PEnumClass'
The following declaration is incompatible because class kinds are different (class, interface, object, enum, annotation):
public final impl annotation class PEnumClass : Annotation
platform enum class PEnumClass
^
compiler/testData/multiplatform/incompatibleClasses/common.kt:5:27: error: no definition is found for platform declaration 'PAnnotationClass'
The following declaration is incompatible because class kinds are different (class, interface, object, enum, annotation):
public final impl class PAnnotationClass
platform annotation class PAnnotationClass
^
compiler/testData/multiplatform/incompatibleClasses/common.kt:7:19: error: no definition is found for platform declaration 'InternalObject'
The following declaration is incompatible because visibility is different:
private impl object InternalObject
internal platform object InternalObject
^
compiler/testData/multiplatform/incompatibleClasses/common.kt:8:17: error: no definition is found for platform declaration 'PublicObject'
The following declaration is incompatible because visibility is different:
internal impl object PublicObject
public platform object PublicObject
^
compiler/testData/multiplatform/incompatibleClasses/common.kt:9:18: error: no definition is found for platform declaration 'PrivateObject'
The following declaration is incompatible because visibility is different:
public impl object PrivateObject
private platform object PrivateObject
^
compiler/testData/multiplatform/incompatibleClasses/common.kt:11:21: error: no definition is found for platform declaration 'OpenClass'
The following declaration is incompatible because modality is different:
public final impl class OpenClass
open platform class OpenClass
^
compiler/testData/multiplatform/incompatibleClasses/common.kt:12:25: error: no definition is found for platform declaration 'AbstractClass'
The following declaration is incompatible because modality is different:
public open impl class AbstractClass
abstract platform class AbstractClass
^
compiler/testData/multiplatform/incompatibleClasses/common.kt:13:22: error: no definition is found for platform declaration 'FinalClass'
The following declaration is incompatible because modality is different:
public abstract impl class FinalClass
final platform class FinalClass
^
compiler/testData/multiplatform/incompatibleClasses/common.kt:16:16: error: no definition is found for platform declaration 'NonDataClass'
The following declaration is incompatible because modifiers are different (data):
public final impl data class NonDataClass
platform class NonDataClass(x: Int)
^
compiler/testData/multiplatform/incompatibleClasses/common.kt:18:16: error: no definition is found for platform declaration 'C1'
The following declaration is incompatible because number of type parameters is different:
public final impl class C1<A, Extra>
platform class C1<A>
^
compiler/testData/multiplatform/incompatibleClasses/common.kt:19:16: error: no definition is found for platform declaration 'C2'
The following declaration is incompatible because declaration-site variances of type parameters are different:
public final impl class C2<out B>
platform class C2<B>
^
compiler/testData/multiplatform/incompatibleClasses/common.kt:25:25: error: no definition is found for platform declaration 'ExtendsNumber'
The following declaration is incompatible because some supertypes are missing in the implementation:
public abstract impl class ExtendsNumber
platform abstract class ExtendsNumber : Number
^
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:1:1: error: modifier 'impl' is only applicable to members that are initially declared in platform-independent code
impl interface PClass
^
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:2:1: error: modifier 'impl' is only applicable to members that are initially declared in platform-independent code
impl object PInterface
^
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:3:1: error: modifier 'impl' is only applicable to members that are initially declared in platform-independent code
impl enum class PObject
^
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:4:1: error: modifier 'impl' is only applicable to members that are initially declared in platform-independent code
impl annotation class PEnumClass
^
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:5:1: error: modifier 'impl' is only applicable to members that are initially declared in platform-independent code
impl class PAnnotationClass
^
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:7:9: error: modifier 'impl' is only applicable to members that are initially declared in platform-independent code
private impl object InternalObject
^
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:8:10: error: modifier 'impl' is only applicable to members that are initially declared in platform-independent code
internal impl object PublicObject
^
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:9:8: error: modifier 'impl' is only applicable to members that are initially declared in platform-independent code
public impl object PrivateObject
^
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:11:7: error: modifier 'impl' is only applicable to members that are initially declared in platform-independent code
final impl class OpenClass
^
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:12:6: error: modifier 'impl' is only applicable to members that are initially declared in platform-independent code
open impl class AbstractClass
^
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:13:10: error: modifier 'impl' is only applicable to members that are initially declared in platform-independent code
abstract impl class FinalClass
^
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:16:1: error: modifier 'impl' is only applicable to members that are initially declared in platform-independent code
impl data class NonDataClass(val x: Int)
^
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:18:1: error: modifier 'impl' is only applicable to members that are initially declared in platform-independent code
impl class C1<A, Extra>
^
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:19:1: error: modifier 'impl' is only applicable to members that are initially declared in platform-independent code
impl class C2<out B>
^
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:25:1: error: modifier 'impl' is only applicable to members that are initially declared in platform-independent code
impl abstract class ExtendsNumber : Any()
^