48 lines
2.3 KiB
Java
48 lines
2.3 KiB
Java
package io.gitlab.jfronny.muscript.data.dynamic.additional;
|
|
|
|
import io.gitlab.jfronny.muscript.ast.*;
|
|
import io.gitlab.jfronny.muscript.ast.dynamic.*;
|
|
import io.gitlab.jfronny.muscript.ast.literal.*;
|
|
import io.gitlab.jfronny.muscript.ast.string.Concatenate;
|
|
import io.gitlab.jfronny.muscript.data.dynamic.*;
|
|
|
|
import java.util.Set;
|
|
|
|
public class DirectPreconditionVisitor {
|
|
public static boolean visit(Expr<?> expr) {
|
|
//TODO replace this with switch pattern matching
|
|
if (expr instanceof BoolLiteral) return true;
|
|
if (expr instanceof NullLiteral) return true;
|
|
if (expr instanceof NumberLiteral) return true;
|
|
if (expr instanceof StringLiteral) return true;
|
|
if (expr instanceof DynamicLiteral<?> e) return visit(e.value);
|
|
if (expr instanceof DynamicCoerce e) return visit(e.inner);
|
|
if (expr instanceof ObjectLiteral e) return e.content.values().stream().allMatch(DirectPreconditionVisitor::visit);
|
|
if (expr instanceof Concatenate e) return visit(e.left) && visit(e.right);
|
|
// if (expr instanceof BoolUnpack e) return visit(e.inner);
|
|
// if (expr instanceof NumberUnpack e) return visit(e.inner);
|
|
// if (expr instanceof StringUnpack e) return visit(e.inner);
|
|
if (expr instanceof Bind e) return visitCallable(e.callable) && visit(e.parameter);
|
|
if (expr instanceof Call e) return visitCallable(e.left) && e.args.stream().allMatch(a -> !a.variadic() && visit(a.expr()));
|
|
return false; // unknown expression
|
|
}
|
|
|
|
public static boolean visit(Dynamic dynamic) {
|
|
if (dynamic instanceof DNull) return true;
|
|
if (dynamic instanceof DFinal.FImpl) {
|
|
if (dynamic instanceof DBool) return true;
|
|
if (dynamic instanceof DNumber) return true;
|
|
if (dynamic instanceof DString) return true;
|
|
if (dynamic instanceof DObject ob) return ob.getValue().values().stream().allMatch(DirectPreconditionVisitor::visit);
|
|
if (dynamic instanceof DList ob) return ob.getValue().stream().allMatch(DirectPreconditionVisitor::visit);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private static final Set<String> allowedVariables = Set.of("date", "time", "enum", "listOf");
|
|
private static boolean visitCallable(DynamicExpr expr) {
|
|
if (expr instanceof Variable v) return allowedVariables.contains(v.name);
|
|
return false;
|
|
}
|
|
}
|