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.IValue; public class SetComprehensionWriter extends ComprehensionWriter { public SetComprehensionWriter(java.util.List<Expression> resultExprs, IEvaluator<Result<IValue>> ev) { super(resultExprs, ev); this.writer = VF.setWriter(); this.elementType1 = TF.voidType(); } @SuppressWarnings("unchecked") @Override public void append() { for (Expression resExpr : this.resultExprs) { if(resExpr.isSplice() || resExpr.isSplicePlus()){ Result<IValue> set = resExpr.getArgument().interpret(this.ev); if (set.getType().isSet() || set.getType().isList()) { elementType1 = elementType1.lub(set.getType().getElementType()); writer.insertAll((Iterable<IValue>)set.getValue()); } else { // original code supported slicing on no set? elementType1 = elementType1.lub(set.getType()); writer.insert(set.getValue()); } } else { Result<IValue> res = resExpr.interpret(this.ev); elementType1 = elementType1.lub(res.getType()); writer.insert(res.getValue()); } } } @Override public Result<IValue> done() { return (this.writer == null) ? Comprehension.makeResult( TF.setType(TF.voidType()), VF.set(), this .getContext(this.resultExprs.get(0))) : Comprehension.makeResult( TF.setType(this.elementType1), this.writer.done(), this .getContext(this.resultExprs.get(0))); } }