[Build] Annotation
This commit is contained in:
parent
a6f90a2c3e
commit
5efbec8c2f
4 changed files with 160 additions and 16 deletions
|
@ -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;
|
||||||
|
|
|
@ -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<>();
|
||||||
|
|
|
@ -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)");
|
||||||
|
}
|
||||||
|
}
|
|
@ -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)");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue