Wizard: introduce ModuleConfiguratorProperty

This commit is contained in:
Ilya Kirillov
2020-07-22 17:26:30 +03:00
committed by Kirill Shmakov
parent 74d6919c7c
commit dbc43b66bf
29 changed files with 226 additions and 78 deletions
@@ -6,18 +6,15 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.service package org.jetbrains.kotlin.tools.projectWizard.wizard.service
import com.intellij.codeInsight.daemon.impl.quickfix.OrderEntryFix import com.intellij.codeInsight.daemon.impl.quickfix.OrderEntryFix
import com.intellij.ide.impl.NewProjectUtil
import com.intellij.ide.util.projectWizard.ModuleBuilder import com.intellij.ide.util.projectWizard.ModuleBuilder
import com.intellij.jarRepository.JarRepositoryManager import com.intellij.jarRepository.JarRepositoryManager
import com.intellij.jarRepository.RemoteRepositoryDescription import com.intellij.jarRepository.RemoteRepositoryDescription
import com.intellij.openapi.Disposable
import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl
import com.intellij.openapi.module.ModifiableModuleModel import com.intellij.openapi.module.ModifiableModuleModel
import com.intellij.openapi.module.ModuleTypeId import com.intellij.openapi.module.ModuleTypeId
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.* import com.intellij.openapi.roots.*
import com.intellij.openapi.roots.libraries.ui.OrderRoot import com.intellij.openapi.roots.libraries.ui.OrderRoot
import com.intellij.openapi.util.Disposer
import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.VfsUtil
import com.intellij.util.PathUtil import com.intellij.util.PathUtil
import org.jetbrains.idea.maven.utils.library.RepositoryLibraryProperties import org.jetbrains.idea.maven.utils.library.RepositoryLibraryProperties
@@ -41,7 +38,7 @@ import org.jetbrains.kotlin.tools.projectWizard.wizard.NewProjectWizardModuleBui
import org.jetbrains.kotlin.idea.framework.KotlinSdkType import org.jetbrains.kotlin.idea.framework.KotlinSdkType
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.JvmModuleConfigurator import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.JvmModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.withSettingsOf import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.inContextOfModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repository import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repository
import java.nio.file.Path import java.nio.file.Path
import java.util.* import java.util.*
@@ -116,7 +113,7 @@ private class JpsModuleConfigurationUpdater(
} }
private fun ModuleIR.jvmTarget() = reader { private fun ModuleIR.jvmTarget() = reader {
withSettingsOf(originalModule) { inContextOfModuleConfigurator(originalModule) {
JvmModuleConfigurator.targetJvmVersion.reference.settingValue JvmModuleConfigurator.targetJvmVersion.reference.settingValue
} }
} }
@@ -0,0 +1,25 @@
/*
* Copyright 2010-2020 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
import org.jetbrains.kotlin.tools.projectWizard.core.entity.properties.Property
import org.jetbrains.kotlin.tools.projectWizard.core.entity.properties.PropertyBuilder
import kotlin.properties.ReadOnlyProperty
interface PropertiesOwner {
fun <T : Any> propertyDelegate(
create: (path: String) -> PropertyBuilder<T>
): ReadOnlyProperty<Any, Property<T>>
fun <T : Any> property(
defaultValue: T,
init: PropertyBuilder<T>.() -> Unit = {}
): ReadOnlyProperty<Any, Property<T>> =
propertyDelegate { path -> PropertyBuilder(path, defaultValue).apply(init) }
fun <T : Any> listProperty(vararg defaultValues: T, init: PropertyBuilder<List<T>>.() -> Unit = {}) =
property(defaultValues.toList(), init)
}
@@ -1,6 +1,10 @@
package org.jetbrains.kotlin.tools.projectWizard.core package 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.entity.properties.PluginProperty
import org.jetbrains.kotlin.tools.projectWizard.core.entity.properties.PluginPropertyReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.properties.PropertyContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.properties.PropertyReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.*
import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager
import org.jetbrains.kotlin.tools.projectWizard.core.service.SettingSavingWizardService import org.jetbrains.kotlin.tools.projectWizard.core.service.SettingSavingWizardService
@@ -109,9 +113,16 @@ class Context private constructor(
fun <S : WizardService> serviceByClass(klass: KClass<S>, filter: (S) -> Boolean = { true }): S = fun <S : WizardService> serviceByClass(klass: KClass<S>, filter: (S) -> Boolean = { true }): S =
servicesManager.serviceByClass(klass, filter) ?: error("Service ${klass.simpleName} was not found") servicesManager.serviceByClass(klass, filter) ?: error("Service ${klass.simpleName} was not found")
val <T : Any> PluginProperty<T>.reference: PluginPropertyReference<T>
get() = PluginPropertyReference(this)
val <T : Any> PluginProperty<T>.propertyValue: T val <T : Any> PluginProperty<T>.propertyValue: T
get() = propertyContext[this] ?: error("No value is present for property `$this`") get() = propertyContext[this] ?: error("No value is present for property `$this`")
val <T : Any> PropertyReference<T>.propertyValue: T
get() = propertyContext[this] ?: error("No value is present for property `$this`")
val <V : Any, T : SettingType<V>> SettingReference<V, T>.settingValue: V val <V : Any, T : SettingType<V>> SettingReference<V, T>.settingValue: V
get() = settingContext[this] ?: error("No value is present for setting `$this`") get() = settingContext[this] ?: error("No value is present for setting `$this`")
@@ -171,6 +182,10 @@ class Context private constructor(
fun <T : Any> PluginProperty<T>.update( fun <T : Any> PluginProperty<T>.update(
updater: suspend ComputeContext<*>.(T) -> TaskResult<T> updater: suspend ComputeContext<*>.(T) -> TaskResult<T>
): TaskResult<Unit> = reference.update(updater)
fun <T : Any> PropertyReference<T>.update(
updater: suspend ComputeContext<*>.(T) -> TaskResult<T>
): TaskResult<Unit> = compute { ): TaskResult<Unit> = compute {
val (newValue) = updater(propertyValue) val (newValue) = updater(propertyValue)
propertyContext[this@update] = newValue propertyContext[this@update] = newValue
@@ -182,6 +197,10 @@ class Context private constructor(
fun <T : Any> PluginProperty<List<T>>.addValues( fun <T : Any> PluginProperty<List<T>>.addValues(
values: List<T> values: List<T>
): TaskResult<Unit> = reference.addValues(values)
fun <T : Any> PropertyReference<List<T>>.addValues(
values: List<T>
): TaskResult<Unit> = update { oldValues -> success(oldValues + values) } ): TaskResult<Unit> = update { oldValues -> success(oldValues + values) }
@JvmName("write") @JvmName("write")
@@ -193,6 +212,10 @@ class Context private constructor(
settingContext[this] = newValue settingContext[this] = newValue
} }
fun <V : Any> PropertyReference<V>.initDefaultValue(newValue: V) {
propertyContext[this] = property.defaultValue
}
fun <V : Any, T : SettingType<V>> SettingReference<V, T>.setSettingValueToItsDefaultIfItIsNotSetValue() { fun <V : Any, T : SettingType<V>> SettingReference<V, T>.setSettingValueToItsDefaultIfItIsNotSetValue() {
val defaultValue = savedOrDefaultValue ?: return val defaultValue = savedOrDefaultValue ?: return
if (notRequiredSettingValue == null) { if (notRequiredSettingValue == null) {
@@ -3,6 +3,9 @@ package org.jetbrains.kotlin.tools.projectWizard.core
import org.jetbrains.kotlin.tools.projectWizard.PropertiesOwner import org.jetbrains.kotlin.tools.projectWizard.PropertiesOwner
import org.jetbrains.kotlin.tools.projectWizard.SettingsOwner import org.jetbrains.kotlin.tools.projectWizard.SettingsOwner
import org.jetbrains.kotlin.tools.projectWizard.core.entity.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.properties.PluginProperty
import org.jetbrains.kotlin.tools.projectWizard.core.entity.properties.Property
import org.jetbrains.kotlin.tools.projectWizard.core.entity.properties.PropertyBuilder
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.*
import org.jetbrains.kotlin.tools.projectWizard.enumSettingImpl import org.jetbrains.kotlin.tools.projectWizard.enumSettingImpl
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
@@ -0,0 +1,17 @@
/*
* Copyright 2010-2020 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.core.entity
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
abstract class EntityReference {
abstract val path: String
final override fun toString() = path
final override fun equals(other: Any?) = other.safeAs<SettingReference<*, *>>()?.path == path
final override fun hashCode() = path.hashCode()
}
@@ -1,25 +0,0 @@
package org.jetbrains.kotlin.tools.projectWizard.core.entity
class PropertyContext : ValuedEntityContext<Property<Any>>()
interface Property<out T : Any> : Entity {
val defaultValue: T
}
data class InternalProperty<out T : Any>(
override val path: String,
override val defaultValue: T,
) : Property<T>, EntityWithValue<T>()
sealed class PropertyImpl<out T : Any> : Property<T>
class PluginProperty<out T : Any>(
internal: Property<T>
) : PropertyImpl<T>(), Property<T> by internal
class PropertyBuilder<T : Any>(
private val name: String,
private val defaultValue: T
) {
fun build(): Property<T> = InternalProperty(name, defaultValue)
}
@@ -1,7 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.core.entity package org.jetbrains.kotlin.tools.projectWizard.core.entity
abstract class ValuedEntityContext<E : Entity> { abstract class ValuedEntityContext<E : Entity> {
private val values = mutableMapOf<String, Any>() protected val values = mutableMapOf<String, Any>()
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
operator fun <V : Any> get(entity: E) = operator fun <V : Any> get(entity: E) =
@@ -0,0 +1,47 @@
/*
* Copyright 2010-2020 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.core.entity.properties
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.ValuedEntityContext
class PropertyContext : ValuedEntityContext<Property<Any>>() {
@Suppress("UNCHECKED_CAST")
operator fun <V : Any> get(entity: PropertyReference<V>) =
values[entity.path] as? V
operator fun <V : Any> set(entity: PropertyReference<V>, value: Any) {
values[entity.path] = value
}
}
interface Property<out T : Any> : Entity {
val defaultValue: T
}
data class InternalProperty<out T : Any>(
override val path: String,
override val defaultValue: T,
) : Property<T>, EntityWithValue<T>()
sealed class PropertyImpl<out T : Any> : Property<T>
class PluginProperty<out T : Any>(
internal: Property<T>
) : PropertyImpl<T>(), Property<T> by internal
class ModuleConfiguratorProperty<out T : Any>(
internal: Property<T>
) : PropertyImpl<T>(), Property<T> by internal
class PropertyBuilder<T : Any>(
private val name: String,
private val defaultValue: T
) {
fun build(): Property<T> = InternalProperty(name, defaultValue)
}
@@ -0,0 +1,28 @@
/*
* Copyright 2010-2020 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.core.entity.properties
import org.jetbrains.kotlin.tools.projectWizard.core.entity.EntityReference
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.ModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
sealed class PropertyReference<out T : Any> : EntityReference() {
abstract val property: Property<T>
}
class PluginPropertyReference<out T: Any>(override val property: PluginProperty<T>): PropertyReference<T>() {
override val path: String
get() = property.path
}
class ModuleConfiguratorPropertyReference<out T : Any>(
val configurator: ModuleConfigurator,
val module: Module,
override val property: ModuleConfiguratorProperty<T>
) : PropertyReference<T>() {
override val path: String
get() = "${configurator.id}/${module.identificator}/${property.path}"
}
@@ -5,26 +5,19 @@
package org.jetbrains.kotlin.tools.projectWizard.core.entity.settings package org.jetbrains.kotlin.tools.projectWizard.core.entity.settings
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.Identificator import org.jetbrains.kotlin.tools.projectWizard.Identificator
import org.jetbrains.kotlin.tools.projectWizard.core.Reader import org.jetbrains.kotlin.tools.projectWizard.core.Reader
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs import org.jetbrains.kotlin.tools.projectWizard.core.entity.EntityReference
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.ModuleConfigurator import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.ModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.templates.Template import org.jetbrains.kotlin.tools.projectWizard.templates.Template
import kotlin.reflect.KClass import kotlin.reflect.KClass
sealed class SettingReference<out V : Any, out T : SettingType<V>> { sealed class SettingReference<out V : Any, out T : SettingType<V>>: EntityReference() {
@get:NonNls
abstract val path: String
abstract val type: KClass<out T> abstract val type: KClass<out T>
abstract fun Reader.getSetting(): Setting<V, T> abstract fun Reader.getSetting(): Setting<V, T>
final override fun toString() = path
final override fun equals(other: Any?) = other.safeAs<SettingReference<*, *>>()?.path == path
final override fun hashCode() = path.hashCode()
} }
data class PluginSettingReference<out V : Any, out T : SettingType<V>>( data class PluginSettingReference<out V : Any, out T : SettingType<V>>(
@@ -140,7 +140,7 @@ object AndroidTargetConfigurator : TargetConfigurator,
override val text = KotlinNewProjectWizardBundle.message("module.configurator.android") override val text = KotlinNewProjectWizardBundle.message("module.configurator.android")
override fun Reader.createAndroidPlugin(module: Module): AndroidGradlePlugin = override fun Reader.createAndroidPlugin(module: Module): AndroidGradlePlugin =
withSettingsOf(module) { androidPlugin.reference.settingValue } inContextOfModuleConfigurator(module) { androidPlugin.reference.settingValue }
override fun getConfiguratorSettings() = buildList<ModuleConfiguratorSetting<*, *>> { override fun getConfiguratorSettings() = buildList<ModuleConfiguratorSetting<*, *>> {
+super.getConfiguratorSettings() +super.getConfiguratorSettings()
@@ -70,7 +70,7 @@ object IOSSinglePlatformModuleConfigurator : SinglePlatformModuleConfigurator, M
} }
private fun Reader.createTemplatesSettingValues(module: Module): Map<String, Any?> { private fun Reader.createTemplatesSettingValues(module: Module): Map<String, Any?> {
val dependentModule = withSettingsOf(module) { val dependentModule = inContextOfModuleConfigurator(module) {
dependentModule.reference.notRequiredSettingValue?.module dependentModule.reference.notRequiredSettingValue?.module
} }
@@ -2,8 +2,10 @@ package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.kotlin.tools.projectWizard.Identificator import org.jetbrains.kotlin.tools.projectWizard.Identificator
import org.jetbrains.kotlin.tools.projectWizard.PropertiesOwner
import org.jetbrains.kotlin.tools.projectWizard.SettingsOwner 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.properties.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.*
import org.jetbrains.kotlin.tools.projectWizard.enumSettingImpl import org.jetbrains.kotlin.tools.projectWizard.enumSettingImpl
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
@@ -21,41 +23,49 @@ import java.nio.file.Path
import kotlin.properties.ReadOnlyProperty import kotlin.properties.ReadOnlyProperty
interface ModuleConfiguratorSettingsEnvironment { interface ModuleConfiguratorContext {
val <V : Any, T : SettingType<V>> ModuleConfiguratorSetting<V, T>.reference: ModuleConfiguratorSettingReference<V, T> val <V : Any, T : SettingType<V>> ModuleConfiguratorSetting<V, T>.reference: ModuleConfiguratorSettingReference<V, T>
val <T : Any> ModuleConfiguratorProperty<T>.reference: PropertyReference<T>
} }
class ModuleBasedConfiguratorSettingsEnvironment( class ModuleBasedConfiguratorContext(
private val configurator: ModuleConfigurator, private val configurator: ModuleConfigurator,
private val module: Module private val module: Module
) : ModuleConfiguratorSettingsEnvironment { ) : ModuleConfiguratorContext {
override val <V : Any, T : SettingType<V>> ModuleConfiguratorSetting<V, T>.reference: ModuleConfiguratorSettingReference<V, T> override val <V : Any, T : SettingType<V>> ModuleConfiguratorSetting<V, T>.reference: ModuleConfiguratorSettingReference<V, T>
get() = ModuleBasedConfiguratorSettingReference(configurator, module, this) get() = ModuleBasedConfiguratorSettingReference(configurator, module, this)
override val <T : Any> ModuleConfiguratorProperty<T>.reference: PropertyReference<T>
get() = ModuleConfiguratorPropertyReference<T>(configurator, module, this)
} }
class IdBasedConfiguratorSettingsEnvironment( class IdBasedConfiguratorContext(
private val configurator: ModuleConfigurator, private val configurator: ModuleConfigurator,
private val moduleId: Identificator private val moduleId: Identificator
) : ModuleConfiguratorSettingsEnvironment { ) : ModuleConfiguratorContext {
override val <V : Any, T : SettingType<V>> ModuleConfiguratorSetting<V, T>.reference: ModuleConfiguratorSettingReference<V, T> override val <V : Any, T : SettingType<V>> ModuleConfiguratorSetting<V, T>.reference: ModuleConfiguratorSettingReference<V, T>
get() = IdBasedConfiguratorSettingReference(configurator, moduleId, this) get() = IdBasedConfiguratorSettingReference(configurator, moduleId, this)
override val <T : Any> ModuleConfiguratorProperty<T>.reference: PropertyReference<T>
get() = error("Should not be called as IdBasedConfiguratorContext used only for parsing settings")
} }
fun <T> withSettingsOf( fun <T> inContextOfModuleConfigurator(
moduleId: Identificator, moduleId: Identificator,
configurator: ModuleConfigurator, configurator: ModuleConfigurator,
function: ModuleConfiguratorSettingsEnvironment.() -> T function: ModuleConfiguratorContext.() -> T
): T = function(IdBasedConfiguratorSettingsEnvironment(configurator, moduleId)) ): T = function(IdBasedConfiguratorContext(configurator, moduleId))
fun <T> withSettingsOf( fun <T> inContextOfModuleConfigurator(
module: Module, module: Module,
configurator: ModuleConfigurator = module.configurator, configurator: ModuleConfigurator = module.configurator,
function: ModuleConfiguratorSettingsEnvironment.() -> T function: ModuleConfiguratorContext.() -> T
): T = function(ModuleBasedConfiguratorSettingsEnvironment(configurator, module)) ): T = function(ModuleBasedConfiguratorContext(configurator, module))
fun <V : Any, T : SettingType<V>> Reader.settingValue(module: Module, setting: ModuleConfiguratorSetting<V, T>): V? = fun <V : Any, T : SettingType<V>> Reader.settingValue(module: Module, setting: ModuleConfiguratorSetting<V, T>): V? =
withSettingsOf(module) { inContextOfModuleConfigurator(module) {
setting.reference.notRequiredSettingValue setting.reference.notRequiredSettingValue
} }
@@ -166,13 +176,47 @@ abstract class ModuleConfiguratorSettings : SettingsOwner {
enumSettingImpl(title, neededAtPhase, init) as ReadOnlyProperty<Any, ModuleConfiguratorSetting<E, DropDownSettingType<E>>> enumSettingImpl(title, neededAtPhase, init) as ReadOnlyProperty<Any, ModuleConfiguratorSetting<E, DropDownSettingType<E>>>
} }
interface ModuleConfiguratorWithProperties : ModuleConfigurator {
fun getConfiguratorProperties(): List<ModuleConfiguratorProperty<*>>
fun SettingsWriter.initDefaultValuesForProperties(module: Module) {
inContextOfModuleConfigurator(module) {
getConfiguratorProperties().forEach { property ->
property.reference.initDefaultValue(module)
}
}
}
}
interface ModuleConfiguratorProperties : PropertiesOwner {
override fun <T : Any> propertyDelegate(
create: (path: String) -> PropertyBuilder<T>,
): ReadOnlyProperty<Any, ModuleConfiguratorProperty<T>> =
cached { name -> ModuleConfiguratorProperty(create(name).build()) }
@Suppress("UNCHECKED_CAST")
override fun <T : Any> property(
defaultValue: T,
init: PropertyBuilder<T>.() -> Unit,
): ReadOnlyProperty<Any, ModuleConfiguratorProperty<T>> =
super.property(defaultValue, init) as ReadOnlyProperty<Any, ModuleConfiguratorProperty<T>>
@Suppress("UNCHECKED_CAST")
override fun <T : Any> listProperty(
vararg defaultValues: T,
init: PropertyBuilder<List<T>>.() -> Unit
): ReadOnlyProperty<Any, ModuleConfiguratorProperty<List<T>>> =
super.listProperty(defaultValues = defaultValues, init) as ReadOnlyProperty<Any, ModuleConfiguratorProperty<List<T>>>
}
interface ModuleConfiguratorWithSettings : ModuleConfigurator { interface ModuleConfiguratorWithSettings : ModuleConfigurator {
fun getConfiguratorSettings(): List<ModuleConfiguratorSetting<*, *>> = emptyList() fun getConfiguratorSettings(): List<ModuleConfiguratorSetting<*, *>> = emptyList()
fun getPluginSettings(): List<PluginSettingReference<Any, SettingType<Any>>> = emptyList() fun getPluginSettings(): List<PluginSettingReference<Any, SettingType<Any>>> = emptyList()
fun SettingsWriter.initDefaultValuesFor(module: Module) { fun SettingsWriter.initDefaultValuesFor(module: Module) {
withSettingsOf(module) { inContextOfModuleConfigurator(module) {
getConfiguratorSettings().forEach { setting -> getConfiguratorSettings().forEach { setting ->
setting.reference.setSettingValueToItsDefaultIfItIsNotSetValue() setting.reference.setSettingValueToItsDefaultIfItIsNotSetValue()
} }
@@ -180,7 +224,7 @@ interface ModuleConfiguratorWithSettings : ModuleConfigurator {
} }
fun <V : Any, T : SettingType<V>> Reader.settingsValue(module: Module, setting: ModuleConfiguratorSetting<V, T>): V = fun <V : Any, T : SettingType<V>> Reader.settingsValue(module: Module, setting: ModuleConfiguratorSetting<V, T>): V =
withSettingsOf(module) { setting.reference.settingValue } inContextOfModuleConfigurator(module) { setting.reference.settingValue }
} }
val ModuleConfigurator.settings val ModuleConfigurator.settings
@@ -285,7 +329,7 @@ interface ModuleConfigurator : DisplayableSettingItem, EntitiesOwnerDescriptor {
path, path,
map, map,
configurator.settings.map { setting -> configurator.settings.map { setting ->
val reference = withSettingsOf(moduleIdentificator, configurator) { setting.reference } val reference = inContextOfModuleConfigurator(moduleIdentificator, configurator) { setting.reference }
reference to setting reference to setting
} }
) )
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.core.Reader 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.entity.settings.SettingType
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
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.DependencyType import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.DependencyType
@@ -56,7 +55,7 @@ interface ModuleConfiguratorWithTests : ModuleConfiguratorWithSettings {
configurationData: ModulesToIrConversionData, configurationData: ModulesToIrConversionData,
module: Module module: Module
): List<BuildSystemIR> = ): List<BuildSystemIR> =
withSettingsOf(module) { inContextOfModuleConfigurator(module) {
reader { reader {
testFramework.reference.settingValue.dependencyNames.map { dependencyName -> testFramework.reference.settingValue.dependencyNames.map { dependencyName ->
KotlinArbitraryDependencyIR( KotlinArbitraryDependencyIR(
@@ -146,7 +146,7 @@ object JvmTargetConfigurator : JvmModuleConfigurator,
module: Module module: Module
): List<BuildSystemIR> = irsList { ): List<BuildSystemIR> = irsList {
reader { reader {
withSettingsOf(module) { inContextOfModuleConfigurator(module) {
val targetVersionValue = JvmModuleConfigurator.targetJvmVersion.reference.settingValue.value val targetVersionValue = JvmModuleConfigurator.targetJvmVersion.reference.settingValue.value
if (buildSystemType.isGradle) { if (buildSystemType.isGradle) {
"compilations.all" { "compilations.all" {
@@ -1,7 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import kotlinx.collections.immutable.toPersistentList
import org.jetbrains.annotations.NonNls import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.core.Reader import org.jetbrains.kotlin.tools.projectWizard.core.Reader
@@ -11,14 +10,10 @@ import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
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
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.* import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.DefaultTargetConfigurationIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetAccessIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.maven.MavenPropertyIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.maven.MavenPropertyIR
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.gradle.GradlePlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
@@ -115,7 +110,7 @@ object JvmSinglePlatformModuleConfigurator : JvmModuleConfigurator,
buildList { buildList {
+GradleImportIR("org.jetbrains.kotlin.gradle.tasks.KotlinCompile") +GradleImportIR("org.jetbrains.kotlin.gradle.tasks.KotlinCompile")
val targetVersionValue = withSettingsOf(module) { val targetVersionValue = inContextOfModuleConfigurator(module) {
reader { reader {
JvmModuleConfigurator.targetJvmVersion.reference.settingValue.value JvmModuleConfigurator.targetJvmVersion.reference.settingValue.value
} }
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask
import org.jetbrains.kotlin.tools.projectWizard.core.entity.Property import org.jetbrains.kotlin.tools.projectWizard.core.entity.properties.Property
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.AndroidModuleConfigurator import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.AndroidModuleConfigurator
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.tools.projectWizard.core.Plugin
import org.jetbrains.kotlin.tools.projectWizard.core.PluginSettingsOwner import org.jetbrains.kotlin.tools.projectWizard.core.PluginSettingsOwner
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.entity.PipelineTask import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask
import org.jetbrains.kotlin.tools.projectWizard.core.entity.Property import org.jetbrains.kotlin.tools.projectWizard.core.entity.properties.Property
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting
import org.jetbrains.kotlin.tools.projectWizard.core.service.RunConfigurationsService import org.jetbrains.kotlin.tools.projectWizard.core.service.RunConfigurationsService
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
@@ -4,7 +4,7 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask
import org.jetbrains.kotlin.tools.projectWizard.core.entity.Property import org.jetbrains.kotlin.tools.projectWizard.core.entity.properties.Property
import org.jetbrains.kotlin.tools.projectWizard.core.entity.StringValidators import org.jetbrains.kotlin.tools.projectWizard.core.entity.StringValidators
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.settings.PluginSetting import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting
@@ -6,7 +6,7 @@ import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask
import org.jetbrains.kotlin.tools.projectWizard.core.entity.Property import org.jetbrains.kotlin.tools.projectWizard.core.entity.properties.Property
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.settings.PluginSetting import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting
import org.jetbrains.kotlin.tools.projectWizard.core.service.BuildSystemAvailabilityWizardService import org.jetbrains.kotlin.tools.projectWizard.core.service.BuildSystemAvailabilityWizardService
@@ -4,7 +4,7 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.gradle
import org.jetbrains.kotlin.tools.projectWizard.Versions import org.jetbrains.kotlin.tools.projectWizard.Versions
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask
import org.jetbrains.kotlin.tools.projectWizard.core.entity.Property import org.jetbrains.kotlin.tools.projectWizard.core.entity.properties.Property
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting
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.BuildSystemIR
@@ -4,6 +4,7 @@ import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.Versions import org.jetbrains.kotlin.tools.projectWizard.Versions
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.entity.properties.Property
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting
import org.jetbrains.kotlin.tools.projectWizard.core.service.* import org.jetbrains.kotlin.tools.projectWizard.core.service.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildFileIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildFileIR
@@ -3,7 +3,7 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins.projectTemplates
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask
import org.jetbrains.kotlin.tools.projectWizard.core.entity.Property import org.jetbrains.kotlin.tools.projectWizard.core.entity.properties.Property
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
@@ -4,7 +4,7 @@ import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.Plugin import org.jetbrains.kotlin.tools.projectWizard.core.Plugin
import org.jetbrains.kotlin.tools.projectWizard.core.PluginSettingsOwner import org.jetbrains.kotlin.tools.projectWizard.core.PluginSettingsOwner
import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask
import org.jetbrains.kotlin.tools.projectWizard.core.entity.Property import org.jetbrains.kotlin.tools.projectWizard.core.entity.properties.Property
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.templates.Template import org.jetbrains.kotlin.tools.projectWizard.templates.Template
@@ -4,7 +4,7 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins.templates
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.Defaults.SRC_DIR import org.jetbrains.kotlin.tools.projectWizard.core.Defaults.SRC_DIR
import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask
import org.jetbrains.kotlin.tools.projectWizard.core.entity.Property import org.jetbrains.kotlin.tools.projectWizard.core.entity.properties.Property
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting
import org.jetbrains.kotlin.tools.projectWizard.core.service.TemplateEngineService import org.jetbrains.kotlin.tools.projectWizard.core.service.TemplateEngineService
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.* import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
@@ -103,7 +103,7 @@ class TemplateSettingsBuilder<Q : Template>(
class ConfiguratorSettingsBuilder<C : ModuleConfigurator>( class ConfiguratorSettingsBuilder<C : ModuleConfigurator>(
val module: Module, val module: Module,
val configurator: C val configurator: C
) : ModuleConfiguratorSettingsEnvironment by ModuleBasedConfiguratorSettingsEnvironment(configurator, module) { ) : ModuleConfiguratorContext by ModuleBasedConfiguratorContext(configurator, module) {
init { init {
assert(module.configurator === configurator) assert(module.configurator === configurator)
} }
@@ -76,6 +76,7 @@ class Module(
fun SettingsWriter.initDefaultValuesForSettings() { fun SettingsWriter.initDefaultValuesForSettings() {
configurator.safeAs<ModuleConfiguratorWithSettings>()?.apply { initDefaultValuesFor(this@Module) } configurator.safeAs<ModuleConfiguratorWithSettings>()?.apply { initDefaultValuesFor(this@Module) }
configurator.safeAs<ModuleConfiguratorWithProperties>()?.apply { initDefaultValuesForProperties(this@Module) }
template?.apply { initDefaultValuesFor(this@Module) } template?.apply { initDefaultValuesFor(this@Module) }
} }
@@ -114,7 +115,7 @@ class Module(
} }
val moduleConfiguratorValidator = settingValidator<Module> { module -> val moduleConfiguratorValidator = settingValidator<Module> { module ->
withSettingsOf(module) { inContextOfModuleConfigurator(module) {
allSettingsOfModuleConfigurator(module.configurator).map { setting -> allSettingsOfModuleConfigurator(module.configurator).map { setting ->
val reference = when (setting) { val reference = when (setting) {
is PluginSetting<Any, SettingType<Any>> -> setting.reference is PluginSetting<Any, SettingType<Any>> -> setting.reference
@@ -83,7 +83,7 @@ sealed class ModuleDependencyType(
to: Module, to: Module,
toModulePath: Path, toModulePath: Path,
data: ModulesToIrConversionData data: ModulesToIrConversionData
): TaskResult<Unit> = withSettingsOf(from) { ): TaskResult<Unit> = inContextOfModuleConfigurator(from) {
IOSSinglePlatformModuleConfigurator.dependentModule.reference IOSSinglePlatformModuleConfigurator.dependentModule.reference
.setValue(IOSSinglePlatformModuleConfigurator.DependentModuleReference(to)) .setValue(IOSSinglePlatformModuleConfigurator.DependentModuleReference(to))
val dummyFilePath = Defaults.SRC_DIR / "${to.iosTargetSafe()!!.name}Main" / to.configurator.kotlinDirectoryName / "dummyFile.kt" val dummyFilePath = Defaults.SRC_DIR / "${to.iosTargetSafe()!!.name}Main" / to.configurator.kotlinDirectoryName / "dummyFile.kt"
@@ -45,7 +45,7 @@ class SimpleJsClientTemplate : Template() {
JsBrowserTargetConfigurator -> true JsBrowserTargetConfigurator -> true
BrowserJsSinglePlatformModuleConfigurator -> { BrowserJsSinglePlatformModuleConfigurator -> {
with(reader) { with(reader) {
withSettingsOf(module, module.configurator) { inContextOfModuleConfigurator(module, module.configurator) {
JSConfigurator.kind.reference.notRequiredSettingValue == JsTargetKind.APPLICATION JSConfigurator.kind.reference.notRequiredSettingValue == JsTargetKind.APPLICATION
} }
} }