[Build] Modifier
This commit is contained in:
parent
e7eb6a0f53
commit
e2b62bb58e
3 changed files with 145 additions and 1 deletions
|
@ -1,5 +1,9 @@
|
||||||
package be.jeffcheasey88.peeratcode.parser.java;
|
package be.jeffcheasey88.peeratcode.parser.java;
|
||||||
|
|
||||||
|
import be.jeffcheasey88.peeratcode.parser.Bag;
|
||||||
|
|
||||||
public class JavaElement {
|
public class JavaElement {
|
||||||
|
|
||||||
|
Bag bag;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -106,7 +106,7 @@ public class JavaParser extends Parser<JavaElement> {
|
||||||
bag.set(current == null ? m : current+m);
|
bag.set(current == null ? m : current+m);
|
||||||
})) mod = true;
|
})) mod = true;
|
||||||
return mod;
|
return mod;
|
||||||
}).end((a,b) -> a);
|
}).end((a,b) -> null);
|
||||||
|
|
||||||
//TYPE
|
//TYPE
|
||||||
StateTree<JavaElement> type = new StateTree<JavaElement>();
|
StateTree<JavaElement> type = new StateTree<JavaElement>();
|
||||||
|
|
140
test/be/jeffcheasey88/peeratcode/parser/java/ModifierTests.java
Normal file
140
test/be/jeffcheasey88/peeratcode/parser/java/ModifierTests.java
Normal file
|
@ -0,0 +1,140 @@
|
||||||
|
package be.jeffcheasey88.peeratcode.parser.java;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.lang.reflect.Modifier;
|
||||||
|
|
||||||
|
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.Tokenizer;
|
||||||
|
import be.jeffcheasey88.peeratcode.parser.java.JavaElement;
|
||||||
|
import be.jeffcheasey88.peeratcode.parser.state.StateTree;
|
||||||
|
|
||||||
|
public class ModifierTests{
|
||||||
|
|
||||||
|
public static Tokenizer TOKENIZER = new Tokenizer(){
|
||||||
|
@Override
|
||||||
|
public void parse(BufferedReader reader) throws Exception{
|
||||||
|
int lineNumber = 0;
|
||||||
|
String line;
|
||||||
|
boolean longCommentary = false;
|
||||||
|
while((line = reader.readLine()) != null){
|
||||||
|
lineNumber++;
|
||||||
|
|
||||||
|
for(int i = 0; i < line.length(); i++){
|
||||||
|
char c = line.charAt(i);
|
||||||
|
if(longCommentary){
|
||||||
|
if(c == '*' && (i < line.length()-1 && line.charAt(i+1) == '/')){
|
||||||
|
longCommentary = false;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Token token;
|
||||||
|
if(isNameValid(c)){
|
||||||
|
String value = "";
|
||||||
|
int j = i;
|
||||||
|
for(; j < line.length(); j++){
|
||||||
|
c = line.charAt(j);
|
||||||
|
if(isNameValid(c)) value+=c;
|
||||||
|
else break;
|
||||||
|
}
|
||||||
|
token = new Token(lineNumber, i+1, value, TokenType.NAME);
|
||||||
|
i = j-1;
|
||||||
|
}else if(Character.isWhitespace(c)) continue;
|
||||||
|
else{
|
||||||
|
if(c == '/' && (i < line.length()-1 && line.charAt(i+1) == '/')) break;
|
||||||
|
if(c == '/' && (i < line.length()-1 && line.charAt(i+1) == '*')){
|
||||||
|
longCommentary = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
token = new Token(lineNumber, i+1, ""+c, TokenType.DELIMITER);
|
||||||
|
}
|
||||||
|
getTokens().add(token);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isNameValid(char c) {
|
||||||
|
return Character.isAlphabetic(c) || Character.isDigit(c) || c == '_' || c == '$';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public static StateTree<JavaElement> get(){
|
||||||
|
StateTree<JavaElement> modifier = new StateTree<JavaElement>();
|
||||||
|
modifier.then((validator) -> {
|
||||||
|
boolean mod = false;
|
||||||
|
while(validator.validate(
|
||||||
|
(token) -> getModifier(token.getValue()) > 0,
|
||||||
|
(bag, token) -> {
|
||||||
|
int m = getModifier(token.getValue());
|
||||||
|
Integer current = bag.get();
|
||||||
|
bag.set(current == null ? m : current+m);
|
||||||
|
})) mod = true;
|
||||||
|
return mod;
|
||||||
|
}).end((a,b) -> {
|
||||||
|
// a.bag = b;
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
|
||||||
|
return modifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getModifier(String modifier){
|
||||||
|
switch(modifier){
|
||||||
|
case "public": return Modifier.PUBLIC;
|
||||||
|
case "private": return Modifier.PRIVATE;
|
||||||
|
case "protected": return Modifier.PROTECTED;
|
||||||
|
case "static": return Modifier.STATIC;
|
||||||
|
case "final": return Modifier.FINAL;
|
||||||
|
case "synchronized": return Modifier.SYNCHRONIZED;
|
||||||
|
case "volatile": return Modifier.VOLATILE;
|
||||||
|
case "transient": return Modifier.TRANSIENT;
|
||||||
|
case "native": return Modifier.NATIVE;
|
||||||
|
case "abstract": return Modifier.ABSTRACT;
|
||||||
|
case "strictfp": return Modifier.STRICT;
|
||||||
|
case "default": return Modifier.STRICT;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Parser<JavaElement> parser = new Parser<JavaElement>(){
|
||||||
|
{
|
||||||
|
setTokenizer(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 oneModifier() throws Exception{
|
||||||
|
JavaElement element = testCase("public");
|
||||||
|
// assertEquals(Modifier.PUBLIC, element.bag.<Integer>get());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void multiple() throws Exception{
|
||||||
|
JavaElement element = testCase("public static final ");
|
||||||
|
// assertEquals(Modifier.PUBLIC + Modifier.STATIC + Modifier.FINAL, element.bag.<Integer>get());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue