TokenVisitor + ImportTree + refractor JavaTree into new class (was in JavaParser) + Value MethodCall -> generic call + TokenUpdater (V1)

This commit is contained in:
jeffcheasey88 2025-05-27 12:59:52 +02:00
parent fb96c287cf
commit 27b84dcacb
87 changed files with 779 additions and 192 deletions

View file

@ -14,4 +14,14 @@ public class SyntaxMissMatchException extends Exception{
public String getMessage(){
return "Only "+validator.getValidatedTokenCount()+" out "+validator.getTokenCount()+" of tokens parsed !";
}
public String locateEndOfParsing(){
int last = validator.getValidatedTokenCount();
return "Last Token Validated: "+validator.getToken(last).toString()+" near to "+getTokenValue(last-2)+" "+getTokenValue(last-1)+" "+getTokenValue(last)+" "+getTokenValue(last+1)+" "+getTokenValue(last+2);
}
private String getTokenValue(int index){
if(index < 0 || index >= validator.getTokenCount()) return "";
return validator.getToken(index).getValue();
}
}

View file

@ -36,6 +36,22 @@ public class Token{
return new Token(line, character, value+token.getValue(), TokenType.GROUP);
}
void setLine(int value){
this.line = value;
}
void setCharacter(int value){
this.character = value;
}
void setValue(String value){
this.value = value;
}
void setType(TokenType value){
this.type = value;
}
@Override
public boolean equals(Object obj){
if(obj == null) return false;

View file

@ -0,0 +1,84 @@
package dev.peerat.parser;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.function.Consumer;
public class TokenUpdater{
private Map<Token, Consumer<Token>> map;
private Token[] tokens;
//tmp
public TokenUpdater(){
this.map = new HashMap<>();
}
public TokenUpdater(Token[] tokens){
this.map = new HashMap<>();
this.tokens = tokens;
}
public void setValue(Token token, String value){
Consumer<Token> consumer = (current) -> current.setValue(value);
Consumer<Token> current = this.map.get(token);
map.put(token, current == null ? consumer : current.andThen(consumer));
}
public void setType(Token token, TokenType value){
Consumer<Token> consumer = (current) -> current.setType(value);
Consumer<Token> current = this.map.get(token);
map.put(token, current == null ? consumer : current.andThen(consumer));
}
public void setLine(Token token, int value){
Consumer<Token> consumer = (current) -> current.setLine(value);
Consumer<Token> current = this.map.get(token);
map.put(token, current == null ? consumer : current.andThen(consumer));
}
public void setCharacter(Token token, int value){
Consumer<Token> consumer = (current) -> current.setCharacter(value);
Consumer<Token> current = this.map.get(token);
map.put(token, current == null ? consumer : current.andThen(consumer));
}
public void pushUpdates(){
//tmp
if(this.tokens == null){
for(Entry<Token, Consumer<Token>> entry : this.map.entrySet()) entry.getValue().accept(entry.getKey());
return;
}
for(int index = 0; index < this.tokens.length; index++){
Token token = this.tokens[index];
Consumer<Token> consumer = this.map.remove(token);
if(consumer != null){
int line = token.getLineNumber();
int character = token.getCharacterNumber();
String value = token.getValue();
consumer.accept(token);
if(token.getLineNumber() != line){
int dif = token.getLineNumber()-line;
for(int next = index+1; next < this.tokens.length; next++){
Token update = this.tokens[next];
if(update.getLineNumber() < line) break;
update.setLine(update.getLineNumber()+dif);
}
}
if(token.getCharacterNumber() != character || value.length() != token.getValue().length()){
int dif = ((token.getCharacterNumber()+token.getValue().length())-(character+value.length()));
for(int next = index+1; next < this.tokens.length; next++){
Token update = this.tokens[next];
if(update.getLineNumber() > line) break;
update.setCharacter(update.getCharacterNumber()+dif);
}
}
}
}
//warn -> if map not empty -> tried to update non-tracked token, like group on concat,...
}
}

View file

@ -27,6 +27,16 @@ public class TokenValidator{
return this.validated;
}
public TokenUpdater toUpdater(){
return new TokenUpdater(elements);
}
//NO NEED FOR TREE !
Token getToken(int index){
return this.elements[index];
}
public boolean hasNext(){
return validated < elements.length;
}

View file

@ -3,13 +3,12 @@ package dev.peerat.parser.java;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Predicate;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.value.Value;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -127,5 +126,11 @@ public class Annotation implements JavaElement{
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -7,6 +7,7 @@ import java.util.function.Predicate;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -82,4 +83,10 @@ public class AnnotationClass extends ClassBase{
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -6,6 +6,7 @@ import java.util.List;
import java.util.function.Predicate;
import dev.peerat.parser.Token;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -80,11 +81,13 @@ public class Class extends ClassBase{
@Override
public VisitorBag visit(Visitor<JavaElement> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag();
if(!visitor.canPropagate()) return bag;
bag.merge(super.visit(visitor));
VisitorBag bag = super.visit(visitor);
if(!bag.isValidated()){
if(visitor.canVisit(getClass())){
bag.merge(visitor.visit(this));
if(!visitor.canPropagate()) return bag;
}
}
for(JavaElement element : this.elements){
bag.merge(element.visit(visitor));
@ -92,4 +95,10 @@ public class Class extends ClassBase{
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -7,6 +7,7 @@ import java.util.function.Predicate;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -87,5 +88,11 @@ public class Enumeration extends ClassBase{
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -1,20 +1,18 @@
package dev.peerat.parser.java;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.function.Predicate;
import dev.peerat.parser.Token;
import dev.peerat.parser.TokenType;
import dev.peerat.parser.java.Annotation.Annotable;
import dev.peerat.parser.java.Variable.VariableContainer;
import dev.peerat.parser.java.operation.Operation;
import dev.peerat.parser.java.operation.Operation.OperationContainer;
import dev.peerat.parser.java.value.Value;
import dev.peerat.parser.java.value.Value.ValueContainer;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -159,4 +157,13 @@ public class Function extends Annotable implements VariableContainer, OperationC
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
if(this.generic != null) bag.merge(visitor.visit(this.generic));
bag.merge(visitor.visit(this.type));
bag.merge(visitor.visit(this.name));
return bag;
}
}

View file

@ -7,6 +7,7 @@ import java.util.function.Predicate;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -43,5 +44,11 @@ public class Import implements JavaElement{
if(visitor.canVisit(getClass())) return visitor.visit(this);
return new VisitorBag();
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -7,6 +7,7 @@ import java.util.function.Predicate;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -85,4 +86,10 @@ public class Interface extends ClassBase{
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -3,6 +3,7 @@ package dev.peerat.parser.java;
import java.util.Collection;
import java.util.function.Predicate;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -13,4 +14,6 @@ public interface JavaElement{
<E extends JavaElement> void findAll(Predicate<JavaElement> finder, Collection<E> collector);
VisitorBag visit(Visitor<JavaElement> visitor);
VisitorBag visit(TokenVisitor visitor);
}

View file

@ -9,6 +9,7 @@ import java.util.function.Predicate;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.Annotation.AnnotableBuffer;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -89,8 +90,11 @@ public class JavaFile implements JavaElement, ClassContainer, AnnotableBuffer{
@Override
public VisitorBag visit(Visitor<JavaElement> visitor){
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag();
VisitorBag bag;
if(visitor.canVisit(getClass())){
bag = visitor.visit(this);
if(!visitor.canPropagate()) return bag;
}else bag = new VisitorBag();
if(!visitor.canPropagate()) return bag;
if(this.imports != null)
@ -108,4 +112,10 @@ public class JavaFile implements JavaElement, ClassContainer, AnnotableBuffer{
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -7,11 +7,14 @@ import dev.peerat.parser.java.tree.AnnotationTree;
import dev.peerat.parser.java.tree.ClassBaseTree;
import dev.peerat.parser.java.tree.ClassContainerTree;
import dev.peerat.parser.java.tree.ClassTree;
import dev.peerat.parser.java.tree.EnumTree;
import dev.peerat.parser.java.tree.EnumValueTree;
import dev.peerat.parser.java.tree.FunctionContainerTree;
import dev.peerat.parser.java.tree.FunctionTree;
import dev.peerat.parser.java.tree.GenericTree;
import dev.peerat.parser.java.tree.ImportTree;
import dev.peerat.parser.java.tree.InterfaceTree;
import dev.peerat.parser.java.tree.JavaTree;
import dev.peerat.parser.java.tree.JavaTreeType;
import dev.peerat.parser.java.tree.ModifierTree;
import dev.peerat.parser.java.tree.OperationTree;
@ -104,6 +107,7 @@ public class JavaParser extends Parser<JavaElement>{
SyntaxTreeRegistery<JavaElement> registery = new SyntaxTreeRegistery<>();
registery.register(new ModifierTree(registery));
registery.register(new ImportTree(registery));
registery.register(new TypeTree(registery));
registery.register(new GenericTree(registery));
registery.register(new ValueTree(registery));
@ -117,73 +121,15 @@ public class JavaParser extends Parser<JavaElement>{
registery.register(new ClassBaseTree(registery));
registery.register(new ClassTree(registery));
registery.register(new InterfaceTree(registery));
registery.register(new EnumTree(registery));
registery.register(new AnnotationClassTree(registery));
registery.register(new JavaTree(registery));
registery.init();
tRegistery.takeTiming("[Registery] %dms");
Timing load = Timing.of();
StateTree<JavaElement> main;
if(level == JavaTreeType.ALL){
InitialStateTree<JavaElement> base = new InitialStateTree<>();
main = base;
StateTree<JavaElement> pack = main.then((validator) -> {
if(validator.validate(
(token) -> token.getValue().equals("package"))){
while(validator.validate(
(token) -> !token.getValue().equals(";"),
(bag, token) -> {
Token current = bag.get();
if(current == null) bag.set(token);
else bag.set(current.concat(token));
})
);
return validator.validate((token) -> token.getValue().equals(";"));
}
return false;
}).end((parent, bag) -> {
((JavaFile)parent).setPackage(bag.get());
return parent;
});
StateTree<JavaElement> importState = new StateTree<>();
importState.then((validator) -> {
if(validator.validate(
(token) -> token.getValue().equals("import"))){
validator.validate(
(token) -> token.getValue().equals("static"),
(bag, token) -> bag.set("static", null));
while(validator.validate(
(token) -> !token.getValue().equals(";"),
(bag, token) -> {
Token current = bag.get();
if(current == null) bag.set(token);
else bag.set(current.concat(token));
})
);
return validator.validate((token) -> token.getValue().equals(";"));
}
return false;
}).<JavaElement>end((parent, bag) -> {
((JavaFile)parent).addImport(new Import(bag.has("static"), bag.get()));
return parent;
});
// base.multiple(pack);
base.multiple(importState);
base.multiple(registery.getNode(AnnotationTree.class));
base.multiple(registery.getNode(ClassBaseTree.class));
}else{
main = registery.getNode(level.getType());
}
// //SUMMARY
// //- Import
// //- Package
@ -257,7 +203,7 @@ public class JavaParser extends Parser<JavaElement>{
// System.out.println((System.currentTimeMillis()-time)+"ms");
setTokenizer(new JavaTokenizer());
setStateTree(main);
setStateTree(registery.getNode(level.getType()));
load.takeTiming("[load] %dms");
}

View file

@ -5,6 +5,7 @@ import java.util.Collection;
import java.util.List;
import java.util.function.Predicate;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -41,5 +42,11 @@ public class JavaProject implements JavaElement{
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -132,7 +132,6 @@ public class JavaTokenizer extends Tokenizer{
}
token = new Token(lineNumber, i+1, value, TokenType.STRING);
i = j-1;
System.out.println(token);
}else if(c == '\''){
String value = "'";
int j = i+1;
@ -150,7 +149,6 @@ public class JavaTokenizer extends Tokenizer{
}
token = new Token(lineNumber, i+1, value, TokenType.CHAR);
i = j-1;
System.out.println(token);
}else{
if(c == '/' && (i < line.length()-1 && line.charAt(i+1) == '/')) break;
if(c == '/' && (i < line.length()-1 && line.charAt(i+1) == '*')){

View file

@ -8,6 +8,7 @@ import java.util.function.Predicate;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.Annotation.Annotable;
import dev.peerat.parser.java.value.Value;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -101,4 +102,10 @@ public class Variable extends Annotable{
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -6,6 +6,7 @@ import java.util.Map.Entry;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.Annotation;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.value.Value;
public class JavaAnnotationBuilder extends JavaBuilder<Annotation>{
@ -51,7 +52,5 @@ public class JavaAnnotationBuilder extends JavaBuilder<Annotation>{
}
return new Annotation(new Token(0,0,name, null), map);
}
}

View file

@ -1,6 +1,7 @@
package dev.peerat.parser.java.builder;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.JavaFile;
import dev.peerat.parser.java.operation.Operation;
import dev.peerat.parser.java.value.Value;
@ -16,6 +17,10 @@ public abstract class JavaBuilder<T extends JavaElement>{
return ofFile().setPackage(pack);
}
public static JavaFileBuilder ofFile(JavaFile file){
return ofFile(); //TODO COMPLETE ALL BY DOM VALUES
}
public static JavaImportBuilder ofImport(){
return new JavaImportBuilder();
}
@ -87,4 +92,6 @@ public abstract class JavaBuilder<T extends JavaElement>{
public abstract T build();
public boolean filterEquals(JavaElement element){ return false;} //TODO ABSTRACT
}

View file

@ -12,6 +12,7 @@ import dev.peerat.parser.java.operation.Operation;
import dev.peerat.parser.java.operation.Operation.OperationContainer;
import dev.peerat.parser.java.tree.JavaTreeType;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -54,5 +55,9 @@ public class JavaOperationBuilder extends JavaBuilder<Operation>{
return null;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
return null;
}
}
}

View file

@ -26,6 +26,7 @@ import dev.peerat.parser.java.value.Value;
import dev.peerat.parser.java.value.VariableAccessValue;
import dev.peerat.parser.java.value.Value.ValueContainer;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -143,5 +144,10 @@ public class JavaValueBuilder extends JavaBuilder<Value>{
return null;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
return null;
}
}
}

View file

@ -5,6 +5,7 @@ import java.util.function.Predicate;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.value.Value;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -47,4 +48,10 @@ public class AssignOperation extends Operation{
bag.merge(right.visit(visitor));
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -7,6 +7,7 @@ import java.util.function.Predicate;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -31,5 +32,11 @@ public class BreakOperation extends Operation{
if(visitor.canVisit(getClass())) return visitor.visit(this);
return null;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -5,6 +5,7 @@ import java.util.List;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -32,5 +33,11 @@ public class CatchOperation extends OperationBag{
if(visitor.canVisit(getClass())) return visitor.visit(this);
return super.visit(visitor);
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -7,6 +7,7 @@ import java.util.function.Predicate;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -29,4 +30,10 @@ public class ContinueOperation extends Operation{
if(visitor.canVisit(getClass())) return visitor.visit(this);
return null;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -2,6 +2,7 @@ package dev.peerat.parser.java.operation;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -13,4 +14,9 @@ public class DoOperation extends OperationBag{
return super.visit(visitor);
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -2,6 +2,7 @@ package dev.peerat.parser.java.operation;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -12,5 +13,11 @@ public class ElseOperation extends OperationBag{
if(visitor.canVisit(getClass())) return visitor.visit(this);
return super.visit(visitor);
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -2,6 +2,7 @@ package dev.peerat.parser.java.operation;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -12,5 +13,11 @@ public class FinallyOperation extends OperationBag{
if(visitor.canVisit(getClass())) return visitor.visit(this);
return super.visit(visitor);
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -9,6 +9,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.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -116,4 +117,10 @@ public class ForOperation extends OperationBag{
bag.merge(super.visit(visitor));
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -9,6 +9,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.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -58,4 +59,10 @@ public class ForeachOperation extends OperationBag{
bag.merge(super.visit(visitor));
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -8,6 +8,7 @@ import java.util.function.Predicate;
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.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -38,11 +39,19 @@ public class IfOperation extends OperationBag{
}
@Override
public VisitorBag visit(Visitor<JavaElement> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this);
VisitorBag bag = new VisitorBag();
public VisitorBag visit(Visitor<JavaElement> visitor){
VisitorBag bag;
if(visitor.canVisit(getClass())){
bag = visitor.visit(this);
if(!visitor.canPropagate()) return bag;
}else bag = new VisitorBag();
bag.merge(condition.visit(visitor));
bag.merge(super.visit(visitor));
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
return new VisitorBag();
}
}

View file

@ -8,6 +8,7 @@ import java.util.function.Predicate;
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.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -43,4 +44,10 @@ public class ReturnOperation extends Operation{
if(this.value != null) bag.merge(this.value.visit(visitor));
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -7,6 +7,7 @@ import java.util.function.Predicate;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -31,4 +32,10 @@ public class SwitchOperation extends Operation{
if(visitor.canVisit(getClass())) return visitor.visit(this);
return null;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -8,6 +8,7 @@ import java.util.function.Predicate;
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.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -45,4 +46,10 @@ public class SynchronizedOperation extends OperationBag{
bag.merge(super.visit(visitor));
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -8,6 +8,7 @@ import java.util.function.Predicate;
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.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -42,4 +43,9 @@ public class ThrowOperation extends Operation{
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -8,6 +8,7 @@ import java.util.function.Predicate;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.Variable;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -50,4 +51,10 @@ public class TryOperation extends OperationBag{
bag.merge(super.visit(visitor));
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -8,6 +8,7 @@ import java.util.function.Predicate;
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.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -44,4 +45,10 @@ public class WhileOperation extends OperationBag{
bag.merge(super.visit(visitor));
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -1,5 +1,7 @@
package dev.peerat.parser.java.printer;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.operation.IfOperation;
import dev.peerat.parser.java.operation.ReturnOperation;
import dev.peerat.parser.java.value.Value;
@ -21,5 +23,35 @@ public class JavaOperationPrinter{
}
}
public static class JavaOperationIfPrinter extends JavaPrinter<IfOperation>{
@Override
public void print(IfOperation element, Writer writer, String buffer, JavaPrintProvider provider) throws Exception {
writer.write(buffer+"if(");
Value condition = element.getCondition();
provider.getPrinter(condition).print(condition, writer, "", provider);
writer.write(")");
int size = element.getElements().size();
if(size == 0){
writer.write(";");
return;
}
if(size == 1){
writer.write(" ");
JavaElement subElement = element.getElements().get(0);
provider.getPrinter(subElement).print(subElement, writer, "", provider);
writer.write(";");
return;
}
writer.write("{\n");
for(JavaElement subElement : element.getElements()){
provider.getPrinter(subElement).print(subElement, writer, buffer+"\t", provider);
writer.write("\n");
}
writer.write(buffer+"}\n");
}
}
}

View file

@ -11,7 +11,9 @@ import dev.peerat.parser.java.Import;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.JavaFile;
import dev.peerat.parser.java.Variable;
import dev.peerat.parser.java.operation.IfOperation;
import dev.peerat.parser.java.operation.ReturnOperation;
import dev.peerat.parser.java.printer.JavaOperationPrinter.JavaOperationIfPrinter;
import dev.peerat.parser.java.printer.JavaOperationPrinter.JavaOperationReturnPrinter;
import dev.peerat.parser.java.printer.JavaValuePrinter.JavaArrayAccessValuePrinter;
import dev.peerat.parser.java.printer.JavaValuePrinter.JavaArrayValuePrinter;
@ -53,6 +55,7 @@ public abstract class JavaPrinter<T extends JavaElement>{
provider.register(VariableAccessValue.class, new JavaVariableAccessValuePrinter());
provider.register(ReturnOperation.class, new JavaOperationReturnPrinter());
provider.register(IfOperation.class, new JavaOperationIfPrinter());
provider.register(Import.class, new JavaImportPrinter());
provider.register(Annotation.class, new JavaAnnotationPrinter());
@ -82,7 +85,9 @@ public abstract class JavaPrinter<T extends JavaElement>{
}
public <T extends JavaElement> JavaPrinter<T> getPrinter(Class<T> type){
return (JavaPrinter<T>) this.map.get(type);
JavaPrinter<T> result = (JavaPrinter<T>) this.map.get(type);
if(result == null) throw new IllegalArgumentException("No Print Provider for type "+type+".");
return result;
}
}

View file

@ -35,7 +35,7 @@ public class JavaValuePrinter{
Value left = element.left();
provider.getPrinter(left).print(left, writer, "", provider);
writer.write(element.getAction());
writer.write(" "+element.getAction()+" ");
Value right = element.right();
provider.getPrinter(right).print(right, writer, "", provider);

View file

@ -20,7 +20,7 @@ public class ClassBaseTree extends SyntaxTree<JavaElement> {
StateTree<JavaElement> modifier = registery.getNode(ModifierTree.class);
StateTree<JavaElement> clazz_ = this.current;
this.modifierState = clazz_.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local)));
this.modifierState = clazz_.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))).loop();
}
public StateTree<JavaElement> getModifierNode(){

View file

@ -0,0 +1,45 @@
package dev.peerat.parser.java.tree;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.Import;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.JavaFile;
import dev.peerat.parser.state.StateTree;
import dev.peerat.parser.tree.SyntaxTree;
import dev.peerat.parser.tree.SyntaxTreeRegistery;
public class ImportTree extends SyntaxTree<JavaElement> {
public ImportTree(SyntaxTreeRegistery<JavaElement> registery) {
super(registery);
this.current = new StateTree<>();
}
@Override
public void init() {
this.current.then((validator) -> {
if(validator.validate(
(token) -> token.getValue().equals("import"))){
validator.validate(
(token) -> token.getValue().equals("static"),
(bag, token) -> bag.set("static", null));
while(validator.validate(
(token) -> !token.getValue().equals(";"),
(bag, token) -> {
Token current = bag.get();
if(current == null) bag.set(token);
else bag.set(current.concat(token));
})
);
return validator.validate((token) -> token.getValue().equals(";"));
}
return false;
}).<JavaElement>end((parent, bag) -> {
((JavaFile)parent).addImport(new Import(bag.has("static"), bag.get()));
return parent;
});
}
}

View file

@ -20,7 +20,6 @@ public class InterfaceTree extends SyntaxTree<JavaElement> {
@Override
public void init() {
StateTree<JavaElement> modifier = registery.getNode(ModifierTree.class);
StateTree<JavaElement> type = registery.getNode(TypeTree.class);
StateTree<JavaElement> clazz_container = registery.getNode(ClassContainerTree.class);
// INTERFACE

View file

@ -0,0 +1,47 @@
package dev.peerat.parser.java.tree;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.JavaFile;
import dev.peerat.parser.state.InitialStateTree;
import dev.peerat.parser.state.StateTree;
import dev.peerat.parser.tree.SyntaxTree;
import dev.peerat.parser.tree.SyntaxTreeRegistery;
public class JavaTree extends SyntaxTree<JavaElement> {
public JavaTree(SyntaxTreeRegistery<JavaElement> registery) {
super(registery);
this.current = new InitialStateTree<>();
}
@Override
public void init() {
InitialStateTree<JavaElement> main = (InitialStateTree<JavaElement>) this.current;
StateTree<JavaElement> pack = main.then((validator) -> {
if(validator.validate(
(token) -> token.getValue().equals("package"))){
while(validator.validate(
(token) -> !token.getValue().equals(";"),
(bag, token) -> {
Token current = bag.get();
if(current == null) bag.set(token);
else bag.set(current.concat(token));
})
);
return validator.validate((token) -> token.getValue().equals(";"));
}
return false;
}).end((parent, bag) -> {
((JavaFile)parent).setPackage(bag.get());
return parent;
});
// base.multiple(pack);
main.multiple(registery.getNode(ImportTree.class));
main.multiple(registery.getNode(AnnotationTree.class));
main.multiple(registery.getNode(ClassBaseTree.class));
}
}

View file

@ -4,7 +4,7 @@ import dev.peerat.parser.tree.TreeType;
public enum JavaTreeType implements TreeType{
ALL(null),
ALL(JavaTree.class),
CLASS_BASE(ClassBaseTree.class),
CLASS(ClassTree.class),
INTERFACE(InterfaceTree.class),
@ -17,6 +17,7 @@ public enum JavaTreeType implements TreeType{
VALUE(ValueTree.class),
TYPE(TypeTree.class),
GENERIC(GenericTree.class),
IMPORT(ImportTree.class),
MODIFIER(ModifierTree.class);
private Class<?> type;

View file

@ -128,10 +128,8 @@ public class OperationTree extends SyntaxTree<JavaElement> {
StateTree<JavaElement> operation_if = operation
.then((validator) -> validator.validate((token) -> token.getValue().equals("if")))
.then((validator) -> validator.validate((token) -> token.getValue().equals("("))).then((v) -> {
System.out.println("inside IF");
return true;
}).then(new RedirectStateTree<>(value, (global, local) -> global.set(local.get())))
.then((validator) -> validator.validate((token) -> token.getValue().equals("(")))
.then(new RedirectStateTree<>(value, (global, local) -> global.set(local.get())))
.then((validator) -> validator.validate((token) -> token.getValue().equals(")"))).end((parent, bag) -> {
System.out.println("if " + bag);
IfOperation op = new IfOperation(bag.get());
@ -264,7 +262,10 @@ public class OperationTree extends SyntaxTree<JavaElement> {
.unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a, b) -> a);
StateTree<JavaElement> operation_name = operation
.then(new RedirectStateTree<>(value, (global, local) -> global.set(local.get())));
.then(new RedirectStateTree<>(value, (global, local) -> {
global.set(local.get());
// System.out.println(" "+global);
}));
operation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("=")))
.then(new RedirectStateTree<>(value, (global, local) -> global.set("newer", local.get())))
.then((validator) -> validator.validate((token) -> token.getValue().equals(";")))
@ -289,7 +290,7 @@ public class OperationTree extends SyntaxTree<JavaElement> {
return null;
});
function_container.then(variable);
function_container.redirect(variable).end();
function_container.then(operation);
}

View file

@ -35,6 +35,8 @@ import dev.peerat.parser.tree.SyntaxTreeRegistery;
public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by more used branch ? to not check a whole tree to go on the last branch...
//TODO PRIORIY OF OPERATION ? BECAUSE OF != null + ?:
public ValueTree(SyntaxTreeRegistery<JavaElement> registery) {
super(registery);
this.current = new StateTree<>();
@ -42,6 +44,7 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
@Override
public void init(){
StateTree<JavaElement> generic = this.registery.getNode(GenericTree.class);
StateTree<JavaElement> type = this.registery.getNode(TypeTree.class);
StateTree<JavaElement> function_container = this.registery.getNode(FunctionContainerTree.class);
StateTree<JavaElement> class_container = this.registery.getNode(ClassContainerTree.class);
@ -115,27 +118,40 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
return true;
})
.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME),
(bag, token) ->{
bag.<ValueChainBuilder>get().nameValue(token);
}));
(bag, token) -> bag.<ValueChainBuilder>get().nameValue(token)));
value_name.end(ValueChainBuilder.build((builder) -> builder.dot(), false));
value_name.then(value_operation);
value_instance_array_value_end.equals(".", (bag, token) -> { bag.<ValueChainBuilder>get().rebase(new ArrayValue(bag.<List<Value>>get("array").toArray(new Value[0]))); bag.remove("array"); }).then(value_name);
StateTree<JavaElement> value_generic_call = unary_value.then((validator) -> {
validator.getBag().set(new ValueChainBuilder());
return true;
}).redirect(generic, (global, local) -> global.<ValueChainBuilder>get().generic(local.get()));
value_generic_call.then(value_name);
unary_value.then((validator) -> {
StateTree<JavaElement> value_instance_array_dot = value_instance_array_value_end.equals(".", (bag, token) -> { bag.<ValueChainBuilder>get().rebase(new ArrayValue(bag.<List<Value>>get("array").toArray(new Value[0]))); bag.remove("array"); });
value_instance_array_dot.then(value_name);
value_instance_array_dot.then(value_generic_call);
StateTree<JavaElement> string_value = unary_value.then((validator) -> {
validator.getBag().set(new ValueChainBuilder());
return true;
}).then((validator) -> validator.validate(
(token) -> token.getType().equals(TokenType.STRING) || token.getType().equals(TokenType.CHAR),
(bag, token) -> bag.<ValueChainBuilder>get().constantValue(token)))
.end(ValueChainBuilder.build((builder) -> builder.buildStatic(), false));
(bag, token) -> bag.<ValueChainBuilder>get().constantValue(token)));
string_value.end(ValueChainBuilder.build((builder) -> builder.buildStatic(), false));
string_value.then(value_operation);
value_operation.equals(">", action(">")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false));
value_operation.equals("=", action("=")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false));
value_operation.equals("<",action("<")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false));
value_operation.equals("!",action("!")).equals("=",action("!=")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false));
value_operation.equals("=",action("=")).equals("=",action("==")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false));
value_operation.equals("<",action("<")).equals("<","action","<<").then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false));
value_operation.equals("+",action("+")).equals("=", action("+=")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false));
value_operation.equals("+",action("+")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false));
value_operation.equals("instanceof", action("instanceof")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false));
StateTree<JavaElement> value_operation_bit_and = value_operation.equals("&",action("&"));
value_operation_bit_and.then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false));
value_operation_bit_and.equals("&",action("&&")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false));
@ -162,15 +178,19 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
StateTree<JavaElement> value_array_end = value_array_value.equals("]");
value_array_end.end(ValueChainBuilder.build(false));
value_array_end.then(value_array);
value_array_end.equals(".", (bag, token) -> bag.<ValueChainBuilder>get().dot()).then(value_name);
StateTree<JavaElement> value_array_dot = value_array_end.equals(".", (bag, token) -> bag.<ValueChainBuilder>get().dot());
value_array_dot.then(value_name);
value_array_dot.then(value_generic_call);
value_instance_array_value_end.then(value_array);
StateTree<JavaElement> operation_call = value_name.equals(".", (bag, token) -> bag.<ValueChainBuilder>get().dot());
operation_call.then(value_name);
operation_call.then(value_generic_call);
StateTree<JavaElement> operation_begin = value_name.equals("(", (bag, token) -> bag.<ValueChainBuilder>get().parameter());
StateTree<JavaElement> operation_end = operation_begin.equals(")", (bag, token) -> bag.<ValueChainBuilder>get().parameter());
operation_end.then(operation_call);
operation_end.then(value_operation);
operation_end.end(ValueChainBuilder.build((builder) -> builder.buildMethodCall(), false));
StateTree<JavaElement> operation_value = operation_begin.redirect(this.current, (global, local) -> global.<ValueChainBuilder>get().parameter(local.get()));
operation_value.then(operation_end);
@ -204,7 +224,9 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
cast.end(ValueChainBuilder.build(false));
cast.equals(".").then(value_name);
StateTree<JavaElement> cast_dot = cast.equals(".");
cast_dot.then(value_name);
cast_dot.then(value_generic_call);
cast.then(value_array);
value_inside_type.then(value_inside);
@ -216,6 +238,13 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
value_inside.then(value_operation);
value_parenthesis_close.end();
value_parenthesis_close.then(value_operation);
StateTree<JavaElement> value_parenthesis_dot = value_parenthesis_close.equals(".", (bag, token) -> {
ValueChainBuilder builder = new ValueChainBuilder();
builder.rebase(bag.get());
bag.set(builder);
});
value_parenthesis_dot.then(value_generic_call);
value_parenthesis_dot.then(value_name);
StateTree<JavaElement> value_lambda = value_parenthesis_close.then((validator) -> validator.validate((token) -> token.getValue().equals("-")) && validator.validate((token) -> token.getValue().equals(">")));
value_lambda.equals("{")
@ -231,7 +260,16 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
}
private BiConsumer<Bag, Token> action(String action){
return (bag, token) -> bag.<ValueChainBuilder>get().action(action);
return (bag, token) -> {
if(!(bag.get() instanceof ValueChainBuilder)){
ValueChainBuilder builder = new ValueChainBuilder();
builder.rebase(bag.get());
builder.action(action);
bag.set(builder);
return;
}
bag.<ValueChainBuilder>get().action(action);
};
}
private BiConsumer<Bag, Token> modifier(){
@ -262,6 +300,8 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
private Token current;
private Token generic;
private Token modifier;
private String action;
@ -295,6 +335,10 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
this.right = value;
}
public void generic(Token token){
this.generic = token;
}
public void modifier(Token token){
this.modifier = token;
}
@ -349,16 +393,22 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
}
public void buildOperation(){
if(this.base != null && this.current != null) buildVariableAccess();
if(this.lambda != null) extractLambda();
this.base = new BiValue(current == null ? base : new StaticValue(current), action, right);
}
public void buildMethodCall(){
if(this.current == null) return;
this.base = new MethodCallValue(this.base, null, this.current, this.parameters);
this.base = new MethodCallValue(this.base, this.generic, this.current, this.parameters);
this.generic = null;
this.current = null;
this.parameters = null;
}
public void buildVariableAccess(){
this.base = new VariableAccessValue(this.base, this.current);
this.current = null;
}
public void buildLambda(){

View file

@ -6,6 +6,7 @@ import java.util.function.Function;
import java.util.function.Predicate;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -47,5 +48,13 @@ public class ArrayAccessValue extends Value{
bag.merge(this.access.visit(visitor));
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
bag.merge(this.base.visit(visitor));
bag.merge(this.access.visit(visitor));
return bag;
}
}

View file

@ -6,6 +6,7 @@ import java.util.function.Function;
import java.util.function.Predicate;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -41,6 +42,11 @@ public class ArrayValue extends Value{
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
for(Value value : this.values) bag.merge(value.visit(visitor));
return bag;
}
}

