1193326Sed//==--- SourceLocation.cpp - Compact identifier for Source Files -*- C++ -*-==// 2193326Sed// 3193326Sed// The LLVM Compiler Infrastructure 4193326Sed// 5193326Sed// This file is distributed under the University of Illinois Open Source 6193326Sed// License. See LICENSE.TXT for details. 7193326Sed// 8193326Sed//===----------------------------------------------------------------------===// 9193326Sed// 10193326Sed// This file defines accessor methods for the FullSourceLoc class. 11193326Sed// 12193326Sed//===----------------------------------------------------------------------===// 13193326Sed 14193326Sed#include "clang/Basic/SourceLocation.h" 15193326Sed#include "clang/Basic/PrettyStackTrace.h" 16193326Sed#include "clang/Basic/SourceManager.h" 17193326Sed#include "llvm/Support/MemoryBuffer.h" 18193326Sed#include "llvm/Support/raw_ostream.h" 19193326Sed#include <cstdio> 20193326Sedusing namespace clang; 21193326Sed 22193326Sed//===----------------------------------------------------------------------===// 23193326Sed// PrettyStackTraceLoc 24193326Sed//===----------------------------------------------------------------------===// 25193326Sed 26226633Sdimvoid PrettyStackTraceLoc::print(raw_ostream &OS) const { 27193326Sed if (Loc.isValid()) { 28193326Sed Loc.print(OS, SM); 29193326Sed OS << ": "; 30193326Sed } 31193326Sed OS << Message << '\n'; 32193326Sed} 33193326Sed 34193326Sed//===----------------------------------------------------------------------===// 35193326Sed// SourceLocation 36193326Sed//===----------------------------------------------------------------------===// 37193326Sed 38226633Sdimvoid SourceLocation::print(raw_ostream &OS, const SourceManager &SM)const{ 39193326Sed if (!isValid()) { 40193326Sed OS << "<invalid loc>"; 41193326Sed return; 42193326Sed } 43198092Srdivacky 44193326Sed if (isFileID()) { 45193326Sed PresumedLoc PLoc = SM.getPresumedLoc(*this); 46218893Sdim 47218893Sdim if (PLoc.isInvalid()) { 48218893Sdim OS << "<invalid>"; 49218893Sdim return; 50218893Sdim } 51226633Sdim // The macro expansion and spelling pos is identical for file locs. 52193326Sed OS << PLoc.getFilename() << ':' << PLoc.getLine() 53193326Sed << ':' << PLoc.getColumn(); 54193326Sed return; 55193326Sed } 56198092Srdivacky 57226633Sdim SM.getExpansionLoc(*this).print(OS, SM); 58193326Sed 59193326Sed OS << " <Spelling="; 60193326Sed SM.getSpellingLoc(*this).print(OS, SM); 61193326Sed OS << '>'; 62193326Sed} 63193326Sed 64243830Sdimstd::string SourceLocation::printToString(const SourceManager &SM) const { 65243830Sdim std::string S; 66243830Sdim llvm::raw_string_ostream OS(S); 67243830Sdim print(OS, SM); 68249423Sdim return OS.str(); 69243830Sdim} 70243830Sdim 71193326Sedvoid SourceLocation::dump(const SourceManager &SM) const { 72193326Sed print(llvm::errs(), SM); 73193326Sed} 74193326Sed 75193326Sed//===----------------------------------------------------------------------===// 76193326Sed// FullSourceLoc 77193326Sed//===----------------------------------------------------------------------===// 78193326Sed 79193326SedFileID FullSourceLoc::getFileID() const { 80193326Sed assert(isValid()); 81193326Sed return SrcMgr->getFileID(*this); 82193326Sed} 83193326Sed 84193326Sed 85226633SdimFullSourceLoc FullSourceLoc::getExpansionLoc() const { 86193326Sed assert(isValid()); 87226633Sdim return FullSourceLoc(SrcMgr->getExpansionLoc(*this), *SrcMgr); 88193326Sed} 89193326Sed 90193326SedFullSourceLoc FullSourceLoc::getSpellingLoc() const { 91193326Sed assert(isValid()); 92193326Sed return FullSourceLoc(SrcMgr->getSpellingLoc(*this), *SrcMgr); 93193326Sed} 94193326Sed 95226633Sdimunsigned FullSourceLoc::getExpansionLineNumber(bool *Invalid) const { 96193326Sed assert(isValid()); 97226633Sdim return SrcMgr->getExpansionLineNumber(*this, Invalid); 98193326Sed} 99193326Sed 100226633Sdimunsigned FullSourceLoc::getExpansionColumnNumber(bool *Invalid) const { 101193326Sed assert(isValid()); 102226633Sdim return SrcMgr->getExpansionColumnNumber(*this, Invalid); 103193326Sed} 104193326Sed 105205408Srdivackyunsigned FullSourceLoc::getSpellingLineNumber(bool *Invalid) const { 106193326Sed assert(isValid()); 107205408Srdivacky return SrcMgr->getSpellingLineNumber(*this, Invalid); 108193326Sed} 109193326Sed 110205408Srdivackyunsigned FullSourceLoc::getSpellingColumnNumber(bool *Invalid) const { 111193326Sed assert(isValid()); 112205408Srdivacky return SrcMgr->getSpellingColumnNumber(*this, Invalid); 113193326Sed} 114193326Sed 115193326Sedbool FullSourceLoc::isInSystemHeader() const { 116193326Sed assert(isValid()); 117193326Sed return SrcMgr->isInSystemHeader(*this); 118193326Sed} 119193326Sed 120218893Sdimbool FullSourceLoc::isBeforeInTranslationUnitThan(SourceLocation Loc) const { 121218893Sdim assert(isValid()); 122218893Sdim return SrcMgr->isBeforeInTranslationUnit(*this, Loc); 123218893Sdim} 124218893Sdim 125234353Sdimvoid FullSourceLoc::dump() const { 126234353Sdim SourceLocation::dump(*SrcMgr); 127234353Sdim} 128234353Sdim 129205408Srdivackyconst char *FullSourceLoc::getCharacterData(bool *Invalid) const { 130193326Sed assert(isValid()); 131205408Srdivacky return SrcMgr->getCharacterData(*this, Invalid); 132193326Sed} 133193326Sed 134205408Srdivackyconst llvm::MemoryBuffer* FullSourceLoc::getBuffer(bool *Invalid) const { 135193326Sed assert(isValid()); 136205408Srdivacky return SrcMgr->getBuffer(SrcMgr->getFileID(*this), Invalid); 137193326Sed} 138193326Sed 139226633SdimStringRef FullSourceLoc::getBufferData(bool *Invalid) const { 140205408Srdivacky return getBuffer(Invalid)->getBuffer(); 141193326Sed} 142193326Sed 143193326Sedstd::pair<FileID, unsigned> FullSourceLoc::getDecomposedLoc() const { 144193326Sed return SrcMgr->getDecomposedLoc(*this); 145193326Sed} 146