feat(muscript): port over DirectPreconditionVisitor implicitly

This commit is contained in:
Johannes Frohnmeyer 2024-04-07 15:55:45 +02:00
parent 10182e91f0
commit 0d9ca77993
Signed by: Johannes
GPG Key ID: E76429612C2929F4
4 changed files with 60 additions and 3 deletions

View File

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

View File

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

View File

@ -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 {

View File

@ -18,4 +18,9 @@ public final class DNull implements Dynamic {
public String toString() {
return "null";
}
@Override
public boolean isDirect() {
return true;
}
}