diff options
Diffstat (limited to 'lldb/source/Expression/ClangASTSource.cpp')
-rw-r--r-- | lldb/source/Expression/ClangASTSource.cpp | 101 |
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; +} |