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/raw_ostream.h"
19 using namespace clang;
21 //===----------------------------------------------------------------------===//
22 // PrettyStackTraceLoc
23 //===----------------------------------------------------------------------===//
25 void PrettyStackTraceLoc::print(raw_ostream &OS) const {
30 OS << Message << '\n';
33 //===----------------------------------------------------------------------===//
35 //===----------------------------------------------------------------------===//
37 void SourceLocation::print(raw_ostream &OS, const SourceManager &SM)const{
39 OS << "<invalid loc>";
44 PresumedLoc PLoc = SM.getPresumedLoc(*this);
46 if (PLoc.isInvalid()) {
50 // The macro expansion and spelling pos is identical for file locs.
51 OS << PLoc.getFilename() << ':' << PLoc.getLine()
52 << ':' << PLoc.getColumn();
56 SM.getExpansionLoc(*this).print(OS, SM);
59 SM.getSpellingLoc(*this).print(OS, SM);
63 LLVM_DUMP_METHOD std::string
64 SourceLocation::printToString(const SourceManager &SM) const {
66 llvm::raw_string_ostream OS(S);
71 LLVM_DUMP_METHOD void SourceLocation::dump(const SourceManager &SM) const {
72 print(llvm::errs(), SM);
75 //===----------------------------------------------------------------------===//
77 //===----------------------------------------------------------------------===//
79 FileID FullSourceLoc::getFileID() const {
81 return SrcMgr->getFileID(*this);
85 FullSourceLoc FullSourceLoc::getExpansionLoc() const {
87 return FullSourceLoc(SrcMgr->getExpansionLoc(*this), *SrcMgr);
90 FullSourceLoc FullSourceLoc::getSpellingLoc() const {
92 return FullSourceLoc(SrcMgr->getSpellingLoc(*this), *SrcMgr);
95 FullSourceLoc FullSourceLoc::getFileLoc() const {
97 return FullSourceLoc(SrcMgr->getFileLoc(*this), *SrcMgr);
100 std::pair<FullSourceLoc, FullSourceLoc>
101 FullSourceLoc::getImmediateExpansionRange() const {
103 std::pair<SourceLocation, SourceLocation> Range =
104 SrcMgr->getImmediateExpansionRange(*this);
105 return std::make_pair(FullSourceLoc(Range.first, *SrcMgr),
106 FullSourceLoc(Range.second, *SrcMgr));
109 PresumedLoc FullSourceLoc::getPresumedLoc(bool UseLineDirectives) const {
111 return PresumedLoc();
113 return SrcMgr->getPresumedLoc(*this, UseLineDirectives);
116 bool FullSourceLoc::isMacroArgExpansion(FullSourceLoc *StartLoc) const {
118 return SrcMgr->isMacroArgExpansion(*this, StartLoc);
121 FullSourceLoc FullSourceLoc::getImmediateMacroCallerLoc() const {
123 return FullSourceLoc(SrcMgr->getImmediateMacroCallerLoc(*this), *SrcMgr);
126 std::pair<FullSourceLoc, StringRef> FullSourceLoc::getModuleImportLoc() const {
128 return std::make_pair(FullSourceLoc(), StringRef());
130 std::pair<SourceLocation, StringRef> ImportLoc =
131 SrcMgr->getModuleImportLoc(*this);
132 return std::make_pair(FullSourceLoc(ImportLoc.first, *SrcMgr),
136 unsigned FullSourceLoc::getFileOffset() const {
138 return SrcMgr->getFileOffset(*this);
141 unsigned FullSourceLoc::getLineNumber(bool *Invalid) const {
143 return SrcMgr->getLineNumber(getFileID(), getFileOffset(), Invalid);
146 unsigned FullSourceLoc::getColumnNumber(bool *Invalid) const {
148 return SrcMgr->getColumnNumber(getFileID(), getFileOffset(), Invalid);
151 std::pair<FullSourceLoc, FullSourceLoc>
152 FullSourceLoc::getExpansionRange() const {
154 std::pair<SourceLocation, SourceLocation> Range =
155 SrcMgr->getExpansionRange(*this);
156 return std::make_pair(FullSourceLoc(Range.first, *SrcMgr),
157 FullSourceLoc(Range.second, *SrcMgr));
160 const FileEntry *FullSourceLoc::getFileEntry() const {
162 return SrcMgr->getFileEntryForID(getFileID());
165 unsigned FullSourceLoc::getExpansionLineNumber(bool *Invalid) const {
167 return SrcMgr->getExpansionLineNumber(*this, Invalid);
170 unsigned FullSourceLoc::getExpansionColumnNumber(bool *Invalid) const {
172 return SrcMgr->getExpansionColumnNumber(*this, Invalid);
175 unsigned FullSourceLoc::getSpellingLineNumber(bool *Invalid) const {
177 return SrcMgr->getSpellingLineNumber(*this, Invalid);
180 unsigned FullSourceLoc::getSpellingColumnNumber(bool *Invalid) const {
182 return SrcMgr->getSpellingColumnNumber(*this, Invalid);
185 bool FullSourceLoc::isInSystemHeader() const {
187 return SrcMgr->isInSystemHeader(*this);
190 bool FullSourceLoc::isBeforeInTranslationUnitThan(SourceLocation Loc) const {
192 return SrcMgr->isBeforeInTranslationUnit(*this, Loc);
195 LLVM_DUMP_METHOD void FullSourceLoc::dump() const {
196 SourceLocation::dump(*SrcMgr);
199 const char *FullSourceLoc::getCharacterData(bool *Invalid) const {
201 return SrcMgr->getCharacterData(*this, Invalid);
204 StringRef FullSourceLoc::getBufferData(bool *Invalid) const {
206 return SrcMgr->getBuffer(SrcMgr->getFileID(*this), Invalid)->getBuffer();
209 std::pair<FileID, unsigned> FullSourceLoc::getDecomposedLoc() const {
210 return SrcMgr->getDecomposedLoc(*this);