static void GenCSImplement() { var str = File.ReadAllText("./code"); Dictionary <string, LinkedList <string> > dict = new Dictionary <string, LinkedList <string> >(); List <ClassOfThem> alllist = new List <ClassOfThem>(); foreach (Match match in firstRegex.Matches(str)) { var retValue = match.Groups[1].Value; if (retValue != "bool4" && retValue != "void") { throw new Exception("retValue" + retValue); } var funcName = "wrap_love_dll_" + match.Groups[2].Value; var tsd = new TypeStructDefine(match.Groups[2].Value); var li = alllist.Find(item => item.className == tsd.topName); if (li == null) { li = new ClassOfThem(tsd.topName); alllist.Add(li); } var paramList = paramsRegex.Matches("(" + match.Groups[3].Value) .Select(m => new Params(m.Groups[3].Value, m.Groups[4].Value, m.Groups[5].Value)); var line = CSDLLImplementTemplate(funcName, tsd, paramList); li.list.AddLast(line); } List <string> sortIndex = new List <string> { "Body", "Contact", "Fixture", "Shape", "Joint", "World", "physics", "ChainShape", "CircleShape", "EdgeShape", "PolygonShape", "DistanceJoint", "FrictionJoint", "GearJoint", "MotorJoint", "MouseJoint", "PrismaticJoint", "PulleyJoint", "RevoluteJoint", "WeldJoint", "WheelJoint", }; var lll = alllist .Select(a => a) .OrderBy(ca => sortIndex.IndexOf(ca.className)); foreach (var c in lll) { var comeFrom = "LoveObject"; if (c.className != "Shape" && c.className.EndsWith("Shape")) { comeFrom = "Shape"; } if (c.className != "Joint" && c.className.EndsWith("Joint")) { comeFrom = "Joint"; } Console.WriteLine($"public class {c.className}: {comeFrom}"); Console.WriteLine("{"); Console.WriteLine(" /// <summary>"); Console.WriteLine(" /// disable construct"); Console.WriteLine(" /// </summary>"); Console.WriteLine($" protected {c.className}() {{ }}"); Console.WriteLine(string.Join("\n", c.list)); Console.WriteLine("}"); } }
/// <param name="csRetType">bool or void</param> /// <param name="funcName">wrap_love_dll_xxxxxxxxxxxxx</param> /// <param name="paramsDef">out IntPtr p, Vector4[] colorarray, int colorarray_length</param> /// <param name="paramsInput">out p, colorarray, colorarray_length</param> static string CSDLLImplementTemplate(string funcName, TypeStructDefine tsd, IEnumerable <Params> prs) { SplitByInputAndOutput(prs, out var inPrs, out var outPrs); if (tsd.isType) { if (nameCppToCSTypeDict.ContainsKey(prs.First(p => true).TypeString)) { throw new Exception("type first is not IntPtr !"); } if (outPrs.Count() == 0) // no return value, type of them { var ppp = prs.Skip(1); var paramsDef = string.Join(", ", ppp.Select(p => p.ToDefString())); var inputDef = string.Join(", ", ppp.Select(p => p.ToInputString()).Prepend("p")); StringBuilder sb = new StringBuilder(); sb.AppendLine($" public void {FuncStrHeadToUpper(tsd.methodName)}({paramsDef})"); sb.AppendLine(" {"); sb.AppendLine($" Love2dDll.{funcName}({inputDef});"); sb.AppendLine(" }"); return(sb.ToString()); } else if (outPrs.Count() == 1) // no return value, type of them { var ppp = inPrs.Skip(1); var paramsDef = string.Join(", ", ppp.Select(p => p.ToDefString())); var inputDef = string.Join(", ", ppp.Select(p => p.ToInputString()).Prepend("p")); var outppp = outPrs.First(p => true); StringBuilder sb = new StringBuilder(); sb.AppendLine($" public {outppp.ToCSParams().TypeString} {FuncStrHeadToUpper(tsd.methodName)}({paramsDef})"); sb.AppendLine(" {"); sb.AppendLine($" {outppp.ToCSParams().TypeString} {outppp.ValueString};"); sb.AppendLine($" Love2dDll.{funcName}({inputDef}, out {outppp.ValueString});"); sb.AppendLine($" return {outppp.ValueString};"); sb.AppendLine(" }"); return(sb.ToString()); } } else { if (outPrs.Count() == 0) // no return value, type of them { var ppp = prs; var paramsDef = string.Join(", ", ppp.Select(p => p.ToDefString())); var inputDef = string.Join(", ", ppp.Select(p => p.ToInputString())); StringBuilder sb = new StringBuilder(); sb.AppendLine($" public static void {FuncStrHeadToUpper(tsd.methodName)}({paramsDef})"); sb.AppendLine(" {"); sb.AppendLine($" Love2dDll.{funcName}({inputDef});"); sb.AppendLine(" }"); return(sb.ToString()); } else if (outPrs.Count() == 1) // no return value, type of them { var ppp = inPrs; var paramsDef = string.Join(", ", ppp.Select(p => p.ToDefString())); var inputDef = string.Join(", ", ppp.Select(p => p.ToInputString())); if (!"".Equals(inputDef)) { inputDef += ", "; } var outppp = outPrs.First(p => true); StringBuilder sb = new StringBuilder(); sb.AppendLine($" public static {outppp.ToCSParams().TypeString} {FuncStrHeadToUpper(tsd.methodName)}({paramsDef})"); sb.AppendLine(" {"); sb.AppendLine($" {outppp.ToCSParams().TypeString} {outppp.ValueString};"); sb.AppendLine($" Love2dDll.{funcName}({inputDef}out {outppp.ValueString});"); sb.AppendLine($" return {outppp.ValueString};"); sb.AppendLine(" }"); return(sb.ToString()); } } return(" // TODO: finishe function " + funcName); }