mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-16 14:23:28 +07:00
IJPL-176078 fix search everywhere actions updating in remote dev by making update concurrent
(cherry picked from commit 3b879210ff3d616daede7fa79b3b2a8d7efbdd4a) IJ-MR-153792 (cherry picked from commit be996f6a207935ce77e2973dde7322fd1460d3e1) (cherry picked from commit 8325e0d47844fa654fa129e5305323fe537cd7f7) IJ-CR-153899 GitOrigin-RevId: 024d9dbd7fc715656df0b63109faccf380ff8ac2
This commit is contained in:
committed by
intellij-monorepo-bot
parent
25d0da7ea1
commit
0c64f075c1
@@ -114,28 +114,29 @@ internal class ActionAsyncProvider(private val model: GotoActionModel) {
|
|||||||
|
|
||||||
awaitJob?.join() //wait until all items from previous step are processed
|
awaitJob?.join() //wait until all items from previous step are processed
|
||||||
LOG.debug { "Process matched actions for \"$pattern\"" }
|
LOG.debug { "Process matched actions for \"$pattern\"" }
|
||||||
list.forEachConcurrentOrdered { matchedActionOrStub, awaitMyTurn ->
|
list.forEachConcurrentOrdered ({ matchedActionOrStub ->
|
||||||
val action = matchedActionOrStub.action
|
val action = matchedActionOrStub.action
|
||||||
val matchedAction = if (action is ActionStubBase) loadAction(action.id)?.let { MatchedAction(it, matchedActionOrStub.mode, matchedActionOrStub.weight) } else matchedActionOrStub
|
val matchedAction = if (action is ActionStubBase) loadAction(action.id)?.let { MatchedAction(it, matchedActionOrStub.mode, matchedActionOrStub.weight) } else matchedActionOrStub
|
||||||
if (matchedAction == null) return@forEachConcurrentOrdered
|
if (matchedAction == null) return@forEachConcurrentOrdered null
|
||||||
val matchedValue = matchItem(
|
val matchedValue = matchItem(
|
||||||
item = wrapAnAction(action = matchedAction.action, presentationProvider = presentationProvider, matchMode = matchedAction.mode),
|
item = wrapAnAction(action = matchedAction.action, presentationProvider = presentationProvider, matchMode = matchedAction.mode),
|
||||||
matcher = weightMatcher,
|
matcher = weightMatcher,
|
||||||
pattern = pattern,
|
pattern = pattern,
|
||||||
matchType = MatchedValueType.ACTION,
|
matchType = MatchedValueType.ACTION,
|
||||||
)
|
)
|
||||||
awaitMyTurn()
|
|
||||||
|
return@forEachConcurrentOrdered matchedValue
|
||||||
|
}, { matchedValue ->
|
||||||
if (!consumer(matchedValue)) cancel()
|
if (!consumer(matchedValue)) cancel()
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun <T> Collection<T>.forEachConcurrentOrdered(action: suspend (T, suspend () -> Unit) -> Unit) {
|
private suspend fun <TIn, TOut : Any> Collection<TIn>.forEachConcurrentOrdered(concurrentAction: suspend (TIn) -> TOut?, orderedAction: suspend (TOut) -> Unit) {
|
||||||
suspend fun runConcurrent(item: T, jobToAwait: Job?): Job = coroutineScope {
|
coroutineScope {
|
||||||
launch { action(item) { jobToAwait?.join() } }
|
this@forEachConcurrentOrdered.mapNotNull { async { concurrentAction(it) } }.forEach {
|
||||||
|
orderedAction(it.await() ?: return@forEach)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var prevItemJob: Job? = null
|
|
||||||
forEach { prevItemJob = runConcurrent(it, prevItemJob) }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun collectMatchedActions(pattern: String, allIds: Collection<String>, weightMatcher: MinusculeMatcher, unmatchedIdsChannel: SendChannel<String>): List<MatchedAction> = coroutineScope {
|
private suspend fun collectMatchedActions(pattern: String, allIds: Collection<String>, weightMatcher: MinusculeMatcher, unmatchedIdsChannel: SendChannel<String>): List<MatchedAction> = coroutineScope {
|
||||||
|
|||||||
Reference in New Issue
Block a user