blob: c79aefca53ea56712ed2b77efc570de4223f9786 [file] [log] [blame]
Greg Clayton47a15b72011-01-17 04:19:51 +00001//===-- ClangExternalASTSourceCallbacks.cpp ---------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/Symbol/ClangExternalASTSourceCallbacks.h"
11
12// C Includes
13// C++ Includes
14// Other libraries and framework includes
15
16// Clang headers like to use NDEBUG inside of them to enable/disable debug
17// releated features using "#ifndef NDEBUG" preprocessor blocks to do one thing
18// or another. This is bad because it means that if clang was built in release
19// mode, it assumes that you are building in release mode which is not always
20// the case. You can end up with functions that are defined as empty in header
21// files when NDEBUG is not defined, and this can cause link errors with the
22// clang .a files that you have since you might be missing functions in the .a
23// file. So we have to define NDEBUG when including clang headers to avoid any
24// mismatches. This is covered by rdar://problem/8691220
25
26#ifndef NDEBUG
27#define LLDB_DEFINED_NDEBUG_FOR_CLANG
28#define NDEBUG
29// Need to include assert.h so it is as clang would expect it to be (disabled)
30#include <assert.h>
31#endif
32
33#include "clang/AST/DeclBase.h"
34#include "clang/AST/DeclarationName.h"
35
36#ifdef LLDB_DEFINED_NDEBUG_FOR_CLANG
37#undef NDEBUG
38#undef LLDB_DEFINED_NDEBUG_FOR_CLANG
39// Need to re-include assert.h so it is as _we_ would expect it to be (enabled)
40#include <assert.h>
41#endif
42
43#include "lldb/Core/Log.h"
44
45using namespace clang;
46using namespace lldb_private;
47
48clang::DeclContextLookupResult
49ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName
50(
51 const clang::DeclContext *decl_ctx,
52 clang::DeclarationName clang_decl_name
53)
54{
55 std::string decl_name (clang_decl_name.getAsString());
56
57 switch (clang_decl_name.getNameKind()) {
58 // Normal identifiers.
59 case clang::DeclarationName::Identifier:
60 //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"Identifier\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
61 if (clang_decl_name.getAsIdentifierInfo()->getBuiltinID() != 0)
62 return SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
63 break;
64
65 case clang::DeclarationName::ObjCZeroArgSelector:
66 //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"ObjCZeroArgSelector\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
67 return DeclContext::lookup_result();
68 break;
69
70 case clang::DeclarationName::ObjCOneArgSelector:
71 //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"ObjCOneArgSelector\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
72 return DeclContext::lookup_result();
73 break;
74
75 case clang::DeclarationName::ObjCMultiArgSelector:
76 //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"ObjCMultiArgSelector\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
77 return DeclContext::lookup_result();
78 break;
79
80 case clang::DeclarationName::CXXConstructorName:
81 //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"CXXConstructorName\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
82 return DeclContext::lookup_result();
83 break;
84
85 case clang::DeclarationName::CXXDestructorName:
86 //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"CXXDestructorName\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
87 return DeclContext::lookup_result();
88 break;
89
90 case clang::DeclarationName::CXXConversionFunctionName:
91 //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"CXXConversionFunctionName\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
92 return DeclContext::lookup_result();
93 break;
94
95 case clang::DeclarationName::CXXOperatorName:
96 //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"CXXOperatorName\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
97 return DeclContext::lookup_result();
98 break;
99
100 case clang::DeclarationName::CXXLiteralOperatorName:
101 //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"CXXLiteralOperatorName\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
102 return DeclContext::lookup_result();
103 break;
104
105 case clang::DeclarationName::CXXUsingDirective:
106 //printf ("ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(decl_ctx = %p, decl_name = { kind = \"CXXUsingDirective\", name = \"%s\")\n", decl_ctx, decl_name.c_str());
107 return SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
108 }
109
110 return DeclContext::lookup_result();
111}
112
113void
114ClangExternalASTSourceCallbacks::CompleteType (TagDecl *tag_decl)
115{
116 if (m_callback_tag_decl)
117 m_callback_tag_decl (m_callback_baton, tag_decl);
118}
119
120void
121ClangExternalASTSourceCallbacks::CompleteType (ObjCInterfaceDecl *objc_decl)
122{
123 if (m_callback_objc_decl)
124 m_callback_objc_decl (m_callback_baton, objc_decl);
125}