diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/utils.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/utils.kt
index 58fc4ee8512..f47994e4c6d 100644
--- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/utils.kt
+++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/utils.kt
@@ -10,6 +10,18 @@ import kotlin.reflect.KProperty
inline infix fun ((A) -> B).andThen(crossinline then: (B) -> C): (A) -> C =
{ then(this(it)) }
+
+/**
+ * Composes two function together like normal composition if first function returns non-null value;
+ * Otherwise, applies second function
+ */
+inline infix fun ((A) -> A?).andThenNullable(crossinline then: (A) -> A?): (A) -> A? =
+ { initial ->
+ val thisResult = this(initial)
+ if (thisResult != null) then(thisResult) else then(initial)
+ }
+
+
@Suppress("NOTHING_TO_INLINE")
inline fun idFunction(): (T) -> T = { it }
diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/IR.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/IR.kt
index 0e6ec724d11..e08a0c52625 100644
--- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/IR.kt
+++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/IR.kt
@@ -1,10 +1,4 @@
package org.jetbrains.kotlin.tools.projectWizard.ir
-import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
-import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.FreeIR
-
interface IR
-interface TaskIR : FreeIR {
- val name: String
-}
\ No newline at end of file
diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildFileIR.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildFileIR.kt
index efb22b8a909..657b5f0005b 100644
--- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildFileIR.kt
+++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildFileIR.kt
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.BuildFilePrinter
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.MavenPrinter
import java.nio.file.Path
+import javax.xml.transform.Source
data class BuildFileIR(
val name: String,
@@ -81,6 +82,17 @@ data class BuildFileIR(
}
}
+val BuildFileIR.targets
+ get() = modules.safeAs()?.targets.orEmpty()
+
+val BuildFileIR.sourcesets
+ get() = modules.modules.flatMap { module ->
+ when (module) {
+ is SingleplatformModuleIR -> module.sourcesets
+ is SourcesetModuleIR -> listOf(module as SourcesetIR)
+ }
+ }
+
sealed class ModulesStructureIR : BuildSystemIR, IrsOwner {
abstract val modules: List
diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/GradleIR.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/GradleIR.kt
index 610f2925930..f12e6d82552 100644
--- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/GradleIR.kt
+++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/GradleIR.kt
@@ -40,13 +40,17 @@ data class CreateGradleValueIR(val name: String, val body: GradleIR) : GradleIR
}
data class GradleCallIr(
- val name: String
+ val name: String,
+ val parameters: List = emptyList()
) : GradleIR {
override fun GradlePrinter.renderGradle() {
- call(name, forceBrackets = true) {}
+ call(name, forceBrackets = true) {
+ parameters.list { it.render(this) }
+ }
}
}
+
data class GradleSectionIR(
val name: String,
val body: BodyIR
diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/GradleTaskIR.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/GradleTaskIR.kt
index 223723c9877..656f3c3d03f 100644
--- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/GradleTaskIR.kt
+++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/GradleTaskIR.kt
@@ -1,48 +1,49 @@
package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle
-import org.jetbrains.kotlin.tools.projectWizard.ir.TaskIR
+import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.FreeIR
+import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.render
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
-interface GradleTaskIR : GradleIR, TaskIR {
- val taskClass: String
- val body: BodyIR
+interface GradleTaskAccessIR : GradleIR {
+ val name: String
}
-data class CreateGradleTaskIR(
+data class GradleByNameTaskAccessIR(
override val name: String,
- override val taskClass: String,
- override val body: BodyIR
-) : GradleTaskIR {
- override fun GradlePrinter.renderGradle() {
- when (dsl) {
- GradlePrinter.GradleDsl.GROOVY -> {
- +"tasks.create('$name', $taskClass)"
- }
- GradlePrinter.GradleDsl.KOTLIN -> {
- +"val $name by tasks.registering($taskClass::class)"
- }
- }
- +" "
- body.renderIfNotEmpty(this)
- }
-}
-
-data class GetGradleTaskIR(
- override val name: String,
- override val taskClass: String,
- override val body: BodyIR
-) : GradleTaskIR {
+ val taskClass: String? = null
+) : GradleTaskAccessIR {
override fun GradlePrinter.renderGradle() {
when (dsl) {
GradlePrinter.GradleDsl.GROOVY -> {
+"tasks.getByName('$name')"
}
GradlePrinter.GradleDsl.KOTLIN -> {
- +"tasks.getByName<$taskClass>(${name.quotified})"
+ +"tasks.getByName"
+ taskClass?.let { +"<$it>" }
+ +"(${name.quotified})"
}
}
- +" "
- body.renderIfNotEmpty(this)
}
-}
\ No newline at end of file
+}
+
+data class GradleConfigureTaskIR(
+ val taskAccess: GradleTaskAccessIR,
+ val dependsOn: List = emptyList(),
+ val irs: List = emptyList()
+) : GradleIR, FreeIR {
+ override fun GradlePrinter.renderGradle() {
+ taskAccess.render(this)
+ +" "
+ inBrackets {
+ if (dependsOn.isNotEmpty()) {
+ indent()
+ call("dependsOn", forceBrackets = true) {
+ dependsOn.list { it.render(this) }
+ }
+ nl()
+ }
+ irs.listNl()
+ }
+ }
+}
diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/tasks.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/tasks.kt
index 1d0f9715f51..05f3f664bd0 100644
--- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/tasks.kt
+++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/tasks.kt
@@ -16,12 +16,12 @@ fun runTaskIrs(mainClass: String, classPath: BuildSystemIR? = null) = buildList<
})
if (classPath != null) {
- +GetGradleTaskIR(
- name = "run",
- taskClass = "JavaExec",
- body = buildBody {
- classPath.let { +GradleAssignmentIR("classpath", it) }
- }
+ +GradleConfigureTaskIR(
+ GradleByNameTaskAccessIR(
+ name = "run",
+ taskClass = "JavaExec"
+ ),
+ irs = listOf(GradleAssignmentIR("classpath", classPath))
)
}
}
diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatesPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatesPlugin.kt
index ff45cab29d3..2108f2b875d 100644
--- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatesPlugin.kt
+++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatesPlugin.kt
@@ -7,6 +7,8 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemP
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.updateBuildFiles
import org.jetbrains.kotlin.tools.projectWizard.templates.*
+import org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors.TemplateInterceptor
+import org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors.fold
class TemplatesPlugin(context: Context) : Plugin(context) {
val templates by property