[collab/github/gitlab] chore: supply names to coroutine scopes

GitOrigin-RevId: febe05474c6ed33b1b8e4f079917fea7d41b50a2
This commit is contained in:
Ivan Semenov
2025-09-11 14:45:50 +00:00
committed by intellij-monorepo-bot
parent 8d489a2402
commit 07f526c9cb
49 changed files with 121 additions and 146 deletions
@@ -11,6 +11,7 @@ import com.intellij.openapi.extensions.ExtensionPointListener
import com.intellij.openapi.extensions.ExtensionPointName
import com.intellij.openapi.extensions.PluginDescriptor
import com.intellij.openapi.util.Disposer
import com.intellij.platform.util.coroutines.childScope
import com.intellij.util.cancelOnDispose
import com.intellij.util.containers.HashingStrategy
import com.intellij.util.containers.toArray
@@ -22,6 +23,18 @@ import kotlinx.coroutines.flow.*
import org.jetbrains.annotations.ApiStatus
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext
import kotlin.reflect.KClass
/**
* @see com.intellij.platform.util.coroutines.childScope(kotlinx.coroutines.CoroutineScope, java.lang.String, kotlin.coroutines.CoroutineContext, boolean)
*/
fun CoroutineScope.childScope(
owner: KClass<*>,
context: CoroutineContext = EmptyCoroutineContext,
supervisor: Boolean = true,
): CoroutineScope {
return childScope(owner.qualifiedName ?: owner.toString(), context, supervisor)
}
/**
* Prefer creating a service to supply a parent scope
@@ -130,7 +143,7 @@ suspend fun <T1, T2, T3> combineAndCollect(
}
}
fun Flow<Boolean>.inverted() = map { !it }
fun Flow<Boolean>.inverted(): Flow<Boolean> = map { !it }
@ApiStatus.Experimental
fun <T, M> StateFlow<T>.mapState(
@@ -256,7 +269,7 @@ private fun <T, R> Flow<T>.mapScoped2(mapper: suspend CoroutineScope.(T) -> R):
fun <T, R> Flow<T?>.mapNullableScoped(mapper: CoroutineScope.(T) -> R): Flow<R?> = mapScoped2 { if (it == null) null else mapper(it) }
@ApiStatus.Experimental
suspend fun <T> Flow<T>.collectScoped(block: suspend CoroutineScope.(T) -> Unit) = mapScoped2(block).collect()
suspend fun <T> Flow<T>.collectScoped(block: suspend CoroutineScope.(T) -> Unit): Unit = mapScoped2(block).collect()
@ApiStatus.Experimental
suspend fun <T> Flow<T>.collectWithPrevious(initial: T, collector: suspend (prev: T, current: T) -> Unit) {
@@ -1,10 +1,10 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.collaboration.ui.codereview.comment
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.util.ComputedResult
import com.intellij.collaboration.util.SingleCoroutineLauncher
import com.intellij.openapi.project.Project
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.channels.Channel
@@ -36,7 +36,7 @@ abstract class CodeReviewSubmittableTextViewModelBase(
parentCs: CoroutineScope,
initialText: String
) : CodeReviewSubmittableTextViewModel {
protected val cs = parentCs.childScope()
protected val cs: CoroutineScope = parentCs.childScope(this::class)
private val taskLauncher = SingleCoroutineLauncher(cs)
final override val text: MutableStateFlow<String> = MutableStateFlow(initialText)
@@ -1,13 +1,13 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.collaboration.ui.codereview.details.model
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.ui.SimpleEventListener
import com.intellij.collaboration.ui.codereview.details.model.CodeReviewChangeListViewModel.SelectionRequest
import com.intellij.collaboration.util.ChangesSelection
import com.intellij.collaboration.util.RefComparisonChange
import com.intellij.openapi.actionSystem.DataKey
import com.intellij.openapi.project.Project
import com.intellij.platform.util.coroutines.childScope
import com.intellij.util.EventDispatcher
import com.intellij.util.concurrency.annotations.RequiresEdt
import kotlinx.coroutines.CoroutineScope
@@ -88,7 +88,7 @@ abstract class CodeReviewChangeListViewModelBase(
parentCs: CoroutineScope,
protected val changeList: CodeReviewChangeList
) : CodeReviewChangeListViewModel {
protected val cs = parentCs.childScope()
protected val cs: CoroutineScope = parentCs.childScope(this::class)
private val _selectionRequests = MutableSharedFlow<SelectionRequest>(replay = 1)
override val selectionRequests: SharedFlow<SelectionRequest> = _selectionRequests.asSharedFlow()
@@ -2,6 +2,7 @@
package com.intellij.collaboration.ui.toolwindow
import com.intellij.collaboration.async.cancelledWith
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.async.launchNow
import com.intellij.openapi.application.EDT
import com.intellij.openapi.util.Disposer
@@ -49,7 +50,7 @@ private class ReviewToolwindowTabsManager<
) {
private val contentManager = toolwindow.contentManager
private val projectVm = reviewToolwindowViewModel.projectVm
private val cs = parentCs.childScope(Dispatchers.EDT)
private val cs = parentCs.childScope(this::class, Dispatchers.EDT)
init {
contentManager.addUiDataProvider { sink ->
@@ -2,9 +2,9 @@
package org.jetbrains.plugins.github.authentication.accounts
import com.github.benmanes.caffeine.cache.Caffeine
import com.intellij.collaboration.async.childScope
import com.intellij.openapi.components.Service
import com.intellij.openapi.components.service
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.async
@@ -23,7 +23,7 @@ import java.time.temporal.ChronoUnit
@ApiStatus.Internal
@Service(Service.Level.APP)
class GHCachingAccountInformationProvider(serviceCs: CoroutineScope) {
private val cs = serviceCs.childScope()
private val cs = serviceCs.childScope(this::class)
private val informationCache = Caffeine.newBuilder()
.expireAfterWrite(Duration.of(30, ChronoUnit.MINUTES))
@@ -1,9 +1,9 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.github.extensions
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.util.serviceGet
import com.intellij.openapi.components.Service
import com.intellij.platform.util.coroutines.childScope
import git4idea.remote.hosting.http.HostedGitAuthenticationFailureManager
import kotlinx.coroutines.CoroutineScope
import org.jetbrains.plugins.github.authentication.accounts.GHAccountManager
@@ -11,4 +11,5 @@ import org.jetbrains.plugins.github.authentication.accounts.GithubAccount
@Service(Service.Level.PROJECT)
internal class GHGitAuthenticationFailureManager(parentCs: CoroutineScope)
: HostedGitAuthenticationFailureManager<GithubAccount>(serviceGet<GHAccountManager>(), parentCs.childScope())
: HostedGitAuthenticationFailureManager<GithubAccount>(serviceGet<GHAccountManager>(),
parentCs.childScope(GHGitAuthenticationFailureManager::class))
@@ -1,6 +1,7 @@
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.plugins.github.pullrequest
import com.intellij.collaboration.async.childScope
import com.intellij.openapi.components.Service
import com.intellij.openapi.components.service
import com.intellij.openapi.fileEditor.FileEditor
@@ -10,7 +11,6 @@ import com.intellij.openapi.progress.ProcessCanceledException
import com.intellij.openapi.project.DumbAware
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -30,7 +30,7 @@ internal class GHPREditorProvider : FileEditorProvider, DumbAware {
@Service(Service.Level.PROJECT)
private class GHPREditorProviderService(parentCs: CoroutineScope) {
private val cs = parentCs.childScope(Dispatchers.Main)
private val cs = parentCs.childScope(this::class, Dispatchers.Main)
fun createTimelineEditor(file: GHPRTimelineVirtualFile): FileEditor {
val projectVm = file.findProjectVm() ?: throw ProcessCanceledException()
@@ -4,6 +4,7 @@ package org.jetbrains.plugins.github.pullrequest.data.provider
import com.google.common.graph.GraphBuilder
import com.google.common.graph.ImmutableGraph
import com.google.common.graph.Traverser
import com.intellij.collaboration.async.childScope
import com.intellij.openapi.diff.impl.patch.FilePatch
import com.intellij.platform.util.coroutines.childScope
import git4idea.changes.GitBranchComparisonResult
@@ -80,7 +81,7 @@ internal class GHPRChangesDataProviderImpl(parentCs: CoroutineScope,
}
private inner class ChangesDataLoader(parentCs: CoroutineScope, val refs: GHPRBranchesRefs) {
private val cs = parentCs.childScope()
private val cs = parentCs.childScope(this::class)
private val referencesRequest = cs.async(start = CoroutineStart.LAZY) {
val mergeBaseRef = changesService.loadMergeBaseOid(refs.baseRef, refs.headRef)
@@ -1,7 +1,7 @@
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.plugins.github.pullrequest.data.provider
import com.intellij.platform.util.coroutines.childScope
import com.intellij.collaboration.async.childScope
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.Flow
import org.jetbrains.plugins.github.api.data.pullrequest.GHPullRequestFileViewedState
@@ -13,7 +13,7 @@ internal class GHPRViewedStateDataProviderImpl(
private val filesService: GHPRFilesService,
private val pullRequestId: GHPRIdentifier,
) : GHPRViewedStateDataProvider {
private val cs = parentCs.childScope()
private val cs = parentCs.childScope(this::class)
private val loader = LoaderWithMutableCache(cs) {
filesService.loadFiles(pullRequestId).associateBy({ it.path }, { it.viewerViewedState })
@@ -1,15 +1,11 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.github.pullrequest.ui
import com.intellij.collaboration.async.combineState
import com.intellij.collaboration.async.launchNow
import com.intellij.collaboration.async.mapScoped
import com.intellij.collaboration.async.mapState
import com.intellij.collaboration.async.*
import com.intellij.collaboration.util.URIUtil
import com.intellij.openapi.components.Service
import com.intellij.openapi.components.service
import com.intellij.openapi.project.Project
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
@@ -32,7 +28,7 @@ class GHPRProjectViewModel(private val project: Project, parentCs: CoroutineScop
private val settings: GithubPullRequestsProjectUISettings
get() = GithubPullRequestsProjectUISettings.getInstance(project)
private val cs = parentCs.childScope()
private val cs = parentCs.childScope(this::class)
val isAvailable: StateFlow<Boolean> = repositoriesManager.knownRepositoriesState.mapState(cs) {
it.isNotEmpty()
@@ -1,6 +1,7 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.github.pullrequest.ui.details
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.messages.CollaborationToolsBundle
import com.intellij.collaboration.ui.VerticalListPanel
import com.intellij.collaboration.ui.codereview.avatar.CodeReviewAvatarUtils
@@ -13,7 +14,6 @@ import com.intellij.collaboration.ui.util.toAnAction
import com.intellij.icons.AllIcons
import com.intellij.openapi.actionSystem.DefaultActionGroup
import com.intellij.openapi.project.Project
import com.intellij.platform.util.coroutines.childScope
import com.intellij.ui.ExperimentalUI
import com.intellij.ui.ScrollPaneFactory
import com.intellij.ui.components.panels.Wrapper
@@ -45,7 +45,7 @@ object GHPRStatusChecksComponentFactory {
project: Project,
detailsVm: GHPRDetailsViewModel,
): JComponent {
val scope = parentScope.childScope(Dispatchers.Main.immediate)
val scope = parentScope.childScope(this::class, Dispatchers.Main.immediate)
val reviewStatusVm = detailsVm.statusVm
val reviewFlowVm = detailsVm.reviewFlowVm
@@ -1,15 +1,11 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.github.pullrequest.ui.details.model
import com.intellij.collaboration.async.launchNow
import com.intellij.collaboration.async.mapState
import com.intellij.collaboration.async.modelFlow
import com.intellij.collaboration.async.withInitial
import com.intellij.collaboration.async.*
import com.intellij.collaboration.ui.codereview.details.model.CodeReviewBranches
import com.intellij.collaboration.ui.codereview.details.model.CodeReviewBranchesViewModel
import com.intellij.openapi.diagnostic.thisLogger
import com.intellij.openapi.project.Project
import com.intellij.platform.util.coroutines.childScope
import git4idea.GitStandardRemoteBranch
import git4idea.remote.hosting.GitRemoteBranchesUtil
import git4idea.remote.hosting.HostedGitRepositoryRemote
@@ -31,7 +27,7 @@ class GHPRBranchesViewModel internal constructor(
private val mapping: GHGitRepositoryMapping,
private val detailsState: StateFlow<GHPullRequest>
) : CodeReviewBranchesViewModel {
private val cs = parentCs.childScope()
private val cs = parentCs.childScope(this::class)
private val gitRepository = mapping.remote.repository
@@ -1,6 +1,7 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.github.pullrequest.ui.details.model
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.async.launchNow
import com.intellij.collaboration.async.modelFlow
import com.intellij.collaboration.ui.codereview.details.data.CodeReviewCIJob
@@ -8,7 +9,6 @@ import com.intellij.collaboration.ui.codereview.details.model.CodeReviewStatusVi
import com.intellij.collaboration.util.getOrNull
import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.project.Project
import com.intellij.platform.util.coroutines.childScope
import git4idea.repo.GitRepository
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.*
@@ -40,7 +40,7 @@ class GHPRStatusViewModelImpl(
detailsData: GHPRDetailsDataProvider,
detailsState: StateFlow<GHPullRequest>,
) : GHPRStatusViewModel {
private val cs = parentCs.childScope()
private val cs = parentCs.childScope(this::class)
override val viewerDidAuthor: Boolean = detailsState.value.viewerDidAuthor
@@ -1,6 +1,7 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.github.pullrequest.ui.details.model.impl
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.async.modelFlow
import com.intellij.collaboration.async.stateInNow
import com.intellij.collaboration.async.withInitial
@@ -11,7 +12,6 @@ import com.intellij.collaboration.util.ComputedResult
import com.intellij.collaboration.util.RefComparisonChange
import com.intellij.openapi.diagnostic.thisLogger
import com.intellij.openapi.project.Project
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
import org.jetbrains.annotations.ApiStatus
@@ -41,7 +41,7 @@ internal class GHPRChangesViewModelImpl(
private val dataProvider: GHPRDataProvider,
private val openPullRequestDiff: (GHPRIdentifier?, Boolean) -> Unit,
) : GHPRChangesViewModel {
private val cs = parentCs.childScope()
private val cs = parentCs.childScope(this::class)
override val changesLoadingErrorHandler = GHApiLoadingErrorHandler(project, dataContext.securityService.account, GHLoginSource.PR_CHANGES) {
cs.launch {
@@ -1,6 +1,7 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.github.pullrequest.ui.details.model.impl
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.async.modelFlow
import com.intellij.collaboration.messages.CollaborationToolsBundle
import com.intellij.collaboration.ui.codereview.action.ReviewMergeCommitMessageDialog
@@ -18,7 +19,6 @@ import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.text.StringUtil
import com.intellij.platform.util.coroutines.childScope
import com.intellij.ui.awt.RelativePoint
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -61,7 +61,7 @@ class GHPRReviewFlowViewModelImpl internal constructor(
private val changesData: GHPRChangesDataProvider,
private val reviewVmHelper: GHPRReviewViewModelHelper
) : GHPRReviewFlowViewModel {
private val cs = parentCs.childScope()
private val cs = parentCs.childScope(this::class)
private val taskLauncher = SingleCoroutineLauncher(cs)
@@ -1,11 +1,11 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.github.pullrequest.ui.review
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.async.stateInNow
import com.intellij.collaboration.util.ComputedResult
import com.intellij.openapi.actionSystem.DataKey
import com.intellij.openapi.diagnostic.logger
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.cancel
import kotlinx.coroutines.currentCoroutineContext
@@ -50,7 +50,7 @@ internal class DelegatingGHPRReviewViewModel(private val helper: GHPRReviewViewM
}
internal class GHPRReviewViewModelHelper(parentCs: CoroutineScope, private val dataProvider: GHPRDataProvider) {
private val cs = parentCs.childScope()
private val cs = parentCs.childScope(this::class)
private val reviewData = dataProvider.reviewData
val pendingReviewState: StateFlow<ComputedResult<GHPullRequestPendingReview?>> =
@@ -1,9 +1,9 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.github.pullrequest.ui.review
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.ui.codereview.review.CodeReviewSubmitViewModel
import com.intellij.collaboration.util.SingleCoroutineLauncher
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.MutableStateFlow
@@ -42,7 +42,7 @@ internal class GHPRSubmitReviewViewModelImpl(parentCs: CoroutineScope,
private val pendingReview: GHPullRequestPendingReview?,
private val onDone: suspend () -> Unit)
: GHPRSubmitReviewViewModel {
private val cs = parentCs.childScope()
private val cs = parentCs.childScope(this::class)
private val taskLauncher = SingleCoroutineLauncher(cs)
@@ -1,6 +1,7 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.github.pullrequest.ui.timeline
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.async.stateInNow
import com.intellij.collaboration.ui.codereview.comment.CodeReviewSubmittableTextViewModelBase
import com.intellij.collaboration.ui.codereview.comment.CodeReviewTextEditingViewModel
@@ -9,7 +10,6 @@ import com.intellij.collaboration.util.ComputedResult
import com.intellij.collaboration.util.getOrNull
import com.intellij.collaboration.util.map
import com.intellij.openapi.project.Project
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.cancel
import kotlinx.coroutines.flow.*
@@ -30,7 +30,7 @@ class GHPRDetailsTimelineViewModel internal constructor(private val project: Pro
parentCs: CoroutineScope,
private val dataContext: GHPRDataContext,
private val dataProvider: GHPRDataProvider) {
private val cs = parentCs.childScope()
private val cs = parentCs.childScope(this::class)
private val currentUser: GHUser = dataContext.securityService.currentUser
private val reactionsService: GHReactionsService = dataContext.reactionsService
@@ -1,6 +1,7 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.github.pullrequest.ui.toolwindow.model
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.async.withInitial
import com.intellij.collaboration.util.ComputedResult
import com.intellij.openapi.project.Project
@@ -47,7 +48,7 @@ class GHPRInfoViewModel internal constructor(
pullRequestUrl = details.url
val currentVm = vm
if (currentVm == null) {
val newVm = GHPRDetailsViewModelImpl(project, cs.childScope(), dataContext, dataProvider, details, openPullRequestDiff)
val newVm = GHPRDetailsViewModelImpl(project, cs.childScope(GHPRDetailsViewModelImpl::class), dataContext, dataProvider, details, openPullRequestDiff)
vm = newVm
ComputedResult.success(newVm)
}
@@ -2,12 +2,12 @@
package org.jetbrains.plugins.github.util
import com.github.benmanes.caffeine.cache.Caffeine
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.async.nestedDisposable
import com.intellij.openapi.components.Service
import com.intellij.openapi.components.service
import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.util.LowMemoryWatcher
import com.intellij.platform.util.coroutines.childScope
import com.intellij.util.ImageLoader
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CoroutineScope
@@ -26,7 +26,7 @@ import java.util.concurrent.CompletableFuture
@Service
class CachingGHUserAvatarLoader internal constructor(serviceCs: CoroutineScope) {
private val cs = serviceCs.childScope()
private val cs = serviceCs.childScope(this::class)
private val avatarCache = Caffeine.newBuilder()
.expireAfterAccess(Duration.of(5, ChronoUnit.MINUTES))
@@ -1,16 +1,16 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gitlab.authentication.accounts
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.auth.PersistentDefaultAccountHolder
import com.intellij.openapi.components.*
import com.intellij.openapi.project.Project
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.CoroutineScope
@Service(Service.Level.PROJECT)
@State(name = "GitLabDefaultAccount", storages = [Storage(StoragePathMacros.WORKSPACE_FILE)], reportStatistic = false)
internal class GitLabProjectDefaultAccountHolder(project: Project, parentCs: CoroutineScope)
: PersistentDefaultAccountHolder<GitLabAccount>(project, parentCs.childScope()) {
: PersistentDefaultAccountHolder<GitLabAccount>(project, parentCs.childScope(GitLabProjectDefaultAccountHolder::class)) {
override fun accountManager() = service<GitLabAccountManager>()
override fun notifyDefaultAccountMissing() {
@@ -1,9 +1,9 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gitlab.git.http
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.util.serviceGet
import com.intellij.openapi.components.Service
import com.intellij.platform.util.coroutines.childScope
import git4idea.remote.hosting.http.HostedGitAuthenticationFailureManager
import kotlinx.coroutines.CoroutineScope
import org.jetbrains.plugins.gitlab.authentication.accounts.GitLabAccount
@@ -11,4 +11,4 @@ import org.jetbrains.plugins.gitlab.authentication.accounts.GitLabAccountManager
@Service(Service.Level.PROJECT)
class GitLabGitAuthenticationFailureManager(parentCs: CoroutineScope)
: HostedGitAuthenticationFailureManager<GitLabAccount>(serviceGet<GitLabAccountManager>(), parentCs.childScope())
: HostedGitAuthenticationFailureManager<GitLabAccount>(serviceGet<GitLabAccountManager>(), parentCs.childScope(GitLabGitAuthenticationFailureManager::class))
@@ -1,11 +1,11 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gitlab.mergerequest.action
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.async.combineAndCollect
import com.intellij.collaboration.async.launchNow
import com.intellij.collaboration.messages.CollaborationToolsBundle
import com.intellij.collaboration.ui.util.name
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import org.jetbrains.plugins.gitlab.mergerequest.ui.details.model.GitLabMergeRequestReviewFlowViewModel
@@ -16,7 +16,7 @@ internal class GitLabMergeRequestSubmitReviewAction(
parentCs: CoroutineScope,
private val vm: GitLabMergeRequestReviewFlowViewModel
) : AbstractAction(CollaborationToolsBundle.message("review.start.submit.action")) {
private val cs = parentCs.childScope(Dispatchers.Main)
private val cs = parentCs.childScope(this::class, Dispatchers.Main)
init {
cs.launchNow {
@@ -2,8 +2,6 @@
package org.jetbrains.plugins.gitlab.mergerequest.data
import com.intellij.collaboration.async.*
import com.intellij.openapi.diagnostic.logger
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.sync.Mutex
@@ -43,8 +41,6 @@ interface GitLabMergeRequestDiscussion : GitLabDiscussion {
override val notes: StateFlow<List<GitLabMergeRequestNote>>
}
private val LOG = logger<GitLabDiscussion>()
@OptIn(ExperimentalCoroutinesApi::class)
class LoadedGitLabDiscussion(
parentCs: CoroutineScope,
@@ -67,7 +63,7 @@ class LoadedGitLabDiscussion(
override val id: GitLabGid = discussionData.id
override val createdAt: Date = discussionData.createdAt
private val cs = parentCs.childScope(CoroutineExceptionHandler { _, e -> LOG.warn(e) })
private val cs = parentCs.childScope(this::class)
private val operationsGuard = Mutex()
@@ -1,14 +1,10 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gitlab.mergerequest.data
import com.intellij.collaboration.async.mapScoped
import com.intellij.collaboration.async.modelFlow
import com.intellij.collaboration.async.resultOrErrorFlow
import com.intellij.collaboration.async.withInitial
import com.intellij.collaboration.async.*
import com.intellij.collaboration.util.ResultUtil.runCatchingUser
import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.project.Project
import com.intellij.platform.util.coroutines.childScope
import git4idea.GitStandardRemoteBranch
import git4idea.remote.hosting.GitRemoteBranchesUtil
import git4idea.remote.hosting.changesSignalFlow
@@ -102,7 +98,7 @@ internal class LoadedGitLabMergeRequest(
private val currentUser: GitLabUserDTO,
mergeRequest: GitLabMergeRequestDTO
) : GitLabMergeRequest {
private val cs = parentCs.childScope(Dispatchers.Default + CoroutineExceptionHandler { _, e -> LOG.warn(e) })
private val cs = parentCs.childScope(this::class, Dispatchers.Default)
override val glProject: GitLabProjectCoordinates = projectMapping.repository
override val gitRepository: GitRepository = projectMapping.gitRepository
@@ -3,12 +3,11 @@ package org.jetbrains.plugins.gitlab.mergerequest.data
import com.intellij.collaboration.api.page.ApiPageUtil
import com.intellij.collaboration.api.page.foldToList
import com.intellij.openapi.diagnostic.logger
import com.intellij.collaboration.async.childScope
import com.intellij.openapi.diff.impl.patch.PatchReader
import com.intellij.openapi.diff.impl.patch.TextFilePatch
import com.intellij.openapi.vcs.FilePath
import com.intellij.openapi.vcs.FileStatus
import com.intellij.platform.util.coroutines.childScope
import com.intellij.vcsUtil.VcsFileUtil
import git4idea.changes.GitBranchComparisonResult
import git4idea.changes.GitCommitShaWithPatches
@@ -46,8 +45,6 @@ fun GitBranchComparisonResult.findLatestCommitWithChangesTo(gitRepository: GitRe
return commits.lastOrNull { commit -> commit.patches.any { it.filePath == relativePath } }?.sha
}
private val LOG = logger<GitLabMergeRequestChanges>()
class GitLabMergeRequestChangesImpl(
parentCs: CoroutineScope,
private val api: GitLabApi,
@@ -56,7 +53,7 @@ class GitLabMergeRequestChangesImpl(
private val mergeRequestDetails: GitLabMergeRequestFullDetails
) : GitLabMergeRequestChanges {
private val cs = parentCs.childScope(CoroutineExceptionHandler { _, e -> LOG.warn(e) })
private val cs = parentCs.childScope(this::class)
private val glProject = projectMapping.repository
@@ -5,10 +5,12 @@ import com.intellij.collaboration.api.data.GraphQLRequestPagination
import com.intellij.collaboration.async.*
import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.project.Project
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.withContext
import org.jetbrains.plugins.gitlab.api.*
import org.jetbrains.plugins.gitlab.api.dto.GitLabDiscussionDTO
import org.jetbrains.plugins.gitlab.api.dto.GitLabMergeRequestDraftNoteRestDTO
@@ -52,7 +54,7 @@ class GitLabMergeRequestDiscussionsContainerImpl(
private val mr: GitLabMergeRequest,
) : GitLabMergeRequestDiscussionsContainer {
private val cs = parentCs.childScope(Dispatchers.Default + CoroutineExceptionHandler { _, e -> LOG.warn(e) })
private val cs = parentCs.childScope(this::class, Dispatchers.Default)
override val canAddNotes: Boolean = mr.details.value.userPermissions.createNote
override val canAddDraftNotes: Boolean =
@@ -1,16 +1,15 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gitlab.mergerequest.data
import com.intellij.collaboration.async.Change
import com.intellij.collaboration.async.Deleted
import com.intellij.collaboration.async.mapState
import com.intellij.collaboration.async.modelFlow
import com.intellij.collaboration.async.*
import com.intellij.openapi.diagnostic.logger
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withContext
import org.jetbrains.plugins.gitlab.api.*
import org.jetbrains.plugins.gitlab.api.dto.GitLabAwardEmojiDTO
import org.jetbrains.plugins.gitlab.api.dto.GitLabMergeRequestDraftNoteRestDTO
@@ -80,7 +79,7 @@ class MutableGitLabMergeRequestNote(
noteData: GitLabNoteDTO
) : GitLabMergeRequestNote, MutableGitLabNote {
private val cs = parentCs.childScope(CoroutineExceptionHandler { _, e -> LOG.warn(e) })
private val cs = parentCs.childScope(this::class)
private val operationsGuard = Mutex()
@@ -169,7 +168,7 @@ class GitLabMergeRequestDraftNoteImpl(
override val author: GitLabUserDTO
) : GitLabMergeRequestDraftNote, MutableGitLabNote {
private val cs = parentCs.childScope(CoroutineExceptionHandler { _, e -> LOG.warn(e) })
private val cs = parentCs.childScope(this::class)
private val operationsGuard = Mutex()
@@ -3,15 +3,11 @@ package org.jetbrains.plugins.gitlab.mergerequest.data
import com.github.benmanes.caffeine.cache.Caffeine
import com.intellij.collaboration.api.HttpStatusErrorException
import com.intellij.collaboration.async.ReloadablePotentiallyInfiniteListLoader
import com.intellij.collaboration.async.mapScoped
import com.intellij.collaboration.async.transformConsecutiveSuccesses
import com.intellij.collaboration.async.withInitial
import com.intellij.collaboration.async.*
import com.intellij.collaboration.messages.CollaborationToolsBundle
import com.intellij.collaboration.util.ResultUtil.runCatchingUser
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.registry.Registry
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
import org.jetbrains.plugins.gitlab.api.GitLabApi
@@ -67,7 +63,7 @@ class CachingGitLabProjectMergeRequestsStore(private val project: Project,
private val currentUser: GitLabUserDTO,
private val tokenRefreshFlow: Flow<Unit>) : GitLabProjectMergeRequestsStore {
private val cs = parentCs.childScope()
private val cs = parentCs.childScope(this::class)
private val glProject: GitLabProjectCoordinates = projectMapping.repository
@@ -11,7 +11,6 @@ import com.intellij.collaboration.util.SingleCoroutineLauncher
import com.intellij.openapi.diagnostic.thisLogger
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Disposer
import com.intellij.platform.util.coroutines.childScope
import com.intellij.ui.awt.RelativePoint
import com.intellij.vcs.log.Hash
import com.intellij.vcs.log.VcsCommitMetadata
@@ -78,7 +77,7 @@ internal class GitLabMergeRequestCreateViewModelImpl(
override val openReviewTabAction: suspend (mrIid: String) -> Unit,
private val onReviewCreated: () -> Unit,
) : GitLabMergeRequestCreateViewModel {
private val cs: CoroutineScope = parentCs.childScope()
private val cs: CoroutineScope = parentCs.childScope(this::class)
private val taskLauncher = SingleCoroutineLauncher(cs)
override val isBusy: Flow<Boolean> = taskLauncher.busy
@@ -1,6 +1,7 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gitlab.mergerequest.ui.details.model
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.async.mapState
import com.intellij.collaboration.async.modelFlow
import com.intellij.collaboration.async.withInitial
@@ -8,7 +9,6 @@ import com.intellij.collaboration.ui.codereview.details.model.CodeReviewBranches
import com.intellij.collaboration.ui.codereview.details.model.CodeReviewBranchesViewModel
import com.intellij.dvcs.DvcsUtil
import com.intellij.openapi.diagnostic.thisLogger
import com.intellij.platform.util.coroutines.childScope
import git4idea.remote.hosting.GitRemoteBranchesUtil
import git4idea.remote.hosting.changesSignalFlow
import git4idea.repo.GitRepository
@@ -30,7 +30,7 @@ internal class GitLabMergeRequestBranchesViewModel(
) : CodeReviewBranchesViewModel {
private val gitRepository: GitRepository = mapping.remote.repository
private val cs: CoroutineScope = parentCs.childScope()
private val cs: CoroutineScope = parentCs.childScope(this::class)
override val sourceBranch: StateFlow<String> = mergeRequest.details.mapState(cs, ::getSourceBranchName)
@@ -1,7 +1,7 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gitlab.mergerequest.ui.details.model
import com.intellij.platform.util.coroutines.childScope
import com.intellij.collaboration.async.childScope
import com.intellij.util.asSafely
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -31,7 +31,7 @@ class GitLabMergeRequestDetailsLoadingViewModelImpl(
override val mergeRequestId: String,
detailsVm: Flow<Result<GitLabMergeRequestDetailsViewModel>>
) : GitLabMergeRequestDetailsLoadingViewModel {
private val scope = parentScope.childScope(Dispatchers.Default)
private val scope = parentScope.childScope(this::class, Dispatchers.Default)
override val mergeRequestLoadingFlow: Flow<LoadingState> = detailsVm.map { vmResult ->
vmResult.map { LoadingState.Result(it) }.getOrElse { LoadingState.Error(it) }
@@ -1,6 +1,7 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gitlab.mergerequest.ui.details.model
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.async.launchNow
import com.intellij.collaboration.async.modelFlow
import com.intellij.collaboration.ui.codereview.details.data.ReviewRequestState
@@ -10,7 +11,6 @@ import com.intellij.collaboration.ui.codereview.issues.processIssueIdsHtml
import com.intellij.collaboration.ui.icon.IconsProvider
import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.project.Project
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
@@ -49,7 +49,7 @@ internal class GitLabMergeRequestDetailsViewModelImpl(
private val avatarIconsProvider: IconsProvider<GitLabUserDTO>,
) : GitLabMergeRequestDetailsViewModel {
private val cs = parentCs.childScope()
private val cs = parentCs.childScope(this::class)
override val number: String = "!${mergeRequest.iid}"
override val url: String = mergeRequest.url
@@ -1,6 +1,7 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gitlab.mergerequest.ui.details.model
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.async.launchNow
import com.intellij.collaboration.async.mapState
import com.intellij.collaboration.async.modelFlow
@@ -16,7 +17,6 @@ import com.intellij.openapi.application.EDT
import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.text.StringUtil
import com.intellij.platform.util.coroutines.childScope
import com.intellij.ui.awt.RelativePoint
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
@@ -102,7 +102,7 @@ internal class GitLabMergeRequestReviewFlowViewModelImpl(
private val mergeRequest: GitLabMergeRequest,
private val avatarIconsProvider: IconsProvider<GitLabUserDTO>
) : GitLabMergeRequestReviewFlowViewModel {
private val scope = parentScope.childScope()
private val scope = parentScope.childScope(this::class)
private val taskLauncher = SingleCoroutineLauncher(scope)
override val isBusy: Flow<Boolean> = taskLauncher.busy
@@ -1,6 +1,7 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gitlab.mergerequest.ui.details.model
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.async.launchNow
import com.intellij.collaboration.async.modelFlow
import com.intellij.collaboration.ui.codereview.details.data.CodeReviewCIJob
@@ -8,7 +9,6 @@ import com.intellij.collaboration.ui.codereview.details.data.CodeReviewCIJobStat
import com.intellij.collaboration.ui.codereview.details.model.CodeReviewStatusViewModel
import com.intellij.openapi.diagnostic.thisLogger
import com.intellij.openapi.project.Project
import com.intellij.platform.util.coroutines.childScope
import com.intellij.util.io.URLUtil
import git4idea.repo.GitRepository
import kotlinx.coroutines.CoroutineScope
@@ -32,7 +32,7 @@ class GitLabMergeRequestStatusViewModelImpl(
private val serverPath: GitLabServerPath,
mergeRequest: GitLabMergeRequest,
) : GitLabMergeRequestStatusViewModel {
private val cs = parentCs.childScope()
private val cs = parentCs.childScope(this::class)
private val pipeline: SharedFlow<GitLabPipelineDTO?> = mergeRequest.details.map { it.headPipeline }.modelFlow(cs, thisLogger())
@@ -1,9 +1,9 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gitlab.mergerequest.ui.review
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.ui.codereview.review.CodeReviewSubmitViewModel
import com.intellij.collaboration.util.SingleCoroutineLauncher
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -54,7 +54,7 @@ internal class GitLabMergeRequestSubmitReviewViewModelImpl(
currentReview: SubmittableReview,
private val onDone: () -> Unit
) : GitLabMergeRequestSubmitReviewViewModel {
private val cs = parentCs.childScope(Dispatchers.Default)
private val cs = parentCs.childScope(this::class, Dispatchers.Default)
private val taskLauncher = SingleCoroutineLauncher(cs)
override val isBusy: StateFlow<Boolean> = taskLauncher.busy
@@ -1,6 +1,7 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gitlab.mergerequest.ui.timeline
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.async.modelFlow
import com.intellij.collaboration.ui.codereview.diff.DiffLineLocation
import com.intellij.collaboration.util.ChangesSelection
@@ -9,8 +10,6 @@ import com.intellij.diff.util.Side
import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.diff.impl.patch.PatchHunk
import com.intellij.openapi.diff.impl.patch.TextFilePatch
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.channels.BufferOverflow
@@ -45,7 +44,7 @@ class GitLabDiscussionDiffViewModelImpl(
override val position: GitLabNotePosition
) : GitLabDiscussionDiffViewModel {
private val cs = parentCs.childScope(CoroutineExceptionHandler { _, e -> LOG.warn(e) })
private val cs = parentCs.childScope(this::class)
override val mapping: Flow<GitLabMergeRequestNotePositionMapping> = mr.changes.mapLatest {
try {
@@ -8,9 +8,7 @@ import com.intellij.collaboration.ui.codereview.timeline.thread.CodeReviewResolv
import com.intellij.collaboration.util.SingleCoroutineLauncher
import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.project.Project
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.*
@@ -53,7 +51,7 @@ class GitLabMergeRequestTimelineDiscussionViewModelImpl(
private val discussion: GitLabMergeRequestDiscussion
) : GitLabMergeRequestTimelineDiscussionViewModel {
private val cs = parentCs.childScope(CoroutineExceptionHandler { _, e -> LOG.warn(e) })
private val cs = parentCs.childScope(this::class)
private val taskLauncher = SingleCoroutineLauncher(cs)
override val mainNote: Flow<GitLabNoteViewModel> = discussion.notes
@@ -1,12 +1,11 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gitlab.mergerequest.ui.timeline
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.async.mapStateInNow
import com.intellij.collaboration.async.modelFlow
import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.project.Project
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
@@ -101,7 +100,7 @@ sealed interface GitLabMergeRequestTimelineItemViewModel {
mr: GitLabMergeRequest,
note: GitLabMergeRequestNote
) : GitLabMergeRequestTimelineItemViewModel, GitLabNoteViewModel {
private val cs = parentCs.childScope(CoroutineExceptionHandler { _, e -> LOG.warn(e) })
private val cs = parentCs.childScope(this::class)
override val id: GitLabId = note.id
override val author: GitLabUserDTO = note.author
@@ -1,15 +1,10 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gitlab.mergerequest.ui.timeline
import com.intellij.collaboration.async.launchNow
import com.intellij.collaboration.async.mapDataToModel
import com.intellij.collaboration.async.modelFlow
import com.intellij.collaboration.async.transformConsecutiveSuccesses
import com.intellij.collaboration.async.withInitial
import com.intellij.collaboration.async.*
import com.intellij.collaboration.util.ChangesSelection
import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.project.Project
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
import org.jetbrains.plugins.gitlab.api.dto.GitLabUserDTO
@@ -47,7 +42,7 @@ internal class LoadAllGitLabMergeRequestTimelineViewModel(
private val mergeRequest: GitLabMergeRequest
) : GitLabMergeRequestTimelineViewModel {
private val cs = parentCs.childScope(Dispatchers.Default)
private val cs = parentCs.childScope(this::class, Dispatchers.Default)
override val number: String = "!${mergeRequest.iid}"
override val author: GitLabUserDTO = mergeRequest.author
@@ -1,6 +1,7 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gitlab.mergerequest.ui.toolwindow
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.ui.toolwindow.ReviewToolwindowViewModel
import com.intellij.collaboration.ui.toolwindow.dontHideOnEmptyContent
import com.intellij.collaboration.ui.toolwindow.manageReviewToolwindowTabs
@@ -17,7 +18,6 @@ import com.intellij.openapi.wm.ToolWindow
import com.intellij.openapi.wm.ToolWindowFactory
import com.intellij.openapi.wm.ToolWindowManager
import com.intellij.openapi.wm.impl.content.ToolWindowContentUi
import com.intellij.platform.util.coroutines.childScope
import com.intellij.platform.util.coroutines.flow.mapStateIn
import com.intellij.util.cancelOnDispose
import com.intellij.util.concurrency.annotations.RequiresEdt
@@ -46,7 +46,7 @@ internal class GitLabToolWindowFactory : ToolWindowFactory, DumbAware {
@Service(Service.Level.PROJECT)
private class GitLabMergeRequestsToolWindowController(private val project: Project, parentCs: CoroutineScope) {
private val cs = parentCs.childScope(Dispatchers.Main)
private val cs = parentCs.childScope(this::class, Dispatchers.Main)
suspend fun manageToolWindow(toolWindow: ToolWindow) {
val vm = project.serviceAsync<GitLabProjectViewModel>()
@@ -2,12 +2,12 @@
package org.jetbrains.plugins.gitlab.mergerequest.ui.toolwindow.model
import com.intellij.collaboration.async.cancelledWith
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.ui.icon.IconsProvider
import com.intellij.collaboration.ui.toolwindow.ReviewTabViewModel
import com.intellij.openapi.Disposable
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.NlsSafe
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
import org.jetbrains.plugins.gitlab.GitLabProjectsManager
@@ -25,7 +25,7 @@ internal sealed interface GitLabReviewTabViewModel : ReviewTabViewModel {
reviewId: String,
detailsVm: Flow<Result<GitLabMergeRequestDetailsViewModel>>
) : GitLabReviewTabViewModel, Disposable {
private val cs = parentCs.childScope().cancelledWith(this)
private val cs = parentCs.childScope(this::class).cancelledWith(this)
override val displayName: @NlsSafe String = "!${reviewId}"
@@ -43,7 +43,7 @@ internal sealed interface GitLabReviewTabViewModel : ReviewTabViewModel {
openReviewTabAction: suspend (mrIid: String) -> Unit,
onReviewCreated: () -> Unit
) : GitLabReviewTabViewModel, Disposable {
private val cs = parentCs.childScope().cancelledWith(this)
private val cs = parentCs.childScope(this::class).cancelledWith(this)
private val projectPath = projectData.projectMapping.repository.projectPath.fullPath()
override val displayName: String = GitLabBundle.message("merge.request.create.tab.title", projectPath)
@@ -1,6 +1,7 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gitlab.snippets
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.async.mapState
import com.intellij.collaboration.messages.CollaborationToolsBundle
import com.intellij.collaboration.snippets.PathHandlingMode
@@ -11,7 +12,6 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.ComboBox
import com.intellij.openapi.ui.DialogWrapper
import com.intellij.openapi.ui.ValidationInfo
import com.intellij.platform.util.coroutines.childScope
import com.intellij.ui.MutableCollectionComboBoxModel
import com.intellij.ui.components.JBLabel
import com.intellij.ui.components.JBTextArea
@@ -41,7 +41,7 @@ internal object GitLabCreateSnippetComponentFactory {
createSnippetVm: GitLabCreateSnippetViewModel): DialogWrapper =
object : DialogWrapper(project, false) {
private lateinit var titleField: JTextField
private val cs: CoroutineScope = parentCs.childScope(ModalityState.stateForComponent(window).asContextElement())
private val cs: CoroutineScope = parentCs.childScope(this::class, ModalityState.stateForComponent(window).asContextElement())
init {
title = message("snippet.create.dialog.title")
@@ -2,7 +2,9 @@
package org.jetbrains.plugins.gitlab.snippets
import com.intellij.collaboration.async.cancelAndJoinSilently
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.snippets.PathHandlingMode
import com.intellij.collaboration.snippets.PathHandlingMode.Companion.getFileNameExtractor
import com.intellij.collaboration.util.ResultUtil.runCatchingUser
import com.intellij.ide.BrowserUtil
import com.intellij.notification.NotificationListener
@@ -18,7 +20,6 @@ import com.intellij.openapi.vcs.VcsNotifier
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.isFile
import com.intellij.platform.ide.progress.withBackgroundProgress
import com.intellij.platform.util.coroutines.childScope
import com.intellij.util.asSafely
import kotlinx.coroutines.*
import org.jetbrains.plugins.gitlab.api.GitLabApi
@@ -35,7 +36,6 @@ import org.jetbrains.plugins.gitlab.authentication.accounts.GitLabAccountManager
import org.jetbrains.plugins.gitlab.mergerequest.ui.toolwindow.GitLabSelectorErrorStatusPresenter.Companion.isAuthorizationException
import org.jetbrains.plugins.gitlab.mergerequest.util.localizedMessageOrClassName
import org.jetbrains.plugins.gitlab.snippets.GitLabSnippetService.Companion.GL_SNIPPET_FILES_LIMIT
import com.intellij.collaboration.snippets.PathHandlingMode.Companion.getFileNameExtractor
import org.jetbrains.plugins.gitlab.util.GitLabBundle.message
import org.jetbrains.plugins.gitlab.util.GitLabStatistics.SnippetAction.*
import org.jetbrains.plugins.gitlab.util.GitLabStatistics.logSnippetActionExecuted
@@ -249,7 +249,7 @@ internal class GitLabSnippetService(private val project: Project, private val se
files.map { file -> extractor(file) }.toSet().size == files.size // Check that there are no duplicates when mapped
}
val vmCs = childScope()
val vmCs = childScope(this::class)
val vm = GitLabCreateSnippetViewModel(
vmCs,
project,
@@ -1,8 +1,8 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gitlab.ui.clone.model
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.auth.ui.login.LoginModel
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.collectLatest
@@ -21,7 +21,7 @@ internal class GitLabCloneLoginViewModelImpl(
parentCs: CoroutineScope,
private val accountManager: GitLabAccountManager
) : GitLabCloneLoginViewModel {
private val cs: CoroutineScope = parentCs.childScope()
private val cs: CoroutineScope = parentCs.childScope(this::class)
private var selectedAccount: GitLabAccount? = null
override val accounts: SharedFlow<Set<GitLabAccount>> = accountManager.accountsState
@@ -1,11 +1,11 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gitlab.ui.comment
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.async.mapScoped
import com.intellij.collaboration.async.modelFlow
import com.intellij.openapi.diagnostic.thisLogger
import com.intellij.openapi.project.Project
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
@@ -27,7 +27,7 @@ class GitLabDiscussionReplyViewModelImpl(
discussion: GitLabDiscussion
) : GitLabDiscussionReplyViewModel {
private val cs = parentCs.childScope()
private val cs = parentCs.childScope(this::class)
private val isWriting = MutableStateFlow(false)
override val newNoteVm: Flow<NewGitLabNoteViewModel?> = isWriting.mapScoped {
@@ -6,9 +6,7 @@ import com.intellij.collaboration.ui.codereview.timeline.thread.CodeReviewResolv
import com.intellij.collaboration.util.SingleCoroutineLauncher
import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.project.Project
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.*
@@ -45,7 +43,7 @@ internal class GitLabMergeRequestDiscussionViewModelBase(
private val discussion: GitLabMergeRequestDiscussion
) : GitLabMergeRequestDiscussionViewModel {
private val cs = parentCs.childScope(CoroutineExceptionHandler { _, e -> LOG.warn(e) })
private val cs = parentCs.childScope(this::class)
private val taskLauncher = SingleCoroutineLauncher(cs)
override val isBusy: StateFlow<Boolean> = taskLauncher.busy
@@ -106,7 +104,7 @@ class GitLabMergeRequestStandaloneDraftNoteViewModelBase internal constructor(
mr: GitLabMergeRequest
) : GitLabNoteViewModel {
private val cs = parentCs.childScope(CoroutineExceptionHandler { _, e -> LOG.warn(e) })
private val cs = parentCs.childScope(this::class)
override val id: GitLabId = note.id
override val author: GitLabUserDTO = note.author
@@ -1,9 +1,9 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gitlab.mergerequest.ui.toolwindow
import com.intellij.collaboration.async.childScope
import com.intellij.collaboration.util.MainDispatcherRule
import com.intellij.openapi.project.Project
import com.intellij.platform.util.coroutines.childScope
import io.mockk.coEvery
import io.mockk.every
import io.mockk.mockk
@@ -50,7 +50,7 @@ internal class GitLabRepositoryAndAccountSelectorViewModelTest {
coEvery { accountManager.getCredentialsState(any(), any()) } returns MutableStateFlow("")
every { accountManager.canPersistCredentials } returns MutableStateFlow(true)
val scope = childScope(Dispatchers.Main)
val scope = childScope(this::class, Dispatchers.Main)
val vm = GitLabRepositoryAndAccountSelectorViewModel(project, scope, projectManager, accountManager) { _, _ -> mockk() }
assertEquals(projectMapping, vm.repoSelectionState.value)
@@ -80,7 +80,7 @@ internal class GitLabRepositoryAndAccountSelectorViewModelTest {
coEvery { accountManager.getCredentialsState(any(), any()) } returns MutableStateFlow("")
every { accountManager.canPersistCredentials } returns MutableStateFlow(true)
val scope = childScope(Dispatchers.Main)
val scope = childScope(this::class, Dispatchers.Main)
val vm = GitLabRepositoryAndAccountSelectorViewModel(project, scope, projectManager, accountManager) { _, _ -> mockk() }
assertEquals(null, vm.repoSelectionState.value)
@@ -3,10 +3,8 @@ package org.jetbrains.plugins.gitlab.apitests
import com.intellij.collaboration.api.page.ApiPageUtil
import com.intellij.collaboration.api.page.foldToList
import com.intellij.collaboration.async.cancelAndJoinSilently
import com.intellij.collaboration.async.withInitial
import com.intellij.openapi.components.service
import com.intellij.platform.util.coroutines.childScope
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.fold
@@ -297,10 +295,9 @@ class GitLabApiTest : GitLabApiTestCase() {
fun `GQL getMergeRequestStateEvents works`() = runTest {
checkVersion(after(v(13, 2)))
val cs = childScope()
requiresAuthentication { api ->
val reloadRequest = MutableSharedFlow<Unit>(1).withInitial(Unit)
val loader = startGitLabRestETagListLoaderIn(cs,
val loader = startGitLabRestETagListLoaderIn(backgroundScope,
getMergeRequestStateEventsUri(glTest1Coordinates, "1"),
{ it.id },
reloadRequest) { uri, eTag ->
@@ -313,17 +310,15 @@ class GitLabApiTest : GitLabApiTestCase() {
assertNotNull(result)
assertEquals(listOf(1), result?.map { it.id })
}
cs.cancelAndJoinSilently()
}
@Test
fun `GQL getMergeRequestLabelEvents works`() = runTest {
checkVersion(after(v(11, 4)))
val cs = childScope()
requiresAuthentication { api ->
val reloadRequest = MutableSharedFlow<Unit>(1).withInitial(Unit)
val loader = startGitLabRestETagListLoaderIn(cs,
val loader = startGitLabRestETagListLoaderIn(backgroundScope,
getMergeRequestLabelEventsUri(glTest1Coordinates, "1"),
{ it.id },
reloadRequest) { uri, eTag ->
@@ -336,17 +331,15 @@ class GitLabApiTest : GitLabApiTestCase() {
assertNotNull(result)
assertEquals(listOf(3, 4, 5), result?.map { it.id })
}
cs.cancelAndJoinSilently()
}
@Test
fun `GQL getMergeRequestMilestoneEvents works`() = runTest {
checkVersion(after(v(13, 1)))
val cs = childScope()
requiresAuthentication { api ->
val reloadRequest = MutableSharedFlow<Unit>(1).withInitial(Unit)
val loader = startGitLabRestETagListLoaderIn(cs,
val loader = startGitLabRestETagListLoaderIn(backgroundScope,
getMergeRequestMilestoneEventsUri(glTest1Coordinates, "1"),
{ it.id },
reloadRequest) { uri, eTag ->
@@ -359,7 +352,6 @@ class GitLabApiTest : GitLabApiTestCase() {
assertNotNull(result)
assertEquals(listOf(3, 4), result?.map { it.id })
}
cs.cancelAndJoinSilently()
}
@Test