From a937f119aea4272bccadec9b11c56eab4fcc0af9 Mon Sep 17 00:00:00 2001 From: jeffcheasey88 Date: Thu, 1 Jun 2023 21:53:21 +0200 Subject: [PATCH] Util -> Find -> Fix trace --- .../peeratcode/parser/java/Class.java | 4 +++ .../peeratcode/parser/java/Variable.java | 4 +++ .../java/operations/AssigmentOperation.java | 4 +++ .../java/operations/LoopAffectOperation.java | 2 +- .../java/operations/MethodCallOperation.java | 2 +- .../java/operations/OperationContainer.java | 4 +++ .../java/operations/ReturnOperation.java | 4 +++ .../peeratcode/parser/java/SearchTest.java | 25 +++++++++++++++++++ 8 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/Class.java b/src/be/jeffcheasey88/peeratcode/parser/java/Class.java index 37e2998..9b2422c 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/Class.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/Class.java @@ -113,22 +113,26 @@ public class Class extends JavaElement{ public E find(java.util.function.Function search, java.util.function.Function, Boolean> deep, List trace){ if(search.apply(this)) return (E)this; trace.add(this); + int index = trace.size()-1; if(!deep.apply(trace)) return null; for(JavaElement element : this.childs){ E result = element.find(search, deep, trace); if(result != null) return result; } + trace.remove(index); return null; } @Override public E find(BiFunction, Boolean> search, List trace){ trace.add(this); + int index = trace.size()-1; if(search.apply(this, trace)) return (E)this; for(JavaElement element : this.childs){ E result = element.find(search, trace); if(result != null) return result; } + trace.remove(index); return null; } } diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/Variable.java b/src/be/jeffcheasey88/peeratcode/parser/java/Variable.java index 8e02ce9..14f1045 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/Variable.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/Variable.java @@ -136,16 +136,20 @@ public class Variable extends JavaElement{ public E find(java.util.function.Function search, java.util.function.Function, Boolean> deep, List trace){ if(search.apply(this)) return (E)this; trace.add(this); + int index = trace.size()-1; if(!deep.apply(trace)) return null; //Value of the variable + trace.remove(index); return null; } @Override public E find(BiFunction, Boolean> search, List trace){ trace.add(this); + int index = trace.size()-1; if(search.apply(this, trace)) return (E)this; //value + trace.remove(index); 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 f3f3da2..00189b2 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/operations/AssigmentOperation.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/operations/AssigmentOperation.java @@ -39,16 +39,20 @@ public class AssigmentOperation extends JavaElement{ public E find(java.util.function.Function search, java.util.function.Function, Boolean> deep, List trace){ if(search.apply(this)) return (E)this; trace.add(this); + int index = trace.size()-1; if(!deep.apply(trace)) return null; //value + trace.remove(index); return null; } @Override public E find(BiFunction, Boolean> search, List trace){ trace.add(this); + int index = trace.size()-1; if(search.apply(this, trace)) return (E)this; //value + trace.remove(index); 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 84e8790..30babaf 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/operations/LoopAffectOperation.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/operations/LoopAffectOperation.java @@ -39,7 +39,7 @@ public class LoopAffectOperation extends JavaElement{ @Override public E find(BiFunction, Boolean> search, List trace){ trace.add(this); - return search.apply(this, trace) ? (E)this : null; + return search.apply(this, trace) || trace.remove(trace.size()-1) == null ? (E)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 2508135..aa891e2 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/operations/MethodCallOperation.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/operations/MethodCallOperation.java @@ -47,6 +47,6 @@ public class MethodCallOperation extends JavaElement{ @Override public E find(BiFunction, Boolean> search, List trace){ trace.add(this); - return search.apply(this, trace) ? (E)this : null; + return search.apply(this, trace) || trace.remove(trace.size()-1) == null ? (E)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 bb3b2e3..6354318 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/operations/OperationContainer.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/operations/OperationContainer.java @@ -71,22 +71,26 @@ public abstract class OperationContainer extends JavaElement{ public E find(java.util.function.Function search, java.util.function.Function, Boolean> deep, List trace){ if(search.apply(this)) return (E)this; trace.add(this); + int index = trace.size()-1; if(!deep.apply(trace)) return null; for(JavaElement element : this.childs){ E result = element.find(search, deep, trace); if(result != null) return result; } + trace.remove(index); return null; } @Override public E find(BiFunction, Boolean> search, List trace){ trace.add(this); + int index = trace.size()-1; if(search.apply(this, trace)) return (E)this; for(JavaElement element : this.childs){ E result = element.find(search, trace); if(result != null) return result; } + trace.remove(index); 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 2d99517..07a9c44 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/operations/ReturnOperation.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/operations/ReturnOperation.java @@ -53,18 +53,22 @@ public class ReturnOperation extends JavaElement{ public E find(java.util.function.Function search, java.util.function.Function, Boolean> deep, List trace){ if(search.apply(this)) return (E)this; trace.add(this); + int index = trace.size()-1; if(!deep.apply(trace)) return null; E result = value.find(search, deep, trace); if(result != null) return result; + trace.remove(index); return null; } @Override public E find(BiFunction, Boolean> search, List trace){ trace.add(this); + int index = trace.size()-1; if(search.apply(this, trace)) return (E)this; E result = value.find(search, trace); if(result != null) return result; + trace.remove(index); return null; } diff --git a/test/be/jeffcheasey88/peeratcode/parser/java/SearchTest.java b/test/be/jeffcheasey88/peeratcode/parser/java/SearchTest.java index 0b3f4e5..d31c89f 100644 --- a/test/be/jeffcheasey88/peeratcode/parser/java/SearchTest.java +++ b/test/be/jeffcheasey88/peeratcode/parser/java/SearchTest.java @@ -1,11 +1,13 @@ package be.jeffcheasey88.peeratcode.parser.java; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertNotNull; import static org.junit.jupiter.api.Assertions.assertEquals; import java.io.BufferedReader; import java.io.IOException; import java.io.Reader; +import java.util.Arrays; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; @@ -85,4 +87,27 @@ class SearchTest{ } + @Test + void verifyPath(){ + try { + JavaParser parser = parse("package be.jeffcheasey88.peeratcode.parser.java; class Test{ void function(){ int i = 0; if(i == 0){ this.none();this.yes();this.none(); } valid(); } }"); + + java.lang.Class[] exceptedStack = { Class.class, Function.class, IfOperation.class, MethodCallOperation.class }; + MethodCallOperation element = parser.find( + (e, trace) -> { + if((e instanceof MethodCallOperation) && ((MethodCallOperation)e).getValue().equals("this.yes()")){ + java.lang.Class[] stack = (java.lang.Class[]) trace.stream().map((current) -> current.getClass()).toArray((i) -> new java.lang.Class[i]); + assertArrayEquals(exceptedStack, stack); + return true; + } + return false; + }); + + assertNotNull(element); + } catch (Exception e) { + e.printStackTrace(); + } + + } + }