Add a 'type lookup' command. This command is meant to look up type information by name in a language-specific way.

Currently, it only supports Objective-C - C++ types can be looked up through debug info via 'image lookup -t', whereas ObjC types via this command are looked up by runtime introspection

This behavior is in line with type lookup's behavior in Xcode 7, but I am definitely open to feedback as to what makes the most sense here

llvm-svn: 249047
diff --git a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp
index c7e024c..6c1aee9 100644
--- a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp
+++ b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp
@@ -656,3 +656,91 @@
     
     return result;
 }
+
+std::unique_ptr<Language::TypeScavenger>
+ObjCLanguage::GetTypeScavenger ()
+{
+    class ObjCTypeScavenger : public Language::TypeScavenger
+    {
+    private:
+        class ObjCScavengerResult : public Language::TypeScavenger::Result
+        {
+        public:
+            ObjCScavengerResult (CompilerType type) :
+                Language::TypeScavenger::Result(),
+                m_compiler_type(type)
+            {
+            }
+            
+            bool
+            IsValid () override
+            {
+                return m_compiler_type.IsValid();
+            }
+            
+            bool
+            DumpToStream (Stream& stream,
+                          bool print_help_if_available) override
+            {
+                if (IsValid())
+                {
+                    m_compiler_type.DumpTypeDescription(&stream);
+                    stream.EOL();
+                    return true;
+                }
+                return false;
+            }
+
+            virtual ~ObjCScavengerResult() = default;
+        private:
+            CompilerType m_compiler_type;
+        };
+        
+    protected:
+        ObjCTypeScavenger() = default;
+        
+        virtual ~ObjCTypeScavenger() = default;
+        
+        bool
+        Find_Impl (ExecutionContextScope *exe_scope,
+                   const char *key,
+                   ResultSet &results) override
+        {
+            bool result = false;
+            
+            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)
+                    {
+                        std::vector<clang::NamedDecl *> decls;
+                        ConstString name(key);
+                        decl_vendor->FindDecls(name, true, UINT32_MAX, decls);
+                        for (auto decl : decls)
+                        {
+                            if (decl)
+                            {
+                                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;
+        }
+
+        friend class ObjCLanguage;
+    };
+    
+    return std::unique_ptr<TypeScavenger>(new ObjCTypeScavenger());
+}
diff --git a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h
index 0e3c45f..09ee55d 100644
--- a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h
+++ b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h
@@ -146,6 +146,9 @@
     std::vector<ConstString>
     GetPossibleFormattersMatches (ValueObject& valobj, lldb::DynamicValueType use_dynamic) override;
     
+    std::unique_ptr<TypeScavenger>
+    GetTypeScavenger () override;
+    
     //------------------------------------------------------------------
     // Static Functions
     //------------------------------------------------------------------