Make cancellation checks when building resolution anchor caches

^KT-39734
This commit is contained in:
Pavel Kirpichenkov
2020-08-01 12:39:49 +03:00
parent 54811613f4
commit b5aca450b1
2 changed files with 5 additions and 2 deletions
@@ -12,6 +12,7 @@ import com.intellij.util.CommonProcessors
import org.jetbrains.kotlin.idea.caches.resolve.ResolutionAnchorCacheService import org.jetbrains.kotlin.idea.caches.resolve.ResolutionAnchorCacheService
import org.jetbrains.kotlin.idea.caches.trackers.ModuleDependencyProviderExtension import org.jetbrains.kotlin.idea.caches.trackers.ModuleDependencyProviderExtension
import org.jetbrains.kotlin.idea.project.libraryToSourceAnalysisEnabled import org.jetbrains.kotlin.idea.project.libraryToSourceAnalysisEnabled
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus.checkCanceled
class ResolutionAnchorModuleDependencyProviderExtension(private val project: Project) : ModuleDependencyProviderExtension { class ResolutionAnchorModuleDependencyProviderExtension(private val project: Project) : ModuleDependencyProviderExtension {
/** /**
@@ -32,6 +33,7 @@ class ResolutionAnchorModuleDependencyProviderExtension(private val project: Pro
val resolutionAnchorDependencies = HashSet<ModuleSourceInfo>() val resolutionAnchorDependencies = HashSet<ModuleSourceInfo>()
ModuleRootManager.getInstance(module).orderEntries().recursively().forEachLibrary { library -> ModuleRootManager.getInstance(module).orderEntries().recursively().forEachLibrary { library ->
getIdeaModelInfosCache(project).getLibraryInfosForLibrary(library).flatMapTo(resolutionAnchorDependencies) { libraryInfo -> getIdeaModelInfosCache(project).getLibraryInfosForLibrary(library).flatMapTo(resolutionAnchorDependencies) { libraryInfo ->
checkCanceled()
ResolutionAnchorCacheService.getInstance(project).getDependencyResolutionAnchors(libraryInfo) ResolutionAnchorCacheService.getInstance(project).getDependencyResolutionAnchors(libraryInfo)
} }
true true
@@ -19,7 +19,7 @@ import org.jetbrains.kotlin.idea.caches.project.LibraryDependenciesCache
import org.jetbrains.kotlin.idea.caches.project.LibraryInfo import org.jetbrains.kotlin.idea.caches.project.LibraryInfo
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
import org.jetbrains.kotlin.idea.caches.project.getModuleInfosFromIdeaModel import org.jetbrains.kotlin.idea.caches.project.getModuleInfosFromIdeaModel
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus.checkCanceled
import org.jetbrains.kotlin.types.typeUtil.closure import org.jetbrains.kotlin.types.typeUtil.closure
import org.jetbrains.kotlin.utils.addToStdlib.cast import org.jetbrains.kotlin.utils.addToStdlib.cast
@@ -81,6 +81,7 @@ class ResolutionAnchorCacheServiceImpl(val project: Project) :
val allTransitiveLibraryDependencies = with(LibraryDependenciesCache.getInstance(project)) { val allTransitiveLibraryDependencies = with(LibraryDependenciesCache.getInstance(project)) {
val (directDependenciesOnLibraries, _) = getLibrariesAndSdksUsedWith(libraryInfo) val (directDependenciesOnLibraries, _) = getLibrariesAndSdksUsedWith(libraryInfo)
directDependenciesOnLibraries.closure { libraryDependency -> directDependenciesOnLibraries.closure { libraryDependency ->
checkCanceled()
getLibrariesAndSdksUsedWith(libraryDependency).first getLibrariesAndSdksUsedWith(libraryDependency).first
} }
} }
@@ -90,7 +91,7 @@ class ResolutionAnchorCacheServiceImpl(val project: Project) :
private fun associateModulesByNames(): Map<String, ModuleInfo> { private fun associateModulesByNames(): Map<String, ModuleInfo> {
return getModuleInfosFromIdeaModel(project).associateBy { moduleInfo -> return getModuleInfosFromIdeaModel(project).associateBy { moduleInfo ->
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled() checkCanceled()
when (moduleInfo) { when (moduleInfo) {
is LibraryInfo -> moduleInfo.library.name ?: "" // TODO: when does library have no name? is LibraryInfo -> moduleInfo.library.name ?: "" // TODO: when does library have no name?
is ModuleSourceInfo -> moduleInfo.module.name is ModuleSourceInfo -> moduleInfo.module.name