17 #include "llvm/Support/Errc.h" 22 using namespace clang;
23 using namespace tooling;
31 if (P ==
nullptr || D::typeId() != P->
typeId())
33 return static_cast<const D *
>(
P);
38 auto &NodesMap = Nodes.
getMap();
39 auto It = NodesMap.find(Id);
40 if (It == NodesMap.end())
41 return llvm::make_error<llvm::StringError>(llvm::errc::invalid_argument,
42 "Id not bound: " + Id);
49 explicit RawTextData(std::string T) :
Text(std::move(T)) {}
54 struct DebugPrintNodeOpData {
55 explicit DebugPrintNodeOpData(std::string S) :
Id(std::move(S)) {}
60 struct SelectorOpData {
66 bool isEqualData(
const RawTextData &A,
const RawTextData &B) {
67 return A.Text == B.Text;
70 bool isEqualData(
const DebugPrintNodeOpData &A,
const DebugPrintNodeOpData &B) {
75 bool isEqualData(
const SelectorOpData &,
const SelectorOpData &) {
return false; }
82 std::string *Result) {
83 Result->append(Data.Text);
84 return Error::success();
87 Error
evalData(
const DebugPrintNodeOpData &Data,
90 llvm::raw_string_ostream Os(Output);
92 if (
auto Err = NodeOrErr.takeError())
96 return Error::success();
100 std::string *Result) {
101 auto Range = Data.Selector(Match);
103 return Range.takeError();
105 return Error::success();
108 template <
typename T>
113 template <
typename... Ps>
116 Data(
std::forward<Ps>(Args)...) {}
126 std::string *Result)
const override {
127 return evalData(Data, Match, Result);
131 if (
const auto *OtherPtr = down_cast<StencilPartImpl>(&Other))
152 for (
auto &Part : OtherStencil.Parts)
153 Parts.push_back(std::move(Part));
159 for (
const auto &Part : Parts)
160 if (
auto Err = Part.eval(Match, &Result))
161 return std::move(Err);
166 return StencilPart(std::make_shared<RawText>(Text));
170 return StencilPart(std::make_shared<SelectorOp>(std::move(Selector)));
174 return StencilPart(std::make_shared<DebugPrintNodeOp>(Id));
A class to allow finding matches over the Clang AST.
Defines the clang::ASTContext interface.
Smart pointer class that efficiently represents Objective-C method names.
const D * down_cast(const StencilPartInterface *P)
static llvm::Expected< ast_type_traits::DynTypedNode > getNode(const ast_matchers::BoundNodes &Nodes, StringRef Id)
MatchFinder::MatchResult MatchResult
Describes how types, statements, expressions, and declarations should be printed. ...
BoundNodesTreeBuilder Nodes
const IDToNodeMap & getMap() const
Retrieve mapping from binding identifiers to bound nodes.
StencilPartImpl(Ps &&... Args)
bool isEqualData(const RawTextData &A, const RawTextData &B)
static const void * typeId()
Error eval(const MatchFinder::MatchResult &Match, std::string *Result) const override
Contains all information for a given match.
Error evalData(const RawTextData &Data, const MatchFinder::MatchResult &, std::string *Result)
Maps string IDs to AST nodes matched by parts of a matcher.
clang::ASTContext *const Context
Utilities for interpreting the matched AST structures.
const BoundNodes Nodes
Contains the nodes bound on the current match.
Dataflow Directional Tag Classes.
const LangOptions & getLangOpts() const
bool isEqual(const StencilPartInterface &Other) const override