diff --git a/clang/include/clang/Tooling/NodeIntrospection.h b/clang/include/clang/Tooling/NodeIntrospection.h --- a/clang/include/clang/Tooling/NodeIntrospection.h +++ b/clang/include/clang/Tooling/NodeIntrospection.h @@ -39,9 +39,10 @@ LocationCall *on() const { return m_on.get(); } StringRef name() const { return m_name; } - std::vector const &args() const { return m_args; } + ArrayRef args() const { return m_args; } bool returnsPointer() const { return m_flags & ReturnsPointer; } bool isCast() const { return m_flags & IsCast; } + void print(llvm::raw_ostream &OS) const; private: std::shared_ptr m_on; diff --git a/clang/lib/Tooling/NodeIntrospection.cpp b/clang/lib/Tooling/NodeIntrospection.cpp --- a/clang/lib/Tooling/NodeIntrospection.cpp +++ b/clang/lib/Tooling/NodeIntrospection.cpp @@ -13,25 +13,39 @@ #include "clang/Tooling/NodeIntrospection.h" #include "clang/AST/AST.h" +#include "llvm/Support/raw_ostream.h" namespace clang { namespace tooling { -std::string LocationCallFormatterCpp::format(LocationCall *Call) { - SmallVector vec; - while (Call) { - vec.push_back(Call); - Call = Call->on(); +void LocationCall::print(llvm::raw_ostream &OS) const { + if (const LocationCall *On = on()) { + On->print(OS); + if (On->returnsPointer()) + OS << "->"; + else + OS << '.'; + } + + OS << name(); + if (args().empty()) { + OS << "()"; + return; } - std::string result; - for (auto *VecCall : llvm::reverse(llvm::makeArrayRef(vec).drop_front())) { - result += - (VecCall->name() + "()" + (VecCall->returnsPointer() ? "->" : ".")) - .str(); + OS << '(' << args().front(); + for (const std::string &Arg : args().drop_front()) { + OS << ", " << Arg; } - result += (vec.back()->name() + "()").str(); - return result; + OS << ')'; +} + +std::string LocationCallFormatterCpp::format(LocationCall *Call) { + std::string Result; + llvm::raw_string_ostream OS(Result); + Call->print(OS); + OS.flush(); + return Result; } namespace internal {