From e0716ef657604ec703c259874989e979f7744f85 Mon Sep 17 00:00:00 2001 From: jeffcheasey88 <66554203+jeffcheasey88@users.noreply.github.com> Date: Sun, 27 Apr 2025 21:59:00 +0200 Subject: [PATCH] Visitor Propagation --- src/dev/peerat/parser/java/Annotation.java | 1 + .../peerat/parser/java/AnnotationClass.java | 1 + src/dev/peerat/parser/java/Class.java | 3 +- src/dev/peerat/parser/java/ClassBase.java | 2 + src/dev/peerat/parser/java/Enumeration.java | 1 + src/dev/peerat/parser/java/Function.java | 1 + src/dev/peerat/parser/java/Import.java | 2 +- src/dev/peerat/parser/java/Interface.java | 1 + src/dev/peerat/parser/java/JavaFile.java | 1 + src/dev/peerat/parser/java/Variable.java | 1 + .../parser/java/value/ArrayAccessValue.java | 3 +- .../peerat/parser/java/value/ArrayValue.java | 2 +- src/dev/peerat/parser/java/value/BiValue.java | 2 + .../peerat/parser/java/value/CastValue.java | 2 +- .../parser/java/value/InstanceValue.java | 4 +- .../peerat/parser/java/value/LambdaValue.java | 1 - .../parser/java/value/MethodCallValue.java | 4 +- .../parser/java/value/ModifierValue.java | 2 +- .../peerat/parser/java/value/StaticValue.java | 1 - .../peerat/parser/java/value/TriValue.java | 4 +- .../java/value/VariableAccessValue.java | 2 +- .../visitor/JavaAnnotationClassVisitor.java | 4 +- .../java/visitor/JavaAnnotationVisitor.java | 4 +- .../java/visitor/JavaClassBaseVisitor.java | 4 +- .../parser/java/visitor/JavaClassVisitor.java | 16 +- .../java/visitor/JavaEnumerationVisitor.java | 4 +- .../java/visitor/JavaFunctionVisitor.java | 4 +- .../java/visitor/JavaImportVisitor.java | 4 +- .../java/visitor/JavaInterfaceVisitor.java | 4 +- .../java/visitor/JavaVariableVisitor.java | 4 +- .../parser/java/visitor/JavaVisitor.java | 164 +++++++++++++++--- .../operation/JavaOperationVisitor.java | 4 +- .../value/JavaArrayAccessValueVisitor.java | 4 +- .../visitor/value/JavaArrayValueVisitor.java | 4 +- .../visitor/value/JavaBiValueVisitor.java | 4 +- .../visitor/value/JavaCastValueVisitor.java | 4 +- .../value/JavaInstanceValueVisitor.java | 4 +- .../visitor/value/JavaLambdaValueVisitor.java | 4 +- .../value/JavaMethodCallValueVisitor.java | 4 +- .../value/JavaModifierValueVisitor.java | 4 +- .../visitor/value/JavaStaticValueVisitor.java | 4 +- .../visitor/value/JavaTriValueVisitor.java | 4 +- .../java/visitor/value/JavaValueVisitor.java | 4 +- .../value/JavaVariableAccessValueVisitor.java | 4 +- src/dev/peerat/parser/visitor/Example.java | 42 +---- src/dev/peerat/parser/visitor/Operator.java | 25 +++ src/dev/peerat/parser/visitor/Visitor.java | 2 + src/dev/peerat/parser/visitor/VisitorBag.java | 3 + 48 files changed, 251 insertions(+), 126 deletions(-) diff --git a/src/dev/peerat/parser/java/Annotation.java b/src/dev/peerat/parser/java/Annotation.java index ed29e7d..2a0fe4a 100644 --- a/src/dev/peerat/parser/java/Annotation.java +++ b/src/dev/peerat/parser/java/Annotation.java @@ -116,6 +116,7 @@ public class Annotation extends JavaElement{ public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); + if(!visitor.canPropagate()) return bag; if(this.values != null) for(Value value : this.values.values()){ diff --git a/src/dev/peerat/parser/java/AnnotationClass.java b/src/dev/peerat/parser/java/AnnotationClass.java index 5232688..f80d72d 100644 --- a/src/dev/peerat/parser/java/AnnotationClass.java +++ b/src/dev/peerat/parser/java/AnnotationClass.java @@ -70,6 +70,7 @@ public class AnnotationClass extends ClassBase{ public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); + if(!visitor.canPropagate()) return bag; bag.merge(super.visit(visitor)); diff --git a/src/dev/peerat/parser/java/Class.java b/src/dev/peerat/parser/java/Class.java index 621f15e..3e3b4fa 100644 --- a/src/dev/peerat/parser/java/Class.java +++ b/src/dev/peerat/parser/java/Class.java @@ -79,14 +79,13 @@ public class Class extends ClassBase{ @Override public VisitorBag visit(Visitor visitor) { - System.out.println("VISIT CLASS "+visitor); if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); + if(!visitor.canPropagate()) return bag; bag.merge(super.visit(visitor)); for(JavaElement element : this.elements){ - System.out.println("VISIT CLASS "+visitor+" -> "+element); bag.merge(element.visit(visitor)); } diff --git a/src/dev/peerat/parser/java/ClassBase.java b/src/dev/peerat/parser/java/ClassBase.java index c92d3c7..033423a 100644 --- a/src/dev/peerat/parser/java/ClassBase.java +++ b/src/dev/peerat/parser/java/ClassBase.java @@ -51,6 +51,8 @@ public abstract class ClassBase extends Annotable implements AnnotableBuffer, Cl public VisitorBag visit(Visitor visitor){ if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); + if(!visitor.canPropagate()) return bag; + List annotations = getAnnotations(); if(annotations != null) for(Annotation annotation : annotations){ diff --git a/src/dev/peerat/parser/java/Enumeration.java b/src/dev/peerat/parser/java/Enumeration.java index 99bdb72..3f3f738 100644 --- a/src/dev/peerat/parser/java/Enumeration.java +++ b/src/dev/peerat/parser/java/Enumeration.java @@ -75,6 +75,7 @@ public class Enumeration extends ClassBase{ public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); + if(!visitor.canPropagate()) return bag; bag.merge(super.visit(visitor)); diff --git a/src/dev/peerat/parser/java/Function.java b/src/dev/peerat/parser/java/Function.java index 92fdae4..fe75af7 100644 --- a/src/dev/peerat/parser/java/Function.java +++ b/src/dev/peerat/parser/java/Function.java @@ -138,6 +138,7 @@ public class Function extends Annotable implements VariableContainer, OperationC public VisitorBag visit(Visitor visitor){ if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); + if(!visitor.canPropagate()) return bag; List annotations = getAnnotations(); if(annotations != null) diff --git a/src/dev/peerat/parser/java/Import.java b/src/dev/peerat/parser/java/Import.java index a4211a9..f61ada1 100644 --- a/src/dev/peerat/parser/java/Import.java +++ b/src/dev/peerat/parser/java/Import.java @@ -39,7 +39,7 @@ public class Import extends JavaElement{ @Override public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); - return null; + return new VisitorBag(); } } diff --git a/src/dev/peerat/parser/java/Interface.java b/src/dev/peerat/parser/java/Interface.java index 379e3be..0672323 100644 --- a/src/dev/peerat/parser/java/Interface.java +++ b/src/dev/peerat/parser/java/Interface.java @@ -75,6 +75,7 @@ public class Interface extends ClassBase{ public VisitorBag visit(Visitor visitor){ if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); + if(!visitor.canPropagate()) return bag; bag.merge(super.visit(visitor)); diff --git a/src/dev/peerat/parser/java/JavaFile.java b/src/dev/peerat/parser/java/JavaFile.java index 4643eca..f9eb984 100644 --- a/src/dev/peerat/parser/java/JavaFile.java +++ b/src/dev/peerat/parser/java/JavaFile.java @@ -89,6 +89,7 @@ public class JavaFile extends JavaElement implements ClassContainer, AnnotableBu public VisitorBag visit(Visitor visitor){ if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); + if(!visitor.canPropagate()) return bag; if(this.imports != null) for(Import imp : this.imports){ diff --git a/src/dev/peerat/parser/java/Variable.java b/src/dev/peerat/parser/java/Variable.java index a2e8e01..71b94dc 100644 --- a/src/dev/peerat/parser/java/Variable.java +++ b/src/dev/peerat/parser/java/Variable.java @@ -86,6 +86,7 @@ public class Variable extends Annotable{ public VisitorBag visit(Visitor visitor){ if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); + if(!visitor.canPropagate()) return bag; List annotations = getAnnotations(); if(annotations != null) diff --git a/src/dev/peerat/parser/java/value/ArrayAccessValue.java b/src/dev/peerat/parser/java/value/ArrayAccessValue.java index f4f3cfd..88c184a 100644 --- a/src/dev/peerat/parser/java/value/ArrayAccessValue.java +++ b/src/dev/peerat/parser/java/value/ArrayAccessValue.java @@ -4,7 +4,6 @@ import java.util.List; import java.util.function.Function; import dev.peerat.parser.java.JavaElement; -import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -40,6 +39,8 @@ public class ArrayAccessValue extends Value{ public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); + bag.merge(this.base.visit(visitor)); + bag.merge(this.access.visit(visitor)); return bag; } diff --git a/src/dev/peerat/parser/java/value/ArrayValue.java b/src/dev/peerat/parser/java/value/ArrayValue.java index 573ecb1..298bfff 100644 --- a/src/dev/peerat/parser/java/value/ArrayValue.java +++ b/src/dev/peerat/parser/java/value/ArrayValue.java @@ -4,7 +4,6 @@ import java.util.List; import java.util.function.Function; import dev.peerat.parser.java.JavaElement; -import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -34,6 +33,7 @@ public class ArrayValue extends Value{ public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); + for(Value value : this.values) bag.merge(value.visit(visitor)); return bag; } diff --git a/src/dev/peerat/parser/java/value/BiValue.java b/src/dev/peerat/parser/java/value/BiValue.java index 35fb33f..cd7c139 100644 --- a/src/dev/peerat/parser/java/value/BiValue.java +++ b/src/dev/peerat/parser/java/value/BiValue.java @@ -51,6 +51,8 @@ public class BiValue extends Value{ public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); + bag.merge(left.visit(visitor)); + bag.merge(right.visit(visitor)); return bag; } } diff --git a/src/dev/peerat/parser/java/value/CastValue.java b/src/dev/peerat/parser/java/value/CastValue.java index 40ac246..c739d3c 100644 --- a/src/dev/peerat/parser/java/value/CastValue.java +++ b/src/dev/peerat/parser/java/value/CastValue.java @@ -5,7 +5,6 @@ import java.util.function.Function; import dev.peerat.parser.Token; import dev.peerat.parser.java.JavaElement; -import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -41,6 +40,7 @@ public class CastValue extends Value{ public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); + bag.merge(value.visit(visitor)); return bag; } diff --git a/src/dev/peerat/parser/java/value/InstanceValue.java b/src/dev/peerat/parser/java/value/InstanceValue.java index eb69269..eb543b3 100644 --- a/src/dev/peerat/parser/java/value/InstanceValue.java +++ b/src/dev/peerat/parser/java/value/InstanceValue.java @@ -11,7 +11,6 @@ import dev.peerat.parser.java.Annotation; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.Variable; 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.VisitorBag; @@ -77,6 +76,9 @@ public class InstanceValue extends Value implements VariableContainer, FunctionC public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); + + for(Value value : parameters) bag.merge(value.visit(visitor)); + for(JavaElement content : elements) bag.merge(content.visit(visitor)); return bag; } diff --git a/src/dev/peerat/parser/java/value/LambdaValue.java b/src/dev/peerat/parser/java/value/LambdaValue.java index 72d050b..7baf0d3 100644 --- a/src/dev/peerat/parser/java/value/LambdaValue.java +++ b/src/dev/peerat/parser/java/value/LambdaValue.java @@ -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.OperationContainer; 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.VisitorBag; diff --git a/src/dev/peerat/parser/java/value/MethodCallValue.java b/src/dev/peerat/parser/java/value/MethodCallValue.java index 4225981..4645fb5 100644 --- a/src/dev/peerat/parser/java/value/MethodCallValue.java +++ b/src/dev/peerat/parser/java/value/MethodCallValue.java @@ -5,7 +5,6 @@ import java.util.function.Function; import dev.peerat.parser.Token; import dev.peerat.parser.java.JavaElement; -import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -53,6 +52,9 @@ public class MethodCallValue extends Value{ public VisitorBag visit(Visitor visitor){ if(visitor.canVisit(getClass())) return visitor.visit(this); 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; } diff --git a/src/dev/peerat/parser/java/value/ModifierValue.java b/src/dev/peerat/parser/java/value/ModifierValue.java index 74fbd9e..340f4c5 100644 --- a/src/dev/peerat/parser/java/value/ModifierValue.java +++ b/src/dev/peerat/parser/java/value/ModifierValue.java @@ -5,7 +5,6 @@ import java.util.function.Function; import dev.peerat.parser.Token; import dev.peerat.parser.java.JavaElement; -import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -46,6 +45,7 @@ public class ModifierValue extends Value{ public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); + bag.merge(value.visit(visitor)); return bag; } } diff --git a/src/dev/peerat/parser/java/value/StaticValue.java b/src/dev/peerat/parser/java/value/StaticValue.java index df6116e..a0cff85 100644 --- a/src/dev/peerat/parser/java/value/StaticValue.java +++ b/src/dev/peerat/parser/java/value/StaticValue.java @@ -5,7 +5,6 @@ import java.util.function.Function; import dev.peerat.parser.Token; import dev.peerat.parser.java.JavaElement; -import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; diff --git a/src/dev/peerat/parser/java/value/TriValue.java b/src/dev/peerat/parser/java/value/TriValue.java index 9ff3175..c84b6bd 100644 --- a/src/dev/peerat/parser/java/value/TriValue.java +++ b/src/dev/peerat/parser/java/value/TriValue.java @@ -4,7 +4,6 @@ import java.util.List; import java.util.function.Function; import dev.peerat.parser.java.JavaElement; -import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -51,6 +50,9 @@ public class TriValue extends Value{ public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); + bag.merge(check.visit(visitor)); + bag.merge(success.visit(visitor)); + bag.merge(fail.visit(visitor)); return bag; } diff --git a/src/dev/peerat/parser/java/value/VariableAccessValue.java b/src/dev/peerat/parser/java/value/VariableAccessValue.java index f5e4c3e..1d1aa53 100644 --- a/src/dev/peerat/parser/java/value/VariableAccessValue.java +++ b/src/dev/peerat/parser/java/value/VariableAccessValue.java @@ -5,7 +5,6 @@ import java.util.function.Function; import dev.peerat.parser.Token; import dev.peerat.parser.java.JavaElement; -import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -41,6 +40,7 @@ public class VariableAccessValue extends Value{ public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); + bag.merge(base.visit(visitor)); return bag; } diff --git a/src/dev/peerat/parser/java/visitor/JavaAnnotationClassVisitor.java b/src/dev/peerat/parser/java/visitor/JavaAnnotationClassVisitor.java index fdaa1c4..09e3a50 100644 --- a/src/dev/peerat/parser/java/visitor/JavaAnnotationClassVisitor.java +++ b/src/dev/peerat/parser/java/visitor/JavaAnnotationClassVisitor.java @@ -5,8 +5,8 @@ import dev.peerat.parser.visitor.VisitorBag; public class JavaAnnotationClassVisitor extends JavaVisitor{ - public JavaAnnotationClassVisitor(){ - super(AnnotationClass.class); + public JavaAnnotationClassVisitor(boolean propagate){ + super(AnnotationClass.class, propagate); } @Override diff --git a/src/dev/peerat/parser/java/visitor/JavaAnnotationVisitor.java b/src/dev/peerat/parser/java/visitor/JavaAnnotationVisitor.java index 2a35745..4c39095 100644 --- a/src/dev/peerat/parser/java/visitor/JavaAnnotationVisitor.java +++ b/src/dev/peerat/parser/java/visitor/JavaAnnotationVisitor.java @@ -18,8 +18,8 @@ public class JavaAnnotationVisitor extends JavaVisitor{ private BiPredicate valueFilter; private Function> valueFilterVisitor; - public JavaAnnotationVisitor(){ - super(Annotation.class); + public JavaAnnotationVisitor(boolean propagate){ + super(Annotation.class, propagate); } public JavaAnnotationVisitor nameFilter(Predicate validator){ diff --git a/src/dev/peerat/parser/java/visitor/JavaClassBaseVisitor.java b/src/dev/peerat/parser/java/visitor/JavaClassBaseVisitor.java index 3e9a188..679d8e1 100644 --- a/src/dev/peerat/parser/java/visitor/JavaClassBaseVisitor.java +++ b/src/dev/peerat/parser/java/visitor/JavaClassBaseVisitor.java @@ -12,8 +12,8 @@ public class JavaClassBaseVisitor extends JavaVisitor{ private Visitor validator; - public JavaClassBaseVisitor(){ - super(ClassBase.class); + public JavaClassBaseVisitor(boolean propagate){ + super(ClassBase.class, propagate); } public JavaClassBaseVisitor annotationFilter(Visitor visitor){ diff --git a/src/dev/peerat/parser/java/visitor/JavaClassVisitor.java b/src/dev/peerat/parser/java/visitor/JavaClassVisitor.java index 7a9c006..9db8f58 100644 --- a/src/dev/peerat/parser/java/visitor/JavaClassVisitor.java +++ b/src/dev/peerat/parser/java/visitor/JavaClassVisitor.java @@ -13,8 +13,8 @@ public class JavaClassVisitor extends JavaVisitor{ private Predicate modifierFilter; private Visitor elementVisitor; - public JavaClassVisitor(){ - super(dev.peerat.parser.java.Class.class); + public JavaClassVisitor(boolean propagate){ + super(dev.peerat.parser.java.Class.class, propagate); } public JavaClassVisitor nameFilter(Predicate validator){ @@ -116,11 +116,15 @@ public class JavaClassVisitor extends JavaVisitor{ } if(this.elementVisitor != null){ - for(JavaElement elements : element.getElements()){ - VisitorBag visited = this.elementVisitor.visit(elements); - bag.merge(visited); - if(!visited.isValidated()) return bag; + boolean validatedOne = false; + for(JavaElement content : element.getElements()){ + VisitorBag visited = content.visit(this.elementVisitor); + if(visited.isValidated()){ + bag.merge(visited); + validatedOne = true; + } } + if(!validatedOne) return bag; } bag.compute(element); diff --git a/src/dev/peerat/parser/java/visitor/JavaEnumerationVisitor.java b/src/dev/peerat/parser/java/visitor/JavaEnumerationVisitor.java index b7f3fc1..48b9cbf 100644 --- a/src/dev/peerat/parser/java/visitor/JavaEnumerationVisitor.java +++ b/src/dev/peerat/parser/java/visitor/JavaEnumerationVisitor.java @@ -5,8 +5,8 @@ import dev.peerat.parser.visitor.VisitorBag; public class JavaEnumerationVisitor extends JavaVisitor{ - public JavaEnumerationVisitor(){ - super(Enumeration.class); + public JavaEnumerationVisitor(boolean propagate){ + super(Enumeration.class,propagate); } @Override diff --git a/src/dev/peerat/parser/java/visitor/JavaFunctionVisitor.java b/src/dev/peerat/parser/java/visitor/JavaFunctionVisitor.java index 65ad029..c971f79 100644 --- a/src/dev/peerat/parser/java/visitor/JavaFunctionVisitor.java +++ b/src/dev/peerat/parser/java/visitor/JavaFunctionVisitor.java @@ -5,8 +5,8 @@ import dev.peerat.parser.visitor.VisitorBag; public class JavaFunctionVisitor extends JavaVisitor{ - public JavaFunctionVisitor(){ - super(Function.class); + public JavaFunctionVisitor(boolean propagate){ + super(Function.class, propagate); } @Override diff --git a/src/dev/peerat/parser/java/visitor/JavaImportVisitor.java b/src/dev/peerat/parser/java/visitor/JavaImportVisitor.java index 67f0253..823d540 100644 --- a/src/dev/peerat/parser/java/visitor/JavaImportVisitor.java +++ b/src/dev/peerat/parser/java/visitor/JavaImportVisitor.java @@ -13,8 +13,8 @@ public class JavaImportVisitor extends JavaVisitor{ private boolean staticPredicate; private boolean nonStaticPredicate; - public JavaImportVisitor(){ - super(Import.class); + public JavaImportVisitor(boolean propagate){ + super(Import.class, propagate); } public JavaImportVisitor named(Predicate predicate){ diff --git a/src/dev/peerat/parser/java/visitor/JavaInterfaceVisitor.java b/src/dev/peerat/parser/java/visitor/JavaInterfaceVisitor.java index 8c558b1..88fadb0 100644 --- a/src/dev/peerat/parser/java/visitor/JavaInterfaceVisitor.java +++ b/src/dev/peerat/parser/java/visitor/JavaInterfaceVisitor.java @@ -5,8 +5,8 @@ import dev.peerat.parser.visitor.VisitorBag; public class JavaInterfaceVisitor extends JavaVisitor{ - public JavaInterfaceVisitor(){ - super(Interface.class); + public JavaInterfaceVisitor(boolean propagate){ + super(Interface.class, propagate); } @Override diff --git a/src/dev/peerat/parser/java/visitor/JavaVariableVisitor.java b/src/dev/peerat/parser/java/visitor/JavaVariableVisitor.java index d554360..ba0b916 100644 --- a/src/dev/peerat/parser/java/visitor/JavaVariableVisitor.java +++ b/src/dev/peerat/parser/java/visitor/JavaVariableVisitor.java @@ -11,8 +11,8 @@ public class JavaVariableVisitor extends JavaVisitor{ private Predicate nameFilter; private Predicate modifierFilter; - public JavaVariableVisitor(){ - super(Variable.class); + public JavaVariableVisitor(boolean propagate){ + super(Variable.class, propagate); } public JavaVariableVisitor typeFilter(Predicate validator){ diff --git a/src/dev/peerat/parser/java/visitor/JavaVisitor.java b/src/dev/peerat/parser/java/visitor/JavaVisitor.java index a62c3ff..46e56a5 100644 --- a/src/dev/peerat/parser/java/visitor/JavaVisitor.java +++ b/src/dev/peerat/parser/java/visitor/JavaVisitor.java @@ -22,7 +22,7 @@ public abstract class JavaVisitor extends Visitor JavaVisitor base(Visitor visitor){ - return new JavaVisitor(null){ + return new JavaVisitor(null,true){ @Override public boolean canVisit(Class type){ @@ -36,9 +36,9 @@ public abstract class JavaVisitor extends Visitor allJavaElement(){ - return new JavaVisitor(JavaElement.class){ + + private static JavaVisitor javaElement(boolean propagate){ + return new JavaVisitor(JavaElement.class, propagate){ @Override public VisitorBag visitElement(JavaElement element){ @@ -49,99 +49,204 @@ public abstract class JavaVisitor extends Visitor allJavaElement(){ + return javaElement(true); + } public static JavaClassBaseVisitor allClassBase(){ - return new JavaClassBaseVisitor(); + return new JavaClassBaseVisitor(true); } public static JavaClassVisitor allClass(){ - return new JavaClassVisitor(); + return new JavaClassVisitor(true); } public static JavaInterfaceVisitor allInterface(){ - return new JavaInterfaceVisitor(); + return new JavaInterfaceVisitor(true); } public static JavaEnumerationVisitor allEnum(){ - return new JavaEnumerationVisitor(); + return new JavaEnumerationVisitor(true); } public static JavaAnnotationClassVisitor allAnnotationClass(){ - return new JavaAnnotationClassVisitor(); + return new JavaAnnotationClassVisitor(true); } public static JavaAnnotationVisitor allAnnotation(){ - return new JavaAnnotationVisitor(); + return new JavaAnnotationVisitor(true); } public static JavaVariableVisitor allVariable(){ - return new JavaVariableVisitor(); + return new JavaVariableVisitor(true); } public static JavaFunctionVisitor allFunction(){ - return new JavaFunctionVisitor(); + return new JavaFunctionVisitor(true); } public static JavaValueVisitor allValue(){ - return new JavaValueVisitor(); + return new JavaValueVisitor(true); } public static JavaArrayAccessValueVisitor allArrayAccessValue(){ - return new JavaArrayAccessValueVisitor(); + return new JavaArrayAccessValueVisitor(true); } public static JavaArrayValueVisitor allArrayValue(){ - return new JavaArrayValueVisitor(); + return new JavaArrayValueVisitor(true); } public static JavaBiValueVisitor allBiValue(){ - return new JavaBiValueVisitor(); + return new JavaBiValueVisitor(true); } public static JavaCastValueVisitor allCastValue(){ - return new JavaCastValueVisitor(); + return new JavaCastValueVisitor(true); } public static JavaInstanceValueVisitor allInstanceValue(){ - return new JavaInstanceValueVisitor(); + return new JavaInstanceValueVisitor(true); } public static JavaLambdaValueVisitor allLambdaValue(){ - return new JavaLambdaValueVisitor(); + return new JavaLambdaValueVisitor(true); } public static JavaMethodCallValueVisitor allMethodCallValue(){ - return new JavaMethodCallValueVisitor(); + return new JavaMethodCallValueVisitor(true); } public static JavaModifierValueVisitor allModifierValue(){ - return new JavaModifierValueVisitor(); + return new JavaModifierValueVisitor(true); } public static JavaStaticValueVisitor allStaticValue(){ - return new JavaStaticValueVisitor(); + return new JavaStaticValueVisitor(true); } public static JavaTriValueVisitor allTriValue(){ - return new JavaTriValueVisitor(); + return new JavaTriValueVisitor(true); } public static JavaVariableAccessValueVisitor allVariableAccessValue(){ - return new JavaVariableAccessValueVisitor(); + return new JavaVariableAccessValueVisitor(true); } public static JavaOperationVisitor allOperation(){ - return new JavaOperationVisitor(); + return new JavaOperationVisitor(true); } public static JavaImportVisitor allImport(){ - return new JavaImportVisitor(); + return new JavaImportVisitor(true); + } + + + + + + + + + public static JavaVisitor 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 boolean propagate; - public JavaVisitor(Class type){ + public JavaVisitor(Class type, boolean propagate){ this.type = type; + this.propagate = propagate; } @Override @@ -150,6 +255,11 @@ public abstract class JavaVisitor extends Visitor{ - public JavaOperationVisitor(){ - super(Operation.class); + public JavaOperationVisitor(boolean propagate){ + super(Operation.class, propagate); } @Override diff --git a/src/dev/peerat/parser/java/visitor/value/JavaArrayAccessValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaArrayAccessValueVisitor.java index 0794171..a16f64d 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaArrayAccessValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaArrayAccessValueVisitor.java @@ -11,8 +11,8 @@ public class JavaArrayAccessValueVisitor extends JavaVisitor{ private Visitor basePredicate; private Visitor accessPredicate; - public JavaArrayAccessValueVisitor(){ - super(ArrayAccessValue.class); + public JavaArrayAccessValueVisitor(boolean propagate){ + super(ArrayAccessValue.class, propagate); } public JavaArrayAccessValueVisitor checkBase(Visitor visitor){ diff --git a/src/dev/peerat/parser/java/visitor/value/JavaArrayValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaArrayValueVisitor.java index cf1bb34..ba2d056 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaArrayValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaArrayValueVisitor.java @@ -6,8 +6,8 @@ import dev.peerat.parser.java.visitor.JavaVisitor; public class JavaArrayValueVisitor extends JavaVisitor { - public JavaArrayValueVisitor() { - super(ArrayValue.class); + public JavaArrayValueVisitor(boolean propagate){ + super(ArrayValue.class, propagate); } @Override diff --git a/src/dev/peerat/parser/java/visitor/value/JavaBiValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaBiValueVisitor.java index 9796b53..6a45abb 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaBiValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaBiValueVisitor.java @@ -15,8 +15,8 @@ public class JavaBiValueVisitor extends JavaVisitor { private Predicate actionPredicate; private Visitor rightPredicate; - public JavaBiValueVisitor() { - super(BiValue.class); + public JavaBiValueVisitor(boolean propagate){ + super(BiValue.class, propagate); } public JavaBiValueVisitor left(Visitor visitor) { diff --git a/src/dev/peerat/parser/java/visitor/value/JavaCastValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaCastValueVisitor.java index 5e0e6a8..f206262 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaCastValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaCastValueVisitor.java @@ -11,8 +11,8 @@ public class JavaCastValueVisitor extends JavaVisitor { private Predicate typePredicate; private Visitor valuePredicate; - public JavaCastValueVisitor() { - super(CastValue.class); + public JavaCastValueVisitor(boolean propagate) { + super(CastValue.class, propagate); } public JavaCastValueVisitor type(Predicate checker) { diff --git a/src/dev/peerat/parser/java/visitor/value/JavaInstanceValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaInstanceValueVisitor.java index 6c5e0fe..b8d2d93 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaInstanceValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaInstanceValueVisitor.java @@ -10,8 +10,8 @@ public class JavaInstanceValueVisitor extends JavaVisitor { private Predicate namePredicate; - public JavaInstanceValueVisitor(){ - super(InstanceValue.class); + public JavaInstanceValueVisitor(boolean propagate){ + super(InstanceValue.class, propagate); } public JavaInstanceValueVisitor named(Predicate predicate){ diff --git a/src/dev/peerat/parser/java/visitor/value/JavaLambdaValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaLambdaValueVisitor.java index 3bc2e9e..73f6588 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaLambdaValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaLambdaValueVisitor.java @@ -4,8 +4,8 @@ import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.visitor.VisitorBag; public class JavaLambdaValueVisitor extends JavaVisitor{ - public JavaLambdaValueVisitor(){ - super(LambdaValue.class); + public JavaLambdaValueVisitor(boolean propagate){ + super(LambdaValue.class, propagate); } @Override diff --git a/src/dev/peerat/parser/java/visitor/value/JavaMethodCallValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaMethodCallValueVisitor.java index 5e4a6c0..452dffc 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaMethodCallValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaMethodCallValueVisitor.java @@ -7,8 +7,8 @@ import dev.peerat.parser.java.value.Value; import dev.peerat.parser.Token; import java.util.function.Predicate; public class JavaMethodCallValueVisitor extends JavaVisitor{ - public JavaMethodCallValueVisitor(){ - super(MethodCallValue.class); + public JavaMethodCallValueVisitor(boolean propagate){ + super(MethodCallValue.class, propagate); } @Override diff --git a/src/dev/peerat/parser/java/visitor/value/JavaModifierValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaModifierValueVisitor.java index 346a6a0..ef8fa2e 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaModifierValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaModifierValueVisitor.java @@ -11,8 +11,8 @@ public class JavaModifierValueVisitor extends JavaVisitor { private Predicate modifierPredicate; private Visitor valuePredicate; - public JavaModifierValueVisitor() { - super(ModifierValue.class); + public JavaModifierValueVisitor(boolean propagate) { + super(ModifierValue.class, propagate); } public JavaModifierValueVisitor modifier(Predicate checker) { diff --git a/src/dev/peerat/parser/java/visitor/value/JavaStaticValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaStaticValueVisitor.java index 7e9d90d..214082d 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaStaticValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaStaticValueVisitor.java @@ -9,8 +9,8 @@ import dev.peerat.parser.visitor.VisitorBag; public class JavaStaticValueVisitor extends JavaVisitor { private Predicate tokenPredicate; - public JavaStaticValueVisitor() { - super(StaticValue.class); + public JavaStaticValueVisitor(boolean propagate) { + super(StaticValue.class, propagate); } public JavaStaticValueVisitor token(Predicate checker) { diff --git a/src/dev/peerat/parser/java/visitor/value/JavaTriValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaTriValueVisitor.java index 71a6dea..bd7ba9e 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaTriValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaTriValueVisitor.java @@ -11,8 +11,8 @@ public class JavaTriValueVisitor extends JavaVisitor { private Visitor successPredicate; private Visitor failPredicate; - public JavaTriValueVisitor() { - super(TriValue.class); + public JavaTriValueVisitor(boolean propagate) { + super(TriValue.class, propagate); } public JavaTriValueVisitor check(Visitor visitor) { diff --git a/src/dev/peerat/parser/java/visitor/value/JavaValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaValueVisitor.java index 08500cf..18fb5fe 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaValueVisitor.java @@ -6,8 +6,8 @@ import dev.peerat.parser.visitor.VisitorBag; public class JavaValueVisitor extends JavaVisitor{ - public JavaValueVisitor(){ - super(Value.class); + public JavaValueVisitor(boolean propagate){ + super(Value.class, propagate); } @Override diff --git a/src/dev/peerat/parser/java/visitor/value/JavaVariableAccessValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaVariableAccessValueVisitor.java index 45799af..98de71b 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaVariableAccessValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaVariableAccessValueVisitor.java @@ -5,8 +5,8 @@ import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.visitor.VisitorBag; public class JavaVariableAccessValueVisitor extends JavaVisitor { - public JavaVariableAccessValueVisitor() { - super(VariableAccessValue.class); + public JavaVariableAccessValueVisitor(boolean propagate) { + super(VariableAccessValue.class, propagate); } @Override diff --git a/src/dev/peerat/parser/visitor/Example.java b/src/dev/peerat/parser/visitor/Example.java index 2f78107..8a495f8 100644 --- a/src/dev/peerat/parser/visitor/Example.java +++ b/src/dev/peerat/parser/visitor/Example.java @@ -1,12 +1,7 @@ package dev.peerat.parser.visitor; -import static dev.peerat.parser.java.visitor.JavaVisitor.base; -import static dev.peerat.parser.java.visitor.JavaVisitor.allClass; -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 static dev.peerat.parser.java.visitor.JavaVisitor.*; +import static dev.peerat.parser.visitor.Operator.*; import dev.peerat.parser.java.JavaFile; import dev.peerat.parser.java.JavaParser; @@ -17,46 +12,17 @@ public class Example { JavaParser parser = new JavaParser(); 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( allClass() .isPublic() .elements( - collect(allJavaElement()) + collect(variable()) ) ); 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()); - } } diff --git a/src/dev/peerat/parser/visitor/Operator.java b/src/dev/peerat/parser/visitor/Operator.java index 13e4249..9f54e86 100644 --- a/src/dev/peerat/parser/visitor/Operator.java +++ b/src/dev/peerat/parser/visitor/Operator.java @@ -33,6 +33,11 @@ public class Operator{ } return false; } + + @Override + public boolean canPropagate(){ + return true; + } }; } @@ -63,6 +68,11 @@ public class Operator{ } return false; } + + @Override + public boolean canPropagate(){ + return true; + } }; } @@ -81,6 +91,11 @@ public class Operator{ public boolean canVisit(Class 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); return visitor.canVisit(type); } + + @Override + public boolean canPropagate(){ + return visitor.canPropagate(); + } }; } @@ -119,6 +139,11 @@ public class Operator{ public boolean canVisit(Class type) { return true; } + + @Override + public boolean canPropagate(){ + return true; + } }; } diff --git a/src/dev/peerat/parser/visitor/Visitor.java b/src/dev/peerat/parser/visitor/Visitor.java index cd65f60..350084c 100644 --- a/src/dev/peerat/parser/visitor/Visitor.java +++ b/src/dev/peerat/parser/visitor/Visitor.java @@ -4,6 +4,8 @@ public abstract class Visitor{ public abstract boolean canVisit(Class type); //TODO change "Class type" into "Object element" ? + public abstract boolean canPropagate(); + public abstract VisitorBag visit(T element); } diff --git a/src/dev/peerat/parser/visitor/VisitorBag.java b/src/dev/peerat/parser/visitor/VisitorBag.java index 6b0cd1e..ab77bcc 100644 --- a/src/dev/peerat/parser/visitor/VisitorBag.java +++ b/src/dev/peerat/parser/visitor/VisitorBag.java @@ -6,6 +6,8 @@ import java.util.List; //only one pass in parameter or visit ? public class VisitorBag{ + private static Object VALIDATE_BAG = new Object(); + private List collect; private List list; @@ -22,6 +24,7 @@ public class VisitorBag{ public void merge(VisitorBag bag){ // System.out.println("merge("+collect+", "+list+") <- "+Thread.currentThread().getStackTrace()[2]); this.collect.addAll(bag.collect); + if(!this.collect.isEmpty()) list.add(VALIDATE_BAG); // System.out.println("merged("+collect+", "+list+") <- "+Thread.currentThread().getStackTrace()[2]); }