176dd3c2ff274772dc5771cb73f856d14aaf5ee2fDaniel Dunbar//===- CXSourceLocation.h - CXSourceLocations Utilities ---------*- C++ -*-===//
2a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek//
3a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek//                     The LLVM Compiler Infrastructure
4a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek//
5a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek// This file is distributed under the University of Illinois Open Source
6a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek// License. See LICENSE.TXT for details.
7a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek//
8a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek//===----------------------------------------------------------------------===//
9a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek//
10a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek// This file defines routines for manipulating CXSourceLocations.
11a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek//
12a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek//===----------------------------------------------------------------------===//
13a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek
14a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek#ifndef LLVM_CLANG_CXSOURCELOCATION_H
15a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek#define LLVM_CLANG_CXSOURCELOCATION_H
16a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek
17a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek#include "clang-c/Index.h"
185352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor#include "clang/AST/ASTContext.h"
19f59edb96b2d0bfe612b732f19519ab84bb995bd4Chandler Carruth#include "clang/Basic/LangOptions.h"
20f59edb96b2d0bfe612b732f19519ab84bb995bd4Chandler Carruth#include "clang/Basic/SourceLocation.h"
21a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek
22a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremeneknamespace clang {
23b846debc1b22a37228efe4aa87b34482d15b6a3cBenjamin Kramer
24b846debc1b22a37228efe4aa87b34482d15b6a3cBenjamin Kramerclass SourceManager;
25a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek
26a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremeneknamespace cxloc {
27a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek
28a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek/// \brief Translate a Clang source location into a CIndex source location.
295352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregorstatic inline CXSourceLocation
305352ac06d8f6194825bb2a99ffa009b61bafb503Douglas GregortranslateSourceLocation(const SourceManager &SM, const LangOptions &LangOpts,
31bb4a61a121ba1ee91eb5725881d98249704bb0aaDaniel Dunbar                        SourceLocation Loc) {
321a9a0bc472ee4fec72ee8be8b575fb66ca600d1bTed Kremenek  if (Loc.isInvalid())
331a9a0bc472ee4fec72ee8be8b575fb66ca600d1bTed Kremenek    clang_getNullLocation();
341a9a0bc472ee4fec72ee8be8b575fb66ca600d1bTed Kremenek
35e2748288a04cda2e976a3fe859e4334afaf9274aArgyrios Kyrtzidis  CXSourceLocation Result = { { &SM, &LangOpts, },
365352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor                              Loc.getRawEncoding() };
375352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  return Result;
385352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor}
395352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor
405352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor/// \brief Translate a Clang source location into a CIndex source location.
41a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenekstatic inline CXSourceLocation translateSourceLocation(ASTContext &Context,
42bb4a61a121ba1ee91eb5725881d98249704bb0aaDaniel Dunbar                                                       SourceLocation Loc) {
43bb4a61a121ba1ee91eb5725881d98249704bb0aaDaniel Dunbar  return translateSourceLocation(Context.getSourceManager(),
444e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie                                 Context.getLangOpts(),
45bb4a61a121ba1ee91eb5725881d98249704bb0aaDaniel Dunbar                                 Loc);
46a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek}
47a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek
48a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek/// \brief Translate a Clang source range into a CIndex source range.
4976dd3c2ff274772dc5771cb73f856d14aaf5ee2fDaniel Dunbar///
5076dd3c2ff274772dc5771cb73f856d14aaf5ee2fDaniel Dunbar/// Clang internally represents ranges where the end location points to the
5176dd3c2ff274772dc5771cb73f856d14aaf5ee2fDaniel Dunbar/// start of the token at the end. However, for external clients it is more
5276dd3c2ff274772dc5771cb73f856d14aaf5ee2fDaniel Dunbar/// useful to have a CXSourceRange be a proper half-open interval. This routine
5376dd3c2ff274772dc5771cb73f856d14aaf5ee2fDaniel Dunbar/// does the appropriate translation.
5476dd3c2ff274772dc5771cb73f856d14aaf5ee2fDaniel DunbarCXSourceRange translateSourceRange(const SourceManager &SM,
5576dd3c2ff274772dc5771cb73f856d14aaf5ee2fDaniel Dunbar                                   const LangOptions &LangOpts,
560a76aae8c03cb7dd7bdbe683485560afaf695959Chris Lattner                                   const CharSourceRange &R);
575352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor
585352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor/// \brief Translate a Clang source range into a CIndex source range.
595352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregorstatic inline CXSourceRange translateSourceRange(ASTContext &Context,
605352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor                                                 SourceRange R) {
615352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  return translateSourceRange(Context.getSourceManager(),
624e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie                              Context.getLangOpts(),
630a76aae8c03cb7dd7bdbe683485560afaf695959Chris Lattner                              CharSourceRange::getTokenRange(R));
645352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor}
65a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek
66a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenekstatic inline SourceLocation translateSourceLocation(CXSourceLocation L) {
67a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek  return SourceLocation::getFromRawEncoding(L.int_data);
68a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek}
69a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek
7085b988fdfa6adab6d43e16efd19ad4f3f7e2b49bDaniel Dunbarstatic inline SourceRange translateCXSourceRange(CXSourceRange R) {
71a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek  return SourceRange(SourceLocation::getFromRawEncoding(R.begin_int_data),
72a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek                     SourceLocation::getFromRawEncoding(R.end_int_data));
73a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek}
74a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek
75a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek
76a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek}} // end namespace: clang::cxloc
77a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek
78a297de20bde673b1a2ad67fa5eafd37fea4227fcTed Kremenek#endif
79