blob: 996c20529ac98f87e01cb880b7f2118aaeb5be18 [file] [log] [blame]
/*
* 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;
}