Fix KotlinNativeABICompatibilityChecker.getLibrariesToNotifyAbout freeze

Get rid of O(n^2) in copyProperties
make ModuleProductionSourceInfo.stableName lazy
add checkCanceled in loops in IdeaModelInfosCache

#KT-38318 Fixed
This commit is contained in:
Vladimir Dolzhenko
2020-04-17 10:13:07 +02:00
parent 06275a201c
commit 86a02c07f6
5 changed files with 20 additions and 10 deletions
@@ -55,9 +55,11 @@ private fun <From : Any, To : Any> copyProperties(
): To {
if (from == to) return to
val toMemberProperties = to::class.memberProperties.associateBy { it.name }
for (fromProperty in propertiesToCopy) {
@Suppress("UNCHECKED_CAST")
val toProperty = to::class.memberProperties.firstOrNull { it.name == fromProperty.name } as? KMutableProperty1<To, Any?>
val toProperty = toMemberProperties[fromProperty.name] as? KMutableProperty1<To, Any?>
?: continue
val fromValue = fromProperty.get(from)
if (filter != null && !filter(fromProperty, fromValue)) continue
@@ -213,7 +213,7 @@ data class ModuleProductionSourceInfo internal constructor(
override val name = Name.special("<production sources for module ${module.name}>")
override val stableName: Name = module.getStableName()
override val stableName: Name by lazy { module.getStableName() }
override fun contentScope(): GlobalSearchScope {
return enlargedSearchScope(ModuleProductionSourceScope(module), module, isTestScope = false)
@@ -229,7 +229,7 @@ data class ModuleTestSourceInfo internal constructor(override val module: Module
override val displayedName get() = KotlinIdeaAnalysisBundle.message("module.name.0.test", module.name)
override val stableName: Name = module.getStableName()
override val stableName: Name by lazy { module.getStableName() }
override fun contentScope(): GlobalSearchScope = enlargedSearchScope(ModuleTestSourceScope(module), module, isTestScope = true)
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.idea.caches.project
import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.projectRoots.Sdk
@@ -16,6 +15,7 @@ import org.jetbrains.kotlin.caches.project.cacheInvalidatingOnRootModifications
import org.jetbrains.kotlin.idea.util.getProjectJdkTableSafe
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.platform.isCommon
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus.checkCanceled
import org.jetbrains.kotlin.types.typeUtil.closure
import java.util.concurrent.ConcurrentHashMap
@@ -67,8 +67,15 @@ private fun collectModuleInfosFromIdeaModel(
}
return IdeaModelInfosCache(
moduleSourceInfos = ideaModules.flatMap(Module::correspondingModuleInfos),
libraryInfos = ideaLibraries.flatMap { createLibraryInfo(project, it) },
moduleSourceInfos = ideaModules.flatMap {
checkCanceled()
it.correspondingModuleInfos()
},
libraryInfos = ideaLibraries.flatMap {
checkCanceled()
createLibraryInfo(project, it)
},
sdkInfos = (sdksFromModulesDependencies + getAllProjectSdks()).filterNotNull().toSet().map { SdkInfo(project, it) }
)
}
@@ -9,7 +9,8 @@ import com.intellij.ProjectTopics
import com.intellij.notification.Notification
import com.intellij.notification.NotificationType
import com.intellij.openapi.Disposable
import com.intellij.openapi.application.*
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.ModalityState
import com.intellij.openapi.application.ReadAction.nonBlocking
import com.intellij.openapi.components.ProjectComponent
import com.intellij.openapi.project.Project
@@ -23,10 +24,10 @@ import org.jetbrains.concurrency.CancellablePromise
import org.jetbrains.kotlin.idea.caches.project.getModuleInfosFromIdeaModel
import org.jetbrains.kotlin.idea.configuration.klib.KotlinNativeLibraryNameUtil.isGradleLibraryName
import org.jetbrains.kotlin.idea.configuration.klib.KotlinNativeLibraryNameUtil.parseIDELibraryName
import org.jetbrains.kotlin.idea.klib.KlibCompatibilityInfo.IncompatibleMetadata
import org.jetbrains.kotlin.idea.versions.UnsupportedAbiVersionNotificationPanelProvider
import org.jetbrains.kotlin.idea.versions.bundledRuntimeVersion
import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME
import org.jetbrains.kotlin.idea.klib.KlibCompatibilityInfo.IncompatibleMetadata
/** TODO: merge [KotlinNativeABICompatibilityChecker] in the future with [UnsupportedAbiVersionNotificationPanelProvider], KT-34525 */
class KotlinNativeABICompatibilityChecker(private val project: Project) : ProjectComponent, Disposable {
@@ -86,7 +87,7 @@ class KotlinNativeABICompatibilityChecker(private val project: Project) : Projec
}
private fun getLibrariesToNotifyAbout(): Map<String, NativeKlibLibraryInfo> {
val incompatibleLibraries = getModuleInfosFromIdeaModel(project).asSequence()
val incompatibleLibraries = getModuleInfosFromIdeaModel(project)
.filterIsInstance<NativeKlibLibraryInfo>()
.filter { !it.compatibilityInfo.isCompatible }
.associateBy { it.libraryRoot }
@@ -87,7 +87,7 @@ class KotlinNativeABICompatibilityChecker(private val project: Project) : Projec
}
private fun getLibrariesToNotifyAbout(): Map<String, NativeKlibLibraryInfo> {
val incompatibleLibraries = getModuleInfosFromIdeaModel(project).asSequence()
val incompatibleLibraries = getModuleInfosFromIdeaModel(project)
.filterIsInstance<NativeKlibLibraryInfo>()
.filter { !it.compatibilityInfo.isCompatible }
.associateBy { it.libraryRoot }