2022-06-07 13:36:48 +02:00
|
|
|
package io.gitlab.jfronny.muscript.compiler.expr.dynamic;
|
2022-06-03 19:54:31 +02:00
|
|
|
|
2022-06-29 15:41:44 +02:00
|
|
|
import io.gitlab.jfronny.commons.data.dynamic.*;
|
|
|
|
import io.gitlab.jfronny.muscript.compiler.Type;
|
|
|
|
import io.gitlab.jfronny.muscript.compiler.expr.DynamicExpr;
|
|
|
|
import io.gitlab.jfronny.muscript.compiler.expr.Expr;
|
2022-06-13 13:31:54 +02:00
|
|
|
import io.gitlab.jfronny.muscript.compiler.expr.annotations.*;
|
2022-06-29 15:41:44 +02:00
|
|
|
import io.gitlab.jfronny.muscript.error.TypeMismatchException;
|
2022-06-03 19:54:31 +02:00
|
|
|
|
2022-06-29 15:41:44 +02:00
|
|
|
@CanThrow
|
|
|
|
@UncheckedDynamic
|
2022-06-07 13:36:48 +02:00
|
|
|
public class Get extends DynamicExpr {
|
2022-06-07 12:19:58 +02:00
|
|
|
private final DynamicExpr left;
|
2022-06-03 19:54:31 +02:00
|
|
|
private final Expr<?> name;
|
|
|
|
|
2022-06-13 13:31:54 +02:00
|
|
|
public Get(int character, DynamicExpr left, Expr<?> name) {
|
|
|
|
super(character);
|
2022-06-03 19:54:31 +02:00
|
|
|
this.left = left;
|
|
|
|
this.name = name;
|
2022-06-07 12:19:58 +02:00
|
|
|
if (name.getResultType() != Type.String && name.getResultType() != Type.Number && name.getResultType() != Type.Dynamic) {
|
2022-06-13 13:31:54 +02:00
|
|
|
throw new TypeMismatchException(character, Type.String, name.getResultType(), "Name must be either a string or a number");
|
2022-06-03 19:54:31 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2022-06-13 13:31:54 +02:00
|
|
|
public Dynamic<?> get(Dynamic<?> dataRoot) {
|
|
|
|
Dynamic<?> left = this.left.get(dataRoot);
|
2022-06-07 12:19:58 +02:00
|
|
|
if (left instanceof DObject o) {
|
2022-06-13 13:31:54 +02:00
|
|
|
return o.get(name.asStringExpr().get(dataRoot));
|
2022-06-07 12:19:58 +02:00
|
|
|
} else if (left instanceof DList l) {
|
2022-06-13 13:31:54 +02:00
|
|
|
return l.get(name.asNumberExpr().get(dataRoot).intValue());
|
2022-06-03 19:54:31 +02:00
|
|
|
}
|
2022-06-13 13:31:54 +02:00
|
|
|
throw new DynamicTypeConversionException("object or list").locational(character);
|
2022-06-03 19:54:31 +02:00
|
|
|
}
|
2022-06-29 17:38:05 +02:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public DynamicExpr optimize() {
|
|
|
|
DynamicExpr left = this.left.optimize();
|
|
|
|
Expr<?> name = this.name.optimize();
|
|
|
|
return new Get(character, left, name);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean equals(Object obj) {
|
|
|
|
return obj instanceof Get get && left.equals(get.left) && name.equals(get.name);
|
|
|
|
}
|
2022-06-03 19:54:31 +02:00
|
|
|
}
|