use of buildcraft.lib.expression.api.INodeFunc.INodeFuncObject 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.INodeFuncObject 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