diff --git a/lldb/include/lldb/Symbol/ClangASTContext.h b/lldb/include/lldb/Symbol/ClangASTContext.h index 2bb911c6e566..345bcd7c2840 100644 --- a/lldb/include/lldb/Symbol/ClangASTContext.h +++ b/lldb/include/lldb/Symbol/ClangASTContext.h @@ -19,12 +19,14 @@ // Other libraries and framework includes #include "llvm/ADT/SmallVector.h" +#include "clang/AST/ASTContext.h" #include "clang/AST/TemplateBase.h" // Project includes #include "lldb/lldb-enumerations.h" #include "lldb/Core/ClangForward.h" +#include "lldb/Core/ConstString.h" #include "lldb/Symbol/ClangASTType.h" namespace lldb_private { @@ -213,6 +215,34 @@ public: ClangASTType GetTypeForDecl (clang::ObjCInterfaceDecl *objc_decl); + + template + ClangASTType + GetTypeForIdentifier (const ConstString &type_name) + { + ClangASTType clang_type; + + if (type_name.GetLength()) + { + clang::ASTContext *ast = getASTContext(); + if (ast) + { + clang::IdentifierInfo &myIdent = ast->Idents.get(type_name.GetCString()); + clang::DeclarationName myName = ast->DeclarationNames.getIdentifier(&myIdent); + + clang::DeclContext::lookup_const_result result = ast->getTranslationUnitDecl()->lookup(myName); + + if (!result.empty()) + { + clang::NamedDecl *named_decl = result[0]; + if (const RecordDeclType *record_decl = llvm::dyn_cast(named_decl)) + clang_type.SetClangType(ast, clang::QualType(record_decl->getTypeForDecl(), 0)); + } + } + } + + return clang_type; + } //------------------------------------------------------------------ // Structure, Unions, Classes diff --git a/lldb/source/DataFormatters/NSDictionary.cpp b/lldb/source/DataFormatters/NSDictionary.cpp index da05c7bf9413..919ffaab0a6c 100644 --- a/lldb/source/DataFormatters/NSDictionary.cpp +++ b/lldb/source/DataFormatters/NSDictionary.cpp @@ -36,37 +36,21 @@ GetLLDBNSPairType (TargetSP target_sp) if (target_ast_context) { - clang::ASTContext *ast = target_ast_context->getASTContext(); + ConstString g___lldb_autogen_nspair("__lldb_autogen_nspair"); - if (ast) + clang_type = target_ast_context->GetTypeForIdentifier(g___lldb_autogen_nspair); + + if (!clang_type) { - const char* type_name = "__lldb_autogen_nspair"; + clang_type = target_ast_context->CreateRecordType(NULL, lldb::eAccessPublic, g___lldb_autogen_nspair.GetCString(), clang::TTK_Struct, lldb::eLanguageTypeC); - clang::IdentifierInfo &myIdent = ast->Idents.get(type_name); - clang::DeclarationName myName = ast->DeclarationNames.getIdentifier(&myIdent); - - clang::DeclContext::lookup_const_result result = ast->getTranslationUnitDecl()->lookup(myName); - - if (!result.empty()) + if (clang_type) { - clang::NamedDecl *named_decl = result[0]; - if (const clang::CXXRecordDecl *record_decl = llvm::dyn_cast(named_decl)) - clang_type.SetClangType(ast, clang::QualType(record_decl->getTypeForDecl(), 0)); - return clang_type; - } - - if (!clang_type) - { - clang_type = target_ast_context->CreateRecordType(NULL, lldb::eAccessPublic, type_name, clang::TTK_Struct, lldb::eLanguageTypeC); - - if (clang_type) - { - clang_type.StartTagDeclarationDefinition(); - ClangASTType id_clang_type = target_ast_context->GetBasicType (eBasicTypeObjCID); - clang_type.AddFieldToRecordType("key", id_clang_type, lldb::eAccessPublic, 0); - clang_type.AddFieldToRecordType("value", id_clang_type, lldb::eAccessPublic, 0); - clang_type.CompleteTagDeclarationDefinition(); - } + clang_type.StartTagDeclarationDefinition(); + ClangASTType id_clang_type = target_ast_context->GetBasicType (eBasicTypeObjCID); + clang_type.AddFieldToRecordType("key", id_clang_type, lldb::eAccessPublic, 0); + clang_type.AddFieldToRecordType("value", id_clang_type, lldb::eAccessPublic, 0); + clang_type.CompleteTagDeclarationDefinition(); } } }