package de.skuzzle.polly.core.parser.ast.visitor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import de.skuzzle.polly.core.parser.ast.Identifier;
import de.skuzzle.polly.core.parser.ast.Node;
import de.skuzzle.polly.core.parser.ast.ResolvableIdentifier;
import de.skuzzle.polly.core.parser.ast.Root;
import de.skuzzle.polly.core.parser.ast.declarations.Declaration;
import de.skuzzle.polly.core.parser.ast.directives.DelayDirective;
import de.skuzzle.polly.core.parser.ast.directives.Directive;
import de.skuzzle.polly.core.parser.ast.directives.ProblemDirective;
import de.skuzzle.polly.core.parser.ast.expressions.Assignment;
import de.skuzzle.polly.core.parser.ast.expressions.Braced;
import de.skuzzle.polly.core.parser.ast.expressions.Call;
import de.skuzzle.polly.core.parser.ast.expressions.Delete;
import de.skuzzle.polly.core.parser.ast.expressions.Delete.DeleteableIdentifier;
import de.skuzzle.polly.core.parser.ast.expressions.Expression;
import de.skuzzle.polly.core.parser.ast.expressions.Inspect;
import de.skuzzle.polly.core.parser.ast.expressions.NamespaceAccess;
import de.skuzzle.polly.core.parser.ast.expressions.Native;
import de.skuzzle.polly.core.parser.ast.expressions.OperatorCall;
import de.skuzzle.polly.core.parser.ast.expressions.VarAccess;
import de.skuzzle.polly.core.parser.ast.expressions.literals.BooleanLiteral;
import de.skuzzle.polly.core.parser.ast.expressions.literals.ChannelLiteral;
import de.skuzzle.polly.core.parser.ast.expressions.literals.DateLiteral;
import de.skuzzle.polly.core.parser.ast.expressions.literals.FunctionLiteral;
import de.skuzzle.polly.core.parser.ast.expressions.literals.HelpLiteral;
import de.skuzzle.polly.core.parser.ast.expressions.literals.ListLiteral;
import de.skuzzle.polly.core.parser.ast.expressions.literals.NumberLiteral;
import de.skuzzle.polly.core.parser.ast.expressions.literals.ProductLiteral;
import de.skuzzle.polly.core.parser.ast.expressions.literals.StringLiteral;
import de.skuzzle.polly.core.parser.ast.expressions.literals.TimespanLiteral;
import de.skuzzle.polly.core.parser.ast.expressions.literals.UserLiteral;
public class NullTransform implements Transformation {
private final <T extends Node> List<T> transformList(Collection<T> nodes)
throws ASTTraversalException {
if (nodes == null) {
return null;
}
final List<T> result = new ArrayList<T>(nodes.size());
final Iterator<T> it = nodes.iterator();
while (it.hasNext()) {
@SuppressWarnings("unchecked")
final T next = (T) it.next().transform(this);
if (next != null) {
result.add(next);
}
}
return result;
}
@Override
public Identifier transformIdentifier(Identifier node) throws ASTTraversalException {
return node;
}
@Override
public ResolvableIdentifier transformIdentifier(ResolvableIdentifier node)
throws ASTTraversalException {
return node;
}
@Override
public DeleteableIdentifier transformIdentifier(
DeleteableIdentifier node) {
return node;
}
@Override
public Root transformRoot(Root node) throws ASTTraversalException {
node.setCommand(node.getCommand().transform(this));
node.setExpressions(this.transformList(node.getExpressions()));
return node;
}
@Override
public Declaration transformDeclaration(Declaration node)
throws ASTTraversalException {
return node;
}
@Override
public Expression transformAssignment(Assignment node) throws ASTTraversalException {
node.setExpression(node.getExpression().transform(this));
node.setName(node.getName().transform(this));
return node;
}
@Override
public Expression transformBraced(Braced node) throws ASTTraversalException {
node.setExpression(node.getExpression().transform(this));
return node;
}
@Override
public Expression transformCall(Call node) throws ASTTraversalException {
node.setLhs(node.getLhs().transform(this));
node.setRhs(node.getRhs().transform(this));
return node;
}
@Override
public Expression transformDelete(Delete node) throws ASTTraversalException {
return node;
}
@Override
public Expression transformAccess(NamespaceAccess node) throws ASTTraversalException {
node.setLhs(node.getLhs().transform(this));
node.setRhs(node.getRhs().transform(this));
return node;
}
@Override
public Expression transformNative(Native node) throws ASTTraversalException {
return node;
}
@Override
public Expression transformOperatorCall(OperatorCall node)
throws ASTTraversalException {
return this.transformCall(node);
}
@Override
public Expression transformVarAccess(VarAccess node) throws ASTTraversalException {
node.setIdentifier(node.getIdentifier().transform(this));
return node;
}
@Override
public Expression transformBoolean(BooleanLiteral node) {
return node;
}
@Override
public Expression transformString(ChannelLiteral node) throws ASTTraversalException {
return node;
}
@Override
public Expression transformDate(DateLiteral node) throws ASTTraversalException {
return node;
}
@Override
public Expression transformFunction(FunctionLiteral node)
throws ASTTraversalException {
node.setFormal(this.transformList(node.getFormal()));
node.setBody(node.getBody().transform(this));
return node;
}
@Override
public Expression transformList(ListLiteral node) throws ASTTraversalException {
node.setContent(this.transformList(node.getContent()));
return node;
}
@Override
public Expression transformNumber(NumberLiteral node) throws ASTTraversalException {
return node;
}
@Override
public ProductLiteral transformProduct(ProductLiteral node)
throws ASTTraversalException {
node.setContent(this.transformList(node.getContent()));
return node;
}
@Override
public Expression transformString(StringLiteral node) throws ASTTraversalException {
return node;
}
@Override
public Expression transformTimeSpan(TimespanLiteral node)
throws ASTTraversalException {
return node;
}
@Override
public Expression transformUser(UserLiteral node) throws ASTTraversalException {
return node;
}
@Override
public HelpLiteral transformHelp(HelpLiteral node) throws ASTTraversalException {
return node;
}
@Override
public Inspect transformInspect(Inspect node) throws ASTTraversalException {
return node;
}
@Override
public Directive transform(DelayDirective node) throws ASTTraversalException {
node.setTargetTime(node.getTargetTime().transform(this));
return node;
}
@Override
public Directive transform(ProblemDirective node) throws ASTTraversalException {
return node;
}
}