package dev.peerat.parser.java.tree; import dev.peerat.parser.Bag; 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 { public ClassTree(SyntaxTreeRegistery registery) { super(registery); this.current = new StateTree<>(); } @Override public void init() { StateTree type = registery.getNode(TypeTree.class); StateTree clazz_container = registery.getNode(ClassContainerTree.class); ClassBaseTree clazz_ = registery.getTree(ClassBaseTree.class); // CLASS StateTree clazz = this.current; StateTree 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("{"))) .end((parent, bag) -> { Class current = new Class((((AnnotableBuffer) parent).getAnnotationBuffer()), bag.get("modifier") == null ? 0 : bag.get("modifier"),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 clazz_implement = clazz_base .then((validator) -> validator.validate((token) -> token.getValue().equals("implements"))); StateTree 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.get("implement").concat(token)))) .then(clazz_implement_name); clazz_implement_name.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) .end((parent, bag) -> { Class current = new Class((((AnnotableBuffer) parent).getAnnotationBuffer()), bag.get("modifier") == null ? 0 : bag.get("modifier"), 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 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("{"))) .end((parent, bag) -> { Class current = new Class((((AnnotableBuffer) parent).getAnnotationBuffer()), bag.get("modifier") == null ? 0 : bag.get("modifier").get(), 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); } }