private StringBuilder GenerateFunctionDocumentation(TypeDefFunction typeDefFunction) { //When no docs exist if (typeDefFunction.ReturnType.NativeType.Count <= 1 && string.IsNullOrEmpty(typeDefFunction.Description) && typeDefFunction.Parameters.All(p => string.IsNullOrEmpty(p.Description) && string.IsNullOrEmpty(typeDefFunction.ReturnType.Description))) { return(new StringBuilder(string.Empty)); } StringBuilder result = new StringBuilder($"\t\t/// <summary>\n"); if (!string.IsNullOrEmpty(typeDefFunction.Description)) { string[] descriptionLines = typeDefFunction.Description.Split("\n"); foreach (string descriptionLine in descriptionLines) { string sanitizedDescriptionLine = descriptionLine.Replace("/*", string.Empty).Replace("*/", string.Empty).Trim(); result.Append($"\t\t/// {sanitizedDescriptionLine}\n"); } } result.Append("\t\t/// </summary>\n"); //Add @remarks in the future? foreach (var parameter in typeDefFunction.Parameters) { if (!string.IsNullOrEmpty(parameter.Description)) { result.Append($"\t\t/// <param name=\"{GetFixedTypeDefParameterName(parameter.Name)}\">{parameter.Description}</param>\n"); } } //For now build return doc with return type because we dont have strong typed return value for natives returning arrays currently.. //if (!string.IsNullOrEmpty(typeDefFunction.ReturnType.Description)) //{ // result.Append($"\t\t/// <returns>{typeDefFunction.ReturnType.Description}</returns>\n"); //} string returnTypeForTyping = string.Empty; if (typeDefFunction.ReturnType.NativeType.Count > 1) { returnTypeForTyping = "Array<"; for (int i = 0; i < typeDefFunction.ReturnType.NativeType.Count; i++) { returnTypeForTyping += new NativeTypeToCSharpTypingConverter().Convert(null, typeDefFunction.ReturnType.NativeType[i], false); if (i != typeDefFunction.ReturnType.NativeType.Count - 1) { returnTypeForTyping += ", "; } } returnTypeForTyping += ">"; } if (!string.IsNullOrEmpty(typeDefFunction.ReturnType.Description) || !string.IsNullOrEmpty(returnTypeForTyping)) { var returnDescription = $"{returnTypeForTyping} {typeDefFunction.ReturnType.Description}".Trim(); result.Append($"\t\t/// <returns>{returnDescription}</returns>\n"); } return(result); }
private StringBuilder GenerateFunction(TypeDefFunction typeDefFunction) { StringBuilder result = new StringBuilder(string.Empty); if (_generateDocumentation) { result.Append(GenerateFunctionDocumentation(typeDefFunction)); } var fixedTypeDefName = GetFixedTypeDefFunctionName(typeDefFunction.Name); var cSharpReturnType = new NativeReturnTypeToCSharpTypingConverter().Convert(null, typeDefFunction.ReturnType.NativeType); result.Append($"\t\tpublic {cSharpReturnType} {typeDefFunction.Name.FirstCharToUpper()}("); foreach (var parameter in typeDefFunction.Parameters) { result.Append($"{new NativeTypeToCSharpTypingConverter().Convert(null, parameter.NativeType, false)} {GetFixedTypeDefParameterName(parameter.Name)}"); if (typeDefFunction.Parameters.Last() != parameter) { result.Append(", "); } } result.Append($")\n\t\t{{\n"); result.Append($"\t\t\tif ({fixedTypeDefName} == null) {fixedTypeDefName} = (Function) native.GetObjectProperty(\"{typeDefFunction.Name}\");\n"); if (typeDefFunction.ReturnType.Name != "void") { if (typeDefFunction.ReturnType.Name == "any") { result.Append($"\t\t\treturn {fixedTypeDefName}.Call(native"); GenerateCallParameters(result, typeDefFunction); } else if (typeDefFunction.ReturnType.NativeType.Count > 1) { result.Append($"\t\t\tvar results = (Array) {fixedTypeDefName}.Call(native"); GenerateCallParameters(result, typeDefFunction); var returnTypeForTyping = "\t\t\treturn ("; for (var i = 0; i < typeDefFunction.ReturnType.NativeType.Count; i++) { var tupleReturnType = typeDefFunction.ReturnType.NativeType[i]; var cSharpTupleReturnType = new NativeTypeToCSharpTypingConverter().Convert(null, tupleReturnType, false); returnTypeForTyping += TransformReturnValue(cSharpTupleReturnType, $"results[{i}]"); if (i != typeDefFunction.ReturnType.NativeType.Count - 1) { returnTypeForTyping += ", "; } } returnTypeForTyping += ");\n"; result.Append(returnTypeForTyping); } else { var returnValue = new StringBuilder(); returnValue.Append($"{fixedTypeDefName}.Call(native"); GenerateCallParameters(returnValue, typeDefFunction, false); var transformedResult = TransformReturnValue(cSharpReturnType, returnValue.ToString()); result.Append($"\t\t\treturn {transformedResult};\n"); } } else { result.Append($"\t\t\t{fixedTypeDefName}.Call(native"); GenerateCallParameters(result, typeDefFunction); } result.Append($"\t\t}}\n"); return(result); }