Wizard: use kotlinx-collections-immutable for storing IRs

This commit is contained in:
Ilya Kirillov
2020-02-27 19:34:45 +03:00
parent e38448c6f2
commit d639816393
13 changed files with 64 additions and 43 deletions
@@ -9,6 +9,7 @@ dependencies {
testImplementation(project(":kotlin-test:kotlin-test-junit"))
testImplementation(commonDep("junit:junit"))
implementation("org.jetbrains.kotlinx:kotlinx-collections-immutable:0.2")
}
sourceSets {
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.core
import kotlinx.collections.immutable.toPersistentList
import java.io.IOException
import java.nio.file.Path
import java.nio.file.Paths
@@ -95,6 +96,9 @@ class ListBuilder<T> {
fun <T> buildList(builder: ListBuilder<T>.() -> Unit) =
ListBuilder<T>().apply(builder).build()
fun <T> buildPersistenceList(builder: ListBuilder<T>.() -> Unit) =
buildList(builder).toPersistentList()
object RandomIdGenerator {
private val chars = ('a'..'z') + ('A'..'Z') + ('0'..'9')
private const val idLength = 8
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem
import kotlinx.collections.immutable.PersistentList
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.*
@@ -21,9 +22,9 @@ data class BuildFileIR(
val directoryPath: Path,
val modules: ModulesStructureIR,
val pom: PomIR,
override val irs: List<BuildSystemIR>
override val irs: PersistentList<BuildSystemIR>
) : FileIR {
override fun withReplacedIrs(irs: List<BuildSystemIR>): BuildFileIR = copy(irs = irs)
override fun withReplacedIrs(irs: PersistentList<BuildSystemIR>): BuildFileIR = copy(irs = irs)
@Suppress("UNCHECKED_CAST")
fun withModulesUpdated(updater: (ModuleIR) -> TaskResult<ModuleIR>): TaskResult<BuildFileIR> =
@@ -139,12 +140,12 @@ sealed class ModulesStructureIR : BuildSystemIR, IrsOwner {
data class MultiplatformModulesStructureIR(
val targets: List<BuildSystemIR>,
override val modules: List<MultiplatformModuleIR>,
override val irs: List<BuildSystemIR>
override val irs: PersistentList<BuildSystemIR>
) : GradleIR, ModulesStructureIR() {
@Suppress("UNCHECKED_CAST")
override fun withModules(modules: List<ModuleIR>) = copy(modules = modules as List<MultiplatformModuleIR>)
override fun withReplacedIrs(irs: List<BuildSystemIR>): MultiplatformModulesStructureIR = copy(irs = irs)
override fun withReplacedIrs(irs: PersistentList<BuildSystemIR>): MultiplatformModulesStructureIR = copy(irs = irs)
override fun GradlePrinter.renderGradle() {
sectionCall("kotlin") {
@@ -173,10 +174,10 @@ fun MultiplatformModulesStructureIR.updateTargets(
data class SingleplatformModulesStructureWithSingleModuleIR(
val module: SingleplatformModuleIR,
override val irs: List<BuildSystemIR>
override val irs: PersistentList<BuildSystemIR>
) : ModulesStructureIR() {
override val modules: List<SingleplatformModuleIR> = listOf(module)
override fun withReplacedIrs(irs: List<BuildSystemIR>): SingleplatformModulesStructureWithSingleModuleIR =
override fun withReplacedIrs(irs: PersistentList<BuildSystemIR>): SingleplatformModulesStructureWithSingleModuleIR =
copy(irs = irs)
@Suppress("UNCHECKED_CAST")
@@ -188,10 +189,10 @@ data class SingleplatformModulesStructureWithSingleModuleIR(
}
}
data class RootFileModuleStructureIR(override val irs: List<BuildSystemIR>) : ModulesStructureIR() {
data class RootFileModuleStructureIR(override val irs: PersistentList<BuildSystemIR>) : ModulesStructureIR() {
override val modules = emptyList<ModuleIR>()
override fun withReplacedIrs(irs: List<BuildSystemIR>): RootFileModuleStructureIR = copy(irs = irs)
override fun withReplacedIrs(irs: PersistentList<BuildSystemIR>): RootFileModuleStructureIR = copy(irs = irs)
override fun BuildFilePrinter.render() = when (this) {
is MavenPrinter -> {
@@ -1,13 +1,15 @@
package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem
import kotlinx.collections.immutable.*
interface IrsOwner {
val irs: List<BuildSystemIR>
fun withReplacedIrs(irs: List<BuildSystemIR>): IrsOwner
val irs: PersistentList<BuildSystemIR>
fun withReplacedIrs(irs: PersistentList<BuildSystemIR>): IrsOwner
}
@Suppress("UNCHECKED_CAST")
fun <I : IrsOwner> I.withIrs(irs: List<BuildSystemIR>) = withReplacedIrs(irs = this.irs + irs) as I
fun <I : IrsOwner> I.withIrs(irs: List<BuildSystemIR>) = withReplacedIrs(irs = this.irs + irs.toPersistentList()) as I
@Suppress("UNCHECKED_CAST")
fun <I : IrsOwner> I.withIrs(vararg irs: BuildSystemIR) = withReplacedIrs(irs = this.irs + irs) as I
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem
import kotlinx.collections.immutable.PersistentList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.GradleIR
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.BuildFilePrinter
@@ -24,12 +25,12 @@ sealed class ModuleIR : IrsOwner, BuildSystemIR {
data class SingleplatformModuleIR(
override val name: String,
override val path: Path,
override val irs: List<BuildSystemIR>,
override val irs: PersistentList<BuildSystemIR>,
override val template: Template?,
override val originalModule: Module,
override val sourcesets: List<SingleplatformSourcesetIR>
) : ModuleIR() {
override fun withReplacedIrs(irs: List<BuildSystemIR>): SingleplatformModuleIR = copy(irs = irs)
override fun withReplacedIrs(irs: PersistentList<BuildSystemIR>): SingleplatformModuleIR = copy(irs = irs)
override fun BuildFilePrinter.render() = when (this) {
is GradlePrinter -> {
@@ -49,12 +50,12 @@ data class SingleplatformModuleIR(
data class MultiplatformModuleIR(
override val name: String,
override val path: Path,
override val irs: List<BuildSystemIR>,
override val irs: PersistentList<BuildSystemIR>,
override val template: Template?,
override val originalModule: Module,
override val sourcesets: List<MultiplatformSourcesetIR>
) : GradleIR, ModuleIR() {
override fun withReplacedIrs(irs: List<BuildSystemIR>): MultiplatformModuleIR = copy(irs = irs)
override fun withReplacedIrs(irs: PersistentList<BuildSystemIR>): MultiplatformModuleIR = copy(irs = irs)
override fun GradlePrinter.renderGradle() {
sourcesets.map { sourceset ->
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem
import kotlinx.collections.immutable.PersistentList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.GradleIR
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.BuildFilePrinter
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
@@ -22,10 +23,10 @@ sealed class SourcesetIR : BuildSystemIR {
data class SingleplatformSourcesetIR(
override val sourcesetType: SourcesetType,
override val path: Path,
override val irs: List<BuildSystemIR>,
override val irs: PersistentList<BuildSystemIR>,
override val original: Sourceset
) : SourcesetIR(), IrsOwner {
override fun withReplacedIrs(irs: List<BuildSystemIR>): SingleplatformSourcesetIR = copy(irs = irs)
override fun withReplacedIrs(irs: PersistentList<BuildSystemIR>): SingleplatformSourcesetIR = copy(irs = irs)
override fun BuildFilePrinter.render() = Unit
}
@@ -33,10 +34,10 @@ data class MultiplatformSourcesetIR(
override val sourcesetType: SourcesetType,
override val path: Path,
val targetName: String,
override val irs: List<BuildSystemIR>,
override val irs: PersistentList<BuildSystemIR>,
override val original: Sourceset
) : SourcesetIR(), IrsOwner, GradleIR {
override fun withReplacedIrs(irs: List<BuildSystemIR>): MultiplatformSourcesetIR = copy(irs = irs)
override fun withReplacedIrs(irs: PersistentList<BuildSystemIR>): MultiplatformSourcesetIR = copy(irs = irs)
override fun GradlePrinter.renderGradle() = getting(sourcesetName, prefix = null) {
val dependencies = irsOfType<DependencyIR>()
@@ -5,15 +5,16 @@
package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle
import kotlinx.collections.immutable.PersistentList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
data class SettingsGradleFileIR(
val projectName: String,
val subProjects: List<String>,
override val irs: List<BuildSystemIR>
override val irs: PersistentList<BuildSystemIR>
) : FileIR, GradleIR {
override fun withReplacedIrs(irs: List<BuildSystemIR>): SettingsGradleFileIR = copy(irs = irs)
override fun withReplacedIrs(irs: PersistentList<BuildSystemIR>): SettingsGradleFileIR = copy(irs = irs)
override fun GradlePrinter.renderGradle() {
irsOfTypeOrNull<PluginManagementIR>()?.let { pluginManagementIrs ->
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform
import kotlinx.collections.immutable.PersistentList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.IrsOwner
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.KotlinIR
@@ -37,12 +38,12 @@ fun TargetConfigurationIR.addWithJavaIntoJvmTarget() = when {
data class DefaultTargetConfigurationIR(
val targetAccess: TargetAccessIR,
override val irs: List<BuildSystemIR>
override val irs: PersistentList<BuildSystemIR>
) : TargetConfigurationIR {
override val targetName: String
get() = targetAccess.nonDefaultName ?: targetAccess.type.name
override fun withReplacedIrs(irs: List<BuildSystemIR>): DefaultTargetConfigurationIR =
override fun withReplacedIrs(irs: PersistentList<BuildSystemIR>): DefaultTargetConfigurationIR =
copy(irs = irs)
override fun GradlePrinter.renderGradle() {
@@ -59,9 +60,9 @@ data class DefaultTargetConfigurationIR(
data class NonDefaultTargetConfigurationIR(
val variableName: String,
override val targetName: String,
override val irs: List<BuildSystemIR>
override val irs: PersistentList<BuildSystemIR>
) : TargetConfigurationIR {
override fun withReplacedIrs(irs: List<BuildSystemIR>): NonDefaultTargetConfigurationIR =
override fun withReplacedIrs(irs: PersistentList<BuildSystemIR>): NonDefaultTargetConfigurationIR =
copy(irs = irs)
override fun GradlePrinter.renderGradle() {
@@ -78,9 +79,9 @@ data class NonDefaultTargetConfigurationIR(
data class CompilationIR(
val name: String,
override val irs: List<BuildSystemIR>
override val irs: PersistentList<BuildSystemIR>
) : MultiplatformIR, IrsOwner {
override fun withReplacedIrs(irs: List<BuildSystemIR>) = copy(irs = irs)
override fun withReplacedIrs(irs: PersistentList<BuildSystemIR>) = copy(irs = irs)
override fun GradlePrinter.renderGradle() {
getting(name, "compilations") { irs.listNl() }
}
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import kotlinx.collections.immutable.toPersistentList
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
@@ -69,7 +70,7 @@ object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenc
+NonDefaultTargetConfigurationIR(
variableName = variableName,
targetName = moduleName,
irs = createInnerTargetIrs(module)
irs = createInnerTargetIrs(module).toPersistentList()
)
}
}
@@ -1,7 +1,9 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import kotlinx.collections.immutable.toPersistentList
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.core.buildPersistenceList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.DefaultTargetConfigurationIR
@@ -41,7 +43,7 @@ interface SimpleTargetConfigurator : TargetConfigurator {
override fun ReadingContext.createTargetIrs(module: Module): List<BuildSystemIR> = buildList {
+DefaultTargetConfigurationIR(
module.createTargetAccessIr(moduleSubType),
createInnerTargetIrs(module)
createInnerTargetIrs(module).toPersistentList()
)
}
}
@@ -65,7 +67,7 @@ object JsBrowserTargetConfigurator : JsTargetConfigurator, ModuleConfiguratorWit
override fun ReadingContext.createTargetIrs(module: Module): List<BuildSystemIR> = buildList {
+DefaultTargetConfigurationIR(
module.createTargetAccessIr(ModuleSubType.js),
buildList {
buildPersistenceList {
+RawGradleIR {
sectionCall("browser") {}
}
@@ -83,7 +85,7 @@ object JsNodeTargetConfigurator : JsTargetConfigurator {
override fun ReadingContext.createTargetIrs(module: Module): List<BuildSystemIR> = buildList {
+DefaultTargetConfigurationIR(
module.createTargetAccessIr(ModuleSubType.js),
buildList {
buildPersistenceList {
+RawGradleIR {
sectionCall("nodejs") {}
}
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins
import kotlinx.collections.immutable.persistentListOf
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.JpsPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.MavenPlugin
@@ -11,7 +12,7 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.*
object Plugins {
val allPlugins = { context: Context ->
listOf(
persistentListOf(
StructurePlugin(context),
GroovyDslPlugin(context),
@@ -126,7 +126,10 @@ abstract class GradlePlugin(context: Context) : BuildSystemPlugin(context) {
val settingsGradleIR = SettingsGradleFileIR(
StructurePlugin::name.settingValue,
allModulesPaths.map { path -> path.joinToString(separator = "") { ":$it" } },
repositories + GradlePlugin::settingsGradleFileIRs.propertyValue
buildPersistenceList {
+repositories
+GradlePlugin::settingsGradleFileIRs.propertyValue
}
)
val buildFileText = createBuildFile().printBuildFile { settingsGradleIR.render(this) }
service<FileSystemWizardService>().createFile(
@@ -1,5 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toPersistentList
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.*
@@ -79,9 +81,9 @@ class ModulesToIRsConverter(
BuildFileIR(
projectName,
projectPath,
RootFileModuleStructureIR(emptyList()),
RootFileModuleStructureIR(persistentListOf()),
pomIr,
rootBuildFileIrs
rootBuildFileIrs.toPersistentList()
)
}
@@ -102,7 +104,7 @@ class ModulesToIRsConverter(
val modulePath = calculatePathForModule(module, state.parentPath)
writingContext.mutateProjectStructureByModuleConfigurator(module, modulePath)
val configurator = module.configurator
val dependenciesIRs = buildList<BuildSystemIR> {
val dependenciesIRs = buildPersistenceList<BuildSystemIR> {
+module.sourcesets.flatMap { sourceset ->
sourceset.dependencies.map { it.toIR(sourceset.sourcesetType.toDependencyType()) }
}
@@ -129,7 +131,7 @@ class ModulesToIRsConverter(
SingleplatformSourcesetIR(
sourceset.sourcesetType,
modulePath / Defaults.SRC_DIR / sourceset.sourcesetType.name,
sourceset.dependencies.map { it.toIR(sourceset.sourcesetType.toDependencyType()) },
sourceset.dependencies.map { it.toIR(sourceset.sourcesetType.toDependencyType()) }.toPersistentList(),
sourceset
)
}
@@ -139,7 +141,7 @@ class ModulesToIRsConverter(
modulePath,
SingleplatformModulesStructureWithSingleModuleIR(
moduleIr,
emptyList()
persistentListOf()
),
pomIr.copy(artifactId = module.name),
createBuildFileIRs(module, state)
@@ -173,10 +175,10 @@ class ModulesToIRsConverter(
MultiplatformModulesStructureIR(
targetIrs,
targetModuleIrs,
emptyList()
persistentListOf()
),
pomIr,
buildList {
buildPersistenceList {
+createBuildFileIRs(module, state)
module.subModules.forEach { +createBuildFileIRs(it, state) }
}
@@ -206,14 +208,14 @@ class ModulesToIRsConverter(
sourceset.sourcesetType,
modulePath / Defaults.SRC_DIR / sourcesetName,
target.name,
sourcesetIrs,
sourcesetIrs.toPersistentList(),
sourceset
)
}
return MultiplatformModuleIR(
target.name,
modulePath,
with(target.configurator) { createModuleIRs(this@createTargetModule, data, target) },
with(target.configurator) { createModuleIRs(this@createTargetModule, data, target) }.toPersistentList(),
target.template,
target,
sourcesetss
@@ -236,7 +238,7 @@ class ModulesToIRsConverter(
private fun ReadingContext.createBuildFileIRs(
module: Module,
state: ModulesToIrsState
) = buildList<BuildSystemIR> {
) = buildPersistenceList<BuildSystemIR> {
val kotlinPlugin = module.configurator.createKotlinPluginIR(data, module)
?.let { plugin ->
// do not print version for non-root modules for gradle