15#ifndef LLVM_CLANG_LIB_FORMAT_FORMATTOKENSOURCE_H
16#define LLVM_CLANG_LIB_FORMAT_FORMATTOKENSOURCE_H
20#include "llvm/ADT/DenseMap.h"
23#define DEBUG_TYPE "format-token-source"
83 : Tokens(Tokens), Position(-1) {}
86 if (Position >= 0 &&
isEOF()) {
88 llvm::dbgs() <<
"Next ";
91 return Tokens[Position];
93 Position = successor(Position);
95 llvm::dbgs() <<
"Next ";
98 return Tokens[Position];
102 assert(Position <= 0 || Tokens[Position - 1]->isNot(tok::eof));
103 return Position > 0 ? Tokens[Position - 1] :
nullptr;
108 return Tokens[Position];
109 int Next = successor(Position);
111 while (Tokens[Next]->is(tok::comment))
112 Next = successor(Next);
114 llvm::dbgs() <<
"Peeking ";
121 return Position == -1 ?
false : Tokens[Position]->is(tok::eof);
125 LLVM_DEBUG(llvm::dbgs() <<
"Getting Position: " << Position <<
"\n");
126 assert(Position >= 0);
131 LLVM_DEBUG(llvm::dbgs() <<
"Setting Position: " <<
P <<
"\n");
133 return Tokens[Position];
137 assert(Position != -1);
138 assert((*New.rbegin())->Tok.is(tok::eof));
139 int Next = Tokens.size();
140 Tokens.append(New.begin(), New.end());
142 llvm::dbgs() <<
"Inserting:\n";
143 for (
int I = Next, E = Tokens.size(); I != E; ++I)
145 llvm::dbgs() <<
" Jump from: " << (Tokens.size() - 1) <<
" -> "
148 Jumps[Tokens.size() - 1] = Position;
151 llvm::dbgs() <<
"At inserted token ";
154 return Tokens[Position];
160 int successor(
int Current)
const {
161 int Next = Current + 1;
162 auto it = Jumps.find(Next);
163 if (it != Jumps.end()) {
165 assert(!Jumps.contains(Next));
170 void dbgToken(
int Position, llvm::StringRef Indent =
"") {
171 FormatToken *Tok = Tokens[Position];
172 llvm::dbgs() << Indent <<
"[" << Position
173 <<
"] Token: " << Tok->Tok.getName() <<
" / " << Tok->TokenText
174 <<
", Macro: " << !!Tok->MacroCtx <<
"\n";
177 SmallVector<FormatToken *> Tokens;
182 llvm::DenseMap<int, int> Jumps;
189 : Line(Line), TokenSource(TokenSource), ResetToken(ResetToken),
190 PreviousLineLevel(Line.Level), PreviousTokenSource(TokenSource),
191 Token(nullptr), PreviousToken(nullptr) {
196 Line.InPPDirective =
true;
201 TokenSource = PreviousTokenSource;
205 Line.
Level = PreviousLineLevel;
212 PreviousToken =
Token;
229 bool isEOF()
override {
return PreviousTokenSource->
isEOF(); }
234 PreviousToken =
nullptr;
240 llvm_unreachable(
"Cannot insert tokens while parsing a macro.");
253 FormatTokenSource *&TokenSource;
254 FormatToken *&ResetToken;
255 unsigned PreviousLineLevel;
256 FormatTokenSource *PreviousTokenSource;
259 FormatToken *PreviousToken;
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.