SourceLocation.cpp 4.0 KB

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