81 lines
3.7 KiB
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);
|
|
}
|
|
|
|
}
|