private StringBuilder GenerateFunctionDocumentation(TypeDefFunction typeDefFunction) { //When no docs exist if (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/**\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* {sanitizedDescriptionLine}\n"); } } //Add @remarks in the future? foreach (var parameter in typeDefFunction.Parameters) { if (!string.IsNullOrEmpty(parameter.Description)) { result.Append($"\t* @param {parameter.Name} {parameter.Description}\n"); } } if (!string.IsNullOrEmpty(typeDefFunction.ReturnType.Description)) { result.Append($"\t* @returns {typeDefFunction.ReturnType.Description}\n"); } result.Append("\t*/\n"); return(result); }
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 void GenerateCallParameters(StringBuilder result, TypeDefFunction typeDefFunction, bool closeFunction = true) { foreach (var parameter in typeDefFunction.Parameters) { if (typeDefFunction.Parameters.First() == parameter) { result.Append(", "); } result.Append($"{GetFixedTypeDefParameterName(parameter.Name)}"); if (typeDefFunction.Parameters.Last() != parameter) { result.Append(", "); } } result.Append(closeFunction ? $");\n" : ")"); }
private StringBuilder GenerateFunction(TypeDefFunction typeDefFunction) { StringBuilder result = new StringBuilder(string.Empty); if (_generateDocumentation) { result.Append(GenerateFunctionDocumentation(typeDefFunction)); } result.Append($"\texport function {typeDefFunction.Name}("); foreach (var parameter in typeDefFunction.Parameters) { result.Append($"{parameter.Name}: {parameter.Type}"); if (typeDefFunction.Parameters.Last() != parameter) { result.Append(", "); } } result.Append($"): {typeDefFunction.ReturnType.Name};"); 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"); } else if (typeDefFunction.ReturnType.Name == "Vector3") { result.Append($"\t\t\var vectorObj = (JSObject) {fixedTypeDefName}.Call(native"); result.Append($"\t\t\return new Vector3((float) vectorObj.GetObjectProperty(\"x\"), (float) vectorObj.GetObjectProperty(\"y\"),(float) vectorObj.GetObjectProperty(\"z\"));"); } else if (typeDefFunction.ReturnType.NativeType.Count > 1) { result.Append($"\t\t\var results = (Array) {fixedTypeDefName}.Call(native"); var returnTypeForTyping = "return ("; for (int i = 0; i < typeDefFunction.ReturnType.NativeType.Count; i++) { returnTypeForTyping += $"({new NativeTypeToCSharpTypingConverter().Convert(null, typeDefFunction.ReturnType.NativeType[i], false)}) results[{i}]"; if (i != typeDefFunction.ReturnType.NativeType.Count - 1) { returnTypeForTyping += ", "; } } returnTypeForTyping += ");"; result.Append(returnTypeForTyping); } else { result.Append($"\t\t\treturn ({cSharpReturnType}) {fixedTypeDefName}.Call(native"); } } else { result.Append($"\t\t\t{fixedTypeDefName}.Call(native"); } foreach (var parameter in typeDefFunction.Parameters) { if (typeDefFunction.Parameters.First() == parameter) { result.Append(", "); } result.Append($"{GetFixedTypeDefParameterName(parameter.Name)}"); if (typeDefFunction.Parameters.Last() != parameter) { result.Append(", "); } } result.Append($");\n"); result.Append($"\t\t}}\n"); return(result); }
private List <TypeDefFunction> GetFunctionsFromNativeGroup(Dictionary <string, Native> nativeGroup) { NativeTypeToTypingConverter nativeTypeToTypingConverter = new NativeTypeToTypingConverter(); NativeReturnTypeToTypingConverter nativeReturnTypeToTypingConverter = new NativeReturnTypeToTypingConverter(); //TODO: Add possibility to override certain properties of retrieved native function (for example override param type etc.) List <TypeDefFunction> functions = new List <TypeDefFunction>(); foreach (Native native in nativeGroup.Values.Where(native => native.AltFunctionName != string.Empty && native.Hashes != null && native.Hashes.Count != 0)) { //Prepare for docs List <string> nativeCommentLines = native.Comment.Split("\n").ToList(); //Try resolving return type description string foundReturnTypeDescription = string.Empty; if (_tryResolveDocs) { if (nativeCommentLines.Any(l => l.ToLower().Contains("returns"))) { foundReturnTypeDescription = nativeCommentLines.FirstOrDefault(l => l.ToLower().Contains("returns")); nativeCommentLines.Remove(foundReturnTypeDescription); } } //Remove blank lines nativeCommentLines.RemoveAll(l => l.Trim().Length == 0); //Remove * at line beginnings for (var i = 0; i < nativeCommentLines.Count; i++) { if (nativeCommentLines[i].StartsWith("* ")) { nativeCommentLines[i] = nativeCommentLines[i].ReplaceFirst("* ", string.Empty); } } if (nativeCommentLines.Count > 10) //If native comment is really huge, cut & add NativeDB reference link to read { nativeCommentLines = nativeCommentLines.Take(9).ToList(); nativeCommentLines.Add($"See NativeDB for reference: http://natives.altv.mp/#/{native.Hashes.First().Value}"); } TypeDefFunction function = new TypeDefFunction() { Name = native.AltFunctionName, Description = string.Join("\n", nativeCommentLines), Parameters = native.Parameters.Select(p => new TypeDefFunctionParameter() { Name = p.Name, NativeType = p.NativeParamType, Type = nativeTypeToTypingConverter.Convert(native, p.NativeParamType, p.IsReference), Description = _tryResolveDocs ? GetPossibleParameterDescriptionFromComment(p.Name, nativeCommentLines) : string.Empty }).ToList(), ReturnType = new TypeDefFunctionReturnType() { NativeType = native.ResultTypes, Name = nativeReturnTypeToTypingConverter.Convert(native, native.ResultTypes), Description = foundReturnTypeDescription } }; functions.Add(function); } return(functions); }
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); }