diff --git a/lldb/include/lldb/Symbol/ClangASTImporter.h b/lldb/include/lldb/Symbol/ClangASTImporter.h index fca15c5d4e12..30ceb7d0e447 100644 --- a/lldb/include/lldb/Symbol/ClangASTImporter.h +++ b/lldb/include/lldb/Symbol/ClangASTImporter.h @@ -211,6 +211,17 @@ private: } } + ASTContextMetadataSP + MaybeGetContextMetadata (clang::ASTContext *dst_ctx) + { + ContextMetadataMap::iterator context_md_iter = m_metadata_map.find(dst_ctx); + + if (context_md_iter != m_metadata_map.end()) + return context_md_iter->second; + else + return ASTContextMetadataSP(); + } + MinionSP GetMinion (clang::ASTContext *dst_ctx, clang::ASTContext *src_ctx) { diff --git a/lldb/source/Symbol/ClangASTImporter.cpp b/lldb/source/Symbol/ClangASTImporter.cpp index 2cf27c756441..e12cbcee01e3 100644 --- a/lldb/source/Symbol/ClangASTImporter.cpp +++ b/lldb/source/Symbol/ClangASTImporter.cpp @@ -194,10 +194,35 @@ clang::Decl { lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); - ASTContextMetadataSP context_md = m_master.GetContextMetadata(&to->getASTContext()); + ASTContextMetadataSP to_context_md = m_master.GetContextMetadata(&to->getASTContext()); + ASTContextMetadataSP from_context_md = m_master.MaybeGetContextMetadata(m_source_ctx); - context_md->m_origins[to] = DeclOrigin (m_source_ctx, from); - + if (from_context_md) + { + OriginMap &origins = from_context_md->m_origins; + + OriginMap::iterator origin_iter = origins.find(from); + + if (origin_iter != origins.end()) + to_context_md->m_origins[to] = origin_iter->second; + + if (clang::NamespaceDecl *to_namespace = dyn_cast(to)) + { + clang::NamespaceDecl *from_namespace = dyn_cast(from); + + NamespaceMetaMap &namespace_maps = from_context_md->m_namespace_maps; + + NamespaceMetaMap::iterator namespace_map_iter = namespace_maps.find(from_namespace); + + if (namespace_map_iter != namespace_maps.end()) + to_context_md->m_namespace_maps[to_namespace] = namespace_map_iter->second; + } + } + else + { + to_context_md->m_origins[to] = DeclOrigin (m_source_ctx, from); + } + if (TagDecl *from_tag_decl = dyn_cast(from)) { TagDecl *to_tag_decl = dyn_cast(to);