From 314a1f745fe2e0f4e35025fe4f3e9f7eec5a3fdc Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Sun, 3 Jul 2022 04:06:50 +0100 Subject: [PATCH] Parse generate function template specializations. --- src/CppParser/Parser.cpp | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index b71c2f18..24a43bc3 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -496,7 +496,7 @@ static clang::Decl* GetPreviousDeclInContext(const clang::Decl* D) return nullptr; } -bool IsExplicit(const clang::Decl* D) +static bool IsExplicit(const clang::Decl* D) { using namespace clang; @@ -1604,24 +1604,31 @@ FunctionTemplate* Parser::WalkFunctionTemplate(const clang::FunctionTemplateDecl if (FT != nullptr) return FT; - CppSharp::CppParser::AST::Function* Function = nullptr; + CppSharp::CppParser::AST::Function* F = nullptr; auto TemplatedDecl = TD->getTemplatedDecl(); if (auto MD = dyn_cast(TemplatedDecl)) - Function = WalkMethodCXX(MD); + F = WalkMethodCXX(MD); else - Function = WalkFunction(TemplatedDecl); + F = WalkFunction(TemplatedDecl); FT = new FunctionTemplate(); HandleDeclaration(TD, FT); FT->name = GetDeclName(TD); FT->_namespace = NS; - FT->TemplatedDecl = Function; + FT->TemplatedDecl = F; FT->Parameters = WalkTemplateParameterList(TD->getTemplateParameters()); NS->Templates.push_back(FT); + for (auto&& FD : TD->specializations()) + { + auto F = new Function(); + HandleDeclaration(FD, F); + WalkFunction(FD, F); + } + return FT; } @@ -1632,7 +1639,13 @@ Parser::WalkFunctionTemplateSpec(clang::FunctionTemplateSpecializationInfo* FTSI { using namespace clang; - auto FTS = new CppSharp::CppParser::FunctionTemplateSpecialization(); + auto FT = WalkFunctionTemplate(FTSI->getTemplate()); + auto USR = GetDeclUSR(FTSI->getFunction()); + auto FTS = FT->FindSpecialization(USR); + if (FTS != nullptr) + return FTS; + + FTS = new CppSharp::CppParser::FunctionTemplateSpecialization(); FTS->specializationKind = WalkTemplateSpecializationKind(FTSI->getTemplateSpecializationKind()); FTS->specializedFunction = Function; FTS->_template = WalkFunctionTemplate(FTSI->getTemplate());