diff --git a/src/AST/Namespace.cs b/src/AST/Namespace.cs index 021e7c77..539738e8 100644 --- a/src/AST/Namespace.cs +++ b/src/AST/Namespace.cs @@ -387,12 +387,11 @@ namespace CppSharp.AST public Enumeration FindEnumWithItem(string name) { - var result = Enums.Find(e => e.ItemsByName.ContainsKey(name)); - if (result == null) - result = Namespaces.Select(ns => ns.FindEnumWithItem(name)).FirstOrDefault(); - if (result == null) - result = Classes.Select(c => c.FindEnumWithItem(name)).FirstOrDefault(); - return result; + return Enums.Find(e => e.ItemsByName.ContainsKey(name)) ?? + (from declContext in Namespaces.Union<DeclarationContext>(Classes) + let @enum = declContext.FindEnumWithItem(name) + where @enum != null + select @enum).FirstOrDefault(); } public virtual IEnumerable<Function> FindOperator(CXXOperatorKind kind) diff --git a/src/Generator.Tests/Passes/TestPasses.cs b/src/Generator.Tests/Passes/TestPasses.cs index a193f5c5..b7cd700d 100644 --- a/src/Generator.Tests/Passes/TestPasses.cs +++ b/src/Generator.Tests/Passes/TestPasses.cs @@ -231,5 +231,31 @@ namespace CppSharp.Generator.Tests.Passes var @class = AstContext.FindDecl<Class>("ClassWithAbstractOperator").First(); Assert.AreEqual(@class.Operators.First().GenerationKind, GenerationKind.None); } + + [Test] + public void TestRemovalOfUnusedStdTypes() + { + passBuilder.AddPass(new IgnoreSystemDeclarationsPass()); + passBuilder.RunPasses(pass => pass.VisitASTContext(AstContext)); + if (Platform.IsWindows) + { + Assert.That(AstContext.GetEnumWithMatchingItem("_ALLOC_MASK").Ignore, Is.True); + Assert.That(AstContext.FindClass("_Ctypevec").First().Ignore, Is.True); + return; + } + if (Platform.IsLinux) + { + Assert.That(AstContext.GetEnumWithMatchingItem("PTHREAD_RWLOCK_PREFER_READER_NP").Ignore, Is.True); + Assert.That(AstContext.FindClass("pthread_mutex_t").First().Ignore, Is.True); + return; + + } + if (Platform.IsMacOS) + { + Assert.That(AstContext.GetEnumWithMatchingItem("__n_words").Ignore, Is.True); + Assert.That(AstContext.FindClass("__darwin_fp_control").First().Ignore, Is.True); + return; + } + } } } diff --git a/src/Generator/Library.cs b/src/Generator/Library.cs index e6f63c9b..92ec7615 100644 --- a/src/Generator/Library.cs +++ b/src/Generator/Library.cs @@ -77,28 +77,22 @@ namespace CppSharp public static Enumeration GetEnumWithMatchingItem(this ASTContext context, string pattern) { - foreach (var module in context.TranslationUnits) - { - Enumeration @enum = module.FindEnumWithItem(pattern); - if (@enum == null) continue; - return @enum; - } - - return null; + return (from unit in context.TranslationUnits + let @enum = unit.FindEnumWithItem(pattern) + where @enum != null + select @enum).FirstOrDefault(); } public static Enumeration.Item GenerateEnumItemFromMacro(this Enumeration @enum, MacroDefinition macro) { - var item = new Enumeration.Item - { - Name = macro.Name, - Expression = macro.Expression, - Value = ParseMacroExpression(macro.Expression), - Namespace = @enum - }; - - return item; + return new Enumeration.Item + { + Name = macro.Name, + Expression = macro.Expression, + Value = ParseMacroExpression(macro.Expression), + Namespace = @enum + }; } static bool ParseToNumber(string num, out long val) diff --git a/tests/Native/Passes.h b/tests/Native/Passes.h index d1fdac2d..44b45d3b 100644 --- a/tests/Native/Passes.h +++ b/tests/Native/Passes.h @@ -1,3 +1,5 @@ +#include <string> + enum FlagEnum { A = 1 << 0,