package org.uva.ql.typechecker;
import java.util.ArrayList;
import java.util.List;
import org.uva.ql.ast.expression.Expression;
import org.uva.ql.ast.expression.association.Parenthesis;
import org.uva.ql.ast.expression.binary.Addition;
import org.uva.ql.ast.expression.binary.And;
import org.uva.ql.ast.expression.binary.Binary;
import org.uva.ql.ast.expression.binary.Divide;
import org.uva.ql.ast.expression.binary.Equal;
import org.uva.ql.ast.expression.binary.Greater;
import org.uva.ql.ast.expression.binary.GreaterEqual;
import org.uva.ql.ast.expression.binary.Less;
import org.uva.ql.ast.expression.binary.LessEqual;
import org.uva.ql.ast.expression.binary.Multiply;
import org.uva.ql.ast.expression.binary.NotEqual;
import org.uva.ql.ast.expression.binary.Or;
import org.uva.ql.ast.expression.binary.Substraction;
import org.uva.ql.ast.expression.literal.BoolLiteral;
import org.uva.ql.ast.expression.literal.Identifier;
import org.uva.ql.ast.expression.literal.IntLiteral;
import org.uva.ql.ast.expression.literal.StrLiteral;
import org.uva.ql.ast.expression.unary.Negative;
import org.uva.ql.ast.expression.unary.Not;
import org.uva.ql.ast.expression.unary.Positive;
import org.uva.ql.visitor.ExpressionVisitor;
public class DependencyVisitor implements ExpressionVisitor<List<Identifier>> {
private final List<Identifier> identifiers;
public DependencyVisitor() {
identifiers = new ArrayList<Identifier>();
}
private List<Identifier> visitBinary(Binary node) {
Expression left = node.getLeftExpression();
Expression right = node.getRightExpression();
left.accept(this);
right.accept(this);
return identifiers;
}
@Override
public List<Identifier> visit(Not node) {
return node.getExpression().accept(this);
}
@Override
public List<Identifier> visit(Positive node) {
return node.getExpression().accept(this);
}
@Override
public List<Identifier> visit(Negative node) {
return node.getExpression().accept(this);
}
@Override
public List<Identifier> visit(Addition node) {
return visitBinary(node);
}
@Override
public List<Identifier> visit(Substraction node) {
return visitBinary(node);
}
@Override
public List<Identifier> visit(Multiply node) {
return visitBinary(node);
}
@Override
public List<Identifier> visit(Divide node) {
return visitBinary(node);
}
@Override
public List<Identifier> visit(And node) {
return visitBinary(node);
}
@Override
public List<Identifier> visit(Or node) {
return visitBinary(node);
}
@Override
public List<Identifier> visit(Equal node) {
return visitBinary(node);
}
@Override
public List<Identifier> visit(NotEqual node) {
return visitBinary(node);
}
@Override
public List<Identifier> visit(Greater node) {
return visitBinary(node);
}
@Override
public List<Identifier> visit(GreaterEqual node) {
return visitBinary(node);
}
@Override
public List<Identifier> visit(Less node) {
return visitBinary(node);
}
@Override
public List<Identifier> visit(LessEqual node) {
return visitBinary(node);
}
@Override
public List<Identifier> visit(Identifier node) {
identifiers.add(node);
return identifiers;
}
@Override
public List<Identifier> visit(IntLiteral node) {
return identifiers;
}
@Override
public List<Identifier> visit(BoolLiteral node) {
return identifiers;
}
@Override
public List<Identifier> visit(StrLiteral node) {
return identifiers;
}
@Override
public List<Identifier> visit(Parenthesis node) {
return identifiers;
}
}