From eb14625851c5eb5dff9fe97da5980efeb58a727b Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Mon, 26 Mar 2018 15:57:23 +0300 Subject: [PATCH] Configuration: Detect platform of libraries added via maven artifact ids #KT-20511 Fixed --- .../idea/caches/project/IdeaModuleInfos.kt | 2 +- .../project/LibraryDependenciesCache.kt | 4 +- .../framework/JsLibraryStdDetectionUtil.kt | 9 ++-- .../framework/LibraryEffectiveKindProvider.kt | 21 ++++++++ .../kotlin/idea/framework/LibraryKinds.kt | 11 ++-- .../ConfigureKotlinInProjectUtils.kt | 3 +- .../KotlinJavaModuleConfigurator.kt | 7 +-- .../KotlinJsModuleConfigurator.kt | 7 ++- .../KotlinWithLibraryConfigurator.kt | 8 +-- .../versions/OutdatedKotlinRuntimeChecker.kt | 20 +++---- idea/src/META-INF/plugin.xml | 3 ++ idea/src/META-INF/plugin.xml.172 | 3 ++ idea/src/META-INF/plugin.xml.173 | 3 ++ idea/src/META-INF/plugin.xml.182 | 3 ++ idea/src/META-INF/plugin.xml.as31 | 3 ++ idea/src/META-INF/plugin.xml.as32 | 3 ++ ...VersionInfoProviderByModuleDependencies.kt | 2 +- .../LibraryEffectiveKindProviderImpl.kt | 46 ++++++++++++++++ .../jsTest12Maven/kotlin-test-js-1.2.31.jar | Bin 0 -> 18455 bytes .../mavenProvidedTestJsKind/module.iml | 13 +++++ .../mavenProvidedTestJsKind/projectFile.ipr | 49 ++++++++++++++++++ .../mavenProvidedTestJsKind/src/foo.kt | 0 .../configuration/ConfigureKotlinTest.java | 17 ++++-- .../ConfigureKotlinTest.java.182 | 15 +++++- 24 files changed, 215 insertions(+), 37 deletions(-) create mode 100644 idea/idea-analysis/src/org/jetbrains/kotlin/idea/framework/LibraryEffectiveKindProvider.kt create mode 100644 idea/src/org/jetbrains/kotlin/idea/framework/LibraryEffectiveKindProviderImpl.kt create mode 100644 idea/testData/configuration/jsTest12Maven/kotlin-test-js-1.2.31.jar create mode 100644 idea/testData/configuration/mavenProvidedTestJsKind/module.iml create mode 100644 idea/testData/configuration/mavenProvidedTestJsKind/projectFile.ipr create mode 100644 idea/testData/configuration/mavenProvidedTestJsKind/src/foo.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/IdeaModuleInfos.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/IdeaModuleInfos.kt index 4b9aaf0fbfc..a968d6b071e 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/IdeaModuleInfos.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/IdeaModuleInfos.kt @@ -288,7 +288,7 @@ class LibraryInfo(val project: Project, val library: Library) : IdeaModuleInfo, } override val platform: TargetPlatform - get() = getLibraryPlatform(library) + get() = getLibraryPlatform(project, library) override val sourcesModuleInfo: SourceForBinaryModuleInfo get() = LibrarySourceInfo(project, library) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/LibraryDependenciesCache.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/LibraryDependenciesCache.kt index eb00b1363ee..7d4af2d999f 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/LibraryDependenciesCache.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/LibraryDependenciesCache.kt @@ -61,7 +61,7 @@ class LibraryDependenciesCacheImpl(private val project: Project) : LibraryDepend val libraries = LinkedHashSet() val sdks = LinkedHashSet() - val platform = getLibraryPlatform(library) + val platform = getLibraryPlatform(project, library) for (module in getLibraryUsageIndex().modulesLibraryIsUsedIn[library]) { if (!processedModules.add(module)) continue @@ -73,7 +73,7 @@ class LibraryDependenciesCacheImpl(private val project: Project) : LibraryDepend override fun visitLibraryOrderEntry(libraryOrderEntry: LibraryOrderEntry, value: Unit) { val otherLibrary = libraryOrderEntry.library - if (otherLibrary != null && compatiblePlatforms(platform, getLibraryPlatform(otherLibrary))) { + if (otherLibrary != null && compatiblePlatforms(platform, getLibraryPlatform(project, otherLibrary))) { libraries.add(otherLibrary) } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/framework/JsLibraryStdDetectionUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/framework/JsLibraryStdDetectionUtil.kt index 86ff79b07e4..9136071f442 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/framework/JsLibraryStdDetectionUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/framework/JsLibraryStdDetectionUtil.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.idea.framework +import com.intellij.openapi.project.Project import com.intellij.openapi.roots.OrderRootType import com.intellij.openapi.roots.impl.libraries.LibraryEx import com.intellij.openapi.roots.libraries.Library @@ -33,16 +34,16 @@ import java.util.jar.Attributes object JsLibraryStdDetectionUtil { private val IS_JS_LIBRARY_STD_LIB = Key.create("IS_JS_LIBRARY_STD_LIB") - fun hasJsStdlibJar(library: Library, ignoreKind: Boolean = false): Boolean { + fun hasJsStdlibJar(library: Library, project: Project, ignoreKind: Boolean = false): Boolean { if (library !is LibraryEx || library.isDisposed) return false - if (!ignoreKind && library.kind !is JSLibraryKind) return false + if (!ignoreKind && library.effectiveKind(project) !is JSLibraryKind) return false val classes = Arrays.asList(*library.getFiles(OrderRootType.CLASSES)) return getJsStdLibJar(classes) != null } - fun getJsLibraryStdVersion(library: Library): String? { - if ((library as LibraryEx).kind !is JSLibraryKind) return null + fun getJsLibraryStdVersion(library: Library, project: Project): String? { + if ((library as LibraryEx).effectiveKind(project) !is JSLibraryKind) return null val jar = getJsStdLibJar(library.getFiles(OrderRootType.CLASSES).toList()) ?: return null return JarUtil.getJarAttribute(VfsUtilCore.virtualToIoFile(jar), Attributes.Name.IMPLEMENTATION_VERSION) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/framework/LibraryEffectiveKindProvider.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/framework/LibraryEffectiveKindProvider.kt new file mode 100644 index 00000000000..c97dccc26aa --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/framework/LibraryEffectiveKindProvider.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.framework + +import com.intellij.openapi.components.ServiceManager +import com.intellij.openapi.project.Project +import com.intellij.openapi.roots.impl.libraries.LibraryEx +import com.intellij.openapi.roots.libraries.PersistentLibraryKind + +interface LibraryEffectiveKindProvider { + fun getEffectiveKind(library: LibraryEx): PersistentLibraryKind<*>? + + companion object { + fun getInstance(project: Project) = ServiceManager.getService(project, LibraryEffectiveKindProvider::class.java)!! + } +} + +fun LibraryEx.effectiveKind(project: Project) = LibraryEffectiveKindProvider.getInstance(project).getEffectiveKind(this) \ No newline at end of file diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/framework/LibraryKinds.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/framework/LibraryKinds.kt index 9c98f9b85d8..7c15d8cbde6 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/framework/LibraryKinds.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/framework/LibraryKinds.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.idea.framework +import com.intellij.openapi.project.Project import com.intellij.openapi.roots.OrderRootType import com.intellij.openapi.roots.impl.libraries.LibraryEx import com.intellij.openapi.roots.libraries.DummyLibraryProperties @@ -31,19 +32,21 @@ import org.jetbrains.kotlin.utils.PathUtil import java.util.jar.Attributes import java.util.regex.Pattern -object JSLibraryKind : PersistentLibraryKind("kotlin.js") { +interface KotlinLibraryKind + +object JSLibraryKind : PersistentLibraryKind("kotlin.js"), KotlinLibraryKind { override fun createDefaultProperties() = DummyLibraryProperties.INSTANCE!! } -object CommonLibraryKind : PersistentLibraryKind("kotlin.common") { +object CommonLibraryKind : PersistentLibraryKind("kotlin.common"), KotlinLibraryKind { override fun createDefaultProperties() = DummyLibraryProperties.INSTANCE!! } -fun getLibraryPlatform(library: Library): TargetPlatform { +fun getLibraryPlatform(project: Project, library: Library): TargetPlatform { library as? LibraryEx ?: return JvmPlatform if (library.isDisposed) return JvmPlatform - return when (library.kind) { + return when (library.effectiveKind(project)) { JSLibraryKind -> JsPlatform CommonLibraryKind -> TargetPlatform.Common else -> JvmPlatform diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt index c5ad71285a4..66cfa88938e 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.configuration.ui.notifications.ConfigureKotlinNotification import org.jetbrains.kotlin.idea.framework.JSLibraryKind +import org.jetbrains.kotlin.idea.framework.effectiveKind import org.jetbrains.kotlin.idea.quickfix.KotlinAddRequiredModuleFix import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.idea.util.findFirstPsiJavaModule @@ -278,7 +279,7 @@ private class LibraryKindSearchScope(val module: Module, if (!super.contains(file)) return false val orderEntry = ModuleRootManager.getInstance(module).fileIndex.getOrderEntryForFile(file) if (orderEntry is LibraryOrderEntry) { - return (orderEntry.library as LibraryEx).kind == libraryKind + return (orderEntry.library as LibraryEx).effectiveKind(module.project) == libraryKind } return true } diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinJavaModuleConfigurator.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinJavaModuleConfigurator.kt index 45cc357da73..b2aeba6c34d 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinJavaModuleConfigurator.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinJavaModuleConfigurator.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.configuration import com.intellij.openapi.extensions.Extensions import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl import com.intellij.openapi.module.Module +import com.intellij.openapi.project.Project import com.intellij.openapi.projectRoots.JavaSdkVersion import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.roots.LibraryOrderEntry @@ -92,8 +93,8 @@ open class KotlinJavaModuleConfigurator protected constructor() : KotlinWithLibr return result } - override val libraryMatcher: (Library) -> Boolean = - { library -> JavaRuntimeDetectionUtil.getRuntimeJar(library.getFiles(OrderRootType.CLASSES).asList()) != null } + override val libraryMatcher: (Library, Project) -> Boolean = + { library, _ -> JavaRuntimeDetectionUtil.getRuntimeJar(library.getFiles(OrderRootType.CLASSES).asList()) != null } override fun configureKotlinSettings(modules: List) { val project = modules.firstOrNull()?.project ?: return @@ -140,7 +141,7 @@ open class KotlinJavaModuleConfigurator protected constructor() : KotlinWithLibr private fun hasBrokenJsRuntime(module: Module): Boolean { for (orderEntry in ModuleRootManager.getInstance(module).orderEntries) { val library = (orderEntry as? LibraryOrderEntry)?.library as? LibraryEx ?: continue - if (JsLibraryStdDetectionUtil.hasJsStdlibJar(library, ignoreKind = true)) return true + if (JsLibraryStdDetectionUtil.hasJsStdlibJar(library, module.project, ignoreKind = true)) return true } return false } diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinJsModuleConfigurator.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinJsModuleConfigurator.kt index e57dfa7b9c9..567e25115f9 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinJsModuleConfigurator.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinJsModuleConfigurator.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.idea.configuration import com.intellij.openapi.module.Module +import com.intellij.openapi.project.Project import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.roots.LibraryOrderEntry import com.intellij.openapi.roots.ModuleRootManager @@ -64,7 +65,9 @@ open class KotlinJsModuleConfigurator : KotlinWithLibraryConfigurator() { LibraryJarDescriptor.JS_STDLIB_SRC_JAR ) - override val libraryMatcher: (Library) -> Boolean = { library -> JsLibraryStdDetectionUtil.hasJsStdlibJar(library) } + override val libraryMatcher: (Library, Project) -> Boolean = { library, project -> + JsLibraryStdDetectionUtil.hasJsStdlibJar(library, project) + } override val libraryType: LibraryType? get() = JSLibraryType.getInstance() @@ -82,7 +85,7 @@ open class KotlinJsModuleConfigurator : KotlinWithLibraryConfigurator() { for (orderEntry in ModuleRootManager.getInstance(module).orderEntries) { val library = (orderEntry as? LibraryOrderEntry)?.library as? LibraryEx ?: continue allLibraries.add(library) - if (JsLibraryStdDetectionUtil.hasJsStdlibJar(library, ignoreKind = true) && library.kind == null) { + if (JsLibraryStdDetectionUtil.hasJsStdlibJar(library, module.project, ignoreKind = true) && library.kind == null) { brokenStdlib = library } } diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.kt index a4005570c91..9cb623a611c 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.kt @@ -209,8 +209,8 @@ abstract class KotlinWithLibraryConfigurator internal constructor() : KotlinProj } fun getKotlinLibrary(project: Project): Library? { - return LibraryTablesRegistrar.getInstance().getLibraryTable(project).libraries.firstOrNull(this::isKotlinLibrary) ?: - LibraryTablesRegistrar.getInstance().libraryTable.libraries.firstOrNull(this::isKotlinLibrary) + return LibraryTablesRegistrar.getInstance().getLibraryTable(project).libraries.firstOrNull { isKotlinLibrary(it, project) } ?: + LibraryTablesRegistrar.getInstance().libraryTable.libraries.firstOrNull { isKotlinLibrary(it, project) } } @Contract("!null, _, _ -> !null") @@ -272,13 +272,13 @@ abstract class KotlinWithLibraryConfigurator internal constructor() : KotlinProj return library != null && library.getUrls(OrderRootType.CLASSES).size > 0 } - protected abstract val libraryMatcher: (Library) -> Boolean + protected abstract val libraryMatcher: (Library, Project) -> Boolean fun getKotlinLibrary(module: Module): Library? { return findKotlinRuntimeLibrary(module, this::isKotlinLibrary) } - private fun isKotlinLibrary(library: Library) = library.name == libraryName || libraryMatcher(library) + private fun isKotlinLibrary(library: Library, project: Project) = library.name == libraryName || libraryMatcher(library, project) protected fun needToChooseJarPath(project: Project): Boolean { val defaultPath = getDefaultPathToJarFile(project) diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/versions/OutdatedKotlinRuntimeChecker.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/versions/OutdatedKotlinRuntimeChecker.kt index cc94eb9a558..c3cc5324182 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/versions/OutdatedKotlinRuntimeChecker.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/versions/OutdatedKotlinRuntimeChecker.kt @@ -50,7 +50,7 @@ fun findOutdatedKotlinLibraries(project: Project): List { val outdatedLibraries = arrayListOf() for ((library, modules) in findAllUsedLibraries(project).entrySet()) { - getOutdatedRuntimeLibraryVersion(library)?.let { version -> + getOutdatedRuntimeLibraryVersion(library, project)?.let { version -> outdatedLibraries.add(VersionedLibrary(library, version, modules)) } } @@ -58,30 +58,30 @@ fun findOutdatedKotlinLibraries(project: Project): List { return outdatedLibraries } -private fun getOutdatedRuntimeLibraryVersion(library: Library): String? { - val libraryVersion = getKotlinLibraryVersion(library) ?: return null +private fun getOutdatedRuntimeLibraryVersion(library: Library, project: Project): String? { + val libraryVersion = getKotlinLibraryVersion(library, project) ?: return null val runtimeVersion = bundledRuntimeVersion() return if (isRuntimeOutdated(libraryVersion, runtimeVersion)) libraryVersion else null } -private fun getKotlinLibraryVersion(library: Library): String? = - JavaRuntimeDetectionUtil.getJavaRuntimeVersion(library) ?: JsLibraryStdDetectionUtil.getJsLibraryStdVersion(library) +private fun getKotlinLibraryVersion(library: Library, project: Project): String? = + JavaRuntimeDetectionUtil.getJavaRuntimeVersion(library) ?: JsLibraryStdDetectionUtil.getJsLibraryStdVersion(library, project) -fun findKotlinRuntimeLibrary(module: Module, predicate: (Library) -> Boolean = ::isKotlinRuntime): Library? { +fun findKotlinRuntimeLibrary(module: Module, predicate: (Library, Project) -> Boolean = ::isKotlinRuntime): Library? { val orderEntries = ModuleRootManager.getInstance(module).orderEntries.filterIsInstance() return orderEntries.asSequence() .mapNotNull { it.library } - .firstOrNull(predicate) + .firstOrNull { predicate(it, module.project) } } -private fun isKotlinRuntime(library: Library) = isKotlinJavaRuntime(library) || isKotlinJsRuntime(library) +private fun isKotlinRuntime(library: Library, project: Project) = isKotlinJavaRuntime(library) || isKotlinJsRuntime(library, project) private fun isKotlinJavaRuntime(library: Library) = JavaRuntimeDetectionUtil.getRuntimeJar(library.getFiles(OrderRootType.CLASSES).asList()) != null -private fun isKotlinJsRuntime(library: Library) = - JsLibraryStdDetectionUtil.hasJsStdlibJar(library) +private fun isKotlinJsRuntime(library: Library, project: Project) = + JsLibraryStdDetectionUtil.hasJsStdlibJar(library, project) fun collectModulesWithOutdatedRuntime(libraries: List): List = libraries.flatMap { it.usedInModules } diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index a02ddf7aef8..2aeb0bba032 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -320,6 +320,9 @@ + + diff --git a/idea/src/META-INF/plugin.xml.172 b/idea/src/META-INF/plugin.xml.172 index 4c83c10cf9c..908c4ac8b9b 100644 --- a/idea/src/META-INF/plugin.xml.172 +++ b/idea/src/META-INF/plugin.xml.172 @@ -320,6 +320,9 @@ + + diff --git a/idea/src/META-INF/plugin.xml.173 b/idea/src/META-INF/plugin.xml.173 index 6f7e863d3c1..7ec614803c8 100644 --- a/idea/src/META-INF/plugin.xml.173 +++ b/idea/src/META-INF/plugin.xml.173 @@ -320,6 +320,9 @@ + + diff --git a/idea/src/META-INF/plugin.xml.182 b/idea/src/META-INF/plugin.xml.182 index c8543d69b3c..e3c37e65634 100644 --- a/idea/src/META-INF/plugin.xml.182 +++ b/idea/src/META-INF/plugin.xml.182 @@ -321,6 +321,9 @@ + + diff --git a/idea/src/META-INF/plugin.xml.as31 b/idea/src/META-INF/plugin.xml.as31 index 93e88de319e..f3ed228e07b 100644 --- a/idea/src/META-INF/plugin.xml.as31 +++ b/idea/src/META-INF/plugin.xml.as31 @@ -320,6 +320,9 @@ + + diff --git a/idea/src/META-INF/plugin.xml.as32 b/idea/src/META-INF/plugin.xml.as32 index f45bc5b063c..85bc38ec488 100644 --- a/idea/src/META-INF/plugin.xml.as32 +++ b/idea/src/META-INF/plugin.xml.as32 @@ -320,6 +320,9 @@ + + diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/KotlinVersionInfoProviderByModuleDependencies.kt b/idea/src/org/jetbrains/kotlin/idea/facet/KotlinVersionInfoProviderByModuleDependencies.kt index df8d16c6b5d..971bf66df1a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/facet/KotlinVersionInfoProviderByModuleDependencies.kt +++ b/idea/src/org/jetbrains/kotlin/idea/facet/KotlinVersionInfoProviderByModuleDependencies.kt @@ -32,7 +32,7 @@ class KotlinVersionInfoProviderByModuleDependencies : KotlinVersionInfoProvider override fun getLibraryVersions(module: Module, targetPlatform: TargetPlatformKind<*>, rootModel: ModuleRootModel?): Collection { val versionProvider: (Library) -> String? = when (targetPlatform) { - is TargetPlatformKind.JavaScript -> JsLibraryStdDetectionUtil::getJsLibraryStdVersion + is TargetPlatformKind.JavaScript -> fun(library: Library) = JsLibraryStdDetectionUtil.getJsLibraryStdVersion(library, module.project) is TargetPlatformKind.Jvm -> JavaRuntimeDetectionUtil::getJavaRuntimeVersion is TargetPlatformKind.Common -> ::getCommonRuntimeLibraryVersion } diff --git a/idea/src/org/jetbrains/kotlin/idea/framework/LibraryEffectiveKindProviderImpl.kt b/idea/src/org/jetbrains/kotlin/idea/framework/LibraryEffectiveKindProviderImpl.kt new file mode 100644 index 00000000000..70f8d3c25ee --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/framework/LibraryEffectiveKindProviderImpl.kt @@ -0,0 +1,46 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.framework + +import com.intellij.ProjectTopics +import com.intellij.openapi.project.Project +import com.intellij.openapi.roots.ModuleRootEvent +import com.intellij.openapi.roots.ModuleRootListener +import com.intellij.openapi.roots.OrderRootType +import com.intellij.openapi.roots.impl.libraries.LibraryEx +import com.intellij.openapi.roots.libraries.PersistentLibraryKind +import java.util.* + +class LibraryEffectiveKindProviderImpl(project: Project) : LibraryEffectiveKindProvider { + companion object { + private val effectiveKindMap = HashMap?>() + } + + init { + project.messageBus.connect(project).subscribe( + ProjectTopics.PROJECT_ROOTS, + object : ModuleRootListener { + override fun rootsChanged(event: ModuleRootEvent?) { + synchronized(effectiveKindMap) { + effectiveKindMap.clear() + } + } + } + ) + } + + override fun getEffectiveKind(library: LibraryEx): PersistentLibraryKind<*>? { + val kind = library.kind + return when (kind) { + is KotlinLibraryKind -> kind + else -> { + synchronized(effectiveKindMap) { + effectiveKindMap.getOrPut(library) { detectLibraryKind(library.getFiles(OrderRootType.CLASSES)) } + } + } + } + } +} \ No newline at end of file diff --git a/idea/testData/configuration/jsTest12Maven/kotlin-test-js-1.2.31.jar b/idea/testData/configuration/jsTest12Maven/kotlin-test-js-1.2.31.jar new file mode 100644 index 0000000000000000000000000000000000000000..b3c24486619046d355448b81286253f7db220c68 GIT binary patch literal 18455 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 literal 0 HcmV?d00001 diff --git a/idea/testData/configuration/mavenProvidedTestJsKind/module.iml b/idea/testData/configuration/mavenProvidedTestJsKind/module.iml new file mode 100644 index 00000000000..8df57cb44ce --- /dev/null +++ b/idea/testData/configuration/mavenProvidedTestJsKind/module.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/configuration/mavenProvidedTestJsKind/projectFile.ipr b/idea/testData/configuration/mavenProvidedTestJsKind/projectFile.ipr new file mode 100644 index 00000000000..210159ca264 --- /dev/null +++ b/idea/testData/configuration/mavenProvidedTestJsKind/projectFile.ipr @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/idea/testData/configuration/mavenProvidedTestJsKind/src/foo.kt b/idea/testData/configuration/mavenProvidedTestJsKind/src/foo.kt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java index 6813971389f..6f217a45fde 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.idea.configuration; +import com.intellij.jarRepository.RepositoryLibraryType; import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; @@ -24,6 +25,7 @@ import com.intellij.openapi.roots.LibraryOrderEntry; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.RootPolicy; +import com.intellij.openapi.roots.impl.libraries.LibraryEx; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; @@ -35,7 +37,10 @@ import org.jetbrains.kotlin.config.*; import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCommonCompilerArgumentsHolder; import org.jetbrains.kotlin.idea.facet.FacetUtilsKt; import org.jetbrains.kotlin.idea.facet.KotlinFacet; +import org.jetbrains.kotlin.idea.framework.JSLibraryKind; import org.jetbrains.kotlin.idea.framework.JsLibraryStdDetectionUtil; +import org.jetbrains.kotlin.idea.framework.LibraryEffectiveKindProviderKt; +import org.jetbrains.kotlin.idea.framework.LibraryKindsKt; import org.jetbrains.kotlin.idea.project.PlatformKt; import org.jetbrains.kotlin.idea.util.Java9StructureUtilKt; import org.jetbrains.kotlin.idea.versions.KotlinRuntimeLibraryUtilKt; @@ -152,7 +157,7 @@ public class ConfigureKotlinTest extends AbstractConfigureKotlinTest { } public void testJsLibraryWrongKind() { - doTestOneJsModule(KotlinWithLibraryConfigurator.FileState.EXISTS); + AbstractConfigureKotlinTest.Companion.assertProperlyConfigured(getModule(), AbstractConfigureKotlinTest.Companion.getJS_CONFIGURATOR()); assertEquals(1, ModuleRootManager.getInstance(getModule()).orderEntries().process(new LibraryCountingRootPolicy(), 0).intValue()); } @@ -178,16 +183,22 @@ public class ConfigureKotlinTest extends AbstractConfigureKotlinTest { public void testJsLibraryVersion11() { Library jsRuntime = KotlinRuntimeLibraryUtilKt.findAllUsedLibraries(myProject).keySet().iterator().next(); - String version = JsLibraryStdDetectionUtil.INSTANCE.getJsLibraryStdVersion(jsRuntime); + String version = JsLibraryStdDetectionUtil.INSTANCE.getJsLibraryStdVersion(jsRuntime, myProject); assertEquals("1.1.0", version); } public void testJsLibraryVersion106() { Library jsRuntime = KotlinRuntimeLibraryUtilKt.findAllUsedLibraries(myProject).keySet().iterator().next(); - String version = JsLibraryStdDetectionUtil.INSTANCE.getJsLibraryStdVersion(jsRuntime); + String version = JsLibraryStdDetectionUtil.INSTANCE.getJsLibraryStdVersion(jsRuntime, myProject); assertEquals("1.0.6", version); } + public void testMavenProvidedTestJsKind() { + LibraryEx jsTest = (LibraryEx) KotlinRuntimeLibraryUtilKt.findAllUsedLibraries(myProject).keySet().toArray()[1]; + assertEquals(RepositoryLibraryType.REPOSITORY_LIBRARY_KIND, jsTest.getKind()); + assertEquals(JSLibraryKind.INSTANCE, LibraryEffectiveKindProviderKt.effectiveKind(jsTest, myProject)); + } + @SuppressWarnings("ConstantConditions") public void testJvmProjectWithV1FacetConfig() { KotlinFacetSettings settings = KotlinFacetSettingsProvider.Companion.getInstance(myProject).getInitializedSettings(getModule()); diff --git a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java.182 b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java.182 index 2a24bf977da..b58298b83ef 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java.182 +++ b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java.182 @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.idea.configuration; +import com.intellij.jarRepository.RepositoryLibraryType; import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; @@ -24,6 +25,7 @@ import com.intellij.openapi.roots.LibraryOrderEntry; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.RootPolicy; +import com.intellij.openapi.roots.impl.libraries.LibraryEx; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; @@ -35,7 +37,10 @@ import org.jetbrains.kotlin.config.*; import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCommonCompilerArgumentsHolder; import org.jetbrains.kotlin.idea.facet.FacetUtilsKt; import org.jetbrains.kotlin.idea.facet.KotlinFacet; +import org.jetbrains.kotlin.idea.framework.JSLibraryKind; import org.jetbrains.kotlin.idea.framework.JsLibraryStdDetectionUtil; +import org.jetbrains.kotlin.idea.framework.LibraryEffectiveKindProviderKt; +import org.jetbrains.kotlin.idea.framework.LibraryKindsKt; import org.jetbrains.kotlin.idea.project.PlatformKt; import org.jetbrains.kotlin.idea.util.Java9StructureUtilKt; import org.jetbrains.kotlin.idea.versions.KotlinRuntimeLibraryUtilKt; @@ -178,16 +183,22 @@ public class ConfigureKotlinTest extends AbstractConfigureKotlinTest { public void testJsLibraryVersion11() { Library jsRuntime = KotlinRuntimeLibraryUtilKt.findAllUsedLibraries(myProject).keySet().iterator().next(); - String version = JsLibraryStdDetectionUtil.INSTANCE.getJsLibraryStdVersion(jsRuntime); + String version = JsLibraryStdDetectionUtil.INSTANCE.getJsLibraryStdVersion(jsRuntime, myProject); assertEquals("1.1.0", version); } public void testJsLibraryVersion106() { Library jsRuntime = KotlinRuntimeLibraryUtilKt.findAllUsedLibraries(myProject).keySet().iterator().next(); - String version = JsLibraryStdDetectionUtil.INSTANCE.getJsLibraryStdVersion(jsRuntime); + String version = JsLibraryStdDetectionUtil.INSTANCE.getJsLibraryStdVersion(jsRuntime, myProject); assertEquals("1.0.6", version); } + public void testMavenProvidedTestJsKind() { + LibraryEx jsTest = (LibraryEx) KotlinRuntimeLibraryUtilKt.findAllUsedLibraries(myProject).keySet().toArray()[1]; + assertEquals(RepositoryLibraryType.REPOSITORY_LIBRARY_KIND, jsTest.getKind()); + assertEquals(JSLibraryKind.INSTANCE, LibraryEffectiveKindProviderKt.effectiveKind(jsTest, myProject)); + } + @SuppressWarnings("ConstantConditions") public void testJvmProjectWithV1FacetConfig() { KotlinFacetSettings settings = KotlinFacetSettingsProvider.Companion.getInstance(myProject).getInitializedSettings(getModule());