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) {
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()){

View file

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

View file

@ -79,14 +79,13 @@ public class Class extends ClassBase{
@Override
public VisitorBag visit(Visitor<JavaElement> 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));
}

View file

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

View file

@ -75,6 +75,7 @@ public class Enumeration extends ClassBase{
public VisitorBag visit(Visitor<JavaElement> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag();
if(!visitor.canPropagate()) return bag;
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){
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag();
if(!visitor.canPropagate()) return bag;
List<Annotation> annotations = getAnnotations();
if(annotations != null)

View file

@ -39,7 +39,7 @@ public class Import extends JavaElement{
@Override
public VisitorBag visit(Visitor<JavaElement> visitor) {
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){
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag();
if(!visitor.canPropagate()) return bag;
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){
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){

View file

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

View file

@ -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<JavaElement> 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;
}

View file

@ -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<JavaElement> 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;
}

View file

@ -51,6 +51,8 @@ public class BiValue extends Value{
public VisitorBag visit(Visitor<JavaElement> 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;
}
}

View file

@ -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<JavaElement> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag();
bag.merge(value.visit(visitor));
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.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<JavaElement> 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;
}

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.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;

View file

@ -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<JavaElement> 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;
}

View file

@ -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<JavaElement> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag();
bag.merge(value.visit(visitor));
return bag;
}
}

View file

@ -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;

View file

@ -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<JavaElement> 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;
}

View file

@ -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<JavaElement> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag();
bag.merge(base.visit(visitor));
return bag;
}

View file

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

View file

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

View file

@ -12,8 +12,8 @@ public class JavaClassBaseVisitor extends JavaVisitor<ClassBase>{
private Visitor<JavaElement> validator;
public JavaClassBaseVisitor(){
super(ClassBase.class);
public JavaClassBaseVisitor(boolean propagate){
super(ClassBase.class, propagate);
}
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 Visitor<JavaElement> 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<String> validator){
@ -116,12 +116,16 @@ public class JavaClassVisitor extends JavaVisitor<dev.peerat.parser.java.Class>{
}
if(this.elementVisitor != null){
for(JavaElement elements : element.getElements()){
VisitorBag visited = this.elementVisitor.visit(elements);
boolean validatedOne = false;
for(JavaElement content : element.getElements()){
VisitorBag visited = content.visit(this.elementVisitor);
if(visited.isValidated()){
bag.merge(visited);
if(!visited.isValidated()) return bag;
validatedOne = true;
}
}
if(!validatedOne) return bag;
}
bag.compute(element);
return bag;

View file

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

View file

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

View file

@ -13,8 +13,8 @@ public class JavaImportVisitor extends JavaVisitor<Import>{
private boolean staticPredicate;
private boolean nonStaticPredicate;
public JavaImportVisitor(){
super(Import.class);
public JavaImportVisitor(boolean propagate){
super(Import.class, propagate);
}
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 JavaInterfaceVisitor(){
super(Interface.class);
public JavaInterfaceVisitor(boolean propagate){
super(Interface.class, propagate);
}
@Override

View file

@ -11,8 +11,8 @@ public class JavaVariableVisitor extends JavaVisitor<Variable>{
private Predicate<String> nameFilter;
private Predicate<Integer> modifierFilter;
public JavaVariableVisitor(){
super(Variable.class);
public JavaVariableVisitor(boolean propagate){
super(Variable.class, propagate);
}
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
public static <T extends JavaElement> JavaVisitor<T> base(Visitor<T> visitor){
return new JavaVisitor<T>(null){
return new JavaVisitor<T>(null,true){
@Override
public boolean canVisit(Class<?> type){
@ -37,8 +37,8 @@ public abstract class JavaVisitor<T extends JavaElement> extends Visitor<JavaEle
};
}
public static JavaVisitor<JavaElement> allJavaElement(){
return new JavaVisitor<JavaElement>(JavaElement.class){
private static JavaVisitor<JavaElement> javaElement(boolean propagate){
return new JavaVisitor<JavaElement>(JavaElement.class, propagate){
@Override
public VisitorBag visitElement(JavaElement element){
@ -50,98 +50,203 @@ public abstract class JavaVisitor<T extends JavaElement> extends Visitor<JavaEle
};
}
public static JavaVisitor<JavaElement> 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> 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<T extends JavaElement> extends Visitor<JavaEle
return this.type.isAssignableFrom(type);
}
@Override
public boolean canPropagate(){
return this.propagate;
}
@Override
public VisitorBag visit(JavaElement element){
return visitElement((T) element);

View file

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

View file

@ -11,8 +11,8 @@ public class JavaArrayAccessValueVisitor extends JavaVisitor<ArrayAccessValue>{
private Visitor<Value> basePredicate;
private Visitor<Value> accessPredicate;
public JavaArrayAccessValueVisitor(){
super(ArrayAccessValue.class);
public JavaArrayAccessValueVisitor(boolean propagate){
super(ArrayAccessValue.class, propagate);
}
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 JavaArrayValueVisitor() {
super(ArrayValue.class);
public JavaArrayValueVisitor(boolean propagate){
super(ArrayValue.class, propagate);
}
@Override

View file

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

View file

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

View file

@ -10,8 +10,8 @@ public class JavaInstanceValueVisitor extends JavaVisitor<InstanceValue> {
private Predicate<String> namePredicate;
public JavaInstanceValueVisitor(){
super(InstanceValue.class);
public JavaInstanceValueVisitor(boolean propagate){
super(InstanceValue.class, propagate);
}
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;
public class JavaLambdaValueVisitor extends JavaVisitor<LambdaValue>{
public JavaLambdaValueVisitor(){
super(LambdaValue.class);
public JavaLambdaValueVisitor(boolean propagate){
super(LambdaValue.class, propagate);
}
@Override

View file

@ -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<MethodCallValue>{
public JavaMethodCallValueVisitor(){
super(MethodCallValue.class);
public JavaMethodCallValueVisitor(boolean propagate){
super(MethodCallValue.class, propagate);
}
@Override

View file

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

View file

@ -9,8 +9,8 @@ import dev.peerat.parser.visitor.VisitorBag;
public class JavaStaticValueVisitor extends JavaVisitor<StaticValue> {
private Predicate<String> tokenPredicate;
public JavaStaticValueVisitor() {
super(StaticValue.class);
public JavaStaticValueVisitor(boolean propagate) {
super(StaticValue.class, propagate);
}
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> failPredicate;
public JavaTriValueVisitor() {
super(TriValue.class);
public JavaTriValueVisitor(boolean propagate) {
super(TriValue.class, propagate);
}
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 JavaValueVisitor(){
super(Value.class);
public JavaValueVisitor(boolean propagate){
super(Value.class, propagate);
}
@Override

View file

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

View file

@ -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());
}
}

View file

@ -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;
}
};
}

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 canPropagate();
public abstract VisitorBag visit(T element);
}

View file

@ -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<Object> collect;
private List<Object> 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]);
}