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