+/*
+ * Copyright 2000-2015 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 org.jetbrains.concurrency;
public interface Obsolescent {
* @return <code>true</code> if result of computation won't be used so computation may be interrupted
*/
boolean isObsolete();
+
+ @SuppressWarnings("ClassNameSameAsAncestorName")
+ interface Consumer<T> extends com.intellij.util.Consumer<T>, Obsolescent {
+ }
}
@NotNull
@Override
public Promise<T> rejected(@NotNull Consumer<Throwable> rejected) {
+ if (isObsolete(rejected)) {
+ return this;
+ }
+
switch (state) {
case PENDING:
break;
Consumer<Throwable> rejected = this.rejected;
clearHandlers();
if (rejected != null) {
- rejected.consume(error);
+ if (!isObsolete(rejected)) {
+ rejected.consume(error);
+ }
}
else if (!(error instanceof MessageError)) {
LOG.error(error);
+++ /dev/null
-package org.jetbrains.concurrency;
-
-import com.intellij.util.Consumer;
-
-public interface ObsolescentConsumer<T> extends Consumer<T>, Obsolescent {
-}
@NotNull
@Override
public Promise<T> rejected(@NotNull Consumer<Throwable> rejected) {
- rejected.consume(error);
+ if (!AsyncPromise.isObsolete(rejected)) {
+ rejected.consume(error);
+ }
return this;
}
node.setAlreadySorted(true);
value.resolve()
- .done(new ValueNodeConsumer<FunctionValue>(node) {
+ .done(new ObsolescentConsumer<FunctionValue>(node) {
@Override
public void consume(FunctionValue value) {
Scope[] scopes = value.getScopes();
--- /dev/null
+package org.jetbrains.debugger;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.concurrency.Obsolescent;
+
+public abstract class ObsolescentConsumer<T> implements Obsolescent.Consumer<T> {
+ private final Obsolescent obsolescent;
+
+ protected ObsolescentConsumer(@NotNull Obsolescent obsolescent) {
+ this.obsolescent = obsolescent;
+ }
+
+ @Override
+ public final boolean isObsolete() {
+ return obsolescent.isObsolete();
+ }
+}
\ No newline at end of file
package org.jetbrains.debugger;
-import com.intellij.util.Consumer;
import com.intellij.xdebugger.XDebuggerBundle;
import com.intellij.xdebugger.frame.XCompositeNode;
import com.intellij.xdebugger.frame.XValueChildrenList;
public void computeChildren(final @NotNull XCompositeNode node) {
Promise<Void> promise = Variables.processScopeVariables(scope, node, context, callFrame == null);
if (callFrame != null) {
- promise.done(new ValueNodeConsumer<Void>(node) {
+ promise.done(new ObsolescentConsumer<Void>(node) {
@Override
public void consume(Void ignored) {
callFrame.getReceiverVariable()
- .done(new Consumer<Variable>() {
+ .done(new ObsolescentConsumer<Variable>(node) {
@Override
public void consume(Variable variable) {
node.addChildren(variable == null ? XValueChildrenList.EMPTY : XValueChildrenList.singleton(new VariableView(variable, context)), true);
}
})
- .rejected(new Consumer<Throwable>() {
+ .rejected(new ObsolescentConsumer<Throwable>(node) {
@Override
public void consume(@Nullable Throwable error) {
- if (!node.isObsolete()) {
- node.addChildren(XValueChildrenList.EMPTY, true);
- }
+ node.addChildren(XValueChildrenList.EMPTY, true);
}
});
}
+++ /dev/null
-package org.jetbrains.debugger;
-
-import com.intellij.xdebugger.Obsolescent;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.concurrency.ObsolescentConsumer;
-
-public abstract class ValueNodeConsumer<T> implements ObsolescentConsumer<T> {
- private final Obsolescent node;
-
- protected ValueNodeConsumer(@NotNull Obsolescent node) {
- this.node = node;
- }
-
- @Override
- public final boolean isObsolete() {
- return node.isObsolete();
- }
-}
if (!(variable instanceof ObjectProperty) || ((ObjectProperty)variable).getGetter() == null) {
// it is "used" expression (WEB-6779 Debugger/Variables: Automatically show used variables)
getEvaluateContext().evaluate(variable.getName())
- .done(new ValueNodeConsumer<EvaluateResult>(node) {
+ .done(new ObsolescentConsumer<EvaluateResult>(node) {
@Override
public void consume(EvaluateResult result) {
if (result.wasThrown) {
public void startEvaluation(@NotNull final XFullValueEvaluationCallback callback) {
ValueModifier valueModifier = variable.getValueModifier();
assert valueModifier != null;
- valueModifier.evaluateGet(variable, getEvaluateContext()).done(new Consumer<Value>() {
- @Override
- public void consume(Value value) {
- if (!node.isObsolete()) {
+ valueModifier.evaluateGet(variable, getEvaluateContext())
+ .done(new ObsolescentConsumer<Value>(node) {
+ @Override
+ public void consume(Value value) {
callback.evaluated("");
setEvaluatedValue(value, null, node);
}
- }
- });
+ });
}
}.setShowValuePopup(false));
}