diff --git a/bin/test/data/log/test_log.txt b/bin/test/data/log/test_log.txt index 15e2f844..a1358d38 100644 --- a/bin/test/data/log/test_log.txt +++ b/bin/test/data/log/test_log.txt @@ -168,7 +168,12 @@ ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path i ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config. ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config. ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config. +CxxDeclNameResolver.cpp INFO: could not resolve name of decl at: input.cc:3:2 +CxxDeclNameResolver.cpp INFO: could not resolve name of decl at: input.cc:3:2 ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config. +CxxDeclNameResolver.cpp INFO: could not resolve name of decl at: input.cc:4:2 +CxxDeclNameResolver.cpp INFO: could not resolve name of decl at: input.cc:4:2 +CxxDeclNameResolver.cpp INFO: could not resolve name of decl at: input.cc:4:2 ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config. ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config. ConfigManager.cpp WARNING: value source/header_search_paths/header_search_path is not present in config. diff --git a/src/lib_parser/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp b/src/lib_parser/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp index 085072e5..65a887ad 100644 --- a/src/lib_parser/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp +++ b/src/lib_parser/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp @@ -40,20 +40,28 @@ NameHierarchy CxxDeclNameResolver::getDeclNameHierarchy() LOG_INFO("unhandled declaration type: " + std::string(m_declaration->getDeclKindName())); } - contextNameHierarchy = getContextNameHierarchy(m_declaration->getDeclContext()); - - if ((clang::isa(m_declaration) || - clang::isa(m_declaration) || - clang::isa(m_declaration)) && - contextNameHierarchy.size() > 0) + if (declName) { - std::string lastContextElementName = contextNameHierarchy.back()->getFullName(); // TODO: what about the signature in this case? - contextNameHierarchy.pop(); - contextNameHierarchy.push(std::make_shared(lastContextElementName + "::" + declName->getFullName())); + contextNameHierarchy = getContextNameHierarchy(m_declaration->getDeclContext()); + + if ((clang::isa(m_declaration) || + clang::isa(m_declaration) || + clang::isa(m_declaration)) && + contextNameHierarchy.size() > 0) + { + std::string lastContextElementName = contextNameHierarchy.back()->getFullName(); // TODO: what about the signature in this case? + contextNameHierarchy.pop(); + contextNameHierarchy.push(std::make_shared(lastContextElementName + "::" + declName->getFullName())); + } + else + { + contextNameHierarchy.push(declName); + } } else { - contextNameHierarchy.push(declName); + const clang::SourceManager& sourceManager = m_declaration->getASTContext().getSourceManager(); + LOG_INFO("could not resolve name of decl at: " + m_declaration->getLocation().printToString(sourceManager)); } } return contextNameHierarchy; @@ -71,13 +79,18 @@ NameHierarchy CxxDeclNameResolver::getContextNameHierarchy(const clang::DeclCont contextNameHierarchy = getContextNameHierarchy(parentContext); } - if (clang::isa(declContext)) + if (const clang::NamedDecl* contextNamedDecl = clang::dyn_cast_or_null(declContext)) { - std::shared_ptr declName = getDeclName(clang::dyn_cast(declContext)); + std::shared_ptr declName = getDeclName(contextNamedDecl); if (declName) { contextNameHierarchy.push(declName); } + else + { + const clang::SourceManager& sourceManager = contextNamedDecl->getASTContext().getSourceManager(); + LOG_INFO("could not resolve name of decl at: " + contextNamedDecl->getLocation().printToString(sourceManager)); + } } } return contextNameHierarchy; @@ -87,9 +100,9 @@ std::shared_ptr CxxDeclNameResolver::getDeclName() { const clang::NamedDecl* declaration = clang::dyn_cast(m_declaration); std::string declNameString = declaration->getNameAsString(); - if (clang::isa(declaration)) + if (const clang::CXXRecordDecl* recordDecl = clang::dyn_cast_or_null(declaration)) { - clang::ClassTemplateDecl* templateClassDeclaration = clang::dyn_cast(declaration)->getDescribedClassTemplate(); + clang::ClassTemplateDecl* templateClassDeclaration = recordDecl->getDescribedClassTemplate(); if (templateClassDeclaration) { return getDeclName(templateClassDeclaration); @@ -118,7 +131,7 @@ std::shared_ptr CxxDeclNameResolver::getDeclName() { //this if fixes the crash, but not the problem TODO const clang::SourceManager& sourceManager = declaration->getASTContext().getSourceManager(); - LOG_INFO("Template getParam out of Range "+declaration->getLocation().printToString(sourceManager)); + LOG_INFO("Template getParam out of Range " + declaration->getLocation().printToString(sourceManager)); } currentParameterIndex++; } @@ -143,6 +156,13 @@ std::shared_ptr CxxDeclNameResolver::getDeclName() templateArgumentNamePart += ">"; return std::make_shared(declNameString + templateArgumentNamePart); } + else if (!recordDecl->isLambda() && declNameString.size() == 0) + { + const clang::SourceManager& sourceManager = declaration->getASTContext().getSourceManager(); + const clang::PresumedLoc& presumedBegin = sourceManager.getPresumedLoc(declaration->getLocStart()); + const std::string recordType = (recordDecl->isStruct() ? "struct" : "class"); + return std::make_shared("anonymous " + recordType + " (" + FilePath(presumedBegin.getFilename()).fileName() + ")"); + } } else if (clang::isa(declaration)) {