TokenVisitor + ImportTree + refractor JavaTree into new class (was in JavaParser) + Value MethodCall -> generic call + TokenUpdater (V1)
This commit is contained in:
parent
fb96c287cf
commit
27b84dcacb
87 changed files with 779 additions and 192 deletions
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
84
src/dev/peerat/parser/TokenUpdater.java
Normal file
84
src/dev/peerat/parser/TokenUpdater.java
Normal 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,...
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -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) == '*')){
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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(){
|
||||
|
|
45
src/dev/peerat/parser/java/tree/ImportTree.java
Normal file
45
src/dev/peerat/parser/java/tree/ImportTree.java
Normal 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;
|
||||
});
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
47
src/dev/peerat/parser/java/tree/JavaTree.java
Normal file
47
src/dev/peerat/parser/java/tree/JavaTree.java
Normal 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));
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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(){
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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(){
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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(){
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
22
src/dev/peerat/parser/java/visitor/JavaElementVisitor.java
Normal file
22
src/dev/peerat/parser/java/visitor/JavaElementVisitor.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
|
|
|
@ -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){
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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(){
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue