Wizard: fix invalid repository when downloading jars for JPS

#KT-37956 fixed
This commit is contained in:
Ilya Kirillov
2020-04-06 16:26:17 +03:00
parent 5f917827b5
commit 82a40e3394
10 changed files with 69 additions and 26 deletions
@@ -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<String>,
val sources: List<String>
) {
companion object {
fun fromOrderRoots(orderRoots: Collection<OrderRoot>) = LibraryClassesAndSources(
orderRoots.filterRootTypes(OrderRootType.CLASSES),
orderRoots.filterRootTypes(OrderRootType.SOURCES)
)
private fun Collection<OrderRoot>.filterRootTypes(rootType: OrderRootType) =
filter { it.type == rootType }
.mapNotNull { PathUtil.getLocalPath(it.file) }
.let(OrderEntryFix::refreshAndConvertToUrls)
}
}
}
private val Path.url
@@ -3,6 +3,7 @@ pluginManagement {
gradlePluginPortal()
google()
jcenter()
mavenCentral()
}
resolutionStrategy {
eachPlugin {
@@ -3,6 +3,7 @@ pluginManagement {
gradlePluginPortal()
google()
jcenter()
mavenCentral()
}
resolutionStrategy {
eachPlugin {
@@ -3,6 +3,7 @@ pluginManagement {
gradlePluginPortal()
google()
jcenter()
mavenCentral()
}
resolutionStrategy {
eachPlugin {
@@ -3,6 +3,7 @@ pluginManagement {
gradlePluginPortal()
google()
jcenter()
mavenCentral()
}
resolutionStrategy {
eachPlugin {
@@ -3,6 +3,7 @@ pluginManagement {
gradlePluginPortal()
google()
jcenter()
mavenCentral()
}
resolutionStrategy {
eachPlugin {
@@ -3,6 +3,7 @@ pluginManagement {
gradlePluginPortal()
google()
jcenter()
mavenCentral()
}
resolutionStrategy {
eachPlugin {
@@ -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)
}
}
val KotlinVersionKind.isStable
get() = this == KotlinVersionKind.STABLE
@@ -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"
)
@@ -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()