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