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.compiler.*;
|
||||||
import io.gitlab.jfronny.muscript.data.Scope;
|
import io.gitlab.jfronny.muscript.data.Scope;
|
||||||
import io.gitlab.jfronny.muscript.data.dynamic.Dynamic;
|
import io.gitlab.jfronny.muscript.data.dynamic.Dynamic;
|
||||||
|
@ -8,11 +8,11 @@ import io.gitlab.jfronny.muscript.error.LocationalException;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
public class Assign extends DynamicExpr {
|
public class DynamicAssign extends DynamicExpr {
|
||||||
private final String name;
|
private final String name;
|
||||||
private final DynamicExpr value;
|
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);
|
super(Order.Primary, chStart, chEnd);
|
||||||
if (name.equals("this")) throw new LocationalException(chStart, chEnd, "Cannot reassign 'this'");
|
if (name.equals("this")) throw new LocationalException(chStart, chEnd, "Cannot reassign 'this'");
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
@ -28,7 +28,7 @@ public class Assign extends DynamicExpr {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DynamicExpr optimize() {
|
public DynamicExpr optimize() {
|
||||||
return new Assign(chStart, chEnd, name, value.optimize());
|
return new DynamicAssign(chStart, chEnd, name, value.optimize());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -37,9 +37,24 @@ public class Assign extends DynamicExpr {
|
||||||
value.decompile(writer);
|
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
|
@Override
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
return obj instanceof Assign assign
|
return obj instanceof DynamicAssign assign
|
||||||
&& name.equals(assign.name)
|
&& name.equals(assign.name)
|
||||||
&& value.equals(assign.value);
|
&& 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.compare.Greater;
|
||||||
import io.gitlab.jfronny.muscript.ast.conditional.UnresolvedConditional;
|
import io.gitlab.jfronny.muscript.ast.conditional.UnresolvedConditional;
|
||||||
import io.gitlab.jfronny.muscript.ast.dynamic.*;
|
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.literal.DynamicLiteral;
|
||||||
import io.gitlab.jfronny.muscript.ast.math.*;
|
import io.gitlab.jfronny.muscript.ast.math.*;
|
||||||
import io.gitlab.jfronny.muscript.ast.string.Concatenate;
|
import io.gitlab.jfronny.muscript.ast.string.Concatenate;
|
||||||
|
@ -289,7 +290,7 @@ public class Parser {
|
||||||
int start = previous.start;
|
int start = previous.start;
|
||||||
int end = previous.current - 1;
|
int end = previous.current - 1;
|
||||||
String name = previous.lexeme;
|
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);
|
else return new Variable(start, end, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package io.gitlab.jfronny.muscript.test;
|
package io.gitlab.jfronny.muscript.test;
|
||||||
|
|
||||||
import io.gitlab.jfronny.muscript.ast.StringExpr;
|
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.ast.literal.StringLiteral;
|
||||||
import io.gitlab.jfronny.muscript.compiler.Parser;
|
import io.gitlab.jfronny.muscript.compiler.Parser;
|
||||||
import io.gitlab.jfronny.muscript.data.Scope;
|
import io.gitlab.jfronny.muscript.data.Scope;
|
||||||
|
@ -15,7 +15,7 @@ class AssignTest {
|
||||||
@Test
|
@Test
|
||||||
void testAssignSimple() {
|
void testAssignSimple() {
|
||||||
StringExpr expr = Parser.parse("someval = 'test'").asStringExpr();
|
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());
|
assertEquals("someval = 'test'", expr.toString());
|
||||||
Scope scope = new UnforkableScope();
|
Scope scope = new UnforkableScope();
|
||||||
assertEquals("test", expr.get(scope));
|
assertEquals("test", expr.get(scope));
|
||||||
|
|
Loading…
Reference in New Issue