SourceLocation.cpp revision 226890
180709Sjake//==--- SourceLocation.cpp - Compact identifier for Source Files -*- C++ -*-==// 280709Sjake// 380709Sjake// The LLVM Compiler Infrastructure 480709Sjake// 580709Sjake// This file is distributed under the University of Illinois Open Source 680709Sjake// License. See LICENSE.TXT for details. 780709Sjake// 880709Sjake//===----------------------------------------------------------------------===// 980709Sjake// 1080709Sjake// This file defines accessor methods for the FullSourceLoc class. 1180709Sjake// 1280709Sjake//===----------------------------------------------------------------------===// 1380709Sjake 1481334Sobrien#include "clang/Basic/SourceLocation.h" 1580709Sjake#include "clang/Basic/PrettyStackTrace.h" 1680709Sjake#include "clang/Basic/SourceManager.h" 1781334Sobrien#include "llvm/Support/MemoryBuffer.h" 1880709Sjake#include "llvm/Support/raw_ostream.h" 1980709Sjake#include <cstdio> 2080709Sjakeusing namespace clang; 2180709Sjake 2280709Sjake//===----------------------------------------------------------------------===// 2380709Sjake// PrettyStackTraceLoc 2480709Sjake//===----------------------------------------------------------------------===// 2580709Sjake 2680709Sjakevoid PrettyStackTraceLoc::print(raw_ostream &OS) const { 2780709Sjake if (Loc.isValid()) { 2880709Sjake Loc.print(OS, SM); 2980709Sjake OS << ": "; 3080709Sjake } 3180709Sjake OS << Message << '\n'; 3280709Sjake} 3380709Sjake 3480709Sjake//===----------------------------------------------------------------------===// 3580709Sjake// SourceLocation 3680709Sjake//===----------------------------------------------------------------------===// 3780709Sjake 3880709Sjakevoid SourceLocation::print(raw_ostream &OS, const SourceManager &SM)const{ 3980709Sjake if (!isValid()) { 4080709Sjake OS << "<invalid loc>"; 4180709Sjake return; 4280709Sjake } 4380709Sjake 4480709Sjake if (isFileID()) { 4580709Sjake PresumedLoc PLoc = SM.getPresumedLoc(*this); 4680709Sjake 4780709Sjake if (PLoc.isInvalid()) { 4880709Sjake OS << "<invalid>"; 4980709Sjake return; 5082901Sjake } 5180709Sjake // The macro expansion and spelling pos is identical for file locs. 5282901Sjake OS << PLoc.getFilename() << ':' << PLoc.getLine() 5382901Sjake << ':' << PLoc.getColumn(); 5482901Sjake return; 5582901Sjake } 5680709Sjake 5782901Sjake SM.getExpansionLoc(*this).print(OS, SM); 5880709Sjake 5980709Sjake OS << " <Spelling="; 60 SM.getSpellingLoc(*this).print(OS, SM); 61 OS << '>'; 62} 63 64void SourceLocation::dump(const SourceManager &SM) const { 65 print(llvm::errs(), SM); 66} 67 68//===----------------------------------------------------------------------===// 69// FullSourceLoc 70//===----------------------------------------------------------------------===// 71 72FileID FullSourceLoc::getFileID() const { 73 assert(isValid()); 74 return SrcMgr->getFileID(*this); 75} 76 77 78FullSourceLoc FullSourceLoc::getExpansionLoc() const { 79 assert(isValid()); 80 return FullSourceLoc(SrcMgr->getExpansionLoc(*this), *SrcMgr); 81} 82 83FullSourceLoc FullSourceLoc::getSpellingLoc() const { 84 assert(isValid()); 85 return FullSourceLoc(SrcMgr->getSpellingLoc(*this), *SrcMgr); 86} 87 88unsigned FullSourceLoc::getExpansionLineNumber(bool *Invalid) const { 89 assert(isValid()); 90 return SrcMgr->getExpansionLineNumber(*this, Invalid); 91} 92 93unsigned FullSourceLoc::getExpansionColumnNumber(bool *Invalid) const { 94 assert(isValid()); 95 return SrcMgr->getExpansionColumnNumber(*this, Invalid); 96} 97 98unsigned FullSourceLoc::getSpellingLineNumber(bool *Invalid) const { 99 assert(isValid()); 100 return SrcMgr->getSpellingLineNumber(*this, Invalid); 101} 102 103unsigned FullSourceLoc::getSpellingColumnNumber(bool *Invalid) const { 104 assert(isValid()); 105 return SrcMgr->getSpellingColumnNumber(*this, Invalid); 106} 107 108bool FullSourceLoc::isInSystemHeader() const { 109 assert(isValid()); 110 return SrcMgr->isInSystemHeader(*this); 111} 112 113bool FullSourceLoc::isBeforeInTranslationUnitThan(SourceLocation Loc) const { 114 assert(isValid()); 115 return SrcMgr->isBeforeInTranslationUnit(*this, Loc); 116} 117 118const char *FullSourceLoc::getCharacterData(bool *Invalid) const { 119 assert(isValid()); 120 return SrcMgr->getCharacterData(*this, Invalid); 121} 122 123const llvm::MemoryBuffer* FullSourceLoc::getBuffer(bool *Invalid) const { 124 assert(isValid()); 125 return SrcMgr->getBuffer(SrcMgr->getFileID(*this), Invalid); 126} 127 128StringRef FullSourceLoc::getBufferData(bool *Invalid) const { 129 return getBuffer(Invalid)->getBuffer(); 130} 131 132std::pair<FileID, unsigned> FullSourceLoc::getDecomposedLoc() const { 133 return SrcMgr->getDecomposedLoc(*this); 134} 135