Index: lldb/trunk/include/lldb/Symbol/ClangASTContext.h =================================================================== --- lldb/trunk/include/lldb/Symbol/ClangASTContext.h +++ lldb/trunk/include/lldb/Symbol/ClangASTContext.h @@ -465,6 +465,8 @@ CompilerType DeclGetFunctionArgumentType(void *opaque_decl, size_t arg_idx) override; + CompilerType GetTypeForDecl(void *opaque_decl) override; + // CompilerDeclContext override functions std::vector Index: lldb/trunk/include/lldb/Symbol/DeclVendor.h =================================================================== --- lldb/trunk/include/lldb/Symbol/DeclVendor.h +++ lldb/trunk/include/lldb/Symbol/DeclVendor.h @@ -9,7 +9,6 @@ #ifndef liblldb_DeclVendor_h_ #define liblldb_DeclVendor_h_ -#include "lldb/Core/ClangForward.h" #include "lldb/lldb-defines.h" #include @@ -51,7 +50,7 @@ /// max_matches. virtual uint32_t FindDecls(ConstString name, bool append, uint32_t max_matches, - std::vector &decls) = 0; + std::vector &decls) = 0; /// Look up the types that the DeclVendor currently knows about matching a /// given name. Index: lldb/trunk/include/lldb/Symbol/TypeSystem.h =================================================================== --- lldb/trunk/include/lldb/Symbol/TypeSystem.h +++ lldb/trunk/include/lldb/Symbol/TypeSystem.h @@ -126,6 +126,8 @@ virtual CompilerType DeclGetFunctionArgumentType(void *opaque_decl, size_t arg_idx); + virtual CompilerType GetTypeForDecl(void *opaque_decl) = 0; + // CompilerDeclContext functions virtual std::vector Index: lldb/trunk/source/Plugins/ExpressionParser/Clang/CMakeLists.txt =================================================================== --- lldb/trunk/source/Plugins/ExpressionParser/Clang/CMakeLists.txt +++ lldb/trunk/source/Plugins/ExpressionParser/Clang/CMakeLists.txt @@ -8,6 +8,7 @@ ASTStructExtractor.cpp ASTUtils.cpp ClangASTSource.cpp + ClangDeclVendor.cpp ClangExpressionDeclMap.cpp ClangExpressionParser.cpp ClangExpressionSourceCode.cpp Index: lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp =================================================================== --- lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp +++ lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp @@ -9,6 +9,7 @@ #include "ClangASTSource.h" #include "ASTDumper.h" +#include "ClangDeclVendor.h" #include "ClangModulesDeclVendor.h" #include "lldb/Core/Module.h" @@ -971,7 +972,8 @@ uint32_t max_matches = 1; std::vector decls; - if (!decl_vendor->FindDecls(name, append, max_matches, decls)) + auto *clang_decl_vendor = llvm::cast(decl_vendor); + if (!clang_decl_vendor->FindDecls(name, append, max_matches, decls)) break; if (log) { @@ -1423,7 +1425,9 @@ uint32_t max_matches = 1; std::vector decls; - if (!decl_vendor->FindDecls(interface_name, append, max_matches, decls)) + auto *clang_decl_vendor = llvm::cast(decl_vendor); + if (!clang_decl_vendor->FindDecls(interface_name, append, max_matches, + decls)) break; ObjCInterfaceDecl *runtime_interface_decl = @@ -1612,7 +1616,8 @@ uint32_t max_matches = 1; std::vector decls; - if (!decl_vendor->FindDecls(class_name, append, max_matches, decls)) + auto *clang_decl_vendor = llvm::cast(decl_vendor); + if (!clang_decl_vendor->FindDecls(class_name, append, max_matches, decls)) break; DeclFromUser interface_decl_from_runtime( Index: lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.h =================================================================== --- lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.h +++ lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.h @@ -9,6 +9,7 @@ #ifndef liblldb_ClangDeclVendor_h_ #define liblldb_ClangDeclVendor_h_ +#include "lldb/Core/ClangForward.h" #include "lldb/Symbol/DeclVendor.h" #include "clang/AST/ExternalASTMerger.h" @@ -29,6 +30,13 @@ /// An ImporterSource for this ClangDeclVendor. virtual clang::ExternalASTMerger::ImporterSource GetImporterSource() = 0; + uint32_t FindDecls(ConstString name, bool append, uint32_t max_matches, + std::vector &decls) override; + + virtual uint32_t FindDecls(ConstString name, bool append, + uint32_t max_matches, + std::vector &decls) = 0; + static bool classof(const DeclVendor *vendor) { return vendor->GetKind() >= eClangDeclVendor && vendor->GetKind() < eLastClangDeclVendor; Index: lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.cpp =================================================================== --- lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.cpp +++ lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.cpp @@ -0,0 +1,30 @@ +//===-- ClangDeclVendor.cpp -------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "Plugins/ExpressionParser/Clang/ClangDeclVendor.h" + +#include "lldb/Symbol/ClangASTContext.h" +#include "lldb/Utility/ConstString.h" + +using namespace lldb_private; + +uint32_t ClangDeclVendor::FindDecls(ConstString name, bool append, + uint32_t max_matches, + std::vector &decls) { + if (!append) + decls.clear(); + + std::vector named_decls; + uint32_t ret = FindDecls(name, /*append*/ false, max_matches, named_decls); + for (auto *named_decl : named_decls) { + decls.push_back(CompilerDecl( + ClangASTContext::GetASTContext(&named_decl->getASTContext()), + named_decl)); + } + return ret; +} Index: lldb/trunk/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h =================================================================== --- lldb/trunk/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h +++ lldb/trunk/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h @@ -17,6 +17,7 @@ #include "llvm/Support/Casting.h" #include "lldb/Breakpoint/BreakpointPrecondition.h" +#include "lldb/Core/ClangForward.h" #include "lldb/Core/PluginInterface.h" #include "lldb/Core/ThreadSafeDenseMap.h" #include "lldb/Symbol/CompilerType.h" Index: lldb/trunk/source/Symbol/ClangASTContext.cpp =================================================================== --- lldb/trunk/source/Symbol/ClangASTContext.cpp +++ lldb/trunk/source/Symbol/ClangASTContext.cpp @@ -1473,6 +1473,16 @@ return ast->getASTContext()->hasSameType(type1_qual, type2_qual); } +CompilerType ClangASTContext::GetTypeForDecl(void *opaque_decl) { + if (!opaque_decl) + return CompilerType(); + + clang::Decl *decl = static_cast(opaque_decl); + if (auto *named_decl = llvm::dyn_cast(decl)) + return GetTypeForDecl(named_decl); + return CompilerType(); +} + CompilerType ClangASTContext::GetTypeForDecl(clang::NamedDecl *decl) { if (clang::ObjCInterfaceDecl *interface_decl = llvm::dyn_cast(decl)) Index: lldb/trunk/source/Symbol/DeclVendor.cpp =================================================================== --- lldb/trunk/source/Symbol/DeclVendor.cpp +++ lldb/trunk/source/Symbol/DeclVendor.cpp @@ -7,8 +7,8 @@ //===----------------------------------------------------------------------===// #include "lldb/Symbol/DeclVendor.h" - -#include "lldb/Symbol/ClangASTContext.h" +#include "lldb/Symbol/CompilerDecl.h" +#include "lldb/Symbol/TypeSystem.h" #include @@ -20,10 +20,11 @@ // FIXME: This depends on clang, but should be able to support any // TypeSystem. std::vector ret; - std::vector decls; + std::vector decls; if (FindDecls(name, /*append*/ true, max_matches, decls)) - for (auto *decl : decls) - if (auto type = ClangASTContext::GetTypeForDecl(decl)) + for (auto decl : decls) + if (auto type = + decl.GetTypeSystem()->GetTypeForDecl(decl.GetOpaqueDecl())) ret.push_back(type); return ret; }