1 //==--- SourceLocation.cpp - Compact identifier for Source Files -*- C++ -*-==//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines accessor methods for the FullSourceLoc class.
12 //===----------------------------------------------------------------------===//
14 #include "clang/Basic/SourceLocation.h"
15 #include "clang/Basic/PrettyStackTrace.h"
16 #include "clang/Basic/SourceManager.h"
17 #include "llvm/Support/MemoryBuffer.h"
18 #include "llvm/Support/raw_ostream.h"
20 using namespace clang
;
22 //===----------------------------------------------------------------------===//
23 // PrettyStackTraceLoc
24 //===----------------------------------------------------------------------===//
26 void PrettyStackTraceLoc::print(llvm::raw_ostream
&OS
) const {
31 OS
<< Message
<< '\n';
34 //===----------------------------------------------------------------------===//
36 //===----------------------------------------------------------------------===//
38 void SourceLocation::print(llvm::raw_ostream
&OS
, const SourceManager
&SM
)const{
40 OS
<< "<invalid loc>";
45 PresumedLoc PLoc
= SM
.getPresumedLoc(*this);
47 if (PLoc
.isInvalid()) {
51 // The instantiation and spelling pos is identical for file locs.
52 OS
<< PLoc
.getFilename() << ':' << PLoc
.getLine()
53 << ':' << PLoc
.getColumn();
57 SM
.getInstantiationLoc(*this).print(OS
, SM
);
60 SM
.getSpellingLoc(*this).print(OS
, SM
);
64 void SourceLocation::dump(const SourceManager
&SM
) const {
65 print(llvm::errs(), SM
);
68 //===----------------------------------------------------------------------===//
70 //===----------------------------------------------------------------------===//
72 FileID
FullSourceLoc::getFileID() const {
74 return SrcMgr
->getFileID(*this);
78 FullSourceLoc
FullSourceLoc::getInstantiationLoc() const {
80 return FullSourceLoc(SrcMgr
->getInstantiationLoc(*this), *SrcMgr
);
83 FullSourceLoc
FullSourceLoc::getSpellingLoc() const {
85 return FullSourceLoc(SrcMgr
->getSpellingLoc(*this), *SrcMgr
);
88 unsigned FullSourceLoc::getInstantiationLineNumber(bool *Invalid
) const {
90 return SrcMgr
->getInstantiationLineNumber(*this, Invalid
);
93 unsigned FullSourceLoc::getInstantiationColumnNumber(bool *Invalid
) const {
95 return SrcMgr
->getInstantiationColumnNumber(*this, Invalid
);
98 unsigned FullSourceLoc::getSpellingLineNumber(bool *Invalid
) const {
100 return SrcMgr
->getSpellingLineNumber(*this, Invalid
);
103 unsigned FullSourceLoc::getSpellingColumnNumber(bool *Invalid
) const {
105 return SrcMgr
->getSpellingColumnNumber(*this, Invalid
);
108 bool FullSourceLoc::isInSystemHeader() const {
110 return SrcMgr
->isInSystemHeader(*this);
113 bool FullSourceLoc::isBeforeInTranslationUnitThan(SourceLocation Loc
) const {
115 return SrcMgr
->isBeforeInTranslationUnit(*this, Loc
);
118 const char *FullSourceLoc::getCharacterData(bool *Invalid
) const {
120 return SrcMgr
->getCharacterData(*this, Invalid
);
123 const llvm::MemoryBuffer
* FullSourceLoc::getBuffer(bool *Invalid
) const {
125 return SrcMgr
->getBuffer(SrcMgr
->getFileID(*this), Invalid
);
128 llvm::StringRef
FullSourceLoc::getBufferData(bool *Invalid
) const {
129 return getBuffer(Invalid
)->getBuffer();
132 std::pair
<FileID
, unsigned> FullSourceLoc::getDecomposedLoc() const {
133 return SrcMgr
->getDecomposedLoc(*this);