示例#1
0
        public void PrintToFile(ParsedClass converted, string projName, string searchDir, string absPathToFile, string storeResultDir)
        {
            var outDir = $"{storeResultDir}\\{projName}\\";

            switch (converted.ObjectType)
            {
            case ObjectType.Class:
            case ObjectType.Enum:
            {
                outDir += "Models\\";
                break;
            }

            case ObjectType.Api:
            {
                outDir += "Api\\";
                break;
            }
            }

            if (!Directory.Exists(outDir))
            {
                Directory.CreateDirectory(outDir);
            }

            File.WriteAllText($"{outDir}{converted.Name}.cs", PrintParsedClass(converted, projName, absPathToFile));
            foreach (var itm in UnknownTypes)
            {
                if (string.IsNullOrEmpty(itm.SearchDir))
                {
                    itm.SearchDir = searchDir;
                }
            }
        }
示例#2
0
        public string PrintParsedClass(ParsedClass parsedClass, string projName, string absPathToFile, string searchDir)
        {
            var sb = new StringBuilder();

            PrinNamespace(sb, parsedClass, projName);
            AddClassName(sb, parsedClass, absPathToFile, 4);
            string templateName = null;

            if (parsedClass.IsTemplate)
            {
                templateName = CashParser.Unpack(parsedClass.Template, 1);
            }

            var doc = string.Empty;

            if (parsedClass.ObjectType == ObjectType.Api && !string.IsNullOrEmpty(searchDir))
            {
                doc = File.ReadAllText(searchDir + absPathToFile);
            }

            foreach (var t in parsedClass.Fields)
            {
                if (parsedClass.ObjectType == ObjectType.Api && !string.IsNullOrEmpty(doc) && !doc.Contains($"({t.CppName})"))
                {
                    continue;
                }

                PrintParsedElements(sb, parsedClass, t, 8, templateName);
            }

            CloseTag(sb, 4);
            CloseTag(sb, 0);
            return(sb.ToString());
        }
示例#3
0
        protected virtual void PrinNamespace(StringBuilder sb, ParsedClass parsedClass, string rootDir)
        {
            sb.AppendLine("using Ditch.Core;");
            sb.AppendLine("using System;");
            sb.AppendLine("using System.Collections.Generic; ");
            sb.AppendLine("using Newtonsoft.Json;");

            switch (parsedClass.ObjectType)
            {
            case ObjectType.Class:
            {
                sb.AppendLine();
                sb.AppendLine($"namespace Ditch.{rootDir}.Models");
                break;
            }

            case ObjectType.Enum:
            {
                sb.AppendLine("using Newtonsoft.Json.Converters;");
                sb.AppendLine();
                sb.AppendLine($"namespace Ditch.{rootDir}.Models");
                break;
            }

            case ObjectType.Interface:
            {
                sb.AppendLine($"using Ditch.{rootDir}.Models;");
                sb.AppendLine();
                sb.AppendLine($"namespace Ditch.{rootDir}.Api");
                break;
            }
            }

            sb.AppendLine("{");
        }
