diff --git a/src/Generator/Transform.cs b/src/Generator/Transform.cs index 71c87e22..661f16ef 100644 --- a/src/Generator/Transform.cs +++ b/src/Generator/Transform.cs @@ -1,24 +1,43 @@ -using System; -using System.Collections.Generic; -using System.Text.RegularExpressions; -using System.Linq; +using Cxxi; +using System; using System.Globalization; -using Cxxi; +using System.Text.RegularExpressions; + +/// +/// Used to massage the library types into something more .NET friendly. +/// +public interface LibraryTransform +{ + public void Transform(Generator g); +} -public abstract class Transformation +/// +/// Used to provide different types of code transformation on a module +/// declarations and types before the code generation process is started. +/// +public abstract class ModuleTransform { - public virtual bool ProcessType(Declaration type) + /// + /// Processes a declaration. + /// + public virtual bool ProcessDeclaration(Declaration declaration) { return false; } + /// + /// Processes an enum item. + /// public virtual bool ProcessEnumItem(Enumeration.Item item) { return false; } } -public class RenameTransform : Transformation +/// +/// Renames a declaration based on a regular expression pattern. +/// +public class RenameTransform : ModuleTransform { public string Pattern; public string Replacement; @@ -29,7 +48,7 @@ public class RenameTransform : Transformation Replacement = replacement; } - public override bool ProcessType(Declaration type) + public override bool ProcessDeclaration(Declaration type) { return Rename(ref type.Name); } @@ -55,6 +74,8 @@ public class RenameTransform : Transformation public partial class Generator { + #region Transform Operations + public void RemovePrefix(string prefix) { Transformations.Add(new RenameTransform(prefix, String.Empty)); @@ -64,12 +85,16 @@ public partial class Generator { } + + #endregion + + #region Enum Helpers public Enumeration FindEnum(string name) { foreach (var module in Library.Modules) { - var @enum = module.Global.FindEnumWithName(name); + var @enum = module.FindEnum(name); if (@enum != null) return @enum; } @@ -77,29 +102,6 @@ public partial class Generator return null; } - public Enumeration GetEnumWithMatchingItem(string Pattern) - { - foreach (var module in Library.Modules) - { - Enumeration @enum = module.Global.FindEnumWithItem(Pattern); - if (@enum == null) continue; - return @enum; - } - - return null; - } - - public Module IgnoreModuleWithName(string Pattern) - { - Module module = Library.Modules.Find( - m => Regex.Match(m.FilePath, Pattern).Success); - - if (module != null) - module.Ignore = true; - - return module; - } - public void IgnoreEnumWithMatchingItem(string Pattern) { Enumeration @enum = GetEnumWithMatchingItem(Pattern); @@ -114,26 +116,23 @@ public partial class Generator @enum.Name = Name; } - static bool ParseToNumber(string num, out long val) + public void SetNameOfEnumWithName(string enumName, string name) { - if (num.StartsWith("0x", StringComparison.CurrentCultureIgnoreCase)) - { - num = num.Substring(2); - - return long.TryParse(num, NumberStyles.HexNumber, - CultureInfo.CurrentCulture, out val); - } - - return long.TryParse(num, out val); + Enumeration @enum = FindEnum(enumName); + if (@enum != null) + @enum.Name = name; } - static long ParseMacroExpression(string Expression) + public Enumeration GetEnumWithMatchingItem(string Pattern) { - long val; - if (ParseToNumber(Expression, out val)) - return val; - // TODO: Handle string expressions - return 0; + foreach (var module in Library.Modules) + { + Enumeration @enum = module.FindEnumWithItem(Pattern); + if (@enum == null) continue; + return @enum; + } + + return null; } public Enumeration.Item GenerateEnumItemFromMacro(MacroDefine macro) @@ -142,16 +141,16 @@ public partial class Generator item.Name = macro.Name; item.Expression = macro.Expression; item.Value = ParseMacroExpression(macro.Expression); - + return item; } - public Enumeration GenerateEnumFromMacros(string Name, params string[] Macros) + public Enumeration GenerateEnumFromMacros(string name, params string[] macros) { Enumeration @enum = new Enumeration(); - @enum.Name = Name; + @enum.Name = name; - var pattern = String.Join("|", Macros); + var pattern = String.Join("|", macros); var regex = new Regex(pattern); foreach (var module in Library.Modules) @@ -167,11 +166,97 @@ public partial class Generator if (@enum.Items.Count > 0) { - module.Global.Enums.Add(@enum); + module.Enums.Add(@enum); break; } } return @enum; } + + #endregion + + #region Class Helpers + + public Class FindClass(string name) + { + foreach (var module in Library.Modules) + { + var @class = module.FindClass(name); + if (@class != null) + return @class; + } + + return null; + } + + public void SetNameOfClassWithName(string className, string name) + { + Class @class = FindClass(className); + if (@class != null) + @class.Name = name; + } + + #endregion + + #region Function Helpers + + public Function FindFunction(string name) + { + foreach (var module in Library.Modules) + { + var function = module.FindFunction(name); + if (function != null) + return function; + } + + return null; + } + + public void IgnoreFunctionWithName(string name) + { + Function function = FindFunction(name); + if (function != null) + function.Ignore = true; + } + + #endregion + + #region Module Helpers + + public Module IgnoreModuleWithName(string Pattern) + { + Module module = Library.Modules.Find( + m => Regex.Match(m.FilePath, Pattern).Success); + + if (module != null) + module.Ignore = true; + + return module; + } + + #endregion + + static bool ParseToNumber(string num, out long val) + { + if (num.StartsWith("0x", StringComparison.CurrentCultureIgnoreCase)) + { + num = num.Substring(2); + + return long.TryParse(num, NumberStyles.HexNumber, + CultureInfo.CurrentCulture, out val); + } + + return long.TryParse(num, out val); + } + + static long ParseMacroExpression(string Expression) + { + long val; + if (ParseToNumber(Expression, out val)) + return val; + // TODO: Handle string expressions + return 0; + } + } \ No newline at end of file