diff --git a/src/AST/ASTVisitor.cs b/src/AST/ASTVisitor.cs index 5aebf3f6..6346c0de 100644 --- a/src/AST/ASTVisitor.cs +++ b/src/AST/ASTVisitor.cs @@ -311,11 +311,6 @@ namespace CppSharp.AST return true; } - public virtual bool VisitClassTemplateSpecializationDecl(ClassTemplateSpecialization specialization) - { - return VisitClassDecl(specialization); - } - public virtual bool VisitFieldDecl(Field field) { if (!VisitDeclaration(field)) @@ -440,9 +435,16 @@ namespace CppSharp.AST foreach (var specialization in template.Specializations) specialization.Visit(this); + template.TemplatedClass.Visit(this); + return true; } + public virtual bool VisitClassTemplateSpecializationDecl(ClassTemplateSpecialization specialization) + { + return VisitClassDecl(specialization); + } + public virtual bool VisitFunctionTemplateDecl(FunctionTemplate template) { if (!VisitDeclaration(template)) @@ -451,7 +453,17 @@ namespace CppSharp.AST foreach (var templateParameter in template.Parameters) templateParameter.Visit(this); - return template.TemplatedFunction.Visit(this); + foreach (var specialization in template.Specializations) + specialization.Visit(this); + + template.TemplatedFunction.Visit(this); + + return true; + } + + public virtual bool VisitFunctionTemplateSpecializationDecl(FunctionTemplateSpecialization specialization) + { + return specialization.SpecializedFunction.Visit(this); } public virtual bool VisitMacroDefinition(MacroDefinition macro) diff --git a/src/AST/Declaration.cs b/src/AST/Declaration.cs index 951736e4..04402b32 100644 --- a/src/AST/Declaration.cs +++ b/src/AST/Declaration.cs @@ -401,7 +401,6 @@ namespace CppSharp.AST { T VisitDeclaration(Declaration decl); T VisitClassDecl(Class @class); - T VisitClassTemplateSpecializationDecl(ClassTemplateSpecialization specialization); T VisitFieldDecl(Field field); T VisitFunctionDecl(Function function); T VisitMethodDecl(Method method); @@ -411,13 +410,15 @@ namespace CppSharp.AST T VisitEnumDecl(Enumeration @enum); T VisitEnumItemDecl(Enumeration.Item item); T VisitVariableDecl(Variable variable); - T VisitClassTemplateDecl(ClassTemplate template); - T VisitFunctionTemplateDecl(FunctionTemplate template); T VisitMacroDefinition(MacroDefinition macro); T VisitNamespace(Namespace @namespace); T VisitEvent(Event @event); T VisitProperty(Property @property); T VisitFriend(Friend friend); + T VisitClassTemplateDecl(ClassTemplate template); + T VisitClassTemplateSpecializationDecl(ClassTemplateSpecialization specialization); + T VisitFunctionTemplateDecl(FunctionTemplate template); + T VisitFunctionTemplateSpecializationDecl(FunctionTemplateSpecialization specialization); T VisitTemplateTemplateParameterDecl(TemplateTemplateParameter templateTemplateParameter); T VisitTemplateParameterDecl(TypeTemplateParameter templateParameter); T VisitNonTypeTemplateParameterDecl(NonTypeTemplateParameter nonTypeTemplateParameter); diff --git a/src/AST/Template.cs b/src/AST/Template.cs index dd8334f2..b0cea88c 100644 --- a/src/AST/Template.cs +++ b/src/AST/Template.cs @@ -372,5 +372,10 @@ namespace CppSharp.AST SpecializedFunction = fts.SpecializedFunction; SpecializationKind = fts.SpecializationKind; } + + public T Visit(IDeclVisitor visitor) + { + return visitor.VisitFunctionTemplateSpecializationDecl(this); + } } }