xref: /aosp_15_r20/external/clang/tools/libclang/CXSourceLocation.h (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===- CXSourceLocation.h - CXSourceLocations Utilities ---------*- C++ -*-===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // This file defines routines for manipulating CXSourceLocations.
11*67e74705SXin Li //
12*67e74705SXin Li //===----------------------------------------------------------------------===//
13*67e74705SXin Li 
14*67e74705SXin Li #ifndef LLVM_CLANG_TOOLS_LIBCLANG_CXSOURCELOCATION_H
15*67e74705SXin Li #define LLVM_CLANG_TOOLS_LIBCLANG_CXSOURCELOCATION_H
16*67e74705SXin Li 
17*67e74705SXin Li #include "clang-c/Index.h"
18*67e74705SXin Li #include "clang/AST/ASTContext.h"
19*67e74705SXin Li #include "clang/Basic/LangOptions.h"
20*67e74705SXin Li #include "clang/Basic/SourceLocation.h"
21*67e74705SXin Li 
22*67e74705SXin Li namespace clang {
23*67e74705SXin Li 
24*67e74705SXin Li class SourceManager;
25*67e74705SXin Li 
26*67e74705SXin Li namespace cxloc {
27*67e74705SXin Li 
28*67e74705SXin Li /// \brief Translate a Clang source location into a CIndex source location.
29*67e74705SXin Li static inline CXSourceLocation
translateSourceLocation(const SourceManager & SM,const LangOptions & LangOpts,SourceLocation Loc)30*67e74705SXin Li translateSourceLocation(const SourceManager &SM, const LangOptions &LangOpts,
31*67e74705SXin Li                         SourceLocation Loc) {
32*67e74705SXin Li   if (Loc.isInvalid())
33*67e74705SXin Li     clang_getNullLocation();
34*67e74705SXin Li 
35*67e74705SXin Li   CXSourceLocation Result = { { &SM, &LangOpts, },
36*67e74705SXin Li                               Loc.getRawEncoding() };
37*67e74705SXin Li   return Result;
38*67e74705SXin Li }
39*67e74705SXin Li 
40*67e74705SXin Li /// \brief Translate a Clang source location into a CIndex source location.
translateSourceLocation(ASTContext & Context,SourceLocation Loc)41*67e74705SXin Li static inline CXSourceLocation translateSourceLocation(ASTContext &Context,
42*67e74705SXin Li                                                        SourceLocation Loc) {
43*67e74705SXin Li   return translateSourceLocation(Context.getSourceManager(),
44*67e74705SXin Li                                  Context.getLangOpts(),
45*67e74705SXin Li                                  Loc);
46*67e74705SXin Li }
47*67e74705SXin Li 
48*67e74705SXin Li /// \brief Translate a Clang source range into a CIndex source range.
49*67e74705SXin Li ///
50*67e74705SXin Li /// Clang internally represents ranges where the end location points to the
51*67e74705SXin Li /// start of the token at the end. However, for external clients it is more
52*67e74705SXin Li /// useful to have a CXSourceRange be a proper half-open interval. This routine
53*67e74705SXin Li /// does the appropriate translation.
54*67e74705SXin Li CXSourceRange translateSourceRange(const SourceManager &SM,
55*67e74705SXin Li                                    const LangOptions &LangOpts,
56*67e74705SXin Li                                    const CharSourceRange &R);
57*67e74705SXin Li 
58*67e74705SXin Li /// \brief Translate a Clang source range into a CIndex source range.
translateSourceRange(ASTContext & Context,SourceRange R)59*67e74705SXin Li static inline CXSourceRange translateSourceRange(ASTContext &Context,
60*67e74705SXin Li                                                  SourceRange R) {
61*67e74705SXin Li   return translateSourceRange(Context.getSourceManager(),
62*67e74705SXin Li                               Context.getLangOpts(),
63*67e74705SXin Li                               CharSourceRange::getTokenRange(R));
64*67e74705SXin Li }
65*67e74705SXin Li 
translateSourceLocation(CXSourceLocation L)66*67e74705SXin Li static inline SourceLocation translateSourceLocation(CXSourceLocation L) {
67*67e74705SXin Li   return SourceLocation::getFromRawEncoding(L.int_data);
68*67e74705SXin Li }
69*67e74705SXin Li 
translateCXSourceRange(CXSourceRange R)70*67e74705SXin Li static inline SourceRange translateCXSourceRange(CXSourceRange R) {
71*67e74705SXin Li   return SourceRange(SourceLocation::getFromRawEncoding(R.begin_int_data),
72*67e74705SXin Li                      SourceLocation::getFromRawEncoding(R.end_int_data));
73*67e74705SXin Li }
74*67e74705SXin Li 
75*67e74705SXin Li 
76*67e74705SXin Li }} // end namespace: clang::cxloc
77*67e74705SXin Li 
78*67e74705SXin Li #endif
79