package de.skuzzle.polly.core.parser.ast.lang.operators;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import de.skuzzle.polly.core.parser.Position;
import de.skuzzle.polly.core.parser.ast.declarations.Namespace;
import de.skuzzle.polly.core.parser.ast.declarations.types.Type;
import de.skuzzle.polly.core.parser.ast.declarations.types.TypeVar;
import de.skuzzle.polly.core.parser.ast.expressions.Expression;
import de.skuzzle.polly.core.parser.ast.expressions.literals.ListLiteral;
import de.skuzzle.polly.core.parser.ast.expressions.literals.Literal;
import de.skuzzle.polly.core.parser.ast.lang.UnaryOperator;
import de.skuzzle.polly.core.parser.ast.visitor.ASTTraversalException;
import de.skuzzle.polly.core.parser.ast.visitor.ExecutionVisitor;
import de.skuzzle.polly.tools.collections.Stack;
public class ReverseList extends UnaryOperator<ListLiteral> {
public ReverseList() {
super(OpType.EXCLAMATION);
final TypeVar a = Type.newTypeVar();
this.initTypes(a.listOf(), a.listOf());
}
@Override
protected void exec(Stack<Literal> stack, Namespace ns, ListLiteral operand,
Position resultPos, ExecutionVisitor execVisitor) throws ASTTraversalException {
switch (this.getOp()) {
case EXCLAMATION:
final List<Expression> op = new ArrayList<Expression>(operand.getContent());
Collections.reverse(op);
final ListLiteral r = new ListLiteral(resultPos, op);
r.setUnique(operand.getUnique());
r.setTypes(operand.getTypes());
stack.push(r);
break;
default:
this.invalidOperatorType(this.getOp());
}
}
}