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 @@ -58,7 +58,8 @@ class LocationCallFormatterCpp { public: - static std::string format(LocationCall *Call); + static void print(const LocationCall &Call, llvm::raw_ostream &OS); + static std::string format(const LocationCall &Call); }; namespace internal { 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,40 @@ #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 LocationCallFormatterCpp::print(const LocationCall &Call, + llvm::raw_ostream &OS) { + if (const LocationCall *On = Call.on()) { + print(*On, OS); + if (On->returnsPointer()) + OS << "->"; + else + OS << '.'; } - std::string result; - for (auto *VecCall : llvm::reverse(llvm::makeArrayRef(vec).drop_front())) { - result += - (VecCall->name() + "()" + (VecCall->returnsPointer() ? "->" : ".")) - .str(); + + OS << Call.name(); + if (Call.args().empty()) { + OS << "()"; + return; + } + OS << '(' << Call.args().front(); + for (const std::string &Arg : Call.args().drop_front()) { + OS << ", " << Arg; } - result += (vec.back()->name() + "()").str(); - return result; + OS << ')'; +} + +std::string LocationCallFormatterCpp::format(const LocationCall &Call) { + std::string Result; + llvm::raw_string_ostream OS(Result); + print(Call, OS); + OS.flush(); + return Result; } namespace internal { diff --git a/clang/unittests/Introspection/IntrospectionTest.cpp b/clang/unittests/Introspection/IntrospectionTest.cpp --- a/clang/unittests/Introspection/IntrospectionTest.cpp +++ b/clang/unittests/Introspection/IntrospectionTest.cpp @@ -36,9 +36,9 @@ }), std::inserter(Result, Result.end()), [](const auto &Accessor) { - return std::make_pair( - LocationCallFormatterCpp::format(Accessor.second.get()), - Accessor.first); + return std::make_pair(LocationCallFormatterCpp::format( + *Accessor.second.get()), + Accessor.first); }); return Result; }