ValueChainBuilder -> InstanceValue

This commit is contained in:
jeffcheasey88 2025-04-21 18:46:10 +02:00
parent a2e2361366
commit 1c44d143e9
3 changed files with 85 additions and 18 deletions

View file

@ -2,7 +2,10 @@ package dev.peerat.parser.java.tree;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Consumer;
@ -15,6 +18,7 @@ import dev.peerat.parser.java.value.ArrayAccessValue;
import dev.peerat.parser.java.value.ArrayValue;
import dev.peerat.parser.java.value.BiValue;
import dev.peerat.parser.java.value.CastValue;
import dev.peerat.parser.java.value.InstanceValue;
import dev.peerat.parser.java.value.LambdaValue;
import dev.peerat.parser.java.value.LambdaValue.LambdaParameter;
import dev.peerat.parser.java.value.MethodCallValue;
@ -52,20 +56,31 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
StateTree<JavaElement> redirectRight = new RedirectStateTree<>(this.current, (global, local) -> {
global.<ValueChainBuilder>get().right(local.get());
});
StateTree<JavaElement> value_instance = unary_value.then((validator) -> {
validator.getBag().set(new ValueChainBuilder());
return true;
}).equals("new");
StateTree<JavaElement> value_instance_type = value_instance.redirect(type);
StateTree<JavaElement> value_instance = unary_value.equals("new");
StateTree<JavaElement> value_instance_type = value_instance.redirect(type, (global, local) -> global.set("type", local.get()));
StateTree<JavaElement> value_instance_params = value_instance_type.equals("(");
StateTree<JavaElement> value_instance_params_end = value_instance_params.equals(")");
StateTree<JavaElement> value_instance_param = value_instance_params.redirect(this.current);
StateTree<JavaElement> value_instance_params_end = value_instance_params.equals(")", (bag, token) -> {
ValueChainBuilder builder = new ValueChainBuilder();
List<Value> parameters = bag.get("params");
builder.rebase(new InstanceValue(bag.get("type"), parameters == null ? new ArrayList<>() : parameters));
bag.remove("type");
bag.remove("params");
bag.set(builder);
});
StateTree<JavaElement> value_instance_param = value_instance_params.redirect(this.current, (global, local) -> {
List<Value> list = global.get("params");
if(list == null){
list = new ArrayList<>();
global.set("params", list);
}
list.add(local.get());
});
value_instance_param.then(value_instance_params_end);
value_instance_param.equals(",").then(value_instance_param);
value_instance_params_end.<JavaElement>end();
value_instance_params_end.<JavaElement>end(ValueChainBuilder.build(false));
value_instance_params_end.equals("{")
.<JavaElement>end().multiple(class_container)
.<JavaElement>end(ValueChainBuilder.build(true)).multiple(class_container)
.unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end();
StateTree<JavaElement> value_instance_array = value_instance_type.equals("[");

View file

@ -1,27 +1,31 @@
package dev.peerat.parser.java.value;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.Annotation.AnnotableBuffer;
import dev.peerat.parser.java.Function.FunctionContainer;
import dev.peerat.parser.java.Annotation;
import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.Variable;
import dev.peerat.parser.java.Variable.VariableContainer;
import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.VisitorBag;
public class InstanceValue extends Value{
public class InstanceValue extends Value implements VariableContainer, FunctionContainer, AnnotableBuffer{ //TODO LIKE A CLASS, CAN CONTAINS CLASS
private Token newer;
private Token token;
private List<Value> parameters;
public InstanceValue(Token newer, Token token, List<Value> parameters){
this.newer = newer;
private List<JavaElement> elements;
private List<Annotation> annotationBuffer;
public InstanceValue(Token token, List<Value> parameters){
this.token = token;
this.parameters = parameters;
}
public Token getNewer(){
return this.newer;
this.elements = new ArrayList<>();
}
public Token getToken(){
@ -31,6 +35,32 @@ public class InstanceValue extends Value{
public List<Value> getParameters(){
return this.parameters;
}
public List<JavaElement> getElements(){
return this.elements;
}
@Override
public void addFunction(dev.peerat.parser.java.Function function){
this.elements.add(function);
}
@Override
public void addVariable(Variable variable){
this.elements.add(variable);
}
@Override
public void addAnnotationBuffer(Annotation annotation){
if(annotationBuffer == null) annotationBuffer = new ArrayList<>();
annotationBuffer.add(annotation);
}
public List<Annotation> getAnnotationBuffer(){
List<Annotation> list = this.annotationBuffer;
this.annotationBuffer = null;
return list;
}
@Override
public void build(Builder builder) throws Exception {

View file

@ -17,6 +17,7 @@ import dev.peerat.parser.java.value.ArrayAccessValue;
import dev.peerat.parser.java.value.ArrayValue;
import dev.peerat.parser.java.value.BiValue;
import dev.peerat.parser.java.value.CastValue;
import dev.peerat.parser.java.value.InstanceValue;
import dev.peerat.parser.java.value.LambdaValue;
import dev.peerat.parser.java.value.MethodCallValue;
import dev.peerat.parser.java.value.ModifierValue;
@ -346,4 +347,25 @@ public class ValueTypesTests {
assertEquals("b", v.getType().getValue());
assertEquals("a", assertInstance(v.getValue(), StaticValue.class).getToken().getValue());
}
@Test
public void onInstanceValue() throws Exception{
InstanceValue v;
v = assertInstance(parse("new String()"), InstanceValue.class);
assertEquals("String", v.getToken().getValue());
assertEquals(0, v.getParameters().size()+v.getElements().size());
v = assertInstance(parse("new String(a)"), InstanceValue.class);
assertEquals("String", v.getToken().getValue());
assertEquals(1, v.getParameters().size());
assertEquals("a", assertInstance(v.getParameters().get(0), StaticValue.class).getToken().getValue());
assertEquals(0, v.getElements().size());
v = assertInstance(parse("new MyClass(){ @Test public void test(){} }"), InstanceValue.class);
assertEquals("MyClass", v.getToken().getValue());
assertEquals(0, v.getParameters().size());
assertEquals(1, v.getElements().size());
dev.peerat.parser.java.Function func = assertInstance(v.getElements().get(0), dev.peerat.parser.java.Function.class);
assertEquals(1, func.getAnnotations().size());
}
}