Wizard: rename ReadingContext -> Reader, WritingContext -> Writer

This commit is contained in:
Ilya Kirillov
2020-03-10 16:05:33 +03:00
parent f1741a4d1b
commit db6dfbbb9f
38 changed files with 152 additions and 146 deletions
@@ -10,7 +10,7 @@ import com.intellij.openapi.externalSystem.service.execution.ExternalSystemRunCo
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.tools.projectWizard.WizardGradleRunConfiguration import org.jetbrains.kotlin.tools.projectWizard.WizardGradleRunConfiguration
import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.Reader
import org.jetbrains.kotlin.tools.projectWizard.core.service.RunConfigurationsService import org.jetbrains.kotlin.tools.projectWizard.core.service.RunConfigurationsService
import org.jetbrains.kotlin.tools.projectWizard.core.service.isBuildSystemAvailable import org.jetbrains.kotlin.tools.projectWizard.core.service.isBuildSystemAvailable
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemT
import org.jetbrains.plugins.gradle.service.execution.GradleExternalTaskConfigurationType import org.jetbrains.plugins.gradle.service.execution.GradleExternalTaskConfigurationType
class IdeaRunConfigurationsService(private val project: Project) : RunConfigurationsService, IdeaWizardService { class IdeaRunConfigurationsService(private val project: Project) : RunConfigurationsService, IdeaWizardService {
override fun ReadingContext.addRunConfigurations(configurations: List<WizardRunConfiguration>) { override fun Reader.addRunConfigurations(configurations: List<WizardRunConfiguration>) {
configurations.forEach { wizardConfiguration -> configurations.forEach { wizardConfiguration ->
if (wizardConfiguration is WizardGradleRunConfiguration && isBuildSystemAvailable(BuildSystemType.GradleKotlinDsl)) { if (wizardConfiguration is WizardGradleRunConfiguration && isBuildSystemAvailable(BuildSystemType.GradleKotlinDsl)) {
addGradleRunConfiguration(wizardConfiguration) addGradleRunConfiguration(wizardConfiguration)
@@ -2,9 +2,9 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard.ui
import org.jetbrains.kotlin.tools.projectWizard.core.Context import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.Reader
import org.jetbrains.kotlin.tools.projectWizard.core.SettingsWritingContext import org.jetbrains.kotlin.tools.projectWizard.core.SettingsWriter
import org.jetbrains.kotlin.tools.projectWizard.core.WritingContext import org.jetbrains.kotlin.tools.projectWizard.core.Writer
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSettingPropertyReference import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSettingPropertyReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingReference import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingType import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingType
@@ -48,13 +48,13 @@ abstract class DynamicComponent(private val context: Context) : Component() {
} }
} }
protected fun <T> read(reader: ReadingContext.() -> T): T = protected fun <T> read(reader: Reader.() -> T): T =
context.read(reader) context.read(reader)
protected fun <T> write(writer: WritingContext.() -> T): T = protected fun <T> write(writer: Writer.() -> T): T =
context.write(writer) context.write(writer)
protected fun <T> modify(modifier: SettingsWritingContext.() -> T): T = protected fun <T> modify(modifier: SettingsWriter.() -> T): T =
context.writeSettings(modifier) context.writeSettings(modifier)
open fun onValueUpdated(reference: SettingReference<*, *>?) {} open fun onValueUpdated(reference: SettingReference<*, *>?) {}
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components
import com.intellij.openapi.Disposable import com.intellij.openapi.Disposable
import org.jetbrains.kotlin.tools.projectWizard.core.Context import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.Reader
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingValidator import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingValidator
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
import org.jetbrains.kotlin.tools.projectWizard.core.entity.isSpecificError import org.jetbrains.kotlin.tools.projectWizard.core.entity.isSpecificError
@@ -90,7 +90,7 @@ abstract class UIComponent<V : Any>(
} }
} }
fun <V : Any> ReadingContext.valueForSetting( fun <V : Any> Reader.valueForSetting(
uiComponent: UIComponent<V>, uiComponent: UIComponent<V>,
setting: SettingReference<V, SettingType<V>> setting: SettingReference<V, SettingType<V>>
): V? = setting.savedOrDefaultValue ?: uiComponent.getUiValue() ): V? = setting.savedOrDefaultValue ?: uiComponent.getUiValue()
@@ -45,7 +45,7 @@ class YamlWizard(
} }
} }
fun ReadingContext.parseYaml( fun Reader.parseYaml(
yaml: String, yaml: String,
pluginSettings: List<PluginSetting<*, *>> pluginSettings: List<PluginSetting<*, *>>
): TaskResult<Map<SettingReference<*, *>, Any>> { ): TaskResult<Map<SettingReference<*, *>, Any>> {
@@ -1,6 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.core package org.jetbrains.kotlin.tools.projectWizard.core
typealias Checker = ReadingContext.() -> Boolean typealias Checker = Reader.() -> Boolean
val ALWAYS_AVAILABLE_CHECKER = checker { true } val ALWAYS_AVAILABLE_CHECKER = checker { true }
@@ -13,5 +13,5 @@ interface ContextOwner {
interface ActivityCheckerOwner { interface ActivityCheckerOwner {
val isAvailable: Checker val isAvailable: Checker
fun isActive(readingContext: ReadingContext) = isAvailable(readingContext) fun isActive(reader: Reader) = isAvailable(reader)
} }
@@ -22,19 +22,19 @@ class Context private constructor(
) { ) {
private lateinit var plugins: List<Plugin> private lateinit var plugins: List<Plugin>
private val settingWritingContext = SettingsWritingContext() private val settingWritingContext = SettingsWriter()
private val pluginSettings by lazy(LazyThreadSafetyMode.NONE) { private val pluginSettings by lazy(LazyThreadSafetyMode.NONE) {
plugins.flatMap(Plugin::declaredSettings).distinctBy(PluginSetting<*, *>::path) plugins.flatMap(Plugin::declaredSettings).distinctBy(PluginSetting<*, *>::path)
} }
fun <T> read(reader: ReadingContext.() -> T): T = fun <T> read(reader: Reader.() -> T): T =
settingWritingContext.reader() settingWritingContext.reader()
fun <T> write(writer: WritingContext.() -> T): T = fun <T> write(writer: Writer.() -> T): T =
settingWritingContext.writer() settingWritingContext.writer()
fun <T> writeSettings(writer: SettingsWritingContext.() -> T): T = fun <T> writeSettings(writer: SettingsWriter.() -> T): T =
settingWritingContext.writer() settingWritingContext.writer()
@@ -133,7 +133,7 @@ class Context private constructor(
TaskSorter().sort(pipelineLineTasks, dependencyList) TaskSorter().sort(pipelineLineTasks, dependencyList)
open inner class ReadingContext { open inner class Reader {
val plugins: List<Plugin> val plugins: List<Plugin>
get() = this@Context.plugins get() = this@Context.plugins
@@ -185,24 +185,24 @@ class Context private constructor(
val <V : Any> SettingReference<V, SettingType<V>>.savedOrDefaultValue: V? val <V : Any> SettingReference<V, SettingType<V>>.savedOrDefaultValue: V?
get() = setting.getSavedValueForSetting() ?: when (val defaultValue = setting.defaultValue) { get() = setting.getSavedValueForSetting() ?: when (val defaultValue = setting.defaultValue) {
is SettingDefaultValue.Value -> defaultValue.value is SettingDefaultValue.Value -> defaultValue.value
is SettingDefaultValue.Dynamic<V> -> defaultValue.getter(this@ReadingContext, this) is SettingDefaultValue.Dynamic<V> -> defaultValue.getter(this@Reader, this)
null -> null null -> null
} }
val <V : Any, T : SettingType<V>> SettingReference<V, T>.setting: Setting<V, T> val <V : Any, T : SettingType<V>> SettingReference<V, T>.setting: Setting<V, T>
get() = with(this) { getSetting() } get() = with(this) { getSetting() }
inline operator fun <T> invoke(reader: ReadingContext.() -> T): T = reader() inline operator fun <T> invoke(reader: Reader.() -> T): T = reader()
} }
open inner class WritingContext : ReadingContext() { open inner class Writer : Reader() {
val eventManager: EventManager val eventManager: EventManager
get() = settingContext.eventManager get() = settingContext.eventManager
fun <A, B : Any> Task1Reference<A, B>.execute(value: A): TaskResult<B> { fun <A, B : Any> Task1Reference<A, B>.execute(value: A): TaskResult<B> {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
val task = taskContext.getEntity(this) as Task1<A, B> val task = taskContext.getEntity(this) as Task1<A, B>
return task.action(this@WritingContext, value) return task.action(this@Writer, value)
} }
fun <T : Any> PropertyReference<T>.update( fun <T : Any> PropertyReference<T>.update(
@@ -219,9 +219,12 @@ class Context private constructor(
fun <T : Any> PropertyReference<List<T>>.addValues( fun <T : Any> PropertyReference<List<T>>.addValues(
values: List<T> values: List<T>
): TaskResult<Unit> = update { oldValues -> success(oldValues + values) } ): TaskResult<Unit> = update { oldValues -> success(oldValues + values) }
@JvmName("write")
inline operator fun <T> invoke(writer: Writer.() -> T): T = writer()
} }
open inner class SettingsWritingContext : WritingContext() { open inner class SettingsWriter : Writer() {
fun <V : Any, T : SettingType<V>> SettingReference<V, T>.setValue(newValue: V) { fun <V : Any, T : SettingType<V>> SettingReference<V, T>.setValue(newValue: V) {
settingContext[this] = newValue settingContext[this] = newValue
} }
@@ -232,10 +235,13 @@ class Context private constructor(
setValue(defaultValue) setValue(defaultValue)
} }
} }
@JvmName("writeSettings")
inline operator fun <T> invoke(writer: SettingsWriter.() -> T): T = writer()
} }
} }
fun ReadingContext.getUnspecifiedSettings(phases: Set<GenerationPhase>): List<AnySetting> { fun Reader.getUnspecifiedSettings(phases: Set<GenerationPhase>): List<AnySetting> {
val required = plugins val required = plugins
.flatMap { plugin -> .flatMap { plugin ->
plugin.declaredSettings.mapNotNull { setting -> plugin.declaredSettings.mapNotNull { setting ->
@@ -248,6 +254,6 @@ fun ReadingContext.getUnspecifiedSettings(phases: Set<GenerationPhase>): List<An
} }
typealias ReadingContext = Context.ReadingContext typealias Reader = Context.Reader
typealias WritingContext = Context.WritingContext typealias Writer = Context.Writer
typealias SettingsWritingContext = Context.SettingsWritingContext typealias SettingsWriter = Context.SettingsWriter
@@ -1,23 +1,23 @@
package org.jetbrains.kotlin.tools.projectWizard.core.entity package org.jetbrains.kotlin.tools.projectWizard.core.entity
import org.jetbrains.kotlin.tools.projectWizard.core.Failure import org.jetbrains.kotlin.tools.projectWizard.core.Failure
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.Reader
import org.jetbrains.kotlin.tools.projectWizard.core.UNIT_SUCCESS import org.jetbrains.kotlin.tools.projectWizard.core.UNIT_SUCCESS
import org.jetbrains.kotlin.tools.projectWizard.core.ValidationError import org.jetbrains.kotlin.tools.projectWizard.core.ValidationError
inline class SettingValidator<V>(val validate: ReadingContext.(V) -> ValidationResult) { inline class SettingValidator<V>(val validate: Reader.(V) -> ValidationResult) {
infix fun and(other: SettingValidator<V>) = SettingValidator<V> { value -> infix fun and(other: SettingValidator<V>) = SettingValidator<V> { value ->
validate(value) and other.validate(this, value) validate(value) and other.validate(this, value)
} }
operator fun ReadingContext.invoke(value: V) = validate(value) operator fun Reader.invoke(value: V) = validate(value)
} }
fun <V> settingValidator(validator: ReadingContext.(V) -> ValidationResult) = fun <V> settingValidator(validator: Reader.(V) -> ValidationResult) =
SettingValidator(validator) SettingValidator(validator)
fun <V> inValidatorContext(validator: ReadingContext.(V) -> SettingValidator<V>) = fun <V> inValidatorContext(validator: Reader.(V) -> SettingValidator<V>) =
SettingValidator<V> { value -> SettingValidator<V> { value ->
validator(value).validate(this, value) validator(value).validate(this, value)
} }
@@ -95,7 +95,7 @@ interface Validatable<out V> {
val validator: SettingValidator<@UnsafeVariance V> val validator: SettingValidator<@UnsafeVariance V>
} }
fun <V, Q : Validatable<Q>> ReadingContext.validateList(list: List<Q>) = settingValidator<V> { fun <V, Q : Validatable<Q>> Reader.validateList(list: List<Q>) = settingValidator<V> {
list.fold(ValidationResult.OK as ValidationResult) { result, value -> list.fold(ValidationResult.OK as ValidationResult) { result, value ->
result and value.validator.validate(this, value).withTarget(value) result and value.validator.validate(this, value).withTarget(value)
} }
@@ -15,12 +15,12 @@ sealed class Task : EntityBase()
data class Task1<A, B : Any>( data class Task1<A, B : Any>(
override val path: String, override val path: String,
val action: WritingContext.(A) -> TaskResult<B> val action: Writer.(A) -> TaskResult<B>
) : Task() { ) : Task() {
class Builder<A, B : Any>(private val name: String) { class Builder<A, B : Any>(private val name: String) {
private var action: WritingContext.(A) -> TaskResult<B> = { Failure() } private var action: Writer.(A) -> TaskResult<B> = { Failure() }
fun withAction(action: WritingContext.(A) -> TaskResult<B>) { fun withAction(action: Writer.(A) -> TaskResult<B>) {
this.action = action this.action = action
} }
@@ -30,7 +30,7 @@ data class Task1<A, B : Any>(
data class PipelineTask( data class PipelineTask(
override val path: String, override val path: String,
val action: WritingContext.() -> TaskResult<Unit>, val action: Writer.() -> TaskResult<Unit>,
val before: List<PipelineTaskReference>, val before: List<PipelineTaskReference>,
val after: List<PipelineTaskReference>, val after: List<PipelineTaskReference>,
val phase: GenerationPhase, val phase: GenerationPhase,
@@ -41,7 +41,7 @@ data class PipelineTask(
private val name: String, private val name: String,
private val phase: GenerationPhase private val phase: GenerationPhase
) { ) {
private var action: WritingContext.() -> TaskResult<Unit> = { UNIT_SUCCESS } private var action: Writer.() -> TaskResult<Unit> = { UNIT_SUCCESS }
private val before = mutableListOf<PipelineTaskReference>() private val before = mutableListOf<PipelineTaskReference>()
private val after = mutableListOf<PipelineTaskReference>() private val after = mutableListOf<PipelineTaskReference>()
@@ -49,7 +49,7 @@ data class PipelineTask(
var title: String? = null var title: String? = null
fun withAction(action: WritingContext.() -> TaskResult<Unit>) { fun withAction(action: Writer.() -> TaskResult<Unit>) {
this.action = action this.action = action
} }
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.tools.projectWizard.core.entity.settings
import org.jetbrains.kotlin.tools.projectWizard.core.ActivityCheckerOwner import org.jetbrains.kotlin.tools.projectWizard.core.ActivityCheckerOwner
import org.jetbrains.kotlin.tools.projectWizard.core.Checker import org.jetbrains.kotlin.tools.projectWizard.core.Checker
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.Reader
import org.jetbrains.kotlin.tools.projectWizard.core.entity.Entity import org.jetbrains.kotlin.tools.projectWizard.core.entity.Entity
import org.jetbrains.kotlin.tools.projectWizard.core.entity.EntityWithValue import org.jetbrains.kotlin.tools.projectWizard.core.entity.EntityWithValue
@@ -58,7 +58,7 @@ class TemplateSetting<out V : Any, out T : SettingType<V>>(
sealed class SettingDefaultValue<out V : Any> { sealed class SettingDefaultValue<out V : Any> {
data class Value<V : Any>(val value: V) : SettingDefaultValue<V>() data class Value<V : Any>(val value: V) : SettingDefaultValue<V>()
data class Dynamic<V : Any>( data class Dynamic<V : Any>(
val getter: ReadingContext.(SettingReference<V, SettingType<V>>) -> V val getter: Reader.(SettingReference<V, SettingType<V>>) -> V
) : SettingDefaultValue<V>() ) : SettingDefaultValue<V>()
} }
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.tools.projectWizard.core.entity.settings package org.jetbrains.kotlin.tools.projectWizard.core.entity.settings
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.Reader
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingValidator import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingValidator
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settingValidator import org.jetbrains.kotlin.tools.projectWizard.core.entity.settingValidator
@@ -17,13 +17,13 @@ abstract class SettingBuilder<V : Any, T : SettingType<V>>(
private val title: String, private val title: String,
private val neededAtPhase: GenerationPhase private val neededAtPhase: GenerationPhase
) { ) {
var isAvailable: ReadingContext.() -> Boolean = { true } var isAvailable: Reader.() -> Boolean = { true }
open var defaultValue: SettingDefaultValue<V>? = null open var defaultValue: SettingDefaultValue<V>? = null
var isSavable: Boolean = false var isSavable: Boolean = false
var isRequired: Boolean? = null var isRequired: Boolean? = null
fun value(value: V) = SettingDefaultValue.Value(value) fun value(value: V) = SettingDefaultValue.Value(value)
fun dynamic(getter: ReadingContext.(SettingReference<V, SettingType<V>>) -> V) = fun dynamic(getter: Reader.(SettingReference<V, SettingType<V>>) -> V) =
SettingDefaultValue.Dynamic(getter) SettingDefaultValue.Dynamic(getter)
protected var validator = protected var validator =
@@ -33,7 +33,7 @@ abstract class SettingBuilder<V : Any, T : SettingType<V>>(
this.validator = this.validator and validator this.validator = this.validator and validator
} }
fun validate(validator: ReadingContext.(V) -> ValidationResult) { fun validate(validator: Reader.(V) -> ValidationResult) {
this.validator = this.validator and settingValidator( this.validator = this.validator and settingValidator(
validator validator
) )
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.tools.projectWizard.core.entity.settings
import org.jetbrains.kotlin.tools.projectWizard.Identificator import org.jetbrains.kotlin.tools.projectWizard.Identificator
import org.jetbrains.kotlin.tools.projectWizard.core.Plugin import org.jetbrains.kotlin.tools.projectWizard.core.Plugin
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.Reader
import org.jetbrains.kotlin.tools.projectWizard.core.entity.path import org.jetbrains.kotlin.tools.projectWizard.core.entity.path
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.ModuleConfigurator import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.ModuleConfigurator
@@ -21,7 +21,7 @@ sealed class SettingReference<out V : Any, out T : SettingType<V>> {
abstract val path: String abstract val path: String
abstract val type: KClass<out T> abstract val type: KClass<out T>
abstract fun ReadingContext.getSetting(): Setting<V, T> abstract fun Reader.getSetting(): Setting<V, T>
final override fun toString() = path final override fun toString() = path
final override fun equals(other: Any?) = other.safeAs<SettingReference<*, *>>()?.path == path final override fun equals(other: Any?) = other.safeAs<SettingReference<*, *>>()?.path == path
@@ -40,7 +40,7 @@ data class PluginSettingReference<out V : Any, out T : SettingType<V>>(
constructor(setting: PluginSetting<V, T>) : constructor(setting: PluginSetting<V, T>) :
this(setting.path, setting.type::class as KClass<T>) this(setting.path, setting.type::class as KClass<T>)
override fun ReadingContext.getSetting(): Setting<V, T> = pluginSetting override fun Reader.getSetting(): Setting<V, T> = pluginSetting
} }
inline val <V : Any, reified T : SettingType<V>> PluginSetting<V, T>.reference: PluginSettingReference<V, T> inline val <V : Any, reified T : SettingType<V>> PluginSetting<V, T>.reference: PluginSettingReference<V, T>
@@ -57,7 +57,7 @@ sealed class ModuleConfiguratorSettingReference<V : Any, T : SettingType<V>> : S
override val type: KClass<out T> override val type: KClass<out T>
get() = setting.type::class get() = setting.type::class
override fun ReadingContext.getSetting(): Setting<V, T> = setting override fun Reader.getSetting(): Setting<V, T> = setting
abstract val module: Module? abstract val module: Module?
} }
@@ -89,7 +89,7 @@ sealed class TemplateSettingReference<V : Any, T : SettingType<V>> : SettingRefe
override val type: KClass<out T> override val type: KClass<out T>
get() = setting.type::class get() = setting.type::class
override fun ReadingContext.getSetting(): Setting<V, T> = setting override fun Reader.getSetting(): Setting<V, T> = setting
abstract val module: Module? abstract val module: Module?
} }
@@ -214,4 +214,4 @@ object PathSettingType : SettingType<Path>() {
} }
} }
typealias DropDownSettingTypeFilter <V> = ReadingContext.(SettingReference<V, DropDownSettingType<V>>, V) -> Boolean typealias DropDownSettingTypeFilter <V> = Reader.(SettingReference<V, DropDownSettingType<V>>, V) -> Boolean
@@ -6,14 +6,14 @@
package org.jetbrains.kotlin.tools.projectWizard.core.service package org.jetbrains.kotlin.tools.projectWizard.core.service
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.Reader
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType
interface BuildSystemAvailabilityWizardService : WizardService { interface BuildSystemAvailabilityWizardService : WizardService {
fun isAvailable(buildSystemType: BuildSystemType): Boolean fun isAvailable(buildSystemType: BuildSystemType): Boolean
} }
fun ReadingContext.isBuildSystemAvailable(buildSystemType: BuildSystemType) = fun Reader.isBuildSystemAvailable(buildSystemType: BuildSystemType) =
service<BuildSystemAvailabilityWizardService>().isAvailable(buildSystemType) service<BuildSystemAvailabilityWizardService>().isAvailable(buildSystemType)
class BuildSystemAvailabilityWizardServiceImpl : BuildSystemAvailabilityWizardService, IdeaIndependentWizardService { class BuildSystemAvailabilityWizardServiceImpl : BuildSystemAvailabilityWizardService, IdeaIndependentWizardService {
@@ -6,13 +6,13 @@
package org.jetbrains.kotlin.tools.projectWizard.core.service package org.jetbrains.kotlin.tools.projectWizard.core.service
import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.Reader
interface RunConfigurationsService : WizardService { interface RunConfigurationsService : WizardService {
fun ReadingContext.addRunConfigurations(configurations: List<WizardRunConfiguration>) fun Reader.addRunConfigurations(configurations: List<WizardRunConfiguration>)
} }
class RunConfigurationsServiceImpl : RunConfigurationsService, IdeaIndependentWizardService { class RunConfigurationsServiceImpl : RunConfigurationsService, IdeaIndependentWizardService {
override fun ReadingContext.addRunConfigurations(configurations: List<WizardRunConfiguration>) = Unit override fun Reader.addRunConfigurations(configurations: List<WizardRunConfiguration>) = Unit
} }
@@ -48,15 +48,15 @@ interface AndroidModuleConfigurator : ModuleConfigurator,
listOf(AndroidPlugin::androidSdkPath.reference) listOf(AndroidPlugin::androidSdkPath.reference)
override fun createBuildFileIRs( override fun createBuildFileIRs(
readingContext: ReadingContext, reader: Reader,
configurationData: ModuleConfigurationData, configurationData: ModuleConfigurationData,
module: Module module: Module
) = buildList<BuildSystemIR> { ) = buildList<BuildSystemIR> {
+GradleOnlyPluginByNameIR(readingContext.createAndroidPlugin(module).pluginName) +GradleOnlyPluginByNameIR(reader.createAndroidPlugin(module).pluginName)
+GradleOnlyPluginByNameIR("kotlin-android-extensions") +GradleOnlyPluginByNameIR("kotlin-android-extensions")
+AndroidConfigIR( +AndroidConfigIR(
when (readingContext.createAndroidPlugin(module)) { when (reader.createAndroidPlugin(module)) {
AndroidGradlePlugin.APPLICATION -> module.javaPackage(configurationData.pomIr) AndroidGradlePlugin.APPLICATION -> module.javaPackage(configurationData.pomIr)
AndroidGradlePlugin.LIBRARY -> null AndroidGradlePlugin.LIBRARY -> null
} }
@@ -64,15 +64,15 @@ interface AndroidModuleConfigurator : ModuleConfigurator,
+createRepositories(configurationData.kotlinVersion).map(::RepositoryIR) +createRepositories(configurationData.kotlinVersion).map(::RepositoryIR)
} }
fun ReadingContext.createAndroidPlugin(module: Module): AndroidGradlePlugin fun Reader.createAndroidPlugin(module: Module): AndroidGradlePlugin
override fun ReadingContext.createSettingsGradleIRs(module: Module) = buildList<BuildSystemIR> { override fun Reader.createSettingsGradleIRs(module: Module) = buildList<BuildSystemIR> {
+createRepositories(KotlinPlugin::version.propertyValue).map { PluginManagementRepositoryIR(RepositoryIR(it)) } +createRepositories(KotlinPlugin::version.propertyValue).map { PluginManagementRepositoryIR(RepositoryIR(it)) }
+AndroidResolutionStrategyIR(Versions.GradlePlugins.ANDROID) +AndroidResolutionStrategyIR(Versions.GradlePlugins.ANDROID)
} }
override fun createModuleIRs( override fun createModuleIRs(
readingContext: ReadingContext, reader: Reader,
configurationData: ModuleConfigurationData, configurationData: ModuleConfigurationData,
module: Module module: Module
): List<BuildSystemIR> = ): List<BuildSystemIR> =
@@ -128,7 +128,7 @@ object AndroidTargetConfigurator : TargetConfigurator,
override val moduleSubType = ModuleSubType.android override val moduleSubType = ModuleSubType.android
override val moduleType = ModuleType.jvm override val moduleType = ModuleType.jvm
override fun ReadingContext.createAndroidPlugin(module: Module): AndroidGradlePlugin = override fun Reader.createAndroidPlugin(module: Module): AndroidGradlePlugin =
withSettingsOf(module) { androidPlugin.reference.settingValue } withSettingsOf(module) { androidPlugin.reference.settingValue }
override fun getConfiguratorSettings() = buildList<ModuleConfiguratorSetting<*, *>> { override fun getConfiguratorSettings() = buildList<ModuleConfiguratorSetting<*, *>> {
@@ -136,7 +136,7 @@ object AndroidTargetConfigurator : TargetConfigurator,
+androidPlugin +androidPlugin
} }
override fun WritingContext.runArbitraryTask( override fun Writer.runArbitraryTask(
configurationData: ModuleConfigurationData, configurationData: ModuleConfigurationData,
module: Module, module: Module,
modulePath: Path modulePath: Path
@@ -26,11 +26,11 @@ object AndroidSinglePlatformModuleConfigurator :
override val requiresRootBuildFile: Boolean = true override val requiresRootBuildFile: Boolean = true
override fun createBuildFileIRs( override fun createBuildFileIRs(
readingContext: ReadingContext, reader: Reader,
configurationData: ModuleConfigurationData, configurationData: ModuleConfigurationData,
module: Module module: Module
) = buildList<BuildSystemIR> { ) = buildList<BuildSystemIR> {
+super<AndroidModuleConfigurator>.createBuildFileIRs(readingContext, configurationData, module) +super<AndroidModuleConfigurator>.createBuildFileIRs(reader, configurationData, module)
// it is explicitly here instead of by `createKotlinPluginIR` as it should be after `com.android.application` // it is explicitly here instead of by `createKotlinPluginIR` as it should be after `com.android.application`
+KotlinBuildSystemPluginIR( +KotlinBuildSystemPluginIR(
@@ -46,11 +46,11 @@ object AndroidSinglePlatformModuleConfigurator :
} }
override fun createModuleIRs( override fun createModuleIRs(
readingContext: ReadingContext, reader: Reader,
configurationData: ModuleConfigurationData, configurationData: ModuleConfigurationData,
module: Module module: Module
) = buildList<BuildSystemIR> { ) = buildList<BuildSystemIR> {
+super<AndroidModuleConfigurator>.createModuleIRs(readingContext, configurationData, module) +super<AndroidModuleConfigurator>.createModuleIRs(reader, configurationData, module)
+ArtifactBasedLibraryDependencyIR( +ArtifactBasedLibraryDependencyIR(
MavenArtifact(DefaultRepository.GOOGLE, "androidx.appcompat", "appcompat"), MavenArtifact(DefaultRepository.GOOGLE, "androidx.appcompat", "appcompat"),
@@ -65,7 +65,7 @@ object AndroidSinglePlatformModuleConfigurator :
) )
} }
override fun WritingContext.runArbitraryTask( override fun Writer.runArbitraryTask(
configurationData: ModuleConfigurationData, configurationData: ModuleConfigurationData,
module: Module, module: Module,
modulePath: Path modulePath: Path
@@ -81,6 +81,6 @@ object AndroidSinglePlatformModuleConfigurator :
) )
} }
override fun ReadingContext.createAndroidPlugin(module: Module): AndroidGradlePlugin = override fun Reader.createAndroidPlugin(module: Module): AndroidGradlePlugin =
AndroidGradlePlugin.APPLICATION AndroidGradlePlugin.APPLICATION
} }
@@ -25,7 +25,7 @@ object IOSSinglePlatformModuleConfigurator :
override val needCreateBuildFile: Boolean = false override val needCreateBuildFile: Boolean = false
override val requiresRootBuildFile: Boolean = true override val requiresRootBuildFile: Boolean = true
override fun WritingContext.runArbitraryTask( override fun Writer.runArbitraryTask(
configurationData: ModuleConfigurationData, configurationData: ModuleConfigurationData,
module: Module, module: Module,
modulePath: Path modulePath: Path
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.Reader
import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.core.buildList
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.KotlinBuildSystemPluginIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.KotlinBuildSystemPluginIR
@@ -37,7 +37,7 @@ object JsSingleplatformModuleConfigurator : JSConfigurator, ModuleConfiguratorWi
) )
override fun createBuildFileIRs( override fun createBuildFileIRs(
readingContext: ReadingContext, reader: Reader,
configurationData: ModuleConfigurationData, configurationData: ModuleConfigurationData,
module: Module module: Module
): List<BuildSystemIR> = buildList { ): List<BuildSystemIR> = buildList {
@@ -164,7 +164,7 @@ interface ModuleConfiguratorWithSettings : ModuleConfigurator {
fun getPluginSettings(): List<PluginSettingReference<Any, SettingType<Any>>> = emptyList() fun getPluginSettings(): List<PluginSettingReference<Any, SettingType<Any>>> = emptyList()
fun SettingsWritingContext.initDefaultValuesFor(module: Module) { fun SettingsWriter.initDefaultValuesFor(module: Module) {
withSettingsOf(module) { withSettingsOf(module) {
getConfiguratorSettings().forEach { setting -> getConfiguratorSettings().forEach { setting ->
setting.reference.setSettingValueToItsDefaultIfItIsNotSetValue() setting.reference.setSettingValueToItsDefaultIfItIsNotSetValue()
@@ -179,7 +179,7 @@ val ModuleConfigurator.settings
else -> emptyList() else -> emptyList()
} }
fun ReadingContext.allSettingsOfModuleConfigurator(moduleConfigurator: ModuleConfigurator) = when (moduleConfigurator) { fun Reader.allSettingsOfModuleConfigurator(moduleConfigurator: ModuleConfigurator) = when (moduleConfigurator) {
is ModuleConfiguratorWithSettings -> buildList<Setting<Any, SettingType<Any>>> { is ModuleConfiguratorWithSettings -> buildList<Setting<Any, SettingType<Any>>> {
+moduleConfigurator.getConfiguratorSettings() +moduleConfigurator.getConfiguratorSettings()
+moduleConfigurator.getPluginSettings().map { it.pluginSetting } +moduleConfigurator.getPluginSettings().map { it.pluginSetting }
@@ -205,14 +205,14 @@ interface ModuleConfigurator : DisplayableSettingItem, EntitiesOwnerDescriptor {
val requiresRootBuildFile: Boolean get() = false val requiresRootBuildFile: Boolean get() = false
fun createBuildFileIRs( fun createBuildFileIRs(
readingContext: ReadingContext, reader: Reader,
configurationData: ModuleConfigurationData, configurationData: ModuleConfigurationData,
module: Module module: Module
): List<BuildSystemIR> = ): List<BuildSystemIR> =
emptyList() emptyList()
fun createModuleIRs( fun createModuleIRs(
readingContext: ReadingContext, reader: Reader,
configurationData: ModuleConfigurationData, configurationData: ModuleConfigurationData,
module: Module module: Module
): List<BuildSystemIR> = ): List<BuildSystemIR> =
@@ -225,7 +225,7 @@ interface ModuleConfigurator : DisplayableSettingItem, EntitiesOwnerDescriptor {
fun createKotlinPluginIR(configurationData: ModuleConfigurationData, module: Module): KotlinBuildSystemPluginIR? = fun createKotlinPluginIR(configurationData: ModuleConfigurationData, module: Module): KotlinBuildSystemPluginIR? =
null null
fun WritingContext.runArbitraryTask( fun Writer.runArbitraryTask(
configurationData: ModuleConfigurationData, configurationData: ModuleConfigurationData,
module: Module, module: Module,
modulePath: Path modulePath: Path
@@ -276,5 +276,5 @@ interface ModuleConfigurator : DisplayableSettingItem, EntitiesOwnerDescriptor {
} }
interface GradleModuleConfigurator : ModuleConfigurator { interface GradleModuleConfigurator : ModuleConfigurator {
fun ReadingContext.createSettingsGradleIRs(module: Module): List<BuildSystemIR> = emptyList() fun Reader.createSettingsGradleIRs(module: Module): List<BuildSystemIR> = emptyList()
} }
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.Reader
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ModuleConfiguratorSetting import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ModuleConfiguratorSetting
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ModuleConfiguratorSettingReference import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ModuleConfiguratorSettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
@@ -39,12 +39,12 @@ interface ModuleConfiguratorWithTests : ModuleConfiguratorWithSettings {
fun defaultTestFramework(): KotlinTestFramework fun defaultTestFramework(): KotlinTestFramework
override fun createModuleIRs( override fun createModuleIRs(
readingContext: ReadingContext, reader: Reader,
configurationData: ModuleConfigurationData, configurationData: ModuleConfigurationData,
module: Module module: Module
): List<BuildSystemIR> = ): List<BuildSystemIR> =
withSettingsOf(module) { withSettingsOf(module) {
with(readingContext) { reader {
testFramework.reference.settingValue.dependencyNames.map { dependencyName -> testFramework.reference.settingValue.dependencyNames.map { dependencyName ->
KotlinArbitraryDependencyIR( KotlinArbitraryDependencyIR(
dependencyName, dependencyName,
@@ -1,7 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import kotlinx.collections.immutable.toPersistentList import kotlinx.collections.immutable.toPersistentList
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.Reader
import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
@@ -36,7 +36,7 @@ object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenc
override val text = "For Current System" override val text = "For Current System"
override fun ReadingContext.createTargetIrs( override fun Reader.createTargetIrs(
module: Module module: Module
): List<BuildSystemIR> { ): List<BuildSystemIR> {
val moduleName = module.name val moduleName = module.name
@@ -79,7 +79,7 @@ object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenc
} }
override fun createBuildFileIRs( override fun createBuildFileIRs(
readingContext: ReadingContext, reader: Reader,
configurationData: ModuleConfigurationData, configurationData: ModuleConfigurationData,
module: Module module: Module
): List<BuildSystemIR> = buildList { ): List<BuildSystemIR> = buildList {
@@ -1,7 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import kotlinx.collections.immutable.toPersistentList import kotlinx.collections.immutable.toPersistentList
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.Reader
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
@@ -23,9 +23,9 @@ 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 Reader.createTargetIrs(module: Module): List<BuildSystemIR>
fun createInnerTargetIrs( fun createInnerTargetIrs(
readingContext: ReadingContext, reader: Reader,
module: Module module: Module
): List<BuildSystemIR> = emptyList() ): List<BuildSystemIR> = emptyList()
} }
@@ -46,7 +46,7 @@ interface SimpleTargetConfigurator : TargetConfigurator {
override val suggestedModuleName: String? get() = moduleSubType.name override val suggestedModuleName: String? get() = moduleSubType.name
override fun ReadingContext.createTargetIrs( override fun Reader.createTargetIrs(
module: Module module: Module
): List<BuildSystemIR> = buildList { ): List<BuildSystemIR> = buildList {
+DefaultTargetConfigurationIR( +DefaultTargetConfigurationIR(
@@ -72,7 +72,7 @@ object JsBrowserTargetConfigurator : JsTargetConfigurator, ModuleConfiguratorWit
override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JS override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JS
override fun ReadingContext.createTargetIrs( override fun Reader.createTargetIrs(
module: Module module: Module
): List<BuildSystemIR> = buildList { ): List<BuildSystemIR> = buildList {
+DefaultTargetConfigurationIR( +DefaultTargetConfigurationIR(
@@ -92,7 +92,7 @@ object JsNodeTargetConfigurator : JsTargetConfigurator {
override val suggestedModuleName = "nodeJs" override val suggestedModuleName = "nodeJs"
override fun ReadingContext.createTargetIrs( override fun Reader.createTargetIrs(
module: Module module: Module
): List<BuildSystemIR> = buildList { ): List<BuildSystemIR> = buildList {
+DefaultTargetConfigurationIR( +DefaultTargetConfigurationIR(
@@ -123,10 +123,10 @@ object JvmTargetConfigurator : JvmModuleConfigurator,
override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JUNIT4 override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JUNIT4
override fun createInnerTargetIrs( override fun createInnerTargetIrs(
readingContext: ReadingContext, reader: Reader,
module: Module module: Module
): List<BuildSystemIR> = buildList { ): List<BuildSystemIR> = buildList {
with(readingContext) { reader {
withSettingsOf(module) { withSettingsOf(module) {
val targetVersionValue = JvmModuleConfigurator.targetJvmVersion.reference.settingValue.value val targetVersionValue = JvmModuleConfigurator.targetJvmVersion.reference.settingValue.value
if (buildSystemType.isGradle) { if (buildSystemType.isGradle) {
@@ -1,7 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.Reader
import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ModuleConfiguratorSetting import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ModuleConfiguratorSetting
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
@@ -91,7 +91,7 @@ object JvmSinglePlatformModuleConfigurator : JvmModuleConfigurator,
override fun createBuildFileIRs( override fun createBuildFileIRs(
readingContext: ReadingContext, reader: Reader,
configurationData: ModuleConfigurationData, configurationData: ModuleConfigurationData,
module: Module module: Module
): List<BuildSystemIR> = ): List<BuildSystemIR> =
@@ -99,7 +99,7 @@ object JvmSinglePlatformModuleConfigurator : JvmModuleConfigurator,
+GradleImportIR("org.jetbrains.kotlin.gradle.tasks.KotlinCompile") +GradleImportIR("org.jetbrains.kotlin.gradle.tasks.KotlinCompile")
val targetVersionValue = withSettingsOf(module) { val targetVersionValue = withSettingsOf(module) {
with(readingContext) { reader {
JvmModuleConfigurator.targetJvmVersion.reference.settingValue.value JvmModuleConfigurator.targetJvmVersion.reference.settingValue.value
} }
} }
@@ -39,14 +39,14 @@ class StructurePlugin(context: Context) : Plugin(context) {
} }
} }
val ReadingContext.projectPath val Reader.projectPath
get() = StructurePlugin::projectPath.reference.settingValue get() = StructurePlugin::projectPath.reference.settingValue
val ReadingContext.projectName val Reader.projectName
get() = StructurePlugin::name.reference.settingValue get() = StructurePlugin::name.reference.settingValue
fun WritingContext.pomIR() = PomIR( fun Writer.pomIR() = PomIR(
artifactId = StructurePlugin::artifactId.reference.settingValue, artifactId = StructurePlugin::artifactId.reference.settingValue,
groupId = StructurePlugin::groupId.reference.settingValue, groupId = StructurePlugin::groupId.reference.settingValue,
version = Version.fromString(StructurePlugin::version.reference.settingValue) version = Version.fromString(StructurePlugin::version.reference.settingValue)
@@ -126,12 +126,12 @@ val BuildSystemType.isGradle
get() = this == BuildSystemType.GradleGroovyDsl get() = this == BuildSystemType.GradleGroovyDsl
|| this == BuildSystemType.GradleKotlinDsl || this == BuildSystemType.GradleKotlinDsl
val ReadingContext.allIRModules val Reader.allIRModules
get() = BuildSystemPlugin::buildFiles.propertyValue.flatMap { buildFile -> get() = BuildSystemPlugin::buildFiles.propertyValue.flatMap { buildFile ->
buildFile.modules.modules buildFile.modules.modules
} }
val WritingContext.allModulesPaths val Writer.allModulesPaths
get() = BuildSystemPlugin::buildFiles.propertyValue.flatMap { buildFile -> get() = BuildSystemPlugin::buildFiles.propertyValue.flatMap { buildFile ->
val paths = when (val structure = buildFile.modules) { val paths = when (val structure = buildFile.modules) {
is MultiplatformModulesStructureIR -> listOf(buildFile.directoryPath) is MultiplatformModulesStructureIR -> listOf(buildFile.directoryPath)
@@ -146,6 +146,6 @@ val WritingContext.allModulesPaths
} }
val ReadingContext.buildSystemType: BuildSystemType val Reader.buildSystemType: BuildSystemType
get() = BuildSystemPlugin::type.reference.settingValue get() = BuildSystemPlugin::type.reference.settingValue
@@ -138,7 +138,7 @@ abstract class GradlePlugin(context: Context) : BuildSystemPlugin(context) {
} }
} }
val ReadingContext.settingsGradleBuildFileData val Reader.settingsGradleBuildFileData
get() = when (buildSystemType) { get() = when (buildSystemType) {
BuildSystemType.GradleKotlinDsl -> BuildSystemType.GradleKotlinDsl ->
BuildFileData( BuildFileData(
@@ -100,7 +100,7 @@ class KotlinPlugin(context: Context) : Plugin(context) {
} }
private fun WritingContext.createBuildFiles(modules: List<Module>): TaskResult<List<BuildFileIR>> = private fun Writer.createBuildFiles(modules: List<Module>): TaskResult<List<BuildFileIR>> =
with( with(
ModulesToIRsConverter( ModulesToIRsConverter(
ModuleConfigurationData( ModuleConfigurationData(
@@ -21,7 +21,7 @@ data class ModuleConfigurationData(
val kotlinVersion: Version, val kotlinVersion: Version,
val buildSystemType: BuildSystemType, val buildSystemType: BuildSystemType,
val pomIr: PomIR, val pomIr: PomIR,
val writingContext: WritingContext val writer: Writer
) { ) {
val allModules = rootModules.withAllSubModules() val allModules = rootModules.withAllSubModules()
} }
@@ -61,7 +61,7 @@ class ModulesToIRsConverter(
else -> rootPath / module.name else -> rootPath / module.name
} }
fun ReadingContext.createBuildFiles(): TaskResult<List<BuildFileIR>> = with(data) { fun Reader.createBuildFiles(): TaskResult<List<BuildFileIR>> = with(data) {
val needExplicitRootBuildFile = !needFlattening val needExplicitRootBuildFile = !needFlattening
val parentModuleHasTransitivelySpecifiedKotlinVersion = allModules.any { modules -> val parentModuleHasTransitivelySpecifiedKotlinVersion = allModules.any { modules ->
modules.configurator == AndroidSinglePlatformModuleConfigurator modules.configurator == AndroidSinglePlatformModuleConfigurator
@@ -86,7 +86,7 @@ class ModulesToIRsConverter(
} }
private fun ReadingContext.createBuildFileForModule( private fun Reader.createBuildFileForModule(
module: Module, module: Module,
state: ModulesToIrsState state: ModulesToIrsState
): TaskResult<List<BuildFileIR>> = when (val configurator = module.configurator) { ): TaskResult<List<BuildFileIR>> = when (val configurator = module.configurator) {
@@ -95,13 +95,13 @@ class ModulesToIRsConverter(
else -> Success(emptyList()) else -> Success(emptyList())
} }
private fun ReadingContext.createSinglePlatformModule( private fun Reader.createSinglePlatformModule(
module: Module, module: Module,
configurator: SinglePlatformModuleConfigurator, configurator: SinglePlatformModuleConfigurator,
state: ModulesToIrsState state: ModulesToIrsState
): TaskResult<List<BuildFileIR>> = with(data) { ): TaskResult<List<BuildFileIR>> = with(data) {
val modulePath = calculatePathForModule(module, state.parentPath) val modulePath = calculatePathForModule(module, state.parentPath)
writingContext.mutateProjectStructureByModuleConfigurator(module, modulePath) writer.mutateProjectStructureByModuleConfigurator(module, modulePath)
val buildFileIR = run { val buildFileIR = run {
if (!configurator.needCreateBuildFile) return@run null if (!configurator.needCreateBuildFile) return@run null
val dependenciesIRs = buildPersistenceList<BuildSystemIR> { val dependenciesIRs = buildPersistenceList<BuildSystemIR> {
@@ -159,12 +159,12 @@ class ModulesToIRsConverter(
} }
} }
private fun ReadingContext.createMultiplatformModule( private fun Reader.createMultiplatformModule(
module: Module, module: Module,
state: ModulesToIrsState state: ModulesToIrsState
): TaskResult<List<BuildFileIR>> = with(data) { ): TaskResult<List<BuildFileIR>> = with(data) {
val modulePath = calculatePathForModule(module, state.parentPath) val modulePath = calculatePathForModule(module, state.parentPath)
writingContext.mutateProjectStructureByModuleConfigurator(module, modulePath) writer.mutateProjectStructureByModuleConfigurator(module, modulePath)
val targetIrs = module.subModules.flatMap { subModule -> val targetIrs = module.subModules.flatMap { subModule ->
with(subModule.configurator as TargetConfigurator) { createTargetIrs(subModule) } with(subModule.configurator as TargetConfigurator) { createTargetIrs(subModule) }
} }
@@ -189,8 +189,8 @@ class ModulesToIRsConverter(
).asSingletonList().asSuccess() ).asSingletonList().asSuccess()
} }
private fun ReadingContext.createTargetModule(target: Module, modulePath: Path): MultiplatformModuleIR { private fun Reader.createTargetModule(target: Module, modulePath: Path): MultiplatformModuleIR {
data.writingContext.mutateProjectStructureByModuleConfigurator(target, modulePath) data.writer.mutateProjectStructureByModuleConfigurator(target, modulePath)
val sourcesetss = target.sourcesets.map { sourceset -> val sourcesetss = target.sourcesets.map { sourceset ->
val sourcesetName = target.name + sourceset.sourcesetType.name.capitalize() val sourcesetName = target.name + sourceset.sourcesetType.name.capitalize()
val sourcesetIrs = buildList<BuildSystemIR> { val sourcesetIrs = buildList<BuildSystemIR> {
@@ -226,7 +226,7 @@ class ModulesToIRsConverter(
) )
} }
private fun WritingContext.mutateProjectStructureByModuleConfigurator( private fun Writer.mutateProjectStructureByModuleConfigurator(
module: Module, module: Module,
modulePath: Path modulePath: Path
): TaskResult<Unit> = with(module.configurator) { ): TaskResult<Unit> = with(module.configurator) {
@@ -239,7 +239,7 @@ class ModulesToIRsConverter(
} }
} }
private fun ReadingContext.createBuildFileIRs( private fun Reader.createBuildFileIRs(
module: Module, module: Module,
state: ModulesToIrsState state: ModulesToIrsState
) = buildPersistenceList<BuildSystemIR> { ) = buildPersistenceList<BuildSystemIR> {
@@ -20,7 +20,7 @@ class ProjectTemplatesPlugin(context: Context) : Plugin(context) {
} }
} }
fun SettingsWritingContext.applyProjectTemplate(projectTemplate: ProjectTemplate) { fun SettingsWriter.applyProjectTemplate(projectTemplate: ProjectTemplate) {
projectTemplate.setsValues.forEach { (setting, value) -> projectTemplate.setsValues.forEach { (setting, value) ->
setting.setValue(value) setting.setValue(value)
} }
@@ -106,7 +106,7 @@ class TemplatesPlugin(context: Context) : Plugin(context) {
} }
} }
private fun WritingContext.applyFileTemplatesFromSourceset( private fun Writer.applyFileTemplatesFromSourceset(
module: ModuleIR, module: ModuleIR,
templateEngine: TemplateEngine, templateEngine: TemplateEngine,
interceptionPointSettings: Map<InterceptionPoint<Any>, Any> interceptionPointSettings: Map<InterceptionPoint<Any>, Any>
@@ -129,7 +129,7 @@ class TemplatesPlugin(context: Context) : Plugin(context) {
}.sequenceIgnore() }.sequenceIgnore()
} }
private fun WritingContext.defaultSettings(moduleIR: ModuleIR) = mapOf( private fun Writer.defaultSettings(moduleIR: ModuleIR) = mapOf(
"projectName" to projectName, "projectName" to projectName,
"moduleName" to moduleIR.name "moduleName" to moduleIR.name
) )
@@ -68,7 +68,7 @@ class Module(
else -> "Module" else -> "Module"
} }
fun SettingsWritingContext.initDefaultValuesForSettings() { fun SettingsWriter.initDefaultValuesForSettings() {
configurator.safeAs<ModuleConfiguratorWithSettings>()?.apply { initDefaultValuesFor(this@Module) } configurator.safeAs<ModuleConfiguratorWithSettings>()?.apply { initDefaultValuesFor(this@Module) }
template?.apply { initDefaultValuesFor(this@Module) } template?.apply { initDefaultValuesFor(this@Module) }
} }
@@ -67,15 +67,15 @@ enum class SourcesetType: DisplayableSettingItem {
} }
fun WritingContext.updateBuildFiles(action: (BuildFileIR) -> TaskResult<BuildFileIR>): TaskResult<Unit> = fun Writer.updateBuildFiles(action: (BuildFileIR) -> TaskResult<BuildFileIR>): TaskResult<Unit> =
BuildSystemPlugin::buildFiles.update { buildFiles -> BuildSystemPlugin::buildFiles.update { buildFiles ->
buildFiles.mapSequence(action) buildFiles.mapSequence(action)
} }
fun WritingContext.updateModules(action: (ModuleIR) -> TaskResult<ModuleIR>): TaskResult<Unit> = fun Writer.updateModules(action: (ModuleIR) -> TaskResult<ModuleIR>): TaskResult<Unit> =
updateBuildFiles { buildFile -> updateBuildFiles { buildFile ->
buildFile.withModulesUpdated { action(it) } buildFile.withModulesUpdated { action(it) }
} }
fun WritingContext.forEachModule(action: (ModuleIR) -> TaskResult<Unit>): TaskResult<Unit> = fun Writer.forEachModule(action: (ModuleIR) -> TaskResult<Unit>): TaskResult<Unit> =
updateModules { moduleIR -> action(moduleIR).map { moduleIR } } updateModules { moduleIR -> action(moduleIR).map { moduleIR } }
@@ -1,6 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.templates package org.jetbrains.kotlin.tools.projectWizard.templates
import org.jetbrains.kotlin.tools.projectWizard.core.WritingContext import org.jetbrains.kotlin.tools.projectWizard.core.Writer
import org.jetbrains.kotlin.tools.projectWizard.core.asPath import org.jetbrains.kotlin.tools.projectWizard.core.asPath
import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
@@ -19,7 +19,7 @@ class ConsoleJvmApplicationTemplate : Template() {
""".trimIndent() """.trimIndent()
override val moduleTypes: Set<ModuleType> = setOf(ModuleType.jvm) override val moduleTypes: Set<ModuleType> = setOf(ModuleType.jvm)
override fun WritingContext.getIrsToAddToBuildFile( override fun Writer.getIrsToAddToBuildFile(
module: ModuleIR module: ModuleIR
) = buildList<BuildSystemIR> { ) = buildList<BuildSystemIR> {
+runTaskIrs("MainKt") +runTaskIrs("MainKt")
@@ -28,7 +28,7 @@ class ConsoleJvmApplicationTemplate : Template() {
override fun updateTargetIr(module: ModuleIR, targetConfigurationIR: TargetConfigurationIR): TargetConfigurationIR = override fun updateTargetIr(module: ModuleIR, targetConfigurationIR: TargetConfigurationIR): TargetConfigurationIR =
targetConfigurationIR.addWithJavaIntoJvmTarget() targetConfigurationIR.addWithJavaIntoJvmTarget()
override fun WritingContext.getFileTemplates(module: ModuleIR) = override fun Writer.getFileTemplates(module: ModuleIR) =
buildList<FileTemplateDescriptorWithPath> { buildList<FileTemplateDescriptorWithPath> {
+(FileTemplateDescriptor("$id/main.kt.vm", "main.kt".asPath()) asSrcOf SourcesetType.main) +(FileTemplateDescriptor("$id/main.kt.vm", "main.kt".asPath()) asSrcOf SourcesetType.main)
} }
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.tools.projectWizard.templates package org.jetbrains.kotlin.tools.projectWizard.templates
import org.jetbrains.kotlin.tools.projectWizard.core.WritingContext import org.jetbrains.kotlin.tools.projectWizard.core.Writer
import org.jetbrains.kotlin.tools.projectWizard.core.asPath import org.jetbrains.kotlin.tools.projectWizard.core.asPath
import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.TemplateSetting import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.TemplateSetting
@@ -29,7 +29,7 @@ class KtorServerTemplate : Template() {
override val moduleTypes: Set<ModuleType> = setOf(ModuleType.jvm) override val moduleTypes: Set<ModuleType> = setOf(ModuleType.jvm)
override val id: String = "ktorServer" override val id: String = "ktorServer"
override fun WritingContext.getRequiredLibraries(module: ModuleIR): List<DependencyIR> = override fun Writer.getRequiredLibraries(module: ModuleIR): List<DependencyIR> =
withSettingsOf(module.originalModule) { withSettingsOf(module.originalModule) {
buildList { buildList {
+ktorArtifactDependency(serverEngine.reference.settingValue.dependencyName) +ktorArtifactDependency(serverEngine.reference.settingValue.dependencyName)
@@ -42,7 +42,7 @@ class KtorServerTemplate : Template() {
} }
} }
override fun WritingContext.getIrsToAddToBuildFile(module: ModuleIR): List<BuildSystemIR> = buildList { override fun Writer.getIrsToAddToBuildFile(module: ModuleIR): List<BuildSystemIR> = buildList {
+RepositoryIR(Repositories.KTOR_BINTRAY) +RepositoryIR(Repositories.KTOR_BINTRAY)
+RepositoryIR(DefaultRepository.JCENTER) +RepositoryIR(DefaultRepository.JCENTER)
+runTaskIrs(mainClass = "ServerKt") +runTaskIrs(mainClass = "ServerKt")
@@ -51,7 +51,7 @@ class KtorServerTemplate : Template() {
override fun updateTargetIr(module: ModuleIR, targetConfigurationIR: TargetConfigurationIR): TargetConfigurationIR = override fun updateTargetIr(module: ModuleIR, targetConfigurationIR: TargetConfigurationIR): TargetConfigurationIR =
targetConfigurationIR.addWithJavaIntoJvmTarget() targetConfigurationIR.addWithJavaIntoJvmTarget()
override fun WritingContext.getFileTemplates(module: ModuleIR): List<FileTemplateDescriptorWithPath> = listOf( override fun Writer.getFileTemplates(module: ModuleIR): List<FileTemplateDescriptorWithPath> = listOf(
FileTemplateDescriptor("$id/server.kt.vm", "server.kt".asPath()) asSrcOf SourcesetType.main FileTemplateDescriptor("$id/server.kt.vm", "server.kt".asPath()) asSrcOf SourcesetType.main
) )
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.tools.projectWizard.templates package org.jetbrains.kotlin.tools.projectWizard.templates
import org.jetbrains.kotlin.tools.projectWizard.core.WritingContext import org.jetbrains.kotlin.tools.projectWizard.core.Writer
import org.jetbrains.kotlin.tools.projectWizard.core.asPath import org.jetbrains.kotlin.tools.projectWizard.core.asPath
import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR
@@ -25,7 +25,7 @@ class NativeConsoleApplicationTemplate : Template() {
override fun updateTargetIr(module: ModuleIR, targetConfigurationIR: TargetConfigurationIR): TargetConfigurationIR = override fun updateTargetIr(module: ModuleIR, targetConfigurationIR: TargetConfigurationIR): TargetConfigurationIR =
targetConfigurationIR.withIrs(NativeTargetInternalIR("main")) targetConfigurationIR.withIrs(NativeTargetInternalIR("main"))
override fun WritingContext.getFileTemplates(module: ModuleIR): List<FileTemplateDescriptorWithPath> = buildList { override fun Writer.getFileTemplates(module: ModuleIR): List<FileTemplateDescriptorWithPath> = buildList {
+(FileTemplateDescriptor("$id/main.kt.vm", "main.kt".asPath()) asSrcOf SourcesetType.main) +(FileTemplateDescriptor("$id/main.kt.vm", "main.kt".asPath()) asSrcOf SourcesetType.main)
} }
} }
@@ -42,7 +42,7 @@ class SimpleJsClientTemplate : Template() {
override val settings: List<TemplateSetting<*, *>> = listOf(renderEngine) override val settings: List<TemplateSetting<*, *>> = listOf(renderEngine)
override fun ReadingContext.createRunConfigurations(module: ModuleIR): List<WizardRunConfiguration> = buildList { override fun Reader.createRunConfigurations(module: ModuleIR): List<WizardRunConfiguration> = buildList {
if (module.originalModule.kind == ModuleKind.singleplatformJs) { if (module.originalModule.kind == ModuleKind.singleplatformJs) {
+WizardGradleRunConfiguration( +WizardGradleRunConfiguration(
"BrowserDevelopmentRun in continuous mode", "BrowserDevelopmentRun in continuous mode",
@@ -57,7 +57,7 @@ class SimpleJsClientTemplate : Template() {
} }
} }
override fun WritingContext.getRequiredLibraries(module: ModuleIR): List<DependencyIR> = withSettingsOf(module.originalModule) { override fun Writer.getRequiredLibraries(module: ModuleIR): List<DependencyIR> = withSettingsOf(module.originalModule) {
buildList { buildList {
+ArtifactBasedLibraryDependencyIR( +ArtifactBasedLibraryDependencyIR(
MavenArtifact(DefaultRepository.JCENTER, "org.jetbrains.kotlinx", "kotlinx-html-js"), MavenArtifact(DefaultRepository.JCENTER, "org.jetbrains.kotlinx", "kotlinx-html-js"),
@@ -81,7 +81,7 @@ class SimpleJsClientTemplate : Template() {
} }
override fun WritingContext.getFileTemplates(module: ModuleIR): List<FileTemplateDescriptorWithPath> = override fun Writer.getFileTemplates(module: ModuleIR): List<FileTemplateDescriptorWithPath> =
withSettingsOf(module.originalModule) { withSettingsOf(module.originalModule) {
buildList { buildList {
val hasKtorServNeighbourTarget = module.safeAs<MultiplatformModuleIR>() val hasKtorServNeighbourTarget = module.safeAs<MultiplatformModuleIR>()
@@ -200,7 +200,7 @@ class SimpleJsClientTemplate : Template() {
} }
} }
override fun WritingContext.getIrsToAddToBuildFile(module: ModuleIR): List<BuildSystemIR> = buildList { override fun Writer.getIrsToAddToBuildFile(module: ModuleIR): List<BuildSystemIR> = buildList {
+RepositoryIR(DefaultRepository.JCENTER) +RepositoryIR(DefaultRepository.JCENTER)
if (module is MultiplatformModuleIR) { if (module is MultiplatformModuleIR) {
+GradleImportIR("org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack") +GradleImportIR("org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack")
@@ -75,7 +75,7 @@ abstract class Template : SettingsOwner, EntitiesOwnerDescriptor {
open val settings: List<TemplateSetting<*, *>> = emptyList() open val settings: List<TemplateSetting<*, *>> = emptyList()
open val interceptionPoints: List<InterceptionPoint<Any>> = emptyList() open val interceptionPoints: List<InterceptionPoint<Any>> = emptyList()
fun SettingsWritingContext.initDefaultValuesFor(module: Module) { fun SettingsWriter.initDefaultValuesFor(module: Module) {
withSettingsOf(module) { withSettingsOf(module) {
settings.forEach { setting -> settings.forEach { setting ->
setting.reference.setSettingValueToItsDefaultIfItIsNotSetValue() setting.reference.setSettingValueToItsDefaultIfItIsNotSetValue()
@@ -83,10 +83,10 @@ abstract class Template : SettingsOwner, EntitiesOwnerDescriptor {
} }
} }
open fun WritingContext.getRequiredLibraries(module: ModuleIR): List<DependencyIR> = emptyList() open fun Writer.getRequiredLibraries(module: ModuleIR): List<DependencyIR> = emptyList()
//TODO: use setting reading context //TODO: use setting reading context
open fun WritingContext.getIrsToAddToBuildFile( open fun Writer.getIrsToAddToBuildFile(
module: ModuleIR module: ModuleIR
): List<BuildSystemIR> = emptyList() ): List<BuildSystemIR> = emptyList()
@@ -95,13 +95,13 @@ abstract class Template : SettingsOwner, EntitiesOwnerDescriptor {
targetConfigurationIR: TargetConfigurationIR targetConfigurationIR: TargetConfigurationIR
): TargetConfigurationIR = targetConfigurationIR ): TargetConfigurationIR = targetConfigurationIR
open fun WritingContext.getFileTemplates(module: ModuleIR): List<FileTemplateDescriptorWithPath> = emptyList() open fun Writer.getFileTemplates(module: ModuleIR): List<FileTemplateDescriptorWithPath> = emptyList()
open fun createInterceptors(module: ModuleIR): List<TemplateInterceptor> = emptyList() open fun createInterceptors(module: ModuleIR): List<TemplateInterceptor> = emptyList()
open fun ReadingContext.createRunConfigurations(module: ModuleIR): List<WizardRunConfiguration> = emptyList() open fun Reader.createRunConfigurations(module: ModuleIR): List<WizardRunConfiguration> = emptyList()
fun WritingContext.applyToSourceset( fun Writer.applyToSourceset(
module: ModuleIR module: ModuleIR
): TaskResult<TemplateApplicationResult> { ): TaskResult<TemplateApplicationResult> {
val librariesToAdd = getRequiredLibraries(module) val librariesToAdd = getRequiredLibraries(module)
@@ -121,7 +121,7 @@ abstract class Template : SettingsOwner, EntitiesOwnerDescriptor {
return result.asSuccess() return result.asSuccess()
} }
fun WritingContext.settingsAsMap(module: Module): Map<String, Any> = fun Writer.settingsAsMap(module: Module): Map<String, Any> =
withSettingsOf(module) { withSettingsOf(module) {
settings.associate { setting -> settings.associate { setting ->
setting.path to setting.reference.settingValue setting.path to setting.reference.settingValue
@@ -129,7 +129,7 @@ abstract class Template : SettingsOwner, EntitiesOwnerDescriptor {
} + createDefaultSettings() } + createDefaultSettings()
private fun WritingContext.createDefaultSettings() = mapOf( private fun Writer.createDefaultSettings() = mapOf(
"projectName" to StructurePlugin::name.settingValue.capitalize() "projectName" to StructurePlugin::name.settingValue.capitalize()
) )
@@ -257,7 +257,7 @@ fun Template.settings(module: Module) = withSettingsOf(module) {
settings.map { it.reference } settings.map { it.reference }
} }
fun WritingContext.applyTemplateToModule( fun Writer.applyTemplateToModule(
template: Template?, template: Template?,
module: ModuleIR module: ModuleIR
): TaskResult<TemplateApplicationResult> = when (template) { ): TaskResult<TemplateApplicationResult> = when (template) {
@@ -6,7 +6,7 @@ import org.apache.velocity.runtime.RuntimeConstants
import org.apache.velocity.runtime.RuntimeServices import org.apache.velocity.runtime.RuntimeServices
import org.apache.velocity.runtime.log.LogChute import org.apache.velocity.runtime.log.LogChute
import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult
import org.jetbrains.kotlin.tools.projectWizard.core.WritingContext import org.jetbrains.kotlin.tools.projectWizard.core.Writer
import org.jetbrains.kotlin.tools.projectWizard.core.div import org.jetbrains.kotlin.tools.projectWizard.core.div
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileFormattingService import org.jetbrains.kotlin.tools.projectWizard.core.service.FileFormattingService
@@ -17,7 +17,7 @@ import java.io.StringWriter
interface TemplateEngine { interface TemplateEngine {
fun renderTemplate(template: FileTemplateDescriptor, data: Map<String, Any?>): String fun renderTemplate(template: FileTemplateDescriptor, data: Map<String, Any?>): String
fun WritingContext.writeTemplate(template: FileTemplate): TaskResult<Unit> { fun Writer.writeTemplate(template: FileTemplate): TaskResult<Unit> {
val formatter = service<FileFormattingService>() val formatter = service<FileFormattingService>()
val text = renderTemplate(template.descriptor, template.data).let { text -> val text = renderTemplate(template.descriptor, template.data).let { text ->
formatter.formatFile(text, template.descriptor.relativePath.fileName.toString()) formatter.formatFile(text, template.descriptor.relativePath.fileName.toString())