[AST] Fix location call storage with common last-invocation

Differential Revision: https://reviews.llvm.org/D100548
This commit is contained in:
Stephen Kelly 2021-04-15 12:18:34 +01:00
parent 916f3e16bd
commit 4f6d698467
2 changed files with 29 additions and 2 deletions

View File

@ -66,13 +66,15 @@ bool RangeLessThan::operator()(
else if (LHS.first.getEnd() != RHS.first.getEnd())
return false;
return LHS.second->name() < RHS.second->name();
return LocationCallFormatterCpp::format(*LHS.second) <
LocationCallFormatterCpp::format(*RHS.second);
}
bool RangeLessThan::operator()(
std::pair<SourceLocation, SharedLocationCall> const &LHS,
std::pair<SourceLocation, SharedLocationCall> const &RHS) const {
if (LHS.first == RHS.first)
return LHS.second->name() < RHS.second->name();
return LocationCallFormatterCpp::format(*LHS.second) <
LocationCallFormatterCpp::format(*RHS.second);
return LHS.first < RHS.first;
}
} // namespace internal

View File

@ -45,6 +45,31 @@ FormatExpected(const MapType &Accessors) {
#define STRING_LOCATION_PAIR(INSTANCE, LOC) Pair(#LOC, INSTANCE->LOC)
TEST(Introspection, SourceLocations_CallContainer) {
SourceLocationMap slm;
SharedLocationCall Prefix;
slm.insert(std::make_pair(
SourceLocation(),
llvm::makeIntrusiveRefCnt<LocationCall>(Prefix, "getSourceRange")));
EXPECT_EQ(slm.size(), 1u);
auto callTypeLoc =
llvm::makeIntrusiveRefCnt<LocationCall>(Prefix, "getTypeLoc");
slm.insert(std::make_pair(
SourceLocation(),
llvm::makeIntrusiveRefCnt<LocationCall>(callTypeLoc, "getSourceRange")));
EXPECT_EQ(slm.size(), 2u);
}
TEST(Introspection, SourceLocations_CallChainFormatting) {
SharedLocationCall Prefix;
auto chainedCall = llvm::makeIntrusiveRefCnt<LocationCall>(
llvm::makeIntrusiveRefCnt<LocationCall>(Prefix, "getTypeLoc"),
"getSourceRange");
EXPECT_EQ(LocationCallFormatterCpp::format(*chainedCall),
"getTypeLoc().getSourceRange()");
}
TEST(Introspection, SourceLocations_Stmt) {
if (!NodeIntrospection::hasIntrospectionSupport())
return;