From 06624262213f6df4ece9a5530ac04f9a338f7a62 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 18 Mar 2013 13:50:41 +0400 Subject: [PATCH] v8 and wip sdk: use idea platform ActionCallback --- .../intellij/openapi/util/ActionCallback.java | 2 +- .../intellij/openapi/util/AsyncResult.java | 46 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/platform/core-api/src/com/intellij/openapi/util/ActionCallback.java b/platform/core-api/src/com/intellij/openapi/util/ActionCallback.java index 0c9cffac6995..726b3eaa5376 100644 --- a/platform/core-api/src/com/intellij/openapi/util/ActionCallback.java +++ b/platform/core-api/src/com/intellij/openapi/util/ActionCallback.java @@ -110,7 +110,7 @@ public class ActionCallback implements Disposable { } @NotNull - public final ActionCallback notify(@NotNull final ActionCallback child) { + public ActionCallback notify(@NotNull final ActionCallback child) { return doWhenDone(child.createSetDoneRunnable()).doWhenRejected(child.createSetRejectedRunnable()); } diff --git a/platform/platform-api/src/com/intellij/openapi/util/AsyncResult.java b/platform/platform-api/src/com/intellij/openapi/util/AsyncResult.java index 9e629aa8d7c7..f1b80cddaa65 100644 --- a/platform/platform-api/src/com/intellij/openapi/util/AsyncResult.java +++ b/platform/platform-api/src/com/intellij/openapi/util/AsyncResult.java @@ -15,6 +15,8 @@ */ package com.intellij.openapi.util; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.util.Function; import org.jetbrains.annotations.NotNull; public class AsyncResult extends ActionCallback { @@ -34,6 +36,18 @@ public class AsyncResult extends ActionCallback { return this; } + @NotNull + public AsyncResult subResult(@NotNull Function doneHandler) { + return subResult(new AsyncResult(), doneHandler); + } + + @NotNull + public > SubAsyncResult subResult(@NotNull SubAsyncResult subResult, + @NotNull Function doneHandler) { + doWhenDone(new SubResultDoneCallback(subResult, doneHandler)).notifyWhenRejected(subResult); + return subResult; + } + @NotNull public AsyncResult doWhenDone(@NotNull final Handler handler) { doWhenDone(new Runnable() { @@ -54,6 +68,12 @@ public class AsyncResult extends ActionCallback { return this; } + @NotNull + public final AsyncResult notify(@NotNull final ActionCallback child) { + super.notify(child); + return this; + } + public T getResult() { return myResult; } @@ -77,4 +97,30 @@ public class AsyncResult extends ActionCallback { setRejected(value); } } + + // we don't use inner class, avoid memory leak, we don't want to hold this result while dependent is computing + private static class SubResultDoneCallback> implements Handler { + private static final Logger LOG = Logger.getInstance(SubResultDoneCallback.class); + + private final AsyncSubResult dependentResult; + private final Function doneHandler; + + public SubResultDoneCallback(AsyncSubResult dependentResult, Function doneHandler) { + this.dependentResult = dependentResult; + this.doneHandler = doneHandler; + } + + public void run(Result result) { + SubResult v; + try { + v = doneHandler.fun(result); + } + catch (Throwable e) { + dependentResult.setRejected(); + LOG.error(e); + return; + } + dependentResult.setDone(v); + } + } } \ No newline at end of file