示例#4
0
        private void PrintParsedElements(StringBuilder sb, ParsedClass parsedClass, PreParsedElement parsedElement, int indentCount, string templateName)
        {
            var indent = new string(' ', indentCount);

            sb.AppendLine();

            if (!string.IsNullOrEmpty(parsedElement.MainComment))
            {
                sb.AppendLine(parsedElement.MainComment);
            }

            var comment = parsedElement.Comment ?? string.Empty;

            //comment = comment.Replace("\\", $@"/// {Environment.NewLine}");

            sb.AppendLine($"{indent}/// <summary>");
            sb.AppendLine($"{indent}/// API name: {parsedElement.CppName}");
            sb.AppendLine($"{indent}/// {TypeCorrection(comment)}");
            sb.AppendLine($"{indent}/// </summary>");

            var parsedFunc = parsedElement as ParsedFunc;

            if (parsedFunc != null)
            {
                foreach (var itm in parsedFunc.Params)
                {
                    sb.AppendLine($"{indent}/// <param name=\"{itm.Name}\">API type: {TypeCorrection(itm.CppType)}</param>");
                }
                if (parsedClass.ObjectType == ObjectType.Api)
                {
                    sb.AppendLine($"{indent}/// <param name=\"token\">Throws a <see cref=\"T:System.OperationCanceledException\" /> if this token has had cancellation requested.</param>");
                }
            }

            if (!string.IsNullOrEmpty(parsedElement.Type?.CppName))
            {
                sb.AppendLine($"{indent}/// <returns>API type: {TypeCorrection(parsedElement.Type.CppName)}</returns>");
            }

            if (parsedClass.ObjectType == ObjectType.Api)
            {
                sb.AppendLine($"{indent}/// <exception cref=\"T:System.OperationCanceledException\">The token has had cancellation requested.</exception>");
            }

            var type = GetTypeForPrint(parsedElement.Type, templateName);

            if (parsedFunc != null)
            {
                sb.AppendLine($"{indent}public JsonRpcResponse{(type.Equals("void", StringComparison.OrdinalIgnoreCase) ? string.Empty : $"<{type}>")} {parsedElement.Name}({string.Join(", ", parsedFunc.Params)}{(parsedClass.ObjectType == ObjectType.Api ? $"{(parsedFunc.Params.Any() ? ", " : string.Empty)}CancellationToken token" : string.Empty)})");
示例#5
0
        protected virtual string PrintParsedClass(ParsedClass parsedClass, string pathToFile, string dir)
        {
            var sb      = new StringBuilder();
            var rootDir = DirNameRegex.Match(dir).Value;

            rootDir = ToTitleCase(rootDir).Replace(".", "_").Replace("-", "_");
            PrinNamespace(sb, parsedClass, rootDir);
            AddClassName(sb, parsedClass, pathToFile, dir, 4);
            foreach (var t in parsedClass.Fields)
            {
                PrintParsedElements(sb, t, 8);
            }

            CloseClass(sb, 4);
            CloseClass(sb, 0);
            return(sb.ToString());
        }
示例#6
0
        private void ExtendPreParsedClass(ParsedClass parsedClass)
        {
            if (parsedClass == null)
            {
                return;
            }

            if (!string.IsNullOrEmpty(parsedClass.CppName))
            {
                parsedClass.Name = CashParser.ToTitleCase(parsedClass.CppName);
            }
            if (!string.IsNullOrEmpty(parsedClass.CppInherit))
            {
                parsedClass.Inherit = new List <ParsedType> {
                    GetKnownTypeOrDefault(parsedClass.CppInherit)
                }
            }
            ;

            if (parsedClass.CppConstructorParams != null && parsedClass.CppConstructorParams.Any())
            {
                foreach (var itm in parsedClass.CppConstructorParams)
                {
                    parsedClass.ConstructorParams.Add(TryParseParam(itm));
                }
            }

            if (parsedClass.ObjectType != ObjectType.Enum)
            {
                string templateName = null;
                if (parsedClass.IsTemplate)
                {
                    templateName = CashParser.Unpack(parsedClass.Template, 1);
                }

                for (var i = 0; i < parsedClass.Fields.Count; i++)
                {
                    var preParsedElement = parsedClass.Fields[i];
                    parsedClass.Fields[i] = TryParseElement(preParsedElement, templateName);
                }
            }

            parsedClass.Fields.RemoveAll(i => i == null);
        }
示例#7
0
        public string PrintParsedClass(ParsedClass parsedClass, string projName, string absPathToFile)
        {
            var sb = new StringBuilder();

            PrinNamespace(sb, parsedClass, projName);
            AddClassName(sb, parsedClass, absPathToFile, 4);
            string templateName = null;

            if (parsedClass.IsTemplate)
            {
                templateName = CashParser.Unpack(parsedClass.Template, 1);
            }
            foreach (var t in parsedClass.Fields)
            {
                PrintParsedElements(sb, parsedClass, t, 8, templateName);
            }

            CloseTag(sb, 4);
            CloseTag(sb, 0);
            return(sb.ToString());
        }
示例#8
0
        private void AddClassName(StringBuilder sb, ParsedClass parsedClass, string absPathToFile, int indentCount)
        {
            var indent = new string(' ', indentCount);

            if (!string.IsNullOrEmpty(parsedClass.MainComment))
            {
                sb.AppendLine($"{indent}{parsedClass.MainComment.Replace("\r\n", "\r\n" + indent)}{Environment.NewLine}");
            }
            sb.AppendLine($"{indent}/// <summary>");
            sb.AppendLine($"{indent}/// {parsedClass.CppName}");
            if (!string.IsNullOrEmpty(absPathToFile))
            {
                sb.AppendLine($@"{indent}/// {absPathToFile}");
            }
            sb.AppendLine($"{indent}/// </summary>");

            switch (parsedClass.ObjectType)
            {
            case ObjectType.Class:
            {
                sb.AppendLine($"{indent}[JsonObject(MemberSerialization.OptIn)]");
                sb.AppendLine($"{indent}public partial class {parsedClass.Name}{(parsedClass.IsTemplate ? parsedClass.Template : string.Empty)}{(parsedClass.Inherit.Any() ? $" : {string.Join(", ", parsedClass.Inherit)}" : string.Empty)}");
                break;
            }

            case ObjectType.Enum:
            {
                sb.AppendLine($"{indent}[JsonConverter(typeof(EnumConverter))]");
                sb.AppendLine($"{indent}public enum {parsedClass.Name}");
                break;
            }

            case ObjectType.Api:
            {
                sb.AppendLine($"{indent}public partial class {parsedClass.Name}{(parsedClass.Inherit.Any() ? $" : {string.Join(", ", parsedClass.Inherit)}" : string.Empty)}");
                break;
            }
            }
            sb.AppendLine($"{indent}{{");
        }
示例#9
0
        private void PrinNamespace(StringBuilder sb, ParsedClass parsedClass, string projName)
        {
            switch (parsedClass.ObjectType)
            {
            case ObjectType.Class:
            {
                sb.AppendLine("using Ditch.Core;");
                sb.AppendLine("using System;");
                sb.AppendLine("using System.Collections.Generic; ");
                sb.AppendLine($"using Ditch.{projName}.Models;");
                sb.AppendLine("using Newtonsoft.Json;");
                sb.AppendLine();
                sb.AppendLine($"namespace Ditch.{projName}.Models");
                break;
            }

            case ObjectType.Enum:
            {
                sb.AppendLine("using Ditch.Core.Helpers;");
                sb.AppendLine("using Newtonsoft.Json;");
                sb.AppendLine();
                sb.AppendLine($"namespace Ditch.{projName}.Models");
                break;
            }

            case ObjectType.Api:
            {
                sb.AppendLine("using Ditch.Core;");
                sb.AppendLine("using System;");
                sb.AppendLine("using System.Collections.Generic; ");
                sb.AppendLine("using Ditch.Core.JsonRpc;");
                sb.AppendLine($"using Ditch.{projName}.Models;");
                sb.AppendLine();
                sb.AppendLine($"namespace Ditch.{projName}.Api");
                break;
            }
            }

            sb.AppendLine("{");
        }
示例#10
0
        protected virtual void AddClassName(StringBuilder sb, ParsedClass parsedClass, string pathToFile, string dir, int indentCount)
        {
            var indent = new string(' ', indentCount);

            if (!string.IsNullOrEmpty(parsedClass.MainComment))
            {
                sb.AppendLine($"{indent}{parsedClass.MainComment.Replace("\r\n", "\r\n" + indent)}{Environment.NewLine}");
            }
            sb.AppendLine($"{indent}/// <summary>");
            sb.AppendLine($"{indent}/// {parsedClass.CppName}");
            if (!string.IsNullOrEmpty(pathToFile))
            {
                sb.AppendLine($@"{indent}/// {pathToFile.Remove(0, dir.Length)}");
            }
            sb.AppendLine($"{indent}/// </summary>");

            switch (parsedClass.ObjectType)
            {
            case ObjectType.Class:
            {
                sb.AppendLine($"{indent}[JsonObject(MemberSerialization.OptIn)]");
                sb.AppendLine($"{indent}public class {parsedClass.Name}{(parsedClass.Inherit.Any() ? $" : {string.Join(", ", parsedClass.Inherit)}" : string.Empty)}");
                break;
            }

            case ObjectType.Enum:
            {
                sb.AppendLine($"{indent}[JsonConverter(typeof(StringEnumConverter))]");
                sb.AppendLine($"{indent}public enum {parsedClass.Name}");
                break;
            }

            case ObjectType.Interface:
            {
                sb.AppendLine($"{indent}public interface {parsedClass.Name}{(parsedClass.Inherit.Any() ? $" : {string.Join(", ", parsedClass.Inherit)}" : string.Empty)}");
                break;
            }
            }
            sb.AppendLine($"{indent}{{");
        }
示例#11
0
        protected void PrintToFile(string filePath, string searchLine, string dir, ParsedClass converted, List <string> text)
        {
            var outDir = $"{DirNameRegex.Match(dir).Value}\\";

            switch (converted.ObjectType)
            {
            case ObjectType.Class:
            case ObjectType.Enum:
            {
                outDir += "Models";
                break;
            }

            case ObjectType.Interface:
            {
                outDir += "Api";
                break;
            }
            }

            if (!Directory.Exists(outDir))
            {
                Directory.CreateDirectory(outDir);
            }
            if (!Directory.Exists("DebugSrc\\" + outDir))
            {
                Directory.CreateDirectory("DebugSrc\\" + outDir);
            }
            File.WriteAllText($"DebugSrc\\{outDir}\\{converted.CppName}.txt", string.Join(Environment.NewLine, text));
            File.WriteAllText($"{outDir}\\{converted.Name}.cs", PrintParsedClass(converted, filePath, dir));
            foreach (var itm in UnknownTypes)
            {
                if (string.IsNullOrEmpty(itm.SearchDir))
                {
                    itm.SearchDir = dir;
                }
            }
        }
示例#12
0
        private static void TryParseTemplate(ParsedClass result, IList <string> text, int index, out int end)
        {
            var line = text[index];

            end = index;

            if (TemplateRegexp.IsMatch(line))
            {
                line = Unpack(line, 1);
                var itms = SplitParams(line);
                end++;
                var names = itms.Where(i => i.StartsWith("typename")).Select(i => i.Remove(0, 8).Trim()).ToArray();

                result.Template = $"<{string.Join(", ", names.Select(i => ToTitleCase(i)))}> ";
                if (itms.Count > names.Length)
                {
                    foreach (var itm in itms.Where(i => !i.StartsWith("typename")))
                    {
                        result.CppConstructorParams.Add(itm);
                    }
                }
            }
        }
示例#13
0
        public static ParsedClass TryParseClass(IList <string> text, bool isApi)
        {
            if (!text.Any())
            {
                return(null);
            }

            int index;

            if (text.Count == 1)
            {
                var typedef = TryParseTypedefClass(text[0]);
                if (typedef != null)
                {
                    return(typedef);
                }
            }

            var result = new ParsedClass();

            if (isApi)
            {
                result.ObjectType = ObjectType.Api;
            }

            result.MainComment = TryParseComment(text, 0, out index);
            TryParseTemplate(result, text, index, out index);

            var headerSb = new StringBuilder();

            do
            {
                headerSb.Append(" " + text[index]);
            } while (!StartBodyRegex.IsMatch(text[index++]));

            var header = headerSb.ToString();
            var name   = TryParseClassName(header);

            result.CppName    = name;
            result.Name       = ToTitleCase(name);
            result.ObjectType = EnumRegex.IsMatch(header) ? ObjectType.Enum : result.ObjectType;

            var inherit = TryParseInherit(header).Trim();

            if (!string.IsNullOrEmpty(inherit))
            {
                result.CppInherit = inherit;
            }

            while (index < text.Count)
            {
                if (StartPrivateRegex.IsMatch(text[index]) || (index + 1 == text.Count && text[index].Trim().StartsWith("}")))
                {
                    break;
                }

                var comm = TryParseComment(text, index, out index);
                if (index == text.Count)
                {
                    break;
                }
                if (StartPrivateRegex.IsMatch(text[index]))
                {
                    break;
                }

                var field = result.ObjectType == ObjectType.Enum
                    ? TryParseEnum(text, index, out index)
                    : TryParseElement(text, index, out index, isApi);

                if (field != null)
                {
                    field.MainComment = comm;
                    result.Fields.Add(field);
                }
            }

            return(result);
        }
示例#14
0
        private void PrintParsedElements(StringBuilder sb, ParsedClass parsedClass, PreParsedElement parsedElement, int indentCount, string templateName)
        {
            var indent = new string(' ', indentCount);

            sb.AppendLine();

            Comment briefComment = null;
            var     parsedFunc   = parsedElement as ParsedFunc;

            if (parsedFunc != null)
            {
                briefComment = Comment.TryParseMainComment(parsedFunc.MainComment);
                if (briefComment != null && !briefComment.IsEmpty())
                {
                    parsedFunc.MainComment = Comment.RemoveBriefFromMainComment(parsedFunc.MainComment);
                }
            }

            if (!string.IsNullOrEmpty(parsedElement.MainComment))
            {
                sb.Append(indent);
                sb.AppendLine(parsedElement.MainComment);
                sb.AppendLine();
            }

            var comment = parsedElement.Comment ?? string.Empty;

            //comment = comment.Replace("\\", $@"/// {Environment.NewLine}");

            sb.AppendLine($"{indent}/// <summary>");
            sb.AppendLine($"{indent}/// API name: {parsedElement.CppName}");
            if (!string.IsNullOrWhiteSpace(briefComment?.Brief))
            {
                sb.AppendLine($"{indent}/// {briefComment.Brief.Replace(Environment.NewLine, $"{Environment.NewLine}{indent}/// ")}");
                sb.AppendLine($"{indent}///");
            }
            if (parsedClass.ObjectType == ObjectType.Api && !string.IsNullOrWhiteSpace(parsedElement.CppName) && MethodDescriptions.ContainsKey(parsedElement.CppName))
            {
                var text = MethodDescriptions[parsedElement.CppName];
                if (!string.IsNullOrWhiteSpace(text) && (briefComment == null || !briefComment.IsBriefContainText(text)))
                {
                    sb.AppendLine($"{indent}/// *{text.Trim()}");
                }
            }
            sb.AppendLine($"{indent}/// {TypeCorrection(comment)}");
            sb.AppendLine($"{indent}/// </summary>");

            if (parsedFunc != null)
            {
                foreach (var itm in parsedFunc.Params)
                {
                    sb.Append($"{indent}/// <param name=\"{itm.Name}\">API type: {TypeCorrection(itm.CppType)}");

                    if (briefComment != null && briefComment.Params.ContainsKey(itm.CppName))
                    {
                        sb.Append(briefComment.Params[itm.CppName].Replace(Environment.NewLine, $"{Environment.NewLine}{indent}/// "));
                    }

                    sb.AppendLine("</param>");
                }

                if (parsedClass.ObjectType == ObjectType.Api)
                {
                    sb.AppendLine($"{indent}/// <param name=\"token\">Throws a <see cref=\"T:System.OperationCanceledException\" /> if this token has had cancellation requested.</param>");
                }
            }

            if (!string.IsNullOrWhiteSpace(briefComment?.Return) || !string.IsNullOrEmpty(parsedElement.Type?.CppName))
            {
                sb.Append($"{indent}/// <returns>");
                if (!string.IsNullOrEmpty(parsedElement.Type?.CppName))
                {
                    sb.Append($"API type: {TypeCorrection(parsedElement.Type.CppName)}");
                    if (!string.IsNullOrWhiteSpace(briefComment?.Return))
                    {
                        sb.Append(" ");
                    }
                }

                if (!string.IsNullOrWhiteSpace(briefComment?.Return))
                {
                    sb.Append($"{briefComment.Return.Replace(Environment.NewLine, $"{Environment.NewLine}{indent}/// ")}");
                }
                sb.AppendLine("</returns>");
            }


            if (parsedClass.ObjectType == ObjectType.Api)
            {
                sb.AppendLine($"{indent}/// <exception cref=\"T:System.OperationCanceledException\">The token has had cancellation requested.</exception>");
            }

            var type = GetTypeForPrint(parsedElement.Type, templateName);

            if (parsedFunc != null)
            {
                sb.AppendLine($"{indent}public JsonRpcResponse{(type.Equals("void", StringComparison.OrdinalIgnoreCase) ? string.Empty : $"<{type}>")} {parsedElement.Name}({string.Join(", ", parsedFunc.Params)}{(parsedClass.ObjectType == ObjectType.Api ? $"{(parsedFunc.Params.Any() ? ", " : string.Empty)}CancellationToken token" : string.Empty)})");