From dfdbfb70dc8941ae6f0f055da6d40878e3a0af1c Mon Sep 17 00:00:00 2001 From: "Aleksei.Cherepanov" Date: Mon, 18 Jan 2021 15:15:13 +0300 Subject: [PATCH] [CHERRY PICKED FROM IJ] Fix performance problem in KotlinTargetsIndex creation Creation of KotlinTargetsIndex takes too long, even if Java project doesn't have any Kotlin files. Remove function hasJsStdLib, as it takes too much time because of recursively checking all dependencies (migrate to facets) Also fix tests: Add Kotlin JS facet, where its needed #KT-34351 Fixed Original commit: c74f471a82657f20a2875acb67105f1fb9c1097f GitOrigin-RevId: 94e18cd48d71e9fec8acb1987763bf1ef7485f42 Original commit: https://github.com/JetBrains/intellij-community/commit/f442fe58333bf301133b7d04ac55a143a789cf2d --- .../kotlin/jps/build/KotlinJpsBuildTest.kt | 3 +- .../jps/build/KotlinJpsBuildTestBase.kt | 24 +++++++++++- .../kotlin/jps/targets/KotlinTargetsIndex.kt | 39 +------------------ 3 files changed, 26 insertions(+), 40 deletions(-) diff --git a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt index d50c06a2451..dde0a945584 100644 --- a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt +++ b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt @@ -192,7 +192,7 @@ open class KotlinJpsBuildTest : KotlinJpsBuildTestBase() { } fun testKotlinJavaScriptProjectWithCustomOutputPaths() { - initProject(JS_STDLIB) + initProject(JS_STDLIB_WITHOUT_FACET) buildAllModules().assertSuccessful() checkOutputFilesList(File(workDir, "target")) @@ -243,6 +243,7 @@ open class KotlinJpsBuildTest : KotlinJpsBuildTestBase() { fun testKotlinJavaScriptProjectWithDirectoryAsStdlib() { initProject() + setupKotlinJSFacet() val jslibJar = PathUtil.kotlinPathsForDistDirectory.jsStdLibJarPath val jslibDir = File(workDir, "KotlinJavaScript") try { diff --git a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTestBase.kt b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTestBase.kt index 935c3542e6e..2e471188072 100644 --- a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTestBase.kt +++ b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTestBase.kt @@ -11,6 +11,10 @@ import org.jetbrains.jps.model.java.JpsJavaExtensionService import org.jetbrains.jps.model.module.JpsModule import org.jetbrains.jps.util.JpsPathUtil import org.jetbrains.kotlin.idea.test.runAll +import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments +import org.jetbrains.kotlin.config.KotlinFacetSettings +import org.jetbrains.kotlin.jps.model.JpsKotlinFacetModuleExtension +import org.jetbrains.kotlin.platform.js.JsPlatforms import java.io.File import java.nio.file.Paths @@ -55,6 +59,7 @@ abstract class KotlinJpsBuildTestBase : AbstractKotlinJpsBuildTestCase() { NONE, JVM_MOCK_RUNTIME, JVM_FULL_RUNTIME, + JS_STDLIB_WITHOUT_FACET, JS_STDLIB, } @@ -66,7 +71,24 @@ abstract class KotlinJpsBuildTestBase : AbstractKotlinJpsBuildTestCase() { LibraryDependency.NONE -> {} LibraryDependency.JVM_MOCK_RUNTIME -> addKotlinMockRuntimeDependency() LibraryDependency.JVM_FULL_RUNTIME -> addKotlinStdlibDependency() - LibraryDependency.JS_STDLIB -> addKotlinJavaScriptStdlibDependency() + LibraryDependency.JS_STDLIB_WITHOUT_FACET -> addKotlinJavaScriptStdlibDependency() + LibraryDependency.JS_STDLIB -> { + addKotlinJavaScriptStdlibDependency() + setupKotlinJSFacet() + } + } + } + + protected fun setupKotlinJSFacet() { + myProject.modules.forEach { + val facet = KotlinFacetSettings() + facet.compilerArguments = K2JSCompilerArguments() + facet.targetPlatform = JsPlatforms.defaultJsPlatform + + it.container.setChild( + JpsKotlinFacetModuleExtension.KIND, + JpsKotlinFacetModuleExtension(facet) + ) } } diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinTargetsIndex.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinTargetsIndex.kt index 7457f3fe9dc..ac567512607 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinTargetsIndex.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/targets/KotlinTargetsIndex.kt @@ -8,18 +8,14 @@ package org.jetbrains.kotlin.jps.targets import org.jetbrains.jps.incremental.ModuleBuildTarget import org.jetbrains.jps.model.java.JpsJavaClasspathKind import org.jetbrains.jps.model.java.JpsJavaExtensionService -import org.jetbrains.jps.model.library.JpsOrderRootType -import org.jetbrains.jps.util.JpsPathUtil import org.jetbrains.kotlin.jps.build.KotlinBuilder import org.jetbrains.kotlin.jps.build.KotlinChunk import org.jetbrains.kotlin.jps.build.KotlinCompileContext import org.jetbrains.kotlin.jps.build.ModuleBuildTarget import org.jetbrains.kotlin.jps.model.platform import org.jetbrains.kotlin.platform.DefaultIdeTargetPlatformKindProvider -import org.jetbrains.kotlin.platform.IdePlatformKind import org.jetbrains.kotlin.platform.idePlatformKind import org.jetbrains.kotlin.platform.impl.* -import org.jetbrains.kotlin.utils.LibraryUtils import kotlin.system.measureTimeMillis class KotlinTargetsIndex( @@ -32,7 +28,6 @@ internal class KotlinTargetsIndexBuilder internal constructor( private val uninitializedContext: KotlinCompileContext ) { private val byJpsModuleBuildTarget = mutableMapOf>() - private val isKotlinJsStdlibJar = mutableMapOf() private val chunks = mutableListOf() fun build(): KotlinTargetsIndex { @@ -132,10 +127,9 @@ internal class KotlinTargetsIndexBuilder internal constructor( return dependencies } - private fun ensureLoaded(target: ModuleBuildTarget): KotlinModuleBuildTarget<*> { return byJpsModuleBuildTarget.computeIfAbsent(target) { - val platform = target.module.platform?.idePlatformKind ?: detectTargetPlatform(target) + val platform = target.module.platform?.idePlatformKind ?: DefaultIdeTargetPlatformKindProvider.defaultPlatform.idePlatformKind when { platform.isCommon -> KotlinCommonModuleBuildTarget(uninitializedContext, target) @@ -145,35 +139,4 @@ internal class KotlinTargetsIndexBuilder internal constructor( } } } - - /** - * Compatibility for KT-14082 - * todo: remove when all projects migrated to facets - */ - private fun detectTargetPlatform(target: ModuleBuildTarget): IdePlatformKind<*> { - if (hasJsStdLib(target)) return JsIdePlatformKind - - return DefaultIdeTargetPlatformKindProvider.defaultPlatform.idePlatformKind - } - - private fun hasJsStdLib(target: ModuleBuildTarget): Boolean { - JpsJavaExtensionService.dependencies(target.module) - .recursively() - .exportedOnly() - .includedIn(JpsJavaClasspathKind.compile(target.isTests)) - .libraries - .forEach { library -> - for (root in library.getRoots(JpsOrderRootType.COMPILED)) { - val url = root.url - - val isKotlinJsLib = isKotlinJsStdlibJar.computeIfAbsent(url) { - LibraryUtils.isKotlinJavascriptStdLibrary(JpsPathUtil.urlToFile(url)) - } - - if (isKotlinJsLib) return true - } - } - - return false - } } \ No newline at end of file