View file

@ -7,6 +7,7 @@ import java.util.function.Predicate;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -59,4 +60,9 @@ public class BiValue extends Value{
bag.merge(right.visit(visitor));
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
return new VisitorBag();
}
}

View file

@ -7,6 +7,7 @@ import java.util.function.Predicate;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -48,6 +49,15 @@ public class CastValue extends Value{
return bag;
}
@Override
public String toString(){
return "[CastValue] (("+type+") "+value+")";
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -12,6 +12,7 @@ import dev.peerat.parser.java.Function.FunctionContainer;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.Variable;
import dev.peerat.parser.java.Variable.VariableContainer;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -92,5 +93,11 @@ public class InstanceValue extends Value implements VariableContainer, FunctionC
bag.merge(content.visit(visitor));
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -13,6 +13,7 @@ import dev.peerat.parser.java.Variable.VariableContainer;
import dev.peerat.parser.java.operation.Operation;
import dev.peerat.parser.java.operation.Operation.OperationContainer;
import dev.peerat.parser.java.value.Value.ValueContainer;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -81,6 +82,12 @@ public class LambdaValue extends Value implements OperationContainer, VariableCo
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
public static class LambdaParameter{
private Token type;

View file

@ -7,6 +7,7 @@ import java.util.function.Predicate;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -61,6 +62,12 @@ public class MethodCallValue extends Value{
for(Value value : parameters) bag.merge(value.visit(visitor));
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
@Override
public String toString(){

View file

@ -7,6 +7,7 @@ import java.util.function.Predicate;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -52,4 +53,10 @@ public class ModifierValue extends Value{
bag.merge(value.visit(visitor));
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -1,12 +1,11 @@
package dev.peerat.parser.java.value;
import java.util.Collection;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -45,4 +44,11 @@ public class StaticValue extends Value{
VisitorBag bag = new VisitorBag();
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
bag.merge(visitor.visit(this.token));
return bag;
}
}

View file

@ -6,6 +6,7 @@ import java.util.function.Function;
import java.util.function.Predicate;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -59,5 +60,11 @@ public class TriValue extends Value{
bag.merge(fail.visit(visitor));
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
}

View file

@ -7,6 +7,7 @@ import java.util.function.Predicate;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -47,6 +48,12 @@ public class VariableAccessValue extends Value{
bag.merge(base.visit(visitor));
return bag;
}
@Override
public VisitorBag visit(TokenVisitor visitor){
VisitorBag bag = new VisitorBag();
return bag;
}
@Override
public String toString(){

View file

@ -3,7 +3,7 @@ package dev.peerat.parser.java.visitor;
import dev.peerat.parser.java.AnnotationClass;
import dev.peerat.parser.visitor.VisitorBag;
public class JavaAnnotationClassVisitor extends JavaVisitor<AnnotationClass>{
public class JavaAnnotationClassVisitor extends JavaVisitor<AnnotationClass, JavaAnnotationClassVisitor>{
public JavaAnnotationClassVisitor(boolean propagate){
super(AnnotationClass.class, propagate);

View file

@ -11,12 +11,12 @@ import dev.peerat.parser.java.Annotation;
import dev.peerat.parser.java.value.Value;
import dev.peerat.parser.visitor.VisitorBag;
public class JavaAnnotationVisitor extends JavaVisitor<Annotation>{
public class JavaAnnotationVisitor extends JavaVisitor<Annotation, JavaAnnotationVisitor>{
private Predicate<String> nameFilter;
private Predicate<String> keyFilter;
private BiPredicate<String, Value> valueFilter;
private Function<String, JavaVisitor<?>> valueFilterVisitor;
private Function<String, JavaVisitor<?, ?>> valueFilterVisitor;
public JavaAnnotationVisitor(boolean propagate){
super(Annotation.class, propagate);
@ -48,7 +48,7 @@ public class JavaAnnotationVisitor extends JavaVisitor<Annotation>{
}
//unique ?
public JavaAnnotationVisitor valueFilter(Function<String, JavaVisitor<?>> visitor){
public JavaAnnotationVisitor valueFilter(Function<String, JavaVisitor<?, ?>> visitor){
System.out.println("filter value visitor");
this.valueFilterVisitor = visitor;
return this;

View file

@ -8,7 +8,7 @@ import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
public class JavaClassBaseVisitor extends JavaVisitor<ClassBase>{
public class JavaClassBaseVisitor extends JavaVisitor<ClassBase, JavaClassBaseVisitor>{
private Visitor<JavaElement> validator;

View file

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

View file

@ -3,7 +3,7 @@ package dev.peerat.parser.java.visitor;
import dev.peerat.parser.java.Enumeration;
import dev.peerat.parser.visitor.VisitorBag;
public class JavaEnumerationVisitor extends JavaVisitor<Enumeration>{
public class JavaEnumerationVisitor extends JavaVisitor<Enumeration, JavaEnumerationVisitor>{
public JavaEnumerationVisitor(boolean propagate){
super(Enumeration.class,propagate);

View file

@ -7,7 +7,7 @@ import dev.peerat.parser.java.JavaFile;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
public class JavaFileVisitor extends JavaVisitor<JavaFile>{
public class JavaFileVisitor extends JavaVisitor<JavaFile, JavaFileVisitor>{
private boolean checkPackage;
private boolean checkNoPackage;
@ -53,7 +53,10 @@ public class JavaFileVisitor extends JavaVisitor<JavaFile>{
if(this.checkPackage && element.getPackage() == null) return bag;
else if(this.checkNoPackage && element.getPackage() != null) return bag;
if(this.pack != null && element.getPackage() != null && !this.pack.test(element.getPackage().getValue())) return bag;
if(this.pack != null){
if(element.getPackage() == null) return bag;
if(!this.pack.test(element.getPackage().getValue())) return bag;
}
if(this.imports != null && validates(bag, element.getImports(), this.imports)) return bag;
if(this.classes != null){

View file

@ -1,19 +1,33 @@
package dev.peerat.parser.java.visitor;
import java.util.function.Predicate;
import dev.peerat.parser.java.Function;
import dev.peerat.parser.visitor.VisitorBag;
public class JavaFunctionVisitor extends JavaVisitor<Function>{
public class JavaFunctionVisitor extends JavaModifiableVisitor<Function, JavaFunctionVisitor>{
//TODO MOD + annotation
private Predicate<String> namePredicate;
public JavaFunctionVisitor(boolean propagate){
super(Function.class, propagate);
}
public JavaFunctionVisitor named(Predicate<String> predicate){
this.namePredicate = predicate; //TODO CONCAT
return this;
}
@Override
public VisitorBag visitElement(Function element){
VisitorBag bag = new VisitorBag();
if(this.namePredicate != null){
if(element.getName() == null) return bag;
if(!this.namePredicate.test(element.getName().getValue())) return bag;
}
bag.compute(element);
return bag;

View file

@ -5,7 +5,7 @@ import java.util.function.Predicate;
import dev.peerat.parser.java.Import;
import dev.peerat.parser.visitor.VisitorBag;
public class JavaImportVisitor extends JavaVisitor<Import>{
public class JavaImportVisitor extends JavaVisitor<Import, JavaImportVisitor>{
//TODO CONCAT PREDICATE

View file

@ -3,7 +3,7 @@ package dev.peerat.parser.java.visitor;
import dev.peerat.parser.java.Interface;
import dev.peerat.parser.visitor.VisitorBag;
public class JavaInterfaceVisitor extends JavaVisitor<Interface>{
public class JavaInterfaceVisitor extends JavaVisitor<Interface, JavaInterfaceVisitor>{
public JavaInterfaceVisitor(boolean propagate){
super(Interface.class, propagate);

View file

@ -5,7 +5,7 @@ import java.util.function.Predicate;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.visitor.Visitor;
public abstract class JavaModifiableVisitor<E extends JavaElement, V> extends JavaVisitor<E>{
public abstract class JavaModifiableVisitor<E extends JavaElement, V> extends JavaVisitor<E, V>{
protected Predicate<Integer> modifierFilter;
protected Visitor<JavaElement> annotationVisitor; //TODO possibility to combine visitor too

View file

@ -14,44 +14,14 @@ import dev.peerat.parser.java.visitor.value.JavaStaticValueVisitor;
import dev.peerat.parser.java.visitor.value.JavaTriValueVisitor;
import dev.peerat.parser.java.visitor.value.JavaValueVisitor;
import dev.peerat.parser.java.visitor.value.JavaVariableAccessValueVisitor;
import dev.peerat.parser.visitor.TokenVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
public abstract class JavaVisitor<T extends JavaElement> extends Visitor<JavaElement>{
//TODO current system don't do litteraly ALL, juste DIRECT SUB ELEMENT
public static <T extends JavaElement> JavaVisitor<T> base(Visitor<T> visitor){
return new JavaVisitor<T>(null,true){
@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);
}
};
}
private static JavaVisitor<JavaElement> javaElement(boolean propagate){
return new JavaVisitor<JavaElement>(JavaElement.class, propagate){
public abstract class JavaVisitor<T extends JavaElement, V> extends Visitor<JavaElement>{
@Override
public VisitorBag visitElement(JavaElement element){
VisitorBag bag = new VisitorBag();
bag.compute(element);
return bag;
}
};
}
public static JavaVisitor<JavaElement> allJavaElement(){
return javaElement(true);
public static JavaElementVisitor allJavaElement(){
return new JavaElementVisitor(true);
}
public static JavaFileVisitor allFile(){
@ -153,8 +123,8 @@ public abstract class JavaVisitor<T extends JavaElement> extends Visitor<JavaEle
public static JavaVisitor<JavaElement> javaElement(){
return javaElement(false);
public static JavaElementVisitor javaElement(){
return new JavaElementVisitor(false);
}
public static JavaFileVisitor file(){
@ -251,6 +221,7 @@ public abstract class JavaVisitor<T extends JavaElement> extends Visitor<JavaEle
private Class<?> type;
private boolean propagate;
protected TokenVisitor tokenVisitor;
public JavaVisitor(Class<?> type, boolean propagate){
this.type = type;
@ -268,10 +239,25 @@ public abstract class JavaVisitor<T extends JavaElement> extends Visitor<JavaEle
return this.propagate;
}
public V token(TokenVisitor visitor){
this.tokenVisitor = visitor;
return (V) this;
}
@Override
public VisitorBag visit(JavaElement element){
return visitElement((T) element);
}
public abstract VisitorBag visitElement(T element);
protected boolean visitToken(VisitorBag bag, JavaElement element){
if(this.tokenVisitor == null) return true;
VisitorBag result = element.visit(this.tokenVisitor);
if(result.isValidated()){
bag.merge(result);
return true;
}
return false;
}
}

View file

@ -4,7 +4,7 @@ import dev.peerat.parser.java.operation.Operation;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.VisitorBag;
public class JavaOperationVisitor extends JavaVisitor<Operation>{
public class JavaOperationVisitor extends JavaVisitor<Operation, JavaOperationVisitor>{
public JavaOperationVisitor(boolean propagate){
super(Operation.class, propagate);

View file

@ -7,7 +7,7 @@ import dev.peerat.parser.visitor.Operator;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
public class JavaArrayAccessValueVisitor extends JavaVisitor<ArrayAccessValue>{
public class JavaArrayAccessValueVisitor extends JavaVisitor<ArrayAccessValue, JavaArrayAccessValueVisitor>{
private Visitor<Value> basePredicate;
private Visitor<Value> accessPredicate;

View file

@ -4,7 +4,7 @@ import dev.peerat.parser.java.value.ArrayValue;
import dev.peerat.parser.visitor.VisitorBag;
import dev.peerat.parser.java.visitor.JavaVisitor;
public class JavaArrayValueVisitor extends JavaVisitor<ArrayValue> {
public class JavaArrayValueVisitor extends JavaVisitor<ArrayValue, JavaArrayValueVisitor> {
public JavaArrayValueVisitor(boolean propagate){
super(ArrayValue.class, propagate);

View file

@ -9,7 +9,7 @@ import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
public class JavaBiValueVisitor extends JavaVisitor<BiValue> {
public class JavaBiValueVisitor extends JavaVisitor<BiValue, JavaBiValueVisitor> {
private Visitor<Value> leftPredicate;
private Predicate<String> actionPredicate;

View file

@ -7,7 +7,7 @@ import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.java.value.Value;
import java.util.function.Predicate;
public class JavaCastValueVisitor extends JavaVisitor<CastValue> {
public class JavaCastValueVisitor extends JavaVisitor<CastValue, JavaCastValueVisitor> {
private Predicate<String> typePredicate;
private Visitor<Value> valuePredicate;

View file

@ -6,7 +6,7 @@ import dev.peerat.parser.java.value.InstanceValue;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.VisitorBag;
public class JavaInstanceValueVisitor extends JavaVisitor<InstanceValue> {
public class JavaInstanceValueVisitor extends JavaVisitor<InstanceValue, JavaInstanceValueVisitor> {
private Predicate<String> namePredicate;

View file

@ -2,7 +2,7 @@ package dev.peerat.parser.java.visitor.value;
import dev.peerat.parser.java.value.LambdaValue;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.VisitorBag;
public class JavaLambdaValueVisitor extends JavaVisitor<LambdaValue>{
public class JavaLambdaValueVisitor extends JavaVisitor<LambdaValue, JavaLambdaValueVisitor>{
public JavaLambdaValueVisitor(boolean propagate){
super(LambdaValue.class, propagate);

View file

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

View file

@ -7,7 +7,7 @@ import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.java.value.Value;
import java.util.function.Predicate;
public class JavaModifierValueVisitor extends JavaVisitor<ModifierValue> {
public class JavaModifierValueVisitor extends JavaVisitor<ModifierValue, JavaModifierValueVisitor> {
private Predicate<String> modifierPredicate;
private Visitor<Value> valuePredicate;

View file

@ -6,7 +6,7 @@ import dev.peerat.parser.java.value.StaticValue;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.VisitorBag;
public class JavaStaticValueVisitor extends JavaVisitor<StaticValue> {
public class JavaStaticValueVisitor extends JavaVisitor<StaticValue, JavaStaticValueVisitor> {
private Predicate<String> tokenPredicate;
public JavaStaticValueVisitor(boolean propagate) {

View file

@ -6,7 +6,7 @@ import dev.peerat.parser.visitor.VisitorBag;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.java.value.Value;
public class JavaTriValueVisitor extends JavaVisitor<TriValue> {
public class JavaTriValueVisitor extends JavaVisitor<TriValue, JavaTriValueVisitor> {
private Visitor<Value> checkPredicate;
private Visitor<Value> successPredicate;
private Visitor<Value> failPredicate;

View file

@ -4,7 +4,7 @@ import dev.peerat.parser.java.value.Value;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.VisitorBag;
public class JavaValueVisitor extends JavaVisitor<Value>{
public class JavaValueVisitor extends JavaVisitor<Value, JavaValueVisitor>{
public JavaValueVisitor(boolean propagate){
super(Value.class, propagate);
@ -12,6 +12,8 @@ public class JavaValueVisitor extends JavaVisitor<Value>{
@Override
public VisitorBag visitElement(Value element){
return null;
VisitorBag bag = new VisitorBag();
bag.compute(element);
return bag;
}
}

View file

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

View file

@ -1,16 +1,13 @@
package dev.peerat.parser.visitor;
import static dev.peerat.parser.java.visitor.JavaVisitor.*;
import static dev.peerat.parser.visitor.Operator.*;
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 static dev.peerat.parser.visitor.Visitor.token;
import java.util.List;
import java.util.Map;
import dev.peerat.parser.java.Import;
import dev.peerat.parser.java.JavaFile;
import dev.peerat.parser.java.JavaParser;
import dev.peerat.parser.java.JavaProject;
import dev.peerat.parser.java.Class;
public class Example {
@ -18,15 +15,18 @@ public class Example {
JavaParser parser = new JavaParser();
JavaFile container = new JavaFile();
parser.parse("package dev.peerat.test; import a; import b; public class C{} public class D{}",
parser.parse("package dev.peerat.test; import a; import b; public class C{ public class D{ public void test(){} } } public class E{}",
container);
JavaProject project = new JavaProject();
project.addFile(container);
System.out.println(project.visit(
allFile().clazz(key(allClass())).imp(value(allImport()))
).toList());
project.visit(
collect(allClass())
).<dev.peerat.parser.java.Class>toList().stream().map((c) -> c.getName().getValue()).forEach(System.out::println);
System.out.println(container.visit(collect(allJavaElement().token(token().validate((token) -> token.getValue().equals("test"))))).toList());
// Map<Class, List<Import>> map = project.visit(
// and(

View file

@ -7,6 +7,7 @@ import dev.peerat.parser.TokenType;
public class TokenVisitor extends Visitor<Token>{
private Predicate<Token> token;
private Predicate<String> name;
private Predicate<TokenType> type;
private Predicate<Integer> line;
@ -47,11 +48,17 @@ public class TokenVisitor extends Visitor<Token>{
this.character = predicate;
return this;
}
public TokenVisitor validate(Predicate<Token> predicate){
this.token = predicate;
return this;
}
@Override
public VisitorBag visit(Token element){
VisitorBag bag = new VisitorBag();
if(this.token != null && !this.token.test(element)) return bag;
if(this.name != null && !this.name.test(element.getValue())) return bag;
if(this.type != null && !this.type.test(element.getType())) return bag;
if(this.line != null && !this.line.test(element.getLineNumber())) return bag;

View file

@ -2,15 +2,13 @@ package dev.peerat.parser.visitor;
import java.util.Collection;
import dev.peerat.parser.Token;
public abstract class Visitor<T>{
public static Visitor<Token> allToken(){
public static TokenVisitor allToken(){
return new TokenVisitor(true);
}
public static Visitor<Token> token(){
public static TokenVisitor token(){
return new TokenVisitor(false);
}

View file

@ -18,13 +18,18 @@ public class VisitorBag{
this.collect = new ArrayList<>(0);
}
@Override
public String toString(){
return "[VisitorBag computed:"+computed+", collect:"+collect+"]";
}
public void compute(Object element){
this.computed = element;
}
public void merge(VisitorBag bag){
this.collect.addAll(bag.collect);
if((!this.collect.isEmpty()) && this.computed == null) this.computed = VALIDATED_BAG;
if(this.computed == null && bag.isValidated()) this.computed = VALIDATED_BAG;
}
public Object computed(){

View file

@ -3,8 +3,8 @@ package dev.peerat.parser.java;
import static org.junit.Assert.assertNull;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.List;
import java.util.function.Function;
import java.util.Collection;
import java.util.function.Predicate;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
@ -12,6 +12,7 @@ import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle;
import dev.peerat.parser.Parser;
import dev.peerat.parser.SyntaxMissMatchException;
import dev.peerat.parser.java.tree.JavaTreeType;
import dev.peerat.parser.java.value.ArrayAccessValue;
import dev.peerat.parser.java.value.ArrayValue;
@ -26,7 +27,6 @@ import dev.peerat.parser.java.value.TriValue;
import dev.peerat.parser.java.value.Value;
import dev.peerat.parser.java.value.Value.ValueContainer;
import dev.peerat.parser.java.value.VariableAccessValue;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.Visitor;
import dev.peerat.parser.visitor.VisitorBag;
@ -46,7 +46,7 @@ public class ValueTypesTests {
return container.getValue();
}
private static class Container extends JavaElement implements ValueContainer{
private static class Container implements JavaElement, ValueContainer{
private Value value;
@ -60,10 +60,13 @@ public class ValueTypesTests {
}
@Override
public <E extends JavaElement> E find(Function<JavaElement, Boolean> finder){return null;}
public <E extends JavaElement> E find(Predicate<JavaElement> finder) {
return null;
}
@Override
public <E extends JavaElement> void findAll(Function<JavaElement, Boolean> finder, List<E> list){}
public <E extends JavaElement> void findAll(Predicate<JavaElement> finder, Collection<E> collector) {
}
@Override
public VisitorBag visit(Visitor<JavaElement> visitor){return null;}
@ -366,4 +369,23 @@ public class ValueTypesTests {
dev.peerat.parser.java.Function func = assertInstance(v.getElements().get(0), dev.peerat.parser.java.Function.class);
assertEquals(1, func.getAnnotations().size());
}
@Test
public void onRandomTest() throws Exception{
try{
System.out.println(parse("def_anno_base.then((validator) -> validator.validate((token) -> token.getValue().equals(\"{\")))\r\n"
+ " .<JavaElement>end((parent, bag) -> {\r\n"
+ " AnnotationClass current = new AnnotationClass((((AnnotableBuffer) parent).getAnnotationBuffer()),\r\n"
+ " bag.get(\"modifier\") == null ? 0 : bag.get(\"modifier\"),\r\n"
+ " bag.get(\"name\"));\r\n"
+ " if (parent instanceof ClassContainer)\r\n"
+ " ((ClassContainer) parent).addClass(current);\r\n"
+ " return current;\r\n"
+ " }).multiple(clazz_container)\r\n"
+ " .unique((validator) -> validator.validate((token) -> token.getValue().equals(\"}\"))).end((a, b) -> a)"));
}catch(SyntaxMissMatchException e){
System.out.println(e.locateEndOfParsing());
throw e;
}
}
}