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