feat(muscript): port over DirectPreconditionVisitor implicitly
This commit is contained in:
parent
10182e91f0
commit
0d9ca77993
|
@ -6,15 +6,15 @@ import io.gitlab.jfronny.muscript.ast.bool.BoolAssign;
|
|||
import io.gitlab.jfronny.muscript.ast.bool.BoolConditional;
|
||||
import io.gitlab.jfronny.muscript.ast.bool.BoolLiteral;
|
||||
import io.gitlab.jfronny.muscript.ast.bool.BoolUnpack;
|
||||
import io.gitlab.jfronny.muscript.ast.dynamic.DynamicAssign;
|
||||
import io.gitlab.jfronny.muscript.ast.dynamic.DynamicCoerce;
|
||||
import io.gitlab.jfronny.muscript.ast.dynamic.DynamicConditional;
|
||||
import io.gitlab.jfronny.muscript.ast.dynamic.*;
|
||||
import io.gitlab.jfronny.muscript.ast.number.NumberAssign;
|
||||
import io.gitlab.jfronny.muscript.ast.number.NumberConditional;
|
||||
import io.gitlab.jfronny.muscript.ast.number.NumberLiteral;
|
||||
import io.gitlab.jfronny.muscript.ast.number.NumberUnpack;
|
||||
import io.gitlab.jfronny.muscript.ast.string.*;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
public class ExprUtils {
|
||||
public static DynamicExpr asDynamic(Expr expression) {
|
||||
expression = unpack(expression);
|
||||
|
@ -71,4 +71,25 @@ public class ExprUtils {
|
|||
default -> expression;
|
||||
});
|
||||
}
|
||||
|
||||
private static final Set<String> allowedVariables = Set.of("date", "time", "enum", "listOf");
|
||||
public static boolean isDirect(Expr expr) {
|
||||
return switch (expr) {
|
||||
case NullLiteral ignored -> true;
|
||||
case StringLiteral ignored -> true;
|
||||
case NumberLiteral ignored -> true;
|
||||
case BoolLiteral ignored -> true;
|
||||
case DynamicLiteral(var location, var value) -> value.isDirect();
|
||||
case DynamicCoerce(var inner) -> isDirect(inner);
|
||||
case ObjectLiteral(var location, var content) -> content.values().stream().allMatch(ExprUtils::isDirect);
|
||||
case Concatenate(var location, var left, var right) -> isDirect(left) && isDirect(right);
|
||||
case BoolUnpack(var inner) -> isDirect(inner);
|
||||
case NumberUnpack(var inner) -> isDirect(inner);
|
||||
case StringUnpack(var inner) -> isDirect(inner);
|
||||
case Bind(var location, var callable, var parameter) -> isDirect(callable) && isDirect(parameter);
|
||||
case Call(var location, var left, var args) -> isDirect(left) && args.stream().allMatch(a -> !a.variadic() && isDirect(a.value()));
|
||||
case Variable(var location, var name) -> allowedVariables.contains(name);
|
||||
default -> false;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,4 +5,10 @@ package io.gitlab.jfronny.muscript.core;
|
|||
* To be implemented by the parser.
|
||||
*/
|
||||
public interface IDynamic {
|
||||
/**
|
||||
* @return true if the dynamic is a direct dynamic (it is constructed in a pure manner and non-recursively), false otherwise.
|
||||
*/
|
||||
default boolean isDirect() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -108,6 +108,11 @@ public class DFinal {
|
|||
public DType getSignature() {
|
||||
return DTypePrimitive.BOOL;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDirect() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
private record FNumber(double value) implements DNumber, FImpl {
|
||||
|
@ -125,6 +130,11 @@ public class DFinal {
|
|||
public DType getSignature() {
|
||||
return DTypePrimitive.NUMBER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDirect() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
private record FString(String value) implements DString, FImpl {
|
||||
|
@ -142,6 +152,11 @@ public class DFinal {
|
|||
public DType getSignature() {
|
||||
return DTypePrimitive.STRING;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDirect() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
private record FObject(Map<String, Dynamic> value, DTypeObject signature) implements DObject, FImpl {
|
||||
|
@ -159,6 +174,11 @@ public class DFinal {
|
|||
public DType getSignature() {
|
||||
return signature;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDirect() {
|
||||
return value.values().stream().allMatch(Dynamic::isDirect);
|
||||
}
|
||||
}
|
||||
|
||||
private record FList(List<Dynamic> value, DTypeList signature) implements DList, FImpl {
|
||||
|
@ -176,6 +196,11 @@ public class DFinal {
|
|||
public DType getSignature() {
|
||||
return signature;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDirect() {
|
||||
return value.stream().allMatch(Dynamic::isDirect);
|
||||
}
|
||||
}
|
||||
|
||||
private record FCallable(Function<DList, Dynamic> value, Supplier<Expr> gen, String name, DType signature) implements DCallable, FImpl, DynamicBasePlus {
|
||||
|
|
|
@ -18,4 +18,9 @@ public final class DNull implements Dynamic {
|
|||
public String toString() {
|
||||
return "null";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDirect() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue