SourceLocation.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. //===- SourceLocation.cpp - Compact identifier for Source Files -----------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // This file defines accessor methods for the FullSourceLoc class.
  11. //
  12. //===----------------------------------------------------------------------===//
  13. #include "clang/Basic/SourceLocation.h"
  14. #include "clang/Basic/LLVM.h"
  15. #include "clang/Basic/PrettyStackTrace.h"
  16. #include "clang/Basic/SourceManager.h"
  17. #include "llvm/ADT/StringRef.h"
  18. #include "llvm/Support/Compiler.h"
  19. #include "llvm/Support/MemoryBuffer.h"
  20. #include "llvm/Support/raw_ostream.h"
  21. #include <cassert>
  22. #include <string>
  23. #include <utility>
  24. using namespace clang;
  25. //===----------------------------------------------------------------------===//
  26. // PrettyStackTraceLoc
  27. //===----------------------------------------------------------------------===//
  28. void PrettyStackTraceLoc::print(raw_ostream &OS) const {
  29. if (Loc.isValid()) {
  30. Loc.print(OS, SM);
  31. OS << ": ";
  32. }
  33. OS << Message << '\n';
  34. }
  35. //===----------------------------------------------------------------------===//
  36. // SourceLocation
  37. //===----------------------------------------------------------------------===//
  38. void SourceLocation::print(raw_ostream &OS, const SourceManager &SM)const{
  39. if (!isValid()) {
  40. OS << "<invalid loc>";
  41. return;
  42. }
  43. if (isFileID()) {
  44. PresumedLoc PLoc = SM.getPresumedLoc(*this);
  45. if (PLoc.isInvalid()) {
  46. OS << "<invalid>";
  47. return;
  48. }
  49. // The macro expansion and spelling pos is identical for file locs.
  50. OS << PLoc.getFilename() << ':' << PLoc.getLine()
  51. << ':' << PLoc.getColumn();
  52. return;
  53. }
  54. SM.getExpansionLoc(*this).print(OS, SM);
  55. OS << " <Spelling=";
  56. SM.getSpellingLoc(*this).print(OS, SM);
  57. OS << '>';
  58. }
  59. LLVM_DUMP_METHOD std::string
  60. SourceLocation::printToString(const SourceManager &SM) const {
  61. std::string S;
  62. llvm::raw_string_ostream OS(S);
  63. print(OS, SM);
  64. return OS.str();
  65. }
  66. LLVM_DUMP_METHOD void SourceLocation::dump(const SourceManager &SM) const {
  67. print(llvm::errs(), SM);
  68. }
  69. //===----------------------------------------------------------------------===//
  70. // FullSourceLoc
  71. //===----------------------------------------------------------------------===//
  72. FileID FullSourceLoc::getFileID() const {
  73. assert(isValid());
  74. return SrcMgr->getFileID(*this);
  75. }
  76. FullSourceLoc FullSourceLoc::getExpansionLoc() const {
  77. assert(isValid());
  78. return FullSourceLoc(SrcMgr->getExpansionLoc(*this), *SrcMgr);
  79. }
  80. FullSourceLoc FullSourceLoc::getSpellingLoc() const {
  81. assert(isValid());
  82. return FullSourceLoc(SrcMgr->getSpellingLoc(*this), *SrcMgr);
  83. }
  84. FullSourceLoc FullSourceLoc::getFileLoc() const {
  85. assert(isValid());
  86. return FullSourceLoc(SrcMgr->getFileLoc(*this), *SrcMgr);
  87. }
  88. PresumedLoc FullSourceLoc::getPresumedLoc(bool UseLineDirectives) const {
  89. if (!isValid())
  90. return PresumedLoc();
  91. return SrcMgr->getPresumedLoc(*this, UseLineDirectives);
  92. }
  93. bool FullSourceLoc::isMacroArgExpansion(FullSourceLoc *StartLoc) const {
  94. assert(isValid());
  95. return SrcMgr->isMacroArgExpansion(*this, StartLoc);
  96. }
  97. FullSourceLoc FullSourceLoc::getImmediateMacroCallerLoc() const {
  98. assert(isValid());
  99. return FullSourceLoc(SrcMgr->getImmediateMacroCallerLoc(*this), *SrcMgr);
  100. }
  101. std::pair<FullSourceLoc, StringRef> FullSourceLoc::getModuleImportLoc() const {
  102. if (!isValid())
  103. return std::make_pair(FullSourceLoc(), StringRef());
  104. std::pair<SourceLocation, StringRef> ImportLoc =
  105. SrcMgr->getModuleImportLoc(*this);
  106. return std::make_pair(FullSourceLoc(ImportLoc.first, *SrcMgr),
  107. ImportLoc.second);
  108. }
  109. unsigned FullSourceLoc::getFileOffset() const {
  110. assert(isValid());
  111. return SrcMgr->getFileOffset(*this);
  112. }
  113. unsigned FullSourceLoc::getLineNumber(bool *Invalid) const {
  114. assert(isValid());
  115. return SrcMgr->getLineNumber(getFileID(), getFileOffset(), Invalid);
  116. }
  117. unsigned FullSourceLoc::getColumnNumber(bool *Invalid) const {
  118. assert(isValid());
  119. return SrcMgr->getColumnNumber(getFileID(), getFileOffset(), Invalid);
  120. }
  121. const FileEntry *FullSourceLoc::getFileEntry() const {
  122. assert(isValid());
  123. return SrcMgr->getFileEntryForID(getFileID());
  124. }
  125. unsigned FullSourceLoc::getExpansionLineNumber(bool *Invalid) const {
  126. assert(isValid());
  127. return SrcMgr->getExpansionLineNumber(*this, Invalid);
  128. }
  129. unsigned FullSourceLoc::getExpansionColumnNumber(bool *Invalid) const {
  130. assert(isValid());
  131. return SrcMgr->getExpansionColumnNumber(*this, Invalid);
  132. }
  133. unsigned FullSourceLoc::getSpellingLineNumber(bool *Invalid) const {
  134. assert(isValid());
  135. return SrcMgr->getSpellingLineNumber(*this, Invalid);
  136. }
  137. unsigned FullSourceLoc::getSpellingColumnNumber(bool *Invalid) const {
  138. assert(isValid());
  139. return SrcMgr->getSpellingColumnNumber(*this, Invalid);
  140. }
  141. bool FullSourceLoc::isInSystemHeader() const {
  142. assert(isValid());
  143. return SrcMgr->isInSystemHeader(*this);
  144. }
  145. bool FullSourceLoc::isBeforeInTranslationUnitThan(SourceLocation Loc) const {
  146. assert(isValid());
  147. return SrcMgr->isBeforeInTranslationUnit(*this, Loc);
  148. }
  149. LLVM_DUMP_METHOD void FullSourceLoc::dump() const {
  150. SourceLocation::dump(*SrcMgr);
  151. }
  152. const char *FullSourceLoc::getCharacterData(bool *Invalid) const {
  153. assert(isValid());
  154. return SrcMgr->getCharacterData(*this, Invalid);
  155. }
  156. StringRef FullSourceLoc::getBufferData(bool *Invalid) const {
  157. assert(isValid());
  158. return SrcMgr->getBuffer(SrcMgr->getFileID(*this), Invalid)->getBuffer();
  159. }
  160. std::pair<FileID, unsigned> FullSourceLoc::getDecomposedLoc() const {
  161. return SrcMgr->getDecomposedLoc(*this);
  162. }