ValueChainBuilder -> CastValue

This commit is contained in:
jeffcheasey88 2025-04-17 18:46:42 +02:00
parent 7ea0ba8878
commit a2e2361366
3 changed files with 55 additions and 14 deletions

View file

@ -14,6 +14,7 @@ import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.value.ArrayAccessValue; import dev.peerat.parser.java.value.ArrayAccessValue;
import dev.peerat.parser.java.value.ArrayValue; import dev.peerat.parser.java.value.ArrayValue;
import dev.peerat.parser.java.value.BiValue; 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;
import dev.peerat.parser.java.value.LambdaValue.LambdaParameter; import dev.peerat.parser.java.value.LambdaValue.LambdaParameter;
import dev.peerat.parser.java.value.MethodCallValue; import dev.peerat.parser.java.value.MethodCallValue;
@ -146,6 +147,8 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
value_array_end.then(value_array); value_array_end.then(value_array);
value_array_end.equals(".", (bag, token) -> bag.<ValueChainBuilder>get().dot()).then(value_name); value_array_end.equals(".", (bag, token) -> bag.<ValueChainBuilder>get().dot()).then(value_name);
value_instance_array_value_end.then(value_array);
StateTree<JavaElement> operation_call = value_name.equals(".", (bag, token) -> bag.<ValueChainBuilder>get().dot()); StateTree<JavaElement> operation_call = value_name.equals(".", (bag, token) -> bag.<ValueChainBuilder>get().dot());
operation_call.then(value_name); operation_call.then(value_name);
StateTree<JavaElement> operation_begin = value_name.equals("(", (bag, token) -> bag.<ValueChainBuilder>get().parameter()); StateTree<JavaElement> operation_begin = value_name.equals("(", (bag, token) -> bag.<ValueChainBuilder>get().parameter());
@ -162,15 +165,30 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
return true; return true;
}).equals("("); }).equals("(");
StateTree<JavaElement> value_parenthesis_close = value_parenthesis.equals(")"); StateTree<JavaElement> value_parenthesis_close = value_parenthesis.equals(")");
StateTree<JavaElement> value_inside_type = value_parenthesis.redirect(type, (global, local) -> global.set("type", local.get()));
StateTree<JavaElement> value_inside = value_parenthesis.redirect(this.current, (global, local) -> { StateTree<JavaElement> value_inside = value_parenthesis.redirect(this.current, (global, local) -> {
if(local.get() instanceof StaticValue){ if(local.get() instanceof StaticValue){
global.<ValueChainBuilder>get().lambda(new LambdaParameter(global.get("type"), local.<StaticValue>get().getToken())); Token lambdaVariable = local.<StaticValue>get().getToken();
Token lambdaType = global.get("type");
if(lambdaVariable.equals(lambdaType)) lambdaType = null;
global.<ValueChainBuilder>get().lambda(new LambdaParameter(lambdaType, lambdaVariable));
global.remove("type"); global.remove("type");
return; return;
} }
global.set(local.get()); global.set(local.get());
}); });
StateTree<JavaElement> value_inside_type = value_parenthesis.redirect(type, (global, local) -> global.set("type", local.get()));
StateTree<JavaElement> cast = value_inside_type.equals(")").redirect(this.current, (global, local) -> {
global.<ValueChainBuilder>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); value_inside_type.then(value_inside);
StateTree<JavaElement> value_inside_splitter = value_inside.equals(","); StateTree<JavaElement> value_inside_splitter = value_inside.equals(",");

View file

@ -3,20 +3,27 @@ package dev.peerat.parser.java.value;
import java.util.List; import java.util.List;
import java.util.function.Function; import java.util.function.Function;
import dev.peerat.parser.Token;
import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.JavaElement;
import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.VisitorBag; 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){ public CastValue(Token type, Value value){
this.element = element; this.type = type;
this.value = value;
} }
public JavaElement getElement(){ public Token getType(){
return this.element; return this.type;
}
public Value getValue(){
return this.value;
} }
@Override @Override
@ -36,12 +43,9 @@ public class InnerElementValue extends Value{
@Override @Override
public VisitorBag visit(JavaVisitor<?> visitor) { public VisitorBag visit(JavaVisitor<?> visitor) {
if(visitor.canVisit(getClass())) return visitor.visit(this); return null;
VisitorBag bag = new VisitorBag();
bag.merge(this.element.visit(visitor));
return bag;
} }
} }

View file

@ -16,6 +16,7 @@ import dev.peerat.parser.java.tree.JavaTreeType;
import dev.peerat.parser.java.value.ArrayAccessValue; import dev.peerat.parser.java.value.ArrayAccessValue;
import dev.peerat.parser.java.value.ArrayValue; import dev.peerat.parser.java.value.ArrayValue;
import dev.peerat.parser.java.value.BiValue; 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;
import dev.peerat.parser.java.value.MethodCallValue; import dev.peerat.parser.java.value.MethodCallValue;
import dev.peerat.parser.java.value.ModifierValue; import dev.peerat.parser.java.value.ModifierValue;
@ -327,4 +328,22 @@ public class ValueTypesTests {
assertEquals(1, av.getValues().length); assertEquals(1, av.getValues().length);
assertEquals("1", assertInstance(av.getValues()[0], StaticValue.class).getToken().getValue()); 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());
}
} }