[BETA] base Visitor in all JavaElement + base Visitor Pattern + refractor VisitorBag + debug (commentary & commented sysout)
This commit is contained in:
parent
7ea19a009a
commit
ce19dae60e
56 changed files with 642 additions and 357 deletions
|
@ -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());
|
||||
}
|
||||
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
package dev.peerat.parser;
|
||||
|
||||
public class StreamTokenizer extends Tokenizer{
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
package dev.peerat.parser;
|
||||
|
||||
public interface StreamableTree{}
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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{
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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{
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
//
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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{
|
||||
|
||||
|
|
|
@ -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{
|
||||
|
||||
|
|
|
@ -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{
|
||||
|
||||
|
|
|
@ -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{
|
||||
|
||||
|
|
|
@ -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{
|
||||
|
||||
|
|
|
@ -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{
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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{
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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{
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 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;
|
||||
}
|
||||
|
|
42
src/dev/peerat/parser/java/visitor/JavaClassBaseVisitor.java
Normal file
42
src/dev/peerat/parser/java/visitor/JavaClassBaseVisitor.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
130
src/dev/peerat/parser/java/visitor/JavaClassVisitor.java
Normal file
130
src/dev/peerat/parser/java/visitor/JavaClassVisitor.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
22
src/dev/peerat/parser/java/visitor/JavaFunctionVisitor.java
Normal file
22
src/dev/peerat/parser/java/visitor/JavaFunctionVisitor.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
99
src/dev/peerat/parser/java/visitor/JavaVariableVisitor.java
Normal file
99
src/dev/peerat/parser/java/visitor/JavaVariableVisitor.java
Normal 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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -1,12 +1,12 @@
|
|||
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 {
|
||||
|
||||
|
@ -14,24 +14,29 @@ public class Example {
|
|||
|
||||
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());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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){
|
||||
|
@ -18,4 +53,34 @@ public class Operator{
|
|||
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;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
|
49
src/dev/peerat/parser/visitor/VisitorBag.java
Normal file
49
src/dev/peerat/parser/visitor/VisitorBag.java
Normal 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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
Loading…
Add table
Reference in a new issue