peer-at-code-parser-java/src/dev/peerat/parser/java/tree/ClassTree.java

81 lines
3.7 KiB
Java

package dev.peerat.parser.java.tree;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.Annotation.AnnotableBuffer;
import dev.peerat.parser.java.Class;
import dev.peerat.parser.java.ClassContainer;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.state.RedirectStateTree;
import dev.peerat.parser.state.StateTree;
import dev.peerat.parser.tree.SyntaxTree;
import dev.peerat.parser.tree.SyntaxTreeRegistery;
public class ClassTree extends SyntaxTree<JavaElement> {
public ClassTree(SyntaxTreeRegistery<JavaElement> registery) {
super(registery);
this.current = new StateTree<>();
}
@Override
public void init() {
StateTree<JavaElement> type = registery.getNode(TypeTree.class);
StateTree<JavaElement> clazz_container = registery.getNode(ClassContainerTree.class);
ClassBaseTree clazz_ = registery.getTree(ClassBaseTree.class);
// CLASS
StateTree<JavaElement> clazz = this.current;
StateTree<JavaElement> clazz_base = clazz
.then((validator) -> validator.validate((token) -> token.getValue().equals("class")))
.then(new RedirectStateTree<>(type, (global, local) -> global.set("name", local.get())));
clazz_base.then((validator) -> validator.validate((token) -> token.getValue().equals("{")))
.<JavaElement>end((parent, bag) -> {
Class current = new Class((((AnnotableBuffer) parent).getAnnotationBuffer()), bag.get("name"));
if (parent instanceof ClassContainer)
((ClassContainer) parent).addClass(current);
return current;
}).multiple(clazz_container)
.unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a, b) -> a);
StateTree<JavaElement> clazz_implement = clazz_base
.then((validator) -> validator.validate((token) -> token.getValue().equals("implements")));
StateTree<JavaElement> clazz_implement_name = clazz_implement
.then(new RedirectStateTree<>(type, (global, local) -> {
Token token = global.get("implement");
if (token == null)
global.set("implement", local.get());
else
global.set("implement", token.concat(local.get()));
}));
clazz_implement_name
.then((validator) -> validator.validate((token) -> token.getValue().equals(","),
(bag, token) -> bag.set("implement", bag.<Token>get("implement").concat(token))))
.then(clazz_implement_name);
clazz_implement_name.then((validator) -> validator.validate((token) -> token.getValue().equals("{")))
.<JavaElement>end((parent, bag) -> {
Class current = new Class((((AnnotableBuffer) parent).getAnnotationBuffer()), bag.get("name"),
bag.get("extend"), bag.get("implement"));
if (parent instanceof ClassContainer)
((ClassContainer) parent).addClass(current);
return current;
}).multiple(clazz_container)
.unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a, b) -> a);
StateTree<JavaElement> clazz_extend = clazz_base
.then((validator) -> validator.validate((token) -> token.getValue().equals("extends")))
.then(new RedirectStateTree<>(type, (global, local) -> global.set("extend", local.get())));
clazz_extend.then((validator) -> validator.validate((token) -> token.getValue().equals("{")))
.<JavaElement>end((parent, bag) -> {
Class current = new Class((((AnnotableBuffer) parent).getAnnotationBuffer()), bag.get("name"),
bag.get("extend"), bag.get("implement"));
if (parent instanceof ClassContainer)
((ClassContainer) parent).addClass(current);
return current;
}).multiple(clazz_container)
.unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a, b) -> a);
clazz_extend.then(clazz_implement);
clazz_.getNode().then(clazz);
clazz_.getModifierNode().then(clazz);
}
}