| //===- NodeIntrospection.h -----------------------------------*- C++ -*----===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file contains the implementation of the NodeIntrospection. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "clang/Tooling/NodeIntrospection.h" |
| |
| #include "clang/AST/AST.h" |
| #include "llvm/Support/raw_ostream.h" |
| |
| namespace clang { |
| |
| namespace tooling { |
| |
| 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 << '.'; |
| } |
| |
| OS << Call.name() << "()"; |
| } |
| |
| 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 { |
| |
| static bool locationCallLessThan(const LocationCall *LHS, |
| const LocationCall *RHS) { |
| if (!LHS && !RHS) |
| return false; |
| if (LHS && !RHS) |
| return true; |
| if (!LHS && RHS) |
| return false; |
| auto compareResult = LHS->name().compare(RHS->name()); |
| if (compareResult < 0) |
| return true; |
| if (compareResult > 0) |
| return false; |
| return locationCallLessThan(LHS->on(), RHS->on()); |
| } |
| |
| bool RangeLessThan::operator()( |
| std::pair<SourceRange, SharedLocationCall> const &LHS, |
| std::pair<SourceRange, SharedLocationCall> const &RHS) const { |
| if (LHS.first.getBegin() < RHS.first.getBegin()) |
| return true; |
| else if (LHS.first.getBegin() != RHS.first.getBegin()) |
| return false; |
| |
| if (LHS.first.getEnd() < RHS.first.getEnd()) |
| return true; |
| else if (LHS.first.getEnd() != RHS.first.getEnd()) |
| return false; |
| |
| return locationCallLessThan(LHS.second.get(), RHS.second.get()); |
| } |
| bool RangeLessThan::operator()( |
| std::pair<SourceLocation, SharedLocationCall> const &LHS, |
| std::pair<SourceLocation, SharedLocationCall> const &RHS) const { |
| if (LHS.first == RHS.first) |
| return locationCallLessThan(LHS.second.get(), RHS.second.get()); |
| return LHS.first < RHS.first; |
| } |
| } // namespace internal |
| |
| } // namespace tooling |
| } // namespace clang |
| |
| #include "clang/Tooling/NodeIntrospection.inc" |