ValueChainBuilder -> CastValue
This commit is contained in:
parent
7ea0ba8878
commit
a2e2361366
3 changed files with 55 additions and 14 deletions
|
@ -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<JavaElement> { //TODO order tree by mo
|
|||
value_array_end.then(value_array);
|
||||
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());
|
||||
operation_call.then(value_name);
|
||||
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;
|
||||
}).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) -> {
|
||||
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");
|
||||
return;
|
||||
}
|
||||
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);
|
||||
StateTree<JavaElement> value_inside_splitter = value_inside.equals(",");
|
||||
|
|
|
@ -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,10 +43,7 @@ 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;
|
||||
}
|
||||
|
||||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue