diff options
author | Enrico Granata <egranata@apple.com> | 2015-10-02 01:23:11 +0000 |
---|---|---|
committer | Enrico Granata <egranata@apple.com> | 2015-10-02 01:23:11 +0000 |
commit | 72d8a722410dfd775dc8bc13477c26aac244837b (patch) | |
tree | 5ce8181031298fac0d45a0aae05626564523602e /lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp | |
parent | 7e9fd56b267c5bf001888dc010b729d7553bcaa4 (diff) | |
download | bcm5719-llvm-72d8a722410dfd775dc8bc13477c26aac244837b.tar.gz bcm5719-llvm-72d8a722410dfd775dc8bc13477c26aac244837b.zip |
Teach 'type lookup' to pull types from clang modules; also add a test case
llvm-svn: 249117
Diffstat (limited to 'lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp')
-rw-r--r-- | lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp | 55 |
1 files changed, 39 insertions, 16 deletions
diff --git a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp index fa46ba2a08c..6a67e371340 100644 --- a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp +++ b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp @@ -708,34 +708,57 @@ ObjCLanguage::GetTypeScavenger () { bool result = false; - Process* process = exe_scope->CalculateProcess().get(); - if (process) + Target* target = exe_scope->CalculateTarget().get(); + if (target) { - const bool create_on_demand = false; - auto objc_runtime = process->GetObjCLanguageRuntime(create_on_demand); - if (objc_runtime) + if (auto clang_modules_decl_vendor = target->GetClangModulesDeclVendor()) { - auto decl_vendor = objc_runtime->GetDeclVendor(); - if (decl_vendor) + std::vector <clang::NamedDecl*> decls; + ConstString key_cs(key); + + if (clang_modules_decl_vendor->FindDecls(key_cs, false, UINT32_MAX, decls) > 0 && + decls.size() > 0) { - std::vector<clang::NamedDecl *> decls; - ConstString name(key); - decl_vendor->FindDecls(name, true, UINT32_MAX, decls); - for (auto decl : decls) + CompilerType module_type = ClangASTContext::GetTypeForDecl(decls.front()); + result = true; + std::unique_ptr<Language::TypeScavenger::Result> result(new ObjCScavengerResult(module_type)); + results.insert(std::move(result)); + } + } + } + + if (!result) + { + Process* process = exe_scope->CalculateProcess().get(); + if (process) + { + const bool create_on_demand = false; + auto objc_runtime = process->GetObjCLanguageRuntime(create_on_demand); + if (objc_runtime) + { + auto decl_vendor = objc_runtime->GetDeclVendor(); + if (decl_vendor) { - if (decl) + std::vector<clang::NamedDecl *> decls; + ConstString name(key); + decl_vendor->FindDecls(name, true, UINT32_MAX, decls); + for (auto decl : decls) { - if (CompilerType candidate = ClangASTContext::GetTypeForDecl(decl)) + if (decl) { - result = true; - std::unique_ptr<Language::TypeScavenger::Result> result(new ObjCScavengerResult(candidate)); - results.insert(std::move(result)); + if (CompilerType candidate = ClangASTContext::GetTypeForDecl(decl)) + { + result = true; + std::unique_ptr<Language::TypeScavenger::Result> result(new ObjCScavengerResult(candidate)); + results.insert(std::move(result)); + } } } } } } } + return result; } |