From d7add3503bcb92e8578e047ffdbf1b755cd3b5f1 Mon Sep 17 00:00:00 2001 From: jeffcheasey88 <66554203+jeffcheasey88@users.noreply.github.com> Date: Wed, 28 Feb 2024 22:37:07 +0100 Subject: [PATCH] start Graph Generator + add unit test (UtilsTest + Try Catch Finally (base)) + fix some builders in parser --- src/dev/peerat/parser/java/JavaElement.java | 2 +- src/dev/peerat/parser/java/JavaParser.java | 13 +- .../parser/java/operation/CatchOperation.java | 5 + .../parser/java/operation/DoOperation.java | 5 + .../parser/java/operation/ElseOperation.java | 5 + .../java/operation/FinallyOperation.java | 5 + .../parser/java/operation/ForOperation.java | 19 ++- .../java/operation/ForeachOperation.java | 5 + .../parser/java/operation/IfOperation.java | 5 + .../parser/java/operation/OperationBag.java | 7 +- .../java/operation/SynchronizedOperation.java | 5 + .../parser/java/operation/TryOperation.java | 5 + .../parser/java/operation/WhileOperation.java | 5 + .../state/generator/GraphGenerator.java | 147 ++++++++++++++++++ .../generator/ParserComposantGenerator.java | 2 +- test/dev/peerat/parser/java/UtilsTests.java | 63 ++++++++ .../TryCatchFinallyOperationTest.java | 34 ++++ 17 files changed, 312 insertions(+), 20 deletions(-) create mode 100644 src/dev/peerat/parser/state/generator/GraphGenerator.java create mode 100644 test/dev/peerat/parser/java/UtilsTests.java create mode 100644 test/dev/peerat/parser/java/element/operation/TryCatchFinallyOperationTest.java diff --git a/src/dev/peerat/parser/java/JavaElement.java b/src/dev/peerat/parser/java/JavaElement.java index bb39bcd..e36ddf1 100644 --- a/src/dev/peerat/parser/java/JavaElement.java +++ b/src/dev/peerat/parser/java/JavaElement.java @@ -8,7 +8,7 @@ import dev.peerat.parser.ElementBuilder; public abstract class JavaElement implements ElementBuilder{ - Bag bag; //to remove +// Bag bag; //to remove public abstract E find(Function finder); diff --git a/src/dev/peerat/parser/java/JavaParser.java b/src/dev/peerat/parser/java/JavaParser.java index 1369e48..678a41b 100644 --- a/src/dev/peerat/parser/java/JavaParser.java +++ b/src/dev/peerat/parser/java/JavaParser.java @@ -1,10 +1,6 @@ package dev.peerat.parser.java; import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.LinkedHashMap; @@ -15,11 +11,9 @@ import java.util.function.BiConsumer; import java.util.function.BiFunction; import dev.peerat.parser.Bag; -import dev.peerat.parser.ElementBuilder.Builder; import dev.peerat.parser.Parser; import dev.peerat.parser.Token; import dev.peerat.parser.TokenType; -import dev.peerat.parser.TokenValidator; import dev.peerat.parser.Tokenizer; import dev.peerat.parser.java.Annotation.AnnotableBuffer; import dev.peerat.parser.java.Function.FunctionContainer; @@ -363,6 +357,7 @@ public class JavaParser extends Parser { StateTree value_name = new StateTree(); value.then(value_name); value_instance.then(new RedirectStateTree<>(value_name, (global, local) -> { + System.out.println(local.get()+""); if(global.has("newit")) global.set(new InstanceValue(global.get("newit"), local.get().getToken(), local.get().getParameters())); else global.set(local.get()); })) @@ -412,7 +407,11 @@ public class JavaParser extends Parser { StateTree value_array_end = value_array_begin.then((validator) -> validator.validate((token) -> token.getValue().equals("]"))); value_array_begin.then(new RedirectStateTree<>(value_container, (global, local) -> global.set("inside", local))) .then(value_array_end); - value_array_end.end((a,b) -> a) + value_array_end.end((parent,bag) -> { + //to change + bag.set(new MethodCallValue(null, null, bag.get(), null)); + return parent; + }) .then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) .end((a,b) -> a) .multiple(value_list) diff --git a/src/dev/peerat/parser/java/operation/CatchOperation.java b/src/dev/peerat/parser/java/operation/CatchOperation.java index 480585c..474b622 100644 --- a/src/dev/peerat/parser/java/operation/CatchOperation.java +++ b/src/dev/peerat/parser/java/operation/CatchOperation.java @@ -23,4 +23,9 @@ public class CatchOperation extends OperationBag{ return this.name; } + @Override + public void build(Builder builder) throws Exception { + + } + } diff --git a/src/dev/peerat/parser/java/operation/DoOperation.java b/src/dev/peerat/parser/java/operation/DoOperation.java index 729c9fb..13ad980 100644 --- a/src/dev/peerat/parser/java/operation/DoOperation.java +++ b/src/dev/peerat/parser/java/operation/DoOperation.java @@ -2,4 +2,9 @@ package dev.peerat.parser.java.operation; public class DoOperation extends OperationBag{ + @Override + public void build(Builder builder) throws Exception { + + } + } diff --git a/src/dev/peerat/parser/java/operation/ElseOperation.java b/src/dev/peerat/parser/java/operation/ElseOperation.java index 8daa7a7..2a6b887 100644 --- a/src/dev/peerat/parser/java/operation/ElseOperation.java +++ b/src/dev/peerat/parser/java/operation/ElseOperation.java @@ -2,4 +2,9 @@ package dev.peerat.parser.java.operation; public class ElseOperation extends OperationBag{ + @Override + public void build(Builder builder) throws Exception { + + } + } diff --git a/src/dev/peerat/parser/java/operation/FinallyOperation.java b/src/dev/peerat/parser/java/operation/FinallyOperation.java index fb51305..361e6bf 100644 --- a/src/dev/peerat/parser/java/operation/FinallyOperation.java +++ b/src/dev/peerat/parser/java/operation/FinallyOperation.java @@ -2,4 +2,9 @@ package dev.peerat.parser.java.operation; public class FinallyOperation extends OperationBag{ + @Override + public void build(Builder builder) throws Exception { + + } + } diff --git a/src/dev/peerat/parser/java/operation/ForOperation.java b/src/dev/peerat/parser/java/operation/ForOperation.java index bb0051f..0f99e7f 100644 --- a/src/dev/peerat/parser/java/operation/ForOperation.java +++ b/src/dev/peerat/parser/java/operation/ForOperation.java @@ -55,8 +55,10 @@ public class ForOperation extends OperationBag{ } } if(finder.apply(condition)) return (E)condition; - for(Value value : this.updates){ - if(finder.apply(value)) return (E)value; + if(this.updates != null){ + for(Value value : this.updates){ + if(finder.apply(value)) return (E)value; + } } return super.find(finder); } @@ -76,10 +78,17 @@ public class ForOperation extends OperationBag{ } } if(finder.apply(condition)) list.add((E)condition); - for(Value value : this.updates){ - if(finder.apply(value)) list.add((E)value); - value.findAll(finder, list); + if(this.updates != null){ + for(Value value : this.updates){ + if(finder.apply(value)) list.add((E)value); + value.findAll(finder, list); + } } super.findAll(finder, list); } + + @Override + public void build(Builder builder) throws Exception { + + } } diff --git a/src/dev/peerat/parser/java/operation/ForeachOperation.java b/src/dev/peerat/parser/java/operation/ForeachOperation.java index 3b5d4c5..d86fd22 100644 --- a/src/dev/peerat/parser/java/operation/ForeachOperation.java +++ b/src/dev/peerat/parser/java/operation/ForeachOperation.java @@ -45,4 +45,9 @@ public class ForeachOperation extends OperationBag{ iterator.findAll(finder, list); super.findAll(finder, list); } + + @Override + public void build(Builder builder) throws Exception { + + } } diff --git a/src/dev/peerat/parser/java/operation/IfOperation.java b/src/dev/peerat/parser/java/operation/IfOperation.java index 7f0f4c3..defa34c 100644 --- a/src/dev/peerat/parser/java/operation/IfOperation.java +++ b/src/dev/peerat/parser/java/operation/IfOperation.java @@ -31,4 +31,9 @@ public class IfOperation extends OperationBag{ condition.findAll(finder, list); super.findAll(finder, list); } + + @Override + public void build(Builder builder) throws Exception { + + } } diff --git a/src/dev/peerat/parser/java/operation/OperationBag.java b/src/dev/peerat/parser/java/operation/OperationBag.java index 87512e0..9d007de 100644 --- a/src/dev/peerat/parser/java/operation/OperationBag.java +++ b/src/dev/peerat/parser/java/operation/OperationBag.java @@ -10,7 +10,7 @@ import dev.peerat.parser.java.Variable; import dev.peerat.parser.java.Operation.OperationContainer; import dev.peerat.parser.java.Variable.VariableContainer; -public class OperationBag extends Operation implements VariableContainer, OperationContainer{ +public abstract class OperationBag extends Operation implements VariableContainer, OperationContainer{ private List elements; @@ -52,9 +52,4 @@ public class OperationBag extends Operation implements VariableContainer, Operat } } - @Override - public void build(Builder builder) throws Exception { - //todo and super on child - } - } diff --git a/src/dev/peerat/parser/java/operation/SynchronizedOperation.java b/src/dev/peerat/parser/java/operation/SynchronizedOperation.java index fc4b962..952b29d 100644 --- a/src/dev/peerat/parser/java/operation/SynchronizedOperation.java +++ b/src/dev/peerat/parser/java/operation/SynchronizedOperation.java @@ -31,4 +31,9 @@ public class SynchronizedOperation extends OperationBag{ value.findAll(finder, list); super.findAll(finder, list); } + + @Override + public void build(Builder builder) throws Exception { + + } } diff --git a/src/dev/peerat/parser/java/operation/TryOperation.java b/src/dev/peerat/parser/java/operation/TryOperation.java index 9e0f4c3..1a8dfed 100644 --- a/src/dev/peerat/parser/java/operation/TryOperation.java +++ b/src/dev/peerat/parser/java/operation/TryOperation.java @@ -36,4 +36,9 @@ public class TryOperation extends OperationBag{ } super.findAll(finder, list); } + + @Override + public void build(Builder builder) throws Exception { + + } } diff --git a/src/dev/peerat/parser/java/operation/WhileOperation.java b/src/dev/peerat/parser/java/operation/WhileOperation.java index 4ebea01..205ca19 100644 --- a/src/dev/peerat/parser/java/operation/WhileOperation.java +++ b/src/dev/peerat/parser/java/operation/WhileOperation.java @@ -30,4 +30,9 @@ public class WhileOperation extends OperationBag{ condition.findAll(finder, list); super.findAll(finder, list); } + + @Override + public void build(Builder builder) throws Exception { + + } } diff --git a/src/dev/peerat/parser/state/generator/GraphGenerator.java b/src/dev/peerat/parser/state/generator/GraphGenerator.java new file mode 100644 index 0000000..786bfc7 --- /dev/null +++ b/src/dev/peerat/parser/state/generator/GraphGenerator.java @@ -0,0 +1,147 @@ +package dev.peerat.parser.state.generator; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class GraphGenerator { + + public static void main(String[] args) throws Exception{ + File file = new File("java.generator"); + BufferedReader reader = new BufferedReader(new FileReader(file)); + List lines = new ArrayList<>(); + String line; + while((line = reader.readLine()) != null) lines.add(line); + reader.close(); + + Graph graph = new Graph(lines); + graph.build(); + } + + public static class Graph{ + + private static Pattern PATTERN = Pattern.compile("^(\\d+)\\s+->\s+(.*)$"); + + private List nodes; + + public Graph(List lines){ + this.nodes = new ArrayList<>(); + for(String line : lines){ + Matcher matcher = PATTERN.matcher(line); + if(matcher.matches()){ + Node from = nodes.get(Integer.parseInt(matcher.group(1))); + String[] split = matcher.group(2).split("\\s+"); + for(String s : split){ + Node to = this.nodes.get(Integer.parseInt(s)); + from.addOutput(to); + to.addInput(from); + } + }else{ + this.nodes.add(new Node(line)); + } + } + } + + public void build(){ + Set dones = new HashSet<>(); + Map builders = new HashMap<>(); + + for(Node node : this.nodes){ + if(node.input.size() == 1 && node.input.iterator().next().output.size() == 1) continue; + Builder builder = new Builder(); + builder.stack(node); + builders.put(node, builder); + } + for(Node node : this.nodes){ + Node before; + if( + node. + input. + size() == 1 && (before = node. + input. + iterator(). + next()). + output. + size() == 1) { + System.out.println(before.content+" ?"); + builders. + get(before). + stack(node);} + } + Set stack = new HashSet<>(builders.values()); + while(!stack.isEmpty()){ + Builder builder = null; + for(Builder b : stack){ + if(b.canBeBuild(dones)){ + builder = b; + break; + } + } + if(builder == null) throw new IllegalArgumentException("Illegale State"); + builder.build(); + dones.addAll(builder.stacks); + stack.remove(builder); + } + + } + + public static class Node{ + + private String content; + private Set input; + private Set output; + + public Node(String content){ + this.content = content; + this.input = new HashSet<>(); + this.output = new HashSet<>(); + } + + public void addInput(Node node){ + this.input.add(node); + } + + public void addOutput(Node node){ + this.output.add(node); + } + + @Override + public String toString(){ + return ".validate("+content+")"; + } + } + + public static class Builder{ + + private List stacks; + + public Builder(){ + this.stacks = new ArrayList<>(); + } + + public void stack(Node node){ + this.stacks.add(node); + } + + public boolean canBeBuild(Set dones){ + System.out.println("can ? "+dones+" -> "+stacks.get(0).input); + return dones.containsAll(stacks.get(0).input); + } + + public void build(){ + System.out.print("StateTree st = new StateTree<>()"); + for(Node node : stacks) System.out.print(node); + System.out.println(";"); + } + } + + } +} diff --git a/src/dev/peerat/parser/state/generator/ParserComposantGenerator.java b/src/dev/peerat/parser/state/generator/ParserComposantGenerator.java index fe800d2..3372e68 100644 --- a/src/dev/peerat/parser/state/generator/ParserComposantGenerator.java +++ b/src/dev/peerat/parser/state/generator/ParserComposantGenerator.java @@ -442,7 +442,7 @@ public class ParserComposantGenerator { } public void build(){ - System.out.println("build "+title); + System.out.println("build "+title+" | in: out:"+path.elements.size()); } diff --git a/test/dev/peerat/parser/java/UtilsTests.java b/test/dev/peerat/parser/java/UtilsTests.java new file mode 100644 index 0000000..7d00a52 --- /dev/null +++ b/test/dev/peerat/parser/java/UtilsTests.java @@ -0,0 +1,63 @@ +package dev.peerat.parser.java; + +import static org.junit.Assert.assertTrue; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.util.ArrayList; +import java.util.List; + +import org.junit.jupiter.api.Test; + +import dev.peerat.parser.Parser; + +class UtilsTests { + + @Test + void main() throws Exception{ + List files = load(new File("workspaces.txt")); + + long time = System.currentTimeMillis(); + + for(File file : files){ + if(!file.getName().endsWith(".java")) continue; + System.out.println("LOOKING "+file); + String result = ""; + BufferedReader reader = new BufferedReader(new FileReader(file)); + String line; + while((line = reader.readLine()) != null) result+=line+"\n"; + reader.close(); + Parser parser = new JavaParser(); + JavaFile javaFile = new JavaFile(); + parser.parse(result, javaFile); + + } + + assertTrue((System.currentTimeMillis()-time) < 30000); + } + + private List load(File config) throws Exception{ + System.out.println("loading "+config.getAbsolutePath()); + BufferedReader reader = new BufferedReader(new FileReader(config)); + List workspaces = new ArrayList<>(); + String line; + while((line = reader.readLine()) != null) workspaces.add(new File(line)); + reader.close(); + System.out.println("loaded "+workspaces.size()+" workspaces"); + List result = new ArrayList<>(); + for(File workspace : workspaces){ + result.addAll(files(workspace)); + System.out.println("Loaded["+result.size()+"] "+workspace.getAbsolutePath()); + } + return result; + } + + private List files(File dir){ + List result = new ArrayList<>(); + if(dir.isDirectory()){ + for(File file : dir.listFiles()) result.addAll(files(file)); + }else result.add(dir); + return result; + } +} diff --git a/test/dev/peerat/parser/java/element/operation/TryCatchFinallyOperationTest.java b/test/dev/peerat/parser/java/element/operation/TryCatchFinallyOperationTest.java new file mode 100644 index 0000000..1bec1dc --- /dev/null +++ b/test/dev/peerat/parser/java/element/operation/TryCatchFinallyOperationTest.java @@ -0,0 +1,34 @@ +package dev.peerat.parser.java.element.operation; + +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import dev.peerat.parser.java.Function; +import dev.peerat.parser.java.Operation; +import dev.peerat.parser.java.element.BaseElementTests; +import dev.peerat.parser.java.operation.BreakOperation; +import dev.peerat.parser.java.operation.ForOperation; + +public class TryCatchFinallyOperationTest extends BaseElementTests{ + + { + register( + "package be.jeffcheasey88;" + + "" + + "public static class Test{ " + + " void test(){ " + + " try{}catch(Exception e){}" + + "}" + + "}", + (javafile) -> { + Function function = checkFunction(checkClass(javafile).getElements().get(0)); + assertEquals(1, function.getElements().size()); + Operation op = checkOperation(function.getElements().get(0)); + assertTrue(op instanceof ForOperation); + ForOperation forOp = (ForOperation)op; + Operation o = checkOperation(forOp.getElements().get(0)); + assertTrue(o instanceof BreakOperation); + }); + + } +} \ No newline at end of file