From ce15d7e4351f9ec297e01cd6136b4de3ba87bf96 Mon Sep 17 00:00:00 2001 From: jeffcheasey88 <66554203+jeffcheasey88@users.noreply.github.com> Date: Sun, 27 Apr 2025 11:53:33 +0200 Subject: [PATCH] [Base] Printer + One Visitor per Value type (base) --- src/dev/peerat/parser/java/Annotation.java | 3 +- .../peerat/parser/java/AnnotationClass.java | 3 +- src/dev/peerat/parser/java/Class.java | 5 +- src/dev/peerat/parser/java/ClassBase.java | 3 +- src/dev/peerat/parser/java/Enumeration.java | 3 +- src/dev/peerat/parser/java/Function.java | 3 +- src/dev/peerat/parser/java/Import.java | 3 +- src/dev/peerat/parser/java/Interface.java | 3 +- src/dev/peerat/parser/java/JavaElement.java | 4 +- src/dev/peerat/parser/java/JavaFile.java | 3 +- src/dev/peerat/parser/java/Variable.java | 4 +- .../java/builder/JavaOperationBuilder.java | 3 +- .../parser/java/builder/JavaValueBuilder.java | 3 +- .../java/operation/AssignOperation.java | 3 +- .../parser/java/operation/BreakOperation.java | 3 +- .../parser/java/operation/CatchOperation.java | 4 +- .../java/operation/ContinueOperation.java | 3 +- .../parser/java/operation/DoOperation.java | 4 +- .../parser/java/operation/ElseOperation.java | 4 +- .../java/operation/FinallyOperation.java | 4 +- .../parser/java/operation/ForOperation.java | 3 +- .../java/operation/ForeachOperation.java | 3 +- .../parser/java/operation/IfOperation.java | 3 +- .../parser/java/operation/OperationBag.java | 3 +- .../java/operation/ReturnOperation.java | 3 +- .../java/operation/SwitchOperation.java | 3 +- .../java/operation/SynchronizedOperation.java | 3 +- .../parser/java/operation/ThrowOperation.java | 3 +- .../parser/java/operation/TryOperation.java | 3 +- .../parser/java/operation/WhileOperation.java | 3 +- .../java/printer/JavaAnnotationPrinter.java | 35 +++ .../parser/java/printer/JavaClassPrinter.java | 32 +++ .../parser/java/printer/JavaFilePrinter.java | 29 +++ .../java/printer/JavaFunctionPrinter.java | 56 +++++ .../java/printer/JavaImportPrinter.java | 15 ++ .../java/printer/JavaOperationPrinter.java | 25 +++ .../parser/java/printer/JavaPrinter.java | 105 +++++++++ .../parser/java/printer/JavaValuePrinter.java | 208 ++++++++++++++++++ .../java/printer/JavaVariablePrinter.java | 24 ++ .../peerat/parser/java/tree/ClassTree.java | 4 +- .../peerat/parser/java/tree/ValueTree.java | 1 + .../parser/java/value/ArrayAccessValue.java | 3 +- .../peerat/parser/java/value/ArrayValue.java | 3 +- src/dev/peerat/parser/java/value/BiValue.java | 3 +- .../peerat/parser/java/value/CastValue.java | 3 +- .../parser/java/value/InstanceValue.java | 3 +- .../peerat/parser/java/value/LambdaValue.java | 3 +- .../parser/java/value/MethodCallValue.java | 3 +- .../parser/java/value/ModifierValue.java | 3 +- .../peerat/parser/java/value/StaticValue.java | 3 +- .../peerat/parser/java/value/TriValue.java | 3 +- .../java/value/VariableAccessValue.java | 3 +- .../java/visitor/JavaImportVisitor.java | 36 ++- .../parser/java/visitor/JavaVisitor.java | 55 +++++ .../visitor/value/JavaArrayValueVisitor.java | 19 ++ .../visitor/value/JavaBiValueVisitor.java | 62 ++++++ .../visitor/value/JavaCastValueVisitor.java | 46 ++++ .../value/JavaInstanceValueVisitor.java | 33 +++ .../visitor/value/JavaLambdaValueVisitor.java | 17 ++ .../value/JavaMethodCallValueVisitor.java | 20 ++ .../value/JavaModifierValueVisitor.java | 46 ++++ .../visitor/value/JavaStaticValueVisitor.java | 32 +++ .../visitor/value/JavaTriValueVisitor.java | 61 +++++ .../java/visitor/value/JavaValueVisitor.java | 2 +- .../value/JavaVariableAccessValueVisitor.java | 18 ++ src/dev/peerat/parser/visitor/Operator.java | 2 + .../peerat/parser/java/ValueTypesTests.java | 3 +- 67 files changed, 1069 insertions(+), 48 deletions(-) create mode 100644 src/dev/peerat/parser/java/printer/JavaAnnotationPrinter.java create mode 100644 src/dev/peerat/parser/java/printer/JavaClassPrinter.java create mode 100644 src/dev/peerat/parser/java/printer/JavaFilePrinter.java create mode 100644 src/dev/peerat/parser/java/printer/JavaFunctionPrinter.java create mode 100644 src/dev/peerat/parser/java/printer/JavaImportPrinter.java create mode 100644 src/dev/peerat/parser/java/printer/JavaOperationPrinter.java create mode 100644 src/dev/peerat/parser/java/printer/JavaPrinter.java create mode 100644 src/dev/peerat/parser/java/printer/JavaValuePrinter.java create mode 100644 src/dev/peerat/parser/java/printer/JavaVariablePrinter.java create mode 100644 src/dev/peerat/parser/java/visitor/value/JavaArrayValueVisitor.java create mode 100644 src/dev/peerat/parser/java/visitor/value/JavaBiValueVisitor.java create mode 100644 src/dev/peerat/parser/java/visitor/value/JavaCastValueVisitor.java create mode 100644 src/dev/peerat/parser/java/visitor/value/JavaInstanceValueVisitor.java create mode 100644 src/dev/peerat/parser/java/visitor/value/JavaLambdaValueVisitor.java create mode 100644 src/dev/peerat/parser/java/visitor/value/JavaMethodCallValueVisitor.java create mode 100644 src/dev/peerat/parser/java/visitor/value/JavaModifierValueVisitor.java create mode 100644 src/dev/peerat/parser/java/visitor/value/JavaStaticValueVisitor.java create mode 100644 src/dev/peerat/parser/java/visitor/value/JavaTriValueVisitor.java create mode 100644 src/dev/peerat/parser/java/visitor/value/JavaVariableAccessValueVisitor.java diff --git a/src/dev/peerat/parser/java/Annotation.java b/src/dev/peerat/parser/java/Annotation.java index 335a35f..ed29e7d 100644 --- a/src/dev/peerat/parser/java/Annotation.java +++ b/src/dev/peerat/parser/java/Annotation.java @@ -8,6 +8,7 @@ import java.util.function.Function; import dev.peerat.parser.Token; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class Annotation extends JavaElement{ @@ -112,7 +113,7 @@ public class Annotation extends JavaElement{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); diff --git a/src/dev/peerat/parser/java/AnnotationClass.java b/src/dev/peerat/parser/java/AnnotationClass.java index 46b0672..5232688 100644 --- a/src/dev/peerat/parser/java/AnnotationClass.java +++ b/src/dev/peerat/parser/java/AnnotationClass.java @@ -5,6 +5,7 @@ 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; public class AnnotationClass extends ClassBase{ @@ -66,7 +67,7 @@ public class AnnotationClass extends ClassBase{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); diff --git a/src/dev/peerat/parser/java/Class.java b/src/dev/peerat/parser/java/Class.java index e4f33af..621f15e 100644 --- a/src/dev/peerat/parser/java/Class.java +++ b/src/dev/peerat/parser/java/Class.java @@ -5,6 +5,7 @@ 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; public class Class extends ClassBase{ @@ -77,13 +78,15 @@ public class Class extends ClassBase{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { + System.out.println("VISIT CLASS "+visitor); if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); bag.merge(super.visit(visitor)); for(JavaElement element : this.elements){ + System.out.println("VISIT CLASS "+visitor+" -> "+element); bag.merge(element.visit(visitor)); } diff --git a/src/dev/peerat/parser/java/ClassBase.java b/src/dev/peerat/parser/java/ClassBase.java index 7e13e7a..c92d3c7 100644 --- a/src/dev/peerat/parser/java/ClassBase.java +++ b/src/dev/peerat/parser/java/ClassBase.java @@ -9,6 +9,7 @@ import dev.peerat.parser.java.Annotation.AnnotableBuffer; import dev.peerat.parser.java.Function.FunctionContainer; import dev.peerat.parser.java.Variable.VariableContainer; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -47,7 +48,7 @@ public abstract class ClassBase extends Annotable implements AnnotableBuffer, Cl } @Override - public VisitorBag visit(JavaVisitor visitor){ + public VisitorBag visit(Visitor visitor){ if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); List annotations = getAnnotations(); diff --git a/src/dev/peerat/parser/java/Enumeration.java b/src/dev/peerat/parser/java/Enumeration.java index b11ba94..99bdb72 100644 --- a/src/dev/peerat/parser/java/Enumeration.java +++ b/src/dev/peerat/parser/java/Enumeration.java @@ -5,6 +5,7 @@ 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; public class Enumeration extends ClassBase{ @@ -71,7 +72,7 @@ public class Enumeration extends ClassBase{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); diff --git a/src/dev/peerat/parser/java/Function.java b/src/dev/peerat/parser/java/Function.java index 014584b..92fdae4 100644 --- a/src/dev/peerat/parser/java/Function.java +++ b/src/dev/peerat/parser/java/Function.java @@ -13,6 +13,7 @@ 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.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class Function extends Annotable implements VariableContainer, OperationContainer, ValueContainer{ @@ -134,7 +135,7 @@ public class Function extends Annotable implements VariableContainer, OperationC } @Override - public VisitorBag visit(JavaVisitor visitor){ + public VisitorBag visit(Visitor visitor){ if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); diff --git a/src/dev/peerat/parser/java/Import.java b/src/dev/peerat/parser/java/Import.java index d91f3d6..a4211a9 100644 --- a/src/dev/peerat/parser/java/Import.java +++ b/src/dev/peerat/parser/java/Import.java @@ -5,6 +5,7 @@ import java.util.function.Function; import dev.peerat.parser.Token; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class Import extends JavaElement{ @@ -36,7 +37,7 @@ public class Import extends JavaElement{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); return null; } diff --git a/src/dev/peerat/parser/java/Interface.java b/src/dev/peerat/parser/java/Interface.java index 2cc1617..379e3be 100644 --- a/src/dev/peerat/parser/java/Interface.java +++ b/src/dev/peerat/parser/java/Interface.java @@ -5,6 +5,7 @@ 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; public class Interface extends ClassBase{ @@ -71,7 +72,7 @@ public class Interface extends ClassBase{ } @Override - public VisitorBag visit(JavaVisitor visitor){ + public VisitorBag visit(Visitor visitor){ if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); diff --git a/src/dev/peerat/parser/java/JavaElement.java b/src/dev/peerat/parser/java/JavaElement.java index 0eca21e..e56bbb0 100644 --- a/src/dev/peerat/parser/java/JavaElement.java +++ b/src/dev/peerat/parser/java/JavaElement.java @@ -3,7 +3,7 @@ package dev.peerat.parser.java; import java.util.List; import java.util.function.Function; -import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public abstract class JavaElement{ @@ -12,5 +12,5 @@ public abstract class JavaElement{ public abstract void findAll(Function finder, List list); - public abstract VisitorBag visit(JavaVisitor visitor); + public abstract VisitorBag visit(Visitor visitor); } \ No newline at end of file diff --git a/src/dev/peerat/parser/java/JavaFile.java b/src/dev/peerat/parser/java/JavaFile.java index 79a544e..4643eca 100644 --- a/src/dev/peerat/parser/java/JavaFile.java +++ b/src/dev/peerat/parser/java/JavaFile.java @@ -7,6 +7,7 @@ import java.util.function.Function; import dev.peerat.parser.Token; import dev.peerat.parser.java.Annotation.AnnotableBuffer; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class JavaFile extends JavaElement implements ClassContainer, AnnotableBuffer{ @@ -85,7 +86,7 @@ public class JavaFile extends JavaElement implements ClassContainer, AnnotableBu } @Override - public VisitorBag visit(JavaVisitor visitor){ + public VisitorBag visit(Visitor visitor){ if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); diff --git a/src/dev/peerat/parser/java/Variable.java b/src/dev/peerat/parser/java/Variable.java index 1a01e59..a2e8e01 100644 --- a/src/dev/peerat/parser/java/Variable.java +++ b/src/dev/peerat/parser/java/Variable.java @@ -6,7 +6,7 @@ import java.util.function.Function; import dev.peerat.parser.Token; import dev.peerat.parser.java.Annotation.Annotable; import dev.peerat.parser.java.value.Value; -import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class Variable extends Annotable{ @@ -83,7 +83,7 @@ public class Variable extends Annotable{ } @Override - public VisitorBag visit(JavaVisitor visitor){ + public VisitorBag visit(Visitor visitor){ if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); diff --git a/src/dev/peerat/parser/java/builder/JavaOperationBuilder.java b/src/dev/peerat/parser/java/builder/JavaOperationBuilder.java index b21b7e3..27cc2f9 100644 --- a/src/dev/peerat/parser/java/builder/JavaOperationBuilder.java +++ b/src/dev/peerat/parser/java/builder/JavaOperationBuilder.java @@ -10,6 +10,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.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class JavaOperationBuilder extends JavaBuilder{ @@ -45,7 +46,7 @@ public class JavaOperationBuilder extends JavaBuilder{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { return null; } diff --git a/src/dev/peerat/parser/java/builder/JavaValueBuilder.java b/src/dev/peerat/parser/java/builder/JavaValueBuilder.java index e4e8289..82ac09f 100644 --- a/src/dev/peerat/parser/java/builder/JavaValueBuilder.java +++ b/src/dev/peerat/parser/java/builder/JavaValueBuilder.java @@ -24,6 +24,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.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class JavaValueBuilder extends JavaBuilder{ @@ -138,7 +139,7 @@ public class JavaValueBuilder extends JavaBuilder{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { return null; } diff --git a/src/dev/peerat/parser/java/operation/AssignOperation.java b/src/dev/peerat/parser/java/operation/AssignOperation.java index 2b83a90..19506cf 100644 --- a/src/dev/peerat/parser/java/operation/AssignOperation.java +++ b/src/dev/peerat/parser/java/operation/AssignOperation.java @@ -6,6 +6,7 @@ import java.util.function.Function; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class AssignOperation extends Operation{ @@ -40,7 +41,7 @@ public class AssignOperation extends Operation{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); bag.merge(left.visit(visitor)); diff --git a/src/dev/peerat/parser/java/operation/BreakOperation.java b/src/dev/peerat/parser/java/operation/BreakOperation.java index 8bc015c..82c889b 100644 --- a/src/dev/peerat/parser/java/operation/BreakOperation.java +++ b/src/dev/peerat/parser/java/operation/BreakOperation.java @@ -5,6 +5,7 @@ import java.util.function.Function; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class BreakOperation extends Operation{ @@ -20,7 +21,7 @@ public class BreakOperation extends Operation{ public void findAll(Function finder, List list){} @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); return null; } diff --git a/src/dev/peerat/parser/java/operation/CatchOperation.java b/src/dev/peerat/parser/java/operation/CatchOperation.java index 606a435..7d958c4 100644 --- a/src/dev/peerat/parser/java/operation/CatchOperation.java +++ b/src/dev/peerat/parser/java/operation/CatchOperation.java @@ -3,7 +3,9 @@ package dev.peerat.parser.java.operation; 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.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class CatchOperation extends OperationBag{ @@ -26,7 +28,7 @@ public class CatchOperation extends OperationBag{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); return super.visit(visitor); } diff --git a/src/dev/peerat/parser/java/operation/ContinueOperation.java b/src/dev/peerat/parser/java/operation/ContinueOperation.java index a9f9ec3..ba526d2 100644 --- a/src/dev/peerat/parser/java/operation/ContinueOperation.java +++ b/src/dev/peerat/parser/java/operation/ContinueOperation.java @@ -5,6 +5,7 @@ import java.util.function.Function; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class ContinueOperation extends Operation{ @@ -18,7 +19,7 @@ public class ContinueOperation extends Operation{ public void findAll(Function finder, List list){} @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); return null; } diff --git a/src/dev/peerat/parser/java/operation/DoOperation.java b/src/dev/peerat/parser/java/operation/DoOperation.java index a663365..a8a4997 100644 --- a/src/dev/peerat/parser/java/operation/DoOperation.java +++ b/src/dev/peerat/parser/java/operation/DoOperation.java @@ -1,12 +1,14 @@ package dev.peerat.parser.java.operation; +import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class DoOperation extends OperationBag{ @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); return super.visit(visitor); } diff --git a/src/dev/peerat/parser/java/operation/ElseOperation.java b/src/dev/peerat/parser/java/operation/ElseOperation.java index d200684..1cc6ab2 100644 --- a/src/dev/peerat/parser/java/operation/ElseOperation.java +++ b/src/dev/peerat/parser/java/operation/ElseOperation.java @@ -1,12 +1,14 @@ package dev.peerat.parser.java.operation; +import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class ElseOperation extends OperationBag{ @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); return super.visit(visitor); } diff --git a/src/dev/peerat/parser/java/operation/FinallyOperation.java b/src/dev/peerat/parser/java/operation/FinallyOperation.java index c0b39d4..44bb7ab 100644 --- a/src/dev/peerat/parser/java/operation/FinallyOperation.java +++ b/src/dev/peerat/parser/java/operation/FinallyOperation.java @@ -1,12 +1,14 @@ package dev.peerat.parser.java.operation; +import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class FinallyOperation extends OperationBag{ @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); return super.visit(visitor); } diff --git a/src/dev/peerat/parser/java/operation/ForOperation.java b/src/dev/peerat/parser/java/operation/ForOperation.java index 0153ab9..9a5b658 100644 --- a/src/dev/peerat/parser/java/operation/ForOperation.java +++ b/src/dev/peerat/parser/java/operation/ForOperation.java @@ -7,6 +7,7 @@ import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.Variable; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class ForOperation extends OperationBag{ @@ -90,7 +91,7 @@ public class ForOperation extends OperationBag{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); if(init_vars != null) diff --git a/src/dev/peerat/parser/java/operation/ForeachOperation.java b/src/dev/peerat/parser/java/operation/ForeachOperation.java index cafe545..b389e85 100644 --- a/src/dev/peerat/parser/java/operation/ForeachOperation.java +++ b/src/dev/peerat/parser/java/operation/ForeachOperation.java @@ -7,6 +7,7 @@ import dev.peerat.parser.Token; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class ForeachOperation extends OperationBag{ @@ -49,7 +50,7 @@ public class ForeachOperation extends OperationBag{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); bag.merge(this.iterator.visit(visitor)); diff --git a/src/dev/peerat/parser/java/operation/IfOperation.java b/src/dev/peerat/parser/java/operation/IfOperation.java index 9bb59e5..54c2eff 100644 --- a/src/dev/peerat/parser/java/operation/IfOperation.java +++ b/src/dev/peerat/parser/java/operation/IfOperation.java @@ -6,6 +6,7 @@ import java.util.function.Function; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class IfOperation extends OperationBag{ @@ -35,7 +36,7 @@ public class IfOperation extends OperationBag{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); bag.merge(condition.visit(visitor)); diff --git a/src/dev/peerat/parser/java/operation/OperationBag.java b/src/dev/peerat/parser/java/operation/OperationBag.java index 8cd9ba7..1e2187f 100644 --- a/src/dev/peerat/parser/java/operation/OperationBag.java +++ b/src/dev/peerat/parser/java/operation/OperationBag.java @@ -11,6 +11,7 @@ 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.Visitor; import dev.peerat.parser.visitor.VisitorBag; public abstract class OperationBag extends Operation implements VariableContainer, OperationContainer, ValueContainer{ @@ -61,7 +62,7 @@ public abstract class OperationBag extends Operation implements VariableContaine } @Override - public VisitorBag visit(JavaVisitor visitor){ + public VisitorBag visit(Visitor visitor){ VisitorBag bag = new VisitorBag(); for(JavaElement element : this.elements){ bag.merge(element.visit(visitor)); diff --git a/src/dev/peerat/parser/java/operation/ReturnOperation.java b/src/dev/peerat/parser/java/operation/ReturnOperation.java index 61d2292..d1515f8 100644 --- a/src/dev/peerat/parser/java/operation/ReturnOperation.java +++ b/src/dev/peerat/parser/java/operation/ReturnOperation.java @@ -6,6 +6,7 @@ import java.util.function.Function; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class ReturnOperation extends Operation{ @@ -34,7 +35,7 @@ public class ReturnOperation extends Operation{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); if(this.value != null) bag.merge(this.value.visit(visitor)); diff --git a/src/dev/peerat/parser/java/operation/SwitchOperation.java b/src/dev/peerat/parser/java/operation/SwitchOperation.java index 4833c1b..25d5e6f 100644 --- a/src/dev/peerat/parser/java/operation/SwitchOperation.java +++ b/src/dev/peerat/parser/java/operation/SwitchOperation.java @@ -5,6 +5,7 @@ import java.util.function.Function; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class SwitchOperation extends Operation{ @@ -20,7 +21,7 @@ public class SwitchOperation extends Operation{ public void findAll(Function finder, List list){} @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); return null; } diff --git a/src/dev/peerat/parser/java/operation/SynchronizedOperation.java b/src/dev/peerat/parser/java/operation/SynchronizedOperation.java index 1ac5293..78e5583 100644 --- a/src/dev/peerat/parser/java/operation/SynchronizedOperation.java +++ b/src/dev/peerat/parser/java/operation/SynchronizedOperation.java @@ -6,6 +6,7 @@ import java.util.function.Function; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class SynchronizedOperation extends OperationBag{ @@ -35,7 +36,7 @@ public class SynchronizedOperation extends OperationBag{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); bag.merge(this.value.visit(visitor)); diff --git a/src/dev/peerat/parser/java/operation/ThrowOperation.java b/src/dev/peerat/parser/java/operation/ThrowOperation.java index 3baf4b1..84eb7d7 100644 --- a/src/dev/peerat/parser/java/operation/ThrowOperation.java +++ b/src/dev/peerat/parser/java/operation/ThrowOperation.java @@ -6,6 +6,7 @@ import java.util.function.Function; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class ThrowOperation extends Operation{ @@ -32,7 +33,7 @@ public class ThrowOperation extends Operation{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); bag.merge(this.value.visit(visitor)); diff --git a/src/dev/peerat/parser/java/operation/TryOperation.java b/src/dev/peerat/parser/java/operation/TryOperation.java index d06c9bb..24842bd 100644 --- a/src/dev/peerat/parser/java/operation/TryOperation.java +++ b/src/dev/peerat/parser/java/operation/TryOperation.java @@ -6,6 +6,7 @@ import java.util.function.Function; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.Variable; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class TryOperation extends OperationBag{ @@ -40,7 +41,7 @@ public class TryOperation extends OperationBag{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); if(this.resource != null) bag.merge(this.resource.visit(visitor)); diff --git a/src/dev/peerat/parser/java/operation/WhileOperation.java b/src/dev/peerat/parser/java/operation/WhileOperation.java index 2389cd5..6d6ea8a 100644 --- a/src/dev/peerat/parser/java/operation/WhileOperation.java +++ b/src/dev/peerat/parser/java/operation/WhileOperation.java @@ -6,6 +6,7 @@ import java.util.function.Function; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class WhileOperation extends OperationBag{ @@ -34,7 +35,7 @@ public class WhileOperation extends OperationBag{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); bag.merge(this.condition.visit(visitor)); diff --git a/src/dev/peerat/parser/java/printer/JavaAnnotationPrinter.java b/src/dev/peerat/parser/java/printer/JavaAnnotationPrinter.java new file mode 100644 index 0000000..80342e3 --- /dev/null +++ b/src/dev/peerat/parser/java/printer/JavaAnnotationPrinter.java @@ -0,0 +1,35 @@ +package dev.peerat.parser.java.printer; + +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; + +import dev.peerat.parser.Token; +import dev.peerat.parser.java.Annotation; +import dev.peerat.parser.java.value.Value; + +public class JavaAnnotationPrinter extends JavaPrinter{ + + @Override + public void print(Annotation element, Writer writer, String buffer, JavaPrintProvider provider) throws Exception { + writer.write(buffer); + writer.write("@"); + writer.write(element.getName()); + Map map = element.getParameters(); + if(map != null && !map.isEmpty()){ + writer.write("("); + Iterator> iterator = map.entrySet().iterator(); + while(iterator.hasNext()){ + Entry entry = iterator.next(); + writer.write(entry.getKey()); + writer.write("="); + Value value = entry.getValue(); + provider.getPrinter(value).print(value, writer, buffer, provider); + if(iterator.hasNext()) writer.write(","); + } + writer.write(")"); + } + writer.write("\n"); + } + +} diff --git a/src/dev/peerat/parser/java/printer/JavaClassPrinter.java b/src/dev/peerat/parser/java/printer/JavaClassPrinter.java new file mode 100644 index 0000000..d6a947a --- /dev/null +++ b/src/dev/peerat/parser/java/printer/JavaClassPrinter.java @@ -0,0 +1,32 @@ +package dev.peerat.parser.java.printer; + +import java.lang.reflect.Modifier; + +import dev.peerat.parser.java.Class; +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.java.Variable; + +public class JavaClassPrinter extends JavaPrinter{ + + @Override + public void print(Class element, Writer writer, String buffer, JavaPrintProvider provider) throws Exception { + writer.write(buffer+Modifier.toString(element.getModifier())+" class "); + writer.write(element.getName()); + if(element.getExtension() != null){ + writer.write(" extends "); + writer.write(element.getExtension()); + } + if(element.getImplementations() != null){ + writer.write(" implements "); + writer.write(element.getImplementations()); + } + writer.write("{\n"); + for(JavaElement content : element.getElements()){ + provider.getPrinter(content).print(content, writer, buffer+"\t", provider); + if(content instanceof Variable) writer.write(";"); + writer.write("\n"); + } + writer.write("}\n"); + } + +} diff --git a/src/dev/peerat/parser/java/printer/JavaFilePrinter.java b/src/dev/peerat/parser/java/printer/JavaFilePrinter.java new file mode 100644 index 0000000..083dda7 --- /dev/null +++ b/src/dev/peerat/parser/java/printer/JavaFilePrinter.java @@ -0,0 +1,29 @@ +package dev.peerat.parser.java.printer; + +import dev.peerat.parser.java.ClassBase; +import dev.peerat.parser.java.Import; +import dev.peerat.parser.java.JavaFile; + +public class JavaFilePrinter extends JavaPrinter{ + + @Override + public void print(JavaFile element, Writer writer, String buffer, JavaPrintProvider provider) throws Exception { + if(element.getPackage() != null){ + writer.write("package "); + writer.write(element.getPackage()); + writer.write(";\n"); + } + for(Import imp : element.getImports()){ + provider.getPrinter(imp).print(imp, writer, buffer, provider); + writer.write("\n"); + } + + ClassBase clazz = element.getMainClass(); + provider.getPrinter(clazz).print(clazz, writer, buffer, provider); + + for(ClassBase classes : element.getSubClasses()){ + provider.getPrinter(classes).print(classes, writer, buffer, provider); + } + } + +} diff --git a/src/dev/peerat/parser/java/printer/JavaFunctionPrinter.java b/src/dev/peerat/parser/java/printer/JavaFunctionPrinter.java new file mode 100644 index 0000000..9390823 --- /dev/null +++ b/src/dev/peerat/parser/java/printer/JavaFunctionPrinter.java @@ -0,0 +1,56 @@ +package dev.peerat.parser.java.printer; + +import java.lang.reflect.Modifier; +import java.util.Iterator; + +import dev.peerat.parser.Token; +import dev.peerat.parser.java.Function; +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.java.Variable; +import dev.peerat.parser.java.value.Value; + +public class JavaFunctionPrinter extends JavaPrinter{ + + @Override + public void print(Function element, Writer writer, String buffer, JavaPrintProvider provider) throws Exception { + writer.write(buffer+Modifier.toString(element.getModifier())+" "); + if(element.getGeneric() != null){ + writer.write(element.getGeneric()); + writer.write(" "); + } + if(element.getReturnType() != null){ + writer.write(element.getReturnType()); + writer.write(" "); + } + writer.write(element.getName()); + writer.write("("); + if(element.getParameters() != null){ + Iterator parameters = element.getParameters().iterator(); + while(parameters.hasNext()){ + Variable parameter = parameters.next(); + provider.getPrinter(parameter).print(parameter, writer, "", provider); + if(parameters.hasNext()) writer.write(", "); + } + } + writer.write(")"); + if(element.getThrowables() != null){ + Iterator throwables = element.getThrowables().iterator(); + if(throwables.hasNext()){ + writer.write(" throws "); + while(throwables.hasNext()){ + Token token = throwables.next(); + writer.write(token); + if(throwables.hasNext()) writer.write(","); + } + } + } + writer.write("{\n"); + for(JavaElement content : element.getElements()){ + provider.getPrinter(content).print(content, writer, buffer+"\t", provider); + if(content instanceof Value) writer.write(";"); + writer.write("\n"); + } + writer.write(buffer+"}"); + } + +} diff --git a/src/dev/peerat/parser/java/printer/JavaImportPrinter.java b/src/dev/peerat/parser/java/printer/JavaImportPrinter.java new file mode 100644 index 0000000..7427dd1 --- /dev/null +++ b/src/dev/peerat/parser/java/printer/JavaImportPrinter.java @@ -0,0 +1,15 @@ +package dev.peerat.parser.java.printer; + +import dev.peerat.parser.java.Import; + +public class JavaImportPrinter extends JavaPrinter{ + + @Override + public void print(Import element, Writer writer, String buffer, JavaPrintProvider provider) throws Exception { + writer.write("import "); + if(element.isStatic()) writer.write("static "); + writer.write(element.getValue()); + writer.write(";"); + } + +} diff --git a/src/dev/peerat/parser/java/printer/JavaOperationPrinter.java b/src/dev/peerat/parser/java/printer/JavaOperationPrinter.java new file mode 100644 index 0000000..fe1388e --- /dev/null +++ b/src/dev/peerat/parser/java/printer/JavaOperationPrinter.java @@ -0,0 +1,25 @@ +package dev.peerat.parser.java.printer; + +import dev.peerat.parser.java.operation.ReturnOperation; +import dev.peerat.parser.java.value.Value; + +public class JavaOperationPrinter{ + + public static class JavaOperationReturnPrinter extends JavaPrinter{ + + @Override + public void print(ReturnOperation element, Writer writer, String buffer, JavaPrintProvider provider)throws Exception { + writer.write(buffer+"return"); + Value value = element.getValue(); + if(value == null){ + writer.write(";"); + return; + } + writer.write(" "); + provider.getPrinter(value).print(value, writer, "", provider); + writer.write(";"); + } + + } + +} diff --git a/src/dev/peerat/parser/java/printer/JavaPrinter.java b/src/dev/peerat/parser/java/printer/JavaPrinter.java new file mode 100644 index 0000000..688b7f8 --- /dev/null +++ b/src/dev/peerat/parser/java/printer/JavaPrinter.java @@ -0,0 +1,105 @@ +package dev.peerat.parser.java.printer; + +import java.io.BufferedWriter; +import java.util.HashMap; +import java.util.Map; + +import dev.peerat.parser.Token; +import dev.peerat.parser.java.Annotation; +import dev.peerat.parser.java.Function; +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.ReturnOperation; +import dev.peerat.parser.java.printer.JavaOperationPrinter.JavaOperationReturnPrinter; +import dev.peerat.parser.java.printer.JavaValuePrinter.JavaArrayAccessValuePrinter; +import dev.peerat.parser.java.printer.JavaValuePrinter.JavaArrayValuePrinter; +import dev.peerat.parser.java.printer.JavaValuePrinter.JavaBiValuePrinter; +import dev.peerat.parser.java.printer.JavaValuePrinter.JavaCastValuePrinter; +import dev.peerat.parser.java.printer.JavaValuePrinter.JavaInstanceValuePrinter; +import dev.peerat.parser.java.printer.JavaValuePrinter.JavaLambdaValuePrinter; +import dev.peerat.parser.java.printer.JavaValuePrinter.JavaMethodCallValuePrinter; +import dev.peerat.parser.java.printer.JavaValuePrinter.JavaModifierValuePrinter; +import dev.peerat.parser.java.printer.JavaValuePrinter.JavaStaticValuePrinter; +import dev.peerat.parser.java.printer.JavaValuePrinter.JavaTriValuePrinter; +import dev.peerat.parser.java.printer.JavaValuePrinter.JavaVariableAccessValuePrinter; +import dev.peerat.parser.java.value.ArrayAccessValue; +import dev.peerat.parser.java.value.ArrayValue; +import dev.peerat.parser.java.value.BiValue; +import dev.peerat.parser.java.value.CastValue; +import dev.peerat.parser.java.value.InstanceValue; +import dev.peerat.parser.java.value.LambdaValue; +import dev.peerat.parser.java.value.MethodCallValue; +import dev.peerat.parser.java.value.ModifierValue; +import dev.peerat.parser.java.value.StaticValue; +import dev.peerat.parser.java.value.TriValue; +import dev.peerat.parser.java.value.VariableAccessValue; + +public abstract class JavaPrinter{ + + public static JavaPrintProvider getProvider(){ + JavaPrintProvider provider = new JavaPrintProvider(); + provider.register(ArrayAccessValue.class, new JavaArrayAccessValuePrinter()); + provider.register(ArrayValue.class, new JavaArrayValuePrinter()); + provider.register(BiValue.class, new JavaBiValuePrinter()); + provider.register(CastValue.class, new JavaCastValuePrinter()); + provider.register(InstanceValue.class, new JavaInstanceValuePrinter()); + provider.register(LambdaValue.class, new JavaLambdaValuePrinter()); + provider.register(MethodCallValue.class, new JavaMethodCallValuePrinter()); + provider.register(ModifierValue.class, new JavaModifierValuePrinter()); + provider.register(StaticValue.class, new JavaStaticValuePrinter()); + provider.register(TriValue.class, new JavaTriValuePrinter()); + provider.register(VariableAccessValue.class, new JavaVariableAccessValuePrinter()); + + provider.register(ReturnOperation.class, new JavaOperationReturnPrinter()); + + provider.register(Import.class, new JavaImportPrinter()); + provider.register(Annotation.class, new JavaAnnotationPrinter()); + provider.register(Variable.class, new JavaVariablePrinter()); + provider.register(Function.class, new JavaFunctionPrinter()); + provider.register(dev.peerat.parser.java.Class.class, new JavaClassPrinter()); + provider.register(JavaFile.class, new JavaFilePrinter()); + return provider; + } + + public abstract void print(T element, Writer writer, String buffer, JavaPrintProvider provider) throws Exception; + + public static class JavaPrintProvider{ + + private Map, JavaPrinter> map; + + public JavaPrintProvider(){ + this.map = new HashMap<>(); + } + + public void register(Class type, JavaPrinter printer){ + this.map.put(type, printer); + } + + public JavaPrinter getPrinter(T type){ + return (JavaPrinter) getPrinter(type.getClass()); + } + + public JavaPrinter getPrinter(Class type){ + return (JavaPrinter) this.map.get(type); + } + } + + public static class Writer{ + + private BufferedWriter writer; + + public Writer(BufferedWriter writer){ + this.writer = writer; + } + + public void write(String value) throws Exception{ + this.writer.write(value); + } + + public void write(Token token) throws Exception{ + write(token.getValue()); + } + } +} diff --git a/src/dev/peerat/parser/java/printer/JavaValuePrinter.java b/src/dev/peerat/parser/java/printer/JavaValuePrinter.java new file mode 100644 index 0000000..1b2a9cb --- /dev/null +++ b/src/dev/peerat/parser/java/printer/JavaValuePrinter.java @@ -0,0 +1,208 @@ +package dev.peerat.parser.java.printer; + +import java.util.Iterator; + +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.java.value.ArrayAccessValue; +import dev.peerat.parser.java.value.ArrayValue; +import dev.peerat.parser.java.value.BiValue; +import dev.peerat.parser.java.value.CastValue; +import dev.peerat.parser.java.value.InstanceValue; +import dev.peerat.parser.java.value.LambdaValue; +import dev.peerat.parser.java.value.LambdaValue.LambdaParameter; +import dev.peerat.parser.java.value.MethodCallValue; +import dev.peerat.parser.java.value.ModifierValue; +import dev.peerat.parser.java.value.StaticValue; +import dev.peerat.parser.java.value.TriValue; +import dev.peerat.parser.java.value.Value; +import dev.peerat.parser.java.value.VariableAccessValue; + +public class JavaValuePrinter{ + + public static class JavaStaticValuePrinter extends JavaPrinter{ + + public void print(StaticValue element, Writer writer, String buffer, JavaPrintProvider provider) throws Exception { + writer.write(buffer); + writer.write(element.getToken()); + } + + } + + public static class JavaBiValuePrinter extends JavaPrinter{ + + public void print(BiValue element, Writer writer, String buffer, JavaPrintProvider provider) throws Exception{ + writer.write(buffer); + Value left = element.left(); + provider.getPrinter(left).print(left, writer, "", provider); + + writer.write(element.getAction()); + + Value right = element.right(); + provider.getPrinter(right).print(right, writer, "", provider); + } + + } + + public static class JavaTriValuePrinter extends JavaPrinter{ + + public void print(TriValue element, Writer writer, String buffer, JavaPrintProvider provider) throws Exception{ + writer.write(buffer); + Value value = element.getChecker(); + provider.getPrinter(value).print(value, writer, "", provider); + + writer.write(" ? "); + + value = element.success(); + provider.getPrinter(value).print(value, writer, "", provider); + + writer.write(" : "); + + value = element.fail(); + provider.getPrinter(value).print(value, writer, "", provider); + } + + } + + public static class JavaArrayAccessValuePrinter extends JavaPrinter{ + + public void print(ArrayAccessValue element, Writer writer, String buffer, JavaPrintProvider provider) throws Exception{ + writer.write(buffer); + Value value = element.base(); + provider.getPrinter(value).print(value, writer, "", provider); + writer.write("["); + value = element.getAccessor(); + provider.getPrinter(value).print(value, writer, "", provider); + writer.write("]"); + } + + } + + public static class JavaArrayValuePrinter extends JavaPrinter{ + + public void print(ArrayValue element, Writer writer, String buffer, JavaPrintProvider provider) throws Exception{ + writer.write(buffer+"{"); + Value[] values = element.getValues(); + for(int i = 0; i < values.length; i++){ + Value value = values[i]; + provider.getPrinter(value).print(value, writer, "", provider); + if(i < values.length-1) writer.write(", "); + } + writer.write("}"); + } + + } + + public static class JavaCastValuePrinter extends JavaPrinter{ + + public void print(CastValue element, Writer writer, String buffer, JavaPrintProvider provider) throws Exception { + writer.write(buffer+"("); + writer.write("("); + writer.write(element.getType()); + writer.write(")"); + Value value = element.getValue(); + provider.getPrinter(value).print(value, writer, "", provider); + writer.write(")"); + } + + } + + public static class JavaInstanceValuePrinter extends JavaPrinter{ + + public void print(InstanceValue element, Writer writer, String buffer, JavaPrintProvider provider) throws Exception { + writer.write(buffer+"new "); + writer.write(element.getToken()); + writer.write("("); + Iterator parameters = element.getParameters().iterator(); + while(parameters.hasNext()){ + Value value = parameters.next(); + provider.getPrinter(value).print(value, writer, "", provider); + if(parameters.hasNext()) writer.write(", "); + } + writer.write(")"); + } + + } + + public static class JavaLambdaValuePrinter extends JavaPrinter{ + + public void print(LambdaValue element, Writer writer, String buffer, JavaPrintProvider provider) throws Exception { + writer.write(buffer+"("); + Iterator parameters = element.getParameters().iterator(); + while(parameters.hasNext()){ + LambdaParameter parameter = parameters.next(); + if(parameter.getType() != null){ + writer.write(parameter.getType()); + writer.write(" "); + } + writer.write(parameter.getName()); + if(parameters.hasNext()) writer.write(", "); + } + writer.write(") -> "); + if(element.getOperations().size() == 1){ + JavaElement value = element.getOperations().get(0); + provider.getPrinter(value).print(value, writer, "", provider); + }else{ + writer.write("{\n"); + Iterator operations = element.getOperations().iterator(); + while(operations.hasNext()){ + JavaElement operation = operations.next(); + provider.getPrinter(operation).print(operation, writer, buffer+"\t", provider); + if(operation instanceof Value) writer.write(";"); + writer.write("\n"); + } + writer.write("}"); + } + } + + } + + public static class JavaMethodCallValuePrinter extends JavaPrinter{ + + public void print(MethodCallValue element, Writer writer, String buffer, JavaPrintProvider provider) throws Exception { + writer.write(buffer); + Value base = element.base(); + if(base != null){ + provider.getPrinter(base).print(base, writer, "", provider); + writer.write("."); + } + if(element.getGeneric() != null){ + writer.write("<"); + writer.write(element.getGeneric()); + writer.write(">"); + } + writer.write(element.getToken()); + writer.write("("); + Iterator parameters = element.getParameters().iterator(); + while(parameters.hasNext()){ + Value value = parameters.next(); + provider.getPrinter(value).print(value, writer, "", provider); + if(parameters.hasNext()) writer.write(", "); + } + writer.write(")"); + } + + } + + public static class JavaModifierValuePrinter extends JavaPrinter{ + + public void print(ModifierValue element, Writer writer, String buffer, JavaPrintProvider provider) throws Exception{ + writer.write(buffer+element.getModifier()); + Value value = element.getValue(); + provider.getPrinter(value).print(value, writer, "", provider); + } + + } + + public static class JavaVariableAccessValuePrinter extends JavaPrinter{ + + public void print(VariableAccessValue element, Writer writer, String buffer, JavaPrintProvider provider) throws Exception{ + writer.write(buffer); + Value value = element.base(); + provider.getPrinter(value).print(value, writer, "", provider); + writer.write("."); + writer.write(element.getVariable()); + } + + } + +} diff --git a/src/dev/peerat/parser/java/printer/JavaVariablePrinter.java b/src/dev/peerat/parser/java/printer/JavaVariablePrinter.java new file mode 100644 index 0000000..d5eaaae --- /dev/null +++ b/src/dev/peerat/parser/java/printer/JavaVariablePrinter.java @@ -0,0 +1,24 @@ +package dev.peerat.parser.java.printer; + +import java.lang.reflect.Modifier; + +import dev.peerat.parser.java.Variable; +import dev.peerat.parser.java.value.Value; + +public class JavaVariablePrinter extends JavaPrinter{ + + @Override + public void print(Variable element, Writer writer, String buffer, JavaPrintProvider provider) throws Exception { + writer.write(buffer+Modifier.toString(element.getModifier())+" "); + writer.write(element.getType()); + writer.write(" "); + writer.write(element.getName()); + if(element.getValue() != null){ + writer.write(" = "); + Value value = element.getValue(); + provider.getPrinter(value).print(value, writer, "", provider); + writer.write(";"); + } + } + +} diff --git a/src/dev/peerat/parser/java/tree/ClassTree.java b/src/dev/peerat/parser/java/tree/ClassTree.java index f4bfb15..927f040 100644 --- a/src/dev/peerat/parser/java/tree/ClassTree.java +++ b/src/dev/peerat/parser/java/tree/ClassTree.java @@ -31,7 +31,7 @@ public class ClassTree extends SyntaxTree { .then(new RedirectStateTree<>(type, (global, local) -> global.set("name", local.get()))); clazz_base.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) .end((parent, bag) -> { - Class current = new Class((((AnnotableBuffer) parent).getAnnotationBuffer()), bag.get("modifier") == null ? 0 : bag.get("modifier"),bag.get("name")); + Class current = new Class((((AnnotableBuffer) parent).getAnnotationBuffer()), bag.get("modifier") == null ? 0 : bag.get("modifier").get(),bag.get("name")); if (parent instanceof ClassContainer) ((ClassContainer) parent).addClass(current); return current; @@ -54,7 +54,7 @@ public class ClassTree extends SyntaxTree { clazz_implement_name.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) .end((parent, bag) -> { Class current = new Class((((AnnotableBuffer) parent).getAnnotationBuffer()), - bag.get("modifier") == null ? 0 : bag.get("modifier"), + bag.get("modifier") == null ? 0 : bag.get("modifier").get(), bag.get("name"), bag.get("extend"), bag.get("implement")); if (parent instanceof ClassContainer) diff --git a/src/dev/peerat/parser/java/tree/ValueTree.java b/src/dev/peerat/parser/java/tree/ValueTree.java index 296b307..e7632a2 100644 --- a/src/dev/peerat/parser/java/tree/ValueTree.java +++ b/src/dev/peerat/parser/java/tree/ValueTree.java @@ -132,6 +132,7 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo .end(ValueChainBuilder.build((builder) -> builder.buildStatic(), 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("<")).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)); diff --git a/src/dev/peerat/parser/java/value/ArrayAccessValue.java b/src/dev/peerat/parser/java/value/ArrayAccessValue.java index 96bf3b5..f4f3cfd 100644 --- a/src/dev/peerat/parser/java/value/ArrayAccessValue.java +++ b/src/dev/peerat/parser/java/value/ArrayAccessValue.java @@ -5,6 +5,7 @@ import java.util.function.Function; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class ArrayAccessValue extends Value{ @@ -36,7 +37,7 @@ public class ArrayAccessValue extends Value{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); return bag; diff --git a/src/dev/peerat/parser/java/value/ArrayValue.java b/src/dev/peerat/parser/java/value/ArrayValue.java index 284e8aa..573ecb1 100644 --- a/src/dev/peerat/parser/java/value/ArrayValue.java +++ b/src/dev/peerat/parser/java/value/ArrayValue.java @@ -5,6 +5,7 @@ import java.util.function.Function; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class ArrayValue extends Value{ @@ -30,7 +31,7 @@ public class ArrayValue extends Value{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); return bag; diff --git a/src/dev/peerat/parser/java/value/BiValue.java b/src/dev/peerat/parser/java/value/BiValue.java index 92e91a9..35fb33f 100644 --- a/src/dev/peerat/parser/java/value/BiValue.java +++ b/src/dev/peerat/parser/java/value/BiValue.java @@ -5,6 +5,7 @@ import java.util.function.Function; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class BiValue extends Value{ @@ -47,7 +48,7 @@ public class BiValue extends Value{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); return bag; diff --git a/src/dev/peerat/parser/java/value/CastValue.java b/src/dev/peerat/parser/java/value/CastValue.java index bb0343b..40ac246 100644 --- a/src/dev/peerat/parser/java/value/CastValue.java +++ b/src/dev/peerat/parser/java/value/CastValue.java @@ -6,6 +6,7 @@ import java.util.function.Function; import dev.peerat.parser.Token; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class CastValue extends Value{ @@ -37,7 +38,7 @@ public class CastValue extends Value{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); return bag; diff --git a/src/dev/peerat/parser/java/value/InstanceValue.java b/src/dev/peerat/parser/java/value/InstanceValue.java index 5c7a522..eb69269 100644 --- a/src/dev/peerat/parser/java/value/InstanceValue.java +++ b/src/dev/peerat/parser/java/value/InstanceValue.java @@ -12,6 +12,7 @@ import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.Variable; import dev.peerat.parser.java.Variable.VariableContainer; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class InstanceValue extends Value implements VariableContainer, FunctionContainer, AnnotableBuffer{ //TODO LIKE A CLASS, CAN CONTAINS CLASS @@ -73,7 +74,7 @@ public class InstanceValue extends Value implements VariableContainer, FunctionC } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); return bag; diff --git a/src/dev/peerat/parser/java/value/LambdaValue.java b/src/dev/peerat/parser/java/value/LambdaValue.java index 1afdf7d..72d050b 100644 --- a/src/dev/peerat/parser/java/value/LambdaValue.java +++ b/src/dev/peerat/parser/java/value/LambdaValue.java @@ -12,6 +12,7 @@ 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.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class LambdaValue extends Value implements OperationContainer, VariableContainer, ValueContainer{ @@ -68,7 +69,7 @@ public class LambdaValue extends Value implements OperationContainer, VariableCo } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); for(JavaElement element : this.operations){ diff --git a/src/dev/peerat/parser/java/value/MethodCallValue.java b/src/dev/peerat/parser/java/value/MethodCallValue.java index d4a55ec..4225981 100644 --- a/src/dev/peerat/parser/java/value/MethodCallValue.java +++ b/src/dev/peerat/parser/java/value/MethodCallValue.java @@ -6,6 +6,7 @@ import java.util.function.Function; import dev.peerat.parser.Token; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class MethodCallValue extends Value{ @@ -49,7 +50,7 @@ public class MethodCallValue extends Value{ } @Override - public VisitorBag visit(JavaVisitor visitor){ + public VisitorBag visit(Visitor visitor){ if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); return bag; diff --git a/src/dev/peerat/parser/java/value/ModifierValue.java b/src/dev/peerat/parser/java/value/ModifierValue.java index 2ba3c53..74fbd9e 100644 --- a/src/dev/peerat/parser/java/value/ModifierValue.java +++ b/src/dev/peerat/parser/java/value/ModifierValue.java @@ -6,6 +6,7 @@ import java.util.function.Function; import dev.peerat.parser.Token; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class ModifierValue extends Value{ @@ -42,7 +43,7 @@ public class ModifierValue extends Value{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); return bag; diff --git a/src/dev/peerat/parser/java/value/StaticValue.java b/src/dev/peerat/parser/java/value/StaticValue.java index 71a3d6b..df6116e 100644 --- a/src/dev/peerat/parser/java/value/StaticValue.java +++ b/src/dev/peerat/parser/java/value/StaticValue.java @@ -6,6 +6,7 @@ import java.util.function.Function; import dev.peerat.parser.Token; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class StaticValue extends Value{ @@ -37,7 +38,7 @@ public class StaticValue extends Value{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); return bag; diff --git a/src/dev/peerat/parser/java/value/TriValue.java b/src/dev/peerat/parser/java/value/TriValue.java index a72239f..9ff3175 100644 --- a/src/dev/peerat/parser/java/value/TriValue.java +++ b/src/dev/peerat/parser/java/value/TriValue.java @@ -5,6 +5,7 @@ import java.util.function.Function; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class TriValue extends Value{ @@ -47,7 +48,7 @@ public class TriValue extends Value{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); return bag; diff --git a/src/dev/peerat/parser/java/value/VariableAccessValue.java b/src/dev/peerat/parser/java/value/VariableAccessValue.java index ec45394..f5e4c3e 100644 --- a/src/dev/peerat/parser/java/value/VariableAccessValue.java +++ b/src/dev/peerat/parser/java/value/VariableAccessValue.java @@ -6,6 +6,7 @@ import java.util.function.Function; import dev.peerat.parser.Token; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; public class VariableAccessValue extends Value{ @@ -37,7 +38,7 @@ public class VariableAccessValue extends Value{ } @Override - public VisitorBag visit(JavaVisitor visitor) { + public VisitorBag visit(Visitor visitor) { if(visitor.canVisit(getClass())) return visitor.visit(this); VisitorBag bag = new VisitorBag(); return bag; diff --git a/src/dev/peerat/parser/java/visitor/JavaImportVisitor.java b/src/dev/peerat/parser/java/visitor/JavaImportVisitor.java index de1415f..67f0253 100644 --- a/src/dev/peerat/parser/java/visitor/JavaImportVisitor.java +++ b/src/dev/peerat/parser/java/visitor/JavaImportVisitor.java @@ -1,17 +1,51 @@ package dev.peerat.parser.java.visitor; +import java.util.function.Predicate; + import dev.peerat.parser.java.Import; import dev.peerat.parser.visitor.VisitorBag; public class JavaImportVisitor extends JavaVisitor{ + //TODO CONCAT PREDICATE + + private Predicate namePredicate; + private boolean staticPredicate; + private boolean nonStaticPredicate; + public JavaImportVisitor(){ super(Import.class); } + public JavaImportVisitor named(Predicate predicate){ + this.namePredicate = predicate; + return this; + } + + public JavaImportVisitor isStatic(){ + this.staticPredicate = true; + this.nonStaticPredicate = false; + return this; + } + + public JavaImportVisitor isNotStatic(){ + this.staticPredicate = false; + this.nonStaticPredicate = true; + return this; + } + @Override public VisitorBag visitElement(Import element){ - return null; + VisitorBag bag = new VisitorBag(); + + if(this.namePredicate != null){ + if(!this.namePredicate.test(element.getValue().getValue())) return bag; + } + + if((staticPredicate && !element.isStatic()) || (nonStaticPredicate && element.isStatic())) return bag; + + bag.compute(element); + return bag; } } diff --git a/src/dev/peerat/parser/java/visitor/JavaVisitor.java b/src/dev/peerat/parser/java/visitor/JavaVisitor.java index 85adcbd..a62c3ff 100644 --- a/src/dev/peerat/parser/java/visitor/JavaVisitor.java +++ b/src/dev/peerat/parser/java/visitor/JavaVisitor.java @@ -2,7 +2,18 @@ package dev.peerat.parser.java.visitor; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.operation.JavaOperationVisitor; +import dev.peerat.parser.java.visitor.value.JavaArrayAccessValueVisitor; +import dev.peerat.parser.java.visitor.value.JavaArrayValueVisitor; +import dev.peerat.parser.java.visitor.value.JavaBiValueVisitor; +import dev.peerat.parser.java.visitor.value.JavaCastValueVisitor; +import dev.peerat.parser.java.visitor.value.JavaInstanceValueVisitor; +import dev.peerat.parser.java.visitor.value.JavaLambdaValueVisitor; +import dev.peerat.parser.java.visitor.value.JavaMethodCallValueVisitor; +import dev.peerat.parser.java.visitor.value.JavaModifierValueVisitor; +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.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -75,6 +86,50 @@ public abstract class JavaVisitor extends Visitor { + + public JavaArrayValueVisitor() { + super(ArrayValue.class); + } + + @Override + public VisitorBag visitElement(ArrayValue element) { + VisitorBag bag = new VisitorBag(); + bag.compute(element); + return bag; + } +} diff --git a/src/dev/peerat/parser/java/visitor/value/JavaBiValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaBiValueVisitor.java new file mode 100644 index 0000000..9796b53 --- /dev/null +++ b/src/dev/peerat/parser/java/visitor/value/JavaBiValueVisitor.java @@ -0,0 +1,62 @@ +package dev.peerat.parser.java.visitor.value; + +import java.util.function.Predicate; + +import dev.peerat.parser.Bag; +import dev.peerat.parser.java.value.BiValue; +import dev.peerat.parser.java.value.Value; +import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.Visitor; +import dev.peerat.parser.visitor.VisitorBag; + +public class JavaBiValueVisitor extends JavaVisitor { + + private Visitor leftPredicate; + private Predicate actionPredicate; + private Visitor rightPredicate; + + public JavaBiValueVisitor() { + super(BiValue.class); + } + + public JavaBiValueVisitor left(Visitor visitor) { + leftPredicate = visitor; + return this; + } + + public JavaBiValueVisitor action(Predicate checker) { + actionPredicate = checker; + return this; + } + + public JavaBiValueVisitor right(Visitor visitor) { + rightPredicate = visitor; + return this; + } + + @Override + public VisitorBag visitElement(BiValue element){ + VisitorBag bag = new VisitorBag(); + + if(leftPredicate != null){ + if(!leftPredicate.canVisit(element.left().getClass())) return bag; + VisitorBag visited = leftPredicate.visit(element.left()); + if(!visited.isValidated()) return bag; + bag.merge(visited); + } + + if(actionPredicate != null){ + if(!actionPredicate.test(element.getAction())) return bag; + } + + if(rightPredicate != null){ + if(!rightPredicate.canVisit(element.left().getClass())) return bag; + VisitorBag visited = rightPredicate.visit(element.right()); + if(!visited.isValidated()) return bag; + bag.merge(visited); + } + + bag.compute(element); + return bag; + } +} diff --git a/src/dev/peerat/parser/java/visitor/value/JavaCastValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaCastValueVisitor.java new file mode 100644 index 0000000..5e0e6a8 --- /dev/null +++ b/src/dev/peerat/parser/java/visitor/value/JavaCastValueVisitor.java @@ -0,0 +1,46 @@ +package dev.peerat.parser.java.visitor.value; + +import dev.peerat.parser.java.value.CastValue; +import dev.peerat.parser.visitor.Visitor; +import dev.peerat.parser.visitor.VisitorBag; +import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.java.value.Value; +import java.util.function.Predicate; + +public class JavaCastValueVisitor extends JavaVisitor { + private Predicate typePredicate; + private Visitor valuePredicate; + + public JavaCastValueVisitor() { + super(CastValue.class); + } + + public JavaCastValueVisitor type(Predicate checker) { + typePredicate = checker; + return this; + } + + public JavaCastValueVisitor value(Visitor visitor) { + valuePredicate = visitor; + return this; + } + + @Override + public VisitorBag visitElement(CastValue element) { + VisitorBag bag = new VisitorBag(); + + if(typePredicate != null){ + if(!typePredicate.test(element.getType().getValue())) return bag; + } + + if(valuePredicate != null){ + if(!valuePredicate.canVisit(element.getValue().getClass())) return bag; + VisitorBag visited = valuePredicate.visit(element.getValue()); + if(!visited.isValidated()) return bag; + bag.merge(visited); + } + + bag.compute(element); + return bag; + } +} diff --git a/src/dev/peerat/parser/java/visitor/value/JavaInstanceValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaInstanceValueVisitor.java new file mode 100644 index 0000000..6c5e0fe --- /dev/null +++ b/src/dev/peerat/parser/java/visitor/value/JavaInstanceValueVisitor.java @@ -0,0 +1,33 @@ +package dev.peerat.parser.java.visitor.value; + +import java.util.function.Predicate; + +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 { + + private Predicate namePredicate; + + public JavaInstanceValueVisitor(){ + super(InstanceValue.class); + } + + public JavaInstanceValueVisitor named(Predicate predicate){ + this.namePredicate = predicate; + return this; + } + + @Override + public VisitorBag visitElement(InstanceValue element) { + VisitorBag bag = new VisitorBag(); + + if(namePredicate != null){ + if(!namePredicate.test(element.getToken().getValue())) return bag; + } + + bag.compute(element); + return bag; + } +} diff --git a/src/dev/peerat/parser/java/visitor/value/JavaLambdaValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaLambdaValueVisitor.java new file mode 100644 index 0000000..3bc2e9e --- /dev/null +++ b/src/dev/peerat/parser/java/visitor/value/JavaLambdaValueVisitor.java @@ -0,0 +1,17 @@ +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{ + + public JavaLambdaValueVisitor(){ + super(LambdaValue.class); + } + + @Override + public VisitorBag visitElement( LambdaValue element){ + VisitorBag bag = new VisitorBag(); + bag.compute(element); + return bag; + } +} diff --git a/src/dev/peerat/parser/java/visitor/value/JavaMethodCallValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaMethodCallValueVisitor.java new file mode 100644 index 0000000..5e4a6c0 --- /dev/null +++ b/src/dev/peerat/parser/java/visitor/value/JavaMethodCallValueVisitor.java @@ -0,0 +1,20 @@ +package dev.peerat.parser.java.visitor.value; +import dev.peerat.parser.java.value.MethodCallValue; +import dev.peerat.parser.visitor.Visitor; +import dev.peerat.parser.visitor.VisitorBag; +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{ + public JavaMethodCallValueVisitor(){ + super(MethodCallValue.class); + } + + @Override + public VisitorBag visitElement( MethodCallValue element){ + VisitorBag bag = new VisitorBag(); + bag.compute(element); + return bag; + } +} diff --git a/src/dev/peerat/parser/java/visitor/value/JavaModifierValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaModifierValueVisitor.java new file mode 100644 index 0000000..346a6a0 --- /dev/null +++ b/src/dev/peerat/parser/java/visitor/value/JavaModifierValueVisitor.java @@ -0,0 +1,46 @@ +package dev.peerat.parser.java.visitor.value; + +import dev.peerat.parser.java.value.ModifierValue; +import dev.peerat.parser.visitor.Visitor; +import dev.peerat.parser.visitor.VisitorBag; +import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.java.value.Value; +import java.util.function.Predicate; + +public class JavaModifierValueVisitor extends JavaVisitor { + private Predicate modifierPredicate; + private Visitor valuePredicate; + + public JavaModifierValueVisitor() { + super(ModifierValue.class); + } + + public JavaModifierValueVisitor modifier(Predicate checker) { + modifierPredicate = checker; + return this; + } + + public JavaModifierValueVisitor value(Visitor visitor) { + valuePredicate = visitor; + return this; + } + + @Override + public VisitorBag visitElement(ModifierValue element) { + VisitorBag bag = new VisitorBag(); + + if(modifierPredicate != null){ + if(!modifierPredicate.test(element.getModifier().getValue())) return bag; + } + + if(valuePredicate != null){ + if(!valuePredicate.canVisit(element.getValue().getClass())) return bag; + VisitorBag visited = valuePredicate.visit(element.getValue()); + if(!visited.isValidated()) return bag; + bag.merge(visited); + } + + bag.compute(element); + return bag; + } +} diff --git a/src/dev/peerat/parser/java/visitor/value/JavaStaticValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaStaticValueVisitor.java new file mode 100644 index 0000000..7e9d90d --- /dev/null +++ b/src/dev/peerat/parser/java/visitor/value/JavaStaticValueVisitor.java @@ -0,0 +1,32 @@ +package dev.peerat.parser.java.visitor.value; + +import java.util.function.Predicate; + +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 { + private Predicate tokenPredicate; + + public JavaStaticValueVisitor() { + super(StaticValue.class); + } + + public JavaStaticValueVisitor token(Predicate checker) { + tokenPredicate = checker; + return this; + } + + @Override + public VisitorBag visitElement(StaticValue element){ + VisitorBag bag = new VisitorBag(); + + if(tokenPredicate != null){ + if(!tokenPredicate.test(element.getToken().getValue())) return bag; + } + + bag.compute(element); + return bag; + } +} diff --git a/src/dev/peerat/parser/java/visitor/value/JavaTriValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaTriValueVisitor.java new file mode 100644 index 0000000..71a6dea --- /dev/null +++ b/src/dev/peerat/parser/java/visitor/value/JavaTriValueVisitor.java @@ -0,0 +1,61 @@ +package dev.peerat.parser.java.visitor.value; + +import dev.peerat.parser.java.value.TriValue; +import dev.peerat.parser.visitor.Visitor; +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 { + private Visitor checkPredicate; + private Visitor successPredicate; + private Visitor failPredicate; + + public JavaTriValueVisitor() { + super(TriValue.class); + } + + public JavaTriValueVisitor check(Visitor visitor) { + checkPredicate = visitor; + return this; + } + + public JavaTriValueVisitor success(Visitor visitor) { + successPredicate = visitor; + return this; + } + + public JavaTriValueVisitor fail(Visitor visitor) { + failPredicate = visitor; + return this; + } + + @Override + public VisitorBag visitElement(TriValue element) { + VisitorBag bag = new VisitorBag(); + + if(checkPredicate != null){ + if(!checkPredicate.canVisit(element.getChecker().getClass())) return bag; + VisitorBag visited = checkPredicate.visit(element.getChecker()); + if(!visited.isValidated()) return bag; + bag.merge(visited); + } + + if(successPredicate != null){ + if(!successPredicate.canVisit(element.success().getClass())) return bag; + VisitorBag visited = successPredicate.visit(element.success()); + if(!visited.isValidated()) return bag; + bag.merge(visited); + } + + if(failPredicate != null){ + if(!failPredicate.canVisit(element.fail().getClass())) return bag; + VisitorBag visited = failPredicate.visit(element.fail()); + if(!visited.isValidated()) return bag; + bag.merge(visited); + } + + bag.compute(element); + return bag; + } +} diff --git a/src/dev/peerat/parser/java/visitor/value/JavaValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaValueVisitor.java index 3f1a0d1..08500cf 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaValueVisitor.java @@ -14,4 +14,4 @@ public class JavaValueVisitor extends JavaVisitor{ public VisitorBag visitElement(Value element){ return null; } -} +} \ No newline at end of file diff --git a/src/dev/peerat/parser/java/visitor/value/JavaVariableAccessValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaVariableAccessValueVisitor.java new file mode 100644 index 0000000..45799af --- /dev/null +++ b/src/dev/peerat/parser/java/visitor/value/JavaVariableAccessValueVisitor.java @@ -0,0 +1,18 @@ +package dev.peerat.parser.java.visitor.value; + +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 { + public JavaVariableAccessValueVisitor() { + super(VariableAccessValue.class); + } + + @Override + public VisitorBag visitElement(VariableAccessValue element) { + VisitorBag bag = new VisitorBag(); + bag.compute(element); + return bag; + } +} diff --git a/src/dev/peerat/parser/visitor/Operator.java b/src/dev/peerat/parser/visitor/Operator.java index 72e3db4..13e4249 100644 --- a/src/dev/peerat/parser/visitor/Operator.java +++ b/src/dev/peerat/parser/visitor/Operator.java @@ -7,6 +7,7 @@ import java.util.function.Predicate; public class Operator{ //Success ? Fail ? + @SafeVarargs public static Visitor and(Visitor... visitors){ return new Visitor(){ @Override @@ -37,6 +38,7 @@ public class Operator{ //Quid de si c'est empty ? //Quid de si on a un collect dans les 2 ? ou dans 1 qui sourtout ne sera peux ĂȘtre pas appeler ? + @SafeVarargs public static Visitor or(Visitor... visitors){ return new Visitor(){ @Override diff --git a/test/dev/peerat/parser/java/ValueTypesTests.java b/test/dev/peerat/parser/java/ValueTypesTests.java index 56d2b20..231bb29 100644 --- a/test/dev/peerat/parser/java/ValueTypesTests.java +++ b/test/dev/peerat/parser/java/ValueTypesTests.java @@ -27,6 +27,7 @@ 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; @TestInstance(Lifecycle.PER_CLASS) @@ -65,7 +66,7 @@ public class ValueTypesTests { public void findAll(Function finder, List list){} @Override - public VisitorBag visit(JavaVisitor visitor){return null;} + public VisitorBag visit(Visitor visitor){return null;} }