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:
+3
-1
@@ -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)
|
||||
|
||||
|
||||
+10
-3
@@ -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) }
|
||||
)
|
||||
}
|
||||
|
||||
+4
-3
@@ -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 }
|
||||
|
||||
+1
-1
@@ -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 }
|
||||
|
||||
Reference in New Issue
Block a user