SourceLocation.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. //==--- SourceLocation.cpp - Compact identifier for Source Files -*- C++ -*-==//
  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/PrettyStackTrace.h"
  15. #include "clang/Basic/SourceManager.h"
  16. #include "llvm/Support/raw_ostream.h"
  17. #include <cstdio>
  18. using namespace clang;
  19. //===----------------------------------------------------------------------===//
  20. // PrettyStackTraceLoc
  21. //===----------------------------------------------------------------------===//
  22. void PrettyStackTraceLoc::print(raw_ostream &OS) const {
  23. if (Loc.isValid()) {
  24. Loc.print(OS, SM);
  25. OS << ": ";
  26. }
  27. OS << Message << '\n';
  28. }
  29. //===----------------------------------------------------------------------===//
  30. // SourceLocation
  31. //===----------------------------------------------------------------------===//
  32. void SourceLocation::print(raw_ostream &OS, const SourceManager &SM)const{
  33. if (!isValid()) {
  34. OS << "<invalid loc>";
  35. return;
  36. }
  37. if (isFileID()) {
  38. PresumedLoc PLoc = SM.getPresumedLoc(*this);
  39. if (PLoc.isInvalid()) {
  40. OS << "<invalid>";
  41. return;
  42. }
  43. // The macro expansion and spelling pos is identical for file locs.
  44. OS << PLoc.getFilename() << ':' << PLoc.getLine()
  45. << ':' << PLoc.getColumn();
  46. return;
  47. }
  48. SM.getExpansionLoc(*this).print(OS, SM);
  49. OS << " <Spelling=";
  50. SM.getSpellingLoc(*this).print(OS, SM);
  51. OS << '>';
  52. }
  53. LLVM_DUMP_METHOD std::string
  54. SourceLocation::printToString(const SourceManager &SM) const {
  55. std::string S;
  56. llvm::raw_string_ostream OS(S);
  57. print(OS, SM);
  58. return OS.str();
  59. }
  60. LLVM_DUMP_METHOD void SourceLocation::dump(const SourceManager &SM) const {
  61. print(llvm::errs(), SM);
  62. }
  63. //===----------------------------------------------------------------------===//
  64. // FullSourceLoc
  65. //===----------------------------------------------------------------------===//
  66. FileID FullSourceLoc::getFileID() const {
  67. assert(isValid());
  68. return SrcMgr->getFileID(*this);
  69. }
  70. FullSourceLoc FullSourceLoc::getExpansionLoc() const {
  71. assert(isValid());
  72. return FullSourceLoc(SrcMgr->getExpansionLoc(*this), *SrcMgr);
  73. }
  74. FullSourceLoc FullSourceLoc::getSpellingLoc() const {
  75. assert(isValid());
  76. return FullSourceLoc(SrcMgr->getSpellingLoc(*this), *SrcMgr);
  77. }
  78. unsigned FullSourceLoc::getExpansionLineNumber(bool *Invalid) const {
  79. assert(isValid());
  80. return SrcMgr->getExpansionLineNumber(*this, Invalid);
  81. }
  82. unsigned FullSourceLoc::getExpansionColumnNumber(bool *Invalid) const {
  83. assert(isValid());
  84. return SrcMgr->getExpansionColumnNumber(*this, Invalid);
  85. }
  86. unsigned FullSourceLoc::getSpellingLineNumber(bool *Invalid) const {
  87. assert(isValid());
  88. return SrcMgr->getSpellingLineNumber(*this, Invalid);
  89. }
  90. unsigned FullSourceLoc::getSpellingColumnNumber(bool *Invalid) const {
  91. assert(isValid());
  92. return SrcMgr->getSpellingColumnNumber(*this, Invalid);
  93. }
  94. bool FullSourceLoc::isInSystemHeader() const {
  95. assert(isValid());
  96. return SrcMgr->isInSystemHeader(*this);
  97. }
  98. bool FullSourceLoc::isBeforeInTranslationUnitThan(SourceLocation Loc) const {
  99. assert(isValid());
  100. return SrcMgr->isBeforeInTranslationUnit(*this, Loc);
  101. }
  102. LLVM_DUMP_METHOD void FullSourceLoc::dump() const {
  103. SourceLocation::dump(*SrcMgr);
  104. }
  105. const char *FullSourceLoc::getCharacterData(bool *Invalid) const {
  106. assert(isValid());
  107. return SrcMgr->getCharacterData(*this, Invalid);
  108. }
  109. StringRef FullSourceLoc::getBufferData(bool *Invalid) const {
  110. assert(isValid());
  111. return SrcMgr->getBuffer(SrcMgr->getFileID(*this), Invalid)->getBuffer();
  112. }
  113. std::pair<FileID, unsigned> FullSourceLoc::getDecomposedLoc() const {
  114. return SrcMgr->getDecomposedLoc(*this);
  115. }