[AST] Add a print method to Introspection LocationCall

Add a print method that takes a raw_ostream.
Change LocationCallFormatterCpp::format to call that method.

Reviewed By: steveire

Differential Revision: https://reviews.llvm.org/D100423
This commit is contained in:
Nathan James 2021-04-15 22:18:28 +01:00
parent 3f97c66b00
commit 542e7806e6
No known key found for this signature in database
GPG Key ID: CC007AFCDA90AA5F
3 changed files with 32 additions and 16 deletions

View File

@ -58,7 +58,8 @@ private:
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 {

View File

@ -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<LocationCall *> 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;
}
result += (vec.back()->name() + "()").str();
return result;
OS << '(' << Call.args().front();
for (const std::string &Arg : Call.args().drop_front()) {
OS << ", " << Arg;
}
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 {

View File

@ -36,9 +36,9 @@ FormatExpected(const MapType &Accessors) {
}),
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;
}