[Build] Annotation

This commit is contained in:
jeffcheasey88 2023-09-12 22:08:46 +02:00
parent a6f90a2c3e
commit 5efbec8c2f
4 changed files with 160 additions and 16 deletions

View file

@ -9,7 +9,14 @@ public class Annotation{
private Token name; private Token name;
private Map<Token, Value> values; private Map<Token, Value> values;
public Annotation(){} public Annotation(Token name){
this.name = name;
}
public Annotation(Token name, Map<Token, Value> values){
this(name);
this.values = values;
}
public Token getName(){ public Token getName(){
return name; return name;

View file

@ -7,8 +7,10 @@ import java.io.FileReader;
import java.io.FileWriter; import java.io.FileWriter;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import java.util.function.BiFunction; import java.util.function.BiFunction;
@ -204,7 +206,7 @@ public class JavaParser extends Parser<JavaElement> {
.end((a,b) -> a) .end((a,b) -> a)
.multiple(braces_container) .multiple(braces_container)
.unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); .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_name.end((parent,bag) -> {
Value result = new Value(bag.<Token>get()); Value result = new Value(bag.<Token>get());
bag.set(result); bag.set(result);
@ -257,7 +259,7 @@ public class JavaParser extends Parser<JavaElement> {
StateTree<JavaElement> value_left = new StateTree<>(); StateTree<JavaElement> value_left = new StateTree<>();
StateTree<JavaElement> value_parenthesis = value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("("))); StateTree<JavaElement> value_parenthesis = value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("(")));
StateTree<JavaElement> value_cast = value_parenthesis.then(new RedirectStateTree<>(TypeTests.get(), (global, local) -> global.set(null))) StateTree<JavaElement> value_cast = value_parenthesis.then(new RedirectStateTree<>(type, (global, local) -> global.set(null)))
.then((validator) -> validator.validate((token) -> token.getValue().equals(")"))) .then((validator) -> validator.validate((token) -> token.getValue().equals(")")))
.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))); .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null)));
value_cast.then(value_left); value_cast.then(value_left);
@ -337,7 +339,7 @@ public class JavaParser extends Parser<JavaElement> {
.then(new RedirectStateTree<>(value_container, value_right)) .then(new RedirectStateTree<>(value_container, value_right))
.end(value_builder); .end(value_builder);
StateTree<JavaElement> value_instanceof = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("instanceof"), (bag, token) -> bag.set("action", "instanceof"))) StateTree<JavaElement> 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.end(value_builder);
value_instanceof.then(value_left); value_instanceof.then(value_left);
@ -402,18 +404,53 @@ public class JavaParser extends Parser<JavaElement> {
StateTree<JavaElement> annotation_name = annotation.then((validator) -> StateTree<JavaElement> annotation_name = annotation.then((validator) ->
validator.validate((token) -> token.getValue().equals("@")) && validator.validate((token) -> token.getValue().equals("@")) &&
!validator.validate((token) -> token.getValue().equals("interface"))) !validator.validate((token) -> token.getValue().equals("interface")))
.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); .then((validator) -> validator.validate(
annotation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("."))).then(annotation_name); (token) -> token.getType().equals(TokenType.NAME),
annotation_name.end((a,b) -> a); (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<JavaElement> annotation_begin = annotation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("("))); StateTree<JavaElement> annotation_begin = annotation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("(")));
StateTree<JavaElement> annotation_end = annotation_begin.then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); StateTree<JavaElement> annotation_end = annotation_begin.then((validator) -> validator.validate((token) -> token.getValue().equals(")")));
annotation_end.end((a,b) -> a); annotation_end.end((parent, bag) -> {
StateTree<JavaElement> annotation_var = annotation_begin.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); bag.set(new Annotation(bag.get("name"), bag.get("values")));
return null;
});
StateTree<JavaElement> annotation_var = annotation_begin.then((validator) -> validator.validate(
(token) -> token.getType().equals(TokenType.NAME),
(bag, token) -> bag.set("index", token)));
StateTree<JavaElement> annotation_value = annotation_var.then((validator) -> validator.validate((token) -> token.getValue().equals("="))) StateTree<JavaElement> 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<Token, Value> 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((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(annotation_var);
annotation_value.then(annotation_end); 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<Token, Value> map = global.get("values");
if(map == null){
map = new LinkedHashMap<>();
global.set("values", map);
}
map.put(null, local.get());
})).then(annotation_end);
//VARIABLE //VARIABLE
InitialStateTree<JavaElement> variable = new InitialStateTree<>(); InitialStateTree<JavaElement> variable = new InitialStateTree<>();

View file

@ -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<JavaElement> get(){
StateTree<JavaElement> annotation = new StateTree<>();
StateTree<JavaElement> 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<JavaElement> annotation_begin = annotation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("(")));
StateTree<JavaElement> 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<JavaElement> annotation_var = annotation_begin.then((validator) -> validator.validate(
(token) -> token.getType().equals(TokenType.NAME),
(bag, token) -> bag.set("index", token)));
StateTree<JavaElement> annotation_value = annotation_var.then((validator) -> validator.validate((token) -> token.getValue().equals("=")))
.then(new RedirectStateTree<>(ValueTests.get(), (global, local) -> {
Map<Token, Value> 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<Token, Value> 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<JavaElement> parser = new Parser<JavaElement>(){
{
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)");
}
}

View file

@ -133,9 +133,6 @@ public class ValueTests {
StateTree<JavaElement> value_parenthesis_end = value_parenthesis.then(new RedirectStateTree<>(value_container, (global, local) -> global.set("left", local.get()))) StateTree<JavaElement> 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(")"))); .then((validator) -> validator.validate((token) -> token.getValue().equals(")")));
value_parenthesis_end.end(); 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_call);
value_parenthesis_end.then(value_left); value_parenthesis_end.then(value_left);
value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("!"))).then(value_container); 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((validator) -> validator.validate((token) -> token.getValue().equals("]")))
.then(value_left); .then(value_left);
value_inside.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<JavaElement> value_equals = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "="))); StateTree<JavaElement> 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(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); 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 @Test
void doubleInDouble() throws Exception{ void doubleInDouble() throws Exception{
JavaElement result = testCase("(jeffcheasey88 == \"test\")"); JavaElement result = testCase("(jeffcheasey88 == goefra) || (yuzzu == yugs)");
} }
} }