diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/Class.java b/src/be/jeffcheasey88/peeratcode/parser/java/Class.java index 37b39c6..d62fccf 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/Class.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/Class.java @@ -3,6 +3,7 @@ package be.jeffcheasey88.peeratcode.parser.java; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -109,11 +110,12 @@ public class Class extends JavaElement{ } @Override - public JavaElement find(java.util.function.Function search, java.util.function.Function deep){ + public JavaElement find(java.util.function.Function search, java.util.function.Function, Boolean> deep, Set trace){ if(search.apply(this)) return this; - if(!deep.apply(this)) return null; + trace.add(this); + if(!deep.apply(trace)) return null; for(JavaElement element : this.childs){ - JavaElement result = element.find(search, deep); + JavaElement result = element.find(search, deep, trace); if(result != null) return result; } return null; diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/JavaElement.java b/src/be/jeffcheasey88/peeratcode/parser/java/JavaElement.java index ccaba45..cb6b727 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/JavaElement.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/JavaElement.java @@ -1,12 +1,13 @@ package be.jeffcheasey88.peeratcode.parser.java; +import java.util.Set; import java.util.function.Function; public abstract class JavaElement { public abstract int parse(String content, CleanerPool global, CleanerPool local) throws Exception; - public abstract JavaElement find(Function search, Function deep); + public abstract JavaElement find(Function search, Function, Boolean> deep, Set trace); //Only for development public abstract void show(int tab); diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java b/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java index 876987e..8a4f943 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java @@ -7,7 +7,9 @@ import java.io.FileReader; import java.io.FileWriter; import java.lang.reflect.Modifier; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.function.Function; import be.jeffcheasey88.peeratcode.parser.java.CleanerPool.Cleaner; @@ -110,8 +112,8 @@ public class JavaParser{ content = content.substring(index); } - public JavaElement find(Function search, Function deep){ - return this.clazz.find(search, deep); + public JavaElement find(Function search, Function, Boolean> deep){ + return this.clazz.find(search, deep, new HashSet<>()); } public Package getPackage(){ diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/Variable.java b/src/be/jeffcheasey88/peeratcode/parser/java/Variable.java index 695c036..ee56fc1 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/Variable.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/Variable.java @@ -4,6 +4,7 @@ import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -132,9 +133,10 @@ public class Variable extends JavaElement{ } @Override - public JavaElement find(java.util.function.Function search, java.util.function.Function deep){ + public JavaElement find(java.util.function.Function search, java.util.function.Function, Boolean> deep, Set trace){ if(search.apply(this)) return this; - if(!deep.apply(this)) return null; + trace.add(this); + if(!deep.apply(trace)) return null; //Value of the variable return null; } diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/operations/AssigmentOperation.java b/src/be/jeffcheasey88/peeratcode/parser/java/operations/AssigmentOperation.java index 3d04859..85f2395 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/operations/AssigmentOperation.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/operations/AssigmentOperation.java @@ -1,5 +1,6 @@ package be.jeffcheasey88.peeratcode.parser.java.operations; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -34,9 +35,10 @@ public class AssigmentOperation extends JavaElement{ } @Override - public JavaElement find(java.util.function.Function search, java.util.function.Function deep){ + public JavaElement find(java.util.function.Function search, java.util.function.Function, Boolean> deep, Set trace){ if(search.apply(this)) return this; - if(!deep.apply(this)) return null; + trace.add(this); + if(!deep.apply(trace)) return null; //value return null; } diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/operations/LoopAffectOperation.java b/src/be/jeffcheasey88/peeratcode/parser/java/operations/LoopAffectOperation.java index de0b1b1..0d4e369 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/operations/LoopAffectOperation.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/operations/LoopAffectOperation.java @@ -1,5 +1,6 @@ package be.jeffcheasey88.peeratcode.parser.java.operations; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -30,7 +31,7 @@ public class LoopAffectOperation extends JavaElement{ } @Override - public JavaElement find(java.util.function.Function search, java.util.function.Function deep){ + public JavaElement find(java.util.function.Function search, java.util.function.Function, Boolean> deep, Set trace){ return search.apply(this) ? this : null; } diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/operations/MethodCallOperation.java b/src/be/jeffcheasey88/peeratcode/parser/java/operations/MethodCallOperation.java index aeccb50..3909164 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/operations/MethodCallOperation.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/operations/MethodCallOperation.java @@ -1,5 +1,6 @@ package be.jeffcheasey88.peeratcode.parser.java.operations; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -25,6 +26,10 @@ public class MethodCallOperation extends JavaElement{ return matcher.group(1).length(); } + + public String getValue(){ + return this.value; + } @Override public void show(int tab){ @@ -34,7 +39,7 @@ public class MethodCallOperation extends JavaElement{ } @Override - public JavaElement find(java.util.function.Function search, java.util.function.Function deep){ + public JavaElement find(java.util.function.Function search, java.util.function.Function, Boolean> deep, Set trace){ return search.apply(this) ? this : null; } } diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/operations/OperationContainer.java b/src/be/jeffcheasey88/peeratcode/parser/java/operations/OperationContainer.java index f3e9274..e7610a7 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/operations/OperationContainer.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/operations/OperationContainer.java @@ -2,6 +2,7 @@ package be.jeffcheasey88.peeratcode.parser.java.operations; import java.util.ArrayList; import java.util.List; +import java.util.Set; import be.jeffcheasey88.peeratcode.parser.java.CleanerPool; import be.jeffcheasey88.peeratcode.parser.java.JavaElement; @@ -67,11 +68,12 @@ public abstract class OperationContainer extends JavaElement{ } @Override - public JavaElement find(java.util.function.Function search, java.util.function.Function deep){ + public JavaElement find(java.util.function.Function search, java.util.function.Function, Boolean> deep, Set trace){ if(search.apply(this)) return this; - if(!deep.apply(this)) return null; + trace.add(this); + if(!deep.apply(trace)) return null; for(JavaElement element : this.childs){ - JavaElement result = element.find(search, deep); + JavaElement result = element.find(search, deep, trace); if(result != null) return result; } return null; diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/operations/ReturnOperation.java b/src/be/jeffcheasey88/peeratcode/parser/java/operations/ReturnOperation.java index 3960f8e..0abf082 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/operations/ReturnOperation.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/operations/ReturnOperation.java @@ -1,5 +1,6 @@ package be.jeffcheasey88.peeratcode.parser.java.operations; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -48,10 +49,11 @@ public class ReturnOperation extends JavaElement{ } @Override - public JavaElement find(java.util.function.Function search, java.util.function.Function deep){ + public JavaElement find(java.util.function.Function search, java.util.function.Function, Boolean> deep, Set trace){ if(search.apply(this)) return this; - if(!deep.apply(this)) return null; - JavaElement result = value.find(search, deep); + trace.add(this); + if(!deep.apply(trace)) return null; + JavaElement result = value.find(search, deep, trace); if(result != null) return result; return null; } diff --git a/test/be/jeffcheasey88/peeratcode/parser/java/SearchTest.java b/test/be/jeffcheasey88/peeratcode/parser/java/SearchTest.java index 2505b9e..0fd857c 100644 --- a/test/be/jeffcheasey88/peeratcode/parser/java/SearchTest.java +++ b/test/be/jeffcheasey88/peeratcode/parser/java/SearchTest.java @@ -13,12 +13,14 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; +import be.jeffcheasey88.peeratcode.parser.java.operations.ConditionalOperation; import be.jeffcheasey88.peeratcode.parser.java.operations.ConditionalOperation.ForOperation; import be.jeffcheasey88.peeratcode.parser.java.operations.ConditionalOperation.WhileOperation; import be.jeffcheasey88.peeratcode.parser.java.operations.DoOperation; import be.jeffcheasey88.peeratcode.parser.java.operations.LoopAffectOperation.BreakOperation; import be.jeffcheasey88.peeratcode.parser.java.operations.LoopAffectOperation.ContinueOperation; import be.jeffcheasey88.peeratcode.parser.java.operations.MethodCallOperation; +import be.jeffcheasey88.peeratcode.parser.java.operations.OperationContainer; import be.jeffcheasey88.peeratcode.parser.java.operations.SynchronizedOperation; @TestInstance(Lifecycle.PER_CLASS) @@ -47,7 +49,7 @@ class SearchTest{ JavaElement element = parser.find( (e) -> e instanceof MethodCallOperation, - (e) -> true); + (trace) -> true); assertNotNull(element); } catch (Exception e) { @@ -56,4 +58,21 @@ class SearchTest{ } + @Test + void methodCallOutOfIfSearch(){ + try { + JavaParser parser = parse("package be.jeffcheasey88.peeratcode.parser.java; class Test{ void function(){ int i = 0; if(i == 0){ this.none(); } valid(); } }"); + + JavaElement element = parser.find( + (e) -> e instanceof MethodCallOperation, + (trace) -> !trace.stream().anyMatch((e) -> (e instanceof ConditionalOperation))); + + assertNotNull(element); + assertEquals("valid()", ((MethodCallOperation)element).getValue()); + } catch (Exception e) { + e.printStackTrace(); + } + + } + }