ClangASTImporter.h revision a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===-- ClangASTImporter.h --------------------------------------*- C++ -*-===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef liblldb_ClangASTImporter_h_ 116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#define liblldb_ClangASTImporter_h_ 126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lldb/lldb-types.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/AST/ASTImporter.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/Basic/FileManager.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/Basic/FileSystemOptions.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lldb/Symbol/ClangNamespaceDecl.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace lldb_private { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClangASTImporter 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClangASTImporter () : 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m_file_manager(clang::FileSystemOptions()) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clang::QualType 336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) CopyType (clang::ASTContext *dst_ctx, 346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) clang::ASTContext *src_ctx, 356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) clang::QualType type); 366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) lldb::clang_type_t 386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) CopyType (clang::ASTContext *dst_ctx, 396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) clang::ASTContext *src_ctx, 406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) lldb::clang_type_t type); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clang::Decl * 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CopyDecl (clang::ASTContext *dst_ctx, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clang::ASTContext *src_ctx, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clang::Decl *decl); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) lldb::clang_type_t 483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DeportType (clang::ASTContext *dst_ctx, 493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) clang::ASTContext *src_ctx, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lldb::clang_type_t type); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clang::Decl * 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DeportDecl (clang::ASTContext *dst_ctx, 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) clang::ASTContext *src_ctx, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clang::Decl *decl); 5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void 5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) CompleteDecl (clang::Decl *decl); 5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool 6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) CompleteTagDecl (clang::TagDecl *decl); 6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool 6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) CompleteTagDeclWithOrigin (clang::TagDecl *decl, clang::TagDecl *origin); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompleteObjCInterfaceDecl (clang::ObjCInterfaceDecl *interface_decl); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResolveDeclOrigin (const clang::Decl *decl, clang::Decl **original_decl, clang::ASTContext **original_ctx) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeclOrigin origin = GetDeclOrigin(decl); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (original_decl) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *original_decl = origin.decl; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (original_ctx) 7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) *original_ctx = origin.ctx; 7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return origin.Valid(); 8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void 8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SetDeclOrigin (const clang::Decl *decl, clang::Decl *original_decl); 8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ClangASTMetadata * 8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GetDeclMetadata (const clang::Decl *decl); 8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Namespace maps 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector < std::pair<lldb::ModuleSP, ClangNamespaceDecl> > NamespaceMap; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef STD_SHARED_PTR(NamespaceMap) NamespaceMapSP; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RegisterNamespaceMap (const clang::NamespaceDecl *decl, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NamespaceMapSP &namespace_map); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NamespaceMapSP GetNamespaceMap (const clang::NamespaceDecl *decl); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BuildNamespaceMap (const clang::NamespaceDecl *decl); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Comleters for maps 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class MapCompleter 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MapCompleter (); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CompleteNamespaceMap (NamespaceMapSP &namespace_map, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ConstString &name, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NamespaceMapSP &parent_map) const = 0; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InstallMapCompleter (clang::ASTContext *dst_ctx, MapCompleter &completer) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASTContextMetadataSP context_md; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContextMetadataMap::iterator context_md_iter = m_metadata_map.find(dst_ctx); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (context_md_iter == m_metadata_map.end()) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_md = ASTContextMetadataSP(new ASTContextMetadata(dst_ctx)); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m_metadata_map[dst_ctx] = context_md; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_md = context_md_iter->second; 130 } 131 132 context_md->m_map_completer = &completer; 133 } 134 135 void ForgetDestination (clang::ASTContext *dst_ctx); 136 void ForgetSource (clang::ASTContext *dst_ctx, clang::ASTContext *src_ctx); 137private: 138 struct DeclOrigin 139 { 140 DeclOrigin () : 141 ctx(NULL), 142 decl(NULL) 143 { 144 } 145 146 DeclOrigin (clang::ASTContext *_ctx, 147 clang::Decl *_decl) : 148 ctx(_ctx), 149 decl(_decl) 150 { 151 } 152 153 DeclOrigin (const DeclOrigin &rhs) 154 { 155 ctx = rhs.ctx; 156 decl = rhs.decl; 157 } 158 159 void operator= (const DeclOrigin &rhs) 160 { 161 ctx = rhs.ctx; 162 decl = rhs.decl; 163 } 164 165 bool 166 Valid () 167 { 168 return (ctx != NULL || decl != NULL); 169 } 170 171 clang::ASTContext *ctx; 172 clang::Decl *decl; 173 }; 174 175 typedef std::map<const clang::Decl *, DeclOrigin> OriginMap; 176 177 class Minion : public clang::ASTImporter 178 { 179 public: 180 Minion (ClangASTImporter &master, 181 clang::ASTContext *target_ctx, 182 clang::ASTContext *source_ctx) : 183 clang::ASTImporter(*target_ctx, 184 master.m_file_manager, 185 *source_ctx, 186 master.m_file_manager, 187 true /*minimal*/), 188 m_master(master), 189 m_source_ctx(source_ctx) 190 { 191 } 192 193 void ImportDefinitionTo (clang::Decl *to, clang::Decl *from); 194 195 clang::Decl *Imported (clang::Decl *from, clang::Decl *to); 196 197 ClangASTImporter &m_master; 198 clang::ASTContext *m_source_ctx; 199 }; 200 201 typedef STD_SHARED_PTR(Minion) MinionSP; 202 typedef std::map<clang::ASTContext *, MinionSP> MinionMap; 203 typedef std::map<const clang::NamespaceDecl *, NamespaceMapSP> NamespaceMetaMap; 204 205 struct ASTContextMetadata 206 { 207 ASTContextMetadata(clang::ASTContext *dst_ctx) : 208 m_dst_ctx (dst_ctx), 209 m_minions (), 210 m_origins (), 211 m_namespace_maps (), 212 m_map_completer (NULL) 213 { 214 } 215 216 clang::ASTContext *m_dst_ctx; 217 MinionMap m_minions; 218 OriginMap m_origins; 219 220 NamespaceMetaMap m_namespace_maps; 221 MapCompleter *m_map_completer; 222 }; 223 224 typedef STD_SHARED_PTR(ASTContextMetadata) ASTContextMetadataSP; 225 typedef std::map<const clang::ASTContext *, ASTContextMetadataSP> ContextMetadataMap; 226 227 ContextMetadataMap m_metadata_map; 228 229 ASTContextMetadataSP 230 GetContextMetadata (clang::ASTContext *dst_ctx) 231 { 232 ContextMetadataMap::iterator context_md_iter = m_metadata_map.find(dst_ctx); 233 234 if (context_md_iter == m_metadata_map.end()) 235 { 236 ASTContextMetadataSP context_md = ASTContextMetadataSP(new ASTContextMetadata(dst_ctx)); 237 m_metadata_map[dst_ctx] = context_md; 238 return context_md; 239 } 240 else 241 { 242 return context_md_iter->second; 243 } 244 } 245 246 ASTContextMetadataSP 247 MaybeGetContextMetadata (clang::ASTContext *dst_ctx) 248 { 249 ContextMetadataMap::iterator context_md_iter = m_metadata_map.find(dst_ctx); 250 251 if (context_md_iter != m_metadata_map.end()) 252 return context_md_iter->second; 253 else 254 return ASTContextMetadataSP(); 255 } 256 257 MinionSP 258 GetMinion (clang::ASTContext *dst_ctx, clang::ASTContext *src_ctx) 259 { 260 ASTContextMetadataSP context_md = GetContextMetadata(dst_ctx); 261 262 MinionMap &minions = context_md->m_minions; 263 MinionMap::iterator minion_iter = minions.find(src_ctx); 264 265 if (minion_iter == minions.end()) 266 { 267 MinionSP minion = MinionSP(new Minion(*this, dst_ctx, src_ctx)); 268 minions[src_ctx] = minion; 269 return minion; 270 } 271 else 272 { 273 return minion_iter->second; 274 } 275 } 276 277 DeclOrigin 278 GetDeclOrigin (const clang::Decl *decl); 279 280 clang::FileManager m_file_manager; 281}; 282 283} 284 285#endif 286