muScript: specialize assignment operator
ci/woodpecker/push/woodpecker Pipeline was successful Details

This commit is contained in:
Johannes Frohnmeyer 2023-03-13 14:15:36 +01:00
parent c9eb4bf8d3
commit 66fe880575
Signed by: Johannes
GPG Key ID: E76429612C2929F4
6 changed files with 163 additions and 9 deletions

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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));