public string fixForC(CallNode callNode) { string output = ""; if (callNode is FunctionCallNode) { var fixedNode = (FunctionCallNode)callNode; List <COOPClass> inputs = new List <COOPClass>(); foreach (CallNode parameter in fixedNode.parameters) { inputs.Add(parameter.type); } string parameters = "("; if (callNode is ObjectFunctionCallNode) { ObjectFunctionCallNode node = callNode as ObjectFunctionCallNode; inputs.Insert(0, node.parentObject.type); NameInputTypePair tempPair = new NameInputTypePair(fixedNode.symbol, inputs); while (getMangeledName(tempPair) == null) { inputs[0] = hierarchy.getParent(inputs[0]); if (inputs[0] == null) { return(null); } tempPair = new NameInputTypePair(fixedNode.symbol, inputs); } parameters += fixForC(node.parentObject); if (inputs.Count > 1) { parameters += ","; } } NameInputTypePair pair = new NameInputTypePair(fixedNode.symbol, inputs); for (var i = 0; i < fixedNode.parameters.Count; i++) { parameters += fixForC(fixedNode.parameters[i]); if (i < fixedNode.parameters.Count - 1) { parameters += ","; } } parameters += ")"; string mangled = originalNameAndInputTypesToMangledName[pair]; output = mangled + parameters; } else if (callNode is SymbolNode) { output = callNode.ToString(); } return(output); }