Add test for multiplatform projects with Gradle Kotlin DSL
* Adjust some of the test tools to work with *.kts scripts * Expose the tool for version substitution into plugins DSL and use it * Transform the lib-and-app test case to Gradle Kotlin DSL
This commit is contained in:
+9
-2
@@ -22,7 +22,7 @@ abstract class BaseGradleIT {
|
|||||||
|
|
||||||
protected open fun defaultBuildOptions(): BuildOptions = BuildOptions(withDaemon = true)
|
protected open fun defaultBuildOptions(): BuildOptions = BuildOptions(withDaemon = true)
|
||||||
|
|
||||||
protected open val defaultGradleVersion: GradleVersionRequired
|
open val defaultGradleVersion: GradleVersionRequired
|
||||||
get() = GradleVersionRequired.None
|
get() = GradleVersionRequired.None
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@@ -532,7 +532,14 @@ abstract class BaseGradleIT {
|
|||||||
createGradleCommand(wrapperDir, createGradleTailParameters(options, params))
|
createGradleCommand(wrapperDir, createGradleTailParameters(options, params))
|
||||||
|
|
||||||
fun Project.gradleBuildScript(subproject: String? = null): File =
|
fun Project.gradleBuildScript(subproject: String? = null): File =
|
||||||
File(projectDir, subproject?.plus("/").orEmpty() + "build.gradle")
|
listOf("build.gradle", "build.gradle.kts").mapNotNull {
|
||||||
|
File(projectDir, subproject?.plus("/").orEmpty() + it).takeIf(File::exists)
|
||||||
|
}.single()
|
||||||
|
|
||||||
|
fun Project.gradleSettingsScript(): File =
|
||||||
|
listOf("settings.gradle", "settings.gradle.kts").mapNotNull {
|
||||||
|
File(projectDir, it).takeIf(File::exists)
|
||||||
|
}.single()
|
||||||
|
|
||||||
private fun Project.createGradleTailParameters(options: BuildOptions, params: Array<out String> = arrayOf()): List<String> =
|
private fun Project.createGradleTailParameters(options: BuildOptions, params: Array<out String> = arrayOf()): List<String> =
|
||||||
params.toMutableList().apply {
|
params.toMutableList().apply {
|
||||||
|
|||||||
+24
-7
@@ -35,10 +35,23 @@ class NewMultiplatformIT : BaseGradleIT() {
|
|||||||
classesDir(sourceSet = "$targetName/$sourceSetName")
|
classesDir(sourceSet = "$targetName/$sourceSetName")
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testLibAndApp() {
|
fun testLibAndApp() = doTestLibAndApp(
|
||||||
val libProject = Project("sample-lib", gradleVersion, "new-mpp-lib-and-app")
|
"sample-lib",
|
||||||
val appProject = Project("sample-app", gradleVersion, "new-mpp-lib-and-app")
|
"sample-app",
|
||||||
val oldStyleAppProject = Project("sample-old-style-app", gradleVersion, "new-mpp-lib-and-app")
|
gradleVersion
|
||||||
|
)
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testLibAndAppWithGradleKotlinDsl() = doTestLibAndApp(
|
||||||
|
"sample-lib-gradle-kotlin-dsl",
|
||||||
|
"sample-app-gradle-kotlin-dsl",
|
||||||
|
GradleVersionRequired.AtLeast("4.10.2") // Using a SNAPSHOT version in the plugins DSL requires 4.10
|
||||||
|
)
|
||||||
|
|
||||||
|
fun doTestLibAndApp(libProjectName: String, appProjectName: String, gradleVersionRequired: GradleVersionRequired) {
|
||||||
|
val libProject = transformProjectWithPluginsDsl(libProjectName, gradleVersionRequired, "new-mpp-lib-and-app")
|
||||||
|
val appProject = transformProjectWithPluginsDsl(appProjectName, gradleVersionRequired, "new-mpp-lib-and-app")
|
||||||
|
val oldStyleAppProject = Project("sample-old-style-app", gradleVersionRequired, "new-mpp-lib-and-app")
|
||||||
|
|
||||||
val compileTasksNames =
|
val compileTasksNames =
|
||||||
listOf("Jvm6", "NodeJs", "Metadata", "Wasm32", nativeHostTargetName.capitalize()).map { ":compileKotlin$it" }
|
listOf("Jvm6", "NodeJs", "Metadata", "Wasm32", nativeHostTargetName.capitalize()).map { ":compileKotlin$it" }
|
||||||
@@ -94,7 +107,7 @@ class NewMultiplatformIT : BaseGradleIT() {
|
|||||||
|
|
||||||
with(appProject) {
|
with(appProject) {
|
||||||
setupWorkingDir()
|
setupWorkingDir()
|
||||||
gradleBuildScript().appendText("\nrepositories { maven { url '$libLocalRepoUri' } }")
|
gradleBuildScript().appendText("\nrepositories { maven { setUrl(\"$libLocalRepoUri\") } }")
|
||||||
|
|
||||||
fun CompiledProject.checkAppBuild() {
|
fun CompiledProject.checkAppBuild() {
|
||||||
assertSuccessful()
|
assertSuccessful()
|
||||||
@@ -141,8 +154,12 @@ class NewMultiplatformIT : BaseGradleIT() {
|
|||||||
|
|
||||||
// Now run again with a project dependency instead of a module one:
|
// Now run again with a project dependency instead of a module one:
|
||||||
libProject.projectDir.copyRecursively(projectDir.resolve(libProject.projectDir.name))
|
libProject.projectDir.copyRecursively(projectDir.resolve(libProject.projectDir.name))
|
||||||
projectDir.resolve("settings.gradle").appendText("\ninclude '${libProject.projectDir.name}'")
|
gradleSettingsScript().appendText("\ninclude(\"${libProject.projectDir.name}\")")
|
||||||
gradleBuildScript().modify { it.replace("'com.example:sample-lib:1.0'", "project(':${libProject.projectDir.name}')") }
|
gradleBuildScript().modify { it.replace("\"com.example:sample-lib:1.0\"", "project(\":${libProject.projectDir.name}\")") }
|
||||||
|
|
||||||
|
gradleBuildScript(libProjectName).takeIf { it.extension == "kts" }?.modify {
|
||||||
|
it.replace(Regex("""\.version\(.*\)"""), "")
|
||||||
|
}
|
||||||
|
|
||||||
build("clean", "assemble", "--rerun-tasks") {
|
build("clean", "assemble", "--rerun-tasks") {
|
||||||
checkAppBuild()
|
checkAppBuild()
|
||||||
|
|||||||
+30
-32
@@ -3,7 +3,6 @@ package org.jetbrains.kotlin.gradle
|
|||||||
import org.gradle.api.logging.LogLevel
|
import org.gradle.api.logging.LogLevel
|
||||||
import org.jetbrains.kotlin.gradle.util.modify
|
import org.jetbrains.kotlin.gradle.util.modify
|
||||||
import org.junit.Assert
|
import org.junit.Assert
|
||||||
import org.junit.AssumptionViolatedException
|
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import javax.xml.parsers.DocumentBuilderFactory
|
import javax.xml.parsers.DocumentBuilderFactory
|
||||||
@@ -54,43 +53,42 @@ class PluginsDslIT : BaseGradleIT() {
|
|||||||
private val GRADLE_VERSION = GradleVersionRequired.AtLeast("4.0")
|
private val GRADLE_VERSION = GradleVersionRequired.AtLeast("4.0")
|
||||||
private const val DIRECTORY_PREFIX = "pluginsDsl"
|
private const val DIRECTORY_PREFIX = "pluginsDsl"
|
||||||
|
|
||||||
private const val MAVEN_LOCAL_URL_PLACEHOLDER = "<mavenLocalUrl>"
|
private fun BaseGradleIT.projectWithMavenLocalPlugins(
|
||||||
private const val PLUGIN_MARKER_VERSION_PLACEHOLDER = "<pluginMarkerVersion>"
|
projectName: String,
|
||||||
|
wrapperVersion: GradleVersionRequired = GRADLE_VERSION,
|
||||||
|
directoryPrefix: String? = DIRECTORY_PREFIX,
|
||||||
|
minLogLevel: LogLevel = LogLevel.DEBUG
|
||||||
|
): Project = transformProjectWithPluginsDsl(projectName, wrapperVersion, directoryPrefix, minLogLevel)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Workaround for the restriction that snapshot versions are not supported
|
private const val MAVEN_LOCAL_URL_PLACEHOLDER = "<mavenLocalUrl>"
|
||||||
private val MARKER_VERSION = KOTLIN_VERSION + (System.getProperty("pluginMarkerVersionSuffix") ?: "")
|
private const val PLUGIN_MARKER_VERSION_PLACEHOLDER = "<pluginMarkerVersion>"
|
||||||
|
|
||||||
|
internal fun BaseGradleIT.transformProjectWithPluginsDsl(
|
||||||
|
projectName: String,
|
||||||
|
wrapperVersion: GradleVersionRequired = defaultGradleVersion,
|
||||||
|
directoryPrefix: String? = null,
|
||||||
|
minLogLevel: LogLevel = LogLevel.DEBUG
|
||||||
|
): BaseGradleIT.Project {
|
||||||
|
|
||||||
|
val result = Project(projectName, wrapperVersion, directoryPrefix, minLogLevel)
|
||||||
|
result.setupWorkingDir()
|
||||||
|
|
||||||
|
val settingsGradle = File(result.projectDir, "settings.gradle").takeIf(File::exists)
|
||||||
|
settingsGradle?.modify {
|
||||||
|
it.replace(MAVEN_LOCAL_URL_PLACEHOLDER, MavenLocalUrlProvider.mavenLocalUrl)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun projectWithMavenLocalPlugins(
|
result.projectDir.walkTopDown()
|
||||||
projectName: String,
|
.filter { it.isFile && (it.name == "build.gradle" || it.name == "build.gradle.kts") }
|
||||||
wrapperVersion: GradleVersionRequired = GRADLE_VERSION,
|
.forEach { buildGradle ->
|
||||||
directoryPrefix: String? = DIRECTORY_PREFIX,
|
buildGradle.modify { text ->
|
||||||
minLogLevel: LogLevel = LogLevel.DEBUG
|
text.replace(PLUGIN_MARKER_VERSION_PLACEHOLDER, KOTLIN_VERSION)
|
||||||
): Project {
|
|
||||||
|
|
||||||
val result = Project(projectName, wrapperVersion, directoryPrefix, minLogLevel)
|
|
||||||
result.setupWorkingDir()
|
|
||||||
|
|
||||||
val settingsGradle = File(result.projectDir, "settings.gradle")
|
|
||||||
settingsGradle.modify {
|
|
||||||
val mavenLocalUrl = MavenLocalUrlProvider.mavenLocalUrl
|
|
||||||
|
|
||||||
it.replace(MAVEN_LOCAL_URL_PLACEHOLDER, mavenLocalUrl).apply {
|
|
||||||
if (this == it)
|
|
||||||
throw AssumptionViolatedException("$MAVEN_LOCAL_URL_PLACEHOLDER placeholder not found in settings.gradle")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result.projectDir.walkTopDown()
|
return result
|
||||||
.filter { it.isFile && it.name == "build.gradle" }
|
|
||||||
.forEach { buildGradle ->
|
|
||||||
buildGradle.modify { text ->
|
|
||||||
text.replace(PLUGIN_MARKER_VERSION_PLACEHOLDER, MARKER_VERSION)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Copies the logic of Gradle [`mavenLocal()`](https://docs.gradle.org/3.4.1/dsl/org.gradle.api.artifacts.dsl.RepositoryHandler.html#org.gradle.api.artifacts.dsl.RepositoryHandler:mavenLocal())
|
/** Copies the logic of Gradle [`mavenLocal()`](https://docs.gradle.org/3.4.1/dsl/org.gradle.api.artifacts.dsl.RepositoryHandler.html#org.gradle.api.artifacts.dsl.RepositoryHandler:mavenLocal())
|
||||||
|
|||||||
+70
@@ -0,0 +1,70 @@
|
|||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeOutputKind.EXECUTABLE
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
id("org.jetbrains.kotlin.multiplatform").version("<pluginMarkerVersion>")
|
||||||
|
id("maven-publish")
|
||||||
|
}
|
||||||
|
|
||||||
|
group = "com.example"
|
||||||
|
version = "1.0"
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
jcenter()
|
||||||
|
maven { setUrl("http://dl.bintray.com/kotlin/kotlinx.html/") }
|
||||||
|
}
|
||||||
|
|
||||||
|
kotlin {
|
||||||
|
val jvm6 = jvm("jvm6")
|
||||||
|
val jvm8 = jvm("jvm8") {
|
||||||
|
compilations["main"].kotlinOptions.jvmTarget = "1.8"
|
||||||
|
}
|
||||||
|
val nodeJs = js("nodeJs")
|
||||||
|
val wasm32 = wasm32()
|
||||||
|
val linux64 = linuxX64("linux64")
|
||||||
|
val mingw64 = mingwX64("mingw64")
|
||||||
|
val macos64 = macosX64("macos64")
|
||||||
|
|
||||||
|
configure(listOf(wasm32, linux64, mingw64, macos64)) {
|
||||||
|
compilations.getByName("main") {
|
||||||
|
outputKinds.add(EXECUTABLE)
|
||||||
|
entryPoint = "com.example.app.native.main"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sourceSets {
|
||||||
|
val commonMain by getting {
|
||||||
|
dependencies {
|
||||||
|
implementation("com.example:sample-lib:1.0")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val allJvm by creating {
|
||||||
|
dependsOn(commonMain)
|
||||||
|
dependencies {
|
||||||
|
implementation("org.jetbrains.kotlin:kotlin-stdlib")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jvm6.compilations["main"].defaultSourceSet {
|
||||||
|
dependsOn(allJvm)
|
||||||
|
}
|
||||||
|
jvm8.compilations["main"].defaultSourceSet {
|
||||||
|
dependsOn(allJvm)
|
||||||
|
dependencies {
|
||||||
|
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nodeJs.compilations["main"].defaultSourceSet {
|
||||||
|
dependencies {
|
||||||
|
implementation("org.jetbrains.kotlin:kotlin-stdlib-js")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.create("resolveRuntimeDependencies", DefaultTask::class.java) {
|
||||||
|
doFirst {
|
||||||
|
// KT-26301
|
||||||
|
val configName = kotlin.jvm("jvm6").compilations["main"].runtimeDependencyConfigurationName
|
||||||
|
configurations[configName].resolve()
|
||||||
|
}
|
||||||
|
}
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
rootProject.name = "sample-app"
|
||||||
|
|
||||||
|
enableFeaturePreview("GRADLE_METADATA")
|
||||||
|
|
||||||
|
pluginManagement {
|
||||||
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
jcenter()
|
||||||
|
gradlePluginPortal()
|
||||||
|
}
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
package com.example.app
|
||||||
|
|
||||||
|
import com.example.lib.*
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
println(id(123))
|
||||||
|
println(idUsage(456))
|
||||||
|
println(x())
|
||||||
|
}
|
||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
package com.example.app
|
||||||
|
|
||||||
|
import com.example.lib.id
|
||||||
|
import com.example.lib.expectedFun
|
||||||
|
|
||||||
|
fun idUsage(x: Int): Int = id(x)
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
expectedFun()
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
package com.example.app
|
||||||
|
|
||||||
|
import kotlin.streams.asStream
|
||||||
|
|
||||||
|
fun useJdk8Api() = listOf(1, 2, 3).asSequence().asStream()
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.example.app.native
|
||||||
|
|
||||||
|
import com.example.lib.*
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
id(id(123))
|
||||||
|
expectedFun()
|
||||||
|
}
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.example.app.native
|
||||||
|
|
||||||
|
import com.example.lib.*
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
id(id(123))
|
||||||
|
expectedFun()
|
||||||
|
}
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.example.app.native
|
||||||
|
|
||||||
|
import com.example.lib.*
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
id(id(123))
|
||||||
|
expectedFun()
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
import kotlin.js.Console
|
||||||
|
|
||||||
|
import com.example.lib.*
|
||||||
|
|
||||||
|
external val console: Console
|
||||||
|
|
||||||
|
fun nodeJsMain(args: Array<String>) {
|
||||||
|
console.info(id(123), idUsage(), expectedFun())
|
||||||
|
}
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.example.app.native
|
||||||
|
|
||||||
|
import com.example.lib.*
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
id(id(123))
|
||||||
|
expectedFun()
|
||||||
|
}
|
||||||
+56
@@ -0,0 +1,56 @@
|
|||||||
|
plugins {
|
||||||
|
id("org.jetbrains.kotlin.multiplatform").version("<pluginMarkerVersion>")
|
||||||
|
id("maven-publish")
|
||||||
|
}
|
||||||
|
|
||||||
|
group = "com.example"
|
||||||
|
version = "1.0"
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
jcenter()
|
||||||
|
maven { setUrl("http://dl.bintray.com/kotlin/kotlinx.html/") }
|
||||||
|
}
|
||||||
|
|
||||||
|
kotlin {
|
||||||
|
val jvm = jvm("jvm6")
|
||||||
|
val js = js("nodeJs")
|
||||||
|
wasm32()
|
||||||
|
linuxX64("linux64")
|
||||||
|
mingwX64("mingw64")
|
||||||
|
macosX64("macos64")
|
||||||
|
|
||||||
|
targets.all {
|
||||||
|
mavenPublication {
|
||||||
|
pom.withXml {
|
||||||
|
asNode().appendNode("name", "Sample MPP library")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sourceSets {
|
||||||
|
val commonMain by getting {
|
||||||
|
dependencies {
|
||||||
|
api("org.jetbrains.kotlin:kotlin-stdlib-common")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jvm.compilations["main"].defaultSourceSet {
|
||||||
|
dependencies {
|
||||||
|
api("org.jetbrains.kotlin:kotlin-stdlib")
|
||||||
|
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:0.23.4")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
js.compilations["main"].defaultSourceSet {
|
||||||
|
dependencies {
|
||||||
|
api("org.jetbrains.kotlin:kotlin-stdlib-js")
|
||||||
|
implementation("org.jetbrains.kotlinx:kotlinx-html-js:0.6.11")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
publishing {
|
||||||
|
repositories {
|
||||||
|
maven { setUrl("file://${projectDir.absolutePath.replace('\\', '/')}/repo") }
|
||||||
|
}
|
||||||
|
}
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
rootProject.name = "sample-lib"
|
||||||
|
|
||||||
|
enableFeaturePreview("GRADLE_METADATA")
|
||||||
|
|
||||||
|
pluginManagement {
|
||||||
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
jcenter()
|
||||||
|
gradlePluginPortal()
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
package com.example.lib
|
||||||
|
|
||||||
|
fun <T> id(t: T): T = t
|
||||||
|
|
||||||
|
expect fun expectedFun(): Unit
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
resource
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
package com.example.lib
|
||||||
|
|
||||||
|
fun x(): String = "x"
|
||||||
|
|
||||||
|
actual fun expectedFun() {
|
||||||
|
println(id(x()))
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
resource
|
||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.example.lib
|
||||||
|
|
||||||
|
actual fun expectedFun(): Unit {
|
||||||
|
id(123)
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
resource
|
||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.example.lib
|
||||||
|
|
||||||
|
actual fun expectedFun(): Unit {
|
||||||
|
id(123)
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
resource
|
||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.example.lib
|
||||||
|
|
||||||
|
actual fun expectedFun(): Unit {
|
||||||
|
id(123)
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
resource
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
package com.example.lib
|
||||||
|
|
||||||
|
import com.example.lib.id
|
||||||
|
import com.example.lib.expectedFun
|
||||||
|
|
||||||
|
fun idUsage() = id("123")
|
||||||
|
|
||||||
|
actual fun expectedFun() = Unit
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
expectedFun()
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
resource
|
||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.example.lib
|
||||||
|
|
||||||
|
actual fun expectedFun(): Unit {
|
||||||
|
id(123)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user