Visitor Propagation

This commit is contained in:
jeffcheasey88 2025-04-27 21:59:00 +02:00
parent ce15d7e435
commit e0716ef657
48 changed files with 251 additions and 126 deletions

View file

@ -116,6 +116,7 @@ public class Annotation extends JavaElement{
public VisitorBag visit(Visitor<JavaElement> visitor) { public VisitorBag visit(Visitor<JavaElement> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this); if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag(); VisitorBag bag = new VisitorBag();
if(!visitor.canPropagate()) return bag;
if(this.values != null) if(this.values != null)
for(Value value : this.values.values()){ for(Value value : this.values.values()){

View file

@ -70,6 +70,7 @@ public class AnnotationClass extends ClassBase{
public VisitorBag visit(Visitor<JavaElement> visitor) { public VisitorBag visit(Visitor<JavaElement> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this); if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag(); VisitorBag bag = new VisitorBag();
if(!visitor.canPropagate()) return bag;
bag.merge(super.visit(visitor)); bag.merge(super.visit(visitor));

View file

@ -79,14 +79,13 @@ public class Class extends ClassBase{
@Override @Override
public VisitorBag visit(Visitor<JavaElement> visitor) { public VisitorBag visit(Visitor<JavaElement> visitor) {
System.out.println("VISIT CLASS "+visitor);
if(visitor.canVisit(getClass())) return visitor.visit(this); if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag(); VisitorBag bag = new VisitorBag();
if(!visitor.canPropagate()) return bag;
bag.merge(super.visit(visitor)); bag.merge(super.visit(visitor));
for(JavaElement element : this.elements){ for(JavaElement element : this.elements){
System.out.println("VISIT CLASS "+visitor+" -> "+element);
bag.merge(element.visit(visitor)); bag.merge(element.visit(visitor));
} }

View file

@ -51,6 +51,8 @@ public abstract class ClassBase extends Annotable implements AnnotableBuffer, Cl
public VisitorBag visit(Visitor<JavaElement> visitor){ public VisitorBag visit(Visitor<JavaElement> visitor){
if(visitor.canVisit(getClass())) return visitor.visit(this); if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag(); VisitorBag bag = new VisitorBag();
if(!visitor.canPropagate()) return bag;
List<Annotation> annotations = getAnnotations(); List<Annotation> annotations = getAnnotations();
if(annotations != null) if(annotations != null)
for(Annotation annotation : annotations){ for(Annotation annotation : annotations){

View file

@ -75,6 +75,7 @@ public class Enumeration extends ClassBase{
public VisitorBag visit(Visitor<JavaElement> visitor) { public VisitorBag visit(Visitor<JavaElement> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this); if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag(); VisitorBag bag = new VisitorBag();
if(!visitor.canPropagate()) return bag;
bag.merge(super.visit(visitor)); bag.merge(super.visit(visitor));

View file

@ -138,6 +138,7 @@ public class Function extends Annotable implements VariableContainer, OperationC
public VisitorBag visit(Visitor<JavaElement> visitor){ public VisitorBag visit(Visitor<JavaElement> visitor){
if(visitor.canVisit(getClass())) return visitor.visit(this); if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag(); VisitorBag bag = new VisitorBag();
if(!visitor.canPropagate()) return bag;
List<Annotation> annotations = getAnnotations(); List<Annotation> annotations = getAnnotations();
if(annotations != null) if(annotations != null)

View file

@ -39,7 +39,7 @@ public class Import extends JavaElement{
@Override @Override
public VisitorBag visit(Visitor<JavaElement> visitor) { public VisitorBag visit(Visitor<JavaElement> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this); if(visitor.canVisit(getClass())) return visitor.visit(this);
return null; return new VisitorBag();
} }
} }

View file

@ -75,6 +75,7 @@ public class Interface extends ClassBase{
public VisitorBag visit(Visitor<JavaElement> visitor){ public VisitorBag visit(Visitor<JavaElement> visitor){
if(visitor.canVisit(getClass())) return visitor.visit(this); if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag(); VisitorBag bag = new VisitorBag();
if(!visitor.canPropagate()) return bag;
bag.merge(super.visit(visitor)); bag.merge(super.visit(visitor));

View file

@ -89,6 +89,7 @@ public class JavaFile extends JavaElement implements ClassContainer, AnnotableBu
public VisitorBag visit(Visitor<JavaElement> visitor){ public VisitorBag visit(Visitor<JavaElement> visitor){
if(visitor.canVisit(getClass())) return visitor.visit(this); if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag(); VisitorBag bag = new VisitorBag();
if(!visitor.canPropagate()) return bag;
if(this.imports != null) if(this.imports != null)
for(Import imp : this.imports){ for(Import imp : this.imports){

View file

@ -86,6 +86,7 @@ public class Variable extends Annotable{
public VisitorBag visit(Visitor<JavaElement> visitor){ public VisitorBag visit(Visitor<JavaElement> visitor){
if(visitor.canVisit(getClass())) return visitor.visit(this); if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag(); VisitorBag bag = new VisitorBag();
if(!visitor.canPropagate()) return bag;
List<Annotation> annotations = getAnnotations(); List<Annotation> annotations = getAnnotations();
if(annotations != null) if(annotations != null)

View file

@ -4,7 +4,6 @@ import java.util.List;
import java.util.function.Function; import java.util.function.Function;
import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag; import dev.peerat.parser.visitor.VisitorBag;
@ -40,6 +39,8 @@ public class ArrayAccessValue extends Value{
public VisitorBag visit(Visitor<JavaElement> visitor) { public VisitorBag visit(Visitor<JavaElement> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this); if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag(); VisitorBag bag = new VisitorBag();
bag.merge(this.base.visit(visitor));
bag.merge(this.access.visit(visitor));
return bag; return bag;
} }

View file

@ -4,7 +4,6 @@ import java.util.List;
import java.util.function.Function; import java.util.function.Function;
import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag; import dev.peerat.parser.visitor.VisitorBag;
@ -34,6 +33,7 @@ public class ArrayValue extends Value{
public VisitorBag visit(Visitor<JavaElement> visitor) { public VisitorBag visit(Visitor<JavaElement> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this); if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag(); VisitorBag bag = new VisitorBag();
for(Value value : this.values) bag.merge(value.visit(visitor));
return bag; return bag;
} }

View file

@ -51,6 +51,8 @@ public class BiValue extends Value{
public VisitorBag visit(Visitor<JavaElement> visitor) { public VisitorBag visit(Visitor<JavaElement> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this); if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag(); VisitorBag bag = new VisitorBag();
bag.merge(left.visit(visitor));
bag.merge(right.visit(visitor));
return bag; return bag;
} }
} }

View file

@ -5,7 +5,6 @@ import java.util.function.Function;
import dev.peerat.parser.Token; import dev.peerat.parser.Token;
import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag; import dev.peerat.parser.visitor.VisitorBag;
@ -41,6 +40,7 @@ public class CastValue extends Value{
public VisitorBag visit(Visitor<JavaElement> visitor) { public VisitorBag visit(Visitor<JavaElement> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this); if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag(); VisitorBag bag = new VisitorBag();
bag.merge(value.visit(visitor));
return bag; return bag;
} }

View file

@ -11,7 +11,6 @@ import dev.peerat.parser.java.Annotation;
import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.Variable; import dev.peerat.parser.java.Variable;
import dev.peerat.parser.java.Variable.VariableContainer; import dev.peerat.parser.java.Variable.VariableContainer;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag; import dev.peerat.parser.visitor.VisitorBag;
@ -77,6 +76,9 @@ public class InstanceValue extends Value implements VariableContainer, FunctionC
public VisitorBag visit(Visitor<JavaElement> visitor) { public VisitorBag visit(Visitor<JavaElement> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this); if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag(); VisitorBag bag = new VisitorBag();
for(Value value : parameters) bag.merge(value.visit(visitor));
for(JavaElement content : elements) bag.merge(content.visit(visitor));
return bag; return bag;
} }

View file

@ -11,7 +11,6 @@ import dev.peerat.parser.java.Variable.VariableContainer;
import dev.peerat.parser.java.operation.Operation; import dev.peerat.parser.java.operation.Operation;
import dev.peerat.parser.java.operation.Operation.OperationContainer; import dev.peerat.parser.java.operation.Operation.OperationContainer;
import dev.peerat.parser.java.value.Value.ValueContainer; import dev.peerat.parser.java.value.Value.ValueContainer;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag; import dev.peerat.parser.visitor.VisitorBag;

View file

@ -5,7 +5,6 @@ import java.util.function.Function;
import dev.peerat.parser.Token; import dev.peerat.parser.Token;
import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag; import dev.peerat.parser.visitor.VisitorBag;
@ -53,6 +52,9 @@ public class MethodCallValue extends Value{
public VisitorBag visit(Visitor<JavaElement> visitor){ public VisitorBag visit(Visitor<JavaElement> visitor){
if(visitor.canVisit(getClass())) return visitor.visit(this); if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag(); VisitorBag bag = new VisitorBag();
if(base != null) bag.merge(base.visit(visitor));
System.out.println("go on "+parameters);
for(Value value : parameters) bag.merge(value.visit(visitor));
return bag; return bag;
} }

View file

@ -5,7 +5,6 @@ import java.util.function.Function;
import dev.peerat.parser.Token; import dev.peerat.parser.Token;
import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag; import dev.peerat.parser.visitor.VisitorBag;
@ -46,6 +45,7 @@ public class ModifierValue extends Value{
public VisitorBag visit(Visitor<JavaElement> visitor) { public VisitorBag visit(Visitor<JavaElement> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this); if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag(); VisitorBag bag = new VisitorBag();
bag.merge(value.visit(visitor));
return bag; return bag;
} }
} }

View file

@ -5,7 +5,6 @@ import java.util.function.Function;
import dev.peerat.parser.Token; import dev.peerat.parser.Token;
import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag; import dev.peerat.parser.visitor.VisitorBag;

View file

@ -4,7 +4,6 @@ import java.util.List;
import java.util.function.Function; import java.util.function.Function;
import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag; import dev.peerat.parser.visitor.VisitorBag;
@ -51,6 +50,9 @@ public class TriValue extends Value{
public VisitorBag visit(Visitor<JavaElement> visitor) { public VisitorBag visit(Visitor<JavaElement> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this); if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag(); VisitorBag bag = new VisitorBag();
bag.merge(check.visit(visitor));
bag.merge(success.visit(visitor));
bag.merge(fail.visit(visitor));
return bag; return bag;
} }

View file

@ -5,7 +5,6 @@ import java.util.function.Function;
import dev.peerat.parser.Token; import dev.peerat.parser.Token;
import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag; import dev.peerat.parser.visitor.VisitorBag;
@ -41,6 +40,7 @@ public class VariableAccessValue extends Value{
public VisitorBag visit(Visitor<JavaElement> visitor) { public VisitorBag visit(Visitor<JavaElement> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this); if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag(); VisitorBag bag = new VisitorBag();
bag.merge(base.visit(visitor));
return bag; return bag;
} }

View file

@ -5,8 +5,8 @@ import dev.peerat.parser.visitor.VisitorBag;
public class JavaAnnotationClassVisitor extends JavaVisitor<AnnotationClass>{ public class JavaAnnotationClassVisitor extends JavaVisitor<AnnotationClass>{
public JavaAnnotationClassVisitor(){ public JavaAnnotationClassVisitor(boolean propagate){
super(AnnotationClass.class); super(AnnotationClass.class, propagate);
} }
@Override @Override

View file

@ -18,8 +18,8 @@ public class JavaAnnotationVisitor extends JavaVisitor<Annotation>{
private BiPredicate<String, Value> valueFilter; private BiPredicate<String, Value> valueFilter;
private Function<String, JavaVisitor<?>> valueFilterVisitor; private Function<String, JavaVisitor<?>> valueFilterVisitor;
public JavaAnnotationVisitor(){ public JavaAnnotationVisitor(boolean propagate){
super(Annotation.class); super(Annotation.class, propagate);
} }
public JavaAnnotationVisitor nameFilter(Predicate<String> validator){ public JavaAnnotationVisitor nameFilter(Predicate<String> validator){

View file

@ -12,8 +12,8 @@ public class JavaClassBaseVisitor extends JavaVisitor<ClassBase>{
private Visitor<JavaElement> validator; private Visitor<JavaElement> validator;
public JavaClassBaseVisitor(){ public JavaClassBaseVisitor(boolean propagate){
super(ClassBase.class); super(ClassBase.class, propagate);
} }
public JavaClassBaseVisitor annotationFilter(Visitor<JavaElement> visitor){ public JavaClassBaseVisitor annotationFilter(Visitor<JavaElement> visitor){

View file

@ -13,8 +13,8 @@ public class JavaClassVisitor extends JavaVisitor<dev.peerat.parser.java.Class>{
private Predicate<Integer> modifierFilter; private Predicate<Integer> modifierFilter;
private Visitor<JavaElement> elementVisitor; private Visitor<JavaElement> elementVisitor;
public JavaClassVisitor(){ public JavaClassVisitor(boolean propagate){
super(dev.peerat.parser.java.Class.class); super(dev.peerat.parser.java.Class.class, propagate);
} }
public JavaClassVisitor nameFilter(Predicate<String> validator){ public JavaClassVisitor nameFilter(Predicate<String> validator){
@ -116,11 +116,15 @@ public class JavaClassVisitor extends JavaVisitor<dev.peerat.parser.java.Class>{
} }
if(this.elementVisitor != null){ if(this.elementVisitor != null){
for(JavaElement elements : element.getElements()){ boolean validatedOne = false;
VisitorBag visited = this.elementVisitor.visit(elements); for(JavaElement content : element.getElements()){
bag.merge(visited); VisitorBag visited = content.visit(this.elementVisitor);
if(!visited.isValidated()) return bag; if(visited.isValidated()){
bag.merge(visited);
validatedOne = true;
}
} }
if(!validatedOne) return bag;
} }
bag.compute(element); bag.compute(element);

View file

@ -5,8 +5,8 @@ import dev.peerat.parser.visitor.VisitorBag;
public class JavaEnumerationVisitor extends JavaVisitor<Enumeration>{ public class JavaEnumerationVisitor extends JavaVisitor<Enumeration>{
public JavaEnumerationVisitor(){ public JavaEnumerationVisitor(boolean propagate){
super(Enumeration.class); super(Enumeration.class,propagate);
} }
@Override @Override

View file

@ -5,8 +5,8 @@ import dev.peerat.parser.visitor.VisitorBag;
public class JavaFunctionVisitor extends JavaVisitor<Function>{ public class JavaFunctionVisitor extends JavaVisitor<Function>{
public JavaFunctionVisitor(){ public JavaFunctionVisitor(boolean propagate){
super(Function.class); super(Function.class, propagate);
} }
@Override @Override

View file

@ -13,8 +13,8 @@ public class JavaImportVisitor extends JavaVisitor<Import>{
private boolean staticPredicate; private boolean staticPredicate;
private boolean nonStaticPredicate; private boolean nonStaticPredicate;
public JavaImportVisitor(){ public JavaImportVisitor(boolean propagate){
super(Import.class); super(Import.class, propagate);
} }
public JavaImportVisitor named(Predicate<String> predicate){ public JavaImportVisitor named(Predicate<String> predicate){

View file

@ -5,8 +5,8 @@ import dev.peerat.parser.visitor.VisitorBag;
public class JavaInterfaceVisitor extends JavaVisitor<Interface>{ public class JavaInterfaceVisitor extends JavaVisitor<Interface>{
public JavaInterfaceVisitor(){ public JavaInterfaceVisitor(boolean propagate){
super(Interface.class); super(Interface.class, propagate);
} }
@Override @Override

View file

@ -11,8 +11,8 @@ public class JavaVariableVisitor extends JavaVisitor<Variable>{
private Predicate<String> nameFilter; private Predicate<String> nameFilter;
private Predicate<Integer> modifierFilter; private Predicate<Integer> modifierFilter;
public JavaVariableVisitor(){ public JavaVariableVisitor(boolean propagate){
super(Variable.class); super(Variable.class, propagate);
} }
public JavaVariableVisitor typeFilter(Predicate<String> validator){ public JavaVariableVisitor typeFilter(Predicate<String> validator){

View file

@ -22,7 +22,7 @@ public abstract class JavaVisitor<T extends JavaElement> extends Visitor<JavaEle
//TODO current system don't do litteraly ALL, juste DIRECT SUB ELEMENT //TODO current system don't do litteraly ALL, juste DIRECT SUB ELEMENT
public static <T extends JavaElement> JavaVisitor<T> base(Visitor<T> visitor){ public static <T extends JavaElement> JavaVisitor<T> base(Visitor<T> visitor){
return new JavaVisitor<T>(null){ return new JavaVisitor<T>(null,true){
@Override @Override
public boolean canVisit(Class<?> type){ public boolean canVisit(Class<?> type){
@ -36,9 +36,9 @@ public abstract class JavaVisitor<T extends JavaElement> extends Visitor<JavaEle
} }
}; };
} }
public static JavaVisitor<JavaElement> allJavaElement(){ private static JavaVisitor<JavaElement> javaElement(boolean propagate){
return new JavaVisitor<JavaElement>(JavaElement.class){ return new JavaVisitor<JavaElement>(JavaElement.class, propagate){
@Override @Override
public VisitorBag visitElement(JavaElement element){ public VisitorBag visitElement(JavaElement element){
@ -49,99 +49,204 @@ public abstract class JavaVisitor<T extends JavaElement> extends Visitor<JavaEle
}; };
} }
public static JavaVisitor<JavaElement> allJavaElement(){
return javaElement(true);
}
public static JavaClassBaseVisitor allClassBase(){ public static JavaClassBaseVisitor allClassBase(){
return new JavaClassBaseVisitor(); return new JavaClassBaseVisitor(true);
} }
public static JavaClassVisitor allClass(){ public static JavaClassVisitor allClass(){
return new JavaClassVisitor(); return new JavaClassVisitor(true);
} }
public static JavaInterfaceVisitor allInterface(){ public static JavaInterfaceVisitor allInterface(){
return new JavaInterfaceVisitor(); return new JavaInterfaceVisitor(true);
} }
public static JavaEnumerationVisitor allEnum(){ public static JavaEnumerationVisitor allEnum(){
return new JavaEnumerationVisitor(); return new JavaEnumerationVisitor(true);
} }
public static JavaAnnotationClassVisitor allAnnotationClass(){ public static JavaAnnotationClassVisitor allAnnotationClass(){
return new JavaAnnotationClassVisitor(); return new JavaAnnotationClassVisitor(true);
} }
public static JavaAnnotationVisitor allAnnotation(){ public static JavaAnnotationVisitor allAnnotation(){
return new JavaAnnotationVisitor(); return new JavaAnnotationVisitor(true);
} }
public static JavaVariableVisitor allVariable(){ public static JavaVariableVisitor allVariable(){
return new JavaVariableVisitor(); return new JavaVariableVisitor(true);
} }
public static JavaFunctionVisitor allFunction(){ public static JavaFunctionVisitor allFunction(){
return new JavaFunctionVisitor(); return new JavaFunctionVisitor(true);
} }
public static JavaValueVisitor allValue(){ public static JavaValueVisitor allValue(){
return new JavaValueVisitor(); return new JavaValueVisitor(true);
} }
public static JavaArrayAccessValueVisitor allArrayAccessValue(){ public static JavaArrayAccessValueVisitor allArrayAccessValue(){
return new JavaArrayAccessValueVisitor(); return new JavaArrayAccessValueVisitor(true);
} }
public static JavaArrayValueVisitor allArrayValue(){ public static JavaArrayValueVisitor allArrayValue(){
return new JavaArrayValueVisitor(); return new JavaArrayValueVisitor(true);
} }
public static JavaBiValueVisitor allBiValue(){ public static JavaBiValueVisitor allBiValue(){
return new JavaBiValueVisitor(); return new JavaBiValueVisitor(true);
} }
public static JavaCastValueVisitor allCastValue(){ public static JavaCastValueVisitor allCastValue(){
return new JavaCastValueVisitor(); return new JavaCastValueVisitor(true);
} }
public static JavaInstanceValueVisitor allInstanceValue(){ public static JavaInstanceValueVisitor allInstanceValue(){
return new JavaInstanceValueVisitor(); return new JavaInstanceValueVisitor(true);
} }
public static JavaLambdaValueVisitor allLambdaValue(){ public static JavaLambdaValueVisitor allLambdaValue(){
return new JavaLambdaValueVisitor(); return new JavaLambdaValueVisitor(true);
} }
public static JavaMethodCallValueVisitor allMethodCallValue(){ public static JavaMethodCallValueVisitor allMethodCallValue(){
return new JavaMethodCallValueVisitor(); return new JavaMethodCallValueVisitor(true);
} }
public static JavaModifierValueVisitor allModifierValue(){ public static JavaModifierValueVisitor allModifierValue(){
return new JavaModifierValueVisitor(); return new JavaModifierValueVisitor(true);
} }
public static JavaStaticValueVisitor allStaticValue(){ public static JavaStaticValueVisitor allStaticValue(){
return new JavaStaticValueVisitor(); return new JavaStaticValueVisitor(true);
} }
public static JavaTriValueVisitor allTriValue(){ public static JavaTriValueVisitor allTriValue(){
return new JavaTriValueVisitor(); return new JavaTriValueVisitor(true);
} }
public static JavaVariableAccessValueVisitor allVariableAccessValue(){ public static JavaVariableAccessValueVisitor allVariableAccessValue(){
return new JavaVariableAccessValueVisitor(); return new JavaVariableAccessValueVisitor(true);
} }
public static JavaOperationVisitor allOperation(){ public static JavaOperationVisitor allOperation(){
return new JavaOperationVisitor(); return new JavaOperationVisitor(true);
} }
public static JavaImportVisitor allImport(){ public static JavaImportVisitor allImport(){
return new JavaImportVisitor(); return new JavaImportVisitor(true);
}
public static JavaVisitor<JavaElement> javaElement(){
return javaElement(false);
}
public static JavaClassBaseVisitor classBase(){
return new JavaClassBaseVisitor(false);
}
public static JavaClassVisitor clazz(){
return new JavaClassVisitor(false);
}
public static JavaInterfaceVisitor interfaceClass(){
return new JavaInterfaceVisitor(false);
}
public static JavaEnumerationVisitor enumClass(){
return new JavaEnumerationVisitor(false);
}
public static JavaAnnotationClassVisitor annotationClass(){
return new JavaAnnotationClassVisitor(false);
}
public static JavaAnnotationVisitor annotation(){
return new JavaAnnotationVisitor(false);
}
public static JavaVariableVisitor variable(){
return new JavaVariableVisitor(false);
}
public static JavaFunctionVisitor function(){
return new JavaFunctionVisitor(false);
}
public static JavaValueVisitor value(){
return new JavaValueVisitor(false);
}
public static JavaArrayAccessValueVisitor arrayAccessValue(){
return new JavaArrayAccessValueVisitor(false);
}
public static JavaArrayValueVisitor arrayValue(){
return new JavaArrayValueVisitor(false);
}
public static JavaBiValueVisitor biValue(){
return new JavaBiValueVisitor(false);
}
public static JavaCastValueVisitor castValue(){
return new JavaCastValueVisitor(false);
}
public static JavaInstanceValueVisitor instanceValue(){
return new JavaInstanceValueVisitor(false);
}
public static JavaLambdaValueVisitor lambdaValue(){
return new JavaLambdaValueVisitor(false);
}
public static JavaMethodCallValueVisitor methodCallValue(){
return new JavaMethodCallValueVisitor(false);
}
public static JavaModifierValueVisitor modifierValue(){
return new JavaModifierValueVisitor(false);
}
public static JavaStaticValueVisitor staticValue(){
return new JavaStaticValueVisitor(false);
}
public static JavaTriValueVisitor triValue(){
return new JavaTriValueVisitor(false);
}
public static JavaVariableAccessValueVisitor variableAccessValue(){
return new JavaVariableAccessValueVisitor(false);
}
public static JavaOperationVisitor operation(){
return new JavaOperationVisitor(false);
}
public static JavaImportVisitor imp(){
return new JavaImportVisitor(false);
} }
private Class<?> type; private Class<?> type;
private boolean propagate;
public JavaVisitor(Class<?> type){ public JavaVisitor(Class<?> type, boolean propagate){
this.type = type; this.type = type;
this.propagate = propagate;
} }
@Override @Override
@ -150,6 +255,11 @@ public abstract class JavaVisitor<T extends JavaElement> extends Visitor<JavaEle
return this.type.isAssignableFrom(type); return this.type.isAssignableFrom(type);
} }
@Override
public boolean canPropagate(){
return this.propagate;
}
@Override @Override
public VisitorBag visit(JavaElement element){ public VisitorBag visit(JavaElement element){
return visitElement((T) element); return visitElement((T) element);

View file

@ -6,8 +6,8 @@ import dev.peerat.parser.visitor.VisitorBag;
public class JavaOperationVisitor extends JavaVisitor<Operation>{ public class JavaOperationVisitor extends JavaVisitor<Operation>{
public JavaOperationVisitor(){ public JavaOperationVisitor(boolean propagate){
super(Operation.class); super(Operation.class, propagate);
} }
@Override @Override

View file

@ -11,8 +11,8 @@ public class JavaArrayAccessValueVisitor extends JavaVisitor<ArrayAccessValue>{
private Visitor<Value> basePredicate; private Visitor<Value> basePredicate;
private Visitor<Value> accessPredicate; private Visitor<Value> accessPredicate;
public JavaArrayAccessValueVisitor(){ public JavaArrayAccessValueVisitor(boolean propagate){
super(ArrayAccessValue.class); super(ArrayAccessValue.class, propagate);
} }
public JavaArrayAccessValueVisitor checkBase(Visitor<Value> visitor){ public JavaArrayAccessValueVisitor checkBase(Visitor<Value> visitor){

View file

@ -6,8 +6,8 @@ import dev.peerat.parser.java.visitor.JavaVisitor;
public class JavaArrayValueVisitor extends JavaVisitor<ArrayValue> { public class JavaArrayValueVisitor extends JavaVisitor<ArrayValue> {
public JavaArrayValueVisitor() { public JavaArrayValueVisitor(boolean propagate){
super(ArrayValue.class); super(ArrayValue.class, propagate);
} }
@Override @Override

View file

@ -15,8 +15,8 @@ public class JavaBiValueVisitor extends JavaVisitor<BiValue> {
private Predicate<String> actionPredicate; private Predicate<String> actionPredicate;
private Visitor<Value> rightPredicate; private Visitor<Value> rightPredicate;
public JavaBiValueVisitor() { public JavaBiValueVisitor(boolean propagate){
super(BiValue.class); super(BiValue.class, propagate);
} }
public JavaBiValueVisitor left(Visitor<Value> visitor) { public JavaBiValueVisitor left(Visitor<Value> visitor) {

View file

@ -11,8 +11,8 @@ public class JavaCastValueVisitor extends JavaVisitor<CastValue> {
private Predicate<String> typePredicate; private Predicate<String> typePredicate;
private Visitor<Value> valuePredicate; private Visitor<Value> valuePredicate;
public JavaCastValueVisitor() { public JavaCastValueVisitor(boolean propagate) {
super(CastValue.class); super(CastValue.class, propagate);
} }
public JavaCastValueVisitor type(Predicate<String> checker) { public JavaCastValueVisitor type(Predicate<String> checker) {

View file

@ -10,8 +10,8 @@ public class JavaInstanceValueVisitor extends JavaVisitor<InstanceValue> {
private Predicate<String> namePredicate; private Predicate<String> namePredicate;
public JavaInstanceValueVisitor(){ public JavaInstanceValueVisitor(boolean propagate){
super(InstanceValue.class); super(InstanceValue.class, propagate);
} }
public JavaInstanceValueVisitor named(Predicate<String> predicate){ public JavaInstanceValueVisitor named(Predicate<String> predicate){

View file

@ -4,8 +4,8 @@ import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.VisitorBag; import dev.peerat.parser.visitor.VisitorBag;
public class JavaLambdaValueVisitor extends JavaVisitor<LambdaValue>{ public class JavaLambdaValueVisitor extends JavaVisitor<LambdaValue>{
public JavaLambdaValueVisitor(){ public JavaLambdaValueVisitor(boolean propagate){
super(LambdaValue.class); super(LambdaValue.class, propagate);
} }
@Override @Override

View file

@ -7,8 +7,8 @@ import dev.peerat.parser.java.value.Value;
import dev.peerat.parser.Token; import dev.peerat.parser.Token;
import java.util.function.Predicate; import java.util.function.Predicate;
public class JavaMethodCallValueVisitor extends JavaVisitor<MethodCallValue>{ public class JavaMethodCallValueVisitor extends JavaVisitor<MethodCallValue>{
public JavaMethodCallValueVisitor(){ public JavaMethodCallValueVisitor(boolean propagate){
super(MethodCallValue.class); super(MethodCallValue.class, propagate);
} }
@Override @Override

View file

@ -11,8 +11,8 @@ public class JavaModifierValueVisitor extends JavaVisitor<ModifierValue> {
private Predicate<String> modifierPredicate; private Predicate<String> modifierPredicate;
private Visitor<Value> valuePredicate; private Visitor<Value> valuePredicate;
public JavaModifierValueVisitor() { public JavaModifierValueVisitor(boolean propagate) {
super(ModifierValue.class); super(ModifierValue.class, propagate);
} }
public JavaModifierValueVisitor modifier(Predicate<String> checker) { public JavaModifierValueVisitor modifier(Predicate<String> checker) {

View file

@ -9,8 +9,8 @@ import dev.peerat.parser.visitor.VisitorBag;
public class JavaStaticValueVisitor extends JavaVisitor<StaticValue> { public class JavaStaticValueVisitor extends JavaVisitor<StaticValue> {
private Predicate<String> tokenPredicate; private Predicate<String> tokenPredicate;
public JavaStaticValueVisitor() { public JavaStaticValueVisitor(boolean propagate) {
super(StaticValue.class); super(StaticValue.class, propagate);
} }
public JavaStaticValueVisitor token(Predicate<String> checker) { public JavaStaticValueVisitor token(Predicate<String> checker) {

View file

@ -11,8 +11,8 @@ public class JavaTriValueVisitor extends JavaVisitor<TriValue> {
private Visitor<Value> successPredicate; private Visitor<Value> successPredicate;
private Visitor<Value> failPredicate; private Visitor<Value> failPredicate;
public JavaTriValueVisitor() { public JavaTriValueVisitor(boolean propagate) {
super(TriValue.class); super(TriValue.class, propagate);
} }
public JavaTriValueVisitor check(Visitor<Value> visitor) { public JavaTriValueVisitor check(Visitor<Value> visitor) {

View file

@ -6,8 +6,8 @@ import dev.peerat.parser.visitor.VisitorBag;
public class JavaValueVisitor extends JavaVisitor<Value>{ public class JavaValueVisitor extends JavaVisitor<Value>{
public JavaValueVisitor(){ public JavaValueVisitor(boolean propagate){
super(Value.class); super(Value.class, propagate);
} }
@Override @Override

View file

@ -5,8 +5,8 @@ import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.VisitorBag; import dev.peerat.parser.visitor.VisitorBag;
public class JavaVariableAccessValueVisitor extends JavaVisitor<VariableAccessValue> { public class JavaVariableAccessValueVisitor extends JavaVisitor<VariableAccessValue> {
public JavaVariableAccessValueVisitor() { public JavaVariableAccessValueVisitor(boolean propagate) {
super(VariableAccessValue.class); super(VariableAccessValue.class, propagate);
} }
@Override @Override

View file

@ -1,12 +1,7 @@
package dev.peerat.parser.visitor; package dev.peerat.parser.visitor;
import static dev.peerat.parser.java.visitor.JavaVisitor.base; import static dev.peerat.parser.java.visitor.JavaVisitor.*;
import static dev.peerat.parser.java.visitor.JavaVisitor.allClass; import static dev.peerat.parser.visitor.Operator.*;
import static dev.peerat.parser.java.visitor.JavaVisitor.allAnnotation;
import static dev.peerat.parser.java.visitor.JavaVisitor.allJavaElement;
import static dev.peerat.parser.visitor.Operator.collect;
import static dev.peerat.parser.visitor.Operator.and;
import static dev.peerat.parser.visitor.Operator.or;
import dev.peerat.parser.java.JavaFile; import dev.peerat.parser.java.JavaFile;
import dev.peerat.parser.java.JavaParser; import dev.peerat.parser.java.JavaParser;
@ -17,46 +12,17 @@ public class Example {
JavaParser parser = new JavaParser(); JavaParser parser = new JavaParser();
JavaFile container = new JavaFile(); JavaFile container = new JavaFile();
parser.parse("package dev.peerat.test; public class Example{ public void helloTest(){ System.out.println(\"hello\"); } }", container); parser.parse("package dev.peerat.test; public class Example{ private int i = j; public void helloTest(){ System.out.println(\"hello\"); } }", container);
VisitorBag result = container.visit( VisitorBag result = container.visit(
allClass() allClass()
.isPublic() .isPublic()
.elements( .elements(
collect(allJavaElement()) collect(variable())
) )
); );
System.out.println("allJavaElement in class : "+result.toList()); System.out.println("allJavaElement in class : "+result.toList());
result = container.visit(base(collect(
allClass()
.isPublic()
.elements(
allJavaElement()
)
)));
System.out.println("all class: "+result.toList());
result = container.visit(base(
collect(
allClass()
.isPublic()
.elements(
or(
allAnnotation().nameFilter((name) -> name.startsWith("T")),
allAnnotation().valueFilter((name, value) -> name.startsWith("t"))
)
)
)
)
)
;
System.out.println("and op : "+result.toList());
} }
} }

View file

@ -33,6 +33,11 @@ public class Operator{
} }
return false; return false;
} }
@Override
public boolean canPropagate(){
return true;
}
}; };
} }
@ -63,6 +68,11 @@ public class Operator{
} }
return false; return false;
} }
@Override
public boolean canPropagate(){
return true;
}
}; };
} }
@ -81,6 +91,11 @@ public class Operator{
public boolean canVisit(Class<?> type){ public boolean canVisit(Class<?> type){
return visitor.canVisit(type); return visitor.canVisit(type);
} }
@Override
public boolean canPropagate(){
return true;
}
}; };
} }
@ -104,6 +119,11 @@ public class Operator{
// System.out.println("collect can visit ? "+type); // System.out.println("collect can visit ? "+type);
return visitor.canVisit(type); return visitor.canVisit(type);
} }
@Override
public boolean canPropagate(){
return visitor.canPropagate();
}
}; };
} }
@ -119,6 +139,11 @@ public class Operator{
public boolean canVisit(Class<?> type) { public boolean canVisit(Class<?> type) {
return true; return true;
} }
@Override
public boolean canPropagate(){
return true;
}
}; };
} }

View file

@ -4,6 +4,8 @@ public abstract class Visitor<T>{
public abstract boolean canVisit(Class<?> type); //TODO change "Class<?> type" into "Object element" ? public abstract boolean canVisit(Class<?> type); //TODO change "Class<?> type" into "Object element" ?
public abstract boolean canPropagate();
public abstract VisitorBag visit(T element); public abstract VisitorBag visit(T element);
} }

View file

@ -6,6 +6,8 @@ import java.util.List;
//only one pass in parameter or visit ? //only one pass in parameter or visit ?
public class VisitorBag{ public class VisitorBag{
private static Object VALIDATE_BAG = new Object();
private List<Object> collect; private List<Object> collect;
private List<Object> list; private List<Object> list;
@ -22,6 +24,7 @@ public class VisitorBag{
public void merge(VisitorBag bag){ public void merge(VisitorBag bag){
// System.out.println("merge("+collect+", "+list+") <- "+Thread.currentThread().getStackTrace()[2]); // System.out.println("merge("+collect+", "+list+") <- "+Thread.currentThread().getStackTrace()[2]);
this.collect.addAll(bag.collect); this.collect.addAll(bag.collect);
if(!this.collect.isEmpty()) list.add(VALIDATE_BAG);
// System.out.println("merged("+collect+", "+list+") <- "+Thread.currentThread().getStackTrace()[2]); // System.out.println("merged("+collect+", "+list+") <- "+Thread.currentThread().getStackTrace()[2]);
} }