diff --git a/src/AST/Library.cs b/src/AST/Library.cs index 99140a6b..2ef17257 100644 --- a/src/AST/Library.cs +++ b/src/AST/Library.cs @@ -141,6 +141,16 @@ namespace CppSharp.AST } } + /// Finds the complete declaration of an enum. + public Enumeration FindCompleteEnum(string name) + { + foreach (var @enum in FindEnum(name)) + if (!@enum.IsIncomplete) + return @enum; + + return null; + } + /// Finds an existing struct/class in the library modules. public IEnumerable FindClass(string name, bool create = false) { diff --git a/src/Generator/Passes/ResolveIncompleteDeclsPass.cs b/src/Generator/Passes/ResolveIncompleteDeclsPass.cs index c8289758..67dbb1ba 100644 --- a/src/Generator/Passes/ResolveIncompleteDeclsPass.cs +++ b/src/Generator/Passes/ResolveIncompleteDeclsPass.cs @@ -5,12 +5,20 @@ namespace CppSharp.Passes { public class ResolveIncompleteDeclsPass : TranslationUnitPass { - public override bool VisitClassDecl(Class @class) + public override bool VisitDeclaration(Declaration decl) { - if (AlreadyVisited(@class)) + if (AlreadyVisited(decl)) + return false; + + if (decl.Ignore) return false; - if (@class.Ignore) + return true; + } + + public override bool VisitClassDecl(Class @class) + { + if (!VisitDeclaration(@class)) return false; if (!@class.IsIncomplete) @@ -33,5 +41,31 @@ namespace CppSharp.Passes return base.VisitClassDecl(@class); } + + public override bool VisitEnumDecl(Enumeration @enum) + { + if (!VisitDeclaration(@enum)) + return false; + + if (!@enum.IsIncomplete) + goto Out; + + if (@enum.CompleteDeclaration != null) + goto Out; + + @enum.CompleteDeclaration = + Library.FindCompleteEnum(@enum.QualifiedName); + + if (@enum.CompleteDeclaration == null) + { + @enum.IsGenerated = false; + Driver.Diagnostics.EmitWarning(DiagnosticId.UnresolvedDeclaration, + "Unresolved declaration: {0}", @enum.Name); + } + + Out: + + return base.VisitEnumDecl(@enum); + } } }