From e2b62bb58e59fecd31e7aa7145b5b33a935e3924 Mon Sep 17 00:00:00 2001 From: jeffcheasey88 <66554203+jeffcheasey88@users.noreply.github.com> Date: Mon, 11 Sep 2023 23:59:31 +0200 Subject: [PATCH] [Build] Modifier --- .../peeratcode/parser/java/JavaElement.java | 4 + .../peeratcode/parser/java/JavaParser.java | 2 +- .../peeratcode/parser/java/ModifierTests.java | 140 ++++++++++++++++++ 3 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 test/be/jeffcheasey88/peeratcode/parser/java/ModifierTests.java diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/JavaElement.java b/src/be/jeffcheasey88/peeratcode/parser/java/JavaElement.java index edfd466..f406ec3 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/JavaElement.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/JavaElement.java @@ -1,5 +1,9 @@ package be.jeffcheasey88.peeratcode.parser.java; +import be.jeffcheasey88.peeratcode.parser.Bag; + public class JavaElement { + + Bag bag; } diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java b/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java index 20dea82..343c91f 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java @@ -106,7 +106,7 @@ public class JavaParser extends Parser { bag.set(current == null ? m : current+m); })) mod = true; return mod; - }).end((a,b) -> a); + }).end((a,b) -> null); //TYPE StateTree type = new StateTree(); diff --git a/test/be/jeffcheasey88/peeratcode/parser/java/ModifierTests.java b/test/be/jeffcheasey88/peeratcode/parser/java/ModifierTests.java new file mode 100644 index 0000000..5e43ca9 --- /dev/null +++ b/test/be/jeffcheasey88/peeratcode/parser/java/ModifierTests.java @@ -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 get(){ + StateTree modifier = new StateTree(); + 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 parser = new Parser(){ + { + 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.get()); + } + + @Test + void multiple() throws Exception{ + JavaElement element = testCase("public static final "); +// assertEquals(Modifier.PUBLIC + Modifier.STATIC + Modifier.FINAL, element.bag.get()); + } + +}