From a2e2361366325a46cd7e5e48b94025b213255480 Mon Sep 17 00:00:00 2001 From: jeffcheasey88 <66554203+jeffcheasey88@users.noreply.github.com> Date: Thu, 17 Apr 2025 18:46:42 +0200 Subject: [PATCH] ValueChainBuilder -> CastValue --- .../peerat/parser/java/tree/ValueTree.java | 22 +++++++++++++-- ...{InnerElementValue.java => CastValue.java} | 28 +++++++++++-------- .../peerat/parser/java/ValueTypesTests.java | 19 +++++++++++++ 3 files changed, 55 insertions(+), 14 deletions(-) rename src/dev/peerat/parser/java/value/{InnerElementValue.java => CastValue.java} (63%) diff --git a/src/dev/peerat/parser/java/tree/ValueTree.java b/src/dev/peerat/parser/java/tree/ValueTree.java index 8b9b666..ec9f677 100644 --- a/src/dev/peerat/parser/java/tree/ValueTree.java +++ b/src/dev/peerat/parser/java/tree/ValueTree.java @@ -14,6 +14,7 @@ import dev.peerat.parser.java.JavaElement; 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.LambdaValue; import dev.peerat.parser.java.value.LambdaValue.LambdaParameter; import dev.peerat.parser.java.value.MethodCallValue; @@ -146,6 +147,8 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo value_array_end.then(value_array); value_array_end.equals(".", (bag, token) -> bag.get().dot()).then(value_name); + value_instance_array_value_end.then(value_array); + StateTree operation_call = value_name.equals(".", (bag, token) -> bag.get().dot()); operation_call.then(value_name); StateTree operation_begin = value_name.equals("(", (bag, token) -> bag.get().parameter()); @@ -162,15 +165,30 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo return true; }).equals("("); StateTree value_parenthesis_close = value_parenthesis.equals(")"); + + StateTree value_inside_type = value_parenthesis.redirect(type, (global, local) -> global.set("type", local.get())); + StateTree value_inside = value_parenthesis.redirect(this.current, (global, local) -> { if(local.get() instanceof StaticValue){ - global.get().lambda(new LambdaParameter(global.get("type"), local.get().getToken())); + Token lambdaVariable = local.get().getToken(); + Token lambdaType = global.get("type"); + if(lambdaVariable.equals(lambdaType)) lambdaType = null; + global.get().lambda(new LambdaParameter(lambdaType, lambdaVariable)); global.remove("type"); return; } global.set(local.get()); }); - StateTree value_inside_type = value_parenthesis.redirect(type, (global, local) -> global.set("type", local.get())); + + StateTree cast = value_inside_type.equals(")").redirect(this.current, (global, local) -> { + global.get().rebase(new CastValue(global.get("type"), local.get())); + global.remove("type"); + }); + + + cast.end(ValueChainBuilder.build(false)); + cast.equals(".").then(value_name); + cast.then(value_array); value_inside_type.then(value_inside); StateTree value_inside_splitter = value_inside.equals(","); diff --git a/src/dev/peerat/parser/java/value/InnerElementValue.java b/src/dev/peerat/parser/java/value/CastValue.java similarity index 63% rename from src/dev/peerat/parser/java/value/InnerElementValue.java rename to src/dev/peerat/parser/java/value/CastValue.java index b3cd885..a80e7c6 100644 --- a/src/dev/peerat/parser/java/value/InnerElementValue.java +++ b/src/dev/peerat/parser/java/value/CastValue.java @@ -3,20 +3,27 @@ package dev.peerat.parser.java.value; import java.util.List; import java.util.function.Function; +import dev.peerat.parser.Token; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.visitor.VisitorBag; -public class InnerElementValue extends Value{ +public class CastValue extends Value{ - private JavaElement element; + private Token type; + private Value value; - public InnerElementValue(JavaElement element){ - this.element = element; + public CastValue(Token type, Value value){ + this.type = type; + this.value = value; } - public JavaElement getElement(){ - return this.element; + public Token getType(){ + return this.type; + } + + public Value getValue(){ + return this.value; } @Override @@ -36,12 +43,9 @@ public class InnerElementValue extends Value{ @Override public VisitorBag visit(JavaVisitor visitor) { - if(visitor.canVisit(getClass())) return visitor.visit(this); - VisitorBag bag = new VisitorBag(); - bag.merge(this.element.visit(visitor)); - return bag; + return null; } + + - - } diff --git a/test/dev/peerat/parser/java/ValueTypesTests.java b/test/dev/peerat/parser/java/ValueTypesTests.java index 675c41e..4b247e4 100644 --- a/test/dev/peerat/parser/java/ValueTypesTests.java +++ b/test/dev/peerat/parser/java/ValueTypesTests.java @@ -16,6 +16,7 @@ import dev.peerat.parser.java.tree.JavaTreeType; 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.LambdaValue; import dev.peerat.parser.java.value.MethodCallValue; import dev.peerat.parser.java.value.ModifierValue; @@ -327,4 +328,22 @@ public class ValueTypesTests { assertEquals(1, av.getValues().length); assertEquals("1", assertInstance(av.getValues()[0], StaticValue.class).getToken().getValue()); } + + @Test + public void onCastValue() throws Exception{ + CastValue v; + v = assertInstance(parse("(int)a"), CastValue.class); + assertEquals("int", v.getType().getValue()); + assertEquals("a", assertInstance(v.getValue(), StaticValue.class).getToken().getValue()); + + v = assertInstance(parse("((b)a)"), CastValue.class); + assertEquals("b", v.getType().getValue()); + assertEquals("a", assertInstance(v.getValue(), StaticValue.class).getToken().getValue()); + + v = assertInstance(parse("( (c) ((b)a) )"), CastValue.class); + assertEquals("c", v.getType().getValue()); + v = assertInstance(v.getValue(), CastValue.class); + assertEquals("b", v.getType().getValue()); + assertEquals("a", assertInstance(v.getValue(), StaticValue.class).getToken().getValue()); + } }