From 78b616e167fc7a69385d09e371c6e7dea01bef1e Mon Sep 17 00:00:00 2001 From: André Arnold Date: Mon, 16 May 2011 07:58:43 +0200 Subject: Fixed DeferredEvalExpression --- .../xtend/backend/common/FutureResultHolder.java | 41 +++++++++++++++++++++- .../xtend/backend/expr/DeferredEvalExpression.java | 4 +-- .../xtend/backend/syslib/FileIoOperations.java | 15 ++++++-- 3 files changed, 54 insertions(+), 6 deletions(-) (limited to 'plugins/org.eclipse.xtend.backend/src') diff --git a/plugins/org.eclipse.xtend.backend/src/org/eclipse/xtend/backend/common/FutureResultHolder.java b/plugins/org.eclipse.xtend.backend/src/org/eclipse/xtend/backend/common/FutureResultHolder.java index 720218ae..8d01e703 100644 --- a/plugins/org.eclipse.xtend.backend/src/org/eclipse/xtend/backend/common/FutureResultHolder.java +++ b/plugins/org.eclipse.xtend.backend/src/org/eclipse/xtend/backend/common/FutureResultHolder.java @@ -15,13 +15,36 @@ public class FutureResultHolder { private Object _value; private QualifiedName _name; private boolean _isReady = false; + private Function _function; + private ExpressionBase _expression; public FutureResultHolder() { + + } + + public FutureResultHolder(Function function) { + _function = function; + } + + public FutureResultHolder(ExpressionBase expression) { + _expression = expression; } - public FutureResultHolder(QualifiedName name) { + public FutureResultHolder(QualifiedName name, Function function) { super(); _name = name; + _function = function; + } + + public Object evaluate (ExecutionContext ctx) throws FutureResultNotReadyException { + if (_function != null) { + return _function.invoke (ctx, new Object[]{}); + } else if (_expression != null) { + _expression.evaluate (ctx); + } else { + throw new FutureResultNotReadyException(); + } + return null; } public Object getValue () throws FutureResultNotReadyException { @@ -43,6 +66,22 @@ public class FutureResultHolder { return _isReady; } + public Function getFunction() { + return _function; + } + + public void setFunction(Function _function) { + this._function = _function; + } + + public ExpressionBase getExpression() { + return _expression; + } + + public void setExpression(ExpressionBase _expression) { + this._expression = _expression; + } + @Override public String toString () { if (!_isReady) diff --git a/plugins/org.eclipse.xtend.backend/src/org/eclipse/xtend/backend/expr/DeferredEvalExpression.java b/plugins/org.eclipse.xtend.backend/src/org/eclipse/xtend/backend/expr/DeferredEvalExpression.java index 53a8cd65..dfc22d8c 100644 --- a/plugins/org.eclipse.xtend.backend/src/org/eclipse/xtend/backend/expr/DeferredEvalExpression.java +++ b/plugins/org.eclipse.xtend.backend/src/org/eclipse/xtend/backend/expr/DeferredEvalExpression.java @@ -31,14 +31,14 @@ public class DeferredEvalExpression extends ExpressionBase { @Override protected Object evaluateInternal(ExecutionContext ctx) { - _result = new FutureResultHolder(); + _result = new FutureResultHolder (_inner); return _result; } public FutureResultHolder evalDeferred (ExecutionContext ctx) { if (_result == null) throw new IllegalStateException(getClass().getSimpleName() + ": FutureResultHolder not initialized, evaluateInternal() must be called first."); - _result.setValue(_inner.evaluate(ctx)); + _result.evaluate (ctx); return _result; } diff --git a/plugins/org.eclipse.xtend.backend/src/org/eclipse/xtend/backend/syslib/FileIoOperations.java b/plugins/org.eclipse.xtend.backend/src/org/eclipse/xtend/backend/syslib/FileIoOperations.java index 21a566cf..d8d048bc 100644 --- a/plugins/org.eclipse.xtend.backend/src/org/eclipse/xtend/backend/syslib/FileIoOperations.java +++ b/plugins/org.eclipse.xtend.backend/src/org/eclipse/xtend/backend/syslib/FileIoOperations.java @@ -19,6 +19,7 @@ import java.util.Map; import org.eclipse.xtend.backend.common.FutureResultHolder; import org.eclipse.xtend.backend.common.EfficientLazyString; import org.eclipse.xtend.backend.util.ErrorHandler; +import org.eclipse.xtend.middleend.javaannotations.AbstractExecutionContextAware; /** @@ -31,7 +32,7 @@ import org.eclipse.xtend.backend.util.ErrorHandler; * * @author Arno Haase (http://www.haase-consulting.com) */ -public final class FileIoOperations { +public final class FileIoOperations extends AbstractExecutionContextAware { private Map _outlets = new HashMap(); public static final String DEFAULT_OUTLET_NAME = "OUT"; @@ -144,7 +145,14 @@ public final class FileIoOperations { try { final Outlet outlet = _outlets.get (outletName); - CharSequence evaluatedContent = content.toString(); + CharSequence evaluatedContent = null; + if (content.isReady()) { + evaluatedContent = content.toString(); + } else { + final Object result = content.evaluate (_ctx); + if (result instanceof CharSequence) + evaluatedContent = (CharSequence) result; + } if (outlet == null) throw new IllegalArgumentException ("no outlet '" + outletName + "' was registered."); @@ -154,7 +162,8 @@ public final class FileIoOperations { final Writer w = outlet.createWriter (fileName, append); try { - w.write (evaluatedContent.toString()); + if (evaluatedContent != null) + w.write (evaluatedContent.toString()); } finally { w.close(); -- cgit v1.2.3