diff --git a/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleLibraryDataService.kt b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleLibraryDataService.kt new file mode 100644 index 00000000000..c52bb0761af --- /dev/null +++ b/idea/idea-android/src/org/jetbrains/kotlin/android/configure/KotlinAndroidGradleLibraryDataService.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.android.configure + +import com.android.tools.idea.gradle.AndroidProjectKeys +import com.android.tools.idea.gradle.JavaProject +import com.intellij.openapi.externalSystem.model.DataNode +import com.intellij.openapi.externalSystem.model.project.ModuleData +import com.intellij.openapi.externalSystem.model.project.ProjectData +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider +import com.intellij.openapi.externalSystem.service.project.manage.AbstractProjectDataService +import com.intellij.openapi.project.Project +import com.intellij.openapi.roots.impl.libraries.LibraryEx +import org.jetbrains.kotlin.config.TargetPlatformKind +import org.jetbrains.kotlin.idea.configuration.detectPlatformByPlugin +import org.jetbrains.kotlin.idea.framework.JSLibraryKind + +class KotlinAndroidGradleLibraryDataService : AbstractProjectDataService() { + override fun getTargetDataKey() = AndroidProjectKeys.JAVA_PROJECT + + override fun postProcess( + toImport: MutableCollection>, + projectData: ProjectData?, + project: Project, + modelsProvider: IdeModifiableModelsProvider + ) { + for (dataNode in toImport) { + val platform = detectPlatformByPlugin(dataNode.parent as DataNode) + if (platform == TargetPlatformKind.JavaScript) { + for (dep in dataNode.data.jarLibraryDependencies) { + val library = modelsProvider.getLibraryByName(dep.name) as LibraryEx? ?: continue + if (library.kind == null) { + (modelsProvider.getModifiableLibraryModel(library) as LibraryEx.ModifiableModelEx).kind = JSLibraryKind + } + } + } + } + } +} diff --git a/idea/idea.iml b/idea/idea.iml index 3c7bcad1f8a..eaeff0831f1 100644 --- a/idea/idea.iml +++ b/idea/idea.iml @@ -30,7 +30,7 @@ - + diff --git a/idea/src/META-INF/android.xml b/idea/src/META-INF/android.xml index 2559c55d5bb..41b1221bd6b 100644 --- a/idea/src/META-INF/android.xml +++ b/idea/src/META-INF/android.xml @@ -63,6 +63,7 @@ + diff --git a/idea/src/META-INF/gradle.xml b/idea/src/META-INF/gradle.xml index ac0280c269d..d9daa47063c 100644 --- a/idea/src/META-INF/gradle.xml +++ b/idea/src/META-INF/gradle.xml @@ -14,6 +14,7 @@ + ): TargetPlatformKind<*>? { +class KotlinGradleLibraryDataService : AbstractProjectDataService() { + override fun getTargetDataKey() = ProjectKeys.LIBRARY + + override fun postProcess( + toImport: MutableCollection>, + projectData: ProjectData?, + project: Project, + modelsProvider: IdeModifiableModelsProvider + ) { + for (libraryDataNode in toImport) { + val ideLibrary = modelsProvider.findIdeLibrary(libraryDataNode.data) ?: continue + + val projectDataNode = libraryDataNode.parent!! as DataNode + val ownerModule = findOwnerModule(libraryDataNode.data, projectDataNode) ?: continue + val targetPlatform = detectPlatformByPlugin(ownerModule) + if (targetPlatform == TargetPlatformKind.JavaScript) { + val modifiableModel = modelsProvider.getModifiableLibraryModel(ideLibrary) as LibraryEx.ModifiableModelEx + modifiableModel.kind = JSLibraryKind + } + } + } +} + +private fun findOwnerModule(libraryData: LibraryData, + projectDataNode: DataNode): DataNode? { + return projectDataNode.children.firstOrNull { dataNode -> + if (dataNode.data !is ModuleData) return@firstOrNull false + val sourceSetDataNodes = dataNode.children.filter { it.data is GradleSourceSetData } + sourceSetDataNodes.any { it.hasDependency(libraryData) } + } as DataNode? +} + +private fun DataNode<*>.hasDependency(libraryData: LibraryData): Boolean = + children.any { + (it.data as? LibraryDependencyData)?.target == libraryData + } + +fun detectPlatformByPlugin(moduleNode: DataNode): TargetPlatformKind<*>? { return when (moduleNode.platformPluginId) { "kotlin-platform-jvm" -> TargetPlatformKind.Jvm[JvmTarget.JVM_1_6] "kotlin-platform-js" -> TargetPlatformKind.JavaScript diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleFacetImportTest.kt b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleFacetImportTest.kt index e0a8fc01642..df339525837 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleFacetImportTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleFacetImportTest.kt @@ -20,12 +20,15 @@ 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 com.intellij.openapi.util.text.StringUtil 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.facet.KotlinFacet +import org.jetbrains.kotlin.idea.framework.JSLibraryKind import org.junit.Assert import org.junit.Test import java.io.File @@ -428,6 +431,10 @@ class GradleFacetImportTest : GradleImportingTestCase() { Assert.assertEquals("-main callTest", compilerSettings!!.additionalArguments) } + + val rootManager = ModuleRootManager.getInstance(getModule("project_main")) + val stdlib = rootManager.orderEntries.filterIsInstance().single().library + assertEquals(JSLibraryKind, (stdlib as LibraryEx).kind) } @Test @@ -885,6 +892,10 @@ class GradleFacetImportTest : GradleImportingTestCase() { with (facetSettings("js-module")) { Assert.assertEquals(TargetPlatformKind.JavaScript, targetPlatformKind) } + + val rootManager = ModuleRootManager.getInstance(getModule("js-module")) + val stdlib = rootManager.orderEntries.filterIsInstance().single().library + assertEquals(JSLibraryKind, (stdlib as LibraryEx).kind) } @Test