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