Introduce MPP wizard for mobile (Android / iOS) libraries

#KT-27200 Fixed
This commit is contained in:
Mikhail Glukhikh
2018-09-27 12:47:52 +03:00
parent 41bd29c3e9
commit e7100838d0
4 changed files with 188 additions and 0 deletions
@@ -0,0 +1,185 @@
/*
* 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 org.jetbrains.kotlin.idea.configuration
import com.intellij.openapi.module.Module
import com.intellij.openapi.vfs.VirtualFile
import java.io.BufferedWriter
class KotlinGradleMobileSharedMultiplatformModuleBuilder : KotlinGradleAbstractMultiplatformModuleBuilder() {
private val commonName: String = "common"
private var jvmTargetName: String = "jvm"
private var nativeTargetName: String = "ios"
private val commonSourceName get() = "$commonName$productionSuffix"
private val commonTestName get() = "$commonName$testSuffix"
private val jvmSourceName get() = "$jvmTargetName$productionSuffix"
private val jvmTestName get() = "$jvmTargetName$testSuffix"
private val nativeSourceName get() = "$nativeTargetName$productionSuffix"
private val nativeTestName get() = "$nativeTargetName$testSuffix"
override fun getBuilderId() = "kotlin.gradle.multiplatform.mobileshared"
override fun getPresentableName() = "Kotlin (Mobile Shared Library)"
override fun getDescription() =
"Multiplatform Gradle projects allow sharing the same Kotlin code between two mobile platforms (JVM/Android, Native)."
override fun createProjectSkeleton(module: Module, rootDir: VirtualFile) {
val src = rootDir.createChildDirectory(this, "src")
val commonMain = src.createKotlinSampleFileWriter(commonSourceName)
val commonTest = src.createKotlinSampleFileWriter(commonTestName, fileName = "SampleTests.kt")
val jvmMain = src.createKotlinSampleFileWriter(jvmSourceName)
val jvmTest = src.createKotlinSampleFileWriter(jvmTestName, fileName = "SampleTestsJVM.kt")
val nativeMain = src.createKotlinSampleFileWriter(nativeSourceName)
val nativeTest = src.createKotlinSampleFileWriter(nativeTestName, fileName = "SampleTestsNative.kt")
try {
commonMain.write(
"""
package sample
expect class Sample() {
fun checkMe(): Int
}
expect object Platform {
fun name(): String
}
fun hello(): String = "Hello from ${"$"}{Platform.name()}"
""".trimIndent()
)
jvmMain.write(
"""
package sample
actual class Sample {
actual fun checkMe() = 42
}
actual object Platform {
actual fun name(): String = "Android"
}
""".trimIndent()
)
nativeMain.write(
"""
package sample
actual class Sample {
actual fun checkMe() = 7
}
actual object Platform {
actual fun name(): String = "iOS"
}
""".trimIndent()
)
commonTest.write(
"""
package sample
import kotlin.test.Test
import kotlin.test.assertTrue
class SampleTests {
@Test
fun testMe() {
assertTrue(Sample().checkMe() > 0)
}
}
""".trimIndent()
)
jvmTest.write(
"""
package sample
import kotlin.test.Test
import kotlin.test.assertTrue
class SampleTestsJVM {
@Test
fun testHello() {
assertTrue("JVM" in hello())
}
}
""".trimIndent()
)
nativeTest.write(
"""
package sample
import kotlin.test.Test
import kotlin.test.assertTrue
class SampleTestsNative {
@Test
fun testHello() {
assertTrue("Native" in hello())
}
}
""".trimIndent()
)
} finally {
listOf(commonMain, commonTest, jvmMain, jvmTest, nativeMain, nativeTest).forEach(BufferedWriter::close)
}
}
override fun buildMultiPlatformPart(): String {
return """
kotlin {
targets {
fromPreset(presets.jvm, '$jvmTargetName')
// This preset is for iPhone emulator
// Switch here to presets.iosArm64 to build library for iPhone device
fromPreset(presets.iosX64, '$nativeTargetName') {
compilations.main.outputKinds('FRAMEWORK')
}
}
sourceSets {
$commonSourceName {
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib-common'
}
}
$commonTestName {
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-test-common'
implementation 'org.jetbrains.kotlin:kotlin-test-annotations-common'
}
}
$jvmSourceName {
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib'
}
}
$jvmTestName {
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-test'
implementation 'org.jetbrains.kotlin:kotlin-test-junit'
}
}
$nativeSourceName {
}
$nativeTestName {
}
}
}
configurations {
compileClasspath
}
""".trimIndent()
}
}
+1
View File
@@ -82,5 +82,6 @@
<moduleBuilder implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleWebMultiplatformModuleBuilder"/>
<moduleBuilder implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleSharedMultiplatformModuleBuilder"/>
<moduleBuilder implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleMobileMultiplatformModuleBuilder"/>
<moduleBuilder implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleMobileSharedMultiplatformModuleBuilder"/>
</extensions>
</idea-plugin>
+1
View File
@@ -82,5 +82,6 @@
<moduleBuilder implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleWebMultiplatformModuleBuilder"/>
<moduleBuilder implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleSharedMultiplatformModuleBuilder"/>
<moduleBuilder implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleMobileMultiplatformModuleBuilder"/>
<moduleBuilder implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleMobileSharedMultiplatformModuleBuilder"/>
</extensions>
</idea-plugin>
+1
View File
@@ -90,6 +90,7 @@
<moduleBuilder implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleWebMultiplatformModuleBuilder"/>
<moduleBuilder implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleSharedMultiplatformModuleBuilder"/>
<moduleBuilder implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleMobileMultiplatformModuleBuilder"/>
<moduleBuilder implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleMobileSharedMultiplatformModuleBuilder"/>
<buildSystemTypeDetector implementation="org.jetbrains.kotlin.idea.configuration.GradleDetector"/>
</extensions>