peer-at-code-parser-java/src/dev/peerat/parser/java/AnnotationClass.java

107 lines
2.3 KiB
Java

package dev.peerat.parser.java;
import java.util.ArrayList;
import java.util.List;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.VisitorBag;
public class AnnotationClass extends ClassBase{
//where mod ????
private Token name;
private Token extend;
private List<JavaElement> elements;
public AnnotationClass(List<Annotation> annotations, Token name){
super(annotations);
this.name = name;
this.elements = new ArrayList<>();
}
@Override
public void addFunction(Function function) {
this.elements.add(function);
}
@Override
public void addVariable(Variable variable) {
this.elements.add(variable);
}
@Override
public void addClass(ClassBase clazz){
this.elements.add(clazz);
}
public Token getName(){
return this.name;
}
public Token getExtension(){
return this.extend;
}
public List<JavaElement> getElements(){
return this.elements;
}
@Override
public void build(Builder builder) throws Exception{
super.build(builder);
builder.append("@interface");
builder.append(name);
if(extend != null){
builder.append(" extends ");
builder.append(extend);
}
builder.append("{");
if(elements != null){
for(JavaElement element : this.elements){
element.build(builder);
}
}
builder.append("}");
}
@Override
public <E extends JavaElement> E find(java.util.function.Function<JavaElement, Boolean> finder){
E annotation = super.find(finder);
if(annotation != null) return annotation;
if(elements != null){
for(JavaElement element : this.elements){
if(finder.apply(element)) return (E) element;
}
}
return null;
}
@Override
public <E extends JavaElement> void findAll(java.util.function.Function<JavaElement, Boolean> finder, List<E> list){
super.findAll(finder, list);
if(elements != null){
for(JavaElement element : this.elements){
if(finder.apply(element)) list.add((E) element);
element.findAll(finder, list);
}
}
}
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag();
bag.merge(super.visit(visitor));
for(JavaElement element : this.elements){
bag.merge(element.visit(visitor));
}
return bag;
}
}