mirror of
				https://github.com/raylib-cs/raylib-cs
				synced 2025-10-29 05:59:51 -04:00 
			
		
		
		
	Removed code generator.
- Decided to remove this as it is out of date with the bindings and would need to be reworked. I have tried different ideas for code generation in the past(See #29) and I may revisit the idea in the future.
This commit is contained in:
		
										
											Binary file not shown.
										
									
								
							| @@ -1,23 +0,0 @@ | |||||||
| <Project Sdk="Microsoft.NET.Sdk"> |  | ||||||
|  |  | ||||||
|   <PropertyGroup> |  | ||||||
|     <OutputType>Exe</OutputType> |  | ||||||
|     <TargetFrameworks>netcoreapp2.1;netcoreapp3.1</TargetFrameworks> |  | ||||||
|     <ApplicationIcon>../Logo/raylib-cs.ico</ApplicationIcon> |  | ||||||
|     <Platforms>x64</Platforms> |  | ||||||
|   </PropertyGroup> |  | ||||||
|  |  | ||||||
|   <ItemGroup> |  | ||||||
|     <Content Include="Dia2Dump.exe"> |  | ||||||
|       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> |  | ||||||
|     </Content> |  | ||||||
|     <Content Include="raylib.pdb"> |  | ||||||
|       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> |  | ||||||
|     </Content> |  | ||||||
|   </ItemGroup> |  | ||||||
|  |  | ||||||
|   <ItemGroup> |  | ||||||
|     <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="2.10.0"/> |  | ||||||
|   </ItemGroup> |  | ||||||
|  |  | ||||||
| </Project> |  | ||||||
| @@ -1,796 +0,0 @@ | |||||||
| /* Raylib-cs |  | ||||||
|  * Program.cs - Generator for creating pinvoke bindings from raylib headers. |  | ||||||
|  * Copyright 2019 |  | ||||||
|  * |  | ||||||
|  * Release under zLib License. |  | ||||||
|  * See LICENSE for details. |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| using System; |  | ||||||
| using System.IO; |  | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.Linq; |  | ||||||
| using System.Globalization; |  | ||||||
| using System.Diagnostics; |  | ||||||
| using Microsoft.CodeAnalysis.CSharp.Syntax; |  | ||||||
| using Microsoft.CodeAnalysis.CSharp; |  | ||||||
| using Microsoft.CodeAnalysis; |  | ||||||
| using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory; |  | ||||||
|  |  | ||||||
| namespace Generator |  | ||||||
| { |  | ||||||
|     public struct TypeMember |  | ||||||
|     { |  | ||||||
|         public string Name; |  | ||||||
|         public Type Type; |  | ||||||
|         public int Offset; |  | ||||||
|  |  | ||||||
|         public TypeMember(string name, Type type, int offset) |  | ||||||
|         { |  | ||||||
|             Name = name; |  | ||||||
|             Type = type; |  | ||||||
|             Offset = offset; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public struct UserDefinedEnumData |  | ||||||
|     { |  | ||||||
|         public string Name; |  | ||||||
|         public List<KeyValuePair<string, int>> Enums; |  | ||||||
|  |  | ||||||
|         public UserDefinedEnumData(string name) |  | ||||||
|         { |  | ||||||
|             Name = name; |  | ||||||
|             Enums = new List<KeyValuePair<string, int>>(); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public struct UserDefinedTypeData |  | ||||||
|     { |  | ||||||
|         public string Name; |  | ||||||
|         public List<TypeMember> Members; |  | ||||||
|  |  | ||||||
|         public UserDefinedTypeData(string name) |  | ||||||
|         { |  | ||||||
|             Name = name; |  | ||||||
|             Members = new List<TypeMember>(); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public struct Function |  | ||||||
|     { |  | ||||||
|         public string Name; |  | ||||||
|         public Type ReturnType; |  | ||||||
|         public List<FunctionParam> Params; |  | ||||||
|  |  | ||||||
|         public Function(string name, string returnType, params FunctionParam[] parameters) |  | ||||||
|         { |  | ||||||
|             var Isreturnpointer = name[0] == '*'; |  | ||||||
|             Name = Isreturnpointer ? name.Replace("*", "") : name; |  | ||||||
|             ReturnType = new Type(returnType, Isreturnpointer); |  | ||||||
|             Params = new List<FunctionParam>(parameters); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         public override string ToString() |  | ||||||
|         { |  | ||||||
|             var str = $"{ReturnType} {Name}("; |  | ||||||
|             for (int i = 0; i < Params.Count; i++) |  | ||||||
|             { |  | ||||||
|                 if (i != 0) str += ","; |  | ||||||
|                 str += $"{Params[i].ToString()}"; |  | ||||||
|             } |  | ||||||
|             str += ")"; |  | ||||||
|             return str; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public struct Type |  | ||||||
|     { |  | ||||||
|         public string Name; |  | ||||||
|         public bool IsPointer; |  | ||||||
|  |  | ||||||
|         public Type(string name, bool isPointer) |  | ||||||
|         { |  | ||||||
|             Name = name; |  | ||||||
|             IsPointer = isPointer; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         public override string ToString() |  | ||||||
|         { |  | ||||||
|             return Name + (IsPointer == true ? "*" : ""); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public struct FunctionParam |  | ||||||
|     { |  | ||||||
|         public string Name; |  | ||||||
|         public Type Type; |  | ||||||
|  |  | ||||||
|         public FunctionParam(string name, Type type) |  | ||||||
|         { |  | ||||||
|             Name = name; |  | ||||||
|             Type = type; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         public FunctionParam(string FullParam) |  | ||||||
|         { |  | ||||||
|             if (FullParam == "") |  | ||||||
|             { |  | ||||||
|                 Name = ""; |  | ||||||
|                 Type = new Type(); |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             FullParam = FullParam.Trim(); |  | ||||||
|             if (FullParam.Split(' ').Length == 2) |  | ||||||
|             { |  | ||||||
|                 var Isreturnpointer = FullParam.Split(' ')[1][0] == '*'; |  | ||||||
|                 Name = Isreturnpointer ? FullParam.Replace("*", "").Split(' ')[1] : FullParam.Split(' ')[1]; |  | ||||||
|                 Type = new Type(FullParam.Replace("*", "").Split(' ')[0], Isreturnpointer); |  | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 var Isreturnpointer = FullParam.Split(' ')[2][0] == '*'; |  | ||||||
|                 Name = Isreturnpointer ? FullParam.Replace("*", "").Split(' ')[2] : FullParam.Split(' ')[2]; |  | ||||||
|                 Type = new Type(FullParam.Replace("*", "").Split(' ')[0] + " " + FullParam.Replace("*", "").Split(' ')[1], Isreturnpointer); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         public override string ToString() |  | ||||||
|         { |  | ||||||
|             return Name == "..." ? "..." : $"{Type.ToString()} {Name}"; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     struct SyntaxData |  | ||||||
|     { |  | ||||||
|         public string tag; |  | ||||||
|         public List<string> functions; |  | ||||||
|         public HashSet<string> types; |  | ||||||
|         public HashSet<string> enums; |  | ||||||
|         public List<Function> funcs; |  | ||||||
|         public List<string> comments; |  | ||||||
|         public Dictionary<string, UserDefinedTypeData> tps; |  | ||||||
|         public Dictionary<string, UserDefinedEnumData> eps; |  | ||||||
|  |  | ||||||
|         public SyntaxData(string _tag) |  | ||||||
|         { |  | ||||||
|             tag = _tag; |  | ||||||
|             functions = new List<string>(); |  | ||||||
|             types = new HashSet<string>(); |  | ||||||
|             enums = new HashSet<string>(); |  | ||||||
|             funcs = new List<Function>(); |  | ||||||
|             comments = new List<string>(); |  | ||||||
|             tps = new Dictionary<string, UserDefinedTypeData>(); |  | ||||||
|             eps = new Dictionary<string, UserDefinedEnumData>(); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     class Program |  | ||||||
|     { |  | ||||||
|         static void Main(string[] args) |  | ||||||
|         { |  | ||||||
|             var process = Process.Start(new ProcessStartInfo("Dia2Dump.exe", " -t raylib.pdb") { RedirectStandardOutput = true, UseShellExecute = false }); |  | ||||||
|              |  | ||||||
|             string typedata = ""; |  | ||||||
|             var ischkout = process.StandardOutput; |  | ||||||
|              |  | ||||||
|             while (process.HasExited == false) |  | ||||||
|             { |  | ||||||
|                 typedata += ischkout.ReadToEnd(); |  | ||||||
|             } |  | ||||||
|             File.WriteAllText("types.txt", typedata); |  | ||||||
|             var typesfile = File.ReadAllLines("types.txt"); |  | ||||||
|  |  | ||||||
|             var TypeMap = new Dictionary<string, string>(); |  | ||||||
|             typesfile = typesfile.Where(x => x != "").ToArray(); |  | ||||||
|  |  | ||||||
|             Console.WriteLine("Enter the path to raylib."); |  | ||||||
|             var raylibPath = Console.ReadLine() + "/src/"; |  | ||||||
|  |  | ||||||
|             var sources = new KeyValuePair<string, string>[] { |  | ||||||
|                 new KeyValuePair<string, string>("raylib.h","RLAPI"), |  | ||||||
|                 new KeyValuePair<string, string>("raymath.h", "RMDEF"), |  | ||||||
|                 new KeyValuePair<string, string>("physac.h", "PHYSACDEF"), |  | ||||||
|                 new KeyValuePair<string, string>( "easings.h","EASEDEF"), |  | ||||||
|                 new KeyValuePair<string, string>( "raygui.h","RAYGUIDEF") |  | ||||||
|             }; |  | ||||||
|  |  | ||||||
|             foreach (var sourceAndExportTag in sources) |  | ||||||
|             { |  | ||||||
|                 var sourcefilename = sourceAndExportTag.Key; |  | ||||||
|                 var FileName = new CultureInfo("en-us", false).TextInfo.ToTitleCase(sourcefilename.Replace(".h", "")); |  | ||||||
|                 var ExportTag = sourceAndExportTag.Value; |  | ||||||
|                 var sourcefile = File.ReadAllLines(raylibPath + sourcefilename); |  | ||||||
|              |  | ||||||
|                 var syntax = GetSyntax(sourcefile, ExportTag, TypeMap, typesfile); |  | ||||||
|                 GenerateBinding(syntax, FileName); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // Takes the source from a raylib module and stores the syntax data |  | ||||||
|         static SyntaxData GetSyntax(string[] sourcefile, string tag, Dictionary<string, string> TypeMap, string[] typesfile) |  | ||||||
|         { |  | ||||||
|             var syntax = new SyntaxData(tag); |  | ||||||
|  |  | ||||||
|             // local references |  | ||||||
|             var ExportTag = syntax.tag; |  | ||||||
|             var comments = syntax.comments; |  | ||||||
|             var functions = syntax.functions; |  | ||||||
|             var enums = syntax.enums; |  | ||||||
|             var Funcs = syntax.funcs; |  | ||||||
|             var types = syntax.types; |  | ||||||
|             var tps = syntax.tps; |  | ||||||
|             var eps = syntax.eps; |  | ||||||
|  |  | ||||||
|             for (int i = 0; i < sourcefile.Length; i++) |  | ||||||
|             { |  | ||||||
|                 var source = sourcefile[i].Split("//".ToCharArray())[0].Trim(); |  | ||||||
|  |  | ||||||
|                 // Comments test |  | ||||||
|                 if (source.StartsWith("*") || source.StartsWith("//")) |  | ||||||
|                 { |  | ||||||
|                     comments.Add(source); |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 if (source.Contains(ExportTag)) |  | ||||||
|                 { |  | ||||||
|                     if (!source.Contains("#define")) |  | ||||||
|                     { |  | ||||||
|                         source = source.TrimStart(ExportTag.ToCharArray()).Trim(); |  | ||||||
|                         if (!source.Contains("{"))  |  | ||||||
|                         { |  | ||||||
|                             // Some functions go across multiple lines |  | ||||||
|                             if (source[source.Length - 1] == ',') |  | ||||||
|                             { |  | ||||||
|                                 i++; |  | ||||||
|                                 var nextLine = sourcefile[i].Split("//".ToCharArray())[0].Trim(); |  | ||||||
|                                 source += " " + nextLine; |  | ||||||
|                             } |  | ||||||
|  |  | ||||||
|                             functions.Add(source); |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 if (source.Contains("typedef")) |  | ||||||
|                 { |  | ||||||
|                     if (source.Split(' ')[1].Trim() == "struct") |  | ||||||
|                     { |  | ||||||
|                         if (source.Contains('}')) |  | ||||||
|                         { |  | ||||||
|                             types.Add(source.Split('}', ';')[1].Trim()); |  | ||||||
|                         } |  | ||||||
|                         else |  | ||||||
|                         { |  | ||||||
|                             int t = 1; |  | ||||||
|                             var src = sourcefile[i + t]; |  | ||||||
|                             while (!src.Contains('}')) |  | ||||||
|                             { |  | ||||||
|                                 src = sourcefile[i + t]; |  | ||||||
|                                 t++; |  | ||||||
|                             } |  | ||||||
|                             types.Add(src.Trim('}', ';').Trim()); |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             // Break down function string |  | ||||||
|             for (int i = 0; i < functions.Count; i++) |  | ||||||
|             { |  | ||||||
|                 var func = functions[i]; |  | ||||||
|                 var returntype = func.Split('(')[0].Split(' ').Length == 3 ? func.Split('(')[0].Split(' ')[0] + " " + func.Split('(')[0].Split(' ')[1] : func.Split('(')[0].Split(' ')[0]; |  | ||||||
|  |  | ||||||
|                 types.Add(returntype); |  | ||||||
|                 func = func.Substring(returntype.Length).Trim(); |  | ||||||
|  |  | ||||||
|                 //@TODO extra comma in param list |  | ||||||
|                 var funcname = func.Split('(')[0].Trim(); |  | ||||||
|                 var Func = new Function(funcname, returntype); |  | ||||||
|                 if (func.Contains(',')) |  | ||||||
|                 { |  | ||||||
|                     var Params = func.Split('(', ')')[1].Split(','); |  | ||||||
|                     for (int t = 0; t < Params.Length; t++) |  | ||||||
|                     { |  | ||||||
|                         var Param = Params[t]; |  | ||||||
|                         Param = Param.Trim(); |  | ||||||
|                         if (Param == "...") |  | ||||||
|                         { |  | ||||||
|                             Func.Params.Add(new FunctionParam(Param, new Type("...", false))); |  | ||||||
|                         } |  | ||||||
|                         else |  | ||||||
|                         { |  | ||||||
|                             var TypeAndVar = Param.Trim().Split(' '); |  | ||||||
|                             if (TypeAndVar.Length == 2) |  | ||||||
|                             { |  | ||||||
|                                 var type = TypeAndVar[0]; |  | ||||||
|                                 var Var = TypeAndVar[1]; |  | ||||||
|                                 types.Add(type); |  | ||||||
|                             } |  | ||||||
|                             else if (TypeAndVar.Length == 3) |  | ||||||
|                             { |  | ||||||
|                                 var type = TypeAndVar[0] + " " + TypeAndVar[1]; |  | ||||||
|                                 var Var = TypeAndVar[2]; |  | ||||||
|                                 types.Add(type); |  | ||||||
|                             } |  | ||||||
|  |  | ||||||
|                             Func.Params.Add(new FunctionParam(Param)); |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|                 else if (func.Contains(' ')) |  | ||||||
|                 { |  | ||||||
|                     var Param = func.Split('(', ')')[1]; |  | ||||||
|                     var TypeAndVar = Param.Trim().Split(' '); |  | ||||||
|                     var type = TypeAndVar[0]; |  | ||||||
|                     var Var = TypeAndVar[1]; |  | ||||||
|  |  | ||||||
|                     types.Add(type); |  | ||||||
|                     Func.Params.Add(new FunctionParam(Param)); |  | ||||||
|                 } |  | ||||||
|                 Funcs.Add(Func); |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             for (int i = 0; i < sourcefile.Length; i++) |  | ||||||
|             { |  | ||||||
|                 var source = sourcefile[i].Split("//".ToCharArray())[0].Trim(); |  | ||||||
|                 if (source.Contains("typedef")) |  | ||||||
|                 { |  | ||||||
|                     if (source.Split(' ')[1].Trim() != "struct") |  | ||||||
|                     { |  | ||||||
|                         if (source.Split(' ')[1].Trim() == "enum") |  | ||||||
|                         { |  | ||||||
|                             if (source.Contains('}')) |  | ||||||
|                             { |  | ||||||
|                                 enums.Add(source.Split('}', ';')[1].Trim()); |  | ||||||
|                             } |  | ||||||
|                             else |  | ||||||
|                             { |  | ||||||
|                                 int t = 1; |  | ||||||
|                                 var src = sourcefile[i + t]; |  | ||||||
|                                 while (!src.Contains('}')) |  | ||||||
|                                 { |  | ||||||
|                                     src = sourcefile[i + t]; |  | ||||||
|                                     t++; |  | ||||||
|                                 } |  | ||||||
|                                 enums.Add(src.Trim('}', ';').Trim()); |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
|                         else |  | ||||||
|                         { |  | ||||||
|                             TypeMap.Add(source.Split(" ".ToCharArray(), 3)[2].Trim(';').Trim(), source.Split(" ".ToCharArray(), 3)[1].Trim()); |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                     else |  | ||||||
|                     { |  | ||||||
|  |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|                 else if (source.Contains("#define") && source.Split(' ').Length > 2 && source.Split(' ')[1] != (ExportTag)) |  | ||||||
|                 { |  | ||||||
|                     if (types.Contains(source.Split(" ".ToCharArray(), 3)[1].Trim(';').Trim())) TypeMap.Add(source.Split(" ".ToCharArray(), 3)[1].Trim(';').Trim(), source.Split(" ".ToCharArray(), 3)[2].Trim()); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             for (int i = 0; i < Funcs.Count; i++) |  | ||||||
|             { |  | ||||||
|                 var Func = Funcs[i]; |  | ||||||
|                 if (TypeMap.ContainsKey(Func.ReturnType.Name)) |  | ||||||
|                 { |  | ||||||
|                     Func.ReturnType.Name = TypeMap[Func.ReturnType.Name]; |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 for (int t = 0; t < Func.Params.Count; t++) |  | ||||||
|                 { |  | ||||||
|                     if (TypeMap.ContainsKey(Func.Params[t].Type.Name)) |  | ||||||
|                     { |  | ||||||
|  |  | ||||||
|                         Func.Params[t] = new FunctionParam(Func.Params[t].Name, new Type(TypeMap[Func.Params[t].Type.Name], Func.Params[t].Type.IsPointer)); |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|                 Funcs[i] = Func; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             for (int i = 0; i < typesfile.Length; i++) |  | ||||||
|             { |  | ||||||
|                 var typestr = typesfile[i]; |  | ||||||
|                 if (typestr.Contains("UserDefinedType: ") && !typestr.Contains("UserDefinedType:  ")) |  | ||||||
|                 { |  | ||||||
|                     var type = typestr.Substring("UserDefinedType: ".Length).Trim(); |  | ||||||
|                     if (types.Contains(type) && type[0] != ' ' && !tps.Any(x => x.Key == type)) |  | ||||||
|                     { |  | ||||||
|                         var usertype = new UserDefinedTypeData(type); |  | ||||||
|                         int t = 1; |  | ||||||
|                         typestr = typesfile[i + t]; |  | ||||||
|  |  | ||||||
|                         while (!(typestr.Contains("UserDefinedType: ") && typestr["UserDefinedType: ".Length - 1] == ' ')) |  | ||||||
|                         { |  | ||||||
|                             if (typestr.Contains("Member")) |  | ||||||
|                             { |  | ||||||
|                                 var tpsrc = typesfile[i + t]; |  | ||||||
|                                 var MemberNameandType = tpsrc.Substring(tpsrc.IndexOf("Type:") + "Type:".Length).Trim().Split(','); |  | ||||||
|                                 var MemberName = MemberNameandType[1].Trim(); |  | ||||||
|                                 var MemberType = MemberNameandType[0].Trim(); |  | ||||||
|  |  | ||||||
|                                 if (MemberType.Contains("<unnamed-enum-false>")) |  | ||||||
|                                 { |  | ||||||
|                                     MemberType = "bool"; |  | ||||||
|                                 } |  | ||||||
|  |  | ||||||
|                                 var isptr = MemberType[MemberType.Length - 1] == '*'; |  | ||||||
|                                 var offset = int.Parse(tpsrc.Split(',')[0].Split(':')[1].Trim().Substring("this+0x".Length), System.Globalization.NumberStyles.HexNumber); |  | ||||||
|  |  | ||||||
|                                 if (isptr) |  | ||||||
|                                 { |  | ||||||
|                                     MemberType = MemberType.Remove(MemberType.Length - 1); |  | ||||||
|                                 } |  | ||||||
|                                 usertype.Members.Add(new TypeMember(MemberName, new Type(MemberType, isptr), offset)); |  | ||||||
|  |  | ||||||
|                                 if (typesfile[i + t + 1].Contains(MemberType.Trim("struct".ToCharArray())) && |  | ||||||
|                                     typesfile[i + t + 1].Contains("UserDefinedType:  ")) |  | ||||||
|                                 { |  | ||||||
|                                     t++; |  | ||||||
|                                 } |  | ||||||
|                             } |  | ||||||
|                             t++; |  | ||||||
|                             typestr = typesfile[i + t]; |  | ||||||
|                         } |  | ||||||
|                         tps.Add(usertype.Name, usertype); |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 if (typestr.Contains("Enum           : ")) |  | ||||||
|                 { |  | ||||||
|                     var Enum = typestr.Substring("Enum           : ".Length).Split(',')[0].Trim(); |  | ||||||
|                     if (enums.Contains(Enum) && Enum != "bool") |  | ||||||
|                     { |  | ||||||
|                         var UserDefineEnum = new UserDefinedEnumData(Enum); |  | ||||||
|                         int t = 1; |  | ||||||
|                         typestr = typesfile[i + t]; |  | ||||||
|  |  | ||||||
|                         while (typestr.Contains("Constant")) |  | ||||||
|                         { |  | ||||||
|                             var intstr = typestr.Split(",".ToCharArray(), 2)[0].Split(':')[1].Split(' ')[4].Substring("0x".Length).Trim(); |  | ||||||
|                             int Int = int.Parse(intstr, System.Globalization.NumberStyles.HexNumber); |  | ||||||
|                             var name = typestr.Split(",".ToCharArray(), 4)[3].Trim(); |  | ||||||
|                             UserDefineEnum.Enums.Add(new KeyValuePair<string, int>(name, Int)); |  | ||||||
|                             t++; |  | ||||||
|                             typestr = typesfile[i + t]; |  | ||||||
|                         } |  | ||||||
|                         eps.Add(Enum, UserDefineEnum); |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             types.IntersectWith(tps.Select(x => x.Key)); |  | ||||||
|  |  | ||||||
|             return syntax; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // Takes in SyntaxData and creates a .cs binding file |  | ||||||
|         static void GenerateBinding(SyntaxData syntax, string fileName) |  | ||||||
|         { |  | ||||||
|             // local references |  | ||||||
|             var ExportTag = syntax.tag; |  | ||||||
|             var comments = syntax.comments; |  | ||||||
|             var functions = syntax.functions; |  | ||||||
|             var enums = syntax.enums; |  | ||||||
|             var Funcs = syntax.funcs; |  | ||||||
|             var types = syntax.types; |  | ||||||
|             var tps = syntax.tps; |  | ||||||
|             var eps = syntax.eps; |  | ||||||
|  |  | ||||||
|             // ---------------------------------------------------------------------------- |  | ||||||
|             // Begin generating bindings here using SyntaxTree |  | ||||||
|             // ---------------------------------------------------------------------------- |  | ||||||
|             var codetree = CompilationUnit().AddUsings(UsingDirective(ParseName("System"))) |  | ||||||
|                 .AddUsings(UsingDirective(ParseName("System.IO"))) |  | ||||||
|                 .AddUsings(UsingDirective(ParseName("System.Collections.Generic"))) |  | ||||||
|                 .AddUsings(UsingDirective(ParseName("System.Security"))) |  | ||||||
|                 .AddUsings(UsingDirective(ParseName("System.Runtime.InteropServices"))); |  | ||||||
|  |  | ||||||
|             var Raylibnamespace = NamespaceDeclaration(ParseName("Raylib")).NormalizeWhitespace(); |  | ||||||
|  |  | ||||||
|             foreach (var Enumtype in eps.Values) |  | ||||||
|             { |  | ||||||
|                 var Enum = EnumDeclaration(Enumtype.Name).WithModifiers(TokenList(Token(SyntaxKind.PublicKeyword))); |  | ||||||
|                 foreach (var Member in Enumtype.Enums) |  | ||||||
|                 { |  | ||||||
|                     var enummember = EnumMemberDeclaration( |  | ||||||
|                             Identifier(Member.Key)) |  | ||||||
|                         .WithEqualsValue( |  | ||||||
|                             EqualsValueClause( |  | ||||||
|                                 LiteralExpression( |  | ||||||
|                                     SyntaxKind.NumericLiteralExpression, |  | ||||||
|                                     Literal(Member.Value)))); |  | ||||||
|                     Enum = Enum.AddMembers(enummember); |  | ||||||
|                 } |  | ||||||
|                 Raylibnamespace = Raylibnamespace.AddMembers(Enum); |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             foreach (var Type in tps.Values) |  | ||||||
|             { |  | ||||||
|                 var Struct = StructDeclaration(Type.Name).WithAttributeLists( |  | ||||||
|                     SingletonList( |  | ||||||
|                         AttributeList( |  | ||||||
|                             SingletonSeparatedList( |  | ||||||
|                                 Attribute( |  | ||||||
|                                     IdentifierName("StructLayout")) |  | ||||||
|                                 .WithArgumentList( |  | ||||||
|                                     AttributeArgumentList( |  | ||||||
|                                         SeparatedList<AttributeArgumentSyntax>( |  | ||||||
|                                             new SyntaxNodeOrToken[]{ |  | ||||||
|                                             AttributeArgument( |  | ||||||
|                                                 MemberAccessExpression( |  | ||||||
|                                                     SyntaxKind.SimpleMemberAccessExpression, |  | ||||||
|                                                     IdentifierName("LayoutKind"), |  | ||||||
|                                                     IdentifierName("Sequential"))), |  | ||||||
|                                             Token(SyntaxKind.CommaToken), |  | ||||||
|                                             AttributeArgument( |  | ||||||
|                                                 MemberAccessExpression( |  | ||||||
|                                                     SyntaxKind.SimpleMemberAccessExpression, |  | ||||||
|                                                     IdentifierName("CharSet"), |  | ||||||
|                                                     IdentifierName("Ansi"))) |  | ||||||
|                                             .WithNameEquals( |  | ||||||
|                                                 NameEquals( |  | ||||||
|                                                     IdentifierName("CharSet")))}))))))) |  | ||||||
|                     .WithModifiers( |  | ||||||
|                         TokenList( |  | ||||||
|                             Token(SyntaxKind.PublicKeyword))); |  | ||||||
|  |  | ||||||
|  |  | ||||||
|                 bool IsUnsafe = false; |  | ||||||
|                 var FixedStructTypes = new List<string>(); |  | ||||||
|  |  | ||||||
|                 foreach (var Member in Type.Members) |  | ||||||
|                 { |  | ||||||
|                     var IsStruct = false; |  | ||||||
|                     var TypeName = (Member.Type.IsPointer ? "IntPtr" : Member.Type.Name).Trim(); |  | ||||||
|                     if (TypeName.Contains("struct")) |  | ||||||
|                     { |  | ||||||
|                         IsStruct = true; |  | ||||||
|                         TypeName = TypeName.Substring(TypeName.LastIndexOf("struct") + "struct".Length); |  | ||||||
|                     } |  | ||||||
|  |  | ||||||
|                     if (TypeName.Contains("enum")) |  | ||||||
|                     { |  | ||||||
|                         TypeName = TypeName.Substring(TypeName.LastIndexOf("enum") + "enum".Length); |  | ||||||
|                     } |  | ||||||
|  |  | ||||||
|                     if (TypeName.Contains("unsigned int")) |  | ||||||
|                     { |  | ||||||
|                         TypeName = TypeName.Replace("unsigned int", "uint"); |  | ||||||
|                     } |  | ||||||
|  |  | ||||||
|                     if (TypeName.Contains("unsigned char")) |  | ||||||
|                     { |  | ||||||
|                         TypeName = TypeName.Replace("unsigned char", "byte"); |  | ||||||
|                     } |  | ||||||
|  |  | ||||||
|                     var IsFixed = false; |  | ||||||
|                     var VariableDec = VariableDeclarator(Member.Name); |  | ||||||
|                     if (TypeName.Contains("[")) |  | ||||||
|                     { |  | ||||||
|                         int arraycount = int.Parse(TypeName.Split('[', ']')[1].Substring("0x".Length), System.Globalization.NumberStyles.HexNumber); |  | ||||||
|                         TypeName = TypeName.Split('[', ']')[0].Trim(); |  | ||||||
|                         if (IsStruct) |  | ||||||
|                         { |  | ||||||
|                             if (!FixedStructTypes.Contains($"_{TypeName}_e_FixedBuffer_{arraycount}")) |  | ||||||
|                             { |  | ||||||
|                                 FixedStructTypes.Add($"_{TypeName}_e_FixedBuffer_{arraycount}"); |  | ||||||
|                                 var FixedBufferStruct = StructDeclaration($"_{TypeName}_e_FixedBuffer_{arraycount}") |  | ||||||
|                                     .WithModifiers( |  | ||||||
|                                         TokenList( |  | ||||||
|                                             new[]{ |  | ||||||
|                                         Token(SyntaxKind.PublicKeyword), |  | ||||||
|                                         Token(SyntaxKind.UnsafeKeyword)})); |  | ||||||
|  |  | ||||||
|                                 for (int i = 0; i < arraycount; i++) |  | ||||||
|                                 { |  | ||||||
|                                     FixedBufferStruct = FixedBufferStruct.AddMembers( |  | ||||||
|                         FieldDeclaration( |  | ||||||
|                             VariableDeclaration( |  | ||||||
|                                 IdentifierName(TypeName)) |  | ||||||
|                             .WithVariables( |  | ||||||
|                                 SingletonSeparatedList<VariableDeclaratorSyntax>( |  | ||||||
|                                     VariableDeclarator( |  | ||||||
|                                         Identifier($"{Member.Name}{i}"))))) |  | ||||||
|                         .WithModifiers( |  | ||||||
|                             TokenList( |  | ||||||
|                                 Token(SyntaxKind.PublicKeyword)))); |  | ||||||
|                                 } |  | ||||||
|  |  | ||||||
|  |  | ||||||
|                                 FixedBufferStruct = FixedBufferStruct.AddMembers(IndexerDeclaration( |  | ||||||
|                         RefType( |  | ||||||
|                             IdentifierName(TypeName))) |  | ||||||
|                     .WithModifiers( |  | ||||||
|                         TokenList( |  | ||||||
|                             Token(SyntaxKind.PublicKeyword))) |  | ||||||
|                     .WithParameterList( |  | ||||||
|                         BracketedParameterList( |  | ||||||
|                             SingletonSeparatedList<ParameterSyntax>( |  | ||||||
|                                 Parameter( |  | ||||||
|                                     Identifier("index")) |  | ||||||
|                                 .WithType( |  | ||||||
|                                     PredefinedType( |  | ||||||
|                                         Token(SyntaxKind.IntKeyword)))))) |  | ||||||
|                     .WithAccessorList( |  | ||||||
|                         AccessorList( |  | ||||||
|                             SingletonList<AccessorDeclarationSyntax>( |  | ||||||
|                                 AccessorDeclaration( |  | ||||||
|                                     SyntaxKind.GetAccessorDeclaration) |  | ||||||
|                                 .WithBody( |  | ||||||
|                                     Block( |  | ||||||
|                                         SingletonList<StatementSyntax>( |  | ||||||
|                                             FixedStatement( |  | ||||||
|                                                 VariableDeclaration( |  | ||||||
|                                                     PointerType( |  | ||||||
|                                                         IdentifierName(TypeName))) |  | ||||||
|                                                 .WithVariables( |  | ||||||
|                                                     SingletonSeparatedList<VariableDeclaratorSyntax>( |  | ||||||
|                                                         VariableDeclarator( |  | ||||||
|                                                             Identifier("e")) |  | ||||||
|                                                         .WithInitializer( |  | ||||||
|                                                             EqualsValueClause( |  | ||||||
|                                                                 PrefixUnaryExpression( |  | ||||||
|                                                                     SyntaxKind.AddressOfExpression, |  | ||||||
|                                                                     IdentifierName($"{Member.Name}0")))))), |  | ||||||
|                                                 ReturnStatement( |  | ||||||
|                                                     RefExpression( |  | ||||||
|                                                         ElementAccessExpression( |  | ||||||
|                                                             IdentifierName("e")) |  | ||||||
|                                                         .WithArgumentList( |  | ||||||
|                                                             BracketedArgumentList( |  | ||||||
|                                                                 SingletonSeparatedList<ArgumentSyntax>( |  | ||||||
|                                                                     Argument( |  | ||||||
|                                                                         IdentifierName("index"))))))))))))))); |  | ||||||
|                                 Raylibnamespace = Raylibnamespace.AddMembers(FixedBufferStruct); |  | ||||||
|                             } |  | ||||||
|                             TypeName = $"_{TypeName}_e_FixedBuffer_{arraycount}"; |  | ||||||
|                         } |  | ||||||
|                         else |  | ||||||
|                         { |  | ||||||
|                             VariableDec = VariableDec.WithArgumentList( |  | ||||||
|                                     BracketedArgumentList( |  | ||||||
|                                         SingletonSeparatedList<ArgumentSyntax>( |  | ||||||
|                                             Argument( |  | ||||||
|                                                 LiteralExpression( |  | ||||||
|                                                     SyntaxKind.NumericLiteralExpression, |  | ||||||
|                                                     Literal(arraycount)))))); |  | ||||||
|                             IsFixed = true; |  | ||||||
|                             IsUnsafe = true; |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|  |  | ||||||
|                     var variable = VariableDeclaration(ParseTypeName(TypeName)).AddVariables(VariableDec); |  | ||||||
|                     var field = FieldDeclaration(variable).AddModifiers(Token(SyntaxKind.PublicKeyword)); |  | ||||||
|                     if (IsFixed) field = field.AddModifiers(Token(SyntaxKind.FixedKeyword)); |  | ||||||
|                     Struct = Struct.AddMembers(field); |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 if (IsUnsafe) Struct = Struct.AddModifiers(Token(SyntaxKind.UnsafeKeyword)); |  | ||||||
|                 Raylibnamespace = Raylibnamespace.AddMembers(Struct); |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             { |  | ||||||
|                 var RaylibClass = ClassDeclaration(fileName) |  | ||||||
|         .WithAttributeLists( |  | ||||||
|             SingletonList<AttributeListSyntax>( |  | ||||||
|                 AttributeList( |  | ||||||
|                     SingletonSeparatedList<AttributeSyntax>( |  | ||||||
|                         Attribute( |  | ||||||
|                             IdentifierName("SuppressUnmanagedCodeSecurity")))))) |  | ||||||
|         .WithModifiers( |  | ||||||
|             TokenList( |  | ||||||
|                 new[]{ |  | ||||||
|                 Token(SyntaxKind.PublicKeyword), |  | ||||||
|                 Token(SyntaxKind.StaticKeyword), |  | ||||||
|                 Token(SyntaxKind.PartialKeyword)})); |  | ||||||
|  |  | ||||||
|                 var LibraryNameField = FieldDeclaration( |  | ||||||
|                     VariableDeclaration( |  | ||||||
|                         PredefinedType( |  | ||||||
|                             Token(SyntaxKind.StringKeyword))) |  | ||||||
|                     .WithVariables( |  | ||||||
|                         SingletonSeparatedList<VariableDeclaratorSyntax>( |  | ||||||
|                             VariableDeclarator( |  | ||||||
|                                 Identifier("nativeLibName")) |  | ||||||
|                             .WithInitializer( |  | ||||||
|                                 EqualsValueClause( |  | ||||||
|                                     LiteralExpression( |  | ||||||
|                                         SyntaxKind.StringLiteralExpression, |  | ||||||
|                                         Literal("raylib"))))))) |  | ||||||
|                 .WithModifiers( |  | ||||||
|                     TokenList( |  | ||||||
|                         new[]{ |  | ||||||
|                         Token(SyntaxKind.PublicKeyword), |  | ||||||
|                         Token(SyntaxKind.ConstKeyword)})); |  | ||||||
|                  |  | ||||||
|                 RaylibClass = RaylibClass.AddMembers(LibraryNameField); |  | ||||||
|                 foreach (var Func in Funcs) |  | ||||||
|                 { |  | ||||||
|                     var typename = Func.ReturnType.IsPointer ? "IntPtr" : Func.ReturnType.Name; |  | ||||||
|                     var Function = MethodDeclaration(ParseTypeName(typename), |  | ||||||
|                     Identifier(Func.Name)) |  | ||||||
|                 .WithAttributeLists( |  | ||||||
|                     SingletonList( |  | ||||||
|                         AttributeList( |  | ||||||
|                             SingletonSeparatedList( |  | ||||||
|                                 Attribute( |  | ||||||
|                                     IdentifierName("DllImport")) |  | ||||||
|                                 .WithArgumentList( |  | ||||||
|                                     AttributeArgumentList( |  | ||||||
|                                         SeparatedList<AttributeArgumentSyntax>( |  | ||||||
|                                             new SyntaxNodeOrToken[]{ |  | ||||||
|                                             AttributeArgument( |  | ||||||
|                                                 IdentifierName("nativeLibName")), |  | ||||||
|                                             Token(SyntaxKind.CommaToken), |  | ||||||
|                                             AttributeArgument( |  | ||||||
|                                                 MemberAccessExpression( |  | ||||||
|                                                     SyntaxKind.SimpleMemberAccessExpression, |  | ||||||
|                                                     IdentifierName("CallingConvention"), |  | ||||||
|                                                     IdentifierName("Cdecl"))) |  | ||||||
|                                             .WithNameEquals( |  | ||||||
|                                                 NameEquals( |  | ||||||
|                                                     IdentifierName("CallingConvention")))}))))))) |  | ||||||
|                 .WithModifiers( |  | ||||||
|                     TokenList( |  | ||||||
|                         new[]{ |  | ||||||
|                         Token(SyntaxKind.PublicKeyword), |  | ||||||
|                         Token(SyntaxKind.StaticKeyword), |  | ||||||
|                         Token(SyntaxKind.ExternKeyword) |  | ||||||
|                         })).WithSemicolonToken(Token(SyntaxKind.SemicolonToken)); |  | ||||||
|  |  | ||||||
|                     for (int i = 0; i < Func.Params.Count; i++) |  | ||||||
|                     { |  | ||||||
|                         var Param = Func.Params[i]; |  | ||||||
|                         var TypeName = (Param.Type.IsPointer ? "IntPtr" : Param.Type.Name).Trim(); |  | ||||||
|                         if (TypeName.Contains("unsigned int")) |  | ||||||
|                         { |  | ||||||
|                             TypeName = TypeName.Replace("unsigned int", "uint"); |  | ||||||
|                         } |  | ||||||
|  |  | ||||||
|                         if (TypeName.Contains("...")) |  | ||||||
|                         { |  | ||||||
|                             TypeName = "params object[]"; |  | ||||||
|                             Param.Name = "args"; |  | ||||||
|                         } |  | ||||||
|  |  | ||||||
|                         if (TypeName.Contains("unsigned char")) |  | ||||||
|                         { |  | ||||||
|                             TypeName = TypeName.Replace("unsigned char", "byte"); |  | ||||||
|                         } |  | ||||||
|  |  | ||||||
|                         if (TypeName.Contains("struct")) |  | ||||||
|                         { |  | ||||||
|                             TypeName = TypeName.Substring(TypeName.LastIndexOf("struct") + "struct".Length); |  | ||||||
|                         } |  | ||||||
|                         Function = Function.AddParameterListParameters( |  | ||||||
|                         Parameter( |  | ||||||
|                             Identifier(Param.Name)) |  | ||||||
|                         .WithType( |  | ||||||
|                             IdentifierName(TypeName))); |  | ||||||
|                     } |  | ||||||
|  |  | ||||||
|                     RaylibClass = RaylibClass.AddMembers(Function); |  | ||||||
|                 } |  | ||||||
|                 Raylibnamespace = Raylibnamespace.AddMembers(RaylibClass); |  | ||||||
|             }          |  | ||||||
|             codetree = codetree.AddMembers(Raylibnamespace); |  | ||||||
|             Console.WriteLine(codetree.NormalizeWhitespace().ToFullString()); |  | ||||||
|             File.WriteAllText($"{fileName}.cs", codetree.NormalizeWhitespace().ToFullString()); |  | ||||||
|     |  | ||||||
|             Console.WriteLine("Finished generating bindings for file "); |  | ||||||
|             Console.ReadLine(); |  | ||||||
|  |  | ||||||
|             /* Raylib-cs |  | ||||||
|             * Raylib.cs - Core bindings to raylib |  | ||||||
|             * Copyright 2019 Chris Dill |  | ||||||
|             * |  | ||||||
|             * Release under zLib License. |  | ||||||
|             * See LICENSE for details. |  | ||||||
|             */ |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
										
											Binary file not shown.
										
									
								
							
		Reference in New Issue
	
	Block a user