From 51e57995b7b21657c8c850c4be640a090cdccd78 Mon Sep 17 00:00:00 2001 From: Amer Koleci Date: Thu, 1 Sep 2022 14:22:42 +0200 Subject: [PATCH] Improve Api usage and handle better code generation. --- src/Generator/ApiData.cs | 2 + src/Generator/CodeWriter.cs | 5 +- src/Generator/Program.cs | 62 +++++++++++++------ .../Generated/Graphics/Dxgi.Common.cs | 2 +- .../Graphics/Dxgi.Common.Manual.cs | 2 +- 5 files changed, 51 insertions(+), 22 deletions(-) diff --git a/src/Generator/ApiData.cs b/src/Generator/ApiData.cs index d8d2700..880d8bd 100644 --- a/src/Generator/ApiData.cs +++ b/src/Generator/ApiData.cs @@ -14,6 +14,8 @@ public class ApiDataType { public string Kind { get; set; } public string Name { get; set; } + public string TargetKind { get; set; } + public string Api { get; set; } // Kind == Array public ApiDataArrayShape Shape { get; set; } diff --git a/src/Generator/CodeWriter.cs b/src/Generator/CodeWriter.cs index 34e0087..d04b57d 100644 --- a/src/Generator/CodeWriter.cs +++ b/src/Generator/CodeWriter.cs @@ -11,9 +11,12 @@ public sealed class CodeWriter : IDisposable private readonly StreamWriter _writer; public int IndentLevel { get; private set; } + public string Api { get; } - public CodeWriter(string fileName, string ns, params string[] usingNamespaces) + public CodeWriter(string fileName, string api, string ns, params string[] usingNamespaces) { + Api = api; + _indentStrings = new string[10]; for (int i = 0; i < _indentStrings.Length; i++) { diff --git a/src/Generator/Program.cs b/src/Generator/Program.cs index 61f7846..0229914 100644 --- a/src/Generator/Program.cs +++ b/src/Generator/Program.cs @@ -1,10 +1,7 @@ // Copyright © Amer Koleci and Contributors. // Licensed under the MIT License (MIT). See LICENSE in the repository root for more information. -using System.ComponentModel.DataAnnotations; using System.Text; -using System.Xml.Linq; -using Microsoft.VisualBasic.FileIO; using Newtonsoft.Json; namespace Generator; @@ -32,7 +29,7 @@ public static class Program {"Single", "float" }, {"Double", "double" }, - { "BOOL", "Bool32" }, + { "Foundation.BOOL", "Bool32" }, }; private static readonly Dictionary s_knownTypesPrefixes = new() @@ -74,26 +71,43 @@ public static class Program foreach (string jsonFile in jsons) { - string outputFolder = Path.Combine(outputPath, "Graphics"); - if (!Directory.Exists(outputFolder)) - { - Directory.CreateDirectory(outputFolder); - } - string finalPath = Path.Combine(AppContext.BaseDirectory, "win32json", "api", jsonFile); string jsonData = File.ReadAllText(finalPath); ApiData? api = JsonConvert.DeserializeObject(jsonData); - Generate(api!, outputFolder); + Generate(api!, outputPath, jsonFile); } return 0; } - private static void Generate(ApiData api, string outputPath) + private static void Generate(ApiData api, string outputPath, string jsonFile) { + string[] splits = jsonFile.Split(".", StringSplitOptions.RemoveEmptyEntries); + string folderRoot = splits[0]; + string outputFolder = Path.Combine(outputPath, folderRoot); + + if (!Directory.Exists(outputFolder)) + { + Directory.CreateDirectory(outputFolder); + } + + string fileName = string.Empty; + for (int i = 1; i < splits.Length - 1; i++) + { + if(string.IsNullOrEmpty(fileName) == false) + { + fileName += "."; + } + + fileName += splits[i]; + } + string ns = fileName; + fileName += ".cs"; + using var writer = new CodeWriter( - Path.Combine(outputPath, "Dxgi.Common.cs"), - "Win32.Graphics.Dxgi"); + Path.Combine(outputFolder, fileName), + $"{folderRoot}.{ns}", + $"Win32.{folderRoot}.{ns}"); GenerateConstants(writer, api); GenerateTypes(writer, api); @@ -143,7 +157,7 @@ public static class Program string csTypeName = GetDataTypeName(enumType.Name, out string enumPrefix); string baseTypeName = GetTypeName(enumType.IntegerBase); - AddCsMapping(enumType.Name, csTypeName); + AddCsMapping(writer.Api, enumType.Name, csTypeName); writer.WriteLine($"/// {enumType.Name}"); using (writer.PushBlock($"public enum {csTypeName} : {baseTypeName}")) @@ -166,7 +180,7 @@ public static class Program private static void GenerateStruct(CodeWriter writer, ApiType structType) { string csTypeName = GetDataTypeName(structType.Name, out string structPrefix); - AddCsMapping(structType.Name, csTypeName); + AddCsMapping(writer.Api, structType.Name, csTypeName); writer.WriteLine($"/// {structType.Name}"); using (writer.PushBlock($"public partial struct {csTypeName}")) @@ -189,6 +203,7 @@ public static class Program } fieldTypeName = GetTypeName(field.Type.Child); + fieldTypeName = NormalizeTypeName(writer.Api, fieldTypeName); if (canUseFixed) { @@ -233,6 +248,7 @@ public static class Program } else { + fieldTypeName = NormalizeTypeName(writer.Api, fieldTypeName); writer.WriteLine($"public {fieldTypeName} {fieldValueName};"); } } @@ -251,6 +267,14 @@ public static class Program return false; } + private static string NormalizeTypeName(string api, string typeName) + { + if (!typeName.StartsWith(api)) + return typeName; + + return typeName.Replace(api + ".", ""); + } + private static string GetDataTypeName(string typeName, out string prefix) { prefix = typeName; @@ -414,7 +438,7 @@ public static class Program { if (dataType.Kind == "ApiRef") { - return GetTypeName(dataType.Name); + return GetTypeName($"{dataType.Api}.{dataType.Name}"); } else if (dataType.Kind == "Array") { @@ -428,9 +452,9 @@ public static class Program return GetTypeName(dataType.Name); } - private static void AddCsMapping(string typeName, string csTypeName) + private static void AddCsMapping(string api, string typeName, string csTypeName) { - s_csNameMappings[typeName] = csTypeName; + s_csNameMappings[$"{api}.{typeName}"] = $"{api}.{csTypeName}"; } private static string GetTypeName(string name) diff --git a/src/Vortice.Win32/Generated/Graphics/Dxgi.Common.cs b/src/Vortice.Win32/Generated/Graphics/Dxgi.Common.cs index e62ae26..36e4489 100644 --- a/src/Vortice.Win32/Generated/Graphics/Dxgi.Common.cs +++ b/src/Vortice.Win32/Generated/Graphics/Dxgi.Common.cs @@ -11,7 +11,7 @@ using System; using System.Runtime.CompilerServices; using System.Diagnostics.CodeAnalysis; -namespace Win32.Graphics.Dxgi; +namespace Win32.Graphics.Dxgi.Common; public static partial class Apis { diff --git a/src/Vortice.Win32/Graphics/Dxgi.Common.Manual.cs b/src/Vortice.Win32/Graphics/Dxgi.Common.Manual.cs index 11ca908..55e8efd 100644 --- a/src/Vortice.Win32/Graphics/Dxgi.Common.Manual.cs +++ b/src/Vortice.Win32/Graphics/Dxgi.Common.Manual.cs @@ -1,7 +1,7 @@ // Copyright © Amer Koleci and Contributors. // Licensed under the MIT License (MIT). See LICENSE in the repository root for more information. -namespace Win32.Graphics.Dxgi; +namespace Win32.Graphics.Dxgi.Common; public partial struct Rgb {