示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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" : ")");
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#7
0
        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);
        }