From 82a40e33949bd20a0be4d21e9f9d722b21effe7d Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 6 Apr 2020 16:26:17 +0300 Subject: [PATCH] Wizard: fix invalid repository when downloading jars for JPS #KT-37956 fixed --- .../wizard/service/IdeaJpsWizardService.kt | 66 ++++++++++++++----- .../android/expected/settings.gradle | 1 + .../android/expected/settings.gradle.kts | 1 + .../expected/settings.gradle | 1 + .../expected/settings.gradle.kts | 1 + .../expected/settings.gradle | 1 + .../expected/settings.gradle.kts | 1 + .../service/KotlinVersionProviderService.kt | 10 ++- .../ir/buildsystem/DependencyIR.kt | 4 +- .../plugins/kotlin/KotlinPlugin.kt | 9 +-- 10 files changed, 69 insertions(+), 26 deletions(-) diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaJpsWizardService.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaJpsWizardService.kt index e997386a65d..09f8eea9839 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaJpsWizardService.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaJpsWizardService.kt @@ -9,10 +9,12 @@ import com.intellij.codeInsight.daemon.impl.quickfix.OrderEntryFix import com.intellij.ide.impl.NewProjectUtil import com.intellij.ide.util.projectWizard.ModuleBuilder import com.intellij.jarRepository.JarRepositoryManager +import com.intellij.jarRepository.RemoteRepositoryDescription import com.intellij.openapi.module.ModifiableModuleModel import com.intellij.openapi.module.ModuleTypeId import com.intellij.openapi.project.Project import com.intellij.openapi.roots.* +import com.intellij.openapi.roots.libraries.ui.OrderRoot import com.intellij.openapi.vfs.VfsUtil import com.intellij.util.PathUtil import org.jetbrains.idea.maven.utils.library.RepositoryLibraryProperties @@ -30,6 +32,7 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetTy import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeWizard import org.jetbrains.kotlin.tools.projectWizard.wizard.NewProjectWizardModuleBuilder import org.jetbrains.kotlin.idea.framework.KotlinSdkType +import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repository import java.nio.file.Path import java.util.* import com.intellij.openapi.module.Module as IdeaModule @@ -147,18 +150,13 @@ private class ProjectImporter( module: IdeaModule ) { val artifact = libraryDependency.artifact as? MavenArtifact ?: return - val libraryProperties = RepositoryLibraryProperties( - artifact.groupId, - artifact.artifactId, - libraryDependency.version.toString() - ) - val classesRoots = downloadLibraryAndGetItsClasses(libraryProperties) + val (classesRoots, sourcesRoots) = downloadLibraryAndGetItsClasses(libraryDependency, artifact) ModuleRootModificationUtil.addModuleLibrary( module, - if (classesRoots.size > 1) libraryProperties.artifactId else null, - OrderEntryFix.refreshAndConvertToUrls(classesRoots), - emptyList(), + if (classesRoots.size > 1) artifact.artifactId else null, + classesRoots, + sourcesRoots, when (libraryDependency.dependencyType) { DependencyType.MAIN -> DependencyScope.COMPILE DependencyType.TEST -> DependencyScope.TEST @@ -166,18 +164,50 @@ private class ProjectImporter( ) } - private fun downloadLibraryAndGetItsClasses(libraryProperties: RepositoryLibraryProperties) = - JarRepositoryManager.loadDependenciesModal( + private fun downloadLibraryAndGetItsClasses( + libraryDependency: LibraryDependencyIR, + artifact: MavenArtifact + ): LibraryClassesAndSources { + val libraryProperties = RepositoryLibraryProperties( + artifact.groupId, + artifact.artifactId, + libraryDependency.version.toString() + ) + val orderRoots = JarRepositoryManager.loadDependenciesModal( project, libraryProperties, - false, - false, + true, + true, librariesPath.toString(), - null - ).asSequence() - .filter { it.type == OrderRootType.CLASSES } - .map { PathUtil.getLocalPath(it.file) } - .toList() + listOf(artifact.repository.asJPSRepository()) + ) + + return LibraryClassesAndSources.fromOrderRoots(orderRoots) + } + + private fun Repository.asJPSRepository() = RemoteRepositoryDescription( + idForMaven, + idForMaven, + url + ) + + private data class LibraryClassesAndSources( + val classes: List, + val sources: List + ) { + companion object { + fun fromOrderRoots(orderRoots: Collection) = LibraryClassesAndSources( + orderRoots.filterRootTypes(OrderRootType.CLASSES), + orderRoots.filterRootTypes(OrderRootType.SOURCES) + ) + + private fun Collection.filterRootTypes(rootType: OrderRootType) = + filter { it.type == rootType } + .mapNotNull { PathUtil.getLocalPath(it.file) } + .let(OrderEntryFix::refreshAndConvertToUrls) + + } + } } private val Path.url diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/expected/settings.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/expected/settings.gradle index 70b1d122d19..0da50d861fa 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/expected/settings.gradle +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/expected/settings.gradle @@ -3,6 +3,7 @@ pluginManagement { gradlePluginPortal() google() jcenter() + mavenCentral() } resolutionStrategy { eachPlugin { diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/expected/settings.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/expected/settings.gradle.kts index 02dcc260a8b..45d181d12c7 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/expected/settings.gradle.kts +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/android/expected/settings.gradle.kts @@ -3,6 +3,7 @@ pluginManagement { gradlePluginPortal() google() jcenter() + mavenCentral() } resolutionStrategy { eachPlugin { diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/mppMobileApplication/expected/settings.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/mppMobileApplication/expected/settings.gradle index 514e881c994..96e604b340a 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/mppMobileApplication/expected/settings.gradle +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/mppMobileApplication/expected/settings.gradle @@ -3,6 +3,7 @@ pluginManagement { gradlePluginPortal() google() jcenter() + mavenCentral() } resolutionStrategy { eachPlugin { diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/mppMobileApplication/expected/settings.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/mppMobileApplication/expected/settings.gradle.kts index 31cf256bad6..0bb95ab4330 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/mppMobileApplication/expected/settings.gradle.kts +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/mppMobileApplication/expected/settings.gradle.kts @@ -3,6 +3,7 @@ pluginManagement { gradlePluginPortal() google() jcenter() + mavenCentral() } resolutionStrategy { eachPlugin { diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/expected/settings.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/expected/settings.gradle index 663e9016f42..8972d257daf 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/expected/settings.gradle +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/expected/settings.gradle @@ -3,6 +3,7 @@ pluginManagement { gradlePluginPortal() google() jcenter() + mavenCentral() } resolutionStrategy { eachPlugin { diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/expected/settings.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/expected/settings.gradle.kts index 08495936547..ff45fdbde97 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/expected/settings.gradle.kts +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileLibrary/expected/settings.gradle.kts @@ -3,6 +3,7 @@ pluginManagement { gradlePluginPortal() google() jcenter() + mavenCentral() } resolutionStrategy { eachPlugin { diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/KotlinVersionProviderService.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/KotlinVersionProviderService.kt index fe0cf394a6c..7739fb33c40 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/KotlinVersionProviderService.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/KotlinVersionProviderService.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.tools.projectWizard.core.service import org.jetbrains.kotlin.tools.projectWizard.Versions +import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.DefaultRepository import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repositories import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repository import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version @@ -27,9 +28,12 @@ val Version.kotlinVersionKind else -> KotlinVersionKind.STABLE } -enum class KotlinVersionKind(val repository: Repository?) { - STABLE(repository = null), +enum class KotlinVersionKind(val repository: Repository) { + STABLE(repository = DefaultRepository.MAVEN_CENTRAL), EAP(repository = Repositories.KOTLIN_EAP_BINTRAY), DEV(repository = Repositories.KOTLIN_DEV_BINTRAY), M(repository = Repositories.KOTLIN_EAP_BINTRAY) -} \ No newline at end of file +} + +val KotlinVersionKind.isStable + get() = this == KotlinVersionKind.STABLE \ No newline at end of file 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 cc1a5ec98fb..37e81db1129 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,5 +1,6 @@ package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem +import org.jetbrains.kotlin.tools.projectWizard.core.service.kotlinVersionKind 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 @@ -9,6 +10,7 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.MavenPrinter import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.DefaultRepository.Companion.MAVEN_CENTRAL import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModulePath +import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repository import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version @@ -117,7 +119,7 @@ abstract class KotlinLibraryDependencyIR( override val artifact: LibraryArtifact get() = MavenArtifact( - MAVEN_CENTRAL, + version.kotlinVersionKind.repository, "org.jetbrains.kotlin", "kotlin-$artifactName" ) 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 0f2c7f59736..32d0fc04705 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 @@ -6,9 +6,7 @@ import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult import org.jetbrains.kotlin.tools.projectWizard.core.entity.fold import org.jetbrains.kotlin.tools.projectWizard.core.entity.settingValidator -import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService -import org.jetbrains.kotlin.tools.projectWizard.core.service.KotlinVersionProviderService -import org.jetbrains.kotlin.tools.projectWizard.core.service.kotlinVersionKind +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.RepositoryIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.withIrs @@ -94,7 +92,10 @@ class KotlinPlugin(context: Context) : Plugin(context) { val createPluginRepositories by pipelineTask(GenerationPhase.PROJECT_GENERATION) { runBefore(BuildSystemPlugin::createModules) withAction { - val pluginRepository = KotlinPlugin::version.propertyValue.kotlinVersionKind.repository ?: return@withAction UNIT_SUCCESS + val pluginRepository = KotlinPlugin::version.propertyValue.kotlinVersionKind + .takeUnless(KotlinVersionKind::isStable) + ?.repository + ?: return@withAction UNIT_SUCCESS BuildSystemPlugin::pluginRepositoreis.addValues(pluginRepository) andThen updateBuildFiles { buildFile -> buildFile.withIrs(RepositoryIR(pluginRepository)).asSuccess()