1*67e74705SXin Li //==--- SourceLocation.cpp - Compact identifier for Source Files -*- C++ -*-==//
2*67e74705SXin Li //
3*67e74705SXin Li // The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // This file defines accessor methods for the FullSourceLoc class.
11*67e74705SXin Li //
12*67e74705SXin Li //===----------------------------------------------------------------------===//
13*67e74705SXin Li
14*67e74705SXin Li #include "clang/Basic/SourceLocation.h"
15*67e74705SXin Li #include "clang/Basic/PrettyStackTrace.h"
16*67e74705SXin Li #include "clang/Basic/SourceManager.h"
17*67e74705SXin Li #include "llvm/Support/MemoryBuffer.h"
18*67e74705SXin Li #include "llvm/Support/raw_ostream.h"
19*67e74705SXin Li #include <cstdio>
20*67e74705SXin Li using namespace clang;
21*67e74705SXin Li
22*67e74705SXin Li //===----------------------------------------------------------------------===//
23*67e74705SXin Li // PrettyStackTraceLoc
24*67e74705SXin Li //===----------------------------------------------------------------------===//
25*67e74705SXin Li
print(raw_ostream & OS) const26*67e74705SXin Li void PrettyStackTraceLoc::print(raw_ostream &OS) const {
27*67e74705SXin Li if (Loc.isValid()) {
28*67e74705SXin Li Loc.print(OS, SM);
29*67e74705SXin Li OS << ": ";
30*67e74705SXin Li }
31*67e74705SXin Li OS << Message << '\n';
32*67e74705SXin Li }
33*67e74705SXin Li
34*67e74705SXin Li //===----------------------------------------------------------------------===//
35*67e74705SXin Li // SourceLocation
36*67e74705SXin Li //===----------------------------------------------------------------------===//
37*67e74705SXin Li
print(raw_ostream & OS,const SourceManager & SM) const38*67e74705SXin Li void SourceLocation::print(raw_ostream &OS, const SourceManager &SM)const{
39*67e74705SXin Li if (!isValid()) {
40*67e74705SXin Li OS << "<invalid loc>";
41*67e74705SXin Li return;
42*67e74705SXin Li }
43*67e74705SXin Li
44*67e74705SXin Li if (isFileID()) {
45*67e74705SXin Li PresumedLoc PLoc = SM.getPresumedLoc(*this);
46*67e74705SXin Li
47*67e74705SXin Li if (PLoc.isInvalid()) {
48*67e74705SXin Li OS << "<invalid>";
49*67e74705SXin Li return;
50*67e74705SXin Li }
51*67e74705SXin Li // The macro expansion and spelling pos is identical for file locs.
52*67e74705SXin Li OS << PLoc.getFilename() << ':' << PLoc.getLine()
53*67e74705SXin Li << ':' << PLoc.getColumn();
54*67e74705SXin Li return;
55*67e74705SXin Li }
56*67e74705SXin Li
57*67e74705SXin Li SM.getExpansionLoc(*this).print(OS, SM);
58*67e74705SXin Li
59*67e74705SXin Li OS << " <Spelling=";
60*67e74705SXin Li SM.getSpellingLoc(*this).print(OS, SM);
61*67e74705SXin Li OS << '>';
62*67e74705SXin Li }
63*67e74705SXin Li
64*67e74705SXin Li LLVM_DUMP_METHOD std::string
printToString(const SourceManager & SM) const65*67e74705SXin Li SourceLocation::printToString(const SourceManager &SM) const {
66*67e74705SXin Li std::string S;
67*67e74705SXin Li llvm::raw_string_ostream OS(S);
68*67e74705SXin Li print(OS, SM);
69*67e74705SXin Li return OS.str();
70*67e74705SXin Li }
71*67e74705SXin Li
dump(const SourceManager & SM) const72*67e74705SXin Li LLVM_DUMP_METHOD void SourceLocation::dump(const SourceManager &SM) const {
73*67e74705SXin Li print(llvm::errs(), SM);
74*67e74705SXin Li }
75*67e74705SXin Li
76*67e74705SXin Li //===----------------------------------------------------------------------===//
77*67e74705SXin Li // FullSourceLoc
78*67e74705SXin Li //===----------------------------------------------------------------------===//
79*67e74705SXin Li
getFileID() const80*67e74705SXin Li FileID FullSourceLoc::getFileID() const {
81*67e74705SXin Li assert(isValid());
82*67e74705SXin Li return SrcMgr->getFileID(*this);
83*67e74705SXin Li }
84*67e74705SXin Li
85*67e74705SXin Li
getExpansionLoc() const86*67e74705SXin Li FullSourceLoc FullSourceLoc::getExpansionLoc() const {
87*67e74705SXin Li assert(isValid());
88*67e74705SXin Li return FullSourceLoc(SrcMgr->getExpansionLoc(*this), *SrcMgr);
89*67e74705SXin Li }
90*67e74705SXin Li
getSpellingLoc() const91*67e74705SXin Li FullSourceLoc FullSourceLoc::getSpellingLoc() const {
92*67e74705SXin Li assert(isValid());
93*67e74705SXin Li return FullSourceLoc(SrcMgr->getSpellingLoc(*this), *SrcMgr);
94*67e74705SXin Li }
95*67e74705SXin Li
getExpansionLineNumber(bool * Invalid) const96*67e74705SXin Li unsigned FullSourceLoc::getExpansionLineNumber(bool *Invalid) const {
97*67e74705SXin Li assert(isValid());
98*67e74705SXin Li return SrcMgr->getExpansionLineNumber(*this, Invalid);
99*67e74705SXin Li }
100*67e74705SXin Li
getExpansionColumnNumber(bool * Invalid) const101*67e74705SXin Li unsigned FullSourceLoc::getExpansionColumnNumber(bool *Invalid) const {
102*67e74705SXin Li assert(isValid());
103*67e74705SXin Li return SrcMgr->getExpansionColumnNumber(*this, Invalid);
104*67e74705SXin Li }
105*67e74705SXin Li
getSpellingLineNumber(bool * Invalid) const106*67e74705SXin Li unsigned FullSourceLoc::getSpellingLineNumber(bool *Invalid) const {
107*67e74705SXin Li assert(isValid());
108*67e74705SXin Li return SrcMgr->getSpellingLineNumber(*this, Invalid);
109*67e74705SXin Li }
110*67e74705SXin Li
getSpellingColumnNumber(bool * Invalid) const111*67e74705SXin Li unsigned FullSourceLoc::getSpellingColumnNumber(bool *Invalid) const {
112*67e74705SXin Li assert(isValid());
113*67e74705SXin Li return SrcMgr->getSpellingColumnNumber(*this, Invalid);
114*67e74705SXin Li }
115*67e74705SXin Li
isInSystemHeader() const116*67e74705SXin Li bool FullSourceLoc::isInSystemHeader() const {
117*67e74705SXin Li assert(isValid());
118*67e74705SXin Li return SrcMgr->isInSystemHeader(*this);
119*67e74705SXin Li }
120*67e74705SXin Li
isBeforeInTranslationUnitThan(SourceLocation Loc) const121*67e74705SXin Li bool FullSourceLoc::isBeforeInTranslationUnitThan(SourceLocation Loc) const {
122*67e74705SXin Li assert(isValid());
123*67e74705SXin Li return SrcMgr->isBeforeInTranslationUnit(*this, Loc);
124*67e74705SXin Li }
125*67e74705SXin Li
dump() const126*67e74705SXin Li LLVM_DUMP_METHOD void FullSourceLoc::dump() const {
127*67e74705SXin Li SourceLocation::dump(*SrcMgr);
128*67e74705SXin Li }
129*67e74705SXin Li
getCharacterData(bool * Invalid) const130*67e74705SXin Li const char *FullSourceLoc::getCharacterData(bool *Invalid) const {
131*67e74705SXin Li assert(isValid());
132*67e74705SXin Li return SrcMgr->getCharacterData(*this, Invalid);
133*67e74705SXin Li }
134*67e74705SXin Li
getBufferData(bool * Invalid) const135*67e74705SXin Li StringRef FullSourceLoc::getBufferData(bool *Invalid) const {
136*67e74705SXin Li assert(isValid());
137*67e74705SXin Li return SrcMgr->getBuffer(SrcMgr->getFileID(*this), Invalid)->getBuffer();
138*67e74705SXin Li }
139*67e74705SXin Li
getDecomposedLoc() const140*67e74705SXin Li std::pair<FileID, unsigned> FullSourceLoc::getDecomposedLoc() const {
141*67e74705SXin Li return SrcMgr->getDecomposedLoc(*this);
142*67e74705SXin Li }
143