clang  3.9.0
SourceLocation.cpp
Go to the documentation of this file.
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 
17 #include "llvm/Support/MemoryBuffer.h"
18 #include "llvm/Support/raw_ostream.h"
19 #include <cstdio>
20 using namespace clang;
21 
22 //===----------------------------------------------------------------------===//
23 // PrettyStackTraceLoc
24 //===----------------------------------------------------------------------===//
25 
26 void PrettyStackTraceLoc::print(raw_ostream &OS) const {
27  if (Loc.isValid()) {
28  Loc.print(OS, SM);
29  OS << ": ";
30  }
31  OS << Message << '\n';
32 }
33 
34 //===----------------------------------------------------------------------===//
35 // SourceLocation
36 //===----------------------------------------------------------------------===//
37 
38 void SourceLocation::print(raw_ostream &OS, const SourceManager &SM)const{
39  if (!isValid()) {
40  OS << "<invalid loc>";
41  return;
42  }
43 
44  if (isFileID()) {
45  PresumedLoc PLoc = SM.getPresumedLoc(*this);
46 
47  if (PLoc.isInvalid()) {
48  OS << "<invalid>";
49  return;
50  }
51  // The macro expansion and spelling pos is identical for file locs.
52  OS << PLoc.getFilename() << ':' << PLoc.getLine()
53  << ':' << PLoc.getColumn();
54  return;
55  }
56 
57  SM.getExpansionLoc(*this).print(OS, SM);
58 
59  OS << " <Spelling=";
60  SM.getSpellingLoc(*this).print(OS, SM);
61  OS << '>';
62 }
63 
64 LLVM_DUMP_METHOD std::string
65 SourceLocation::printToString(const SourceManager &SM) const {
66  std::string S;
67  llvm::raw_string_ostream OS(S);
68  print(OS, SM);
69  return OS.str();
70 }
71 
72 LLVM_DUMP_METHOD void SourceLocation::dump(const SourceManager &SM) const {
73  print(llvm::errs(), SM);
74 }
75 
76 //===----------------------------------------------------------------------===//
77 // FullSourceLoc
78 //===----------------------------------------------------------------------===//
79 
80 FileID FullSourceLoc::getFileID() const {
81  assert(isValid());
82  return SrcMgr->getFileID(*this);
83 }
84 
85 
86 FullSourceLoc FullSourceLoc::getExpansionLoc() const {
87  assert(isValid());
88  return FullSourceLoc(SrcMgr->getExpansionLoc(*this), *SrcMgr);
89 }
90 
91 FullSourceLoc FullSourceLoc::getSpellingLoc() const {
92  assert(isValid());
93  return FullSourceLoc(SrcMgr->getSpellingLoc(*this), *SrcMgr);
94 }
95 
96 unsigned FullSourceLoc::getExpansionLineNumber(bool *Invalid) const {
97  assert(isValid());
98  return SrcMgr->getExpansionLineNumber(*this, Invalid);
99 }
100 
101 unsigned FullSourceLoc::getExpansionColumnNumber(bool *Invalid) const {
102  assert(isValid());
103  return SrcMgr->getExpansionColumnNumber(*this, Invalid);
104 }
105 
106 unsigned FullSourceLoc::getSpellingLineNumber(bool *Invalid) const {
107  assert(isValid());
108  return SrcMgr->getSpellingLineNumber(*this, Invalid);
109 }
110 
111 unsigned FullSourceLoc::getSpellingColumnNumber(bool *Invalid) const {
112  assert(isValid());
113  return SrcMgr->getSpellingColumnNumber(*this, Invalid);
114 }
115 
116 bool FullSourceLoc::isInSystemHeader() const {
117  assert(isValid());
118  return SrcMgr->isInSystemHeader(*this);
119 }
120 
121 bool FullSourceLoc::isBeforeInTranslationUnitThan(SourceLocation Loc) const {
122  assert(isValid());
123  return SrcMgr->isBeforeInTranslationUnit(*this, Loc);
124 }
125 
126 LLVM_DUMP_METHOD void FullSourceLoc::dump() const {
127  SourceLocation::dump(*SrcMgr);
128 }
129 
130 const char *FullSourceLoc::getCharacterData(bool *Invalid) const {
131  assert(isValid());
132  return SrcMgr->getCharacterData(*this, Invalid);
133 }
134 
135 StringRef FullSourceLoc::getBufferData(bool *Invalid) const {
136  assert(isValid());
137  return SrcMgr->getBuffer(SrcMgr->getFileID(*this), Invalid)->getBuffer();
138 }
139 
140 std::pair<FileID, unsigned> FullSourceLoc::getDecomposedLoc() const {
141  return SrcMgr->getDecomposedLoc(*this);
142 }
unsigned getColumn() const
Return the presumed column number of this location.
SourceLocation getSpellingLoc(SourceLocation Loc) const
Given a SourceLocation object, return the spelling location referenced by the ID. ...
bool isInvalid() const
Return true if this object is invalid or uninitialized.
Defines the SourceManager interface.
Defines the PrettyStackTraceEntry class, which is used to make crashes give more contextual informati...
void print(raw_ostream &OS) const override
bool isFileID() const
unsigned getLine() const
Return the presumed line number of this location.
Represents an unpacked "presumed" location which can be presented to the user.
const SourceManager & SM
Definition: Format.cpp:1184
void print(raw_ostream &OS, const SourceManager &SM) const
const char * getFilename() const
Return the presumed filename of this location.
bool isValid() const
Return true if this is a valid SourceLocation object.
Defines the clang::SourceLocation class and associated facilities.
SourceLocation getExpansionLoc(SourceLocation Loc) const
Given a SourceLocation object Loc, return the expansion location referenced by the ID...
This class handles loading and caching of source files into memory.
PresumedLoc getPresumedLoc(SourceLocation Loc, bool UseLineDirectives=true) const
Returns the "presumed" location of a SourceLocation specifies.