diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/dynamic/assign/BoolAssign.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/dynamic/assign/BoolAssign.java new file mode 100644 index 0000000..1f35553 --- /dev/null +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/dynamic/assign/BoolAssign.java @@ -0,0 +1,46 @@ +package io.gitlab.jfronny.muscript.ast.dynamic.assign; + +import io.gitlab.jfronny.muscript.ast.BoolExpr; +import io.gitlab.jfronny.muscript.compiler.ExprWriter; +import io.gitlab.jfronny.muscript.compiler.Order; +import io.gitlab.jfronny.muscript.data.Scope; +import io.gitlab.jfronny.muscript.error.LocationalException; + +import java.io.IOException; + +public class BoolAssign extends BoolExpr { + private final String name; + private final BoolExpr value; + + protected BoolAssign(int chStart, int chEnd, String name, BoolExpr value) { + super(Order.Primary, chStart, chEnd); + if (name.equals("this")) throw new LocationalException(chStart, chEnd, "Cannot reassign 'this'"); + this.name = name; + this.value = value; + } + + @Override + public Boolean get(Scope dataRoot) { + boolean data = value.get(dataRoot); + dataRoot.set(name, data); + return data; + } + + @Override + public BoolExpr optimize() { + return new BoolAssign(chStart, chEnd, name, value.optimize()); + } + + @Override + public void decompile(ExprWriter writer) throws IOException { + writer.appendLiteral(name).append(" = "); + value.decompile(writer); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof BoolAssign assign + && name.equals(assign.name) + && value.equals(assign.value); + } +} diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/dynamic/Assign.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/dynamic/assign/DynamicAssign.java similarity index 58% rename from muscript/src/main/java/io/gitlab/jfronny/muscript/ast/dynamic/Assign.java rename to muscript/src/main/java/io/gitlab/jfronny/muscript/ast/dynamic/assign/DynamicAssign.java index ca9fcfb..ec505a9 100644 --- a/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/dynamic/Assign.java +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/dynamic/assign/DynamicAssign.java @@ -1,6 +1,6 @@ -package io.gitlab.jfronny.muscript.ast.dynamic; +package io.gitlab.jfronny.muscript.ast.dynamic.assign; -import io.gitlab.jfronny.muscript.ast.DynamicExpr; +import io.gitlab.jfronny.muscript.ast.*; import io.gitlab.jfronny.muscript.compiler.*; import io.gitlab.jfronny.muscript.data.Scope; import io.gitlab.jfronny.muscript.data.dynamic.Dynamic; @@ -8,11 +8,11 @@ import io.gitlab.jfronny.muscript.error.LocationalException; import java.io.IOException; -public class Assign extends DynamicExpr { +public class DynamicAssign extends DynamicExpr { private final String name; private final DynamicExpr value; - public Assign(int chStart, int chEnd, String name, DynamicExpr value) { + public DynamicAssign(int chStart, int chEnd, String name, DynamicExpr value) { super(Order.Primary, chStart, chEnd); if (name.equals("this")) throw new LocationalException(chStart, chEnd, "Cannot reassign 'this'"); this.name = name; @@ -28,7 +28,7 @@ public class Assign extends DynamicExpr { @Override public DynamicExpr optimize() { - return new Assign(chStart, chEnd, name, value.optimize()); + return new DynamicAssign(chStart, chEnd, name, value.optimize()); } @Override @@ -37,9 +37,24 @@ public class Assign extends DynamicExpr { value.decompile(writer); } + @Override + public BoolExpr asBoolExpr() { + return new BoolAssign(chStart, chEnd, name, value.asBoolExpr()); + } + + @Override + public StringExpr asStringExpr() { + return new StringAssign(chStart, chEnd, name, value.asStringExpr()); + } + + @Override + public NumberExpr asNumberExpr() { + return new NumberAssign(chStart, chEnd, name, value.asNumberExpr()); + } + @Override public boolean equals(Object obj) { - return obj instanceof Assign assign + return obj instanceof DynamicAssign assign && name.equals(assign.name) && value.equals(assign.value); } diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/dynamic/assign/NumberAssign.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/dynamic/assign/NumberAssign.java new file mode 100644 index 0000000..06aa56d --- /dev/null +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/dynamic/assign/NumberAssign.java @@ -0,0 +1,46 @@ +package io.gitlab.jfronny.muscript.ast.dynamic.assign; + +import io.gitlab.jfronny.muscript.ast.NumberExpr; +import io.gitlab.jfronny.muscript.compiler.ExprWriter; +import io.gitlab.jfronny.muscript.compiler.Order; +import io.gitlab.jfronny.muscript.data.Scope; +import io.gitlab.jfronny.muscript.error.LocationalException; + +import java.io.IOException; + +public class NumberAssign extends NumberExpr { + private final String name; + private final NumberExpr value; + + protected NumberAssign(int chStart, int chEnd, String name, NumberExpr value) { + super(Order.Primary, chStart, chEnd); + if (name.equals("this")) throw new LocationalException(chStart, chEnd, "Cannot reassign 'this'"); + this.name = name; + this.value = value; + } + + @Override + public Double get(Scope dataRoot) { + double data = value.get(dataRoot); + dataRoot.set(name, data); + return data; + } + + @Override + public NumberExpr optimize() { + return new NumberAssign(chStart, chEnd, name, value.optimize()); + } + + @Override + public void decompile(ExprWriter writer) throws IOException { + writer.appendLiteral(name).append(" = "); + value.decompile(writer); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof NumberAssign assign + && name.equals(assign.name) + && value.equals(assign.value); + } +} diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/dynamic/assign/StringAssign.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/dynamic/assign/StringAssign.java new file mode 100644 index 0000000..b303c46 --- /dev/null +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/ast/dynamic/assign/StringAssign.java @@ -0,0 +1,46 @@ +package io.gitlab.jfronny.muscript.ast.dynamic.assign; + +import io.gitlab.jfronny.muscript.ast.StringExpr; +import io.gitlab.jfronny.muscript.compiler.ExprWriter; +import io.gitlab.jfronny.muscript.compiler.Order; +import io.gitlab.jfronny.muscript.data.Scope; +import io.gitlab.jfronny.muscript.error.LocationalException; + +import java.io.IOException; + +public class StringAssign extends StringExpr { + private final String name; + private final StringExpr value; + + protected StringAssign(int chStart, int chEnd, String name, StringExpr value) { + super(Order.Primary, chStart, chEnd); + if (name.equals("this")) throw new LocationalException(chStart, chEnd, "Cannot reassign 'this'"); + this.name = name; + this.value = value; + } + + @Override + public String get(Scope dataRoot) { + String data = value.get(dataRoot); + dataRoot.set(name, data); + return data; + } + + @Override + public StringExpr optimize() { + return new StringAssign(chStart, chEnd, name, value.optimize()); + } + + @Override + public void decompile(ExprWriter writer) throws IOException { + writer.appendLiteral(name).append(" = "); + value.decompile(writer); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof StringAssign assign + && name.equals(assign.name) + && value.equals(assign.value); + } +} diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/compiler/Parser.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/compiler/Parser.java index ec3c333..f6adb87 100644 --- a/muscript/src/main/java/io/gitlab/jfronny/muscript/compiler/Parser.java +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/compiler/Parser.java @@ -6,6 +6,7 @@ import io.gitlab.jfronny.muscript.ast.compare.Equal; import io.gitlab.jfronny.muscript.ast.compare.Greater; import io.gitlab.jfronny.muscript.ast.conditional.UnresolvedConditional; import io.gitlab.jfronny.muscript.ast.dynamic.*; +import io.gitlab.jfronny.muscript.ast.dynamic.assign.DynamicAssign; import io.gitlab.jfronny.muscript.ast.literal.DynamicLiteral; import io.gitlab.jfronny.muscript.ast.math.*; import io.gitlab.jfronny.muscript.ast.string.Concatenate; @@ -289,7 +290,7 @@ public class Parser { int start = previous.start; int end = previous.current - 1; String name = previous.lexeme; - if (match(Token.Assign)) return new Assign(start, end, name, expression().asDynamicExpr()); + if (match(Token.Assign)) return new DynamicAssign(start, end, name, expression().asDynamicExpr()); else return new Variable(start, end, name); } diff --git a/muscript/src/test/java/io/gitlab/jfronny/muscript/test/AssignTest.java b/muscript/src/test/java/io/gitlab/jfronny/muscript/test/AssignTest.java index 3a83ae7..1c22c9c 100644 --- a/muscript/src/test/java/io/gitlab/jfronny/muscript/test/AssignTest.java +++ b/muscript/src/test/java/io/gitlab/jfronny/muscript/test/AssignTest.java @@ -1,7 +1,7 @@ package io.gitlab.jfronny.muscript.test; import io.gitlab.jfronny.muscript.ast.StringExpr; -import io.gitlab.jfronny.muscript.ast.dynamic.Assign; +import io.gitlab.jfronny.muscript.ast.dynamic.assign.DynamicAssign; import io.gitlab.jfronny.muscript.ast.literal.StringLiteral; import io.gitlab.jfronny.muscript.compiler.Parser; import io.gitlab.jfronny.muscript.data.Scope; @@ -15,7 +15,7 @@ class AssignTest { @Test void testAssignSimple() { StringExpr expr = Parser.parse("someval = 'test'").asStringExpr(); - assertEquals(new Assign(0, 6, "someval", new StringLiteral(10, 15, "test").asDynamicExpr()).asStringExpr(), expr); + assertEquals(new DynamicAssign(0, 6, "someval", new StringLiteral(10, 15, "test").asDynamicExpr()).asStringExpr(), expr); assertEquals("someval = 'test'", expr.toString()); Scope scope = new UnforkableScope(); assertEquals("test", expr.get(scope));