#ifndef CXX_DECL_NAME_RESOLVER_H #define CXX_DECL_NAME_RESOLVER_H #include "clang/AST/DeclTemplate.h" #include "data/parser/cxx/name/CxxDeclName.h" #include "data/parser/cxx/name_resolver/CxxNameResolver.h" class CanonicalFilePathCache; class CxxDeclNameResolver: public CxxNameResolver { public: CxxDeclNameResolver(std::shared_ptr canonicalFilePathCache); CxxDeclNameResolver( std::shared_ptr canonicalFilePathCache, std::vector ignoredContextDecls ); std::shared_ptr getName(const clang::NamedDecl* declaration); private: std::shared_ptr getContextName(const clang::DeclContext* declaration); std::shared_ptr getDeclName(const clang::NamedDecl* declaration); std::wstring getTranslationUnitMainFileName(const clang::Decl* declaration); std::wstring getDeclarationFileName(const clang::Decl* declaration); std::wstring getNameForAnonymousSymbol(const std::wstring& symbolKindName, const clang::Decl* declaration); std::vector getTemplateParameterStrings(const clang::TemplateDecl* templateDecl); template std::vector getTemplateParameterStringsOfPatrialSpecialitarion(const T* templateDecl); std::wstring getTemplateParameterString(const clang::NamedDecl* parameter); std::wstring getTemplateArgumentName(const clang::TemplateArgument& argument); const clang::NamedDecl* m_currentDecl; }; template std::vector CxxDeclNameResolver::getTemplateParameterStringsOfPatrialSpecialitarion(const T* partialSpecializationDecl) { std::vector templateParameterNames; clang::TemplateParameterList* parameterList = partialSpecializationDecl->getTemplateParameters(); unsigned int currentParameterIndex = 0; const clang::TemplateArgumentList& templateArgumentList = partialSpecializationDecl->getTemplateArgs(); const int templateArgumentCount = templateArgumentList.size(); for (int i = 0; i < templateArgumentCount; i++) { const clang::TemplateArgument& templateArgument = templateArgumentList.get(i); if (templateArgument.isDependent()) // IMPORTANT_TODO: fix case when arg depends on template parameter of outer template class, or depends on first template parameter. { if (currentParameterIndex < parameterList->size()) { templateParameterNames.push_back(getTemplateParameterString(parameterList->getParam(currentParameterIndex))); } else { //this if fixes the crash, but not the problem TODO // const clang::SourceManager& sourceManager = declaration->getASTContext().getSourceManager(); // LOG_ERROR("Template getParam out of Range " + declaration->getLocation().printToString(sourceManager)); } currentParameterIndex++; } else { templateParameterNames.push_back(getTemplateArgumentName(templateArgument)); } } return templateParameterNames; } #endif // CXX_DECL_NAME_RESOLVER_H