diff --git a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.cpp b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.cpp index f12b8d5e..6ae61fa7 100644 --- a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.cpp +++ b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.cpp @@ -115,8 +115,7 @@ void CxxAstVisitorComponentIndexer::beginTraverseTemplateArgumentLoc(const clang ); { - const clang::NamedDecl* namedContextDecl = getAstVisitor()->getComponent()->getTopmostContextDecl(1); - if (namedContextDecl) + if (const clang::NamedDecl* namedContextDecl = getAstVisitor()->getComponent()->getTopmostContextDecl(1)) { m_client->recordReference( REFERENCE_TYPE_USAGE, @@ -524,11 +523,13 @@ void CxxAstVisitorComponentIndexer::visitTypeLoc(clang::TypeLoc tl) { const clang::TemplateSpecializationTypeLoc& tstl = tl.castAs(); const clang::TemplateSpecializationType* tst = tstl.getTypePtr(); - if (tst->getTemplateName().isDependent()) + const clang::TemplateName tln = tst->getTemplateName(); + clang::TemplateName::NameKind nknk = tln.getKind(); + if (tln.isDependent()) // e.g. T where the template name T depends on a template parameter { clang::TemplateDecl* d = tst->getTemplateName().getAsTemplateDecl(); m_client->recordLocalSymbol(getLocalSymbolName(d->getLocation()), getParseLocation(tl.getBeginLoc())); - return; // TODO: skip recording template arg in parent scope + return; } } @@ -562,12 +563,15 @@ void CxxAstVisitorComponentIndexer::visitTypeLoc(clang::TypeLoc tl) if (getAstVisitor()->getComponent()->isTraversingTemplateArgument()) { - m_client->recordReference( - REFERENCE_TYPE_USAGE, - symbolId, - getOrCreateSymbolId(getAstVisitor()->getComponent()->getTopmostContextDecl(2)), // we use the closest named decl here - parseLocation - ); + if (const clang::NamedDecl* namedContextDecl = getAstVisitor()->getComponent()->getTopmostContextDecl(2)) + { + m_client->recordReference( + REFERENCE_TYPE_USAGE, + symbolId, + getOrCreateSymbolId(namedContextDecl), // we use the closest named decl here + parseLocation + ); + } } } } diff --git a/src/lib_cxx/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp b/src/lib_cxx/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp index 6f47db03..83dc7f46 100644 --- a/src/lib_cxx/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp +++ b/src/lib_cxx/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp @@ -156,13 +156,25 @@ std::unique_ptr CxxDeclNameResolver::getDeclName(const clang::Named ) ); } - else if (clang::isa(declaration)) + else if (const clang::ClassTemplateSpecializationDecl* templateSpecialitarionDecl = clang::dyn_cast_or_null(declaration)) { std::vector templateArguments; - const clang::TemplateArgumentList& templateArgumentList = - clang::dyn_cast(declaration)->getTemplateArgs(); + const clang::TemplateArgumentList& templateArgumentList = templateSpecialitarionDecl->getTemplateArgs(); for (size_t i = 0; i < templateArgumentList.size(); i++) { + if (templateArgumentList.get(i).isDependent()) + { + llvm::PointerUnion pu = templateSpecialitarionDecl->getSpecializedTemplateOrPartial(); + if (pu.is()) + { + return getDeclName(pu.get()); + } + else if (pu.is()) + { + return getDeclName(pu.get()); + } + } + templateArguments.push_back(getTemplateArgumentName(templateArgumentList.get(i))); } return std::make_unique(std::move(declNameString), std::move(templateArguments)); @@ -194,6 +206,13 @@ std::unique_ptr CxxDeclNameResolver::getDeclName(const clang::Named for (size_t i = 0; i < templateArgumentList->size(); i++) { const clang::TemplateArgument& templateArgument = templateArgumentList->get(i); + if (templateArgument.isDependent()) + { + if (clang::FunctionTemplateDecl* templateFunctionDeclaration = functionDecl->getPrimaryTemplate()) + { + return getDeclName(templateFunctionDeclaration); + } + } templateArguments.push_back(getTemplateArgumentName(templateArgument)); } } @@ -337,12 +356,24 @@ std::unique_ptr CxxDeclNameResolver::getDeclName(const clang::Named } else if (clang::isa(declaration)) { - const clang::VarTemplateSpecializationDecl* templateSpecializationDeclaration = - clang::dyn_cast_or_null(varDecl); + const clang::VarTemplateSpecializationDecl* templateSpecializationDeclaration = clang::dyn_cast_or_null(varDecl); const clang::TemplateArgumentList& templateArgumentList = templateSpecializationDeclaration->getTemplateArgs(); for (size_t i = 0; i < templateArgumentList.size(); i++) { - templateParameterNames.push_back(getTemplateArgumentName(templateArgumentList.get(i))); + const clang::TemplateArgument& templateArgument = templateArgumentList.get(i); + if (templateArgument.isDependent()) + { + llvm::PointerUnion pu = templateSpecializationDeclaration->getSpecializedTemplateOrPartial(); + if (pu.is()) + { + return getDeclName(pu.get()); + } + else if (pu.is()) + { + return getDeclName(pu.get()); + } + } + templateParameterNames.push_back(getTemplateArgumentName(templateArgument)); } }