From 7ffd5c2d204c76a9ecb58401c103fc2f7da595b4 Mon Sep 17 00:00:00 2001 From: jeffcheasey88 Date: Thu, 8 May 2025 21:11:58 +0200 Subject: [PATCH] Push -> My PC just died, RIP my computer 2021 - 2025 --- src/dev/peerat/parser/Parser.java | 22 ++--- .../parser/SyntaxMissMatchException.java | 17 ++++ src/dev/peerat/parser/TokenValidator.java | 19 ++-- src/dev/peerat/parser/java/Class.java | 1 - src/dev/peerat/parser/java/JavaProject.java | 44 +++++++++ .../parser/java/visitor/JavaClassVisitor.java | 90 +++--------------- .../java/visitor/JavaModifiableVisitor.java | 93 +++++++++++++++++++ .../peerat/parser/state/BinaryStateTree.java | 7 +- .../peerat/parser/state/BuilderStateTree.java | 13 +-- .../peerat/parser/state/InitialStateTree.java | 2 +- src/dev/peerat/parser/state/StateTree.java | 20 ++-- src/dev/peerat/parser/visitor/Example.java | 9 +- src/dev/peerat/parser/visitor/Operator.java | 24 ++++- .../peerat/parser/visitor/TokenVisitor.java | 58 ++++++++++++ src/dev/peerat/parser/visitor/VisitorBag.java | 74 ++++++++++++--- test/ForCase.java | 5 - test/SpecificCase.java | 4 +- test/dev/peerat/parser/java/TypeTests.java | 7 -- test/dev/peerat/parser/java/ValueTests.java | 7 -- .../dev/peerat/parser/java/VariableTests.java | 10 +- 20 files changed, 355 insertions(+), 171 deletions(-) create mode 100644 src/dev/peerat/parser/SyntaxMissMatchException.java create mode 100644 src/dev/peerat/parser/java/JavaProject.java create mode 100644 src/dev/peerat/parser/java/visitor/JavaModifiableVisitor.java create mode 100644 src/dev/peerat/parser/visitor/TokenVisitor.java diff --git a/src/dev/peerat/parser/Parser.java b/src/dev/peerat/parser/Parser.java index 339b597..b687b66 100644 --- a/src/dev/peerat/parser/Parser.java +++ b/src/dev/peerat/parser/Parser.java @@ -20,27 +20,25 @@ public class Parser{ this.state = stateTree; } - public final void parse(BufferedReader reader, E container) throws Exception{ + public final TokenValidator parse(BufferedReader reader, E container) throws Exception{ this.tokenizer.reset(); this.tokenizer.parse(reader); - - this.state.seed(new TokenValidator(tokenizer.getTokens().toArray(new Token[0])), container); + TokenValidator validator = new TokenValidator(tokenizer.getTokens().toArray(new Token[0])); + this.state.seed(validator, container); + return validator; } - public final void parse(String line, E container) throws Exception{ + public final TokenValidator parse(String line, E container) throws Exception{ this.tokenizer.reset(); this.tokenizer.parse(line); - - this.state.seed(new TokenValidator(tokenizer.getTokens().toArray(new Token[0])), container); - } - - public final void parseStream(BufferedReader reader, E container) throws Exception{ - + TokenValidator validator = new TokenValidator(tokenizer.getTokens().toArray(new Token[0])); + this.state.seed(validator, container); + return validator; } //tmp - public void build(BufferedWriter writer) throws Exception{ - Token[] confirmed = new Token[TokenValidator.MAX_VALIDATE]; + public void build(BufferedWriter writer, TokenValidator validator) throws Exception{ + Token[] confirmed = new Token[validator.getTokenCount()]; System.arraycopy(tokenizer.getTokens().toArray(), 0, confirmed, 0, confirmed.length); int line = 1; int character = 1; diff --git a/src/dev/peerat/parser/SyntaxMissMatchException.java b/src/dev/peerat/parser/SyntaxMissMatchException.java new file mode 100644 index 0000000..c95b910 --- /dev/null +++ b/src/dev/peerat/parser/SyntaxMissMatchException.java @@ -0,0 +1,17 @@ +package dev.peerat.parser; + +public class SyntaxMissMatchException extends Exception{ + + private static final long serialVersionUID = -635419322226790786L; + + private TokenValidator validator; + + public SyntaxMissMatchException(TokenValidator validator){ + this.validator = validator; + } + + @Override + public String getMessage(){ + return "Only "+validator.getValidatedTokenCount()+" out "+validator.getTokenCount()+" of tokens parsed !"; + } +} diff --git a/src/dev/peerat/parser/TokenValidator.java b/src/dev/peerat/parser/TokenValidator.java index c770aaf..073a456 100644 --- a/src/dev/peerat/parser/TokenValidator.java +++ b/src/dev/peerat/parser/TokenValidator.java @@ -5,11 +5,7 @@ import java.util.function.Function; public class TokenValidator{ - public static int MAX_VALIDATE = 0; - public static int TOKENS = 0; - private Token[] elements; - private int index; private int validated; private Bag bag; @@ -23,6 +19,14 @@ public class TokenValidator{ this.bag = new Bag(); } + public int getTokenCount(){ + return this.elements.length; + } + + public int getValidatedTokenCount(){ + return this.validated; + } + public boolean hasNext(){ return validated < elements.length; } @@ -30,12 +34,7 @@ public class TokenValidator{ public boolean validate(Function action){ if(validated >= this.elements.length) return false; if(action.apply(this.elements[validated])){ - if(validated+1 > MAX_VALIDATE){ - MAX_VALIDATE = validated+1; - TOKENS = elements.length; - } this.validated++; - return true; } return false; @@ -52,13 +51,11 @@ public class TokenValidator{ public TokenValidator branch(){ TokenValidator branch = new TokenValidator(bag); branch.elements = this.elements; - branch.index = Math.max(0, this.validated-1); branch.validated = this.validated; return branch; } public void merge(TokenValidator branch){ - this.index = branch.index; this.validated = branch.validated; this.bag = branch.bag; } diff --git a/src/dev/peerat/parser/java/Class.java b/src/dev/peerat/parser/java/Class.java index 3e3b4fa..9dd64d1 100644 --- a/src/dev/peerat/parser/java/Class.java +++ b/src/dev/peerat/parser/java/Class.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.List; import dev.peerat.parser.Token; -import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; diff --git a/src/dev/peerat/parser/java/JavaProject.java b/src/dev/peerat/parser/java/JavaProject.java new file mode 100644 index 0000000..1b34dfc --- /dev/null +++ b/src/dev/peerat/parser/java/JavaProject.java @@ -0,0 +1,44 @@ +package dev.peerat.parser.java; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; + +import dev.peerat.parser.visitor.Visitor; +import dev.peerat.parser.visitor.VisitorBag; + +public class JavaProject extends JavaElement{ + + private List files; + + public JavaProject(){ + this.files = new ArrayList<>(); + } + + public void addFile(JavaFile file){ + this.files.add(file); + } + + public List getFiles(){ + return this.files; + } + + @Override + public E find(Function finder) { + return null; + } + + @Override + public void findAll(Function finder, List list) { + + } + + @Override + public VisitorBag visit(Visitor visitor){ + VisitorBag bag = new VisitorBag(); + for(JavaFile file : this.files) bag.merge(file.visit(visitor)); + return bag; + } + + +} diff --git a/src/dev/peerat/parser/java/visitor/JavaClassVisitor.java b/src/dev/peerat/parser/java/visitor/JavaClassVisitor.java index 9db8f58..b7c037a 100644 --- a/src/dev/peerat/parser/java/visitor/JavaClassVisitor.java +++ b/src/dev/peerat/parser/java/visitor/JavaClassVisitor.java @@ -2,15 +2,15 @@ package dev.peerat.parser.java.visitor; import java.util.function.Predicate; +import dev.peerat.parser.java.Annotation; import dev.peerat.parser.java.Class; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; -public class JavaClassVisitor extends JavaVisitor{ +public class JavaClassVisitor extends JavaModifiableVisitor{ private Predicate nameFilter; - private Predicate modifierFilter; private Visitor elementVisitor; public JavaClassVisitor(boolean propagate){ @@ -22,78 +22,6 @@ public class JavaClassVisitor extends JavaVisitor{ return this; } - public JavaClassVisitor isPublic(){ - Predicate validator = (mod) -> (mod & 0x1) != 0; - this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); - return this; - } - - public JavaClassVisitor isPrivate(){ - Predicate validator = (mod) -> (mod & 0x2) != 0; - this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); - return this; - } - - public JavaClassVisitor isProtected(){ - Predicate validator = (mod) -> (mod & 0x4) != 0; - this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); - return this; - } - - public JavaClassVisitor isStatic(){ - Predicate validator = (mod) -> (mod & 0x8) != 0; - this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); - return this; - } - - public JavaClassVisitor isFinal(){ - Predicate validator = (mod) -> (mod & 0x10) != 0; - this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); - return this; - } - - public JavaClassVisitor isSynchronized(){ - Predicate validator = (mod) -> (mod & 0x20) != 0; - this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); - return this; - } - - public JavaClassVisitor isVolatile(){ - Predicate validator = (mod) -> (mod & 0x40) != 0; - this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); - return this; - } - - public JavaClassVisitor isTransient(){ - Predicate validator = (mod) -> (mod & 0x80) != 0; - this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); - return this; - } - - public JavaClassVisitor isNative(){ - Predicate validator = (mod) -> (mod & 0x100) != 0; - this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); - return this; - } - - public JavaClassVisitor isAbstract(){ - Predicate validator = (mod) -> (mod & 0x400) != 0; - this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); - return this; - } - - public JavaClassVisitor isStrict(){ - Predicate validator = (mod) -> (mod & 0x800) != 0; - this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); - return this; - } - - public JavaClassVisitor isPackageLevel(){ - Predicate validator = (mod) -> (mod & 0x1) == 0 && (mod & 0x2) == 0 && (mod & 0x4) == 0; - this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); - return this; - } - public JavaClassVisitor elements(Visitor visitor){ this.elementVisitor = visitor; return this; @@ -111,8 +39,20 @@ public class JavaClassVisitor extends JavaVisitor{ if(!nameFilter.test(element.getName().getValue())) return bag; } + if(this.annotationVisitor != null){ + boolean validatedOne = false; + for(Annotation annotation : element.getAnnotations()){ + VisitorBag visited = annotation.visit(this.annotationVisitor); + if(visited.isValidated()){ + bag.merge(visited); + validatedOne = true; + } + } + if(!validatedOne) return bag; + } + if(this.modifierFilter != null){ - //check MOD + if(!this.modifierFilter.test(element.getModifier())) return bag; } if(this.elementVisitor != null){ diff --git a/src/dev/peerat/parser/java/visitor/JavaModifiableVisitor.java b/src/dev/peerat/parser/java/visitor/JavaModifiableVisitor.java new file mode 100644 index 0000000..1ed8849 --- /dev/null +++ b/src/dev/peerat/parser/java/visitor/JavaModifiableVisitor.java @@ -0,0 +1,93 @@ +package dev.peerat.parser.java.visitor; + +import java.util.function.Predicate; + +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.visitor.Visitor; + +public abstract class JavaModifiableVisitor extends JavaVisitor{ + + protected Predicate modifierFilter; + protected Visitor annotationVisitor; //TODO possibility to combine visitor too + + public JavaModifiableVisitor(Class type, boolean propagate){ + super(type, propagate); + } + + public V isPublic(){ + Predicate validator = (mod) -> (mod & 0x1) != 0; + this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); + return (V) this; + } + + public V isPrivate(){ + Predicate validator = (mod) -> (mod & 0x2) != 0; + this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); + return (V) this; + } + + public V isProtected(){ + Predicate validator = (mod) -> (mod & 0x4) != 0; + this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); + return (V) this; + } + + public V isStatic(){ + Predicate validator = (mod) -> (mod & 0x8) != 0; + this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); + return (V) this; + } + + public V isFinal(){ + Predicate validator = (mod) -> (mod & 0x10) != 0; + this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); + return (V) this; + } + + public V isSynchronized(){ + Predicate validator = (mod) -> (mod & 0x20) != 0; + this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); + return (V) this; + } + + public V isVolatile(){ + Predicate validator = (mod) -> (mod & 0x40) != 0; + this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); + return (V) this; + } + + public V isTransient(){ + Predicate validator = (mod) -> (mod & 0x80) != 0; + this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); + return (V) this; + } + + public V isNative(){ + Predicate validator = (mod) -> (mod & 0x100) != 0; + this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); + return (V) this; + } + + public V isAbstract(){ + Predicate validator = (mod) -> (mod & 0x400) != 0; + this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); + return (V) this; + } + + public V isStrict(){ + Predicate validator = (mod) -> (mod & 0x800) != 0; + this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); + return (V) this; + } + + public V isPackageLevel(){ + Predicate validator = (mod) -> (mod & 0x1) == 0 && (mod & 0x2) == 0 && (mod & 0x4) == 0; + this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator); + return (V) this; + } + + public V annotation(Visitor visitor){ + this.annotationVisitor = visitor; + return (V) this; + } +} diff --git a/src/dev/peerat/parser/state/BinaryStateTree.java b/src/dev/peerat/parser/state/BinaryStateTree.java index 6877a55..e86c812 100644 --- a/src/dev/peerat/parser/state/BinaryStateTree.java +++ b/src/dev/peerat/parser/state/BinaryStateTree.java @@ -1,17 +1,18 @@ package dev.peerat.parser.state; import java.util.function.Function; +import java.util.function.Predicate; import dev.peerat.parser.TokenValidator; public class BinaryStateTree extends StateTree{ - private Function condition; + private Predicate condition; private StateTree success; private StateTree fail; - public BinaryStateTree(Function checker){ + public BinaryStateTree(Predicate checker){ super(); this.condition = checker; @@ -19,7 +20,7 @@ public class BinaryStateTree extends StateTree{ @Override BuilderStateTree internalSeed(TokenValidator validator, E element){ - return ((this.condition.apply(validator)) ? success : fail).internalSeed(validator, element); + return ((this.condition.test(validator)) ? success : fail).internalSeed(validator, element); } public StateTree success(StateTree state){ diff --git a/src/dev/peerat/parser/state/BuilderStateTree.java b/src/dev/peerat/parser/state/BuilderStateTree.java index 688e26a..5206ee4 100644 --- a/src/dev/peerat/parser/state/BuilderStateTree.java +++ b/src/dev/peerat/parser/state/BuilderStateTree.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.function.BiFunction; import java.util.function.Function; +import java.util.function.Predicate; import dev.peerat.parser.Bag; import dev.peerat.parser.TokenValidator; @@ -40,7 +41,7 @@ public class BuilderStateTree extends StateTree{ builded.build(validator, build); } }else{ - while(state.checker.apply((branch = validator.branch()))){ + while(state.checker.test((branch = validator.branch()))){ builded = state.internalSeed(branch, build); if(builded == null) break; validator.merge(branch); @@ -57,7 +58,7 @@ public class BuilderStateTree extends StateTree{ builded.build(validator, build); } }else{ - if(state.checker.apply(branch)){ + if(state.checker.test(branch)){ builded = state.internalSeed(branch, build); if(builded == null) break; validator.merge(branch); @@ -76,7 +77,7 @@ public class BuilderStateTree extends StateTree{ sub_builded.build(validator, element); break; } - if(child.checker.apply(branch)){ + if(child.checker.test(branch)){ sub_builded = child.internalSeed(branch, element); if(sub_builded == null) continue; validator.merge(branch); @@ -93,7 +94,7 @@ public class BuilderStateTree extends StateTree{ return child; } - public > StateTree thenNoChild(Function checker){ + public > StateTree thenNoChild(Predicate checker){ StateTree state = new StateTree<>(); state.checker = checker; this.childs.add(state); @@ -105,7 +106,7 @@ public class BuilderStateTree extends StateTree{ return this; } - public > BuilderStateTree multiple(Function checker){ + public > BuilderStateTree multiple(Predicate checker){ StateTree state = new StateTree<>(); state.checker = checker; return multiple(state); @@ -116,7 +117,7 @@ public class BuilderStateTree extends StateTree{ return this; } - public > StateTree unique(Function checker){ + public > StateTree unique(Predicate checker){ StateTree state = new StateTree<>(); state.checker = checker; unique(state); diff --git a/src/dev/peerat/parser/state/InitialStateTree.java b/src/dev/peerat/parser/state/InitialStateTree.java index 1c21a48..4c96976 100644 --- a/src/dev/peerat/parser/state/InitialStateTree.java +++ b/src/dev/peerat/parser/state/InitialStateTree.java @@ -26,7 +26,7 @@ public class InitialStateTree extends StateTree{ builded.build(validator, element); } }else{ - while(state.checker.apply((branch = validator.branch()))){ + while(state.checker.test((branch = validator.branch()))){ builded = state.internalSeed(branch, element); if(builded == null) break; validator.merge(branch); diff --git a/src/dev/peerat/parser/state/StateTree.java b/src/dev/peerat/parser/state/StateTree.java index dce2886..72482b3 100644 --- a/src/dev/peerat/parser/state/StateTree.java +++ b/src/dev/peerat/parser/state/StateTree.java @@ -4,9 +4,10 @@ import java.util.ArrayList; import java.util.List; import java.util.function.BiConsumer; import java.util.function.BiFunction; -import java.util.function.Function; +import java.util.function.Predicate; import dev.peerat.parser.Bag; +import dev.peerat.parser.SyntaxMissMatchException; import dev.peerat.parser.Token; import dev.peerat.parser.TokenValidator; @@ -14,7 +15,7 @@ public class StateTree{ private List> childs; - Function checker; + protected Predicate checker; private BuilderStateTree builder; //TODO checker in constructeur ? @@ -22,12 +23,11 @@ public class StateTree{ this.childs = new ArrayList<>(); } - public void seed(TokenValidator validator, E container){ - while(validator.hasNext()){ - BuilderStateTree build = internalSeed(validator, container); - if(build == null) break; - build.build(validator, container); - } + public void seed(TokenValidator validator, E container) throws SyntaxMissMatchException{ + BuilderStateTree build = internalSeed(validator, container); + if(build == null) throw new SyntaxMissMatchException(validator); + build.build(validator, container); + if(validator.hasNext()) throw new SyntaxMissMatchException(validator); } BuilderStateTree internalSeed(TokenValidator validator, E element){ @@ -41,7 +41,7 @@ public class StateTree{ } continue; } - if(child.checker.apply(branch)){ + if(child.checker.test(branch)){ BuilderStateTree builded = child.internalSeed(branch, element); if(builded != null){ validator.merge(branch); @@ -58,7 +58,7 @@ public class StateTree{ return child; } - public > StateTree then(Function checker){ + public > StateTree then(Predicate checker){ StateTree state = new StateTree<>(); state.checker = checker; this.childs.add(state); diff --git a/src/dev/peerat/parser/visitor/Example.java b/src/dev/peerat/parser/visitor/Example.java index 8a495f8..24562df 100644 --- a/src/dev/peerat/parser/visitor/Example.java +++ b/src/dev/peerat/parser/visitor/Example.java @@ -12,15 +12,16 @@ public class Example { JavaParser parser = new JavaParser(); JavaFile container = new JavaFile(); - parser.parse("package dev.peerat.test; public class Example{ private int i = j; public void helloTest(){ System.out.println(\"hello\"); } }", container); + parser.parse("package dev.peerat.test; public class Example{ private int i = j, j; public void helloTest(){ System.out.println(\"hello\"); } }", container); VisitorBag result = container.visit( - allClass() + key(allClass() .isPublic() .elements( - collect(variable()) + value(allVariable() + ) ) - ); + )); System.out.println("allJavaElement in class : "+result.toList()); } diff --git a/src/dev/peerat/parser/visitor/Operator.java b/src/dev/peerat/parser/visitor/Operator.java index 9f54e86..15d3ca9 100644 --- a/src/dev/peerat/parser/visitor/Operator.java +++ b/src/dev/peerat/parser/visitor/Operator.java @@ -99,12 +99,28 @@ public class Operator{ }; } - public static > T key(Visitor visitor){ - return null; + public static Visitor key(Visitor visitor){ + return new Visitor(){ + @Override + public VisitorBag visit(E element){ + return visitor.visit(element).pair(element); + } + + @Override + public boolean canVisit(Class type){ +// System.out.println("collect can visit ? "+type); + return visitor.canVisit(type); + } + + @Override + public boolean canPropagate(){ + return visitor.canPropagate(); + } + }; } - public static > T value(Visitor visitor){ - return null; + public static Visitor value(Visitor visitor){ + return collect(visitor); } public static Visitor collect(Visitor visitor){ diff --git a/src/dev/peerat/parser/visitor/TokenVisitor.java b/src/dev/peerat/parser/visitor/TokenVisitor.java new file mode 100644 index 0000000..3837e71 --- /dev/null +++ b/src/dev/peerat/parser/visitor/TokenVisitor.java @@ -0,0 +1,58 @@ +package dev.peerat.parser.visitor; + +import java.util.function.Predicate; + +import dev.peerat.parser.Token; +import dev.peerat.parser.TokenType; + +public class TokenVisitor extends Visitor{ + + private Predicate name; + private Predicate type; + private Predicate line; + private Predicate character; + + @Override + public boolean canVisit(Class type){ + return type.isAssignableFrom(Token.class); + } + + @Override + public boolean canPropagate(){ + return false; + } + + public TokenVisitor named(Predicate predicate){ + this.name = predicate; + return this; + } + + public TokenVisitor type(Predicate predicate){ + this.type = predicate; + return this; + } + + public TokenVisitor line(Predicate predicate){ + this.line = predicate; + return this; + } + + public TokenVisitor character(Predicate predicate){ + this.character = predicate; + return this; + } + + @Override + public VisitorBag visit(Token element){ + VisitorBag bag = new VisitorBag(); + + 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; + if(this.character != null && !this.character.test(element.getCharacterNumber())) return bag; + + bag.compute(element); + return bag; + } + +} diff --git a/src/dev/peerat/parser/visitor/VisitorBag.java b/src/dev/peerat/parser/visitor/VisitorBag.java index ab77bcc..3690010 100644 --- a/src/dev/peerat/parser/visitor/VisitorBag.java +++ b/src/dev/peerat/parser/visitor/VisitorBag.java @@ -1,47 +1,50 @@ package dev.peerat.parser.visitor; import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; //only one pass in parameter or visit ? public class VisitorBag{ - private static Object VALIDATE_BAG = new Object(); + private static final Object VALIDATE_BAG = new Object(); private List collect; - private List list; + private Object computed; public VisitorBag(){ this.collect = new ArrayList<>(); - this.list = new ArrayList<>(); } - + public void compute(Object element){ -// System.out.println("compute("+collect+", "+list+") "+element+" <- "+Thread.currentThread().getStackTrace()[2]); - this.list.add(element); + this.computed = element; + } + + VisitorBag pair(Object key){ + this.collect = Arrays.asList(new Pair<>(key, collect)); + return this; } public void merge(VisitorBag bag){ -// System.out.println("merge("+collect+", "+list+") <- "+Thread.currentThread().getStackTrace()[2]); this.collect.addAll(bag.collect); - if(!this.collect.isEmpty()) list.add(VALIDATE_BAG); -// System.out.println("merged("+collect+", "+list+") <- "+Thread.currentThread().getStackTrace()[2]); + if(!this.collect.isEmpty()) this.computed = VALIDATE_BAG; } public boolean isValidated(){ - return !this.list.isEmpty(); - } - - public List computeList(){ - return this.list; + return this.VALIDATE_BAG != null; } VisitorBag collect(){ this.collect.addAll(this.list); -// System.out.println("collected("+collect+", "+list+") <- "+Thread.currentThread().getStackTrace()[2]); return this; } + public boolean hasElement(){ + return !this.collect.isEmpty(); + } + public T toElement(){ return (T) this.collect.get(0); } @@ -49,4 +52,45 @@ public class VisitorBag{ public List toList(){ return (List) this.collect; } + + public Map toMap(){ + Map map = new HashMap<>(); + for(Object obj : this.collect){ + Pair pair = (Pair)obj; + map.put(pair.getKey(), pair.getValue()); + } + return map; + } + + public Map> toMapValues(){ + Map> map = new HashMap<>(); + for(Object obj : this.collect){ + Pair pair = (Pair)obj; + map.put(pair.getKey(), pair.getValues()); + } + return map; + } + + public static class Pair{ + + private Object key; + private List values; + + public Pair(Object key, List values){ + this.key = key; + this.values = values; + } + + public K getKey(){ + return (K) this.key; + } + + public V getValue(){ + return (V) this.values.get(0); + } + + public List getValues(){ + return (List) this.values; + } + } } \ No newline at end of file diff --git a/test/ForCase.java b/test/ForCase.java index 76c856a..dc5f57e 100644 --- a/test/ForCase.java +++ b/test/ForCase.java @@ -57,12 +57,7 @@ public class ForCase { }; void testCase(String value) throws Exception{ - TokenValidator.TOKENS = 0; - TokenValidator.MAX_VALIDATE = 0; - parser.parse(value, null); - - assertEquals(TokenValidator.TOKENS, TokenValidator.MAX_VALIDATE); } @Test diff --git a/test/SpecificCase.java b/test/SpecificCase.java index 7ad5619..954a0af 100644 --- a/test/SpecificCase.java +++ b/test/SpecificCase.java @@ -32,8 +32,8 @@ public class SpecificCase{ return value; } }; - parser.parse(reader, new JavaFile()); - parser.build(new BufferedWriter(new FileWriter(new File("/home/ParserV2.txt")))); + TokenValidator validator = parser.parse(reader, new JavaFile()); + parser.build(new BufferedWriter(new FileWriter(new File("/home/ParserV2.txt"))), validator); } } diff --git a/test/dev/peerat/parser/java/TypeTests.java b/test/dev/peerat/parser/java/TypeTests.java index 98dc669..12a5aa4 100644 --- a/test/dev/peerat/parser/java/TypeTests.java +++ b/test/dev/peerat/parser/java/TypeTests.java @@ -90,15 +90,8 @@ public class TypeTests{ }; JavaElement testCase(String value) throws Exception{ - TokenValidator.TOKENS = 0; - TokenValidator.MAX_VALIDATE = 0; - JavaElement result = null; - parser.parse(value, result); - - assertEquals(TokenValidator.TOKENS, TokenValidator.MAX_VALIDATE); - return result; } diff --git a/test/dev/peerat/parser/java/ValueTests.java b/test/dev/peerat/parser/java/ValueTests.java index 76da61b..40f7fe5 100644 --- a/test/dev/peerat/parser/java/ValueTests.java +++ b/test/dev/peerat/parser/java/ValueTests.java @@ -253,15 +253,8 @@ public class ValueTests { }; JavaElement testCase(String value) throws Exception{ - TokenValidator.TOKENS = 0; - TokenValidator.MAX_VALIDATE = 0; - JavaElement result = null; - parser.parse(value, result); - - assertEquals(TokenValidator.TOKENS, TokenValidator.MAX_VALIDATE); - return result; } diff --git a/test/dev/peerat/parser/java/VariableTests.java b/test/dev/peerat/parser/java/VariableTests.java index 92e3c24..c4e8d08 100644 --- a/test/dev/peerat/parser/java/VariableTests.java +++ b/test/dev/peerat/parser/java/VariableTests.java @@ -16,6 +16,7 @@ import dev.peerat.parser.TokenType; import dev.peerat.parser.TokenValidator; import dev.peerat.parser.java.Annotation.AnnotableBuffer; import dev.peerat.parser.java.Variable.VariableContainer; +import dev.peerat.parser.java.builder.JavaBuilder; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.state.InitialStateTree; import dev.peerat.parser.state.RedirectStateTree; @@ -78,15 +79,8 @@ public class VariableTests{ }; JavaElement testCase(String value) throws Exception{ - TokenValidator.TOKENS = 0; - TokenValidator.MAX_VALIDATE = 0; - - JavaElement result = new Class(null, 0,new Token(0, 0, "Test", TokenType.NAME)); - + JavaElement result = JavaBuilder.ofClass("Test").build(); parser.parse(value, result); - - assertEquals(TokenValidator.TOKENS, TokenValidator.MAX_VALIDATE); - return result; }