xref: /openbsd-src/gnu/llvm/clang/lib/Tooling/NodeIntrospection.cpp (revision a9ac8606c53d55cee9c3a39778b249c51df111ef)
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