package dev.peerat.parser.java; import java.util.Collection; import java.util.List; import java.util.function.Function; import java.util.function.Predicate; import dev.peerat.parser.Token; import dev.peerat.parser.java.Annotation.Annotable; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class Variable extends Annotable{ public static interface VariableContainer{ void addVariable(Variable variable); } private int mod; private Token type; //TODO change to an independant objet ? to split package, name and generic private Token name; private boolean elips; private Value value; public Variable(List annotations, int mod, Token type, Token name){ super(annotations); this.mod = mod; this.type = type; this.name = name; } public Variable(List annotations, int mod, Token type, Token name, boolean elips){ this(annotations, mod, type, name); this.elips = elips; } public Variable(List annotations, int mod, Token type, Token name, boolean elips, Value value){ this(annotations, mod, type, name, elips); this.value = value; } @Override public String toString(){ return "Variable[mod="+mod+", type="+type+", name="+name+", elips="+elips+", value="+value+"]"; } public int getModifier(){ return this.mod; } public Token getType(){ return this.type; } public Token getName(){ return this.name; } public boolean isElipsis(){ return this.elips; } public Value getValue(){ return this.value; } @Override public E find(Predicate finder) { E annotation = super.find(finder); if(annotation != null) return annotation; return value != null ? finder.test(value) ? (E)value : null : null; } @Override public void findAll(Predicate finder, Collection collector) { super.findAll(finder, collector); if(value != null){ if(finder.test(value)) collector.add((E)value); value.findAll(finder, collector); } } @Override public VisitorBag visit(Visitor visitor){ if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); if(!visitor.canPropagate()) return bag; List annotations = getAnnotations(); if(annotations != null) for(Annotation annotation : annotations){ bag.merge(annotation.visit(visitor)); } if(this.value != null) bag.merge(this.value.visit(visitor)); return bag; } @Override public VisitorBag visit(TokenVisitor visitor){ VisitorBag bag = new VisitorBag(); return bag; } }