import com.intellij.util.Consumer;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
-class CountDownConsumer implements Consumer<Void> {
+class CountDownConsumer<T> implements Consumer<T> {
private volatile int countDown;
- private final AsyncPromise<Void> promise;
+ private final AsyncPromise<T> promise;
+ private final T totalResult;
- public CountDownConsumer(int countDown, @NotNull AsyncPromise<Void> promise) {
+ public CountDownConsumer(int countDown, @NotNull AsyncPromise<T> promise, @Nullable T totalResult) {
this.countDown = countDown;
this.promise = promise;
+ this.totalResult = totalResult;
}
@Override
- public void consume(Void t) {
+ public void consume(T t) {
if (--countDown == 0) {
- promise.setResult(null);
+ promise.setResult(totalResult);
}
}
}
\ No newline at end of file
package org.jetbrains.debugger;
-import com.intellij.openapi.util.ActionCallback;
-import com.intellij.openapi.util.AsyncResult;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.Conditions;
import com.intellij.ui.SimpleTextAttributes;
-import com.intellij.util.Consumer;
import com.intellij.xdebugger.frame.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.concurrency.AsyncFunction;
+import org.jetbrains.concurrency.AsyncPromise;
+import org.jetbrains.concurrency.Promise;
import org.jetbrains.debugger.values.ObjectValue;
import javax.swing.*;
+import java.util.ArrayList;
import java.util.List;
public class TestCompositeNode implements XCompositeNode {
- private final AsyncResult<XValueChildrenList> result = new AsyncResult<XValueChildrenList>();
+ private final AsyncPromise<XValueChildrenList> result = new AsyncPromise<XValueChildrenList>();
private final XValueChildrenList children = new XValueChildrenList();
private final XValueGroup valueGroup;
}
if (last) {
- result.setDone(this.children);
+ result.setResult(this.children);
}
}
@Override
public void tooManyChildren(int remaining) {
- result.setDone(children);
+ result.setResult(children);
}
@Override
@Override
public void setErrorMessage(@NotNull String errorMessage) {
- result.reject(errorMessage);
+ result.setError(Promise.createError(errorMessage));
}
@Override
}
@NotNull
- public AsyncResult<XValueChildrenList> getResult() {
+ public Promise<XValueChildrenList> getResult() {
return result;
}
@NotNull
- public AsyncResult<Content> loadContent(@NotNull final Condition<XValueGroup> groupContentResolveCondition, @NotNull final Condition<VariableView> valueSubContentResolveCondition) {
+ public Promise<Content> loadContent(@NotNull final Condition<XValueGroup> groupContentResolveCondition, @NotNull final Condition<VariableView> valueSubContentResolveCondition) {
assert content == null;
- final AsyncResult<Content> compoundResult = new AsyncResult<Content>();
content = new Content();
- result.doWhenDone(new Consumer<XValueChildrenList>() {
+ return result.then(new AsyncFunction<XValueChildrenList, Content>() {
+ private void resolveGroups(@NotNull List<XValueGroup> valueGroups, @NotNull List<TestCompositeNode> resultNodes, @NotNull List<Promise<?>> promises) {
+ for (XValueGroup group : valueGroups) {
+ TestCompositeNode node = new TestCompositeNode(group);
+ boolean computeChildren = groupContentResolveCondition.value(group);
+ if (computeChildren) {
+ group.computeChildren(node);
+ }
+ resultNodes.add(node);
+ if (computeChildren) {
+ promises.add(node.loadContent(Conditions.<XValueGroup>alwaysFalse(), valueSubContentResolveCondition));
+ }
+ }
+ }
+
+ @NotNull
@Override
- public void consume(XValueChildrenList children) {
- ActionCallback.Chunk chunk = new ActionCallback.Chunk();
- resolveGroups(children.getTopGroups(), content.topGroups, chunk);
+ public Promise<Content> fun(XValueChildrenList list) {
+ List<Promise<?>> promises = new ArrayList<Promise<?>>();
+ resolveGroups(children.getTopGroups(), content.topGroups, promises);
for (int i = 0; i < children.size(); i++) {
XValue value = children.getValue(i);
node.myName = children.getName(i);
value.computePresentation(node, XValuePlace.TREE);
content.values.add(node);
- chunk.add(node.getResult());
+ promises.add(node.getResult());
// myHasChildren could be not computed yet
if (value instanceof VariableView && ((VariableView)value).getValue() instanceof ObjectValue && valueSubContentResolveCondition.value((VariableView)value)) {
- chunk.add(node.loadChildren(value));
+ promises.add(node.loadChildren(value));
}
}
- resolveGroups(children.getBottomGroups(), content.bottomGroups, chunk);
+ resolveGroups(children.getBottomGroups(), content.bottomGroups, promises);
- chunk.create().doWhenDone(new Runnable() {
- @Override
- public void run() {
- compoundResult.setDone(content);
- }
- }).notifyWhenRejected(compoundResult);
- }
-
- private void resolveGroups(@NotNull List<XValueGroup> valueGroups, @NotNull List<TestCompositeNode> resultNodes, @NotNull ActionCallback.Chunk chunk) {
- for (XValueGroup group : valueGroups) {
- TestCompositeNode node = new TestCompositeNode(group);
- boolean computeChildren = groupContentResolveCondition.value(group);
- if (computeChildren) {
- group.computeChildren(node);
- }
- resultNodes.add(node);
- if (computeChildren) {
- chunk.add(node.loadContent(Conditions.<XValueGroup>alwaysFalse(), valueSubContentResolveCondition));
- }
- }
+ return Promise.all(promises, content);
}
- }).notifyWhenRejected(compoundResult);
- return compoundResult;
+ });
}
}
\ No newline at end of file
package org.jetbrains.debugger;
-import com.intellij.openapi.util.AsyncResult;
import com.intellij.openapi.util.Conditions;
import com.intellij.util.Consumer;
import com.intellij.xdebugger.XTestValueNode;
import com.intellij.xdebugger.frame.presentation.XValuePresentation;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.concurrency.AsyncPromise;
+import org.jetbrains.concurrency.Promise;
import javax.swing.*;
public class TestValueNode extends XTestValueNode {
- private final AsyncResult<XTestValueNode> result = new AsyncResult<XTestValueNode>();
+ private final AsyncPromise<XTestValueNode> result = new AsyncPromise<XTestValueNode>();
private volatile Content children;
@NotNull
- public AsyncResult<XTestValueNode> getResult() {
+ public Promise<XTestValueNode> getResult() {
return result;
}
@NotNull
- public AsyncResult<Content> loadChildren(@NotNull XValue value) {
+ public Promise<Content> loadChildren(@NotNull XValue value) {
TestCompositeNode childrenNode = new TestCompositeNode();
value.computeChildren(childrenNode);
- return childrenNode.loadContent(Conditions.<XValueGroup>alwaysFalse(), Conditions.<VariableView>alwaysFalse()).doWhenDone(new Consumer<Content>() {
- @Override
- public void consume(Content content) {
- children = content;
- }
- });
+ return childrenNode.loadContent(Conditions.<XValueGroup>alwaysFalse(), Conditions.<VariableView>alwaysFalse())
+ .done(new Consumer<Content>() {
+ @Override
+ public void consume(Content content) {
+ children = content;
+ }
+ });
}
@Nullable
public void applyPresentation(@Nullable Icon icon, @NotNull XValuePresentation valuePresentation, boolean hasChildren) {
super.applyPresentation(icon, valuePresentation, hasChildren);
- result.setDone(this);
+ result.setResult(this);
}
}
\ No newline at end of file