package de.skuzzle.polly.core.parser.ast.declarations.types;
import java.util.HashSet;
import java.util.Set;
/**
* Default {@link TypeVisitor} implementation.
*
* @author Simon Taddiken
*/
public class DefaultTypeVisitor implements TypeVisitor {
private final Set<Type> visited;
public DefaultTypeVisitor() {
this.visited = new HashSet<Type>();
}
@Override
public int before(Type type) {
return CONTINUE;
}
@Override
public int after(Type type) {
return CONTINUE;
}
@Override
public boolean visit(Type type) {
switch (this.before(type)) {
case SKIP: return true;
case ABORT: return false;
}
int after = this.after(type);
this.visited.add(type);
return after != ABORT;
}
@Override
public int before(ProductType p) {
return CONTINUE;
}
@Override
public int after(ProductType p) {
return CONTINUE;
}
@Override
public boolean visit(ProductType p) {
switch (this.before(p)) {
case SKIP: return true;
case ABORT: return false;
}
for (final Type t : p.getTypes()) {
if (!t.visit(this)) {
return false;
}
}
int after = this.after(p);
this.visited.add(p);
return after != ABORT;
}
@Override
public int before(ListType l) {
return CONTINUE;
}
@Override
public int after(ListType l) {
return CONTINUE;
}
@Override
public boolean visit(ListType l) {
switch (this.before(l)) {
case SKIP: return true;
case ABORT: return false;
}
if (!l.getSubType().visit(this)) {
return false;
}
int after = this.after(l);
this.visited.add(l);
return after != ABORT;
}
@Override
public int before(MapType m) {
return CONTINUE;
}
@Override
public int after(MapType m) {
return CONTINUE;
}
@Override
public boolean visit(MapType m) {
switch (this.before(m)) {
case SKIP: return true;
case ABORT: return false;
}
if (!m.getSource().visit(this)) {
return false;
}
if (!m.getTarget().visit(this)) {
return false;
}
int after = this.after(m);
this.visited.add(m);
return after != ABORT;
}
@Override
public int before(TypeVar v) {
return CONTINUE;
}
@Override
public int after(TypeVar v) {
return CONTINUE;
}
public boolean visit(TypeVar v) {
switch (this.before(v)) {
case SKIP: return true;
case ABORT: return false;
}
int after = this.after(v);
this.visited.add(v);
return after != ABORT;
}
}