summaryrefslogtreecommitdiffstats
path: root/lldb/source/Expression/ClangASTSource.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Expression/ClangASTSource.cpp')
-rw-r--r--lldb/source/Expression/ClangASTSource.cpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/lldb/source/Expression/ClangASTSource.cpp b/lldb/source/Expression/ClangASTSource.cpp
new file mode 100644
index 00000000000..996c20529ac
--- /dev/null
+++ b/lldb/source/Expression/ClangASTSource.cpp
@@ -0,0 +1,101 @@
+/*
+ * ClangASTSource.cpp
+ * lldb
+ *
+ * Created by John McCall on 6/1/10.
+ * Copyright 2010 Apple. All rights reserved.
+ *
+ */
+
+#define NO_RTTI
+
+#include "clang/AST/ASTContext.h"
+#include "lldb/Expression/ClangASTSource.h"
+#include "lldb/Expression/ClangExpression.h"
+#include "lldb/Expression/ClangExpressionDeclMap.h"
+
+using namespace clang;
+using namespace lldb_private;
+
+ClangASTSource::~ClangASTSource() {}
+
+void ClangASTSource::StartTranslationUnit(ASTConsumer *Consumer) {
+ // Tell Sema to ask us when looking into the translation unit's decl.
+ Context.getTranslationUnitDecl()->setHasExternalVisibleStorage();
+ Context.getTranslationUnitDecl()->setHasExternalLexicalStorage();
+}
+
+// These are only required for AST source that want to lazily load
+// the declarations (or parts thereof) that they return.
+Decl *ClangASTSource::GetExternalDecl(uint32_t) { return 0; }
+Stmt *ClangASTSource::GetExternalDeclStmt(uint64_t) { return 0; }
+
+// These are also optional, although it might help with ObjC
+// debugging if we have respectable signatures. But a more
+// efficient interface (that didn't require scanning all files
+// for method signatures!) might help.
+Selector ClangASTSource::GetExternalSelector(uint32_t) { return Selector(); }
+uint32_t ClangASTSource::GetNumExternalSelectors() { return 0; }
+
+// The core lookup interface.
+DeclContext::lookup_result ClangASTSource::FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name) {
+ switch (Name.getNameKind()) {
+ // Normal identifiers.
+ case DeclarationName::Identifier:
+ break;
+
+ // Operator names. Not important for now.
+ case DeclarationName::CXXOperatorName:
+ case DeclarationName::CXXLiteralOperatorName:
+ return DeclContext::lookup_result();
+
+ // Using directives found in this context.
+ // Tell Sema we didn't find any or we'll end up getting asked a *lot*.
+ case DeclarationName::CXXUsingDirective:
+ return SetNoExternalVisibleDeclsForName(DC, Name);
+
+ // These aren't looked up like this.
+ case DeclarationName::ObjCZeroArgSelector:
+ case DeclarationName::ObjCOneArgSelector:
+ case DeclarationName::ObjCMultiArgSelector:
+ return DeclContext::lookup_result();
+
+ // These aren't possible in the global context.
+ case DeclarationName::CXXConstructorName:
+ case DeclarationName::CXXDestructorName:
+ case DeclarationName::CXXConversionFunctionName:
+ return DeclContext::lookup_result();
+ }
+
+ llvm::SmallVector<NamedDecl*, 4> Decls;
+
+ NameSearchContext NSC(*this, Decls, Name, DC);
+
+ DeclMap.GetDecls(NSC, Name.getAsString().c_str());
+ return SetExternalVisibleDeclsForName(DC, Name, Decls);
+}
+
+// This is used to support iterating through an entire lexical context,
+// which isn't something the debugger should ever need to do.
+bool ClangASTSource::FindExternalLexicalDecls(const DeclContext *DC, llvm::SmallVectorImpl<Decl*> &Decls) {
+ // true is for error, that's good enough for me
+ return true;
+}
+
+clang::ASTContext *NameSearchContext::GetASTContext() {
+ return &ASTSource.Context;
+}
+
+clang::NamedDecl *NameSearchContext::AddVarDecl(void *type) {
+ clang::NamedDecl *Decl = VarDecl::Create(ASTSource.Context,
+ const_cast<DeclContext*>(DC),
+ SourceLocation(),
+ Name.getAsIdentifierInfo(),
+ QualType::getFromOpaquePtr(type),
+ 0,
+ VarDecl::Static,
+ VarDecl::Static);
+ Decls.push_back(Decl);
+
+ return Decl;
+}
OpenPOWER on IntegriCloud