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 {
|
): To {
|
||||||
if (from == to) return to
|
if (from == to) return to
|
||||||
|
|
||||||
|
val toMemberProperties = to::class.memberProperties.associateBy { it.name }
|
||||||
|
|
||||||
for (fromProperty in propertiesToCopy) {
|
for (fromProperty in propertiesToCopy) {
|
||||||
@Suppress("UNCHECKED_CAST")
|
@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
|
?: continue
|
||||||
val fromValue = fromProperty.get(from)
|
val fromValue = fromProperty.get(from)
|
||||||
if (filter != null && !filter(fromProperty, fromValue)) continue
|
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 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 {
|
override fun contentScope(): GlobalSearchScope {
|
||||||
return enlargedSearchScope(ModuleProductionSourceScope(module), module, isTestScope = false)
|
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 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)
|
override fun contentScope(): GlobalSearchScope = enlargedSearchScope(ModuleTestSourceScope(module), module, isTestScope = true)
|
||||||
|
|
||||||
|
|||||||
+10
-3
@@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.caches.project
|
package org.jetbrains.kotlin.idea.caches.project
|
||||||
|
|
||||||
import com.intellij.openapi.module.Module
|
|
||||||
import com.intellij.openapi.module.ModuleManager
|
import com.intellij.openapi.module.ModuleManager
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.openapi.projectRoots.Sdk
|
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.idea.util.getProjectJdkTableSafe
|
||||||
import org.jetbrains.kotlin.platform.TargetPlatform
|
import org.jetbrains.kotlin.platform.TargetPlatform
|
||||||
import org.jetbrains.kotlin.platform.isCommon
|
import org.jetbrains.kotlin.platform.isCommon
|
||||||
|
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus.checkCanceled
|
||||||
import org.jetbrains.kotlin.types.typeUtil.closure
|
import org.jetbrains.kotlin.types.typeUtil.closure
|
||||||
import java.util.concurrent.ConcurrentHashMap
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
|
|
||||||
@@ -67,8 +67,15 @@ private fun collectModuleInfosFromIdeaModel(
|
|||||||
}
|
}
|
||||||
|
|
||||||
return IdeaModelInfosCache(
|
return IdeaModelInfosCache(
|
||||||
moduleSourceInfos = ideaModules.flatMap(Module::correspondingModuleInfos),
|
moduleSourceInfos = ideaModules.flatMap {
|
||||||
libraryInfos = ideaLibraries.flatMap { createLibraryInfo(project, it) },
|
checkCanceled()
|
||||||
|
it.correspondingModuleInfos()
|
||||||
|
},
|
||||||
|
libraryInfos = ideaLibraries.flatMap {
|
||||||
|
checkCanceled()
|
||||||
|
|
||||||
|
createLibraryInfo(project, it)
|
||||||
|
},
|
||||||
sdkInfos = (sdksFromModulesDependencies + getAllProjectSdks()).filterNotNull().toSet().map { SdkInfo(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.Notification
|
||||||
import com.intellij.notification.NotificationType
|
import com.intellij.notification.NotificationType
|
||||||
import com.intellij.openapi.Disposable
|
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.application.ReadAction.nonBlocking
|
||||||
import com.intellij.openapi.components.ProjectComponent
|
import com.intellij.openapi.components.ProjectComponent
|
||||||
import com.intellij.openapi.project.Project
|
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.caches.project.getModuleInfosFromIdeaModel
|
||||||
import org.jetbrains.kotlin.idea.configuration.klib.KotlinNativeLibraryNameUtil.isGradleLibraryName
|
import org.jetbrains.kotlin.idea.configuration.klib.KotlinNativeLibraryNameUtil.isGradleLibraryName
|
||||||
import org.jetbrains.kotlin.idea.configuration.klib.KotlinNativeLibraryNameUtil.parseIDELibraryName
|
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.UnsupportedAbiVersionNotificationPanelProvider
|
||||||
import org.jetbrains.kotlin.idea.versions.bundledRuntimeVersion
|
import org.jetbrains.kotlin.idea.versions.bundledRuntimeVersion
|
||||||
import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME
|
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 */
|
/** TODO: merge [KotlinNativeABICompatibilityChecker] in the future with [UnsupportedAbiVersionNotificationPanelProvider], KT-34525 */
|
||||||
class KotlinNativeABICompatibilityChecker(private val project: Project) : ProjectComponent, Disposable {
|
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> {
|
private fun getLibrariesToNotifyAbout(): Map<String, NativeKlibLibraryInfo> {
|
||||||
val incompatibleLibraries = getModuleInfosFromIdeaModel(project).asSequence()
|
val incompatibleLibraries = getModuleInfosFromIdeaModel(project)
|
||||||
.filterIsInstance<NativeKlibLibraryInfo>()
|
.filterIsInstance<NativeKlibLibraryInfo>()
|
||||||
.filter { !it.compatibilityInfo.isCompatible }
|
.filter { !it.compatibilityInfo.isCompatible }
|
||||||
.associateBy { it.libraryRoot }
|
.associateBy { it.libraryRoot }
|
||||||
|
|||||||
+1
-1
@@ -87,7 +87,7 @@ class KotlinNativeABICompatibilityChecker(private val project: Project) : Projec
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun getLibrariesToNotifyAbout(): Map<String, NativeKlibLibraryInfo> {
|
private fun getLibrariesToNotifyAbout(): Map<String, NativeKlibLibraryInfo> {
|
||||||
val incompatibleLibraries = getModuleInfosFromIdeaModel(project).asSequence()
|
val incompatibleLibraries = getModuleInfosFromIdeaModel(project)
|
||||||
.filterIsInstance<NativeKlibLibraryInfo>()
|
.filterIsInstance<NativeKlibLibraryInfo>()
|
||||||
.filter { !it.compatibilityInfo.isCompatible }
|
.filter { !it.compatibilityInfo.isCompatible }
|
||||||
.associateBy { it.libraryRoot }
|
.associateBy { it.libraryRoot }
|
||||||
|
|||||||
Reference in New Issue
Block a user