use of buildcraft.lib.expression.api.INodeFunc in project BuildCraft by BuildCraft.
the class FunctionContext method getVariable.
// Variable getter/setters
public IExpressionNode getVariable(String name) {
name = name.toLowerCase(Locale.ROOT);
IExpressionNode current = variables.get(name);
if (current != null) {
return current;
}
for (FunctionContext parent : parents) {
IExpressionNode node = parent.getVariable(name);
if (node != null)
return node;
}
INodeFunc func = getFunction(name, Collections.emptyList());
if (func != null) {
try {
return func.getNode(new NodeStack());
} catch (InvalidExpressionException e) {
throw new IllegalStateException("Found a 0-args function that didn't allow us to get a node for it!", e);
}
}
return null;
}
use of buildcraft.lib.expression.api.INodeFunc in project BuildCraft by BuildCraft.
the class InternalCompiler method addParentFunctions.
private static String addParentFunctions(FunctionContext context) {
String vars = "";
List<String> allFunctions = new ArrayList<>();
allFunctions.addAll(context.getAllFunctions().keySet());
allFunctions.sort(Comparator.naturalOrder());
if (!allFunctions.isEmpty()) {
if (!context.name.isEmpty()) {
vars += "\n" + context.name + ":";
}
for (String fnName : allFunctions) {
Map<List<Class<?>>, INodeFunc> functions = context.getFunctions(fnName);
for (Map.Entry<List<Class<?>>, INodeFunc> entry : functions.entrySet()) {
String args = "";
for (Class<?> arg : entry.getKey()) {
if (args.length() > 0) {
args += ", ";
}
args += NodeTypes.getName(arg);
}
INodeFunc function = entry.getValue();
String ret;
if (function instanceof INodeFuncBoolean) {
ret = NodeTypes.getName(boolean.class);
} else if (function instanceof INodeFuncDouble) {
ret = NodeTypes.getName(double.class);
} else if (function instanceof INodeFuncLong) {
ret = NodeTypes.getName(long.class);
} else {
ret = NodeTypes.getName(((INodeFuncObject<?>) function).getType());
}
vars += "\n " + fnName + "(" + args + ") -> " + ret;
}
}
}
for (FunctionContext parent : context.getParents()) {
vars += addParentFunctions(parent);
}
return vars;
}
use of buildcraft.lib.expression.api.INodeFunc in project BuildCraft by BuildCraft.
the class NodeCasting method castToType.
public static IExpressionNode castToType(IExpressionNode node, Class<?> to) throws InvalidExpressionException {
Class<?> from = NodeTypes.getType(node);
if (from == to) {
return node;
}
FunctionContext castingContext = new FunctionContext(NodeTypes.getContext(from), NodeTypes.getContext(to));
INodeFunc caster = castingContext.getFunction("(" + NodeTypes.getName(to) + ")", Collections.singletonList(from));
if (caster == null) {
if (to == String.class) {
return new NodeCastToString(node);
}
throw new InvalidExpressionException("Cannot cast from " + NodeTypes.getName(from) + " to " + NodeTypes.getName(to));
}
NodeStack stack = new NodeStack(node);
stack.setRecorder(Collections.singletonList(from), caster);
IExpressionNode casted = caster.getNode(stack);
stack.checkAndRemoveRecorder();
Class<?> actual = NodeTypes.getType(casted);
if (actual != to) {
throw new IllegalStateException("The caster " + caster + " didn't produce the correct result! (Expected " + to + ", but got " + actual + ")");
}
return casted;
}
use of buildcraft.lib.expression.api.INodeFunc in project BuildCraft by BuildCraft.
the class NodeCasting method castToDouble.
public static INodeDouble castToDouble(IExpressionNode node) throws InvalidExpressionException {
if (node instanceof INodeDouble) {
return (INodeDouble) node;
}
Class<?> type = NodeTypes.getType(node);
FunctionContext ctx = NodeTypes.getContext(type);
if (ctx == null) {
throw new InvalidExpressionException("Cannot cast " + node + " to a double!");
}
INodeFunc func = ctx.getFunction("(double)", Collections.singletonList(type));
if (func == null || NodeTypes.getType(func) != double.class) {
throw new InvalidExpressionException("Cannot cast " + node + " to a double!");
}
return (INodeDouble) func.getNode(new NodeStack(node));
}
use of buildcraft.lib.expression.api.INodeFunc in project BuildCraft by BuildCraft.
the class NodeCasting method castToObject.
public static <T> INodeFuncObject<T> castToObject(INodeFunc func, Class<T> to) throws InvalidExpressionException {
Class<?> from = NodeTypes.getType(func);
if (from == to) {
return (INodeFuncObject<T>) func;
}
FunctionContext castingContext = new FunctionContext(NodeTypes.getContext(from), NodeTypes.getContext(to));
INodeFunc caster = castingContext.getFunction("(" + NodeTypes.getName(to) + ")", Collections.singletonList(from));
if (caster == null) {
if (to == String.class) {
return (INodeFuncObject<T>) castToString(func);
}
throw new InvalidExpressionException("Cannot cast from " + NodeTypes.getName(from) + " to " + NodeTypes.getName(to));
}
return new INodeFuncObject<T>() {
@Override
public INodeObject<T> getNode(INodeStack stack) throws InvalidExpressionException {
return (INodeObject<T>) caster.getNode(new NodeStack(func.getNode(stack)));
}
@Override
public Class<T> getType() {
return to;
}
};
}
Aggregations