Wizard: add basic ktor server template
This commit is contained in:
+29
@@ -0,0 +1,29 @@
|
|||||||
|
import io.ktor.application.call
|
||||||
|
import io.ktor.html.respondHtml
|
||||||
|
import io.ktor.http.HttpStatusCode
|
||||||
|
import io.ktor.routing.get
|
||||||
|
import io.ktor.routing.routing
|
||||||
|
import io.ktor.server.engine.embeddedServer
|
||||||
|
import ${serverEngine.getImport()}
|
||||||
|
import kotlinx.html.*
|
||||||
|
|
||||||
|
fun HTML.index() {
|
||||||
|
head {
|
||||||
|
title("Hello from Ktor!")
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
div {
|
||||||
|
+"Hello from Ktor"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun main() {
|
||||||
|
embeddedServer(${serverEngine.getEngineName()}, port = 8080, host = "127.0.0.1") {
|
||||||
|
routing {
|
||||||
|
get("/") {
|
||||||
|
call.respondHtml(HttpStatusCode.OK, HTML::index)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.start(wait = true)
|
||||||
|
}
|
||||||
+7
-17
@@ -1,8 +1,5 @@
|
|||||||
package org.jetbrains.kotlin.tools.projectWizard.core
|
package org.jetbrains.kotlin.tools.projectWizard.core
|
||||||
|
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.core.entity.Setting
|
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
|
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.BodyIR
|
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
import java.nio.file.Paths
|
import java.nio.file.Paths
|
||||||
@@ -10,6 +7,12 @@ import kotlin.properties.ReadOnlyProperty
|
|||||||
import kotlin.random.Random
|
import kotlin.random.Random
|
||||||
import kotlin.reflect.KProperty
|
import kotlin.reflect.KProperty
|
||||||
|
|
||||||
|
inline infix fun <A, B, C> ((A) -> B).andThen(crossinline then: (B) -> C): (A) -> C =
|
||||||
|
{ then(this(it)) }
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun <T> idFunction(): (T) -> T = { it }
|
||||||
|
|
||||||
operator fun Path.div(other: String): Path =
|
operator fun Path.div(other: String): Path =
|
||||||
resolve(other)
|
resolve(other)
|
||||||
|
|
||||||
@@ -42,24 +45,11 @@ internal inline fun <T> cached(crossinline createValue: (name: String) -> T) = o
|
|||||||
@PublishedApi
|
@PublishedApi
|
||||||
internal inline fun <reified T> Any?.safeAs(): T? = this as? T
|
internal inline fun <reified T> Any?.safeAs(): T? = this as? T
|
||||||
|
|
||||||
@Suppress("NOTHING_TO_INLINE")
|
@Suppress("NOTHING_TO_INLINE", "unused")
|
||||||
inline fun Any?.ignore() = Unit
|
inline fun Any?.ignore() = Unit
|
||||||
|
|
||||||
internal fun <T> T.asSingletonList() = listOf(this)
|
internal fun <T> T.asSingletonList() = listOf(this)
|
||||||
|
|
||||||
inline fun <reified R> Iterable<*>.filterIsInstanceWith(predicate: (R) -> Boolean): List<R> {
|
|
||||||
val result = mutableListOf<R>()
|
|
||||||
for (element in this) {
|
|
||||||
if (element is R && predicate(element)) {
|
|
||||||
result += element
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Path.asAbsolute(prefix: Path) =
|
|
||||||
if (isAbsolute) this else prefix / this
|
|
||||||
|
|
||||||
@DslMarker
|
@DslMarker
|
||||||
annotation class Builder
|
annotation class Builder
|
||||||
|
|
||||||
|
|||||||
+14
@@ -9,6 +9,8 @@ import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.BuildScrip
|
|||||||
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.BuildScriptRepositoryIR
|
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.BuildScriptRepositoryIR
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.GradleIR
|
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.GradleIR
|
||||||
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.TargetConfigurationIR
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetIR
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType
|
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.BuildFilePrinter
|
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.GradlePrinter
|
||||||
@@ -115,6 +117,18 @@ data class MultiplatformModulesStructureIR(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun MultiplatformModulesStructureIR.updateTargets(
|
||||||
|
updater: (TargetConfigurationIR) -> TargetConfigurationIR
|
||||||
|
): MultiplatformModulesStructureIR {
|
||||||
|
val newTargets = targets.map { target ->
|
||||||
|
when (target) {
|
||||||
|
is TargetConfigurationIR -> updater(target)
|
||||||
|
else -> target
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return copy(targets = newTargets)
|
||||||
|
}
|
||||||
|
|
||||||
data class SingleplatformModulesStructureWithSingleModuleIR(
|
data class SingleplatformModulesStructureWithSingleModuleIR(
|
||||||
val module: SingleplatformModuleIR,
|
val module: SingleplatformModuleIR,
|
||||||
override val irs: List<BuildSystemIR>
|
override val irs: List<BuildSystemIR>
|
||||||
|
|||||||
+12
@@ -2,6 +2,7 @@ package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.BuildFilePrinter
|
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.GradlePrinter
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.CustomMavenRepository
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.DefaultRepository
|
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.DefaultRepository
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repository
|
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repository
|
||||||
|
|
||||||
@@ -12,6 +13,17 @@ data class RepositoryIR(val repository: Repository) : BuildSystemIR {
|
|||||||
+repository.type.asGradleName()
|
+repository.type.asGradleName()
|
||||||
+"()"
|
+"()"
|
||||||
}
|
}
|
||||||
|
is CustomMavenRepository -> {
|
||||||
|
sectionCall("maven", needIndent = true) {
|
||||||
|
assignmentOrCall("url") {
|
||||||
|
val url = repository.url.quotified
|
||||||
|
when (dsl) {
|
||||||
|
GradlePrinter.GradleDsl.KOTLIN -> call("uri") { +url }
|
||||||
|
GradlePrinter.GradleDsl.GROOVY -> +url
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
else -> Unit
|
else -> Unit
|
||||||
}
|
}
|
||||||
else -> Unit
|
else -> Unit
|
||||||
|
|||||||
+16
-1
@@ -43,7 +43,7 @@ data class GradleCallIr(
|
|||||||
val name: String
|
val name: String
|
||||||
) : GradleIR {
|
) : GradleIR {
|
||||||
override fun GradlePrinter.renderGradle() {
|
override fun GradlePrinter.renderGradle() {
|
||||||
sectionCall(name) {}
|
call(name, forceBrackets = true) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,6 +90,21 @@ data class CompilationAccessIr(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data class GradleDynamicPropertyAccessIR(val qualifier: BuildSystemIR, val propertyName: String) : GradleIR {
|
||||||
|
override fun GradlePrinter.renderGradle() {
|
||||||
|
qualifier.render(this)
|
||||||
|
when (dsl) {
|
||||||
|
GradlePrinter.GradleDsl.KOTLIN -> +"[${propertyName.quotified}]"
|
||||||
|
GradlePrinter.GradleDsl.GROOVY -> +".$propertyName"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data class GradlePropertyAccessIR(val propertyName: String) : GradleIR {
|
||||||
|
override fun GradlePrinter.renderGradle() {
|
||||||
|
+propertyName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
interface BuildScriptIR : BuildSystemIR
|
interface BuildScriptIR : BuildSystemIR
|
||||||
|
|
||||||
|
|||||||
+17
-4
@@ -3,13 +3,15 @@ package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplat
|
|||||||
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.IrsOwner
|
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.IrsOwner
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.KotlinIR
|
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.KotlinIR
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.GradleCallIr
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.GradleIR
|
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.GradleIR
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.withIrs
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType
|
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
|
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
|
||||||
|
|
||||||
interface MultiplatformIR : GradleIR, KotlinIR
|
interface MultiplatformIR : GradleIR, KotlinIR
|
||||||
|
|
||||||
interface TargetIR: MultiplatformIR
|
interface TargetIR : MultiplatformIR
|
||||||
|
|
||||||
data class TargetAccessIR(
|
data class TargetAccessIR(
|
||||||
val type: ModuleSubType,
|
val type: ModuleSubType,
|
||||||
@@ -23,12 +25,23 @@ data class TargetAccessIR(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
interface TargetConfigurationIR : MultiplatformIR, IrsOwner
|
interface TargetConfigurationIR : MultiplatformIR, IrsOwner {
|
||||||
|
val name: String
|
||||||
|
}
|
||||||
|
|
||||||
|
fun TargetConfigurationIR.addWithJavaIntoJvmTarget() = when {
|
||||||
|
this is DefaultTargetConfigurationIR && targetAccess.type == ModuleSubType.jvm ->
|
||||||
|
withIrs(GradleCallIr("withJava"))
|
||||||
|
else -> this
|
||||||
|
}
|
||||||
|
|
||||||
data class DefaultTargetConfigurationIR(
|
data class DefaultTargetConfigurationIR(
|
||||||
val targetAccess: TargetAccessIR,
|
val targetAccess: TargetAccessIR,
|
||||||
override val irs: List<BuildSystemIR>
|
override val irs: List<BuildSystemIR>
|
||||||
) : TargetConfigurationIR {
|
) : TargetConfigurationIR {
|
||||||
|
override val name: String
|
||||||
|
get() = targetAccess.nonDefaultName ?: targetAccess.type.name
|
||||||
|
|
||||||
override fun withReplacedIrs(irs: List<BuildSystemIR>): DefaultTargetConfigurationIR =
|
override fun withReplacedIrs(irs: List<BuildSystemIR>): DefaultTargetConfigurationIR =
|
||||||
copy(irs = irs)
|
copy(irs = irs)
|
||||||
|
|
||||||
@@ -44,7 +57,7 @@ data class DefaultTargetConfigurationIR(
|
|||||||
}
|
}
|
||||||
|
|
||||||
data class NonDefaultTargetConfigurationIR(
|
data class NonDefaultTargetConfigurationIR(
|
||||||
val name: String,
|
override val name: String,
|
||||||
override val irs: List<BuildSystemIR>
|
override val irs: List<BuildSystemIR>
|
||||||
) : TargetConfigurationIR {
|
) : TargetConfigurationIR {
|
||||||
override fun withReplacedIrs(irs: List<BuildSystemIR>): NonDefaultTargetConfigurationIR =
|
override fun withReplacedIrs(irs: List<BuildSystemIR>): NonDefaultTargetConfigurationIR =
|
||||||
@@ -54,7 +67,7 @@ data class NonDefaultTargetConfigurationIR(
|
|||||||
+name
|
+name
|
||||||
when (dsl) {
|
when (dsl) {
|
||||||
GradlePrinter.GradleDsl.KOTLIN -> +".apply"
|
GradlePrinter.GradleDsl.KOTLIN -> +".apply"
|
||||||
GradlePrinter.GradleDsl.GROOVY-> +".with"
|
GradlePrinter.GradleDsl.GROOVY -> +".with"
|
||||||
}
|
}
|
||||||
+" "; inBrackets { irs.listNl() }
|
+" "; inBrackets { irs.listNl() }
|
||||||
}
|
}
|
||||||
|
|||||||
+28
@@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* 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.tools.projectWizard.ir.buildsystem
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.*
|
||||||
|
|
||||||
|
fun runTaskIrs(mainClass: String, classPath: BuildSystemIR? = null) = buildList<BuildSystemIR> {
|
||||||
|
+ApplicationPluginIR(mainClass)
|
||||||
|
|
||||||
|
+GradleSectionIR("application", buildBody {
|
||||||
|
+GradleAssignmentIR("mainClassName", GradleStringConstIR(mainClass))
|
||||||
|
})
|
||||||
|
|
||||||
|
if (classPath != null) {
|
||||||
|
+GetGradleTaskIR(
|
||||||
|
name = "run",
|
||||||
|
taskClass = "JavaExec",
|
||||||
|
body = buildBody {
|
||||||
|
classPath.let { +GradleAssignmentIR("classpath", it) }
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+4
-4
@@ -7,9 +7,7 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.gradle.Groov
|
|||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.gradle.KotlinDslPlugin
|
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.gradle.KotlinDslPlugin
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
|
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.projectTemplates.ProjectTemplatesPlugin
|
import org.jetbrains.kotlin.tools.projectWizard.plugins.projectTemplates.ProjectTemplatesPlugin
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.ConsoleJvmApplicationTemplatePlugin
|
import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.*
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.KotlinTestTemplatePlugin
|
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugin
|
|
||||||
|
|
||||||
object Plugins {
|
object Plugins {
|
||||||
val allPlugins = { context: Context ->
|
val allPlugins = { context: Context ->
|
||||||
@@ -27,7 +25,9 @@ object Plugins {
|
|||||||
|
|
||||||
// templates
|
// templates
|
||||||
KotlinTestTemplatePlugin(context),
|
KotlinTestTemplatePlugin(context),
|
||||||
ConsoleJvmApplicationTemplatePlugin(context)
|
ConsoleJvmApplicationTemplatePlugin(context),
|
||||||
|
KtorTemplatesPlugin(context),
|
||||||
|
JsTemplatesPlugin(context)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
package org.jetbrains.kotlin.tools.projectWizard.plugins.templates
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.core.*
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.templates.*
|
||||||
|
|
||||||
|
class KtorTemplatesPlugin(context: Context) : TemplatePlugin(context) {
|
||||||
|
val addTemplate by addTemplateTask(KtorServerTemplate())
|
||||||
|
}
|
||||||
+15
-7
@@ -65,20 +65,28 @@ class TemplatesPlugin(context: Context) : Plugin(context) {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}.map { it.fold() }
|
}.map(List<TemplateApplicationResult>::fold)
|
||||||
|
}
|
||||||
|
is SourcesetModuleIR -> {
|
||||||
|
applyTemplateToSourceset(
|
||||||
|
module.template,
|
||||||
|
module,
|
||||||
|
templateEngine
|
||||||
|
)
|
||||||
}
|
}
|
||||||
is SourcesetModuleIR -> applyTemplateToSourceset(
|
|
||||||
module.template,
|
|
||||||
module,
|
|
||||||
templateEngine
|
|
||||||
)
|
|
||||||
}.map { result -> module.withIrs(result.librariesToAdd) to result }
|
}.map { result -> module.withIrs(result.librariesToAdd) to result }
|
||||||
}.map {
|
}.map {
|
||||||
val (moduleIrs, results) = it.unzip()
|
val (moduleIrs, results) = it.unzip()
|
||||||
val foldedResults = results.fold()
|
val foldedResults = results.fold()
|
||||||
buildFile.copy(
|
buildFile.copy(
|
||||||
modules = buildFile.modules.withModules(moduleIrs)
|
modules = buildFile.modules.withModules(moduleIrs)
|
||||||
).withIrs(foldedResults.irsToAddToBuildFile)
|
).withIrs(foldedResults.irsToAddToBuildFile).let { buildFile ->
|
||||||
|
when (val structure = buildFile.modules) {
|
||||||
|
is MultiplatformModulesStructureIR ->
|
||||||
|
buildFile.copy(modules = structure.updateTargets(foldedResults.updateTarget))
|
||||||
|
else -> buildFile
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-1
@@ -7,10 +7,23 @@ data class DefaultRepository(val type: Type) : Repository {
|
|||||||
JCENTER, MAVEN_CENTRAL, GOOGLE, GRADLE_PLUGIN_PORTAL
|
JCENTER, MAVEN_CENTRAL, GOOGLE, GRADLE_PLUGIN_PORTAL
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val JCENTER = DefaultRepository(Type.JCENTER)
|
val JCENTER = DefaultRepository(Type.JCENTER)
|
||||||
val MAVEN_CENTRAL = DefaultRepository(Type.MAVEN_CENTRAL)
|
val MAVEN_CENTRAL = DefaultRepository(Type.MAVEN_CENTRAL)
|
||||||
val GOOGLE = DefaultRepository(Type.GOOGLE)
|
val GOOGLE = DefaultRepository(Type.GOOGLE)
|
||||||
val GRADLE_PLUGIN_PORTAL = DefaultRepository(Type.GRADLE_PLUGIN_PORTAL)
|
val GRADLE_PLUGIN_PORTAL = DefaultRepository(Type.GRADLE_PLUGIN_PORTAL)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
interface CustomMavenRepository : Repository {
|
||||||
|
val url: String
|
||||||
|
}
|
||||||
|
|
||||||
|
data class BintrayRepository(val repository: String) : CustomMavenRepository {
|
||||||
|
override val url: String = "https://dl.bintray.com/$repository"
|
||||||
|
}
|
||||||
|
|
||||||
|
object Repositories {
|
||||||
|
val KTOR_BINTRAY = BintrayRepository("ktor/ktor")
|
||||||
|
}
|
||||||
|
|||||||
+6
-47
@@ -3,11 +3,9 @@ package org.jetbrains.kotlin.tools.projectWizard.templates
|
|||||||
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
|
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.core.TaskRunningContext
|
import org.jetbrains.kotlin.tools.projectWizard.core.TaskRunningContext
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
|
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.*
|
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetConfigurationIR
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.buildSystemType
|
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.addWithJavaIntoJvmTarget
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle
|
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
|
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
|
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType
|
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType
|
||||||
|
|
||||||
class ConsoleJvmApplicationTemplate : Template() {
|
class ConsoleJvmApplicationTemplate : Template() {
|
||||||
@@ -22,51 +20,12 @@ class ConsoleJvmApplicationTemplate : Template() {
|
|||||||
override fun TaskRunningContext.getIrsToAddToBuildFile(
|
override fun TaskRunningContext.getIrsToAddToBuildFile(
|
||||||
sourceset: SourcesetIR
|
sourceset: SourcesetIR
|
||||||
) = buildList<BuildSystemIR> {
|
) = buildList<BuildSystemIR> {
|
||||||
+ApplicationPluginIR("MainKt")
|
+runTaskIrs("MainKt")
|
||||||
|
|
||||||
if (buildSystemType.isGradle) {
|
|
||||||
+GradleSectionIR("application", buildBody {
|
|
||||||
+GradleAssignmentIR("mainClassName", GradleStringConstIR("MainKt"))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sourceset is SourcesetModuleIR) {
|
|
||||||
+GetGradleTaskIR(
|
|
||||||
"run",
|
|
||||||
"JavaExec",
|
|
||||||
buildBody {
|
|
||||||
val compilationAccess =
|
|
||||||
CompilationAccessIr(sourceset.type.name, sourceset.sourcesetType.name, null)
|
|
||||||
val classPath = RawGradleIR {
|
|
||||||
when (dsl) {
|
|
||||||
GradlePrinter.GradleDsl.KOTLIN -> {
|
|
||||||
+"with("
|
|
||||||
compilationAccess.render(this)
|
|
||||||
+") "
|
|
||||||
inBrackets {
|
|
||||||
indent()
|
|
||||||
+"output.allOutputs + compileDependencyFiles + runtimeDependencyFiles"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GradlePrinter.GradleDsl.GROOVY -> {
|
|
||||||
compilationAccess.render(this); +".output.allOutputs + "; nl()
|
|
||||||
indented {
|
|
||||||
indent(); compilationAccess.render(this); +".compileDependencyFiles + "; nl()
|
|
||||||
indent(); compilationAccess.render(this); +".runtimeDependencyFiles"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+GradleAssignmentIR(
|
|
||||||
"classpath",
|
|
||||||
classPath
|
|
||||||
)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun updateTargetIr(sourceset: SourcesetIR, targetConfigurationIR: TargetConfigurationIR): TargetConfigurationIR =
|
||||||
|
targetConfigurationIR.addWithJavaIntoJvmTarget()
|
||||||
|
|
||||||
override fun TaskRunningContext.getFileTemplates(sourceset: SourcesetIR) =
|
override fun TaskRunningContext.getFileTemplates(sourceset: SourcesetIR) =
|
||||||
buildList<FileTemplateDescriptor> {
|
buildList<FileTemplateDescriptor> {
|
||||||
+FileTemplateDescriptor("$id/main.kt.vm", sourcesPath("main.kt"))
|
+FileTemplateDescriptor("$id/main.kt.vm", sourcesPath("main.kt"))
|
||||||
|
|||||||
+79
@@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* 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.tools.projectWizard.templates
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.core.TaskRunningContext
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.core.entity.TemplateSetting
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetConfigurationIR
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.addWithJavaIntoJvmTarget
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.library.MavenArtifact
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.DefaultRepository
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repositories
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
|
||||||
|
|
||||||
|
class KtorServerTemplate : Template() {
|
||||||
|
override val title: String = "Ktor-based Server"
|
||||||
|
override val htmlDescription: String = title
|
||||||
|
override val moduleTypes: Set<ModuleType> = setOf(ModuleType.jvm)
|
||||||
|
override val sourcesetTypes: Set<SourcesetType> = setOf(SourcesetType.main)
|
||||||
|
override val id: String = "ktorServer"
|
||||||
|
|
||||||
|
override fun TaskRunningContext.getRequiredLibraries(sourceset: SourcesetIR): List<DependencyIR> =
|
||||||
|
withSettingsOf(sourceset.original) {
|
||||||
|
buildList {
|
||||||
|
+ktorArtifactDependency(serverEngine.reference.settingValue.dependencyName)
|
||||||
|
+ktorArtifactDependency("ktor-html-builder")
|
||||||
|
+ArtifactBasedLibraryDependencyIR(
|
||||||
|
MavenArtifact(DefaultRepository.JCENTER, "org.jetbrains.kotlinx", "kotlinx-html-jvm"),
|
||||||
|
Version.fromString("0.6.12"),
|
||||||
|
DependencyType.MAIN
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun TaskRunningContext.getIrsToAddToBuildFile(sourceset: SourcesetIR): List<BuildSystemIR> = buildList {
|
||||||
|
+RepositoryIR(Repositories.KTOR_BINTRAY)
|
||||||
|
+RepositoryIR(DefaultRepository.JCENTER)
|
||||||
|
+runTaskIrs(mainClass = "ServerKt")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun updateTargetIr(sourceset: SourcesetIR, targetConfigurationIR: TargetConfigurationIR): TargetConfigurationIR =
|
||||||
|
targetConfigurationIR.addWithJavaIntoJvmTarget()
|
||||||
|
|
||||||
|
override fun TaskRunningContext.getFileTemplates(sourceset: SourcesetIR): List<FileTemplateDescriptor> = listOf(
|
||||||
|
FileTemplateDescriptor("$id/server.kt.vm", sourcesPath("server.kt"))
|
||||||
|
)
|
||||||
|
|
||||||
|
val serverEngine by enumSetting<KtorServerEngine>("Ktor Server", GenerationPhase.PROJECT_GENERATION)
|
||||||
|
|
||||||
|
override val settings: List<TemplateSetting<*, *>> = listOf(serverEngine)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun ktorArtifactDependency(name: String) = ArtifactBasedLibraryDependencyIR(
|
||||||
|
MavenArtifact(Repositories.KTOR_BINTRAY, "io.ktor", name),
|
||||||
|
Version.fromString("1.2.6"),
|
||||||
|
DependencyType.MAIN
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@Suppress("MemberVisibilityCanBePrivate")
|
||||||
|
enum class KtorServerEngine(val engineName: String, val dependencyName: String) : DisplayableSettingItem {
|
||||||
|
Netty("Netty", dependencyName = "ktor-server-netty"),
|
||||||
|
Tomcat("Tomcat", dependencyName = "ktor-server-tomcat"),
|
||||||
|
Jetty("Jetty", dependencyName = "ktor-server-jetty");
|
||||||
|
|
||||||
|
override val text: String
|
||||||
|
get() = engineName.capitalize()
|
||||||
|
|
||||||
|
val import: String
|
||||||
|
get() = "io.ktor.server.${engineName.decapitalize()}.${engineName.capitalize()}"
|
||||||
|
}
|
||||||
+35
-16
@@ -5,9 +5,8 @@ import org.jetbrains.kotlin.tools.projectWizard.SettingsOwner
|
|||||||
import org.jetbrains.kotlin.tools.projectWizard.core.*
|
import org.jetbrains.kotlin.tools.projectWizard.core.*
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
|
import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService
|
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
|
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.DependencyIR
|
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetConfigurationIR
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.SourcesetIR
|
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
|
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.StructurePlugin
|
import org.jetbrains.kotlin.tools.projectWizard.plugins.StructurePlugin
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
|
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
|
||||||
@@ -52,7 +51,7 @@ fun <T> withSettingsOf(
|
|||||||
|
|
||||||
|
|
||||||
abstract class Template : SettingsOwner {
|
abstract class Template : SettingsOwner {
|
||||||
override fun <V : Any, T : SettingType<V>> settingDelegate(
|
final override fun <V : Any, T : SettingType<V>> settingDelegate(
|
||||||
create: (path: String) -> SettingBuilder<V, T>
|
create: (path: String) -> SettingBuilder<V, T>
|
||||||
): ReadOnlyProperty<Any, TemplateSetting<V, T>> = cached { name ->
|
): ReadOnlyProperty<Any, TemplateSetting<V, T>> = cached { name ->
|
||||||
TemplateSetting(create(name).buildInternal())
|
TemplateSetting(create(name).buildInternal())
|
||||||
@@ -72,6 +71,11 @@ abstract class Template : SettingsOwner {
|
|||||||
sourceset: SourcesetIR
|
sourceset: SourcesetIR
|
||||||
): List<BuildSystemIR> = emptyList()
|
): List<BuildSystemIR> = emptyList()
|
||||||
|
|
||||||
|
open fun updateTargetIr(
|
||||||
|
sourceset: SourcesetIR,
|
||||||
|
targetConfigurationIR: TargetConfigurationIR
|
||||||
|
): TargetConfigurationIR = targetConfigurationIR
|
||||||
|
|
||||||
open fun TaskRunningContext.getFileTemplates(sourceset: SourcesetIR): List<FileTemplateDescriptor> = emptyList()
|
open fun TaskRunningContext.getFileTemplates(sourceset: SourcesetIR): List<FileTemplateDescriptor> = emptyList()
|
||||||
|
|
||||||
fun TaskRunningContext.applyToSourceset(
|
fun TaskRunningContext.applyToSourceset(
|
||||||
@@ -85,7 +89,16 @@ abstract class Template : SettingsOwner {
|
|||||||
val librariesToAdd = getRequiredLibraries(sourceset)
|
val librariesToAdd = getRequiredLibraries(sourceset)
|
||||||
val irsToAddToBuildFile = getIrsToAddToBuildFile(sourceset)
|
val irsToAddToBuildFile = getIrsToAddToBuildFile(sourceset)
|
||||||
|
|
||||||
val result = TemplateApplicationResult(librariesToAdd, irsToAddToBuildFile)
|
val targetsUpdater = when (sourceset) {
|
||||||
|
is SourcesetModuleIR -> { target: TargetConfigurationIR ->
|
||||||
|
val targetName = sourceset.name.removeSuffix(sourceset.sourcesetType.name.capitalize())
|
||||||
|
if (target.name == targetName) updateTargetIr(sourceset, target)
|
||||||
|
else target
|
||||||
|
}
|
||||||
|
else -> idFunction()
|
||||||
|
}
|
||||||
|
|
||||||
|
val result = TemplateApplicationResult(librariesToAdd, irsToAddToBuildFile, targetsUpdater)
|
||||||
|
|
||||||
return getFileTemplates(sourceset).map { fileTemplate ->
|
return getFileTemplates(sourceset).map { fileTemplate ->
|
||||||
val fileText = templateEngine.renderTemplate(fileTemplate, allSettings)
|
val fileText = templateEngine.renderTemplate(fileTemplate, allSettings)
|
||||||
@@ -107,7 +120,7 @@ abstract class Template : SettingsOwner {
|
|||||||
)
|
)
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
override fun <V : DisplayableSettingItem> dropDownSetting(
|
final override fun <V : DisplayableSettingItem> dropDownSetting(
|
||||||
title: String,
|
title: String,
|
||||||
neededAtPhase: GenerationPhase,
|
neededAtPhase: GenerationPhase,
|
||||||
parser: Parser<V>,
|
parser: Parser<V>,
|
||||||
@@ -121,7 +134,7 @@ abstract class Template : SettingsOwner {
|
|||||||
) as ReadOnlyProperty<Any, TemplateSetting<V, DropDownSettingType<V>>>
|
) as ReadOnlyProperty<Any, TemplateSetting<V, DropDownSettingType<V>>>
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
override fun stringSetting(
|
final override fun stringSetting(
|
||||||
title: String,
|
title: String,
|
||||||
neededAtPhase: GenerationPhase,
|
neededAtPhase: GenerationPhase,
|
||||||
init: StringSettingType.Builder.() -> Unit
|
init: StringSettingType.Builder.() -> Unit
|
||||||
@@ -133,7 +146,7 @@ abstract class Template : SettingsOwner {
|
|||||||
) as ReadOnlyProperty<Any, TemplateSetting<String, StringSettingType>>
|
) as ReadOnlyProperty<Any, TemplateSetting<String, StringSettingType>>
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
override fun booleanSetting(
|
final override fun booleanSetting(
|
||||||
title: String,
|
title: String,
|
||||||
neededAtPhase: GenerationPhase,
|
neededAtPhase: GenerationPhase,
|
||||||
init: BooleanSettingType.Builder.() -> Unit
|
init: BooleanSettingType.Builder.() -> Unit
|
||||||
@@ -145,7 +158,7 @@ abstract class Template : SettingsOwner {
|
|||||||
) as ReadOnlyProperty<Any, TemplateSetting<Boolean, BooleanSettingType>>
|
) as ReadOnlyProperty<Any, TemplateSetting<Boolean, BooleanSettingType>>
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
override fun <V : Any> valueSetting(
|
final override fun <V : Any> valueSetting(
|
||||||
title: String,
|
title: String,
|
||||||
neededAtPhase: GenerationPhase,
|
neededAtPhase: GenerationPhase,
|
||||||
parser: Parser<V>,
|
parser: Parser<V>,
|
||||||
@@ -159,7 +172,7 @@ abstract class Template : SettingsOwner {
|
|||||||
) as ReadOnlyProperty<Any, TemplateSetting<V, ValueSettingType<V>>>
|
) as ReadOnlyProperty<Any, TemplateSetting<V, ValueSettingType<V>>>
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
override fun versionSetting(
|
final override fun versionSetting(
|
||||||
title: String,
|
title: String,
|
||||||
neededAtPhase: GenerationPhase,
|
neededAtPhase: GenerationPhase,
|
||||||
init: VersionSettingType.Builder.() -> Unit
|
init: VersionSettingType.Builder.() -> Unit
|
||||||
@@ -171,7 +184,7 @@ abstract class Template : SettingsOwner {
|
|||||||
) as ReadOnlyProperty<Any, TemplateSetting<Version, VersionSettingType>>
|
) as ReadOnlyProperty<Any, TemplateSetting<Version, VersionSettingType>>
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
override fun <V : Any> listSetting(
|
final override fun <V : Any> listSetting(
|
||||||
title: String,
|
title: String,
|
||||||
neededAtPhase: GenerationPhase,
|
neededAtPhase: GenerationPhase,
|
||||||
parser: Parser<V>,
|
parser: Parser<V>,
|
||||||
@@ -186,7 +199,7 @@ abstract class Template : SettingsOwner {
|
|||||||
|
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
override fun pathSetting(
|
final override fun pathSetting(
|
||||||
title: String,
|
title: String,
|
||||||
neededAtPhase: GenerationPhase,
|
neededAtPhase: GenerationPhase,
|
||||||
init: PathSettingType.Builder.() -> Unit
|
init: PathSettingType.Builder.() -> Unit
|
||||||
@@ -233,7 +246,7 @@ fun TaskRunningContext.applyTemplateToSourceset(
|
|||||||
sourceset: SourcesetIR,
|
sourceset: SourcesetIR,
|
||||||
templateEngine: TemplateEngine
|
templateEngine: TemplateEngine
|
||||||
): TaskResult<TemplateApplicationResult> = when (template) {
|
): TaskResult<TemplateApplicationResult> = when (template) {
|
||||||
null -> TemplateApplicationResult(emptyList(), emptyList()).asSuccess()
|
null -> TemplateApplicationResult.EMPTY.asSuccess()
|
||||||
else -> with(template) {
|
else -> with(template) {
|
||||||
applyToSourceset(templateEngine, sourceset)
|
applyToSourceset(templateEngine, sourceset)
|
||||||
}
|
}
|
||||||
@@ -242,10 +255,15 @@ fun TaskRunningContext.applyTemplateToSourceset(
|
|||||||
|
|
||||||
data class TemplateApplicationResult(
|
data class TemplateApplicationResult(
|
||||||
val librariesToAdd: List<DependencyIR>,
|
val librariesToAdd: List<DependencyIR>,
|
||||||
val irsToAddToBuildFile: List<BuildSystemIR>
|
val irsToAddToBuildFile: List<BuildSystemIR>,
|
||||||
|
val updateTarget: (TargetConfigurationIR) -> TargetConfigurationIR
|
||||||
) {
|
) {
|
||||||
companion object {
|
companion object {
|
||||||
val EMPTY = TemplateApplicationResult(emptyList(), emptyList())
|
val EMPTY = TemplateApplicationResult(
|
||||||
|
librariesToAdd = emptyList(),
|
||||||
|
irsToAddToBuildFile = emptyList(),
|
||||||
|
updateTarget = { it }
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -255,5 +273,6 @@ fun List<TemplateApplicationResult>.fold() =
|
|||||||
operator fun TemplateApplicationResult.plus(other: TemplateApplicationResult) =
|
operator fun TemplateApplicationResult.plus(other: TemplateApplicationResult) =
|
||||||
TemplateApplicationResult(
|
TemplateApplicationResult(
|
||||||
librariesToAdd + other.librariesToAdd,
|
librariesToAdd + other.librariesToAdd,
|
||||||
irsToAddToBuildFile + other.irsToAddToBuildFile
|
irsToAddToBuildFile + other.irsToAddToBuildFile,
|
||||||
|
updateTarget andThen other.updateTarget
|
||||||
)
|
)
|
||||||
Reference in New Issue
Block a user