mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-03-22 06:50:54 +07:00
RDCT-1642 Reuse withStoredTemporaryContext in ServiceInstanceInitializer.createInstance()
GitOrigin-RevId: 3c77b18e629e5943526a35190bedb87858961910
This commit is contained in:
committed by
intellij-monorepo-bot
parent
fcc8602b58
commit
b95156e1dd
@@ -7,11 +7,11 @@ import com.intellij.platform.util.coroutines.childScope
|
||||
import com.intellij.util.ArrayUtilRt
|
||||
import com.intellij.util.containers.toArray
|
||||
import kotlinx.coroutines.*
|
||||
import org.jetbrains.annotations.ApiStatus
|
||||
import java.lang.invoke.MethodHandle
|
||||
import java.lang.invoke.MethodHandles
|
||||
import java.lang.invoke.MethodType
|
||||
import java.lang.reflect.Constructor
|
||||
import kotlin.coroutines.CoroutineContext
|
||||
|
||||
/**
|
||||
* Instantiates [instanceClass] using [resolver] to find instances for constructor parameter types.
|
||||
@@ -317,7 +317,8 @@ private suspend fun <T> instantiate(
|
||||
// we don't want it to be captured by lambdas scheduled in the constructor (= context propagation).
|
||||
// Only the context of the owner coroutine should be captured.
|
||||
// TODO Put BlockingJob to bind all computations started in instance constructor to instance scope.
|
||||
private suspend fun <T> withStoredTemporaryContext(parentScope: CoroutineScope, action: () -> T): T {
|
||||
@ApiStatus.Internal
|
||||
suspend fun <T> withStoredTemporaryContext(parentScope: CoroutineScope, action: () -> T): T {
|
||||
val existingCoroutineContext = currentCoroutineContext()
|
||||
val scopeContext = parentScope.coroutineContext
|
||||
// `temporaryCoroutineContext` belongs to the initialization processes throughout the whole chain of initialization.
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
// 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.serviceContainer
|
||||
|
||||
import com.intellij.concurrency.installTemporaryThreadContext
|
||||
import com.intellij.diagnostic.PluginException
|
||||
import com.intellij.openapi.Disposable
|
||||
import com.intellij.openapi.application.ApplicationManager
|
||||
@@ -14,9 +13,9 @@ import com.intellij.openapi.progress.ProcessCanceledException
|
||||
import com.intellij.openapi.util.Disposer
|
||||
import com.intellij.platform.instanceContainer.instantiation.InstantiationException
|
||||
import com.intellij.platform.instanceContainer.instantiation.instantiate
|
||||
import com.intellij.platform.instanceContainer.instantiation.withStoredTemporaryContext
|
||||
import com.intellij.platform.instanceContainer.internal.InstanceInitializer
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.currentCoroutineContext
|
||||
import java.util.concurrent.CancellationException
|
||||
|
||||
internal abstract class ServiceInstanceInitializer(
|
||||
@@ -66,7 +65,7 @@ internal abstract class ServiceInstanceInitializer(
|
||||
// which happens only on project/application shutdown, or on plugin unload.
|
||||
Cancellation.withNonCancelableSection().use {
|
||||
// loadState may invokeLater => don't capture the context
|
||||
installTemporaryThreadContext(currentCoroutineContext()).use {
|
||||
withStoredTemporaryContext(parentScope) {
|
||||
componentManager.initializeService(instance, serviceDescriptor, pluginId)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user