muScript: specialize assignment operator
ci/woodpecker/push/woodpecker Pipeline was successful
Details
ci/woodpecker/push/woodpecker Pipeline was successful
Details
This commit is contained in:
parent
c9eb4bf8d3
commit
66fe880575
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Reference in New Issue