protected void WriteStruct(SpecStruct info) { if (info.TypeHandle || info.TypeHandle64) { WriteStructHandle(info); return; } #line default #line hidden #line 13 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write("// "); #line default #line hidden #line 14 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.Name)); #line default #line hidden #line 14 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write("\r\n"); #line default #line hidden #line 15 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" if (info.Members.Count > 1) { #line default #line hidden #line 18 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write("[StructLayout ("); #line default #line hidden #line 19 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.Union ? "LayoutKind.Explicit" : "LayoutKind.Sequential")); #line default #line hidden #line 19 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(")]\r\n"); #line default #line hidden #line 20 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" } #line default #line hidden #line 22 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write("public unsafe partial struct "); #line default #line hidden #line 23 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.MapName)); #line default #line hidden #line 23 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write("\r\n{\r\n"); #line default #line hidden #line 25 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" foreach (var item in info.Members) { #line default #line hidden #line 28 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write("\t// "); #line default #line hidden #line 29 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(item.DebugLog())); #line default #line hidden #line 29 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write("\r\n"); #line default #line hidden #line 30 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" if (info.Members.Count > 1 && info.Union) { #line default #line hidden #line 33 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write("\t[FieldOffset (0)]\r\n"); #line default #line hidden #line 35 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" } if (item.FixedSize == 0 && item.FixedSizeEnum == null) { #line default #line hidden #line 39 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write("\tpublic "); #line default #line hidden #line 40 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(GetTypeMap(item))); #line default #line hidden #line 40 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(" "); #line default #line hidden #line 40 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(item.MapName)); #line default #line hidden #line 40 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(";\r\n"); #line default #line hidden #line 41 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" } else { #line default #line hidden #line 45 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write("\tpublic fixed "); #line default #line hidden #line 46 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(GetTypeMap(item))); #line default #line hidden #line 46 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(" "); #line default #line hidden #line 46 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(item.MapName)); #line default #line hidden #line 46 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write("["); #line default #line hidden #line 46 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(item.FixedSize)); #line default #line hidden #line 46 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write("];\r\n"); #line default #line hidden #line 47 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" } } #line default #line hidden #line 50 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write("}\r\n"); #line default #line hidden #line 52 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" }
static void ParseStruct(Category category, XPathNavigator node) { var result = new SpecStruct { Union = category == Category.Union, ReadOnly = node.GetAttribute <bool> ("returnedonly") }; result.Name = result.MapName = node.GetAttribute("name"); GetSpecType(result.Name).TypeObject = result; structMap.Add(result.Name, result); foreach (XPathNavigator member in node.Select("member")) { SpecField field = new SpecField(); var comment = member.CreateNavigator(); if (comment.MoveToNext(XPathNodeType.Comment)) { field.Comment = comment.Value; } var memberNode = member.SelectSingleNode("type"); if (memberNode != null) { field.Type = GetSpecType(memberNode.Value); if (memberNode.MoveToNext(XPathNodeType.Text)) { field.IsPointer = memberNode.Value.Contains("*"); } } else { Console.WriteLine("Missing type? " + result.Name); } memberNode = member.SelectSingleNode("name"); if (memberNode != null) { field.Name = field.MapName = memberNode.Value; // check field size if (memberNode.MoveToNext(XPathNodeType.Text)) { var txt = memberNode.Value; var match = Regex.Match(txt, @"[(\d+)]", RegexOptions.CultureInvariant); if (match.Success) { field.FixedSize = int.Parse(match.Value, CultureInfo.InvariantCulture); result.HasFixedSizeField = true; } } } // check field enum const size memberNode = member.SelectSingleNode("enum"); if (memberNode != null) { var enumMem = enumMemberMap[memberNode.Value]; //var enumNode = member.OwnerDocument.SelectSingleNode ( "//enum[@name='" + memberNode.InnerText + "']" ); //field.FixedSize = enumNode.ReadAttribute<int> ( "value" ); field.FixedSize = int.Parse(enumMem.Value, CultureInfo.InvariantCulture); field.FixedSizeEnum = memberNode.Value; result.HasFixedSizeField = true; } field.Visibility = "public"; result.Members.Add(field); } }
protected void WriteStructHandle(SpecStruct info) { string type = info.TypeHandle ? "IntPtr" : "ulong"; string typeEmpty = info.TypeHandle ? "IntPtr.Zero" : "0"; #line default #line hidden #line 87 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write("// "); #line default #line hidden #line 88 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.Name)); #line default #line hidden #line 88 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write("\r\n[DebuggerDisplay ( \"{ToString()}\" )]\r\npublic unsafe partial struct "); #line default #line hidden #line 90 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.MapName)); #line default #line hidden #line 90 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(" : IEquatable<"); #line default #line hidden #line 90 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.MapName)); #line default #line hidden #line 90 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(">\r\n{\r\n\tprivate "); #line default #line hidden #line 92 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(type)); #line default #line hidden #line 92 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(" handle;\r\n\r\n\tpublic static readonly "); #line default #line hidden #line 94 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.MapName)); #line default #line hidden #line 94 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(" Zero;\r\n\r\n\tpublic "); #line default #line hidden #line 96 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.MapName)); #line default #line hidden #line 96 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write("("); #line default #line hidden #line 96 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(type)); #line default #line hidden #line 96 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(" value)\r\n\t{\r\n\t\thandle = value;\r\n\t}\r\n\r\n\tpublic bool IsZero { get { return handle =" + "= "); #line default #line hidden #line 101 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(typeEmpty)); #line default #line hidden #line 101 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write("; } }\r\n\t\r\n\tpublic bool Equals("); #line default #line hidden #line 103 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.MapName)); #line default #line hidden #line 103 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(" other)\r\n\t{\r\n\t\treturn other.handle == handle;\r\n\t}\r\n\tpublic override bool Equals(o" + "bject obj)\r\n\t{\r\n\t\treturn obj is "); #line default #line hidden #line 109 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.MapName)); #line default #line hidden #line 109 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(" && (("); #line default #line hidden #line 109 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.MapName)); #line default #line hidden #line 109 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(")obj).handle == handle;\r\n\t}\r\n\tpublic override int GetHashCode()\r\n\t{\r\n\t\treturn han" + "dle.GetHashCode ();\r\n\t}\r\n\tpublic override string ToString()\r\n\t{\r\n\t\treturn handle" + ".ToString ("); #line default #line hidden #line 117 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.TypeHandle ? "" : "CultureInfo.InvariantCulture")); #line default #line hidden #line 117 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(");\r\n\t}\r\n\t\r\n\tpublic static bool operator ==("); #line default #line hidden #line 120 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.MapName)); #line default #line hidden #line 120 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(" value1, "); #line default #line hidden #line 120 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.MapName)); #line default #line hidden #line 120 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(" value2)\r\n\t{\r\n\t\treturn value1.handle == value2.handle;\r\n\t}\r\n\tpublic static bool o" + "perator !=("); #line default #line hidden #line 124 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.MapName)); #line default #line hidden #line 124 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(" value1, "); #line default #line hidden #line 124 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.MapName)); #line default #line hidden #line 124 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(" value2)\r\n\t{\r\n\t\treturn value1.handle != value2.handle;\r\n\t}\r\n\tpublic static explic" + "it operator "); #line default #line hidden #line 128 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(type)); #line default #line hidden #line 128 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write("("); #line default #line hidden #line 128 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.MapName)); #line default #line hidden #line 128 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(" value)\r\n\t{\r\n\t\treturn value.handle;\r\n\t}\r\n\tpublic static explicit operator "); #line default #line hidden #line 132 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.MapName)); #line default #line hidden #line 132 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write("("); #line default #line hidden #line 132 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(type)); #line default #line hidden #line 132 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(" value)\r\n\t{\r\n\t\treturn new "); #line default #line hidden #line 134 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(this.ToStringHelper.ToStringWithCulture(info.MapName)); #line default #line hidden #line 134 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" this.Write(" (value);\r\n\t}\r\n}\r\n"); #line default #line hidden #line 137 "F:\Projects\Crow.Graphics.OpenGl\Crow.Graphics.Vulkan.SpecGen\StructTemplete.tt" }
static void Main(string[] args) { string input = "vk.xml"; string mapping = "mapping.xml"; string export = ""; string api = "vulkan"; string version = "1.0"; if (args.Length >= 4) { input = args[0]; mapping = args[1]; export = args[2]; api = args[3]; version = args[4]; } System.Diagnostics.Debugger.Launch(); var ser = new XmlSerializer(typeof(Mappings)); Mappings maps; using (var file = System.IO.File.OpenRead(mapping)) { maps = (Mappings)ser.Deserialize(file); } XPathDocument specDoc; var set = new XmlReaderSettings() { IgnoreWhitespace = true, IgnoreProcessingInstructions = true }; using (var reader = XmlReader.Create(input, set)) { specDoc = new XPathDocument(reader); } var root = specDoc.CreateNavigator(); foreach (XPathNavigator item in root.Select(@"//enums")) { ParseEnum(item); } foreach (XPathNavigator item in root.Select(@"//types/type")) { var category = item.GetAttribute <Category> ("category"); if (category == Category.Funcpointer) { ParseDelegate(item); } else if (category == Category.Struct || category == Category.Union) { ParseStruct(category, item); } else if (category != Category.Include && category != Category.Define) { ParseTypes(category, item); } } foreach (XPathNavigator item in root.Select(@"//commands/command")) { ParseCommand(item); } var featureNodes = root.Select(@"//feature[@api = '" + api + "' and @number <= '" + version + "']/*/*"); var extensionNodes = root.Select(@"//extensions/extension/*/*"); foreach (XPathNavigator node in extensionNodes) { var extension = node.CreateNavigator(); extension.MoveToParent(); extension.MoveToParent(); var exsupported = extension.GetAttribute("supported"); if (!Regex.IsMatch(api, "^(" + exsupported + ")$", RegexOptions.CultureInvariant)) { continue; } var exname = extension.GetAttribute("name"); var exnumber = extension.GetAttribute <int> ("number"); var spec = GetSpecExtension(exname); spec.Number = exnumber; if (node.Name == "enum") { var name = node.GetAttribute("name"); var extends = node.GetAttribute("extends"); var dir = node.GetAttribute("dir"); var offset = node.GetAttributeNullable <int> ("offset"); var value = node.GetAttribute("value"); var bitpos = node.GetAttributeNullable <int> ("bitpos"); var comment = node.GetAttribute("comment"); if (extends != null) { if (offset.HasValue) { var mem = GetSpecEnumMember(name); mem.Value = dir + ExtensionEnumOffset(exnumber, offset.Value); mem.Comment = comment; enumMap[extends].Members.Add(mem); } if (bitpos.HasValue) { var mem = GetSpecEnumMember(name); mem.BitPos = bitpos.Value; mem.Comment = comment; enumMap[extends].Members.Add(mem); } } if (value != null) { SpecEnumMember mem; if (enumMemberMap.TryGetValue(value, out mem)) { var field = new SpecField { Visibility = "public const", Name = name, MapName = name, MapType = "int", Value = mem.Value, }; spec.Members.Add(field); } else { var field = new SpecField { Visibility = "public const", Name = name, MapName = name, MapType = value.Contains("\"") ? "string" : "int", Value = value, }; spec.Members.Add(field); } } } if (node.Name == "command") { var name = node.GetAttribute("name"); spec.Commands.Add(commandMap[name]); } } foreach (var item in extensionMap.Values) { item.Commands.Sort((a, b) => string.Compare(a.Name, b.Name)); } foreach (var mapType in typeMap.Values) { foreach (var map in maps.Maps) { if (map.Type == null) { continue; } var match = Regex.Match(mapType.MapName, map.Type, RegexOptions.CultureInvariant); if (match.Success) { if (map.MapName != null) { if (map.MapName.Contains("$")) { mapType.MapName = match.Result(map.MapName); } else { mapType.MapName = map.MapName; } } if (map.MapType != null) { mapType.MapType = map.MapType; } mapType.TypeHandle |= map.TypeHandle; mapType.TypeHandle64 |= map.TypeHandle64; } } } #region Enum Mapping foreach (var item in enumMap.Values) { item.MapName = maps.MapNameMatches((a) => a.Enum, null, item.MapName); for (int i = 0; i < item.Members.Count; i++) { var member = item.Members[i]; member.MapName = maps.MapNameMatches((a) => a.EnumItem, item.Name, member.MapName); foreach (var membMap in maps.FindMatch((a) => a.Field, item.Name, member.Name)) { if (membMap.MapType != null) { member.MapType = membMap.MapType; } if (membMap.Visibility != null) { member.Visibility = membMap.Visibility; } } } } #endregion #region Command Mapping foreach (var item in commandMap.Values) { item.MapName = maps.MapNameMatches((a) => a.Command, null, item.MapName); for (int i = 0; i < item.Parameters.Count; i++) { var param = item.Parameters[i]; param.MapName = maps.MapNameMatches((a) => a.Param, item.Name, param.MapName); foreach (var membMap in maps.FindMatch((a) => a.Param, item.Name, param.Name)) { if (membMap.MapType != null) { param.MapType = membMap.MapType; } if (membMap.Attribute != null) { param.Attribute = membMap.Attribute; } param.Optional |= membMap.Optional; } } } #endregion #region Delegate Mapping foreach (var item in delegateMap.Values) { item.MapName = maps.MapNameMatches((a) => a.Command, null, item.MapName); for (int i = 0; i < item.Parameters.Count; i++) { var param = item.Parameters[i]; param.MapName = maps.MapNameMatches((a) => a.Param, item.Name, param.MapName); foreach (var membMap in maps.FindMatch((a) => a.Param, item.Name, param.Name)) { if (membMap.MapType != null) { param.MapType = membMap.MapType; } if (membMap.Attribute != null) { param.Attribute = membMap.Attribute; } param.Optional |= membMap.Optional; } } } #endregion #region Struct Mapping foreach (var item in structMap.Values) { item.MapName = maps.MapNameMatches((a) => a.Struct, null, item.MapName); for (int i = 0; i < item.Members.Count; i++) { var member = item.Members[i]; member.MapName = maps.MapNameMatches((a) => a.Field, item.Name, member.MapName); foreach (var membMap in maps.FindMatch((a) => a.Field, item.Name, member.Name)) { if (membMap.MapType != null) { member.MapType = membMap.MapType; } if (membMap.FixedSize != 0) { member.FixedSize = membMap.FixedSize; member.FixedSizeEnum = null; } } } } #endregion foreach (var item in extensionMap.Values) { item.MapName = maps.MapNameMatches((a) => a.Extension, null, item.MapName); foreach (var member in item.Members) { member.MapName = maps.MapNameMatches((a) => a.Field, item.Name, member.MapName); } } foreach (var mapType in typeMap.Values) { var maptype = mapType.FindType(); if (maptype == null && mapType.TypeObject == null) { Console.WriteLine("Missing type mapping {0}", mapType.Name); } foreach (var map in mapType.IteratorParents()) { if (map.TypeHandle || map.TypeHandle64) { var spec = new SpecStruct() { Name = mapType.Name, MapName = mapType.MapName, TypeHandle = map.TypeHandle, TypeHandle64 = map.TypeHandle64 }; structMap.Add(mapType.Name, spec); break; } } } if (!string.IsNullOrWhiteSpace(export) && !Directory.Exists(export)) { Directory.CreateDirectory(export); } string text; CodeGenerator gen; var tmp = new ClassTemplate() { Namespace = "Crow.Graphics.Vulkan", Accessor = null }; //tmp.Objects.AddRange ( structMap.Values.OrderBy ( (a) => a.MapName ) ); //tmp.Objects.AddRange ( enumMap.Values.OrderBy ( (a) => a.MapName ) ); //tmp.Objects.AddRange ( delegateMap.Values.OrderBy ( (a) => a.MapName ) ); //tmp.Objects.AddRange ( extensionMap.Values.OrderBy ( (a) => a.MapName ) ); //Enumerations.cs tmp.Objects.AddRange(enumMap.Values.OrderBy((a) => a.MapName)); gen = new CodeGenerator(); gen.Classes.Add(tmp); text = gen.TransformText(); System.IO.File.WriteAllText(Path.Combine(export, "Enumerations.cs"), text); tmp.Objects.Clear(); //Structures.cs tmp.Objects.AddRange(structMap.Values.OrderBy((a) => a.MapName)); gen = new CodeGenerator(); gen.Classes.Add(tmp); text = gen.TransformText(); System.IO.File.WriteAllText(Path.Combine(export, "Structures.cs"), text); tmp.Objects.Clear(); //Delegates.cs tmp.Objects.AddRange(delegateMap.Values.OrderBy((a) => a.MapName)); gen = new CodeGenerator(); gen.Classes.Add(tmp); text = gen.TransformText(); System.IO.File.WriteAllText(Path.Combine(export, "Delegates.cs"), text); tmp.Objects.Clear(); //Functions.cs tmp.Objects.AddRange(extensionMap.Values.OrderBy((a) => a.MapName)); var dic = new Dictionary <string, ClassTemplate> (); foreach (XPathNavigator item in featureNodes) { var feature = item.CreateNavigator(); feature.MoveToParent(); feature.MoveToParent(); var feaName = feature.GetAttribute("name"); string className = null; string fileNamespace = null; string file = null; foreach (var map in maps.FindMatch((a) => a.Feature, null, feaName)) { className = map.MapName ?? className; fileNamespace = map.Namespace ?? fileNamespace; file = map.File ?? file; } ClassTemplate classTemp; if (!dic.TryGetValue(file, out classTemp)) { classTemp = new ClassTemplate(); dic.Add(file, classTemp); } classTemp.Namespace = fileNamespace; classTemp.Name = className; if (item.Name == "command") { var name = item.GetAttribute("name"); classTemp.Objects.Add(commandMap[name]); } } foreach (var item in dic.Values) { item.Objects.Sort((a, b) => string.Compare(((SpecCommand)a).MapName, ((SpecCommand)b).MapName)); } tmp.NestedClass.AddRange(dic.Values); gen = new CodeGenerator(); gen.Classes.Add(tmp); text = gen.TransformText(); System.IO.File.WriteAllText(Path.Combine(export, "Functions.cs"), text); //tmp.Objects.Clear (); Console.WriteLine("done"); //Console.ReadKey (); }