forked from OSchip/llvm-project
[Symbol] Decouple clang from DeclVendor
Summary: This removes DeclVendor's dependency on clang (and ClangASTContext). DeclVendor has no need to know about specific TypeSystems. Differential Revision: https://reviews.llvm.org/D66628 llvm-svn: 369735
This commit is contained in:
parent
4deb388bca
commit
cb68bd726d
|
@ -465,6 +465,8 @@ public:
|
|||
CompilerType DeclGetFunctionArgumentType(void *opaque_decl,
|
||||
size_t arg_idx) override;
|
||||
|
||||
CompilerType GetTypeForDecl(void *opaque_decl) override;
|
||||
|
||||
// CompilerDeclContext override functions
|
||||
|
||||
std::vector<CompilerDecl>
|
||||
|
|
|
@ -9,7 +9,6 @@
|
|||
#ifndef liblldb_DeclVendor_h_
|
||||
#define liblldb_DeclVendor_h_
|
||||
|
||||
#include "lldb/Core/ClangForward.h"
|
||||
#include "lldb/lldb-defines.h"
|
||||
|
||||
#include <vector>
|
||||
|
@ -51,7 +50,7 @@ public:
|
|||
/// max_matches.
|
||||
virtual uint32_t FindDecls(ConstString name, bool append,
|
||||
uint32_t max_matches,
|
||||
std::vector<clang::NamedDecl *> &decls) = 0;
|
||||
std::vector<CompilerDecl> &decls) = 0;
|
||||
|
||||
/// Look up the types that the DeclVendor currently knows about matching a
|
||||
/// given name.
|
||||
|
|
|
@ -126,6 +126,8 @@ public:
|
|||
virtual CompilerType DeclGetFunctionArgumentType(void *opaque_decl,
|
||||
size_t arg_idx);
|
||||
|
||||
virtual CompilerType GetTypeForDecl(void *opaque_decl) = 0;
|
||||
|
||||
// CompilerDeclContext functions
|
||||
|
||||
virtual std::vector<CompilerDecl>
|
||||
|
|
|
@ -8,6 +8,7 @@ add_lldb_library(lldbPluginExpressionParserClang PLUGIN
|
|||
ASTStructExtractor.cpp
|
||||
ASTUtils.cpp
|
||||
ClangASTSource.cpp
|
||||
ClangDeclVendor.cpp
|
||||
ClangExpressionDeclMap.cpp
|
||||
ClangExpressionParser.cpp
|
||||
ClangExpressionSourceCode.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 @@ void ClangASTSource::FindExternalVisibleDecls(
|
|||
uint32_t max_matches = 1;
|
||||
std::vector<clang::NamedDecl *> decls;
|
||||
|
||||
if (!decl_vendor->FindDecls(name, append, max_matches, decls))
|
||||
auto *clang_decl_vendor = llvm::cast<ClangDeclVendor>(decl_vendor);
|
||||
if (!clang_decl_vendor->FindDecls(name, append, max_matches, decls))
|
||||
break;
|
||||
|
||||
if (log) {
|
||||
|
@ -1423,7 +1425,9 @@ void ClangASTSource::FindObjCMethodDecls(NameSearchContext &context) {
|
|||
uint32_t max_matches = 1;
|
||||
std::vector<clang::NamedDecl *> decls;
|
||||
|
||||
if (!decl_vendor->FindDecls(interface_name, append, max_matches, decls))
|
||||
auto *clang_decl_vendor = llvm::cast<ClangDeclVendor>(decl_vendor);
|
||||
if (!clang_decl_vendor->FindDecls(interface_name, append, max_matches,
|
||||
decls))
|
||||
break;
|
||||
|
||||
ObjCInterfaceDecl *runtime_interface_decl =
|
||||
|
@ -1612,7 +1616,8 @@ void ClangASTSource::FindObjCPropertyAndIvarDecls(NameSearchContext &context) {
|
|||
uint32_t max_matches = 1;
|
||||
std::vector<clang::NamedDecl *> decls;
|
||||
|
||||
if (!decl_vendor->FindDecls(class_name, append, max_matches, decls))
|
||||
auto *clang_decl_vendor = llvm::cast<ClangDeclVendor>(decl_vendor);
|
||||
if (!clang_decl_vendor->FindDecls(class_name, append, max_matches, decls))
|
||||
break;
|
||||
|
||||
DeclFromUser<const ObjCInterfaceDecl> interface_decl_from_runtime(
|
||||
|
|
|
@ -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<CompilerDecl> &decls) {
|
||||
if (!append)
|
||||
decls.clear();
|
||||
|
||||
std::vector<clang::NamedDecl *> 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;
|
||||
}
|
|
@ -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 @@ public:
|
|||
/// An ImporterSource for this ClangDeclVendor.
|
||||
virtual clang::ExternalASTMerger::ImporterSource GetImporterSource() = 0;
|
||||
|
||||
uint32_t FindDecls(ConstString name, bool append, uint32_t max_matches,
|
||||
std::vector<CompilerDecl> &decls) override;
|
||||
|
||||
virtual uint32_t FindDecls(ConstString name, bool append,
|
||||
uint32_t max_matches,
|
||||
std::vector<clang::NamedDecl *> &decls) = 0;
|
||||
|
||||
static bool classof(const DeclVendor *vendor) {
|
||||
return vendor->GetKind() >= eClangDeclVendor &&
|
||||
vendor->GetKind() < eLastClangDeclVendor;
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -1473,6 +1473,16 @@ bool ClangASTContext::AreTypesSame(CompilerType type1, CompilerType type2,
|
|||
return ast->getASTContext()->hasSameType(type1_qual, type2_qual);
|
||||
}
|
||||
|
||||
CompilerType ClangASTContext::GetTypeForDecl(void *opaque_decl) {
|
||||
if (!opaque_decl)
|
||||
return CompilerType();
|
||||
|
||||
clang::Decl *decl = static_cast<clang::Decl *>(opaque_decl);
|
||||
if (auto *named_decl = llvm::dyn_cast<clang::NamedDecl>(decl))
|
||||
return GetTypeForDecl(named_decl);
|
||||
return CompilerType();
|
||||
}
|
||||
|
||||
CompilerType ClangASTContext::GetTypeForDecl(clang::NamedDecl *decl) {
|
||||
if (clang::ObjCInterfaceDecl *interface_decl =
|
||||
llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
|
||||
|
|
|
@ -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 <vector>
|
||||
|
||||
|
@ -20,10 +20,11 @@ std::vector<CompilerType> DeclVendor::FindTypes(ConstString name,
|
|||
// FIXME: This depends on clang, but should be able to support any
|
||||
// TypeSystem.
|
||||
std::vector<CompilerType> ret;
|
||||
std::vector<clang::NamedDecl *> decls;
|
||||
std::vector<CompilerDecl> 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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue