From 796848b5a9ce70964a8aafa7896ff7c1f5516a98 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 14 Jan 2020 16:24:26 +0300 Subject: [PATCH] Wizard: fix adding invalid dependencies for maven build files #KT-35711 fixed --- .../android/expected/android/build.gradle.kts | 3 +- .../buildFileGeneration/kotlinJvm/pom.xml | 2 +- .../ir/buildsystem/DependencyIR.kt | 42 ++++++++++---- ...AndroidSinglePlatformModuleConfigurator.kt | 5 +- .../moduleConfigurators/ModuleConfigurator.kt | 5 ++ .../plugins/kotlin/KotlinPlugin.kt | 28 ++-------- .../plugins/kotlin/ModuleType.kt | 10 ++-- .../plugins/kotlin/ModulesToIRsConverter.kt | 55 +++++++++++++------ .../templates/KotlinTestTemplate.kt | 7 +-- 9 files changed, 92 insertions(+), 65 deletions(-) diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/expected/android/build.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/expected/android/build.gradle.kts index 93c9f48437b..331b2e316f6 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/expected/android/build.gradle.kts +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/expected/android/build.gradle.kts @@ -15,9 +15,8 @@ repositories { dependencies { implementation("androidx.appcompat:appcompat:1.1.0") implementation("androidx.core:core-ktx:1.1.0") - implementation(kotlin("stdlib-jdk7")) implementation("androidx.constraintlayout:constraintlayout:1.1.3") - implementation(kotlin("stdlib-jdk8")) + implementation(kotlin("stdlib-jdk7")) } android { compileSdkVersion(29) diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/pom.xml b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/pom.xml index b062ec12db1..e35235005f5 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/pom.xml +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/pom.xml @@ -46,7 +46,7 @@ org.jetbrains.kotlin - kotlin-stdlib + kotlin-stdlib-jdk8 1.3.61 diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/DependencyIR.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/DependencyIR.kt index d1193cd0100..9ab8653d901 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/DependencyIR.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/DependencyIR.kt @@ -1,6 +1,5 @@ package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem -import org.jetbrains.kotlin.tools.projectWizard.core.safeAs import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.GradleIR import org.jetbrains.kotlin.tools.projectWizard.library.LibraryArtifact import org.jetbrains.kotlin.tools.projectWizard.library.MavenArtifact @@ -109,8 +108,8 @@ data class ArtifactBasedLibraryDependencyIR( } -data class KotlinLibraryDependencyIR( - val name: String, +abstract class KotlinLibraryDependencyIR( + val artifactName: String, override val version: Version, override val dependencyType: DependencyType ) : LibraryDependencyIR { @@ -118,22 +117,22 @@ data class KotlinLibraryDependencyIR( get() = MavenArtifact( MAVEN_CENTRAL, "org.jetbrains.kotlin", - "kotlin-$name" + "kotlin-$artifactName" ) - override fun withDependencyType(type: DependencyType): KotlinLibraryDependencyIR = - copy(dependencyType = type) - override fun BuildFilePrinter.render() { when (this) { is GradlePrinter -> call(dependencyType.gradleName) { +"kotlin(" - +name.quotified + +artifactName.quotified +")" } is MavenPrinter -> node("dependency") { singleLineNode("groupId") { +"org.jetbrains.kotlin" } - singleLineNode("artifactId") { +"kotlin-stdlib" } + singleLineNode("artifactId") { + +"kotlin-" + +artifactName + } singleLineNode("version") { +version.toString() } if (dependencyType == DependencyType.TEST) { singleLineNode("scope") { +"test" } @@ -143,5 +142,28 @@ data class KotlinLibraryDependencyIR( } } +data class KotlinStdlibDependencyIR( + val type: StdlibType, + override val version: Version, + override val dependencyType: DependencyType +) : KotlinLibraryDependencyIR(type.artifact, version, dependencyType) { + override fun withDependencyType(type: DependencyType): KotlinStdlibDependencyIR = copy(dependencyType = type) +} + +data class KotlinArbitraryDependencyIR( + val name: String, + override val version: Version, + override val dependencyType: DependencyType +) : KotlinLibraryDependencyIR(name, version, dependencyType) { + override fun withDependencyType(type: DependencyType): KotlinArbitraryDependencyIR = copy(dependencyType = type) +} + +enum class StdlibType(val artifact: String) { + StdlibJdk7("stdlib-jdk7"), + StdlibJdk8("stdlib-jdk8"), + StdlibJs("stdlib-js"), + StdlibCommon("stdlib-common"), +} + val LibraryDependencyIR.isKotlinStdlib - get() = safeAs()?.name?.contains("stdlib") == true \ No newline at end of file + get() = this is KotlinStdlibDependencyIR \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt index ee36b29acb8..953f47a76be 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt @@ -106,8 +106,6 @@ object AndroidSinglePlatformModuleConfigurator : ModuleConfiguratorWithSettings( dependencyType = DependencyType.MAIN ) - +KotlinLibraryDependencyIR("stdlib-jdk7", configurationData.kotlinVersion, DependencyType.MAIN) - +ArtifactBasedLibraryDependencyIR( MavenArtifact(DefaultRepository.GOOGLE, "androidx.constraintlayout", "constraintlayout"), version = Version.fromString("1.1.3"), @@ -115,6 +113,9 @@ object AndroidSinglePlatformModuleConfigurator : ModuleConfiguratorWithSettings( ) } + override fun createStdlibType(configurationData: ModuleConfigurationData, module: Module): StdlibType? = + StdlibType.StdlibJdk7 + override val settings: List> = listOf(androidSdkPath) diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfigurator.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfigurator.kt index bbf0a378140..7aa874ecc7e 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfigurator.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfigurator.kt @@ -7,9 +7,11 @@ import org.jetbrains.kotlin.tools.projectWizard.core.cached import org.jetbrains.kotlin.tools.projectWizard.core.entity.* 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.StdlibType import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleConfigurationData import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType +import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.correspondingStdlib import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.* import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version @@ -170,6 +172,9 @@ interface ModuleConfigurator : DisplayableSettingItem, EntitiesOwnerDescriptor { fun createModuleIRs(configurationData: ModuleConfigurationData, module: Module): List = emptyList() + fun createStdlibType(configurationData: ModuleConfigurationData, module: Module): StdlibType? = + moduleType.correspondingStdlib() + fun createRootBuildFileIrs(configurationData: ModuleConfigurationData): List = emptyList() fun createKotlinPluginIR(configurationData: ModuleConfigurationData, module: Module): KotlinBuildSystemPluginIR? = null diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt index b61989355a3..851d0c8aa59 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt @@ -51,30 +51,10 @@ class KotlinPlugin(context: Context) : Plugin(context) { runBefore(BuildSystemPlugin::createModules) runAfter(StructurePlugin::createProjectDir) withAction { - computeM { - BuildSystemPlugin::buildFiles.update { - val modules = KotlinPlugin::modules.settingValue - val (buildFiles) = createBuildFiles(modules) - buildFiles.map { it.withIrs(RepositoryIR(DefaultRepository.MAVEN_CENTRAL)) }.asSuccess() - }.ensure() - - updateModules { module -> - val needLibrary = when (module) { - is SingleplatformModuleIR -> true - is SourcesetModuleIR -> module.sourcesetType == SourcesetType.main - } - val libraryName = module.type.correspondingStdlibName() - when { - needLibrary && libraryName != null -> module.withIrs( - KotlinLibraryDependencyIR( - libraryName, - KotlinPlugin::version.settingValue, - DependencyType.MAIN - ) - ) - else -> module - }.asSuccess() - } + BuildSystemPlugin::buildFiles.update { + val modules = KotlinPlugin::modules.settingValue + val (buildFiles) = createBuildFiles(modules) + buildFiles.map { it.withIrs(RepositoryIR(DefaultRepository.MAVEN_CENTRAL)) }.asSuccess() } } } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModuleType.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModuleType.kt index ee4290e03c1..ce2544263ff 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModuleType.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModuleType.kt @@ -1,5 +1,7 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.StdlibType + @Suppress("EnumEntryName") enum class ModuleType(val projectTypeName: String) { jvm("Kotlin/JVM"), @@ -27,10 +29,10 @@ enum class ModuleSubType(val moduleType: ModuleType) { common(ModuleType.common) } -fun ModuleType.correspondingStdlibName() = when (this) { - ModuleType.jvm -> "stdlib-jdk8" - ModuleType.js -> "stdlib-js" +fun ModuleType.correspondingStdlib(): StdlibType? = when (this) { + ModuleType.jvm -> StdlibType.StdlibJdk8 + ModuleType.js -> StdlibType.StdlibJs ModuleType.native -> null - ModuleType.common -> "stdlib-common" + ModuleType.common -> StdlibType.StdlibCommon } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt index 263b8621284..90d4212ebed 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt @@ -98,9 +98,17 @@ class ModulesToIRsConverter( val modulePath = calculatePathForModule(module, state.parentPath) taskRunningContext.mutateProjectStructureByModuleConfigurator(module, modulePath) val configurator = module.configurator - val dependenciesIRs = module.sourcesets.flatMap { sourceset -> - sourceset.dependencies.map { it.toIR(sourceset.sourcesetType.toDependencyType()) } - } + configurator.createModuleIRs(data, module) + val dependenciesIRs = buildList { + +module.sourcesets.flatMap { sourceset -> + sourceset.dependencies.map { it.toIR(sourceset.sourcesetType.toDependencyType()) } + } + +configurator.createModuleIRs(data, module) + addIfNotNull( + configurator.createStdlibType(data, module)?.let { stdlibType -> + KotlinStdlibDependencyIR(stdlibType, kotlinVersion, DependencyType.MAIN) + } + ) + } val moduleIr = SingleplatformModuleIR( module.name, @@ -146,19 +154,8 @@ class ModulesToIRsConverter( (subModule.configurator as TargetConfigurator).createTargetIrs(subModule) } - val sourcesetIrs = module.subModules.flatMap { target -> - target.sourcesets.map { sourceset -> - val sourcesetName = target.name + sourceset.sourcesetType.name.capitalize() - SourcesetModuleIR( - sourcesetName, - modulePath / Defaults.SRC_DIR / sourcesetName, - sourceset.dependencies.map { it.toIR(DependencyType.MAIN) }, - sourceset.containingModuleType, - sourceset.sourcesetType, - sourceset.template, - sourceset - ) - } + val sourcesetsIrs = module.subModules.flatMap { target -> + createTargetSourceset(target, modulePath) } return BuildFileIR( @@ -166,7 +163,7 @@ class ModulesToIRsConverter( modulePath, MultiplatformModulesStructureIR( targetIrs, - sourcesetIrs, + sourcesetsIrs, emptyList() ), pomIr, @@ -174,6 +171,30 @@ class ModulesToIRsConverter( ).asSingletonList().asSuccess() } + private fun createTargetSourceset(target: Module, modulePath: Path): List = + target.sourcesets.map { sourceset -> + val sourcesetName = target.name + sourceset.sourcesetType.name.capitalize() + val sourcesetIrs = buildList { + +sourceset.dependencies.map { it.toIR(sourceset.sourcesetType.toDependencyType()) } + if (sourceset.sourcesetType == SourcesetType.main) { + addIfNotNull( + target.configurator.createStdlibType(data, target)?.let { stdlibType -> + KotlinStdlibDependencyIR(stdlibType, data.kotlinVersion, DependencyType.MAIN) + } + ) + } + } + SourcesetModuleIR( + sourcesetName, + modulePath / Defaults.SRC_DIR / sourcesetName, + sourcesetIrs, + sourceset.containingModuleType, + sourceset.sourcesetType, + sourceset.template, + sourceset + ) + } + private fun TaskRunningContext.mutateProjectStructureByModuleConfigurator( module: Module, modulePath: Path diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/KotlinTestTemplate.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/KotlinTestTemplate.kt index 9d4f678e0f8..b85e3e47a9a 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/KotlinTestTemplate.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/KotlinTestTemplate.kt @@ -6,10 +6,7 @@ import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.TaskRunningContext import org.jetbrains.kotlin.tools.projectWizard.core.entity.TemplateSetting import org.jetbrains.kotlin.tools.projectWizard.core.entity.TemplateSettingReference -import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.DependencyIR -import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.DependencyType -import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.KotlinLibraryDependencyIR -import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.SourcesetIR +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.* import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType @@ -30,7 +27,7 @@ class KotlinTestTemplate : Template() { override fun TaskRunningContext.getRequiredLibraries(sourceset: SourcesetIR): List = withSettingsOf(sourceset.original) { framework.reference.settingValue.dependencyNames.map { dependencyName -> - KotlinLibraryDependencyIR( + KotlinArbitraryDependencyIR( dependencyName, version = KotlinPlugin::version.settingValue, dependencyType = DependencyType.MAIN