diff --git a/src/Generator/Passes/ResolveIncompleteDeclsPass.cs b/src/Generator/Passes/ResolveIncompleteDeclsPass.cs index 95cf8754..38c90ba0 100644 --- a/src/Generator/Passes/ResolveIncompleteDeclsPass.cs +++ b/src/Generator/Passes/ResolveIncompleteDeclsPass.cs @@ -14,25 +14,24 @@ namespace CppSharp.Passes public override bool VisitClassDecl(Class @class) { - if (!@class.IsIncomplete) - goto Out; + if (!base.VisitClassDecl(@class)) + return false; - if (@class.CompleteDeclaration != null) - goto Out; + EnsureCompleteDeclaration(@class); - @class.CompleteDeclaration = - AstContext.FindCompleteClass(@class.QualifiedName); + return true; + } - if (@class.CompleteDeclaration == null) - { - @class.GenerationKind = GenerationKind.Internal; - Driver.Diagnostics.Debug("Unresolved declaration: {0}", - @class.Name); - } + public override bool VisitClassTemplateDecl(ClassTemplate template) + { + if (!base.VisitClassTemplateDecl(template)) + return false; - Out: + EnsureCompleteDeclaration(template.TemplatedDecl); - return base.VisitClassDecl(@class); + template.TemplatedDecl = template.TemplatedDecl.CompleteDeclaration ?? template.TemplatedDecl; + + return true; } public override bool VisitEnumDecl(Enumeration @enum) @@ -59,5 +58,24 @@ namespace CppSharp.Passes return base.VisitEnumDecl(@enum); } + + private void EnsureCompleteDeclaration(Declaration declaration) + { + if (!declaration.IsIncomplete) + return; + + if (declaration.CompleteDeclaration != null) + return; + + declaration.CompleteDeclaration = + AstContext.FindCompleteClass(declaration.QualifiedName); + + if (declaration.CompleteDeclaration == null) + { + declaration.GenerationKind = GenerationKind.Internal; + Driver.Diagnostics.Debug("Unresolved declaration: {0}", + declaration.Name); + } + } } } diff --git a/tests/NamespacesBase/NamespacesBase.h b/tests/NamespacesBase/NamespacesBase.h index 3c727d96..e3db3aa5 100644 --- a/tests/NamespacesBase/NamespacesBase.h +++ b/tests/NamespacesBase/NamespacesBase.h @@ -47,3 +47,8 @@ class DLL_API Abstract public: virtual void abstractFunction() = 0; }; + +template +class TemplateClass +{ +}; diff --git a/tests/NamespacesDerived/NamespacesDerived.h b/tests/NamespacesDerived/NamespacesDerived.h index 6c7a1518..ad56e89c 100644 --- a/tests/NamespacesDerived/NamespacesDerived.h +++ b/tests/NamespacesDerived/NamespacesDerived.h @@ -43,6 +43,8 @@ class Base3 { }; +template class TemplateClass; + class Derived2 : public Base3 { public: @@ -56,4 +58,6 @@ public: void defaultEnumValueFromDependency(OverlappingNamespace::ColorsEnum c = OverlappingNamespace::ColorsEnum::black); Abstract* getAbstract(); +private: + TemplateClass t; };