clang: lib/Format/FormatTokenSource.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#ifndef LLVM_CLANG_LIB_FORMAT_FORMATTOKENSOURCE_H
16#define LLVM_CLANG_LIB_FORMAT_FORMATTOKENSOURCE_H
17
19
20#define DEBUG_TYPE "format-token-source"
21
23namespace format {
24
25
26
27
28
30public:
32
33
35
36
37
38
39
40
42
43
44
46
47
48
49
51
52
53
54
55
57
58
59
61
62
63
64
65
66
67
68
69
70
71
72
73
75
78 do {
80 assert(Tok);
81 } while (Tok->is(tok::comment));
82 return Tok;
83 }
84};
85
87public:
89 : Tokens(Tokens), Position(-1) {}
90
92 if (Position >= 0 && isEOF()) {
93 LLVM_DEBUG({
94 llvm::dbgs() << "Next ";
95 dbgToken(Position);
96 });
97 return Tokens[Position];
98 }
99 Position = successor(Position);
100 LLVM_DEBUG({
101 llvm::dbgs() << "Next ";
102 dbgToken(Position);
103 });
104 return Tokens[Position];
105 }
106
108 assert(Position <= 0 || Tokens[Position - 1]->isNot(tok::eof));
109 return Position > 0 ? Tokens[Position - 1] : nullptr;
110 }
111
114 return Tokens[Position];
115 int Next = successor(Position);
116 if (SkipComment)
117 while (Tokens[Next]->is(tok::comment))
118 Next = successor(Next);
119 LLVM_DEBUG({
120 llvm::dbgs() << "Peeking ";
121 dbgToken(Next);
122 });
123 return Tokens[Next];
124 }
125
127 return Position == -1 ? false : Tokens[Position]->is(tok::eof);
128 }
129
131 LLVM_DEBUG(llvm::dbgs() << "Getting Position: " << Position << "\n");
132 assert(Position >= 0);
133 return Position;
134 }
135
137 LLVM_DEBUG(llvm::dbgs() << "Setting Position: " << P << "\n");
138 Position = P;
139 return Tokens[Position];
140 }
141
143 assert(Position != -1);
144 assert((*New.rbegin())->Tok.is(tok::eof));
145 int Next = Tokens.size();
146 Tokens.append(New.begin(), New.end());
147 LLVM_DEBUG({
148 llvm::dbgs() << "Inserting:\n";
149 for (int I = Next, E = Tokens.size(); I != E; ++I)
150 dbgToken(I, " ");
151 llvm::dbgs() << " Jump from: " << (Tokens.size() - 1) << " -> "
152 << Position << "\n";
153 });
154 Jumps[Tokens.size() - 1] = Position;
155 Position = Next;
156 LLVM_DEBUG({
157 llvm::dbgs() << "At inserted token ";
158 dbgToken(Position);
159 });
160 return Tokens[Position];
161 }
162
163 void reset() { Position = -1; }
164
165private:
166 int successor(int Current) const {
167 int Next = Current + 1;
168 auto it = Jumps.find(Next);
169 if (it != Jumps.end()) {
170 Next = it->second;
171 assert(!Jumps.contains(Next));
172 }
173 return Next;
174 }
175
176 void dbgToken(int Position, StringRef Indent = "") {
177 FormatToken *Tok = Tokens[Position];
178 llvm::dbgs() << Indent << "[" << Position
179 << "] Token: " << Tok->Tok.getName() << " / " << Tok->TokenText
180 << ", Macro: " << !!Tok->MacroCtx << "\n";
181 }
182
183 SmallVector<FormatToken *> Tokens;
184 int Position;
185
186
187
188 llvm::DenseMap<int, int> Jumps;
189};
190
192public:
195 : Line(Line), TokenSource(TokenSource), ResetToken(ResetToken),
196 PreviousLineLevel(Line.Level), PreviousTokenSource(TokenSource),
197 Token(nullptr), PreviousToken(nullptr) {
200 TokenSource = this;
201 Line.Level = 0;
202 Line.InPPDirective = true;
203
204 }
205
207 TokenSource = PreviousTokenSource;
208 ResetToken = Token;
211 Line.Level = PreviousLineLevel;
212 }
213
215
216
217 assert(!eof());
218 PreviousToken = Token;
220 if (eof())
221 return &FakeEOF;
223 }
224
227 }
228
230 if (eof())
231 return &FakeEOF;
232 return PreviousTokenSource->peekNextToken(SkipComment);
233 }
234
235 bool isEOF() override { return PreviousTokenSource->isEOF(); }
236
238
240 PreviousToken = nullptr;
243 }
244
246 llvm_unreachable("Cannot insert tokens while parsing a macro.");
247 return nullptr;
248 }
249
250private:
251 bool eof() {
252 return Token && Token->HasUnescapedNewline &&
254 PreviousToken);
255 }
256
257 FormatToken FakeEOF;
258 UnwrappedLine &Line;
259 FormatTokenSource *&TokenSource;
260 FormatToken *&ResetToken;
261 unsigned PreviousLineLevel;
262 FormatTokenSource *PreviousTokenSource;
263
264 FormatToken *Token;
265 FormatToken *PreviousToken;
266};
267
268}
269}
270
271#undef DEBUG_TYPE
272
273#endif
This file contains the declaration of the UnwrappedLineParser, which turns a stream of tokens into Un...
Token - This structure provides full information about a lexed token.
void setKind(tok::TokenKind K)
void startToken()
Reset all flags to cleared.
virtual FormatToken * peekNextToken(bool SkipComment=false)=0
virtual unsigned getPosition()=0
virtual FormatToken * insertTokens(ArrayRef< FormatToken * > Tokens)=0
FormatToken * getNextNonComment()
virtual FormatToken * getPreviousToken()=0
virtual FormatToken * setPosition(unsigned Position)=0
virtual ~FormatTokenSource()
virtual FormatToken * getNextToken()=0
FormatToken * getPreviousToken() override
IndexedTokenSource(ArrayRef< FormatToken * > Tokens)
FormatToken * getNextToken() override
unsigned getPosition() override
FormatToken * peekNextToken(bool SkipComment=false) override
FormatToken * setPosition(unsigned P) override
FormatToken * insertTokens(ArrayRef< FormatToken * > New) override
FormatToken * peekNextToken(bool SkipComment) override
FormatToken * getNextToken() override
ScopedMacroState(UnwrappedLine &Line, FormatTokenSource *&TokenSource, FormatToken *&ResetToken)
FormatToken * setPosition(unsigned Position) override
FormatToken * getPreviousToken() override
FormatToken * insertTokens(ArrayRef< FormatToken * > Tokens) override
~ScopedMacroState() override
unsigned getPosition() override
bool continuesLineComment(const FormatToken &FormatTok, const FormatToken *Previous, const FormatToken *MinColumnToken)
The JSON file list parser is used to communicate input to InstallAPI.
A wrapper around a Token storing information about the whitespace characters preceding it.
bool is(tok::TokenKind Kind) const
An unwrapped line is a sequence of Token, that we would like to put on a single line if there was no ...
bool InMacroBody
Whether it is part of a macro body.
unsigned Level
The indent level of the UnwrappedLine.
bool InPPDirective
Whether this UnwrappedLine is part of a preprocessor directive.