From b8d453eec3dc607bd54c62c108b00eb8520f8240 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 12 Jul 2017 14:59:04 +0200 Subject: [PATCH] Set library kind when importing projects from Maven --- .../kotlin/idea/maven/KotlinMavenImporter.kt | 48 +++++++++++++------ .../idea/maven/KotlinMavenImporterTest.kt | 12 ++++- 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/KotlinMavenImporter.kt b/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/KotlinMavenImporter.kt index 485da7c80a2..66e82cfdaa8 100644 --- a/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/KotlinMavenImporter.kt +++ b/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/KotlinMavenImporter.kt @@ -24,6 +24,7 @@ import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsPr import com.intellij.openapi.module.Module import com.intellij.openapi.roots.OrderEnumerator 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.util.AsyncResult 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.parseCommandLineArguments 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.idea.facet.* +import org.jetbrains.kotlin.idea.framework.JSLibraryKind import org.jetbrains.kotlin.idea.maven.configuration.KotlinMavenConfigurator import java.io.File import java.util.* @@ -83,27 +88,42 @@ class KotlinMavenImporter : MavenImporter(KOTLIN_PLUGIN_GROUP_ID, KOTLIN_PLUGIN_ super.postProcess(module, mavenProject, changes, modifiableModelsProvider) if (changes.dependencies) { - // 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() + scheduleDownloadStdlibSources(mavenProject, module) - val librariesWithNoSources = ArrayList() - OrderEnumerator.orderEntries(module).forEachLibrary { library -> - if (library.modifiableModel.getFiles(OrderRootType.SOURCES).isEmpty()) { - librariesWithNoSources.add(library) + val platform = detectPlatformByExecutions(mavenProject) + if (platform == TargetPlatformKind.JavaScript) { + modifiableModelsProvider.getModifiableRootModel(module).orderEntries().forEachLibrary { 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) } + 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() + 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, configuration: Element?, platform: TargetPlatformKind<*>): List { diff --git a/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/KotlinMavenImporterTest.kt b/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/KotlinMavenImporterTest.kt index ca21f1895b7..320c13f4fda 100644 --- a/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/KotlinMavenImporterTest.kt +++ b/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/KotlinMavenImporterTest.kt @@ -20,16 +20,20 @@ import com.intellij.openapi.application.Result import com.intellij.openapi.application.WriteAction import com.intellij.openapi.projectRoots.JavaSdk import com.intellij.openapi.projectRoots.ProjectJdkTable +import com.intellij.openapi.roots.LibraryOrderEntry 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.K2JVMCompilerArguments 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.framework.JSLibraryKind import org.junit.Assert import java.io.File class KotlinMavenImporterTest : MavenImportingTestCase() { - private val kotlinVersion = "1.0.0-beta-2423" + private val kotlinVersion = "1.1.3" override fun setUp() { super.setUp() @@ -529,7 +533,7 @@ class KotlinMavenImporterTest : MavenImportingTestCase() { org.jetbrains.kotlin - kotlin-stdlib + kotlin-stdlib-js $kotlinVersion @@ -587,6 +591,10 @@ class KotlinMavenImporterTest : MavenImportingTestCase() { Assert.assertEquals("-output test.js -meta-info -Xmulti-platform", compilerSettings!!.additionalArguments) } + + val rootManager = ModuleRootManager.getInstance(getModule("project")) + val stdlib = rootManager.orderEntries.filterIsInstance().single().library + GradleImportingTestCase.assertEquals(JSLibraryKind, (stdlib as LibraryEx).kind) } fun testFacetSplitConfiguration() {