Set library kind when importing projects from Maven

This commit is contained in:
Dmitry Jemerov
2017-07-12 14:59:04 +02:00
parent 608f5892f9
commit b8d453eec3
2 changed files with 44 additions and 16 deletions
@@ -24,6 +24,7 @@ import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsPr
import com.intellij.openapi.module.Module import com.intellij.openapi.module.Module
import com.intellij.openapi.roots.OrderEnumerator import com.intellij.openapi.roots.OrderEnumerator
import com.intellij.openapi.roots.OrderRootType import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.roots.impl.libraries.LibraryEx
import com.intellij.openapi.roots.libraries.Library import com.intellij.openapi.roots.libraries.Library
import com.intellij.openapi.util.AsyncResult import com.intellij.openapi.util.AsyncResult
import org.jdom.Element import org.jdom.Element
@@ -38,9 +39,13 @@ import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.K2MetadataCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2MetadataCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.parseCommandLineArguments import org.jetbrains.kotlin.cli.common.arguments.parseCommandLineArguments
import org.jetbrains.kotlin.compilerRunner.ArgumentUtils import org.jetbrains.kotlin.compilerRunner.ArgumentUtils
import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.config.JvmTarget
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.config.TargetPlatformKind
import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
import org.jetbrains.kotlin.idea.facet.* import org.jetbrains.kotlin.idea.facet.*
import org.jetbrains.kotlin.idea.framework.JSLibraryKind
import org.jetbrains.kotlin.idea.maven.configuration.KotlinMavenConfigurator import org.jetbrains.kotlin.idea.maven.configuration.KotlinMavenConfigurator
import java.io.File import java.io.File
import java.util.* import java.util.*
@@ -83,27 +88,42 @@ class KotlinMavenImporter : MavenImporter(KOTLIN_PLUGIN_GROUP_ID, KOTLIN_PLUGIN_
super.postProcess(module, mavenProject, changes, modifiableModelsProvider) super.postProcess(module, mavenProject, changes, modifiableModelsProvider)
if (changes.dependencies) { if (changes.dependencies) {
// TODO: here we have to process all kotlin libraries but for now we only handle standard libraries scheduleDownloadStdlibSources(mavenProject, module)
val artifacts = mavenProject.dependencyArtifactIndex.data[KOTLIN_PLUGIN_GROUP_ID]?.values?.flatMap { it.filter { it.isResolved } } ?: emptyList()
val librariesWithNoSources = ArrayList<Library>() val platform = detectPlatformByExecutions(mavenProject)
OrderEnumerator.orderEntries(module).forEachLibrary { library -> if (platform == TargetPlatformKind.JavaScript) {
if (library.modifiableModel.getFiles(OrderRootType.SOURCES).isEmpty()) { modifiableModelsProvider.getModifiableRootModel(module).orderEntries().forEachLibrary { library ->
librariesWithNoSources.add(library) if ((library as LibraryEx).kind == null) {
val model = modifiableModelsProvider.getModifiableLibraryModel(library) as LibraryEx.ModifiableModelEx
model.kind = JSLibraryKind
}
true
} }
true
}
val libraryNames = librariesWithNoSources.mapTo(HashSet()) { it.name }
val toBeDownloaded = artifacts.filter { it.libraryName in libraryNames }
if (toBeDownloaded.isNotEmpty()) {
MavenProjectsManager.getInstance(module.project).scheduleArtifactsDownloading(listOf(mavenProject), toBeDownloaded, true, false, AsyncResult())
} }
} }
configureFacet(mavenProject, modifiableModelsProvider, module) configureFacet(mavenProject, modifiableModelsProvider, module)
} }
private fun scheduleDownloadStdlibSources(mavenProject: MavenProject, module: Module) {
// TODO: here we have to process all kotlin libraries but for now we only handle standard libraries
val artifacts = mavenProject.dependencyArtifactIndex.data[KOTLIN_PLUGIN_GROUP_ID]?.values?.flatMap { it.filter { it.isResolved } } ?: emptyList()
val librariesWithNoSources = ArrayList<Library>()
OrderEnumerator.orderEntries(module).forEachLibrary { library ->
if (library.modifiableModel.getFiles(OrderRootType.SOURCES).isEmpty()) {
librariesWithNoSources.add(library)
}
true
}
val libraryNames = librariesWithNoSources.mapTo(HashSet()) { it.name }
val toBeDownloaded = artifacts.filter { it.libraryName in libraryNames }
if (toBeDownloaded.isNotEmpty()) {
MavenProjectsManager.getInstance(module.project).scheduleArtifactsDownloading(listOf(mavenProject), toBeDownloaded, true, false, AsyncResult())
}
}
private fun getCompilerArgumentsByConfigurationElement(mavenProject: MavenProject, private fun getCompilerArgumentsByConfigurationElement(mavenProject: MavenProject,
configuration: Element?, configuration: Element?,
platform: TargetPlatformKind<*>): List<String> { platform: TargetPlatformKind<*>): List<String> {
@@ -20,16 +20,20 @@ import com.intellij.openapi.application.Result
import com.intellij.openapi.application.WriteAction import com.intellij.openapi.application.WriteAction
import com.intellij.openapi.projectRoots.JavaSdk import com.intellij.openapi.projectRoots.JavaSdk
import com.intellij.openapi.projectRoots.ProjectJdkTable import com.intellij.openapi.projectRoots.ProjectJdkTable
import com.intellij.openapi.roots.LibraryOrderEntry
import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ModuleRootManager
import com.intellij.openapi.roots.impl.libraries.LibraryEx
import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.idea.codeInsight.gradle.GradleImportingTestCase
import org.jetbrains.kotlin.idea.facet.KotlinFacet import org.jetbrains.kotlin.idea.facet.KotlinFacet
import org.jetbrains.kotlin.idea.framework.JSLibraryKind
import org.junit.Assert import org.junit.Assert
import java.io.File import java.io.File
class KotlinMavenImporterTest : MavenImportingTestCase() { class KotlinMavenImporterTest : MavenImportingTestCase() {
private val kotlinVersion = "1.0.0-beta-2423" private val kotlinVersion = "1.1.3"
override fun setUp() { override fun setUp() {
super.setUp() super.setUp()
@@ -529,7 +533,7 @@ class KotlinMavenImporterTest : MavenImportingTestCase() {
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.jetbrains.kotlin</groupId> <groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId> <artifactId>kotlin-stdlib-js</artifactId>
<version>$kotlinVersion</version> <version>$kotlinVersion</version>
</dependency> </dependency>
</dependencies> </dependencies>
@@ -587,6 +591,10 @@ class KotlinMavenImporterTest : MavenImportingTestCase() {
Assert.assertEquals("-output test.js -meta-info -Xmulti-platform", Assert.assertEquals("-output test.js -meta-info -Xmulti-platform",
compilerSettings!!.additionalArguments) compilerSettings!!.additionalArguments)
} }
val rootManager = ModuleRootManager.getInstance(getModule("project"))
val stdlib = rootManager.orderEntries.filterIsInstance<LibraryOrderEntry>().single().library
GradleImportingTestCase.assertEquals(JSLibraryKind, (stdlib as LibraryEx).kind)
} }
fun testFacetSplitConfiguration() { fun testFacetSplitConfiguration() {