[BETA] base Visitor in all JavaElement + base Visitor Pattern + refractor VisitorBag + debug (commentary & commented sysout)

This commit is contained in:
jeffcheasey88 2025-03-02 19:02:38 +01:00
parent 7ea19a009a
commit ce19dae60e
56 changed files with 642 additions and 357 deletions

View file

@ -1,65 +0,0 @@
package dev.peerat.parser;
import java.io.BufferedReader;
import java.util.function.BiConsumer;
import java.util.function.Function;
public class StreamTokenValidator extends TokenValidator{
private StreamTokenizer tokenizer;
private int validated;
private int index;
private BufferedReader reader;
public StreamTokenValidator(StreamTokenizer tokenizer){
super(new Token[0]);
this.tokenizer = tokenizer;
}
// private boolean nextToken(){
//
// }
//
// public boolean hasNext(){
// return validated < elements.length;
// }
//
// public boolean validate(Function<Token, Boolean> action){
// if(validated >= this.elements.length) return false;
// if(!hasNext()) return false;
// if(action.apply(this.elements[validated])){
// if(validated+1 > MAX_VALIDATE){
// MAX_VALIDATE = validated+1;
// TOKENS = elements.length;
// }
// this.validated++;
// return true;
// }
// return false;
// }
//
// public boolean validate(Function<Token, Boolean> action, BiConsumer<Bag, Token> filler){
// if(validate(action)){
// filler.accept(getBag(), elements[validated-1]);
// return true;
// }
// return false;
// }
//
// public TokenValidator branch(){
// StreamTokenValidator branch = new StreamTokenValidator(reader);
// branch.elements = this.elements;
// branch.index = Math.max(0, this.validated-1);
// branch.validated = this.validated;
// branch.setBag(getBag());
// return branch;
// }
public void merge(TokenValidator branch){
StreamTokenValidator validator = (StreamTokenValidator)branch;
this.index = validator.index;
this.validated = validator.validated;
setBag(branch.getBag());
}
}

View file

@ -1,7 +0,0 @@
package dev.peerat.parser;
public class StreamTokenizer extends Tokenizer{
}

View file

@ -1,3 +0,0 @@
package dev.peerat.parser;
public interface StreamableTree{}

View file

