106 lines
3.8 KiB
Java
106 lines
3.8 KiB
Java
package dev.peerat.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 dev.peerat.parser.Parser;
|
|
import dev.peerat.parser.Token;
|
|
import dev.peerat.parser.TokenType;
|
|
import dev.peerat.parser.TokenValidator;
|
|
import dev.peerat.parser.java.Annotation.AnnotableBuffer;
|
|
import dev.peerat.parser.java.value.Value;
|
|
import dev.peerat.parser.state.RedirectStateTree;
|
|
import dev.peerat.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) -> {
|
|
Annotation result = new Annotation(bag.get("name"));
|
|
bag.set(result);
|
|
if(parent instanceof AnnotableBuffer) ((AnnotableBuffer)parent).addAnnotationBuffer(result);
|
|
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) -> {
|
|
Annotation result = new Annotation(bag.get("name"), bag.get("values"));
|
|
bag.set(result);
|
|
if(parent instanceof AnnotableBuffer) ((AnnotableBuffer)parent).addAnnotationBuffer(result);
|
|
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 = null;
|
|
|
|
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)");
|
|
}
|
|
}
|