]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/lib/Basic/SourceLocation.cpp
Import CK as of commit b19ed4c6a56ec93215ab567ba18ba61bf1cfbac8
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / lib / Basic / SourceLocation.cpp
1 //==--- SourceLocation.cpp - Compact identifier for Source Files -*- C++ -*-==//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 //  This file defines accessor methods for the FullSourceLoc class.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "clang/Basic/SourceLocation.h"
15 #include "clang/Basic/PrettyStackTrace.h"
16 #include "clang/Basic/SourceManager.h"
17 #include "llvm/Support/raw_ostream.h"
18 #include <cstdio>
19 using namespace clang;
20
21 //===----------------------------------------------------------------------===//
22 // PrettyStackTraceLoc
23 //===----------------------------------------------------------------------===//
24
25 void PrettyStackTraceLoc::print(raw_ostream &OS) const {
26   if (Loc.isValid()) {
27     Loc.print(OS, SM);
28     OS << ": ";
29   }
30   OS << Message << '\n';
31 }
32
33 //===----------------------------------------------------------------------===//
34 // SourceLocation
35 //===----------------------------------------------------------------------===//
36
37 void SourceLocation::print(raw_ostream &OS, const SourceManager &SM)const{
38   if (!isValid()) {
39     OS << "<invalid loc>";
40     return;
41   }
42
43   if (isFileID()) {
44     PresumedLoc PLoc = SM.getPresumedLoc(*this);
45     
46     if (PLoc.isInvalid()) {
47       OS << "<invalid>";
48       return;
49     }
50     // The macro expansion and spelling pos is identical for file locs.
51     OS << PLoc.getFilename() << ':' << PLoc.getLine()
52        << ':' << PLoc.getColumn();
53     return;
54   }
55
56   SM.getExpansionLoc(*this).print(OS, SM);
57
58   OS << " <Spelling=";
59   SM.getSpellingLoc(*this).print(OS, SM);
60   OS << '>';
61 }
62
63 LLVM_DUMP_METHOD std::string
64 SourceLocation::printToString(const SourceManager &SM) const {
65   std::string S;
66   llvm::raw_string_ostream OS(S);
67   print(OS, SM);
68   return OS.str();
69 }
70
71 LLVM_DUMP_METHOD void SourceLocation::dump(const SourceManager &SM) const {
72   print(llvm::errs(), SM);
73 }
74
75 //===----------------------------------------------------------------------===//
76 // FullSourceLoc
77 //===----------------------------------------------------------------------===//
78
79 FileID FullSourceLoc::getFileID() const {
80   assert(isValid());
81   return SrcMgr->getFileID(*this);
82 }
83
84
85 FullSourceLoc FullSourceLoc::getExpansionLoc() const {
86   assert(isValid());
87   return FullSourceLoc(SrcMgr->getExpansionLoc(*this), *SrcMgr);
88 }
89
90 FullSourceLoc FullSourceLoc::getSpellingLoc() const {
91   assert(isValid());
92   return FullSourceLoc(SrcMgr->getSpellingLoc(*this), *SrcMgr);
93 }
94
95 FullSourceLoc FullSourceLoc::getFileLoc() const {
96   assert(isValid());
97   return FullSourceLoc(SrcMgr->getFileLoc(*this), *SrcMgr);
98 }
99
100 std::pair<FullSourceLoc, FullSourceLoc>
101 FullSourceLoc::getImmediateExpansionRange() const {
102   assert(isValid());
103   std::pair<SourceLocation, SourceLocation> Range =
104       SrcMgr->getImmediateExpansionRange(*this);
105   return std::make_pair(FullSourceLoc(Range.first, *SrcMgr),
106                         FullSourceLoc(Range.second, *SrcMgr));
107 }
108
109 PresumedLoc FullSourceLoc::getPresumedLoc(bool UseLineDirectives) const {
110   if (!isValid())
111     return PresumedLoc();
112
113   return SrcMgr->getPresumedLoc(*this, UseLineDirectives);
114 }
115
116 bool FullSourceLoc::isMacroArgExpansion(FullSourceLoc *StartLoc) const {
117   assert(isValid());
118   return SrcMgr->isMacroArgExpansion(*this, StartLoc);
119 }
120
121 FullSourceLoc FullSourceLoc::getImmediateMacroCallerLoc() const {
122   assert(isValid());
123   return FullSourceLoc(SrcMgr->getImmediateMacroCallerLoc(*this), *SrcMgr);
124 }
125
126 std::pair<FullSourceLoc, StringRef> FullSourceLoc::getModuleImportLoc() const {
127   if (!isValid())
128     return std::make_pair(FullSourceLoc(), StringRef());
129
130   std::pair<SourceLocation, StringRef> ImportLoc =
131       SrcMgr->getModuleImportLoc(*this);
132   return std::make_pair(FullSourceLoc(ImportLoc.first, *SrcMgr),
133                         ImportLoc.second);
134 }
135
136 unsigned FullSourceLoc::getFileOffset() const {
137   assert(isValid());
138   return SrcMgr->getFileOffset(*this);
139 }
140
141 unsigned FullSourceLoc::getLineNumber(bool *Invalid) const {
142   assert(isValid());
143   return SrcMgr->getLineNumber(getFileID(), getFileOffset(), Invalid);
144 }
145
146 unsigned FullSourceLoc::getColumnNumber(bool *Invalid) const {
147   assert(isValid());
148   return SrcMgr->getColumnNumber(getFileID(), getFileOffset(), Invalid);
149 }
150
151 std::pair<FullSourceLoc, FullSourceLoc>
152 FullSourceLoc::getExpansionRange() const {
153   assert(isValid());
154   std::pair<SourceLocation, SourceLocation> Range =
155       SrcMgr->getExpansionRange(*this);
156   return std::make_pair(FullSourceLoc(Range.first, *SrcMgr),
157                         FullSourceLoc(Range.second, *SrcMgr));
158 }
159
160 const FileEntry *FullSourceLoc::getFileEntry() const {
161   assert(isValid());
162   return SrcMgr->getFileEntryForID(getFileID());
163 }
164
165 unsigned FullSourceLoc::getExpansionLineNumber(bool *Invalid) const {
166   assert(isValid());
167   return SrcMgr->getExpansionLineNumber(*this, Invalid);
168 }
169
170 unsigned FullSourceLoc::getExpansionColumnNumber(bool *Invalid) const {
171   assert(isValid());
172   return SrcMgr->getExpansionColumnNumber(*this, Invalid);
173 }
174
175 unsigned FullSourceLoc::getSpellingLineNumber(bool *Invalid) const {
176   assert(isValid());
177   return SrcMgr->getSpellingLineNumber(*this, Invalid);
178 }
179
180 unsigned FullSourceLoc::getSpellingColumnNumber(bool *Invalid) const {
181   assert(isValid());
182   return SrcMgr->getSpellingColumnNumber(*this, Invalid);
183 }
184
185 bool FullSourceLoc::isInSystemHeader() const {
186   assert(isValid());
187   return SrcMgr->isInSystemHeader(*this);
188 }
189
190 bool FullSourceLoc::isBeforeInTranslationUnitThan(SourceLocation Loc) const {
191   assert(isValid());
192   return SrcMgr->isBeforeInTranslationUnit(*this, Loc);
193 }
194
195 LLVM_DUMP_METHOD void FullSourceLoc::dump() const {
196   SourceLocation::dump(*SrcMgr);
197 }
198
199 const char *FullSourceLoc::getCharacterData(bool *Invalid) const {
200   assert(isValid());
201   return SrcMgr->getCharacterData(*this, Invalid);
202 }
203
204 StringRef FullSourceLoc::getBufferData(bool *Invalid) const {
205   assert(isValid());
206   return SrcMgr->getBuffer(SrcMgr->getFileID(*this), Invalid)->getBuffer();
207 }
208
209 std::pair<FileID, unsigned> FullSourceLoc::getDecomposedLoc() const {
210   return SrcMgr->getDecomposedLoc(*this);
211 }