@ -8,8 +8,7 @@ import java.util.function.Function;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.value.Value;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class Annotation extends JavaElement{
@ -142,11 +141,11 @@ public class Annotation extends JavaElement{
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
VisitorBag bag = new VisitorBag();
if(this.values != null)
for(Value value : this.values.values()){
bag.compute(value.visit(visitor).toList().toArray());
bag.merge(value.visit(visitor));
}
return bag;

View file

@ -5,8 +5,7 @@ import java.util.List;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class AnnotationClass extends ClassBase{
@ -95,12 +94,12 @@ public class AnnotationClass extends ClassBase{
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
VisitorBag bag = new VisitorBag();
bag.compute(super.visit(visitor).toList().toArray());
bag.merge(super.visit(visitor));
for(JavaElement element : this.elements){
bag.compute(element.visit(visitor).toList().toArray());
bag.merge(element.visit(visitor));
}
return bag;

View file

@ -5,8 +5,7 @@ import java.util.List;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class Class extends ClassBase{
@ -110,12 +109,12 @@ public class Class extends ClassBase{
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
VisitorBag bag = new VisitorBag();
bag.compute(super.visit(visitor).toList().toArray());
bag.merge(super.visit(visitor));
for(JavaElement element : this.elements){
bag.compute(element.visit(visitor).toList().toArray());
bag.merge(element.visit(visitor));
}
return bag;

View file

@ -8,12 +8,13 @@ import dev.peerat.parser.java.Annotation.AnnotableBuffer;
import dev.peerat.parser.java.Function.FunctionContainer;
import dev.peerat.parser.java.Variable.VariableContainer;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public abstract class ClassBase extends Annotable implements AnnotableBuffer, ClassContainer, FunctionContainer, VariableContainer{
//Why not name and modifier here ?
private List<Annotation> annotationBuffer;
public ClassBase(List<Annotation> annotations){
@ -33,12 +34,13 @@ public abstract class ClassBase extends Annotable implements AnnotableBuffer, Cl
}
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
VisitorBag bag = new ListVisitorBag();
public VisitorBag visit(JavaVisitor<?> visitor){
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag();
List<Annotation> annotations = getAnnotations();
if(annotations != null)
for(Annotation annotation : annotations){
bag.compute(annotation.visit(visitor).toList().toArray());
bag.merge(annotation.visit(visitor));
}
return bag;
}

View file

@ -5,8 +5,7 @@ import java.util.List;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class Enumeration extends ClassBase{
@ -100,12 +99,12 @@ public class Enumeration extends ClassBase{
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
VisitorBag bag = new VisitorBag();
bag.compute(super.visit(visitor).toList().toArray());
bag.merge(super.visit(visitor));
for(JavaElement element : this.elements){
bag.compute(element.visit(visitor).toList().toArray());
bag.merge(element.visit(visitor));
}
return bag;

View file

@ -10,8 +10,7 @@ import dev.peerat.parser.java.Annotation.Annotable;
import dev.peerat.parser.java.Operation.OperationContainer;
import dev.peerat.parser.java.Variable.VariableContainer;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class Function extends Annotable implements VariableContainer, OperationContainer{
@ -162,23 +161,23 @@ public class Function extends Annotable implements VariableContainer, OperationC
}
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
public VisitorBag visit(JavaVisitor<?> visitor){
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
VisitorBag bag = new VisitorBag();
List<Annotation> annotations = getAnnotations();
if(annotations != null)
for(Annotation annotation : annotations){
bag.compute(annotation.visit(visitor).toList().toArray());
bag.merge(annotation.visit(visitor));
}
if(this.parameters != null)
for(Variable variable : this.parameters){
bag.compute(variable.visit(visitor).toList().toArray());
bag.merge(variable.visit(visitor));
}
for(JavaElement element : this.elements){
bag.compute(element.visit(visitor).toList().toArray());
bag.merge(element.visit(visitor));
}
return bag;

View file

@ -5,8 +5,7 @@ import java.util.function.Function;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class Import extends JavaElement{

View file

@ -5,8 +5,7 @@ import java.util.List;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class Interface extends ClassBase{
@ -100,11 +99,11 @@ public class Interface extends ClassBase{
@Override
public VisitorBag visit(JavaVisitor<?> visitor){
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
VisitorBag bag = new VisitorBag();
bag.compute(super.visit(visitor).toList().toArray());
bag.merge(super.visit(visitor));
for(JavaElement element : this.elements) bag.compute(element.visit(visitor).toList().toArray());
for(JavaElement element : this.elements) bag.merge(element.visit(visitor));
return bag;
}

View file

@ -5,7 +5,7 @@ import java.util.function.Function;
import dev.peerat.parser.ElementBuilder;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public abstract class JavaElement implements ElementBuilder{

View file

@ -8,8 +8,7 @@ import dev.peerat.parser.Bag;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.Annotation.AnnotableBuffer;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class JavaFile extends JavaElement implements ClassContainer, AnnotableBuffer{
@ -109,18 +108,18 @@ public class JavaFile extends JavaElement implements ClassContainer, AnnotableBu
@Override
public VisitorBag visit(JavaVisitor<?> visitor){
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
VisitorBag bag = new VisitorBag();
if(this.imports != null)
for(Import imp : this.imports){
bag.compute(imp.visit(visitor).toList().toArray());
bag.merge(imp.visit(visitor));
}
bag.compute(mainClazz.visit(visitor).toList().toArray());
bag.merge(mainClazz.visit(visitor));
if(this.subClazz != null)
for(ClassBase clazz : this.subClazz){
bag.compute(clazz.visit(visitor).toList().toArray());
bag.merge(clazz.visit(visitor));
}
return bag;

View file

@ -24,6 +24,22 @@ import dev.peerat.parser.tree.SyntaxTreeRegistery;
public class JavaParser extends Parser<JavaElement>{
//TODO
/**
* Visitor:
* All Visitor Types with all possible (wanted) queries
* VisitorBag -> collecter ce qui doit être collecter only + 1 element, n elements, n pair d'element,...
* VisitorBag -> validation de sous-ensemble, et non capture pour autant.
* VisitorBag -> Operators
* AST:
* Terminer les arbres
* Bind correctement tout (déplacer les noms & modifiers des classes dans ClassBase)
*
*
*
*/
// public static void main(String[] args) throws Exception{
// Timing main = Timing.of();
//

View file

@ -9,8 +9,7 @@ import dev.peerat.parser.TokenType;
import dev.peerat.parser.java.Annotation.Annotable;
import dev.peerat.parser.java.value.Value;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class Variable extends Annotable{
@ -105,15 +104,15 @@ public class Variable extends Annotable{
@Override
public VisitorBag visit(JavaVisitor<?> visitor){
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
VisitorBag bag = new VisitorBag();
List<Annotation> annotations = getAnnotations();
if(annotations != null)
for(Annotation annotation : annotations){
bag.compute(annotation.visit(visitor).toList().toArray());
bag.merge(annotation.visit(visitor));
}
if(this.value != null) bag.compute(this.value.visit(visitor).toList().toArray());
if(this.value != null) bag.merge(this.value.visit(visitor));
return bag;
}

View file

@ -7,8 +7,7 @@ import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.Operation;
import dev.peerat.parser.java.value.Value;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class AssignOperation extends Operation{
@ -51,9 +50,9 @@ public class AssignOperation extends Operation{
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
bag.compute(left.visit(visitor).toList().toArray());
bag.compute(right.visit(visitor).toList().toArray());
VisitorBag bag = new VisitorBag();
bag.merge(left.visit(visitor));
bag.merge(right.visit(visitor));
return bag;
}
}

View file

@ -6,7 +6,7 @@ import java.util.function.Function;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.Operation;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class BreakOperation extends Operation{

View file

@ -4,7 +4,7 @@ import java.util.List;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class CatchOperation extends OperationBag{

View file

@ -6,7 +6,7 @@ import java.util.function.Function;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.Operation;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class ContinueOperation extends Operation{

View file

@ -1,7 +1,7 @@
package dev.peerat.parser.java.operation;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class DoOperation extends OperationBag{

View file

@ -1,7 +1,7 @@
package dev.peerat.parser.java.operation;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class ElseOperation extends OperationBag{

View file

@ -1,7 +1,7 @@
package dev.peerat.parser.java.operation;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class FinallyOperation extends OperationBag{

View file

@ -7,8 +7,7 @@ import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.Variable;
import dev.peerat.parser.java.value.Value;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class ForOperation extends OperationBag{
@ -98,25 +97,25 @@ public class ForOperation extends OperationBag{
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
VisitorBag bag = new VisitorBag();
if(init_vars != null)
for(Variable variable : this.init_vars){
bag.compute(variable.visit(visitor).toList().toArray());
bag.merge(variable.visit(visitor));
}
if(init_values != null)
for(Value value : this.init_values){
bag.compute(value.visit(visitor).toList().toArray());
bag.merge(value.visit(visitor));
}
bag.compute(condition.visit(visitor).toList().toArray());
bag.merge(condition.visit(visitor));
if(this.updates != null)
for(Value value : this.updates){
bag.compute(value.visit(visitor).toList().toArray());
bag.merge(value.visit(visitor));
}
bag.compute(super.visit(visitor).toList().toArray());
bag.merge(super.visit(visitor));
return bag;
}
}

View file

@ -7,8 +7,7 @@ import dev.peerat.parser.Token;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.value.Value;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class ForeachOperation extends OperationBag{
@ -57,9 +56,9 @@ public class ForeachOperation extends OperationBag{
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
bag.compute(this.iterator.visit(visitor).toList().toArray());
bag.compute(super.visit(visitor).toList().toArray());
VisitorBag bag = new VisitorBag();
bag.merge(this.iterator.visit(visitor));
bag.merge(super.visit(visitor));
return bag;
}
}

View file

@ -6,8 +6,7 @@ import java.util.function.Function;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.value.Value;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class IfOperation extends OperationBag{
@ -43,9 +42,9 @@ public class IfOperation extends OperationBag{
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
bag.compute(condition.visit(visitor).toList().toArray());
bag.compute(super.visit(visitor).toList().toArray());
VisitorBag bag = new VisitorBag();
bag.merge(condition.visit(visitor));
bag.merge(super.visit(visitor));
return bag;
}
}

View file

@ -10,8 +10,7 @@ import dev.peerat.parser.java.Variable;
import dev.peerat.parser.java.Operation.OperationContainer;
import dev.peerat.parser.java.Variable.VariableContainer;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public abstract class OperationBag extends Operation implements VariableContainer, OperationContainer{
@ -57,9 +56,9 @@ public abstract class OperationBag extends Operation implements VariableContaine
@Override
public VisitorBag visit(JavaVisitor<?> visitor){
VisitorBag bag = new ListVisitorBag();
VisitorBag bag = new VisitorBag();
for(JavaElement element : this.elements){
bag.compute(element.visit(visitor).toList().toArray());
bag.merge(element.visit(visitor));
}
return bag;
}

View file

@ -7,8 +7,7 @@ import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.Operation;
import dev.peerat.parser.java.value.Value;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class ReturnOperation extends Operation{
@ -43,8 +42,8 @@ public class ReturnOperation extends Operation{
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
if(this.value != null) bag.compute(this.value.visit(visitor).toList().toArray());
VisitorBag bag = new VisitorBag();
if(this.value != null) bag.merge(this.value.visit(visitor));
return bag;
}
}

View file

@ -6,7 +6,7 @@ import java.util.function.Function;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.Operation;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class SwitchOperation extends Operation{

View file

@ -6,8 +6,7 @@ import java.util.function.Function;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.value.Value;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class SynchronizedOperation extends OperationBag{
@ -43,9 +42,9 @@ public class SynchronizedOperation extends OperationBag{
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
bag.compute(this.value.visit(visitor).toList().toArray());
bag.compute(super.visit(visitor).toList().toArray());
VisitorBag bag = new VisitorBag();
bag.merge(this.value.visit(visitor));
bag.merge(super.visit(visitor));
return bag;
}
}

View file

@ -7,8 +7,7 @@ import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.Operation;
import dev.peerat.parser.java.value.Value;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class ThrowOperation extends Operation{
@ -42,8 +41,8 @@ public class ThrowOperation extends Operation{
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
bag.compute(this.value.visit(visitor).toList().toArray());
VisitorBag bag = new VisitorBag();
bag.merge(this.value.visit(visitor));
return bag;
}

View file

@ -6,8 +6,7 @@ import java.util.function.Function;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.Variable;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class TryOperation extends OperationBag{
@ -48,9 +47,9 @@ public class TryOperation extends OperationBag{
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
if(this.resource != null) bag.compute(this.resource.visit(visitor).toList().toArray());
bag.compute(super.visit(visitor).toList().toArray());
VisitorBag bag = new VisitorBag();
if(this.resource != null) bag.merge(this.resource.visit(visitor));
bag.merge(super.visit(visitor));
return bag;
}
}

View file

@ -6,8 +6,7 @@ import java.util.function.Function;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.value.Value;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class WhileOperation extends OperationBag{
@ -42,9 +41,9 @@ public class WhileOperation extends OperationBag{
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
bag.compute(this.condition.visit(visitor).toList().toArray());
bag.compute(super.visit(visitor).toList().toArray());
VisitorBag bag = new VisitorBag();
bag.merge(this.condition.visit(visitor));
bag.merge(super.visit(visitor));
return bag;
}
}

View file

@ -5,8 +5,7 @@ import java.util.function.Function;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class ArrayValue extends Value{
@ -38,9 +37,9 @@ public class ArrayValue extends Value{
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
VisitorBag bag = new VisitorBag();
for(Value value : this.values){
bag.compute(value.visit(visitor).toList().toArray());
bag.merge(value.visit(visitor));
}
return bag;
}

View file

@ -5,8 +5,7 @@ import java.util.function.Function;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class BiValue extends Value{
@ -55,9 +54,9 @@ public class BiValue extends Value{
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
bag.compute(left.visit(visitor).toList().toArray());
bag.compute(right.visit(visitor).toList().toArray());
VisitorBag bag = new VisitorBag();
bag.merge(left.visit(visitor));
bag.merge(right.visit(visitor));
return bag;
}
}

View file

@ -5,8 +5,7 @@ import java.util.function.Function;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class InnerElementValue extends Value{
@ -38,8 +37,8 @@ public class InnerElementValue extends Value{
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
bag.compute(this.element.visit(visitor).toList().toArray());
VisitorBag bag = new VisitorBag();
bag.merge(this.element.visit(visitor));
return bag;
}

View file

@ -6,8 +6,7 @@ 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.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class InstanceValue extends Value{
@ -51,10 +50,10 @@ public class InstanceValue extends Value{
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
VisitorBag bag = new VisitorBag();
if(this.parameters != null)
for(Value value : this.parameters){
bag.compute(value.visit(visitor).toList().toArray());
bag.merge(value.visit(visitor));
}
return bag;
}

View file

@ -11,8 +11,7 @@ import dev.peerat.parser.java.Variable;
import dev.peerat.parser.java.Operation.OperationContainer;
import dev.peerat.parser.java.Variable.VariableContainer;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class LambdaValue extends Value implements OperationContainer, VariableContainer{
@ -66,9 +65,9 @@ public class LambdaValue extends Value implements OperationContainer, VariableCo
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
VisitorBag bag = new VisitorBag();
for(JavaElement element : this.operations){
bag.compute(element.visit(visitor).toList().toArray());
bag.merge(element.visit(visitor));
}
return bag;
}

View file

@ -6,8 +6,7 @@ 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.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class MethodCallValue extends Value{
@ -57,11 +56,11 @@ public class MethodCallValue extends Value{
@Override
public VisitorBag visit(JavaVisitor<?> visitor){
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
bag.compute(this.base.visit(visitor).toList().toArray());
VisitorBag bag = new VisitorBag();
bag.merge(this.base.visit(visitor));
if(this.parameters != null)
for(Value value : this.parameters){
bag.compute(value.visit(visitor).toList().toArray());
bag.merge(value.visit(visitor));
}
return bag;
}

View file

@ -6,8 +6,7 @@ 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.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class ModifierValue extends Value{
@ -50,8 +49,8 @@ public class ModifierValue extends Value{
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
bag.compute(value.visit(visitor).toList().toArray());
VisitorBag bag = new VisitorBag();
bag.merge(value.visit(visitor));
return bag;
}
}

View file

@ -6,7 +6,7 @@ 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.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class StaticValue extends Value{

View file

@ -5,8 +5,7 @@ import java.util.function.Function;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class TriValue extends Value{
@ -55,11 +54,11 @@ public class TriValue extends Value{
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
VisitorBag bag = new VisitorBag();
bag.compute(this.check.visit(visitor).toList().toArray());
bag.compute(this.success.visit(visitor).toList().toArray());
bag.compute(this.fail.visit(visitor).toList().toArray());
bag.merge(this.check.visit(visitor));
bag.merge(this.success.visit(visitor));
bag.merge(this.fail.visit(visitor));
return bag;
}

View file

@ -6,8 +6,7 @@ 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.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class VariableAccessValue extends Value{
@ -45,8 +44,8 @@ public class VariableAccessValue extends Value{
@Override
public VisitorBag visit(JavaVisitor<?> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new ListVisitorBag();
bag.compute(this.base.visit(visitor).toList().toArray());
VisitorBag bag = new VisitorBag();
bag.merge(this.base.visit(visitor));
return bag;
}

View file

@ -3,25 +3,26 @@ package dev.peerat.parser.java.visitor;
import java.util.Map;
import java.util.Map.Entry;
import java.util.function.BiPredicate;
import java.util.function.Function;
import java.util.function.Predicate;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.Annotation;
import dev.peerat.parser.java.value.Value;
import dev.peerat.parser.visitor.bag.ListVisitorBag;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public class JavaAnnotationVisitor extends JavaVisitor<Annotation>{
private Predicate<String> nameFilter;
private Predicate<String> keyFilter;
private BiPredicate<String, Value> valueFilter;
private BiPredicate<String, Value> valueFilter;
private Function<String, JavaVisitor<?>> valueFilterVisitor;
public JavaAnnotationVisitor(){
super(Annotation.class);
}
public JavaAnnotationVisitor filterName(Predicate<String> validator){
public JavaAnnotationVisitor nameFilter(Predicate<String> validator){
this.nameFilter = (this.nameFilter == null) ? validator : this.nameFilter.and(validator);
return this;
}
@ -31,14 +32,21 @@ public class JavaAnnotationVisitor extends JavaVisitor<Annotation>{
return this;
}
public JavaAnnotationVisitor filterValue(BiPredicate<String, Value> validator){
public JavaAnnotationVisitor valueFilter(BiPredicate<String, Value> validator){
this.valueFilter = (this.valueFilter == null) ? validator : this.valueFilter.and(validator);
return this;
}
//unique ?
public JavaAnnotationVisitor valueFilter(Function<String, JavaVisitor<?>> visitor){
System.out.println("filter value visitor");
this.valueFilterVisitor = visitor;
return this;
}
@Override
public VisitorBag visitElement(Annotation element){
VisitorBag bag = new ListVisitorBag();
VisitorBag bag = new VisitorBag();
if(nameFilter != null){
if(!nameFilter.test(element.getName().getValue())) return bag;
}
@ -59,6 +67,19 @@ public class JavaAnnotationVisitor extends JavaVisitor<Annotation>{
}
}
if(this.valueFilterVisitor != null){
Map<Token, Value> paramters = element.getParameters();
if(paramters == null) return bag;
//ALL LIKE THIS?
boolean findOne = false;
for(Entry<Token, Value> entry : paramters.entrySet()){
VisitorBag vbag = this.valueFilterVisitor.apply(entry.getKey().getValue()).visit(entry.getValue());
bag.merge(vbag);
if(vbag.isValidated()) findOne = true;
}
if(!findOne) return bag;
}
bag.compute(element);
return bag;
}

View file

@ -0,0 +1,42 @@
package dev.peerat.parser.java.visitor;
import java.util.List;
import dev.peerat.parser.java.Annotation;
import dev.peerat.parser.java.ClassBase;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
public class JavaClassBaseVisitor extends JavaVisitor<ClassBase>{
private Visitor<JavaElement> validator;
public JavaClassBaseVisitor(){
super(ClassBase.class);
}
public JavaClassBaseVisitor annotationFilter(Visitor<JavaElement> visitor){
this.validator = visitor;
return this;
}
@Override
public VisitorBag visitElement(ClassBase element){
VisitorBag bag = new VisitorBag();
if(this.validator != null){
List<Annotation> annotations = element.getAnnotations();
if(annotations == null) return bag;
for(Annotation annotation : annotations){
VisitorBag vbag = this.validator.visit(annotation);
bag.merge(vbag);
if(!vbag.isValidated()) return bag; //check fail TODO
}
}
bag.compute(element);
return bag;
}
}

View file

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

View file

@ -0,0 +1,22 @@
package dev.peerat.parser.java.visitor;
import dev.peerat.parser.java.Function;
import dev.peerat.parser.visitor.VisitorBag;
public class JavaFunctionVisitor extends JavaVisitor<Function>{
public JavaFunctionVisitor(){
super(Function.class);
}
@Override
public VisitorBag visitElement(Function element){
VisitorBag bag = new VisitorBag();
bag.compute(element);
return bag;
}
}

View file

@ -0,0 +1,99 @@
package dev.peerat.parser.java.visitor;
import java.util.function.Predicate;
import dev.peerat.parser.java.Variable;
import dev.peerat.parser.visitor.VisitorBag;
public class JavaVariableVisitor extends JavaVisitor<Variable>{
private Predicate<String> typeFilter;
private Predicate<String> nameFilter;
private Predicate<Integer> modifierFilter;
public JavaVariableVisitor(){
super(Variable.class);
}
public JavaVariableVisitor typeFilter(Predicate<String> validator){
this.typeFilter = (this.typeFilter == null) ? validator : this.typeFilter.and(validator);
return this;
}
public JavaVariableVisitor nameFilter(Predicate<String> validator){
this.nameFilter = (this.nameFilter == null) ? validator : this.nameFilter.and(validator);
return this;
}
public JavaVariableVisitor isPublic(){
Predicate<Integer> validator = (mod) -> (mod & 0x1) != 0;
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
return this;
}
public JavaVariableVisitor isPrivate(){
Predicate<Integer> validator = (mod) -> (mod & 0x2) != 0;
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
return this;
}
public JavaVariableVisitor isProtected(){
Predicate<Integer> validator = (mod) -> (mod & 0x4) != 0;
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
return this;
}
public JavaVariableVisitor isStatic(){
Predicate<Integer> validator = (mod) -> (mod & 0x8) != 0;
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
return this;
}
public JavaVariableVisitor isFinal(){
Predicate<Integer> validator = (mod) -> (mod & 0x10) != 0;
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
return this;
}
public JavaVariableVisitor isVolatile(){
Predicate<Integer> validator = (mod) -> (mod & 0x40) != 0;
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
return this;
}
public JavaVariableVisitor isTransient(){
Predicate<Integer> validator = (mod) -> (mod & 0x80) != 0;
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
return this;
}
public JavaVariableVisitor isPackageLevel(){
Predicate<Integer> validator = (mod) -> (mod & 0x1) == 0 && (mod & 0x2) == 0 && (mod & 0x4) == 0;
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
return this;
}
@Override
public VisitorBag visitElement(Variable element){
VisitorBag bag = new VisitorBag();
if(typeFilter != null){
//ellipse ?
if(!typeFilter.test(element.getType().getValue())) return bag;
}
if(nameFilter != null){
if(!nameFilter.test(element.getName().getValue())) return bag;
}
if(this.modifierFilter != null){
if(!this.modifierFilter.test(element.getModifier())) return bag;
}
bag.compute(element);
return bag;
}
}

View file

@ -1,32 +1,50 @@
package dev.peerat.parser.java.visitor;
import dev.peerat.parser.java.AnnotationClass;
import dev.peerat.parser.java.ClassBase;
import dev.peerat.parser.java.Function;
import dev.peerat.parser.java.Import;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.Operation;
import dev.peerat.parser.java.Variable;
import dev.peerat.parser.java.value.Value;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.bag.VisitorBag;
import dev.peerat.parser.visitor.VisitorBag;
public abstract class JavaVisitor<T extends JavaElement> extends Visitor<JavaElement>{
public static <T extends JavaElement> JavaVisitor<T> base(JavaVisitor<T> visitor){
return visitor;
public static <T extends JavaElement> JavaVisitor<T> base(Visitor<T> visitor){
return new JavaVisitor<T>(null){
@Override
public boolean canVisit(Class<?> type){
// System.out.println("base can visit ? "+type);
return visitor.canVisit(type);
}
@Override
public VisitorBag visitElement(T element){
return visitor.visit(element);
}
};
}
public static JavaVisitor<JavaElement> allJavaElement(){
return null;
return new JavaVisitor<JavaElement>(JavaElement.class){
@Override
public VisitorBag visitElement(JavaElement element){
VisitorBag bag = new VisitorBag();
bag.compute(element);
return bag;
}
};
}
public static JavaVisitor<ClassBase> allClassBase(){
return null;
public static JavaClassBaseVisitor allClassBase(){
return new JavaClassBaseVisitor();
}
public static JavaVisitor<dev.peerat.parser.java.Class> allClass(){
return null;
public static JavaClassVisitor allClass(){
return new JavaClassVisitor();
}
public static JavaVisitor<JavaElement> allInterface(){
@ -45,12 +63,12 @@ public abstract class JavaVisitor<T extends JavaElement> extends Visitor<JavaEle
return new JavaAnnotationVisitor();
}
public static JavaVisitor<Variable> allVariable(){
return null;
public static JavaVariableVisitor allVariable(){
return new JavaVariableVisitor();
}
public static JavaVisitor<Function> allFunction(){
return null;
public static JavaFunctionVisitor allFunction(){
return new JavaFunctionVisitor();
}
public static JavaVisitor<Value> allValue(){
@ -71,11 +89,14 @@ public abstract class JavaVisitor<T extends JavaElement> extends Visitor<JavaEle
this.type = type;
}
@Override
public boolean canVisit(Class<?> type){
// System.out.println("can "+type+" visit "+this.type+" ? from "+Thread.currentThread().getStackTrace()[2]);
return this.type.isAssignableFrom(type);
}
public VisitorBag visit(Object element){
@Override
public VisitorBag visit(JavaElement element){
return visitElement((T) element);
}

View file

@ -1,22 +0,0 @@
package dev.peerat.parser.java.visitor.internal.chain;
import dev.peerat.parser.java.JavaElement;
public abstract class JavaVisitorChain<T extends JavaElement>{
private JavaVisitorChain<?> next;
public JavaVisitorChain<?> chain(JavaVisitorChain<?> next){
return this.next = next;
}
public JavaVisitorChain<?> chain(){
return this.next;
}
public boolean hasNext(){
return this.next != null;
}
public abstract boolean visit(T element);
}

View file

@ -1,25 +0,0 @@
package dev.peerat.parser.java.visitor.internal.chain;
import java.util.function.Predicate;
import dev.peerat.parser.java.JavaElement;
public class JavaVisitorChainPredicate<T extends JavaElement> extends JavaVisitorChain<T>{
private Predicate<T> predicate;
public JavaVisitorChainPredicate(Predicate<T> predicate){
this.predicate = predicate;
}
@Override
public boolean visit(T element){
// if(this.predicate.test(element)){
// if(hasNext()) return chain().visit(element);
// else return true;
// }else return false;
return false;
}
}

View file

@ -1,37 +1,42 @@
package dev.peerat.parser.visitor;
import static dev.peerat.parser.java.visitor.JavaVisitor.allAnnotation;
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.allJavaElement;
import static dev.peerat.parser.visitor.Operator.collect;
import dev.peerat.parser.java.Annotation;
import dev.peerat.parser.java.Function;
import dev.peerat.parser.java.JavaFile;
import dev.peerat.parser.java.JavaParser;
import dev.peerat.parser.java.visitor.JavaVisitor;
public class Example {
public class Example {
public static void main(String[] args) throws Exception{
JavaParser parser = new JavaParser();
JavaFile container = new JavaFile();
parser.parse("package be.peerat.test; public class Example{ @Test public void helloTest(){} }", container);
parser.parse("package dev.peerat.test; public class Example{ public void helloTest(){ System.out.println(\"hello\"); } }", container);
// JavaVisitor visitor = JavaVisitor.base(
// key(
// allJavaElement()
// ),
// value(
// allAnnotation().filterName((name) -> name.equals("Test"))
// )
// );
JavaVisitor<Annotation> visitor = JavaVisitor.base(
allAnnotation().filterName((name) -> name.equals("Test"))
);
VisitorBag result = container.visit(
allClass()
.isPublic()
.elements(
collect(allJavaElement())
)
);
System.out.println("result: "+result.toList());
result = container.visit(base(collect(
allClass()
.isPublic()
.elements(
allJavaElement()
)
)));
System.out.println("result: "+result.toList());
Function func = container.getMainClass().find((element) -> element instanceof Function);
System.out.println("1. "+func.visit(visitor).toList());
System.out.println("2. "+container.visit(visitor).toList());
}
}

View file

@ -1,13 +1,48 @@
package dev.peerat.parser.visitor;
import java.util.function.Predicate;
public class Operator{
public static <T extends Visitor<?>> T and(Visitor<?>... visitors){
return null;
//Success ? Fail ?
public static <E,T extends Visitor<E>> T and(T... visitors){
return (T) new Visitor<E>(){
@Override
public VisitorBag visit(E element){
VisitorBag bag = new VisitorBag();
for(T visitor : visitors){
VisitorBag vbag = visitor.visit(element);
bag.merge(vbag);
if(!vbag.isValidated()) return new VisitorBag();
}
return bag;
}
@Override
public boolean canVisit(Class<?> type){
return true;
}
};
}
public static <T extends Visitor<?>> T or(Visitor<?>... visitors){
return null;
//Quid de si c'est empty ?
public static <E, T extends Visitor<E>> T or(T... visitors){
return (T) new Visitor<E>(){
@Override
public VisitorBag visit(E element){
VisitorBag bag = new VisitorBag();
for(T visitor : visitors){
VisitorBag vbag = visitor.visit(element);
bag.merge(vbag);
}
return bag;
}
@Override
public boolean canVisit(Class<?> type) {
return true;
}
};
}
public static <T extends Visitor<?>> T key(Visitor<?> visitor){
@ -17,5 +52,35 @@ public class Operator{
public static <T extends Visitor<?>> T value(Visitor<?> visitor){
return null;
}
public static <E> Visitor<E> collect(Visitor<E> visitor){
return new Visitor<E>(){
@Override
public VisitorBag visit(E element){
return visitor.visit(element).collect();
}
@Override
public boolean canVisit(Class<?> type){
// System.out.println("collect can visit ? "+type);
return visitor.canVisit(type);
}
};
}
public static <E, T extends Visitor<E>> T count(T visitor, Predicate<Integer> validator){
return (T) new Visitor<E>(){
@Override
public VisitorBag visit(E element){
VisitorBag visited = visitor.visit(element);
return validator.test(visited.toList().size()) ? visited : new VisitorBag();
}
@Override
public boolean canVisit(Class<?> type) {
return true;
}
};
}
}

View file

@ -2,4 +2,8 @@ package dev.peerat.parser.visitor;
public abstract class Visitor<T>{
public abstract boolean canVisit(Class<?> type); //change "Class<?> type" into "Object element" ?
public abstract VisitorBag visit(T element);
}

View file

@ -0,0 +1,49 @@
package dev.peerat.parser.visitor;
import java.util.ArrayList;
import java.util.List;
//only one pass in parameter or visit ?
public class VisitorBag{
private List<Object> collect;
private List<Object> list;
public VisitorBag(){
this.collect = new ArrayList<>();
this.list = new ArrayList<>();
}
public void compute(Object element){
// System.out.println("compute("+collect+", "+list+") "+element+" <- "+Thread.currentThread().getStackTrace()[2]);
this.list.add(element);
}
public void merge(VisitorBag bag){
// System.out.println("merge("+collect+", "+list+") <- "+Thread.currentThread().getStackTrace()[2]);
this.collect.addAll(bag.collect);
// System.out.println("merged("+collect+", "+list+") <- "+Thread.currentThread().getStackTrace()[2]);
}
public boolean isValidated(){
return !this.list.isEmpty();
}
public List<Object> computeList(){
return this.list;
}
VisitorBag collect(){
this.collect.addAll(this.list);
// System.out.println("collected("+collect+", "+list+") <- "+Thread.currentThread().getStackTrace()[2]);
return this;
}
public <T> T toElement(){
return (T) this.collect.get(0);
}
public <T> List<T> toList(){
return (List<T>) this.collect;
}
}

View file

@ -1,29 +0,0 @@
package dev.peerat.parser.visitor.bag;
import java.util.ArrayList;
import java.util.List;
public class ListVisitorBag extends VisitorBag{
private List<Object> list;
public ListVisitorBag(){
this.list = new ArrayList<>();
}
@Override
public void compute(Object... elements) {
for(Object element : elements) list.add(element);
}
@Override
public <T> T toElement(){
return (T) list.get(0);
}
@Override
public <T> List<T> toList(){
return (List<T>) list;
}
}

View file

@ -1,12 +0,0 @@
package dev.peerat.parser.visitor.bag;
import java.util.List;
public abstract class VisitorBag{
public abstract void compute(Object... elements);
public abstract <T> T toElement();
public abstract <T> List<T> toList();
}