Util -> Find -> Fix trace

This commit is contained in:
jeffcheasey88 2023-06-01 21:53:21 +02:00
parent da87230afc
commit a937f119ae
8 changed files with 47 additions and 2 deletions

View file

@ -113,22 +113,26 @@ public class Class extends JavaElement{
public <E extends JavaElement> E find(java.util.function.Function<JavaElement, Boolean> search, java.util.function.Function<List<JavaElement>, Boolean> deep, List<JavaElement> 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 extends JavaElement> E find(BiFunction<JavaElement, List<JavaElement>, Boolean> search, List<JavaElement> 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;
}
}

View file

@ -136,16 +136,20 @@ public class Variable extends JavaElement{
public <E extends JavaElement> E find(java.util.function.Function<JavaElement, Boolean> search, java.util.function.Function<List<JavaElement>, Boolean> deep, List<JavaElement> 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 extends JavaElement> E find(BiFunction<JavaElement, List<JavaElement>, Boolean> search, List<JavaElement> trace){
trace.add(this);
int index = trace.size()-1;
if(search.apply(this, trace)) return (E)this;
//value
trace.remove(index);
return null;
}

View file

@ -39,16 +39,20 @@ public class AssigmentOperation extends JavaElement{
public <E extends JavaElement> E find(java.util.function.Function<JavaElement, Boolean> search, java.util.function.Function<List<JavaElement>, Boolean> deep, List<JavaElement> 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 extends JavaElement> E find(BiFunction<JavaElement, List<JavaElement>, Boolean> search, List<JavaElement> trace){
trace.add(this);
int index = trace.size()-1;
if(search.apply(this, trace)) return (E)this;
//value
trace.remove(index);
return null;
}
}

View file

@ -39,7 +39,7 @@ public class LoopAffectOperation extends JavaElement{
@Override
public <E extends JavaElement> E find(BiFunction<JavaElement, List<JavaElement>, Boolean> search, List<JavaElement> 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{

View file

@ -47,6 +47,6 @@ public class MethodCallOperation extends JavaElement{
@Override
public <E extends JavaElement> E find(BiFunction<JavaElement, List<JavaElement>, Boolean> search, List<JavaElement> 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;
}
}

View file

@ -71,22 +71,26 @@ public abstract class OperationContainer extends JavaElement{
public <E extends JavaElement> E find(java.util.function.Function<JavaElement, Boolean> search, java.util.function.Function<List<JavaElement>, Boolean> deep, List<JavaElement> 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 extends JavaElement> E find(BiFunction<JavaElement, List<JavaElement>, Boolean> search, List<JavaElement> 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;
}
}

View file

@ -53,18 +53,22 @@ public class ReturnOperation extends JavaElement{
public <E extends JavaElement> E find(java.util.function.Function<JavaElement, Boolean> search, java.util.function.Function<List<JavaElement>, Boolean> deep, List<JavaElement> 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 extends JavaElement> E find(BiFunction<JavaElement, List<JavaElement>, Boolean> search, List<JavaElement> 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;
}

View file

@ -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();
}
}
}