diff --git a/src/dev/peerat/parser/java/tree/ValueTree.java b/src/dev/peerat/parser/java/tree/ValueTree.java index ec9f677..1c91fda 100644 --- a/src/dev/peerat/parser/java/tree/ValueTree.java +++ b/src/dev/peerat/parser/java/tree/ValueTree.java @@ -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 { //TODO order tree by mo StateTree redirectRight = new RedirectStateTree<>(this.current, (global, local) -> { global.get().right(local.get()); }); - - StateTree value_instance = unary_value.then((validator) -> { - validator.getBag().set(new ValueChainBuilder()); - return true; - }).equals("new"); - StateTree value_instance_type = value_instance.redirect(type); + + StateTree value_instance = unary_value.equals("new"); + StateTree value_instance_type = value_instance.redirect(type, (global, local) -> global.set("type", local.get())); StateTree value_instance_params = value_instance_type.equals("("); - StateTree value_instance_params_end = value_instance_params.equals(")"); - StateTree value_instance_param = value_instance_params.redirect(this.current); + StateTree value_instance_params_end = value_instance_params.equals(")", (bag, token) -> { + ValueChainBuilder builder = new ValueChainBuilder(); + List 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 value_instance_param = value_instance_params.redirect(this.current, (global, local) -> { + List 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.end(); + value_instance_params_end.end(ValueChainBuilder.build(false)); value_instance_params_end.equals("{") - .end().multiple(class_container) + .end(ValueChainBuilder.build(true)).multiple(class_container) .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end(); StateTree value_instance_array = value_instance_type.equals("["); diff --git a/src/dev/peerat/parser/java/value/InstanceValue.java b/src/dev/peerat/parser/java/value/InstanceValue.java index 507e900..4543fb3 100644 --- a/src/dev/peerat/parser/java/value/InstanceValue.java +++ b/src/dev/peerat/parser/java/value/InstanceValue.java @@ -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 parameters; - public InstanceValue(Token newer, Token token, List parameters){ - this.newer = newer; + private List elements; + private List annotationBuffer; + + public InstanceValue(Token token, List 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 getParameters(){ return this.parameters; } + + public List 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 getAnnotationBuffer(){ + List list = this.annotationBuffer; + this.annotationBuffer = null; + return list; + } @Override public void build(Builder builder) throws Exception { diff --git a/test/dev/peerat/parser/java/ValueTypesTests.java b/test/dev/peerat/parser/java/ValueTypesTests.java index 4b247e4..3ef819f 100644 --- a/test/dev/peerat/parser/java/ValueTypesTests.java +++ b/test/dev/peerat/parser/java/ValueTypesTests.java @@ -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()); + } }