Support platform/impl modifiers for functions

Also add a new capability for ModuleDescriptor, which is used to obtain the
platform in the multi-platform scenario in tests.

Suppress the following errors for platform functions: "function has no body"
and "nothing to inline". Also do not report redeclaration between platform and
non-platform functions because this is the case when the common +
platform-specific code are analyzed together.

Note that some diagnostics reported in tests are not yet implemented in this
commit, they appear in subsequent commits
This commit is contained in:
Alexander Udalov
2016-10-28 11:20:29 +03:00
parent 6e2ef9b1d2
commit af1264a46d
32 changed files with 463 additions and 23 deletions
@@ -0,0 +1,25 @@
// !LANGUAGE: +MultiPlatformProjects
// MODULE: m1-common
// FILE: common.kt
platform fun foo(x: Int): Int
fun callFromCommonCode(x: Int) = foo(x)
// MODULE: m2-jvm(m1-common)
// FILE: jvm.kt
impl fun foo(x: Int): Int {
return x + 1
}
fun callFromJVM(x: Int) = foo(x)
// MODULE: m3-js(m1-common)
// FILE: js.kt
impl fun foo(x: Int): Int {
return x - 1
}
fun callFromJS(x: Int) = foo(x)
@@ -0,0 +1,21 @@
// -- Module: <m1-common> --
package
public fun callFromCommonCode(/*0*/ x: kotlin.Int): kotlin.Int
public platform fun foo(/*0*/ x: kotlin.Int): kotlin.Int
// -- Module: <m2-jvm> --
package
public fun callFromCommonCode(/*0*/ x: kotlin.Int): kotlin.Int
public fun callFromJVM(/*0*/ x: kotlin.Int): kotlin.Int
public impl fun foo(/*0*/ x: kotlin.Int): kotlin.Int
// -- Module: <m3-js> --
package
public fun callFromCommonCode(/*0*/ x: kotlin.Int): kotlin.Int
public fun callFromJS(/*0*/ x: kotlin.Int): kotlin.Int
public impl fun foo(/*0*/ x: kotlin.Int): kotlin.Int
@@ -0,0 +1,8 @@
// !LANGUAGE: +MultiPlatformProjects
// MODULE: m1-common
// FILE: common.kt
<!CONFLICTING_OVERLOADS!>platform fun foo()<!>
<!CONFLICTING_OVERLOADS!>platform fun foo()<!>
platform fun foo(x: Int)
@@ -0,0 +1,5 @@
package
public platform fun foo(): kotlin.Unit
public platform fun foo(): kotlin.Unit
public platform fun foo(/*0*/ x: kotlin.Int): kotlin.Unit
@@ -0,0 +1,17 @@
// !LANGUAGE: +MultiPlatformProjects
// MODULE: m1-common
// FILE: common.kt
platform fun foo()
// MODULE: m2-jvm(m1-common)
// FILE: jvm.kt
<!CONFLICTING_OVERLOADS!>impl fun foo()<!> {}
<!CONFLICTING_OVERLOADS!>impl fun foo()<!> {}
// MODULE: m3-js(m1-common)
// FILE: js.kt
<!CONFLICTING_OVERLOADS!>impl fun foo()<!> {}
<!CONFLICTING_OVERLOADS!>impl fun foo()<!> {}
@@ -0,0 +1,18 @@
// -- Module: <m1-common> --
package
public platform fun foo(): kotlin.Unit
// -- Module: <m2-jvm> --
package
public impl fun foo(): kotlin.Unit
public impl fun foo(): kotlin.Unit
// -- Module: <m3-js> --
package
public impl fun foo(): kotlin.Unit
public impl fun foo(): kotlin.Unit
@@ -0,0 +1,18 @@
// !LANGUAGE: +MultiPlatformProjects
// MODULE: m1-common
// FILE: common.kt
package common
platform fun foo()
// MODULE: m2-jvm(m1-common)
// FILE: jvm.kt
package jvm
<!PLATFORM_DEFINITION_WITHOUT_DECLARATION!>impl<!> fun foo() {}
// MODULE: m3-js(m1-common)
// FILE: js.kt
package js
<!PLATFORM_DEFINITION_WITHOUT_DECLARATION!>impl<!> fun foo() {}
@@ -0,0 +1,28 @@
// -- Module: <m1-common> --
package
package common {
public platform fun foo(): kotlin.Unit
}
// -- Module: <m2-jvm> --
package
package common {
}
package jvm {
public impl fun foo(): kotlin.Unit
}
// -- Module: <m3-js> --
package
package common {
}
package js {
public impl fun foo(): kotlin.Unit
}
@@ -0,0 +1,5 @@
// !LANGUAGE: +MultiPlatformProjects
// MODULE: m1-common
// FILE: common.kt
platform fun foo()
@@ -0,0 +1,3 @@
package
public platform fun foo(): kotlin.Unit
@@ -0,0 +1,5 @@
// !LANGUAGE: +MultiPlatformProjects
// MODULE: m1-common
// FILE: common.kt
platform fun foo(x: Int, <!PLATFORM_DECLARATION_WITH_DEFAULT_PARAMETER!>y: String = ""<!>)
@@ -0,0 +1,3 @@
package
public platform fun foo(/*0*/ x: kotlin.Int, /*1*/ y: kotlin.String = ...): kotlin.Unit
@@ -0,0 +1,5 @@
// !LANGUAGE: +MultiPlatformProjects
// MODULE: m1-jvm
// FILE: jvm.kt
<!PLATFORM_DEFINITION_WITHOUT_DECLARATION!>impl<!> fun foo() { }
@@ -0,0 +1,3 @@
package
public impl fun foo(): kotlin.Unit
@@ -0,0 +1,18 @@
// !LANGUAGE: +MultiPlatformProjects
// MODULE: m1-common
// FILE: common.kt
inline platform fun inlineFun()
platform fun nonInlineFun()
// MODULE: m2-jvm(m1-common)
// FILE: jvm.kt
<!PLATFORM_DEFINITION_WITHOUT_DECLARATION!>impl<!> fun inlineFun() { }
impl fun nonInlineFun() { }
// MODULE: m3-js(m1-common)
// FILE: js.kt
impl <!NOTHING_TO_INLINE!>inline<!> fun inlineFun() { }
<!PLATFORM_DEFINITION_WITHOUT_DECLARATION!>impl<!> <!NOTHING_TO_INLINE!>inline<!> fun nonInlineFun() { }
@@ -0,0 +1,19 @@
// -- Module: <m1-common> --
package
public inline platform fun inlineFun(): kotlin.Unit
public platform fun nonInlineFun(): kotlin.Unit
// -- Module: <m2-jvm> --
package
public impl fun inlineFun(): kotlin.Unit
public impl fun nonInlineFun(): kotlin.Unit
// -- Module: <m3-js> --
package
public inline impl fun inlineFun(): kotlin.Unit
public inline impl fun nonInlineFun(): kotlin.Unit
@@ -0,0 +1,9 @@
// !LANGUAGE: +MultiPlatformProjects
// MODULE: m1-common
// FILE: common.kt
<!CONFLICTING_OVERLOADS!>platform fun foo()<!>
<!CONFLICTING_OVERLOADS, PLATFORM_DECLARATION_WITH_BODY!>platform fun foo()<!> {}
<!PLATFORM_DECLARATION_WITH_BODY!>platform fun bar()<!> {}
@@ -0,0 +1,5 @@
package
public platform fun bar(): kotlin.Unit
public platform fun foo(): kotlin.Unit
public platform fun foo(): kotlin.Unit
@@ -0,0 +1,12 @@
// !LANGUAGE: +MultiPlatformProjects
// MODULE: m1-common
// FILE: common.kt
platform fun foo()
// MODULE: m2-jvm(m1-common)
// FILE: jvm.kt
<!NON_MEMBER_FUNCTION_NO_BODY!>impl fun foo()<!>
<!NON_MEMBER_FUNCTION_NO_BODY!><!PLATFORM_DEFINITION_WITHOUT_DECLARATION!>impl<!> fun bar()<!>
@@ -0,0 +1,11 @@
// -- Module: <m1-common> --
package
public platform fun foo(): kotlin.Unit
// -- Module: <m2-jvm> --
package
public impl fun bar(): kotlin.Unit
public impl fun foo(): kotlin.Unit
@@ -0,0 +1,12 @@
// !LANGUAGE: +MultiPlatformProjects
// MODULE: m1-common
// FILE: common.kt
platform fun foo()
// MODULE: m2-jvm(m1-common)
// FILE: jvm.kt
impl fun foo() {}
// MODULE: m3-js(m1-common)
// FILE: js.kt
impl fun foo() {}
@@ -0,0 +1,16 @@
// -- Module: <m1-common> --
package
public platform fun foo(): kotlin.Unit
// -- Module: <m2-jvm> --
package
public impl fun foo(): kotlin.Unit
// -- Module: <m3-js> --
package
public impl fun foo(): kotlin.Unit