From e62da1016d63ed41ba83751a70fd688318395e64 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Fri, 1 Jul 2016 12:33:15 +0200 Subject: [PATCH] Promise.cancel() API instead of low-level OBSOLETE_ERROR --- .../org/jetbrains/concurrency/AsyncPromise.kt | 13 +++++++-- .../org/jetbrains/concurrency/Promise.java | 26 +++++------------ .../backend/src/DeclarativeScope.kt | 12 +++----- .../org/jetbrains/debugger/VariablesHost.java | 5 ++-- .../jetbrains/debugger/values/ValueManager.kt | 10 ------- .../jetbrains/debugger/RejectErrorReporter.kt | 8 ++--- .../script-debugger/debugger-ui/src/util.kt | 29 ------------------- 7 files changed, 29 insertions(+), 74 deletions(-) delete mode 100644 platform/script-debugger/debugger-ui/src/util.kt diff --git a/platform/platform-api/src/org/jetbrains/concurrency/AsyncPromise.kt b/platform/platform-api/src/org/jetbrains/concurrency/AsyncPromise.kt index 51a81a86bfb6..91f13db02c96 100644 --- a/platform/platform-api/src/org/jetbrains/concurrency/AsyncPromise.kt +++ b/platform/platform-api/src/org/jetbrains/concurrency/AsyncPromise.kt @@ -24,7 +24,7 @@ import java.util.* private val LOG = Logger.getInstance(AsyncPromise::class.java) @SuppressWarnings("ThrowableResultOfMethodCallIgnored") -val OBSOLETE_ERROR = Promise.createError("Obsolete") +private val OBSOLETE_ERROR = Promise.createError("Obsolete") open class AsyncPromise : Promise(), Getter { @Volatile private var done: Consumer? = null @@ -92,7 +92,7 @@ open class AsyncPromise : Promise(), Getter { addHandlers(Consumer({ result -> promise.catchError { if (fulfilled is Obsolescent && fulfilled.isObsolete) { - promise.setError(OBSOLETE_ERROR) + promise.cancel() } else { promise.setResult(fulfilled.`fun`(result)) @@ -186,6 +186,10 @@ open class AsyncPromise : Promise(), Getter { return setError(Promise.createError(error)) } + fun cancel() { + setError(OBSOLETE_ERROR) + } + open fun setError(error: Throwable): Boolean { if (state != Promise.State.PENDING) { return false @@ -272,4 +276,9 @@ inline fun AsyncPromise<*>.catchError(runnable: () -> T): T? { } } +private val cancelledPromise = RejectedPromise(OBSOLETE_ERROR) + +@Suppress("CAST_NEVER_SUCCEEDS") +fun cancelledPromise(): Promise = cancelledPromise as Promise + fun rejectedPromise(error: Throwable): Promise = Promise.reject(error) \ No newline at end of file diff --git a/platform/platform-api/src/org/jetbrains/concurrency/Promise.java b/platform/platform-api/src/org/jetbrains/concurrency/Promise.java index e5d186f75703..ffeb4d5d9142 100644 --- a/platform/platform-api/src/org/jetbrains/concurrency/Promise.java +++ b/platform/platform-api/src/org/jetbrains/concurrency/Promise.java @@ -69,17 +69,8 @@ public abstract class Promise { @NotNull public static Promise wrapAsVoid(@NotNull ActionCallback asyncResult) { final AsyncPromise promise = new AsyncPromise(); - asyncResult.doWhenDone(new Runnable() { - @Override - public void run() { - promise.setResult(null); - } - }).doWhenRejected(new Consumer() { - @Override - public void consume(String error) { - promise.setError(createError(error == null ? "Internal error" : error)); - } - }); + asyncResult.doWhenDone(() -> promise.setResult(null)).doWhenRejected( + error -> promise.setError(createError(error == null ? "Internal error" : error))); return promise; } @@ -91,12 +82,7 @@ public abstract class Promise { public void consume(T result) { promise.setResult(result); } - }).doWhenRejected(new Consumer() { - @Override - public void consume(String error) { - promise.setError(error); - } - }); + }).doWhenRejected(promise::setError); return promise; } @@ -146,16 +132,20 @@ public abstract class Promise { /** * Log error if not message error */ - public static void logError(@NotNull Logger logger, @NotNull Throwable e) { + public static boolean logError(@NotNull Logger logger, @NotNull Throwable e) { if (e instanceof MessageError) { ThreeState log = ((MessageError)e).log; if (log == ThreeState.YES || (log == ThreeState.UNSURE && ApplicationManager.getApplication().isUnitTestMode())) { logger.error(e); + return true; } } else if (!(e instanceof ProcessCanceledException)) { logger.error(e); + return true; } + + return false; } public abstract void notify(@NotNull AsyncPromise child); diff --git a/platform/script-debugger/backend/src/DeclarativeScope.kt b/platform/script-debugger/backend/src/DeclarativeScope.kt index db1e206776a3..ed6523dd66d5 100644 --- a/platform/script-debugger/backend/src/DeclarativeScope.kt +++ b/platform/script-debugger/backend/src/DeclarativeScope.kt @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,8 +15,8 @@ */ package org.jetbrains.debugger -import com.intellij.util.Consumer import org.jetbrains.concurrency.Promise +import org.jetbrains.concurrency.cancelledPromise import org.jetbrains.debugger.values.ObjectValue import org.jetbrains.debugger.values.ValueManager @@ -25,14 +25,10 @@ abstract class DeclarativeScope(type: Scope.Type, protected fun loadScopeObjectProperties(value: ObjectValue): Promise> { if (childrenManager.valueManager.isObsolete) { - return ValueManager.reject() + return cancelledPromise() } - return value.properties.done(object : Consumer> { - override fun consume(variables: List) { - childrenManager.updateCacheStamp() - } - }) + return value.properties.done { childrenManager.updateCacheStamp() } } override fun getVariablesHost() = childrenManager diff --git a/platform/script-debugger/backend/src/org/jetbrains/debugger/VariablesHost.java b/platform/script-debugger/backend/src/org/jetbrains/debugger/VariablesHost.java index 746016d690cf..f83f8010a2c4 100644 --- a/platform/script-debugger/backend/src/org/jetbrains/debugger/VariablesHost.java +++ b/platform/script-debugger/backend/src/org/jetbrains/debugger/VariablesHost.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ package org.jetbrains.debugger; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.concurrency.AsyncPromiseKt; import org.jetbrains.concurrency.Promise; import org.jetbrains.concurrency.PromiseManager; import org.jetbrains.debugger.values.ValueManager; @@ -35,7 +36,7 @@ public abstract class VariablesHost { @NotNull @Override public Promise load(@NotNull VariablesHost host) { - return host.valueManager.isObsolete() ? ValueManager.Companion.reject() : host.load(); + return host.valueManager.isObsolete() ? AsyncPromiseKt.cancelledPromise() : host.load(); } }; diff --git a/platform/script-debugger/backend/src/org/jetbrains/debugger/values/ValueManager.kt b/platform/script-debugger/backend/src/org/jetbrains/debugger/values/ValueManager.kt index 43a7120be001..f1d1ee5740c3 100644 --- a/platform/script-debugger/backend/src/org/jetbrains/debugger/values/ValueManager.kt +++ b/platform/script-debugger/backend/src/org/jetbrains/debugger/values/ValueManager.kt @@ -15,10 +15,7 @@ */ package org.jetbrains.debugger.values -import org.jetbrains.concurrency.OBSOLETE_ERROR import org.jetbrains.concurrency.Obsolescent -import org.jetbrains.concurrency.Promise -import org.jetbrains.concurrency.rejectedPromise import java.util.concurrent.atomic.AtomicInteger /** @@ -43,11 +40,4 @@ abstract class ValueManager() : Obsolescent { fun markObsolete() { obsolete = true } - - companion object { - val OBSOLETE_CONTEXT_PROMISE = rejectedPromise(OBSOLETE_ERROR) - - @Suppress("UNCHECKED_CAST") - fun reject() = OBSOLETE_CONTEXT_PROMISE as Promise - } } \ No newline at end of file diff --git a/platform/script-debugger/debugger-ui/src/org/jetbrains/debugger/RejectErrorReporter.kt b/platform/script-debugger/debugger-ui/src/org/jetbrains/debugger/RejectErrorReporter.kt index 604718a562e6..9a2b08606ce5 100644 --- a/platform/script-debugger/debugger-ui/src/org/jetbrains/debugger/RejectErrorReporter.kt +++ b/platform/script-debugger/debugger-ui/src/org/jetbrains/debugger/RejectErrorReporter.kt @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,15 +17,13 @@ package org.jetbrains.debugger import com.intellij.util.Consumer import com.intellij.xdebugger.XDebugSession -import org.jetbrains.concurrency.OBSOLETE_ERROR import org.jetbrains.concurrency.Promise import org.jetbrains.rpc.LOG class RejectErrorReporter @JvmOverloads constructor(private val session: XDebugSession, private val description: String? = null) : Consumer { override fun consume(error: Throwable) { - Promise.logError(LOG, error) - if (error !== OBSOLETE_ERROR) { - session.reportError((if (description == null) "" else "$description: ") + error.message) + if (Promise.logError(LOG, error)) { + session.reportError("${if (description == null) "" else "$description: "}${error.message}") } } } \ No newline at end of file diff --git a/platform/script-debugger/debugger-ui/src/util.kt b/platform/script-debugger/debugger-ui/src/util.kt deleted file mode 100644 index ab8df6a03ad7..000000000000 --- a/platform/script-debugger/debugger-ui/src/util.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2000-2016 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.xdebugger.util - -import com.intellij.xdebugger.XDebugSession -import org.jetbrains.concurrency.OBSOLETE_ERROR -import org.jetbrains.concurrency.Promise -import org.jetbrains.rpc.LOG - -// have to use package "com.intellij.xdebugger.util" to avoid package clash -fun XDebugSession.rejectedErrorReporter(description: String? = null): (Throwable) -> Unit = { - Promise.logError(LOG, it) - if (it != OBSOLETE_ERROR) { - reportError("${if (description == null) "" else description + ": "}${it.message}") - } -} \ No newline at end of file