From 33cb38b9ba00e8d241c0b777e8dd9e0f7510e307 Mon Sep 17 00:00:00 2001 From: jeffcheasey88 <66554203+jeffcheasey88@users.noreply.github.com> Date: Mon, 6 Nov 2023 11:07:15 +0100 Subject: [PATCH] Base AST for enumeration & annotation class + findAll method for AST --- src/dev/peerat/parser/java/Annotation.java | 7 ++ .../peerat/parser/java/AnnotationClass.java | 106 +++++++++++++++++ src/dev/peerat/parser/java/Class.java | 14 ++- src/dev/peerat/parser/java/Enumeration.java | 112 ++++++++++++++++++ src/dev/peerat/parser/java/Function.java | 18 +++ src/dev/peerat/parser/java/Interface.java | 14 ++- src/dev/peerat/parser/java/JavaElement.java | 3 +- src/dev/peerat/parser/java/JavaFile.java | 7 ++ src/dev/peerat/parser/java/JavaParser.java | 47 ++++++-- src/dev/peerat/parser/java/Value.java | 19 +++ src/dev/peerat/parser/java/Variable.java | 11 +- .../java/operation/AssignOperation.java | 6 + .../parser/java/operation/BreakOperation.java | 4 + .../java/operation/ContinueOperation.java | 3 + .../java/operation/MethodCallOperation.java | 8 ++ .../parser/java/operation/OperationBag.java | 9 ++ .../java/operation/ReturnOperation.java | 8 +- .../java/operation/SwitchOperation.java | 3 + .../parser/java/operation/ThrowOperation.java | 6 + 19 files changed, 386 insertions(+), 19 deletions(-) create mode 100644 src/dev/peerat/parser/java/AnnotationClass.java create mode 100644 src/dev/peerat/parser/java/Enumeration.java diff --git a/src/dev/peerat/parser/java/Annotation.java b/src/dev/peerat/parser/java/Annotation.java index 1714efa..b151ac8 100644 --- a/src/dev/peerat/parser/java/Annotation.java +++ b/src/dev/peerat/parser/java/Annotation.java @@ -39,6 +39,7 @@ public class Annotation extends JavaElement{ @Override public void build(Builder builder) throws Exception{ + System.out.println("build annotation "+name+" | "+values); builder.append(name); if(values != null && values.size() > 0){ builder.append("("); @@ -62,4 +63,10 @@ public class Annotation extends JavaElement{ return null; } + @Override + public void findAll(Function finder, List list){ + for(Value value : this.values.values()){ + if(finder.apply(value)) list.add((E)value); + } + } } diff --git a/src/dev/peerat/parser/java/AnnotationClass.java b/src/dev/peerat/parser/java/AnnotationClass.java new file mode 100644 index 0000000..ab110de --- /dev/null +++ b/src/dev/peerat/parser/java/AnnotationClass.java @@ -0,0 +1,106 @@ +package dev.peerat.parser.java; + +import java.util.ArrayList; +import java.util.List; + +import dev.peerat.parser.Token; + +public class AnnotationClass extends ClassBase{ + + private List annotations; + + //where mod ???? + private Token name; + private Token extend; + + private List elements; + + public AnnotationClass(List annotations, Token name){ + this.annotations = annotations; + this.name = name; + this.elements = new ArrayList<>(); + } + + @Override + public void addFunction(Function function) { + this.elements.add(function); + } + + @Override + public void addVariable(Variable variable) { + this.elements.add(variable); + } + + @Override + public void addClass(ClassBase clazz){ + this.elements.add(clazz); + } + + public List getAnnotations(){ + return this.annotations; + } + + public Token getName(){ + return this.name; + } + + public Token getExtension(){ + return this.extend; + } + + public List getElements(){ + return this.elements; + } + + @Override + public void build(Builder builder) throws Exception{ + if(annotations != null){ + for(Annotation annotation : this.annotations){ + annotation.build(builder); + } + } + + builder.append("@interface"); + builder.append(name); + if(extend != null){ + builder.append(" extends "); + builder.append(extend); + } + builder.append("{"); + if(elements != null){ + for(JavaElement element : this.elements){ + element.build(builder); + } + } + builder.append("}"); + } + + @Override + public E find(java.util.function.Function finder){ + if(annotations != null){ + for(Annotation annotation : this.annotations){ + if(finder.apply(annotation)) return (E) annotation; + } + } + if(elements != null){ + for(JavaElement element : this.elements){ + if(finder.apply(element)) return (E) element; + } + } + return null; + } + + @Override + public void findAll(java.util.function.Function finder, List list){ + if(annotations != null){ + for(Annotation annotation : this.annotations){ + if(finder.apply(annotation)) list.add((E) annotation); + } + } + if(elements != null){ + for(JavaElement element : this.elements){ + if(finder.apply(element)) list.add((E) element); + } + } + } +} diff --git a/src/dev/peerat/parser/java/Class.java b/src/dev/peerat/parser/java/Class.java index 1045225..a8b84c4 100644 --- a/src/dev/peerat/parser/java/Class.java +++ b/src/dev/peerat/parser/java/Class.java @@ -105,5 +105,17 @@ public class Class extends ClassBase{ return null; } - + @Override + public void findAll(java.util.function.Function finder, List list){ + if(annotations != null){ + for(Annotation annotation : this.annotations){ + if(finder.apply(annotation)) list.add((E) annotation); + } + } + if(elements != null){ + for(JavaElement element : this.elements){ + if(finder.apply(element)) list.add((E) element); + } + } + } } diff --git a/src/dev/peerat/parser/java/Enumeration.java b/src/dev/peerat/parser/java/Enumeration.java new file mode 100644 index 0000000..6ba36ed --- /dev/null +++ b/src/dev/peerat/parser/java/Enumeration.java @@ -0,0 +1,112 @@ +package dev.peerat.parser.java; + +import java.util.ArrayList; +import java.util.List; + +import dev.peerat.parser.Token; + +public class Enumeration extends ClassBase{ + + private List annotations; + + //where mod ???? + private Token name; + private Token extend; + + private List elements; + + public Enumeration(List annotations, Token name){ + this.annotations = annotations; + this.name = name; + this.elements = new ArrayList<>(); + } + + public Enumeration(List annotations, Token name, Token extend){ + this(annotations, name); + this.extend = extend; + } + + @Override + public void addFunction(Function function) { + this.elements.add(function); + } + + @Override + public void addVariable(Variable variable) { + this.elements.add(variable); + } + + @Override + public void addClass(ClassBase clazz){ + this.elements.add(clazz); + } + + public List getAnnotations(){ + return this.annotations; + } + + public Token getName(){ + return this.name; + } + + public Token getExtension(){ + return this.extend; + } + + public List getElements(){ + return this.elements; + } + + @Override + public void build(Builder builder) throws Exception{ + if(annotations != null){ + for(Annotation annotation : this.annotations){ + annotation.build(builder); + } + } + + builder.append("enum"); + builder.append(name); + if(extend != null){ + builder.append(" extends "); + builder.append(extend); + } + builder.append("{"); + if(elements != null){ + for(JavaElement element : this.elements){ + element.build(builder); + } + } + builder.append("}"); + } + + @Override + public E find(java.util.function.Function finder){ + if(annotations != null){ + for(Annotation annotation : this.annotations){ + if(finder.apply(annotation)) return (E) annotation; + } + } + if(elements != null){ + for(JavaElement element : this.elements){ + if(finder.apply(element)) return (E) element; + } + } + return null; + } + + @Override + public void findAll(java.util.function.Function finder, List list){ + if(annotations != null){ + for(Annotation annotation : this.annotations){ + if(finder.apply(annotation)) list.add((E) annotation); + } + } + if(elements != null){ + for(JavaElement element : this.elements){ + if(finder.apply(element)) list.add((E) element); + } + } + } + +} diff --git a/src/dev/peerat/parser/java/Function.java b/src/dev/peerat/parser/java/Function.java index 5ad8424..a45c628 100644 --- a/src/dev/peerat/parser/java/Function.java +++ b/src/dev/peerat/parser/java/Function.java @@ -147,4 +147,22 @@ public class Function extends JavaElement implements VariableContainer, Operatio return null; } + @Override + public void findAll(java.util.function.Function finder, List list){ + if(annotations != null){ + for(Annotation annotation : this.annotations){ + if(finder.apply(annotation)) list.add((E) annotation); + } + } + if(parameters != null){ + for(Variable param : this.parameters){ + if(finder.apply(param)) list.add((E) param); + } + } + if(elements != null){ + for(JavaElement content : this.elements){ + if(finder.apply(content)) list.add((E) content); + } + } + } } diff --git a/src/dev/peerat/parser/java/Interface.java b/src/dev/peerat/parser/java/Interface.java index 4f8bbb0..abeadfe 100644 --- a/src/dev/peerat/parser/java/Interface.java +++ b/src/dev/peerat/parser/java/Interface.java @@ -95,5 +95,17 @@ public class Interface extends ClassBase{ return null; } - + @Override + public void findAll(java.util.function.Function finder, List list){ + if(annotations != null){ + for(Annotation annotation : this.annotations){ + if(finder.apply(annotation)) list.add((E) annotation); + } + } + if(elements != null){ + for(JavaElement element : this.elements){ + if(finder.apply(element)) list.add((E) element); + } + } + } } diff --git a/src/dev/peerat/parser/java/JavaElement.java b/src/dev/peerat/parser/java/JavaElement.java index ebf9323..bb39bcd 100644 --- a/src/dev/peerat/parser/java/JavaElement.java +++ b/src/dev/peerat/parser/java/JavaElement.java @@ -1,5 +1,6 @@ package dev.peerat.parser.java; +import java.util.List; import java.util.function.Function; import dev.peerat.parser.Bag; @@ -12,5 +13,5 @@ public abstract class JavaElement implements ElementBuilder{ public abstract E find(Function finder); - + public abstract void findAll(Function finder, List list); } diff --git a/src/dev/peerat/parser/java/JavaFile.java b/src/dev/peerat/parser/java/JavaFile.java index 1e69282..834bd99 100644 --- a/src/dev/peerat/parser/java/JavaFile.java +++ b/src/dev/peerat/parser/java/JavaFile.java @@ -93,4 +93,11 @@ public class JavaFile extends JavaElement implements ClassContainer, AnnotableBu return null; } + @Override + public void findAll(Function finder, List list){ + if(finder.apply(mainClazz)) list.add((E) mainClazz); + for(ClassBase clazz : subClazz){ + if(finder.apply(clazz)) list.add((E) clazz); + } + } } diff --git a/src/dev/peerat/parser/java/JavaParser.java b/src/dev/peerat/parser/java/JavaParser.java index aeb2b22..6fe1a3a 100644 --- a/src/dev/peerat/parser/java/JavaParser.java +++ b/src/dev/peerat/parser/java/JavaParser.java @@ -8,7 +8,6 @@ import java.io.FileWriter; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.LinkedHashMap; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -16,6 +15,7 @@ import java.util.function.BiConsumer; import java.util.function.BiFunction; import dev.peerat.parser.Bag; +import dev.peerat.parser.ElementBuilder.Builder; import dev.peerat.parser.Parser; import dev.peerat.parser.Token; import dev.peerat.parser.TokenType; @@ -247,10 +247,10 @@ public class JavaParser extends Parser { return false; }).end(); - value.then((validator) -> validator.validate((token) -> { - System.out.println("string? "+token); - return token.getType().equals(TokenType.STRING); - })).end((parent,bag) -> { + value.then((validator) -> validator.validate( + (token) -> token.getType().equals(TokenType.STRING), + (bag, token) -> bag.set(token))) + .end((parent,bag) -> { bag.set(new Value(bag.get())); return null; }); @@ -879,9 +879,15 @@ public class JavaParser extends Parser { //INTERFACE StateTree interfaces = new StateTree<>(); StateTree interface_base = interfaces.then((validator) -> validator.validate((token) -> token.getValue().equals("interface"))) - .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); + .then((validator) -> validator.validate( + (token) -> token.getType().equals(TokenType.NAME), + (bag, token) -> bag.set("name", token))); StateTree interface_start = interface_base.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))); - interface_start.end((a,b) -> a) + interface_start.end((parent,bag) -> { + Interface current = new Interface((((AnnotableBuffer)parent).getAnnotationBuffer()), bag.get("name")); + if(parent instanceof ClassContainer) ((ClassContainer)parent).addClass(current); + return current; + }) .multiple(clazz_container) .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); @@ -900,10 +906,16 @@ public class JavaParser extends Parser { //ENUM StateTree enums = new StateTree<>(); StateTree enum_base = enums.then((validator) -> validator.validate((token) -> token.getValue().equals("enum"))) - .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); + .then((validator) -> validator.validate( + (token) -> token.getType().equals(TokenType.NAME), + (bag,token) -> bag.set("name", token))); StateTree enum_start = enum_base.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))); - enum_start.end((a,b) -> a) + enum_start.end((parent,bag) -> { + Enumeration current = new Enumeration((((AnnotableBuffer)parent).getAnnotationBuffer()), bag.get("name")); + if(parent instanceof ClassContainer) ((ClassContainer)parent).addClass(current); + return current; + }) .unique(enum_value) .unique(mult_clazz_container) .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); @@ -931,9 +943,15 @@ public class JavaParser extends Parser { StateTree def_anno_base = def_annos.then((validator) -> validator.validate((token) -> token.getValue().equals("@")) && validator.validate((token) -> token.getValue().equals("interface"))) - .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); + .then((validator) -> validator.validate( + (token) -> token.getType().equals(TokenType.NAME), + (bag, token) -> bag.set("name", token))); def_anno_base.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) - .end((a,b) -> a) + .end((parent,bag) -> { + AnnotationClass current = new AnnotationClass((((AnnotableBuffer)parent).getAnnotationBuffer()), bag.get("name")); + if(parent instanceof ClassContainer) ((ClassContainer)parent).addClass(current); + return current; + }) .multiple(clazz_container) .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); @@ -1047,7 +1065,7 @@ public class JavaParser extends Parser { } public static void main(String[] args) throws Exception{ - File file = new File("C:\\Users\\jeffc\\eclipse-workspace\\peer-at-code-backend\\test\\dev\\peerat\\backend\\routes\\PlayerDetailsTests.java"); + File file = new File("C:\\Users\\jeffc\\eclipse-workspace\\peer-at-code-backend\\src\\dev\\peerat\\backend\\routes\\users\\Register.java"); BufferedReader reader = new BufferedReader(new FileReader(file)); @@ -1068,6 +1086,9 @@ public class JavaParser extends Parser { System.out.println(TokenValidator.MAX_VALIDATE+" / "+TokenValidator.TOKENS); - parser.build(new BufferedWriter(new FileWriter(new File("/home/ParserV2.txt")))); +// parser.build(new BufferedWriter(new FileWriter(new File("/home/ParserV2.txt")))); + Builder builder = new Builder(); + jFile.build(builder); + builder.build(new BufferedWriter(new FileWriter(new File("/home/ParserV2.txt")))); } } diff --git a/src/dev/peerat/parser/java/Value.java b/src/dev/peerat/parser/java/Value.java index de40794..656e26c 100644 --- a/src/dev/peerat/parser/java/Value.java +++ b/src/dev/peerat/parser/java/Value.java @@ -1,5 +1,6 @@ package dev.peerat.parser.java; +import java.util.List; import java.util.function.Function; import dev.peerat.parser.Token; @@ -46,6 +47,11 @@ public class Value extends JavaElement{ return content != null ? finder.apply(content) ? (E) content : null : null; } + @Override + public void findAll(Function finder, List list) { + if(content != null && finder.apply(content)) list.add((E) content); + } + public static class BiValue extends Value{ private Value left; @@ -86,6 +92,12 @@ public class Value extends JavaElement{ public E find(Function finder){ return finder.apply(left) ? (E) left : finder.apply(right) ? (E) right : null; } + + @Override + public void findAll(Function finder, List list){ + if(finder.apply(left)) list.add((E)left); + if(finder.apply(right)) list.add((E)right); + } } public static class TriValue extends Value{ @@ -121,6 +133,13 @@ public class Value extends JavaElement{ public E find(Function finder){ return finder.apply(check) ? (E) check : finder.apply(success) ? (E) success : finder.apply(fail) ? (E) fail : null; } + + @Override + public void findAll(Function finder, List list){ + if(finder.apply(check)) list.add((E)check); + if(finder.apply(success)) list.add((E)success); + if(finder.apply(fail)) list.add((E)fail); + } } } diff --git a/src/dev/peerat/parser/java/Variable.java b/src/dev/peerat/parser/java/Variable.java index e278918..acc7276 100644 --- a/src/dev/peerat/parser/java/Variable.java +++ b/src/dev/peerat/parser/java/Variable.java @@ -97,5 +97,14 @@ public class Variable extends JavaElement{ } return value != null ? finder.apply(value) ? (E)value : null : null; } - + + @Override + public void findAll(Function finder, List list){ + if(annotations != null){ + for(Annotation annotation : this.annotations){ + if(finder.apply(annotation)) list.add((E)annotation); + } + } + if(value != null && finder.apply(value)) list.add((E)value); + } } diff --git a/src/dev/peerat/parser/java/operation/AssignOperation.java b/src/dev/peerat/parser/java/operation/AssignOperation.java index e3d84db..f35bc0a 100644 --- a/src/dev/peerat/parser/java/operation/AssignOperation.java +++ b/src/dev/peerat/parser/java/operation/AssignOperation.java @@ -1,5 +1,6 @@ package dev.peerat.parser.java.operation; +import java.util.List; import java.util.function.Function; import dev.peerat.parser.java.JavaElement; @@ -36,4 +37,9 @@ public class AssignOperation extends Operation{ return finder.apply(left) ? (E)left : finder.apply(right) ? (E)right : null; } + @Override + public void findAll(Function finder, List list){ + if(finder.apply(left)) list.add((E) left); + if(finder.apply(right)) list.add((E) right); + } } diff --git a/src/dev/peerat/parser/java/operation/BreakOperation.java b/src/dev/peerat/parser/java/operation/BreakOperation.java index 80748eb..79c15d7 100644 --- a/src/dev/peerat/parser/java/operation/BreakOperation.java +++ b/src/dev/peerat/parser/java/operation/BreakOperation.java @@ -1,5 +1,6 @@ package dev.peerat.parser.java.operation; +import java.util.List; import java.util.function.Function; import dev.peerat.parser.java.JavaElement; @@ -18,5 +19,8 @@ public class BreakOperation extends Operation{ public E find(Function finder){ return null; } + + @Override + public void findAll(Function finder, List list){} } diff --git a/src/dev/peerat/parser/java/operation/ContinueOperation.java b/src/dev/peerat/parser/java/operation/ContinueOperation.java index fe47f07..513eae7 100644 --- a/src/dev/peerat/parser/java/operation/ContinueOperation.java +++ b/src/dev/peerat/parser/java/operation/ContinueOperation.java @@ -1,5 +1,6 @@ package dev.peerat.parser.java.operation; +import java.util.List; import java.util.function.Function; import dev.peerat.parser.java.JavaElement; @@ -17,4 +18,6 @@ public class ContinueOperation extends Operation{ return null; } + @Override + public void findAll(Function finder, List list){} } diff --git a/src/dev/peerat/parser/java/operation/MethodCallOperation.java b/src/dev/peerat/parser/java/operation/MethodCallOperation.java index dc1d847..29593b1 100644 --- a/src/dev/peerat/parser/java/operation/MethodCallOperation.java +++ b/src/dev/peerat/parser/java/operation/MethodCallOperation.java @@ -54,4 +54,12 @@ public class MethodCallOperation extends Operation{ return null; } + @Override + public void findAll(Function finder, List list){ + if(finder.apply(start)) list.add((E)start); + if(previous != null) if(finder.apply(previous)) list.add((E) previous); + for(Value param : this.parameters){ + if(finder.apply(param)) list.add((E)param); + } + } } diff --git a/src/dev/peerat/parser/java/operation/OperationBag.java b/src/dev/peerat/parser/java/operation/OperationBag.java index e6b1ba1..e2e06e4 100644 --- a/src/dev/peerat/parser/java/operation/OperationBag.java +++ b/src/dev/peerat/parser/java/operation/OperationBag.java @@ -37,6 +37,15 @@ public class OperationBag extends Operation implements VariableContainer, Operat } return null; } + + @Override + public void findAll(Function finder, List list){ + if(elements != null){ + for(JavaElement element : this.elements){ + if(finder.apply(element)) list.add((E)element); + } + } + } @Override public void build(Builder builder) throws Exception { diff --git a/src/dev/peerat/parser/java/operation/ReturnOperation.java b/src/dev/peerat/parser/java/operation/ReturnOperation.java index c923efd..3f100f1 100644 --- a/src/dev/peerat/parser/java/operation/ReturnOperation.java +++ b/src/dev/peerat/parser/java/operation/ReturnOperation.java @@ -1,5 +1,6 @@ package dev.peerat.parser.java.operation; +import java.util.List; import java.util.function.Function; import dev.peerat.parser.java.JavaElement; @@ -24,9 +25,12 @@ public class ReturnOperation extends Operation{ } @Override - public E find(Function finder) { + public E find(Function finder){ return value != null ? finder.apply(value) ? (E)value : null : null; } - + @Override + public void findAll(Function finder, List list){ + if(value != null && finder.apply(value)) list.add((E) value); + } } diff --git a/src/dev/peerat/parser/java/operation/SwitchOperation.java b/src/dev/peerat/parser/java/operation/SwitchOperation.java index dedcf93..03abc28 100644 --- a/src/dev/peerat/parser/java/operation/SwitchOperation.java +++ b/src/dev/peerat/parser/java/operation/SwitchOperation.java @@ -1,5 +1,6 @@ package dev.peerat.parser.java.operation; +import java.util.List; import java.util.function.Function; import dev.peerat.parser.java.JavaElement; @@ -16,4 +17,6 @@ public class SwitchOperation extends Operation{ return null; } + @Override + public void findAll(Function finder, List list){} } diff --git a/src/dev/peerat/parser/java/operation/ThrowOperation.java b/src/dev/peerat/parser/java/operation/ThrowOperation.java index d806310..f13ed8f 100644 --- a/src/dev/peerat/parser/java/operation/ThrowOperation.java +++ b/src/dev/peerat/parser/java/operation/ThrowOperation.java @@ -1,5 +1,6 @@ package dev.peerat.parser.java.operation; +import java.util.List; import java.util.function.Function; import dev.peerat.parser.java.JavaElement; @@ -28,5 +29,10 @@ public class ThrowOperation extends Operation{ public E find(Function finder) { return finder.apply(value) ? (E)value : null; } + + @Override + public void findAll(Function finder, List list){ + if(finder.apply(value)) list.add((E) value); + } }