From 0afdb0b76ea1dfa8989705cc95fa3de7d39688ac Mon Sep 17 00:00:00 2001 From: jeffcheasey88 Date: Thu, 1 Jun 2023 19:28:49 +0200 Subject: [PATCH] Util -> Find | 2 method, one more optimized, one more easealy to use --- .../peeratcode/parser/java/Class.java | 15 ++++++++-- .../peeratcode/parser/java/JavaElement.java | 6 ++-- .../peeratcode/parser/java/JavaParser.java | 11 +++++--- .../peeratcode/parser/java/Variable.java | 12 ++++++-- .../java/operations/AssigmentOperation.java | 13 +++++++-- .../parser/java/operations/ElseOperation.java | 1 - .../java/operations/LoopAffectOperation.java | 11 ++++++-- .../java/operations/MethodCallOperation.java | 11 ++++++-- .../java/operations/OperationContainer.java | 15 ++++++++-- .../java/operations/ReturnOperation.java | 14 ++++++++-- .../peeratcode/parser/java/SearchTest.java | 28 +++++++++++++------ 11 files changed, 107 insertions(+), 30 deletions(-) diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/Class.java b/src/be/jeffcheasey88/peeratcode/parser/java/Class.java index d62fccf..f422035 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/Class.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/Class.java @@ -3,7 +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.function.BiFunction; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -110,7 +110,7 @@ public class Class extends JavaElement{ } @Override - public JavaElement find(java.util.function.Function search, java.util.function.Function, Boolean> deep, Set trace){ + public JavaElement find(java.util.function.Function search, java.util.function.Function, Boolean> deep, List trace){ if(search.apply(this)) return this; trace.add(this); if(!deep.apply(trace)) return null; @@ -120,4 +120,15 @@ public class Class extends JavaElement{ } return null; } + + @Override + public JavaElement find(BiFunction, Boolean> search, List trace){ + trace.add(this); + if(search.apply(this, trace)) return this; + for(JavaElement element : this.childs){ + JavaElement result = element.find(search, 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 cb6b727..e55430b 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/JavaElement.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/JavaElement.java @@ -1,13 +1,15 @@ package be.jeffcheasey88.peeratcode.parser.java; -import java.util.Set; +import java.util.List; +import java.util.function.BiFunction; 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, Boolean> deep, Set trace); + public abstract JavaElement find(Function search, Function, Boolean> deep, List trace); + public abstract JavaElement find(BiFunction, Boolean> search, List 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 8a4f943..4054348 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java @@ -7,9 +7,8 @@ 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.BiFunction; import java.util.function.Function; import be.jeffcheasey88.peeratcode.parser.java.CleanerPool.Cleaner; @@ -112,8 +111,12 @@ public class JavaParser{ content = content.substring(index); } - public JavaElement find(Function search, Function, Boolean> deep){ - return this.clazz.find(search, deep, new HashSet<>()); + public JavaElement find(Function search, Function, Boolean> deep){ + return this.clazz.find(search, deep, new ArrayList<>()); + } + + public JavaElement find(BiFunction, Boolean> search){ + return this.clazz.find(search, new ArrayList<>()); } public Package getPackage(){ diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/Variable.java b/src/be/jeffcheasey88/peeratcode/parser/java/Variable.java index ee56fc1..b5e9ba4 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/Variable.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/Variable.java @@ -4,7 +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.function.BiFunction; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -133,7 +133,7 @@ public class Variable extends JavaElement{ } @Override - public JavaElement find(java.util.function.Function search, java.util.function.Function, Boolean> deep, Set trace){ + public JavaElement find(java.util.function.Function search, java.util.function.Function, Boolean> deep, List trace){ if(search.apply(this)) return this; trace.add(this); if(!deep.apply(trace)) return null; @@ -141,6 +141,14 @@ public class Variable extends JavaElement{ return null; } + @Override + public JavaElement find(BiFunction, Boolean> search, List trace){ + trace.add(this); + if(search.apply(this, trace)) return this; + //value + return null; + } + public static class Value extends Variable{ private String value; diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/operations/AssigmentOperation.java b/src/be/jeffcheasey88/peeratcode/parser/java/operations/AssigmentOperation.java index 85f2395..2eca22e 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/operations/AssigmentOperation.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/operations/AssigmentOperation.java @@ -1,6 +1,7 @@ package be.jeffcheasey88.peeratcode.parser.java.operations; -import java.util.Set; +import java.util.List; +import java.util.function.BiFunction; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -35,11 +36,19 @@ public class AssigmentOperation extends JavaElement{ } @Override - public JavaElement find(java.util.function.Function search, java.util.function.Function, Boolean> deep, Set trace){ + public JavaElement find(java.util.function.Function search, java.util.function.Function, Boolean> deep, List trace){ if(search.apply(this)) return this; trace.add(this); if(!deep.apply(trace)) return null; //value return null; } + + @Override + public JavaElement find(BiFunction, Boolean> search, List trace){ + trace.add(this); + if(search.apply(this, trace)) return this; + //value + return null; + } } diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/operations/ElseOperation.java b/src/be/jeffcheasey88/peeratcode/parser/java/operations/ElseOperation.java index 41f315a..a15b9bf 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/operations/ElseOperation.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/operations/ElseOperation.java @@ -5,7 +5,6 @@ import java.util.regex.Pattern; import be.jeffcheasey88.peeratcode.parser.java.CleanerPool; import be.jeffcheasey88.peeratcode.parser.java.JavaElement; -import be.jeffcheasey88.peeratcode.parser.java.CleanerPool.Cleaner; public class ElseOperation extends OperationContainer{ diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/operations/LoopAffectOperation.java b/src/be/jeffcheasey88/peeratcode/parser/java/operations/LoopAffectOperation.java index 0d4e369..0a205ad 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/operations/LoopAffectOperation.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/operations/LoopAffectOperation.java @@ -1,6 +1,7 @@ package be.jeffcheasey88.peeratcode.parser.java.operations; -import java.util.Set; +import java.util.List; +import java.util.function.BiFunction; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -31,9 +32,15 @@ public class LoopAffectOperation extends JavaElement{ } @Override - public JavaElement find(java.util.function.Function search, java.util.function.Function, Boolean> deep, Set trace){ + public JavaElement find(java.util.function.Function search, java.util.function.Function, Boolean> deep, List trace){ return search.apply(this) ? this : null; } + + @Override + public JavaElement find(BiFunction, Boolean> search, List trace){ + trace.add(this); + return search.apply(this, trace) ? this : null; + } public static class ContinueOperation extends LoopAffectOperation{ diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/operations/MethodCallOperation.java b/src/be/jeffcheasey88/peeratcode/parser/java/operations/MethodCallOperation.java index 3909164..2fad925 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/operations/MethodCallOperation.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/operations/MethodCallOperation.java @@ -1,6 +1,7 @@ package be.jeffcheasey88.peeratcode.parser.java.operations; -import java.util.Set; +import java.util.List; +import java.util.function.BiFunction; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -39,7 +40,13 @@ public class MethodCallOperation extends JavaElement{ } @Override - public JavaElement find(java.util.function.Function search, java.util.function.Function, Boolean> deep, Set trace){ + public JavaElement find(java.util.function.Function search, java.util.function.Function, Boolean> deep, List trace){ return search.apply(this) ? this : null; } + + @Override + public JavaElement find(BiFunction, Boolean> search, List trace){ + trace.add(this); + return search.apply(this, trace) ? 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 e7610a7..afe1f00 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/operations/OperationContainer.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/operations/OperationContainer.java @@ -2,7 +2,7 @@ package be.jeffcheasey88.peeratcode.parser.java.operations; import java.util.ArrayList; import java.util.List; -import java.util.Set; +import java.util.function.BiFunction; import be.jeffcheasey88.peeratcode.parser.java.CleanerPool; import be.jeffcheasey88.peeratcode.parser.java.JavaElement; @@ -68,7 +68,7 @@ public abstract class OperationContainer extends JavaElement{ } @Override - public JavaElement find(java.util.function.Function search, java.util.function.Function, Boolean> deep, Set trace){ + public JavaElement find(java.util.function.Function search, java.util.function.Function, Boolean> deep, List trace){ if(search.apply(this)) return this; trace.add(this); if(!deep.apply(trace)) return null; @@ -78,4 +78,15 @@ public abstract class OperationContainer extends JavaElement{ } return null; } + + @Override + public JavaElement find(BiFunction, Boolean> search, List trace){ + trace.add(this); + if(search.apply(this, trace)) return this; + for(JavaElement element : this.childs){ + JavaElement result = element.find(search, 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 0abf082..05f0700 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/operations/ReturnOperation.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/operations/ReturnOperation.java @@ -1,6 +1,7 @@ package be.jeffcheasey88.peeratcode.parser.java.operations; -import java.util.Set; +import java.util.List; +import java.util.function.BiFunction; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -49,7 +50,7 @@ public class ReturnOperation extends JavaElement{ } @Override - public JavaElement find(java.util.function.Function search, java.util.function.Function, Boolean> deep, Set trace){ + public JavaElement find(java.util.function.Function search, java.util.function.Function, Boolean> deep, List trace){ if(search.apply(this)) return this; trace.add(this); if(!deep.apply(trace)) return null; @@ -57,5 +58,14 @@ public class ReturnOperation extends JavaElement{ if(result != null) return result; return null; } + + @Override + public JavaElement find(BiFunction, Boolean> search, List trace){ + trace.add(this); + if(search.apply(this, trace)) return this; + JavaElement result = value.find(search, 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 0fd857c..ae455d0 100644 --- a/test/be/jeffcheasey88/peeratcode/parser/java/SearchTest.java +++ b/test/be/jeffcheasey88/peeratcode/parser/java/SearchTest.java @@ -7,21 +7,13 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.Reader; -import javax.lang.model.element.Element; - 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.ConditionalOperation.IfOperation; 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) class SearchTest{ @@ -75,4 +67,22 @@ class SearchTest{ } + @Test + void siplifiedMethodCallInIfSearch(){ + 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, trace) -> { + return (e instanceof MethodCallOperation) && (trace.get(trace.size()-2) instanceof IfOperation); + }); + + assertNotNull(element); + assertEquals("this.none()", ((MethodCallOperation)element).getValue()); + } catch (Exception e) { + e.printStackTrace(); + } + + } + }