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; } } }
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()); }
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("{"); }
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)})");
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()); }
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); }
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()); }
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}{{"); }
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("{"); }
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}{{"); }
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; } } }
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); } } } }
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); }
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)})");