1*a9ac8606Spatrick //===- NodeIntrospection.h -----------------------------------*- C++ -*----===//
2*a9ac8606Spatrick //
3*a9ac8606Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*a9ac8606Spatrick // See https://llvm.org/LICENSE.txt for license information.
5*a9ac8606Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*a9ac8606Spatrick //
7*a9ac8606Spatrick //===----------------------------------------------------------------------===//
8*a9ac8606Spatrick //
9*a9ac8606Spatrick // This file contains the implementation of the NodeIntrospection.
10*a9ac8606Spatrick //
11*a9ac8606Spatrick //===----------------------------------------------------------------------===//
12*a9ac8606Spatrick
13*a9ac8606Spatrick #include "clang/Tooling/NodeIntrospection.h"
14*a9ac8606Spatrick
15*a9ac8606Spatrick #include "clang/AST/AST.h"
16*a9ac8606Spatrick #include "llvm/Support/raw_ostream.h"
17*a9ac8606Spatrick
18*a9ac8606Spatrick namespace clang {
19*a9ac8606Spatrick
20*a9ac8606Spatrick namespace tooling {
21*a9ac8606Spatrick
print(const LocationCall & Call,llvm::raw_ostream & OS)22*a9ac8606Spatrick void LocationCallFormatterCpp::print(const LocationCall &Call,
23*a9ac8606Spatrick llvm::raw_ostream &OS) {
24*a9ac8606Spatrick if (const LocationCall *On = Call.on()) {
25*a9ac8606Spatrick print(*On, OS);
26*a9ac8606Spatrick if (On->returnsPointer())
27*a9ac8606Spatrick OS << "->";
28*a9ac8606Spatrick else
29*a9ac8606Spatrick OS << '.';
30*a9ac8606Spatrick }
31*a9ac8606Spatrick
32*a9ac8606Spatrick OS << Call.name() << "()";
33*a9ac8606Spatrick }
34*a9ac8606Spatrick
format(const LocationCall & Call)35*a9ac8606Spatrick std::string LocationCallFormatterCpp::format(const LocationCall &Call) {
36*a9ac8606Spatrick std::string Result;
37*a9ac8606Spatrick llvm::raw_string_ostream OS(Result);
38*a9ac8606Spatrick print(Call, OS);
39*a9ac8606Spatrick OS.flush();
40*a9ac8606Spatrick return Result;
41*a9ac8606Spatrick }
42*a9ac8606Spatrick
43*a9ac8606Spatrick namespace internal {
44*a9ac8606Spatrick
locationCallLessThan(const LocationCall * LHS,const LocationCall * RHS)45*a9ac8606Spatrick static bool locationCallLessThan(const LocationCall *LHS,
46*a9ac8606Spatrick const LocationCall *RHS) {
47*a9ac8606Spatrick if (!LHS && !RHS)
48*a9ac8606Spatrick return false;
49*a9ac8606Spatrick if (LHS && !RHS)
50*a9ac8606Spatrick return true;
51*a9ac8606Spatrick if (!LHS && RHS)
52*a9ac8606Spatrick return false;
53*a9ac8606Spatrick auto compareResult = LHS->name().compare(RHS->name());
54*a9ac8606Spatrick if (compareResult < 0)
55*a9ac8606Spatrick return true;
56*a9ac8606Spatrick if (compareResult > 0)
57*a9ac8606Spatrick return false;
58*a9ac8606Spatrick return locationCallLessThan(LHS->on(), RHS->on());
59*a9ac8606Spatrick }
60*a9ac8606Spatrick
operator ()(std::pair<SourceRange,SharedLocationCall> const & LHS,std::pair<SourceRange,SharedLocationCall> const & RHS) const61*a9ac8606Spatrick bool RangeLessThan::operator()(
62*a9ac8606Spatrick std::pair<SourceRange, SharedLocationCall> const &LHS,
63*a9ac8606Spatrick std::pair<SourceRange, SharedLocationCall> const &RHS) const {
64*a9ac8606Spatrick if (LHS.first.getBegin() < RHS.first.getBegin())
65*a9ac8606Spatrick return true;
66*a9ac8606Spatrick else if (LHS.first.getBegin() != RHS.first.getBegin())
67*a9ac8606Spatrick return false;
68*a9ac8606Spatrick
69*a9ac8606Spatrick if (LHS.first.getEnd() < RHS.first.getEnd())
70*a9ac8606Spatrick return true;
71*a9ac8606Spatrick else if (LHS.first.getEnd() != RHS.first.getEnd())
72*a9ac8606Spatrick return false;
73*a9ac8606Spatrick
74*a9ac8606Spatrick return locationCallLessThan(LHS.second.get(), RHS.second.get());
75*a9ac8606Spatrick }
operator ()(std::pair<SourceLocation,SharedLocationCall> const & LHS,std::pair<SourceLocation,SharedLocationCall> const & RHS) const76*a9ac8606Spatrick bool RangeLessThan::operator()(
77*a9ac8606Spatrick std::pair<SourceLocation, SharedLocationCall> const &LHS,
78*a9ac8606Spatrick std::pair<SourceLocation, SharedLocationCall> const &RHS) const {
79*a9ac8606Spatrick if (LHS.first == RHS.first)
80*a9ac8606Spatrick return locationCallLessThan(LHS.second.get(), RHS.second.get());
81*a9ac8606Spatrick return LHS.first < RHS.first;
82*a9ac8606Spatrick }
83*a9ac8606Spatrick } // namespace internal
84*a9ac8606Spatrick
85*a9ac8606Spatrick } // namespace tooling
86*a9ac8606Spatrick } // namespace clang
87*a9ac8606Spatrick
88*a9ac8606Spatrick #include "clang/Tooling/NodeIntrospection.inc"
89