peer-at-code-parser-java/src/dev/peerat/parser/visitor/TokenVisitor.java

71 lines
1.7 KiB
Java

package dev.peerat.parser.visitor;
import java.util.function.Predicate;
import dev.peerat.parser.Token;
import dev.peerat.parser.TokenType;
public class TokenVisitor extends Visitor<Token>{
private Predicate<Token> token;
private Predicate<String> name;
private Predicate<TokenType> type;
private Predicate<Integer> line;
private Predicate<Integer> character;
private boolean propagate;
public TokenVisitor(boolean propagate){
this.propagate = propagate;
}
@Override
public boolean canVisit(Class<?> type){
return type.isAssignableFrom(Token.class);
}
@Override
public boolean canPropagate(){
return this.propagate;
}
public TokenVisitor named(Predicate<String> predicate){
this.name = predicate;
return this;
}
public TokenVisitor type(Predicate<TokenType> predicate){
this.type = predicate;
return this;
}
public TokenVisitor line(Predicate<Integer> predicate){
this.line = predicate;
return this;
}
public TokenVisitor character(Predicate<Integer> predicate){
this.character = predicate;
return this;
}
public TokenVisitor validate(Predicate<Token> predicate){
this.token = predicate;
return this;
}
@Override
public VisitorBag visit(Token element){
VisitorBag bag = new VisitorBag();
if(this.token != null && !this.token.test(element)) return bag;
if(this.name != null && !this.name.test(element.getValue())) return bag;
if(this.type != null && !this.type.test(element.getType())) return bag;
if(this.line != null && !this.line.test(element.getLineNumber())) return bag;
if(this.character != null && !this.character.test(element.getCharacterNumber())) return bag;
bag.compute(element);
return bag;
}
}