SourceLocation.cpp revision 198092
1191783Srmacklem//==--- SourceLocation.cpp - Compact identifier for Source Files -*- C++ -*-==// 2191783Srmacklem// 3191783Srmacklem// The LLVM Compiler Infrastructure 4191783Srmacklem// 5191783Srmacklem// This file is distributed under the University of Illinois Open Source 6191783Srmacklem// License. See LICENSE.TXT for details. 7191783Srmacklem// 8191783Srmacklem//===----------------------------------------------------------------------===// 9191783Srmacklem// 10191783Srmacklem// This file defines accessor methods for the FullSourceLoc class. 11191783Srmacklem// 12191783Srmacklem//===----------------------------------------------------------------------===// 13191783Srmacklem 14191783Srmacklem#include "clang/Basic/SourceLocation.h" 15191783Srmacklem#include "clang/Basic/PrettyStackTrace.h" 16191783Srmacklem#include "clang/Basic/SourceManager.h" 17191783Srmacklem#include "llvm/Support/MemoryBuffer.h" 18191783Srmacklem#include "llvm/Support/raw_ostream.h" 19191783Srmacklem#include <cstdio> 20191783Srmacklemusing namespace clang; 21191783Srmacklem 22191783Srmacklem//===----------------------------------------------------------------------===// 23191783Srmacklem// PrettyStackTraceLoc 24191783Srmacklem//===----------------------------------------------------------------------===// 25191783Srmacklem 26191783Srmacklemvoid PrettyStackTraceLoc::print(llvm::raw_ostream &OS) const { 27191783Srmacklem if (Loc.isValid()) { 28191783Srmacklem Loc.print(OS, SM); 29191783Srmacklem OS << ": "; 30191783Srmacklem } 31191783Srmacklem OS << Message << '\n'; 32191783Srmacklem} 33191783Srmacklem 34191783Srmacklem//===----------------------------------------------------------------------===// 35191783Srmacklem// SourceLocation 36191783Srmacklem//===----------------------------------------------------------------------===// 37191783Srmacklem 38191783Srmacklemvoid SourceLocation::print(llvm::raw_ostream &OS, const SourceManager &SM)const{ 39191783Srmacklem if (!isValid()) { 40191783Srmacklem OS << "<invalid loc>"; 41191783Srmacklem return; 42191783Srmacklem } 43191783Srmacklem 44191783Srmacklem if (isFileID()) { 45191783Srmacklem PresumedLoc PLoc = SM.getPresumedLoc(*this); 46191783Srmacklem // The instantiation and spelling pos is identical for file locs. 47191783Srmacklem OS << PLoc.getFilename() << ':' << PLoc.getLine() 48191783Srmacklem << ':' << PLoc.getColumn(); 49191783Srmacklem return; 50191783Srmacklem } 51191783Srmacklem 52191783Srmacklem SM.getInstantiationLoc(*this).print(OS, SM); 53191783Srmacklem 54191783Srmacklem OS << " <Spelling="; 55191783Srmacklem SM.getSpellingLoc(*this).print(OS, SM); 56191783Srmacklem OS << '>'; 57191783Srmacklem} 58191783Srmacklem 59191783Srmacklemvoid SourceLocation::dump(const SourceManager &SM) const { 60191783Srmacklem print(llvm::errs(), SM); 61191783Srmacklem} 62191783Srmacklem 63191783Srmacklem//===----------------------------------------------------------------------===// 64191783Srmacklem// FullSourceLoc 65191783Srmacklem//===----------------------------------------------------------------------===// 66191783Srmacklem 67191783SrmacklemFileID FullSourceLoc::getFileID() const { 68191783Srmacklem assert(isValid()); 69191783Srmacklem return SrcMgr->getFileID(*this); 70191783Srmacklem} 71191783Srmacklem 72191783Srmacklem 73191783SrmacklemFullSourceLoc FullSourceLoc::getInstantiationLoc() const { 74191783Srmacklem assert(isValid()); 75191783Srmacklem return FullSourceLoc(SrcMgr->getInstantiationLoc(*this), *SrcMgr); 76191783Srmacklem} 77191783Srmacklem 78191783SrmacklemFullSourceLoc FullSourceLoc::getSpellingLoc() const { 79191783Srmacklem assert(isValid()); 80191783Srmacklem return FullSourceLoc(SrcMgr->getSpellingLoc(*this), *SrcMgr); 81191783Srmacklem} 82191783Srmacklem 83191783Srmacklemunsigned FullSourceLoc::getInstantiationLineNumber() const { 84191783Srmacklem assert(isValid()); 85191783Srmacklem return SrcMgr->getInstantiationLineNumber(*this); 86191783Srmacklem} 87191783Srmacklem 88192115Srmacklemunsigned FullSourceLoc::getInstantiationColumnNumber() const { 89191783Srmacklem assert(isValid()); 90191783Srmacklem return SrcMgr->getInstantiationColumnNumber(*this); 91191783Srmacklem} 92191783Srmacklem 93191783Srmacklemunsigned FullSourceLoc::getSpellingLineNumber() const { 94191783Srmacklem assert(isValid()); 95191783Srmacklem return SrcMgr->getSpellingLineNumber(*this); 96191783Srmacklem} 97191783Srmacklem 98191783Srmacklemunsigned FullSourceLoc::getSpellingColumnNumber() const { 99191783Srmacklem assert(isValid()); 100191783Srmacklem return SrcMgr->getSpellingColumnNumber(*this); 101191783Srmacklem} 102191783Srmacklem 103191783Srmacklembool FullSourceLoc::isInSystemHeader() const { 104191783Srmacklem assert(isValid()); 105191783Srmacklem return SrcMgr->isInSystemHeader(*this); 106191783Srmacklem} 107191783Srmacklem 108191783Srmacklemconst char *FullSourceLoc::getCharacterData() const { 109191783Srmacklem assert(isValid()); 110191783Srmacklem return SrcMgr->getCharacterData(*this); 111191783Srmacklem} 112191783Srmacklem 113191783Srmacklemconst llvm::MemoryBuffer* FullSourceLoc::getBuffer() const { 114191783Srmacklem assert(isValid()); 115191783Srmacklem return SrcMgr->getBuffer(SrcMgr->getFileID(*this)); 116191783Srmacklem} 117191783Srmacklem 118191783Srmacklemstd::pair<const char*, const char*> FullSourceLoc::getBufferData() const { 119191783Srmacklem const llvm::MemoryBuffer *Buf = getBuffer(); 120191783Srmacklem return std::make_pair(Buf->getBufferStart(), Buf->getBufferEnd()); 121191783Srmacklem} 122191783Srmacklem 123191783Srmacklemstd::pair<FileID, unsigned> FullSourceLoc::getDecomposedLoc() const { 124191783Srmacklem return SrcMgr->getDecomposedLoc(*this); 125191783Srmacklem} 126191783Srmacklem