From 5efbec8c2fbcecb584fe04e5cad80e39cc8f3e4e Mon Sep 17 00:00:00 2001 From: jeffcheasey88 <66554203+jeffcheasey88@users.noreply.github.com> Date: Tue, 12 Sep 2023 22:08:46 +0200 Subject: [PATCH] [Build] Annotation --- .../peeratcode/parser/java/Annotation.java | 9 +- .../peeratcode/parser/java/JavaParser.java | 57 ++++++++-- .../parser/java/AnnotationTests.java | 100 ++++++++++++++++++ .../peeratcode/parser/java/ValueTests.java | 10 +- 4 files changed, 160 insertions(+), 16 deletions(-) create mode 100644 test/be/jeffcheasey88/peeratcode/parser/java/AnnotationTests.java diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/Annotation.java b/src/be/jeffcheasey88/peeratcode/parser/java/Annotation.java index e1711fa..995797a 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/Annotation.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/Annotation.java @@ -9,7 +9,14 @@ public class Annotation{ private Token name; private Map values; - public Annotation(){} + public Annotation(Token name){ + this.name = name; + } + + public Annotation(Token name, Map values){ + this(name); + this.values = values; + } public Token getName(){ return name; diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java b/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java index 2279d69..f829260 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java @@ -7,8 +7,10 @@ import java.io.FileReader; 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.function.BiConsumer; import java.util.function.BiFunction; @@ -204,7 +206,7 @@ public class JavaParser extends Parser { .end((a,b) -> a) .multiple(braces_container) .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); - value_name = value_name.then(new RedirectStateTree<>(TypeTests.get(), (global, local) -> global.set(local.get()))); + value_name = value_name.then(new RedirectStateTree<>(type, (global, local) -> global.set(local.get()))); value_name.end((parent,bag) -> { Value result = new Value(bag.get()); bag.set(result); @@ -257,7 +259,7 @@ public class JavaParser extends Parser { StateTree value_left = new StateTree<>(); StateTree value_parenthesis = value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("("))); - StateTree value_cast = value_parenthesis.then(new RedirectStateTree<>(TypeTests.get(), (global, local) -> global.set(null))) + StateTree value_cast = value_parenthesis.then(new RedirectStateTree<>(type, (global, local) -> global.set(null))) .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))) .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))); value_cast.then(value_left); @@ -337,7 +339,7 @@ public class JavaParser extends Parser { .then(new RedirectStateTree<>(value_container, value_right)) .end(value_builder); StateTree value_instanceof = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("instanceof"), (bag, token) -> bag.set("action", "instanceof"))) - .then(new RedirectStateTree<>(TypeTests.get(), value_right)); + .then(new RedirectStateTree<>(type, value_right)); value_instanceof.end(value_builder); value_instanceof.then(value_left); @@ -402,18 +404,53 @@ public class JavaParser extends Parser { StateTree annotation_name = annotation.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))); - annotation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("."))).then(annotation_name); - annotation_name.end((a,b) -> a); + .then((validator) -> validator.validate( + (token) -> token.getType().equals(TokenType.NAME), + (bag, token) -> { + Token name = bag.get("name"); + if(name == null) bag.set("name", token); + else bag.set("name", name.concat(token)); + })); + annotation_name.then((validator) -> validator.validate( + (token) -> token.getValue().equals("."), + (bag, token) -> { + Token name = bag.get("name"); + if(name == null) bag.set("name", token); + else bag.set("name", name.concat(token)); + })) + .then(annotation_name); + annotation_name.end((parent, bag) -> { + bag.set(new Annotation(bag.get("name"))); + return null; + }); StateTree annotation_begin = annotation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("("))); StateTree annotation_end = annotation_begin.then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); - annotation_end.end((a,b) -> a); - StateTree annotation_var = annotation_begin.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); + annotation_end.end((parent, bag) -> { + bag.set(new Annotation(bag.get("name"), bag.get("values"))); + return null; + }); + StateTree annotation_var = annotation_begin.then((validator) -> validator.validate( + (token) -> token.getType().equals(TokenType.NAME), + (bag, token) -> bag.set("index", token))); StateTree annotation_value = annotation_var.then((validator) -> validator.validate((token) -> token.getValue().equals("="))) - .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))); + .then(new RedirectStateTree<>(ValueTests.get(), (global, local) -> { + Map map = global.get("values"); + if(map == null){ + map = new LinkedHashMap<>(); + global.set("values", map); + } + map.put(global.get("index"), local.get()); + })); annotation_value.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(annotation_var); annotation_value.then(annotation_end); - annotation_begin.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).then(annotation_end); + annotation_begin.then(new RedirectStateTree<>(value_container, (global, local) -> { + Map map = global.get("values"); + if(map == null){ + map = new LinkedHashMap<>(); + global.set("values", map); + } + map.put(null, local.get()); + })).then(annotation_end); //VARIABLE InitialStateTree variable = new InitialStateTree<>(); diff --git a/test/be/jeffcheasey88/peeratcode/parser/java/AnnotationTests.java b/test/be/jeffcheasey88/peeratcode/parser/java/AnnotationTests.java new file mode 100644 index 0000000..408b204 --- /dev/null +++ b/test/be/jeffcheasey88/peeratcode/parser/java/AnnotationTests.java @@ -0,0 +1,100 @@ +package be.jeffcheasey88.peeratcode.parser.java; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.LinkedHashMap; +import java.util.Map; + +import org.junit.jupiter.api.Test; + +import be.jeffcheasey88.peeratcode.parser.Parser; +import be.jeffcheasey88.peeratcode.parser.Token; +import be.jeffcheasey88.peeratcode.parser.TokenType; +import be.jeffcheasey88.peeratcode.parser.TokenValidator; +import be.jeffcheasey88.peeratcode.parser.state.RedirectStateTree; +import be.jeffcheasey88.peeratcode.parser.state.StateTree; + +public class AnnotationTests { + + public static StateTree get(){ + StateTree annotation = new StateTree<>(); + StateTree annotation_name = annotation.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), + (bag, token) -> { + Token name = bag.get("name"); + if(name == null) bag.set("name", token); + else bag.set("name", name.concat(token)); + })); + annotation_name.then((validator) -> validator.validate( + (token) -> token.getValue().equals("."), + (bag, token) -> { + Token name = bag.get("name"); + if(name == null) bag.set("name", token); + else bag.set("name", name.concat(token)); + })) + .then(annotation_name); + annotation_name.end((parent, bag) -> { + bag.set(new Annotation(bag.get("name"))); + return null; + }); + StateTree annotation_begin = annotation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("("))); + StateTree annotation_end = annotation_begin.then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); + annotation_end.end((parent, bag) -> { + bag.set(new Annotation(bag.get("name"), bag.get("values"))); + return null; + }); + StateTree annotation_var = annotation_begin.then((validator) -> validator.validate( + (token) -> token.getType().equals(TokenType.NAME), + (bag, token) -> bag.set("index", token))); + StateTree annotation_value = annotation_var.then((validator) -> validator.validate((token) -> token.getValue().equals("="))) + .then(new RedirectStateTree<>(ValueTests.get(), (global, local) -> { + Map map = global.get("values"); + if(map == null){ + map = new LinkedHashMap<>(); + global.set("values", map); + } + map.put(global.get("index"), local.get()); + })); + annotation_value.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(annotation_var); + annotation_value.then(annotation_end); + annotation_begin.then(new RedirectStateTree<>(ValueTests.get(), (global, local) -> { + Map map = global.get("values"); + if(map == null){ + map = new LinkedHashMap<>(); + global.set("values", map); + } + map.put(null, local.get()); + })).then(annotation_end); + + return annotation; + } + + private static Parser parser = new Parser(){ + { + setTokenizer(ModifierTests.TOKENIZER); + + setStateTree(get()); + } + }; + + JavaElement testCase(String value) throws Exception{ + TokenValidator.TOKENS = 0; + TokenValidator.MAX_VALIDATE = 0; + + JavaElement result = new JavaElement(); + + parser.parse(value, result); + + assertEquals(TokenValidator.TOKENS, TokenValidator.MAX_VALIDATE); + + return result; + } + + @Test + void routeAnnotation() throws Exception{ + JavaElement result = testCase("@Route(path = \"^\\\\/result\\\\/(\\\\d+)$\", needLogin = true)"); + } +} diff --git a/test/be/jeffcheasey88/peeratcode/parser/java/ValueTests.java b/test/be/jeffcheasey88/peeratcode/parser/java/ValueTests.java index eb6a9f8..acaae7a 100644 --- a/test/be/jeffcheasey88/peeratcode/parser/java/ValueTests.java +++ b/test/be/jeffcheasey88/peeratcode/parser/java/ValueTests.java @@ -133,9 +133,6 @@ public class ValueTests { StateTree value_parenthesis_end = value_parenthesis.then(new RedirectStateTree<>(value_container, (global, local) -> global.set("left", local.get()))) .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); value_parenthesis_end.end(); - value_parenthesis_end.then((v) -> v.validate((t) -> { - return false; - })); value_parenthesis_end.then(value_call); value_parenthesis_end.then(value_left); value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("!"))).then(value_container); @@ -148,7 +145,10 @@ public class ValueTests { .then((validator) -> validator.validate((token) -> token.getValue().equals("]"))) .then(value_left); value_inside.then(value_left); - value_left.end(); + value_left.end((parent, bag) -> { + if(bag.get() == null) bag.set(bag.get("left")); + return null; + }); StateTree value_equals = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "="))); value_equals.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); value_equals.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "=="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); @@ -258,6 +258,6 @@ public class ValueTests { @Test void doubleInDouble() throws Exception{ - JavaElement result = testCase("(jeffcheasey88 == \"test\")"); + JavaElement result = testCase("(jeffcheasey88 == goefra) || (yuzzu == yugs)"); } }