package dev.peerat.parser.java.visitor; import java.util.function.Predicate; import dev.peerat.parser.java.Class; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class JavaClassVisitor extends JavaVisitor{ private Predicate nameFilter; private Predicate modifierFilter; private Visitor elementVisitor; public JavaClassVisitor(){ super(dev.peerat.parser.java.Class.class); } public JavaClassVisitor nameFilter(Predicate validator){ this.nameFilter = (this.nameFilter == null) ? validator : this.nameFilter.and(validator); return this; } public JavaClassVisitor isPublic(){ Predicate validator = (mod) -> (mod & 0x1) != 0; this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); return this; } public JavaClassVisitor isPrivate(){ Predicate validator = (mod) -> (mod & 0x2) != 0; this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); return this; } public JavaClassVisitor isProtected(){ Predicate validator = (mod) -> (mod & 0x4) != 0; this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); return this; } public JavaClassVisitor isStatic(){ Predicate validator = (mod) -> (mod & 0x8) != 0; this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); return this; } public JavaClassVisitor isFinal(){ Predicate validator = (mod) -> (mod & 0x10) != 0; this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); return this; } public JavaClassVisitor isSynchronized(){ Predicate validator = (mod) -> (mod & 0x20) != 0; this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); return this; } public JavaClassVisitor isVolatile(){ Predicate validator = (mod) -> (mod & 0x40) != 0; this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); return this; } public JavaClassVisitor isTransient(){ Predicate validator = (mod) -> (mod & 0x80) != 0; this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); return this; } public JavaClassVisitor isNative(){ Predicate validator = (mod) -> (mod & 0x100) != 0; this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); return this; } public JavaClassVisitor isAbstract(){ Predicate validator = (mod) -> (mod & 0x400) != 0; this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); return this; } public JavaClassVisitor isStrict(){ Predicate validator = (mod) -> (mod & 0x800) != 0; this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); return this; } public JavaClassVisitor isPackageLevel(){ Predicate validator = (mod) -> (mod & 0x1) == 0 && (mod & 0x2) == 0 && (mod & 0x4) == 0; this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); return this; } public JavaClassVisitor elements(Visitor visitor){ this.elementVisitor = visitor; return this; } // ?? //isSynthetic //isMandated // ?? @Override public VisitorBag visitElement(Class element){ VisitorBag bag = new VisitorBag(); if(nameFilter != null){ if(!nameFilter.test(element.getName().getValue())) return bag; } if(this.modifierFilter != null){ //check MOD } if(this.elementVisitor != null){ for(JavaElement elements : element.getElements()){ VisitorBag visited = this.elementVisitor.visit(elements); bag.merge(visited); if(!visited.isValidated()) return bag; } } bag.compute(element); return bag; } }