diff --git a/platform/projectModel-api/src/org/jetbrains/concurrency/AsyncPromise.kt b/platform/projectModel-api/src/org/jetbrains/concurrency/AsyncPromise.kt index d70632c5e94f..0b2423def732 100644 --- a/platform/projectModel-api/src/org/jetbrains/concurrency/AsyncPromise.kt +++ b/platform/projectModel-api/src/org/jetbrains/concurrency/AsyncPromise.kt @@ -9,19 +9,11 @@ import org.jetbrains.concurrency.Promise.State import java.util.concurrent.* import java.util.function.Consumer -open class AsyncPromise : CancellablePromise, InternalPromiseUtil.CompletablePromise { - private val f: CompletableFuture - - constructor() { - f = CompletableFuture() - } - - // used for chaining builders like thenAsync() - private constructor(w: CompletableFuture) { - f = w - } +open class AsyncPromise private constructor(private val f: CompletableFuture) : CancellablePromise, InternalPromiseUtil.CompletablePromise { + constructor() : this(CompletableFuture()) override fun isDone() = f.isDone + override fun get() = nullizeCancelled { f.get() } override fun get(timeout: Long, unit: TimeUnit) = nullizeCancelled { f.get(timeout, unit) } @@ -48,10 +40,16 @@ open class AsyncPromise : CancellablePromise, InternalPromiseUtil.Completa cancel(true) } - override fun getState() = if (!f.isDone) State.PENDING else if (f.isCompletedExceptionally) State.REJECTED else State.SUCCEEDED + override fun getState(): State { + return when { + !f.isDone -> State.PENDING + f.isCompletedExceptionally -> State.REJECTED + else -> State.SUCCEEDED + } + } override fun onSuccess(handler: Consumer): Promise { - val whenComplete = f.whenComplete { value, exception -> + return AsyncPromise(f.whenComplete { value, exception -> if (exception == null && !InternalPromiseUtil.isHandlerObsolete(handler)) { try { handler.accept(value) @@ -62,25 +60,26 @@ open class AsyncPromise : CancellablePromise, InternalPromiseUtil.Completa } } } - } - return AsyncPromise(whenComplete) + }) } override fun onError(rejected: Consumer): Promise { - val whenComplete = f.whenComplete { _, exception -> + return AsyncPromise(f.whenComplete { _, exception -> if (exception != null) { val toReport = if (exception is CompletionException && exception.cause != null) exception.cause!! else exception if (!InternalPromiseUtil.isHandlerObsolete(rejected)) { rejected.accept(toReport) } } - } - return AsyncPromise(whenComplete) + }) } override fun onProcessed(processed: Consumer): Promise { - val whenComplete = f.whenComplete { value, _ -> if (!InternalPromiseUtil.isHandlerObsolete(processed)) processed.accept(value) } - return AsyncPromise(whenComplete) + return AsyncPromise(f.whenComplete { value, _ -> + if (!InternalPromiseUtil.isHandlerObsolete(processed)) { + processed.accept(value) + } + }) } override fun blockingGet(timeout: Int, timeUnit: TimeUnit): T? { @@ -98,15 +97,16 @@ open class AsyncPromise : CancellablePromise, InternalPromiseUtil.Completa } override fun then(done: Function): Promise { - val thenApply = f.thenApply { t -> done.`fun`(t) } - return AsyncPromise(thenApply) + return AsyncPromise(f.thenApply { done.`fun`(it) }) } override fun thenAsync(doneF: Function>): Promise { val convert: (T) -> CompletableFuture = { val promise = doneF.`fun`(it) val future = CompletableFuture() - promise.onSuccess { value -> future.complete(value) }.onError { error -> future.completeExceptionally(error) } + promise + .onSuccess { value -> future.complete(value) } + .onError { error -> future.completeExceptionally(error) } future } return AsyncPromise(f.thenCompose(convert))