diff --git a/src/Bridge/Declaration.cs b/src/Bridge/Declaration.cs index a1586bce..80a741c2 100644 --- a/src/Bridge/Declaration.cs +++ b/src/Bridge/Declaration.cs @@ -132,15 +132,19 @@ namespace Cxxi // Tracks the original declaration definition order. public uint DefinitionOrder; + // Passes that should not be run on this declaration. + public ISet ExcludeFromPasses; + protected Declaration() { IgnoreFlags = IgnoreFlags.None; + ExcludeFromPasses = new HashSet(); } protected Declaration(string name) + : this() { Name = name; - IgnoreFlags = IgnoreFlags.None; } public override string ToString() diff --git a/src/Bridge/Library.cs b/src/Bridge/Library.cs index a5aee0a4..2940c516 100644 --- a/src/Bridge/Library.cs +++ b/src/Bridge/Library.cs @@ -161,8 +161,6 @@ namespace Cxxi else if (module.FindFunction(name) as T != null) yield return module.FindFunction(name) as T; } - - yield return null; } public void SetEnumAsFlags(string name) @@ -171,5 +169,13 @@ namespace Cxxi foreach(var @enum in enums) @enum.SetFlags(); } + + public void ExcludeFromPass(string name, System.Type type) + { + var decls = FindDecl(name); + + foreach (var decl in decls) + decl.ExcludeFromPasses.Add(type); + } } } \ No newline at end of file diff --git a/src/Generator/Transforms/Transform.cs b/src/Generator/Transforms/Transform.cs index efe6d3e2..c5995ea3 100644 --- a/src/Generator/Transforms/Transform.cs +++ b/src/Generator/Transforms/Transform.cs @@ -64,7 +64,10 @@ namespace Cxxi.Passes void TransformDeclaration(Declaration decl) { foreach (var pass in Passes.Passes) + { + if (IsPassExcluded(decl, pass)) continue; pass.ProcessDeclaration(decl); + } } void TransformTypedef(TypedefDecl typedef) @@ -78,20 +81,29 @@ namespace Cxxi.Passes void TransformClass(Class @class) { foreach (var pass in Passes.Passes) + { + if (IsPassExcluded(@class, pass)) continue; pass.ProcessClass(@class); + } TransformDeclaration(@class); foreach (var method in @class.Methods) { foreach (var pass in Passes.Passes) + { + if (IsPassExcluded(method, pass)) continue; pass.ProcessMethod(method); + } } foreach (var field in @class.Fields) { foreach (var pass in Passes.Passes) + { + if (IsPassExcluded(field, pass)) continue; pass.ProcessField(field); + } TransformDeclaration(field); } @@ -100,7 +112,10 @@ namespace Cxxi.Passes void TransformFunction(Function function) { foreach (var pass in Passes.Passes) + { + if (IsPassExcluded(function, pass)) continue; pass.ProcessFunction(function); + } TransformDeclaration(function); @@ -118,5 +133,11 @@ namespace Cxxi.Passes pass.ProcessEnumItem(item); } } + + static bool IsPassExcluded(Declaration decl, TranslationUnitPass pass) + { + var type = pass.GetType(); + return decl.ExcludeFromPasses.Contains(type); + } } } \ No newline at end of file