Wizard: add option to enable Java support for JVM targets

#KT-36179 fixed
This commit is contained in:
Ilya Kirillov
2020-03-10 14:24:20 +03:00
parent 691ee7412a
commit a16cb7b74d
10 changed files with 142 additions and 17 deletions
@@ -45,6 +45,11 @@ public class YamlNewWizardProjectImportTestGenerated extends AbstractYamlNewWiza
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/"); runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/");
} }
@TestMetadata("jvmTargetWithJava")
public void testJvmTargetWithJava() throws Exception {
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTargetWithJava/");
}
@TestMetadata("kotlinJvm") @TestMetadata("kotlinJvm")
public void testKotlinJvm() throws Exception { public void testKotlinJvm() throws Exception {
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/"); runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/");
@@ -98,6 +103,11 @@ public class YamlNewWizardProjectImportTestGenerated extends AbstractYamlNewWiza
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/"); runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/");
} }
@TestMetadata("jvmTargetWithJava")
public void testJvmTargetWithJava() throws Exception {
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTargetWithJava/");
}
@TestMetadata("kotlinJvm") @TestMetadata("kotlinJvm")
public void testKotlinJvm() throws Exception { public void testKotlinJvm() throws Exception {
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/"); runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/");
@@ -151,6 +161,11 @@ public class YamlNewWizardProjectImportTestGenerated extends AbstractYamlNewWiza
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/"); runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/");
} }
@TestMetadata("jvmTargetWithJava")
public void testJvmTargetWithJava() throws Exception {
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTargetWithJava/");
}
@TestMetadata("kotlinJvm") @TestMetadata("kotlinJvm")
public void testKotlinJvm() throws Exception { public void testKotlinJvm() throws Exception {
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/"); runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/");
@@ -0,0 +1,29 @@
plugins {
id 'org.jetbrains.kotlin.multiplatform' version '1.3.70'
}
group = 'testGroupId'
version = '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
kotlin {
jvm {
compilations.all {
kotlinOptions.jvmTarget = '1.8'
}
withJava()
}
sourceSets {
jvmMain {
dependencies {
implementation kotlin('stdlib-jdk8')
}
}
jvmTest {
dependencies {
implementation kotlin('test-junit')
}
}
}
}
@@ -0,0 +1,29 @@
plugins {
kotlin("multiplatform") version "1.3.70"
}
group = "testGroupId"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
kotlin {
jvm {
compilations.all {
kotlinOptions.jvmTarget = "1.8"
}
withJava()
}
sourceSets {
val jvmMain by getting {
dependencies {
implementation(kotlin("stdlib-jdk8"))
}
}
val jvmTest by getting {
dependencies {
implementation(kotlin("test-junit"))
}
}
}
}
@@ -0,0 +1 @@
rootProject.name = 'generatedProject'
@@ -0,0 +1 @@
rootProject.name = "generatedProject"
@@ -0,0 +1,12 @@
kotlin:
projectKind: Multiplatform
modules:
- type: multiplatform
name: a
subModules:
- type:
targetJvmVersion: "1.8"
javaSupport: true
name: jvmTarget
testFramework: JUNIT4
name: jvm
@@ -43,6 +43,11 @@ public class YamlBuildFileGenerationTestGenerated extends AbstractYamlBuildFileG
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/"); runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/");
} }
@TestMetadata("jvmTargetWithJava")
public void testJvmTargetWithJava() throws Exception {
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTargetWithJava/");
}
@TestMetadata("kotlinJvm") @TestMetadata("kotlinJvm")
public void testKotlinJvm() throws Exception { public void testKotlinJvm() throws Exception {
runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/"); runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/");
@@ -31,7 +31,9 @@ interface TargetConfigurationIR : MultiplatformIR, IrsOwner {
} }
fun TargetConfigurationIR.addWithJavaIntoJvmTarget() = when { fun TargetConfigurationIR.addWithJavaIntoJvmTarget() = when {
this is DefaultTargetConfigurationIR && targetAccess.type == ModuleSubType.jvm -> this is DefaultTargetConfigurationIR
&& targetAccess.type == ModuleSubType.jvm
&& irs.none { it is GradleCallIr } ->
withIrs(GradleCallIr("withJava")) withIrs(GradleCallIr("withJava"))
else -> this else -> this
} }
@@ -36,7 +36,9 @@ object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenc
override val text = "For Current System" override val text = "For Current System"
override fun ReadingContext.createTargetIrs(module: Module): List<BuildSystemIR> { override fun ReadingContext.createTargetIrs(
module: Module
): List<BuildSystemIR> {
val moduleName = module.name val moduleName = module.name
val variableName = "${moduleName}Target" val variableName = "${moduleName}Target"
@@ -71,7 +73,7 @@ object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenc
+NonDefaultTargetConfigurationIR( +NonDefaultTargetConfigurationIR(
variableName = variableName, variableName = variableName,
targetName = moduleName, targetName = moduleName,
irs = createInnerTargetIrs(module).toPersistentList() irs = createInnerTargetIrs(this@createTargetIrs, module).toPersistentList()
) )
} }
} }
@@ -5,10 +5,12 @@ import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.core.buildPersistenceList import org.jetbrains.kotlin.tools.projectWizard.core.buildPersistenceList
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ModuleConfiguratorSetting
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.* import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.DefaultTargetConfigurationIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.DefaultTargetConfigurationIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetAccessIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetAccessIR
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.buildSystemType import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.buildSystemType
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType
@@ -22,7 +24,10 @@ interface TargetConfigurator : ModuleConfiguratorWithModuleType {
fun canCoexistsWith(other: List<TargetConfigurator>): Boolean = true fun canCoexistsWith(other: List<TargetConfigurator>): Boolean = true
fun ReadingContext.createTargetIrs(module: Module): List<BuildSystemIR> fun ReadingContext.createTargetIrs(module: Module): List<BuildSystemIR>
fun ReadingContext.createInnerTargetIrs(module: Module): List<BuildSystemIR> = emptyList() fun createInnerTargetIrs(
readingContext: ReadingContext,
module: Module
): List<BuildSystemIR> = emptyList()
} }
abstract class TargetConfiguratorWithTests : ModuleConfiguratorWithTests, TargetConfigurator abstract class TargetConfiguratorWithTests : ModuleConfiguratorWithTests, TargetConfigurator
@@ -41,10 +46,12 @@ interface SimpleTargetConfigurator : TargetConfigurator {
override val suggestedModuleName: String? get() = moduleSubType.name override val suggestedModuleName: String? get() = moduleSubType.name
override fun ReadingContext.createTargetIrs(module: Module): List<BuildSystemIR> = buildList { override fun ReadingContext.createTargetIrs(
module: Module
): List<BuildSystemIR> = buildList {
+DefaultTargetConfigurationIR( +DefaultTargetConfigurationIR(
module.createTargetAccessIr(moduleSubType), module.createTargetAccessIr(moduleSubType),
createInnerTargetIrs(module).toPersistentList() createInnerTargetIrs(this@createTargetIrs, module).toPersistentList()
) )
} }
} }
@@ -65,7 +72,9 @@ object JsBrowserTargetConfigurator : JsTargetConfigurator, ModuleConfiguratorWit
override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JS override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JS
override fun ReadingContext.createTargetIrs(module: Module): List<BuildSystemIR> = buildList { override fun ReadingContext.createTargetIrs(
module: Module
): List<BuildSystemIR> = buildList {
+DefaultTargetConfigurationIR( +DefaultTargetConfigurationIR(
module.createTargetAccessIr(ModuleSubType.js), module.createTargetAccessIr(ModuleSubType.js),
buildPersistenceList { buildPersistenceList {
@@ -83,7 +92,9 @@ object JsNodeTargetConfigurator : JsTargetConfigurator {
override val suggestedModuleName = "nodeJs" override val suggestedModuleName = "nodeJs"
override fun ReadingContext.createTargetIrs(module: Module): List<BuildSystemIR> = buildList { override fun ReadingContext.createTargetIrs(
module: Module
): List<BuildSystemIR> = buildList {
+DefaultTargetConfigurationIR( +DefaultTargetConfigurationIR(
module.createTargetAccessIr(ModuleSubType.js), module.createTargetAccessIr(ModuleSubType.js),
buildPersistenceList { buildPersistenceList {
@@ -111,17 +122,35 @@ object JvmTargetConfigurator : JvmModuleConfigurator,
override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JUNIT4 override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JUNIT4
override fun ReadingContext.createInnerTargetIrs(module: Module): List<BuildSystemIR> = buildList { override fun createInnerTargetIrs(
val targetVersionValue = withSettingsOf(module) { JvmModuleConfigurator.targetJvmVersion.reference.settingValue.value } readingContext: ReadingContext,
when { module: Module
buildSystemType.isGradle -> { ): List<BuildSystemIR> = buildList {
+GradleSectionIR( with(readingContext) {
"compilations.all", withSettingsOf(module) {
BodyIR( val targetVersionValue = JvmModuleConfigurator.targetJvmVersion.reference.settingValue.value
GradleAssignmentIR("kotlinOptions.jvmTarget", GradleStringConstIR(targetVersionValue)) if (buildSystemType.isGradle) {
+GradleSectionIR(
"compilations.all",
BodyIR(
GradleAssignmentIR("kotlinOptions.jvmTarget", GradleStringConstIR(targetVersionValue))
)
) )
) }
if (Settings.javaSupport.reference.settingValue) {
+GradleCallIr("withJava")
}
} }
} }
} }
override fun getConfiguratorSettings(): List<ModuleConfiguratorSetting<*, *>> =
super.getConfiguratorSettings() +
Settings.javaSupport
object Settings : ModuleConfiguratorSettings() {
val javaSupport by booleanSetting("Java language support", GenerationPhase.PROJECT_GENERATION) {
defaultValue = value(false)
}
}
} }