package org.rascalmpl.semantics.dynamic;
import org.rascalmpl.ast.Expression;
import org.rascalmpl.interpreter.IEvaluator;
import org.rascalmpl.interpreter.result.Result;
import org.rascalmpl.value.IListWriter;
import org.rascalmpl.value.IValue;
public class ListComprehensionWriter extends ComprehensionWriter {
public ListComprehensionWriter(java.util.List<Expression> resultExprs,
IEvaluator<Result<IValue>> __eval) {
super(resultExprs, __eval);
this.writer = VF.listWriter();
this.elementType1 = TF.voidType();
}
@SuppressWarnings("unchecked")
@Override
public void append() {
for (Expression resExpr : this.resultExprs) {
if(resExpr.isSplice() || resExpr.isSplicePlus()){
Result<IValue> list = resExpr.getArgument().interpret(this.ev);
if (list.getType().isList() || list.getType().isSet()) {
elementType1 = elementType1.lub(list.getType().getElementType());
((IListWriter)writer).appendAll((Iterable<IValue>)list.getValue());
}
else {
// original code supported slicing on no list?
elementType1 = elementType1.lub(list.getType());
((IListWriter)writer).append(list.getValue());
}
}
else {
Result<IValue> res = resExpr.interpret(this.ev);
elementType1 = elementType1.lub(res.getType());
((IListWriter)writer).append(res.getValue());
}
}
}
@Override
public Result<IValue> done() {
return (this.writer == null) ? Comprehension.makeResult(TF
.listType(TF.voidType()), VF.list(), this
.getContext(this.resultExprs.get(0))) : Comprehension.makeResult(TF
.listType(this.elementType1), this.writer.done(), this
.getContext(this.resultExprs.get(0)));
}
}