diff --git a/src/AST/Namespace.cs b/src/AST/Namespace.cs index 1e312221..79b45f62 100644 --- a/src/AST/Namespace.cs +++ b/src/AST/Namespace.cs @@ -178,6 +178,11 @@ namespace CppSharp.AST return null; return @namespace.FindEnum(enumName, createDecl); + } + + public Enumeration FindEnum(IntPtr ptr) + { + return Enums.FirstOrDefault(f => f.OriginalPtr == ptr); } public Function FindFunction(string name, bool createDecl = false) diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index 581108a1..25e144d4 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -1713,19 +1713,25 @@ CppSharp::AST::Enumeration^ Parser::WalkEnum(clang::EnumDecl* ED) auto NS = GetNamespace(ED); assert(NS && "Expected a valid namespace"); - auto Name = marshalString(GetTagDeclName(ED)); - CppSharp::AST::Enumeration^ E = nullptr; - if (!System::String::IsNullOrEmpty(Name)) - E = NS->FindEnum(Name, /*Create=*/false); - else + auto E = NS->FindEnum(System::IntPtr(ED->getCanonicalDecl())); + if (E && !E->IsIncomplete) + return E; + + if (!E) { - // Enum with no identifier - try to find existing enum through enum items - for (auto it = ED->enumerator_begin(); it != ED->enumerator_end(); ++it) + auto Name = marshalString(GetTagDeclName(ED)); + if (!System::String::IsNullOrEmpty(Name)) + E = NS->FindEnum(Name, /*Create=*/false); + else { - EnumConstantDecl* ECD = (*it); - auto EnumItemName = marshalString(ECD->getNameAsString()); - E = NS->FindEnumWithItem(EnumItemName); - break; + // Enum with no identifier - try to find existing enum through enum items + for (auto it = ED->enumerator_begin(); it != ED->enumerator_end(); ++it) + { + EnumConstantDecl* ECD = (*it); + auto EnumItemName = marshalString(ECD->getNameAsString()); + E = NS->FindEnumWithItem(EnumItemName); + break; + } } } @@ -1734,11 +1740,13 @@ CppSharp::AST::Enumeration^ Parser::WalkEnum(clang::EnumDecl* ED) if (!E) { + auto Name = marshalString(GetTagDeclName(ED)); if (!System::String::IsNullOrEmpty(Name)) E = NS->FindEnum(Name, /*Create=*/true); else { E = gcnew CppSharp::AST::Enumeration(); + E->Name = Name; E->Namespace = NS; NS->Enums->Add(E); }