blob: 6a491c42628ce59233cf378c83375de91e971245 [file] [log] [blame]
Daniel Jasperbac016b2012-12-03 18:12:45 +00001//===--- UnwrappedLineParser.cpp - Format C++ code ------------------------===//
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/// \file
11/// \brief This file contains the implementation of the UnwrappedLineParser,
12/// which turns a stream of tokens into UnwrappedLines.
13///
Daniel Jasperbac016b2012-12-03 18:12:45 +000014//===----------------------------------------------------------------------===//
15
Manuel Klimek8fa37992013-01-16 12:31:12 +000016#define DEBUG_TYPE "format-parser"
Daniel Jasperbac016b2012-12-03 18:12:45 +000017
Chandler Carruthb1ba0ef2013-01-19 08:09:44 +000018#include "UnwrappedLineParser.h"
Manuel Klimek8fa37992013-01-16 12:31:12 +000019#include "llvm/Support/Debug.h"
Manuel Klimek8fa37992013-01-16 12:31:12 +000020
Daniel Jasperbac016b2012-12-03 18:12:45 +000021namespace clang {
22namespace format {
23
Manuel Klimek96e888b2013-05-28 11:55:06 +000024class FormatTokenSource {
25public:
26 virtual ~FormatTokenSource() {}
27 virtual FormatToken *getNextToken() = 0;
28
29 virtual unsigned getPosition() = 0;
30 virtual FormatToken *setPosition(unsigned Position) = 0;
31};
32
Craig Toppere50947f2013-07-01 04:21:54 +000033namespace {
34
Manuel Klimek70b03f42013-01-23 09:32:48 +000035class ScopedDeclarationState {
36public:
37 ScopedDeclarationState(UnwrappedLine &Line, std::vector<bool> &Stack,
38 bool MustBeDeclaration)
39 : Line(Line), Stack(Stack) {
Manuel Klimek70b03f42013-01-23 09:32:48 +000040 Line.MustBeDeclaration = MustBeDeclaration;
Manuel Klimek836b58f2013-01-23 11:03:04 +000041 Stack.push_back(MustBeDeclaration);
Manuel Klimek70b03f42013-01-23 09:32:48 +000042 }
43 ~ScopedDeclarationState() {
Manuel Klimek70b03f42013-01-23 09:32:48 +000044 Stack.pop_back();
Manuel Klimeka32a7fd2013-01-23 14:08:21 +000045 if (!Stack.empty())
46 Line.MustBeDeclaration = Stack.back();
47 else
48 Line.MustBeDeclaration = true;
Manuel Klimek70b03f42013-01-23 09:32:48 +000049 }
Daniel Jasperf7ec1cc2013-05-31 14:56:29 +000050
Manuel Klimek70b03f42013-01-23 09:32:48 +000051private:
52 UnwrappedLine &Line;
53 std::vector<bool> &Stack;
54};
55
Manuel Klimekd4397b92013-01-04 23:34:14 +000056class ScopedMacroState : public FormatTokenSource {
57public:
58 ScopedMacroState(UnwrappedLine &Line, FormatTokenSource *&TokenSource,
Manuel Klimek96e888b2013-05-28 11:55:06 +000059 FormatToken *&ResetToken, bool &StructuralError)
Manuel Klimekd4397b92013-01-04 23:34:14 +000060 : Line(Line), TokenSource(TokenSource), ResetToken(ResetToken),
Manuel Klimek67d080d2013-04-12 14:13:36 +000061 PreviousLineLevel(Line.Level), PreviousTokenSource(TokenSource),
62 StructuralError(StructuralError),
Manuel Klimek96e888b2013-05-28 11:55:06 +000063 PreviousStructuralError(StructuralError), Token(NULL) {
Manuel Klimekd4397b92013-01-04 23:34:14 +000064 TokenSource = this;
Manuel Klimekc37b4d62013-01-05 22:14:16 +000065 Line.Level = 0;
Manuel Klimekd4397b92013-01-04 23:34:14 +000066 Line.InPPDirective = true;
67 }
68
69 ~ScopedMacroState() {
70 TokenSource = PreviousTokenSource;
71 ResetToken = Token;
72 Line.InPPDirective = false;
Manuel Klimekc37b4d62013-01-05 22:14:16 +000073 Line.Level = PreviousLineLevel;
Manuel Klimek67d080d2013-04-12 14:13:36 +000074 StructuralError = PreviousStructuralError;
Manuel Klimekd4397b92013-01-04 23:34:14 +000075 }
76
Manuel Klimek96e888b2013-05-28 11:55:06 +000077 virtual FormatToken *getNextToken() {
Manuel Klimekdd5b1012013-01-07 10:03:37 +000078 // The \c UnwrappedLineParser guards against this by never calling
79 // \c getNextToken() after it has encountered the first eof token.
80 assert(!eof());
Manuel Klimekd4397b92013-01-04 23:34:14 +000081 Token = PreviousTokenSource->getNextToken();
82 if (eof())
Manuel Klimek96e888b2013-05-28 11:55:06 +000083 return getFakeEOF();
Manuel Klimekd4397b92013-01-04 23:34:14 +000084 return Token;
85 }
86
Daniel Jasperf7ec1cc2013-05-31 14:56:29 +000087 virtual unsigned getPosition() { return PreviousTokenSource->getPosition(); }
Manuel Klimek80829bd2013-05-23 09:41:43 +000088
Manuel Klimek96e888b2013-05-28 11:55:06 +000089 virtual FormatToken *setPosition(unsigned Position) {
Manuel Klimek80829bd2013-05-23 09:41:43 +000090 Token = PreviousTokenSource->setPosition(Position);
91 return Token;
92 }
93
Manuel Klimekd4397b92013-01-04 23:34:14 +000094private:
Manuel Klimek96e888b2013-05-28 11:55:06 +000095 bool eof() { return Token && Token->HasUnescapedNewline; }
Manuel Klimekd4397b92013-01-04 23:34:14 +000096
Manuel Klimek96e888b2013-05-28 11:55:06 +000097 FormatToken *getFakeEOF() {
98 static bool EOFInitialized = false;
99 static FormatToken FormatTok;
100 if (!EOFInitialized) {
101 FormatTok.Tok.startToken();
102 FormatTok.Tok.setKind(tok::eof);
103 EOFInitialized = true;
104 }
105 return &FormatTok;
Manuel Klimekd4397b92013-01-04 23:34:14 +0000106 }
107
108 UnwrappedLine &Line;
109 FormatTokenSource *&TokenSource;
Manuel Klimek96e888b2013-05-28 11:55:06 +0000110 FormatToken *&ResetToken;
Manuel Klimekc37b4d62013-01-05 22:14:16 +0000111 unsigned PreviousLineLevel;
Manuel Klimekd4397b92013-01-04 23:34:14 +0000112 FormatTokenSource *PreviousTokenSource;
Manuel Klimek67d080d2013-04-12 14:13:36 +0000113 bool &StructuralError;
114 bool PreviousStructuralError;
Manuel Klimekd4397b92013-01-04 23:34:14 +0000115
Manuel Klimek96e888b2013-05-28 11:55:06 +0000116 FormatToken *Token;
Manuel Klimekd4397b92013-01-04 23:34:14 +0000117};
118
Craig Toppere50947f2013-07-01 04:21:54 +0000119} // end anonymous namespace
120
Manuel Klimekbb42bf12013-01-10 11:52:21 +0000121class ScopedLineState {
122public:
Manuel Klimek525fe162013-01-18 14:04:34 +0000123 ScopedLineState(UnwrappedLineParser &Parser,
124 bool SwitchToPreprocessorLines = false)
125 : Parser(Parser), SwitchToPreprocessorLines(SwitchToPreprocessorLines) {
126 if (SwitchToPreprocessorLines)
127 Parser.CurrentLines = &Parser.PreprocessorDirectives;
Manuel Klimekbb42bf12013-01-10 11:52:21 +0000128 PreBlockLine = Parser.Line.take();
Daniel Jaspercbb6c412013-01-16 09:10:19 +0000129 Parser.Line.reset(new UnwrappedLine());
130 Parser.Line->Level = PreBlockLine->Level;
131 Parser.Line->InPPDirective = PreBlockLine->InPPDirective;
Manuel Klimekbb42bf12013-01-10 11:52:21 +0000132 }
133
134 ~ScopedLineState() {
Daniel Jaspercbb6c412013-01-16 09:10:19 +0000135 if (!Parser.Line->Tokens.empty()) {
Manuel Klimekbb42bf12013-01-10 11:52:21 +0000136 Parser.addUnwrappedLine();
137 }
Daniel Jaspercbb6c412013-01-16 09:10:19 +0000138 assert(Parser.Line->Tokens.empty());
Manuel Klimekbb42bf12013-01-10 11:52:21 +0000139 Parser.Line.reset(PreBlockLine);
Manuel Klimekbb42bf12013-01-10 11:52:21 +0000140 Parser.MustBreakBeforeNextToken = true;
Manuel Klimek525fe162013-01-18 14:04:34 +0000141 if (SwitchToPreprocessorLines)
142 Parser.CurrentLines = &Parser.Lines;
Manuel Klimekbb42bf12013-01-10 11:52:21 +0000143 }
144
145private:
146 UnwrappedLineParser &Parser;
Manuel Klimek525fe162013-01-18 14:04:34 +0000147 const bool SwitchToPreprocessorLines;
Manuel Klimekbb42bf12013-01-10 11:52:21 +0000148
149 UnwrappedLine *PreBlockLine;
Manuel Klimekbb42bf12013-01-10 11:52:21 +0000150};
151
Craig Toppere50947f2013-07-01 04:21:54 +0000152namespace {
153
Manuel Klimek80829bd2013-05-23 09:41:43 +0000154class IndexedTokenSource : public FormatTokenSource {
155public:
Manuel Klimek96e888b2013-05-28 11:55:06 +0000156 IndexedTokenSource(ArrayRef<FormatToken *> Tokens)
Manuel Klimek80829bd2013-05-23 09:41:43 +0000157 : Tokens(Tokens), Position(-1) {}
158
Manuel Klimek96e888b2013-05-28 11:55:06 +0000159 virtual FormatToken *getNextToken() {
Manuel Klimek80829bd2013-05-23 09:41:43 +0000160 ++Position;
161 return Tokens[Position];
162 }
163
164 virtual unsigned getPosition() {
165 assert(Position >= 0);
166 return Position;
167 }
168
Manuel Klimek96e888b2013-05-28 11:55:06 +0000169 virtual FormatToken *setPosition(unsigned P) {
Manuel Klimek80829bd2013-05-23 09:41:43 +0000170 Position = P;
171 return Tokens[Position];
172 }
173
174private:
Manuel Klimek96e888b2013-05-28 11:55:06 +0000175 ArrayRef<FormatToken *> Tokens;
Manuel Klimek80829bd2013-05-23 09:41:43 +0000176 int Position;
177};
178
Craig Toppere50947f2013-07-01 04:21:54 +0000179} // end anonymous namespace
180
Daniel Jaspercaf42a32013-05-15 08:14:19 +0000181UnwrappedLineParser::UnwrappedLineParser(const FormatStyle &Style,
Manuel Klimek96e888b2013-05-28 11:55:06 +0000182 ArrayRef<FormatToken *> Tokens,
Daniel Jaspercaf42a32013-05-15 08:14:19 +0000183 UnwrappedLineConsumer &Callback)
Manuel Klimek525fe162013-01-18 14:04:34 +0000184 : Line(new UnwrappedLine), MustBreakBeforeNextToken(false),
Manuel Klimek96e888b2013-05-28 11:55:06 +0000185 CurrentLines(&Lines), StructuralError(false), Style(Style), Tokens(NULL),
Daniel Jasper0de1c4d2013-07-09 09:06:29 +0000186 Callback(Callback), AllTokens(Tokens) {}
Daniel Jasperbac016b2012-12-03 18:12:45 +0000187
Alexander Kornienkocff563c2012-12-04 17:27:50 +0000188bool UnwrappedLineParser::parse() {
Manuel Klimek8fa37992013-01-16 12:31:12 +0000189 DEBUG(llvm::dbgs() << "----\n");
Manuel Klimek80829bd2013-05-23 09:41:43 +0000190 IndexedTokenSource TokenSource(AllTokens);
191 Tokens = &TokenSource;
Manuel Klimekd4397b92013-01-04 23:34:14 +0000192 readToken();
Manuel Klimek67d080d2013-04-12 14:13:36 +0000193 parseFile();
Daniel Jasperf9955d32013-03-20 12:37:50 +0000194 for (std::vector<UnwrappedLine>::iterator I = Lines.begin(), E = Lines.end();
Manuel Klimek525fe162013-01-18 14:04:34 +0000195 I != E; ++I) {
196 Callback.consumeUnwrappedLine(*I);
197 }
Daniel Jasper516fb312013-03-01 18:11:39 +0000198
199 // Create line with eof token.
200 pushToken(FormatTok);
201 Callback.consumeUnwrappedLine(*Line);
Manuel Klimek67d080d2013-04-12 14:13:36 +0000202 return StructuralError;
Manuel Klimekd4397b92013-01-04 23:34:14 +0000203}
204
Manuel Klimek67d080d2013-04-12 14:13:36 +0000205void UnwrappedLineParser::parseFile() {
Daniel Jasper627707b2013-03-22 16:55:40 +0000206 ScopedDeclarationState DeclarationState(
207 *Line, DeclarationScopeStack,
208 /*MustBeDeclaration=*/ !Line->InPPDirective);
Nico Weber27268772013-06-26 00:30:14 +0000209 parseLevel(/*HasOpeningBrace=*/false);
Manuel Klimekd4397b92013-01-04 23:34:14 +0000210 // Make sure to format the remaining tokens.
Manuel Klimek86721d22013-01-22 16:31:55 +0000211 flushComments(true);
Manuel Klimekd4397b92013-01-04 23:34:14 +0000212 addUnwrappedLine();
Daniel Jasperbac016b2012-12-03 18:12:45 +0000213}
214
Manuel Klimek67d080d2013-04-12 14:13:36 +0000215void UnwrappedLineParser::parseLevel(bool HasOpeningBrace) {
Daniel Jaspere865cc52013-07-25 11:31:57 +0000216 bool SwitchLabelEncountered = false;
Daniel Jasperbac016b2012-12-03 18:12:45 +0000217 do {
Manuel Klimek96e888b2013-05-28 11:55:06 +0000218 switch (FormatTok->Tok.getKind()) {
Daniel Jasperbac016b2012-12-03 18:12:45 +0000219 case tok::comment:
Daniel Jasper05b1ac82012-12-17 11:29:41 +0000220 nextToken();
221 addUnwrappedLine();
Daniel Jasperbac016b2012-12-03 18:12:45 +0000222 break;
223 case tok::l_brace:
Manuel Klimek70b03f42013-01-23 09:32:48 +0000224 // FIXME: Add parameter whether this can happen - if this happens, we must
225 // be in a non-declaration context.
Nico Weber27268772013-06-26 00:30:14 +0000226 parseBlock(/*MustBeDeclaration=*/false);
Daniel Jasperbac016b2012-12-03 18:12:45 +0000227 addUnwrappedLine();
228 break;
229 case tok::r_brace:
Manuel Klimek67d080d2013-04-12 14:13:36 +0000230 if (HasOpeningBrace)
231 return;
Manuel Klimek67d080d2013-04-12 14:13:36 +0000232 StructuralError = true;
233 nextToken();
234 addUnwrappedLine();
Manuel Klimeka5342db2013-01-06 20:07:31 +0000235 break;
Daniel Jaspere865cc52013-07-25 11:31:57 +0000236 case tok::kw_default:
237 case tok::kw_case:
Daniel Jasper67cf1db2013-09-02 08:26:29 +0000238 if (!SwitchLabelEncountered &&
239 (Style.IndentCaseLabels || (Line->InPPDirective && Line->Level == 1)))
240 ++Line->Level;
Daniel Jaspere865cc52013-07-25 11:31:57 +0000241 SwitchLabelEncountered = true;
242 parseStructuralElement();
243 break;
Daniel Jasperbac016b2012-12-03 18:12:45 +0000244 default:
Manuel Klimekf0ab0a32013-01-07 14:56:16 +0000245 parseStructuralElement();
Daniel Jasperbac016b2012-12-03 18:12:45 +0000246 break;
247 }
248 } while (!eof());
249}
250
Manuel Klimek80829bd2013-05-23 09:41:43 +0000251void UnwrappedLineParser::calculateBraceTypes() {
252 // We'll parse forward through the tokens until we hit
253 // a closing brace or eof - note that getNextToken() will
254 // parse macros, so this will magically work inside macro
255 // definitions, too.
256 unsigned StoredPosition = Tokens->getPosition();
257 unsigned Position = StoredPosition;
Manuel Klimek96e888b2013-05-28 11:55:06 +0000258 FormatToken *Tok = FormatTok;
Manuel Klimek80829bd2013-05-23 09:41:43 +0000259 // Keep a stack of positions of lbrace tokens. We will
260 // update information about whether an lbrace starts a
261 // braced init list or a different block during the loop.
Daniel Jasper0de1c4d2013-07-09 09:06:29 +0000262 SmallVector<FormatToken *, 8> LBraceStack;
Manuel Klimek96e888b2013-05-28 11:55:06 +0000263 assert(Tok->Tok.is(tok::l_brace));
Manuel Klimek80829bd2013-05-23 09:41:43 +0000264 do {
Daniel Jasper02eacc22013-07-01 09:15:46 +0000265 // Get next none-comment token.
266 FormatToken *NextTok;
Daniel Jasperf50dbfa2013-07-01 16:43:38 +0000267 unsigned ReadTokens = 0;
Daniel Jasper02eacc22013-07-01 09:15:46 +0000268 do {
269 NextTok = Tokens->getNextToken();
Daniel Jasperf50dbfa2013-07-01 16:43:38 +0000270 ++ReadTokens;
Daniel Jasper02eacc22013-07-01 09:15:46 +0000271 } while (NextTok->is(tok::comment));
272
Manuel Klimek96e888b2013-05-28 11:55:06 +0000273 switch (Tok->Tok.getKind()) {
Manuel Klimek80829bd2013-05-23 09:41:43 +0000274 case tok::l_brace:
Daniel Jasper0de1c4d2013-07-09 09:06:29 +0000275 LBraceStack.push_back(Tok);
Manuel Klimek80829bd2013-05-23 09:41:43 +0000276 break;
277 case tok::r_brace:
278 if (!LBraceStack.empty()) {
Daniel Jasper0de1c4d2013-07-09 09:06:29 +0000279 if (LBraceStack.back()->BlockKind == BK_Unknown) {
Manuel Klimek80829bd2013-05-23 09:41:43 +0000280 // If there is a comma, semicolon or right paren after the closing
Manuel Klimek31e44f72013-09-04 08:20:47 +0000281 // brace, we assume this is a braced initializer list. Note that
282 // regardless how we mark inner braces here, we will overwrite the
283 // BlockKind later if we parse a braced list (where all blocks inside
284 // are by default braced lists), or when we explicitly detect blocks
285 // (for example while parsing lambdas).
Daniel Jasperf439dcb2013-08-28 07:50:37 +0000286 //
287 // We exclude + and - as they can be ObjC visibility modifiers.
Daniel Jaspereb483662013-05-31 10:09:55 +0000288 if (NextTok->isOneOf(tok::comma, tok::semi, tok::r_paren,
Daniel Jasperf439dcb2013-08-28 07:50:37 +0000289 tok::l_brace, tok::colon) ||
290 (NextTok->isBinaryOperator() &&
291 !NextTok->isOneOf(tok::plus, tok::minus))) {
Daniel Jasper0de1c4d2013-07-09 09:06:29 +0000292 Tok->BlockKind = BK_BracedInit;
293 LBraceStack.back()->BlockKind = BK_BracedInit;
294 } else {
295 Tok->BlockKind = BK_Block;
296 LBraceStack.back()->BlockKind = BK_Block;
297 }
Manuel Klimek80829bd2013-05-23 09:41:43 +0000298 }
299 LBraceStack.pop_back();
300 }
301 break;
302 case tok::semi:
303 case tok::kw_if:
304 case tok::kw_while:
305 case tok::kw_for:
306 case tok::kw_switch:
307 case tok::kw_try:
Daniel Jasperf7ec1cc2013-05-31 14:56:29 +0000308 if (!LBraceStack.empty())
Daniel Jasper0de1c4d2013-07-09 09:06:29 +0000309 LBraceStack.back()->BlockKind = BK_Block;
Manuel Klimek80829bd2013-05-23 09:41:43 +0000310 break;
311 default:
312 break;
313 }
314 Tok = NextTok;
Daniel Jasperf50dbfa2013-07-01 16:43:38 +0000315 Position += ReadTokens;
Manuel Klimek31e44f72013-09-04 08:20:47 +0000316 } while (Tok->Tok.isNot(tok::eof) && !LBraceStack.empty());
Manuel Klimek80829bd2013-05-23 09:41:43 +0000317 // Assume other blocks for all unclosed opening braces.
318 for (unsigned i = 0, e = LBraceStack.size(); i != e; ++i) {
Daniel Jasper0de1c4d2013-07-09 09:06:29 +0000319 if (LBraceStack[i]->BlockKind == BK_Unknown)
320 LBraceStack[i]->BlockKind = BK_Block;
Manuel Klimek80829bd2013-05-23 09:41:43 +0000321 }
Manuel Klimek31e44f72013-09-04 08:20:47 +0000322
Manuel Klimek80829bd2013-05-23 09:41:43 +0000323 FormatTok = Tokens->setPosition(StoredPosition);
324}
325
Daniel Jaspereff18b92013-07-31 23:16:02 +0000326void UnwrappedLineParser::parseBlock(bool MustBeDeclaration, bool AddLevel) {
Manuel Klimek96e888b2013-05-28 11:55:06 +0000327 assert(FormatTok->Tok.is(tok::l_brace) && "'{' expected");
Daniel Jaspere865cc52013-07-25 11:31:57 +0000328 unsigned InitialLevel = Line->Level;
Daniel Jasperbac016b2012-12-03 18:12:45 +0000329 nextToken();
330
Manuel Klimek2f1ac412013-01-21 16:42:44 +0000331 addUnwrappedLine();
Daniel Jasperbac016b2012-12-03 18:12:45 +0000332
Manuel Klimek70b03f42013-01-23 09:32:48 +0000333 ScopedDeclarationState DeclarationState(*Line, DeclarationScopeStack,
334 MustBeDeclaration);
Daniel Jaspereff18b92013-07-31 23:16:02 +0000335 if (AddLevel)
336 ++Line->Level;
Nico Weber27268772013-06-26 00:30:14 +0000337 parseLevel(/*HasOpeningBrace=*/true);
Alexander Kornienko15757312012-12-06 18:03:27 +0000338
Manuel Klimek96e888b2013-05-28 11:55:06 +0000339 if (!FormatTok->Tok.is(tok::r_brace)) {
Daniel Jaspere865cc52013-07-25 11:31:57 +0000340 Line->Level = InitialLevel;
Manuel Klimek67d080d2013-04-12 14:13:36 +0000341 StructuralError = true;
342 return;
Manuel Klimek86721d22013-01-22 16:31:55 +0000343 }
Alexander Kornienko393b0082012-12-04 15:40:36 +0000344
Daniel Jasperf9955d32013-03-20 12:37:50 +0000345 nextToken(); // Munch the closing brace.
Daniel Jaspere865cc52013-07-25 11:31:57 +0000346 Line->Level = InitialLevel;
Daniel Jasperbac016b2012-12-03 18:12:45 +0000347}
348
Manuel Klimek753a5112013-09-04 13:25:30 +0000349void UnwrappedLineParser::parseChildBlock() {
350 FormatTok->BlockKind = BK_Block;
351 nextToken();
352 {
353 ScopedLineState LineState(*this);
354 ScopedDeclarationState DeclarationState(*Line, DeclarationScopeStack,
355 /*MustBeDeclaration=*/false);
356 Line->Level += 1;
357 parseLevel(/*HasOpeningBrace=*/true);
358 Line->Level -= 1;
359 }
360 nextToken();
361}
362
Daniel Jasperbac016b2012-12-03 18:12:45 +0000363void UnwrappedLineParser::parsePPDirective() {
Manuel Klimek96e888b2013-05-28 11:55:06 +0000364 assert(FormatTok->Tok.is(tok::hash) && "'#' expected");
Manuel Klimek67d080d2013-04-12 14:13:36 +0000365 ScopedMacroState MacroState(*Line, Tokens, FormatTok, StructuralError);
Manuel Klimeka080a182013-01-02 16:30:12 +0000366 nextToken();
367
Manuel Klimek96e888b2013-05-28 11:55:06 +0000368 if (FormatTok->Tok.getIdentifierInfo() == NULL) {
Manuel Klimekbd04f2a2013-01-31 15:58:48 +0000369 parsePPUnknown();
Manuel Klimeka080a182013-01-02 16:30:12 +0000370 return;
Daniel Jasperbac016b2012-12-03 18:12:45 +0000371 }
Manuel Klimeka080a182013-01-02 16:30:12 +0000372
Manuel Klimek96e888b2013-05-28 11:55:06 +0000373 switch (FormatTok->Tok.getIdentifierInfo()->getPPKeywordID()) {
Manuel Klimekd4397b92013-01-04 23:34:14 +0000374 case tok::pp_define:
375 parsePPDefine();
Alexander Kornienko6fb46b02013-05-24 18:24:24 +0000376 return;
377 case tok::pp_if:
378 parsePPIf();
379 break;
380 case tok::pp_ifdef:
381 case tok::pp_ifndef:
382 parsePPIfdef();
383 break;
384 case tok::pp_else:
385 parsePPElse();
386 break;
387 case tok::pp_elif:
388 parsePPElIf();
389 break;
390 case tok::pp_endif:
391 parsePPEndIf();
Manuel Klimekd4397b92013-01-04 23:34:14 +0000392 break;
393 default:
394 parsePPUnknown();
395 break;
396 }
397}
398
Alexander Kornienko6fb46b02013-05-24 18:24:24 +0000399void UnwrappedLineParser::pushPPConditional() {
400 if (!PPStack.empty() && PPStack.back() == PP_Unreachable)
401 PPStack.push_back(PP_Unreachable);
402 else
403 PPStack.push_back(PP_Conditional);
404}
405
406void UnwrappedLineParser::parsePPIf() {
407 nextToken();
Manuel Klimek96e888b2013-05-28 11:55:06 +0000408 if ((FormatTok->Tok.isLiteral() &&
409 StringRef(FormatTok->Tok.getLiteralData(), FormatTok->Tok.getLength()) ==
Alexander Kornienko6fb46b02013-05-24 18:24:24 +0000410 "0") ||
Manuel Klimek96e888b2013-05-28 11:55:06 +0000411 FormatTok->Tok.is(tok::kw_false)) {
Alexander Kornienko6fb46b02013-05-24 18:24:24 +0000412 PPStack.push_back(PP_Unreachable);
413 } else {
414 pushPPConditional();
415 }
416 parsePPUnknown();
417}
418
419void UnwrappedLineParser::parsePPIfdef() {
420 pushPPConditional();
421 parsePPUnknown();
422}
423
424void UnwrappedLineParser::parsePPElse() {
425 if (!PPStack.empty())
426 PPStack.pop_back();
427 pushPPConditional();
428 parsePPUnknown();
429}
430
Daniel Jasperf7ec1cc2013-05-31 14:56:29 +0000431void UnwrappedLineParser::parsePPElIf() { parsePPElse(); }
Alexander Kornienko6fb46b02013-05-24 18:24:24 +0000432
433void UnwrappedLineParser::parsePPEndIf() {
434 if (!PPStack.empty())
435 PPStack.pop_back();
436 parsePPUnknown();
437}
438
Manuel Klimekd4397b92013-01-04 23:34:14 +0000439void UnwrappedLineParser::parsePPDefine() {
440 nextToken();
441
Manuel Klimek96e888b2013-05-28 11:55:06 +0000442 if (FormatTok->Tok.getKind() != tok::identifier) {
Manuel Klimekd4397b92013-01-04 23:34:14 +0000443 parsePPUnknown();
444 return;
445 }
446 nextToken();
Manuel Klimek96e888b2013-05-28 11:55:06 +0000447 if (FormatTok->Tok.getKind() == tok::l_paren &&
448 FormatTok->WhitespaceRange.getBegin() ==
449 FormatTok->WhitespaceRange.getEnd()) {
Manuel Klimekd4397b92013-01-04 23:34:14 +0000450 parseParens();
451 }
452 addUnwrappedLine();
Manuel Klimek526ed112013-01-09 15:25:02 +0000453 Line->Level = 1;
Manuel Klimekc3d0c822013-01-07 09:34:28 +0000454
455 // Errors during a preprocessor directive can only affect the layout of the
456 // preprocessor directive, and thus we ignore them. An alternative approach
457 // would be to use the same approach we use on the file level (no
458 // re-indentation if there was a structural error) within the macro
459 // definition.
Manuel Klimekd4397b92013-01-04 23:34:14 +0000460 parseFile();
461}
462
463void UnwrappedLineParser::parsePPUnknown() {
Manuel Klimeka080a182013-01-02 16:30:12 +0000464 do {
Manuel Klimeka080a182013-01-02 16:30:12 +0000465 nextToken();
466 } while (!eof());
467 addUnwrappedLine();
Daniel Jasperbac016b2012-12-03 18:12:45 +0000468}
469
Alexander Kornienko99b0e142013-04-09 16:15:19 +0000470// Here we blacklist certain tokens that are not usually the first token in an
471// unwrapped line. This is used in attempt to distinguish macro calls without
472// trailing semicolons from other constructs split to several lines.
473bool tokenCanStartNewLine(clang::Token Tok) {
474 // Semicolon can be a null-statement, l_square can be a start of a macro or
475 // a C++11 attribute, but this doesn't seem to be common.
476 return Tok.isNot(tok::semi) && Tok.isNot(tok::l_brace) &&
477 Tok.isNot(tok::l_square) &&
478 // Tokens that can only be used as binary operators and a part of
479 // overloaded operator names.
480 Tok.isNot(tok::period) && Tok.isNot(tok::periodstar) &&
481 Tok.isNot(tok::arrow) && Tok.isNot(tok::arrowstar) &&
482 Tok.isNot(tok::less) && Tok.isNot(tok::greater) &&
483 Tok.isNot(tok::slash) && Tok.isNot(tok::percent) &&
484 Tok.isNot(tok::lessless) && Tok.isNot(tok::greatergreater) &&
485 Tok.isNot(tok::equal) && Tok.isNot(tok::plusequal) &&
486 Tok.isNot(tok::minusequal) && Tok.isNot(tok::starequal) &&
487 Tok.isNot(tok::slashequal) && Tok.isNot(tok::percentequal) &&
488 Tok.isNot(tok::ampequal) && Tok.isNot(tok::pipeequal) &&
489 Tok.isNot(tok::caretequal) && Tok.isNot(tok::greatergreaterequal) &&
490 Tok.isNot(tok::lesslessequal) &&
491 // Colon is used in labels, base class lists, initializer lists,
492 // range-based for loops, ternary operator, but should never be the
493 // first token in an unwrapped line.
494 Tok.isNot(tok::colon);
495}
496
Manuel Klimekf0ab0a32013-01-07 14:56:16 +0000497void UnwrappedLineParser::parseStructuralElement() {
Manuel Klimek96e888b2013-05-28 11:55:06 +0000498 assert(!FormatTok->Tok.is(tok::l_brace));
499 switch (FormatTok->Tok.getKind()) {
Nico Weber6092d4e2013-01-07 19:05:19 +0000500 case tok::at:
501 nextToken();
Manuel Klimek96e888b2013-05-28 11:55:06 +0000502 if (FormatTok->Tok.is(tok::l_brace)) {
Nico Weberd74fcdb2013-02-10 20:35:35 +0000503 parseBracedList();
504 break;
505 }
Manuel Klimek96e888b2013-05-28 11:55:06 +0000506 switch (FormatTok->Tok.getObjCKeywordID()) {
Nico Weber6092d4e2013-01-07 19:05:19 +0000507 case tok::objc_public:
508 case tok::objc_protected:
509 case tok::objc_package:
510 case tok::objc_private:
511 return parseAccessSpecifier();
Nico Weber27d13672013-01-09 20:25:35 +0000512 case tok::objc_interface:
Nico Weber50767d82013-01-09 23:25:37 +0000513 case tok::objc_implementation:
514 return parseObjCInterfaceOrImplementation();
Nico Weber1abe6ea2013-01-09 21:15:03 +0000515 case tok::objc_protocol:
516 return parseObjCProtocol();
Nico Weber049c4472013-01-09 21:42:32 +0000517 case tok::objc_end:
518 return; // Handled by the caller.
Nico Weberb530fa32013-01-10 00:25:19 +0000519 case tok::objc_optional:
520 case tok::objc_required:
521 nextToken();
522 addUnwrappedLine();
523 return;
Nico Weber6092d4e2013-01-07 19:05:19 +0000524 default:
525 break;
526 }
527 break;
Alexander Kornienko15757312012-12-06 18:03:27 +0000528 case tok::kw_namespace:
529 parseNamespace();
530 return;
Dmitri Gribenko1f94f2b2012-12-30 21:27:25 +0000531 case tok::kw_inline:
532 nextToken();
Manuel Klimek96e888b2013-05-28 11:55:06 +0000533 if (FormatTok->Tok.is(tok::kw_namespace)) {
Dmitri Gribenko1f94f2b2012-12-30 21:27:25 +0000534 parseNamespace();
535 return;
536 }
537 break;
Alexander Kornienkoa166e732012-12-04 14:46:19 +0000538 case tok::kw_public:
539 case tok::kw_protected:
540 case tok::kw_private:
Daniel Jasperbac016b2012-12-03 18:12:45 +0000541 parseAccessSpecifier();
542 return;
Alexander Kornienkoa166e732012-12-04 14:46:19 +0000543 case tok::kw_if:
544 parseIfThenElse();
Daniel Jasperbac016b2012-12-03 18:12:45 +0000545 return;
Alexander Kornienko2e97cfc2012-12-05 15:06:06 +0000546 case tok::kw_for:
547 case tok::kw_while:
548 parseForOrWhileLoop();
549 return;
Alexander Kornienkoa166e732012-12-04 14:46:19 +0000550 case tok::kw_do:
551 parseDoWhile();
552 return;
553 case tok::kw_switch:
554 parseSwitch();
555 return;
556 case tok::kw_default:
557 nextToken();
558 parseLabel();
559 return;
560 case tok::kw_case:
561 parseCaseLabel();
562 return;
Manuel Klimekc44ee892013-01-21 10:07:49 +0000563 case tok::kw_return:
564 parseReturn();
565 return;
Manuel Klimekd19dc2d2013-01-21 14:32:05 +0000566 case tok::kw_extern:
567 nextToken();
Manuel Klimek96e888b2013-05-28 11:55:06 +0000568 if (FormatTok->Tok.is(tok::string_literal)) {
Manuel Klimekd19dc2d2013-01-21 14:32:05 +0000569 nextToken();
Manuel Klimek96e888b2013-05-28 11:55:06 +0000570 if (FormatTok->Tok.is(tok::l_brace)) {
Daniel Jaspereff18b92013-07-31 23:16:02 +0000571 parseBlock(/*MustBeDeclaration=*/true, /*AddLevel=*/false);
Manuel Klimekd19dc2d2013-01-21 14:32:05 +0000572 addUnwrappedLine();
573 return;
574 }
575 }
576 // In all other cases, parse the declaration.
577 break;
Alexander Kornienkoa166e732012-12-04 14:46:19 +0000578 default:
579 break;
Daniel Jasperbac016b2012-12-03 18:12:45 +0000580 }
Daniel Jasperbac016b2012-12-03 18:12:45 +0000581 do {
Manuel Klimek96e888b2013-05-28 11:55:06 +0000582 switch (FormatTok->Tok.getKind()) {
Nico Weberd74fcdb2013-02-10 20:35:35 +0000583 case tok::at:
584 nextToken();
Manuel Klimek96e888b2013-05-28 11:55:06 +0000585 if (FormatTok->Tok.is(tok::l_brace))
Nico Weberd74fcdb2013-02-10 20:35:35 +0000586 parseBracedList();
587 break;
Alexander Kornienkoa166e732012-12-04 14:46:19 +0000588 case tok::kw_enum:
589 parseEnum();
Manuel Klimek308232c2013-01-21 19:17:52 +0000590 break;
Alexander Kornienkod8818752013-01-16 11:43:46 +0000591 case tok::kw_struct:
592 case tok::kw_union:
Manuel Klimekde768542013-01-07 18:10:23 +0000593 case tok::kw_class:
Manuel Klimek47ea7f62013-01-15 13:38:33 +0000594 parseRecord();
595 // A record declaration or definition is always the start of a structural
596 // element.
597 break;
Daniel Jasperbac016b2012-12-03 18:12:45 +0000598 case tok::semi:
599 nextToken();
600 addUnwrappedLine();
601 return;
Alexander Kornienkod8818752013-01-16 11:43:46 +0000602 case tok::r_brace:
603 addUnwrappedLine();
604 return;
Daniel Jasperbac016b2012-12-03 18:12:45 +0000605 case tok::l_paren:
606 parseParens();
607 break;
Manuel Klimek753a5112013-09-04 13:25:30 +0000608 case tok::caret:
609 nextToken();
610 if (FormatTok->is(tok::l_brace)) {
611 parseChildBlock();
612 }
613 break;
Daniel Jasperbac016b2012-12-03 18:12:45 +0000614 case tok::l_brace:
Manuel Klimek80829bd2013-05-23 09:41:43 +0000615 if (!tryToParseBracedList()) {
616 // A block outside of parentheses must be the last part of a
617 // structural element.
618 // FIXME: Figure out cases where this is not true, and add projections
619 // for them (the one we know is missing are lambdas).
620 if (Style.BreakBeforeBraces == FormatStyle::BS_Linux ||
Manuel Klimeke4907052013-08-02 21:31:59 +0000621 Style.BreakBeforeBraces == FormatStyle::BS_Stroustrup ||
622 Style.BreakBeforeBraces == FormatStyle::BS_Allman)
Manuel Klimek80829bd2013-05-23 09:41:43 +0000623 addUnwrappedLine();
Nico Weber27268772013-06-26 00:30:14 +0000624 parseBlock(/*MustBeDeclaration=*/false);
Manuel Klimek44135b82013-05-13 12:51:40 +0000625 addUnwrappedLine();
Manuel Klimek80829bd2013-05-23 09:41:43 +0000626 return;
627 }
628 // Otherwise this was a braced init list, and the structural
629 // element continues.
630 break;
Daniel Jasper7e70f4c2013-05-29 13:16:10 +0000631 case tok::identifier: {
632 StringRef Text = FormatTok->TokenText;
Daniel Jasperbac016b2012-12-03 18:12:45 +0000633 nextToken();
Alexander Kornienko3d713a72013-04-08 22:16:06 +0000634 if (Line->Tokens.size() == 1) {
Manuel Klimek96e888b2013-05-28 11:55:06 +0000635 if (FormatTok->Tok.is(tok::colon)) {
Alexander Kornienko3d713a72013-04-08 22:16:06 +0000636 parseLabel();
637 return;
638 }
Alexander Kornienko99b0e142013-04-09 16:15:19 +0000639 // Recognize function-like macro usages without trailing semicolon.
Manuel Klimek96e888b2013-05-28 11:55:06 +0000640 if (FormatTok->Tok.is(tok::l_paren)) {
Alexander Kornienko3d713a72013-04-08 22:16:06 +0000641 parseParens();
Manuel Klimek96e888b2013-05-28 11:55:06 +0000642 if (FormatTok->HasUnescapedNewline &&
643 tokenCanStartNewLine(FormatTok->Tok)) {
Alexander Kornienko3d713a72013-04-08 22:16:06 +0000644 addUnwrappedLine();
645 return;
646 }
Daniel Jasper7e70f4c2013-05-29 13:16:10 +0000647 } else if (FormatTok->HasUnescapedNewline && Text.size() >= 5 &&
648 Text == Text.upper()) {
649 // Recognize free-standing macros like Q_OBJECT.
650 addUnwrappedLine();
Daniel Jasperc76d59d2013-05-29 14:09:17 +0000651 return;
Alexander Kornienko3d713a72013-04-08 22:16:06 +0000652 }
Daniel Jasperbac016b2012-12-03 18:12:45 +0000653 }
654 break;
Daniel Jasper7e70f4c2013-05-29 13:16:10 +0000655 }
Daniel Jasper05b1ac82012-12-17 11:29:41 +0000656 case tok::equal:
657 nextToken();
Manuel Klimek96e888b2013-05-28 11:55:06 +0000658 if (FormatTok->Tok.is(tok::l_brace)) {
Manuel Klimekbb42bf12013-01-10 11:52:21 +0000659 parseBracedList();
660 }
Daniel Jasper05b1ac82012-12-17 11:29:41 +0000661 break;
Manuel Klimekb61a8af2013-09-03 15:10:01 +0000662 case tok::l_square:
663 tryToParseLambda();
664 break;
Alexander Kornienkoa166e732012-12-04 14:46:19 +0000665 default:
666 nextToken();
667 break;
Daniel Jasperbac016b2012-12-03 18:12:45 +0000668 }
669 } while (!eof());
670}
671
Manuel Klimekb61a8af2013-09-03 15:10:01 +0000672void UnwrappedLineParser::tryToParseLambda() {
673 if (!tryToParseLambdaIntroducer()) {
674 return;
675 }
676 if (FormatTok->is(tok::l_paren)) {
677 parseParens();
678 }
679
680 while (FormatTok->isNot(tok::l_brace)) {
681 switch (FormatTok->Tok.getKind()) {
682 case tok::l_brace:
683 break;
684 return;
685 case tok::l_paren:
686 parseParens();
687 break;
688 case tok::semi:
689 case tok::equal:
690 case tok::eof:
691 return;
692 default:
693 nextToken();
694 break;
695 }
696 }
Manuel Klimek753a5112013-09-04 13:25:30 +0000697 parseChildBlock();
Manuel Klimekb61a8af2013-09-03 15:10:01 +0000698}
699
700bool UnwrappedLineParser::tryToParseLambdaIntroducer() {
701 nextToken();
702 if (FormatTok->is(tok::equal)) {
703 nextToken();
704 if (FormatTok->is(tok::r_square)) return true;
705 if (FormatTok->isNot(tok::comma)) return false;
706 nextToken();
707 } else if (FormatTok->is(tok::amp)) {
708 nextToken();
709 if (FormatTok->is(tok::r_square)) return true;
710 if (!FormatTok->isOneOf(tok::comma, tok::identifier)) {
711 return false;
712 }
713 if (FormatTok->is(tok::comma)) nextToken();
714 } else if (FormatTok->is(tok::r_square)) {
715 nextToken();
716 return true;
717 }
718 do {
719 if (FormatTok->is(tok::amp)) nextToken();
720 if (!FormatTok->isOneOf(tok::identifier, tok::kw_this)) return false;
721 nextToken();
722 if (FormatTok->is(tok::comma)) {
723 nextToken();
724 } else if (FormatTok->is(tok::r_square)) {
725 nextToken();
726 return true;
727 } else {
728 return false;
729 }
730 } while (!eof());
731 return false;
732}
733
Manuel Klimek80829bd2013-05-23 09:41:43 +0000734bool UnwrappedLineParser::tryToParseBracedList() {
Daniel Jasper0de1c4d2013-07-09 09:06:29 +0000735 if (FormatTok->BlockKind == BK_Unknown)
Manuel Klimek80829bd2013-05-23 09:41:43 +0000736 calculateBraceTypes();
Daniel Jasper0de1c4d2013-07-09 09:06:29 +0000737 assert(FormatTok->BlockKind != BK_Unknown);
738 if (FormatTok->BlockKind == BK_Block)
Manuel Klimek80829bd2013-05-23 09:41:43 +0000739 return false;
740 parseBracedList();
741 return true;
742}
743
Manuel Klimekbb42bf12013-01-10 11:52:21 +0000744void UnwrappedLineParser::parseBracedList() {
745 nextToken();
746
Manuel Klimek423dd932013-04-10 09:52:05 +0000747 // FIXME: Once we have an expression parser in the UnwrappedLineParser,
748 // replace this by using parseAssigmentExpression() inside.
Manuel Klimekbb42bf12013-01-10 11:52:21 +0000749 do {
Manuel Klimek423dd932013-04-10 09:52:05 +0000750 // FIXME: When we start to support lambdas, we'll want to parse them away
751 // here, otherwise our bail-out scenarios below break. The better solution
752 // might be to just implement a more or less complete expression parser.
Manuel Klimek96e888b2013-05-28 11:55:06 +0000753 switch (FormatTok->Tok.getKind()) {
Manuel Klimek753a5112013-09-04 13:25:30 +0000754 case tok::caret:
755 nextToken();
756 if (FormatTok->is(tok::l_brace)) {
757 parseChildBlock();
758 }
759 break;
760 case tok::l_square:
761 tryToParseLambda();
762 break;
Manuel Klimekbb42bf12013-01-10 11:52:21 +0000763 case tok::l_brace:
Manuel Klimek31e44f72013-09-04 08:20:47 +0000764 // Assume there are no blocks inside a braced init list apart
765 // from the ones we explicitly parse out (like lambdas).
766 FormatTok->BlockKind = BK_BracedInit;
Manuel Klimekbb42bf12013-01-10 11:52:21 +0000767 parseBracedList();
768 break;
769 case tok::r_brace:
770 nextToken();
771 return;
Manuel Klimek423dd932013-04-10 09:52:05 +0000772 case tok::semi:
773 // Probably a missing closing brace. Bail out.
774 return;
775 case tok::comma:
776 nextToken();
Manuel Klimek423dd932013-04-10 09:52:05 +0000777 break;
Manuel Klimekbb42bf12013-01-10 11:52:21 +0000778 default:
779 nextToken();
780 break;
781 }
782 } while (!eof());
783}
784
Manuel Klimekc44ee892013-01-21 10:07:49 +0000785void UnwrappedLineParser::parseReturn() {
786 nextToken();
787
788 do {
Manuel Klimek96e888b2013-05-28 11:55:06 +0000789 switch (FormatTok->Tok.getKind()) {
Manuel Klimekc44ee892013-01-21 10:07:49 +0000790 case tok::l_brace:
791 parseBracedList();
Manuel Klimek96e888b2013-05-28 11:55:06 +0000792 if (FormatTok->Tok.isNot(tok::semi)) {
Manuel Klimek423dd932013-04-10 09:52:05 +0000793 // Assume missing ';'.
794 addUnwrappedLine();
795 return;
796 }
Manuel Klimekc44ee892013-01-21 10:07:49 +0000797 break;
798 case tok::l_paren:
799 parseParens();
800 break;
801 case tok::r_brace:
802 // Assume missing ';'.
803 addUnwrappedLine();
804 return;
805 case tok::semi:
806 nextToken();
807 addUnwrappedLine();
808 return;
Manuel Klimekb61a8af2013-09-03 15:10:01 +0000809 case tok::l_square:
810 tryToParseLambda();
811 break;
Manuel Klimekc44ee892013-01-21 10:07:49 +0000812 default:
813 nextToken();
814 break;
815 }
816 } while (!eof());
817}
818
Daniel Jasperbac016b2012-12-03 18:12:45 +0000819void UnwrappedLineParser::parseParens() {
Manuel Klimek96e888b2013-05-28 11:55:06 +0000820 assert(FormatTok->Tok.is(tok::l_paren) && "'(' expected.");
Daniel Jasperbac016b2012-12-03 18:12:45 +0000821 nextToken();
822 do {
Manuel Klimek96e888b2013-05-28 11:55:06 +0000823 switch (FormatTok->Tok.getKind()) {
Daniel Jasperbac016b2012-12-03 18:12:45 +0000824 case tok::l_paren:
825 parseParens();
826 break;
827 case tok::r_paren:
828 nextToken();
829 return;
Daniel Jasperf7ec1cc2013-05-31 14:56:29 +0000830 case tok::r_brace:
831 // A "}" inside parenthesis is an error if there wasn't a matching "{".
832 return;
Nico Weber2afbe522013-02-10 04:38:23 +0000833 case tok::l_brace: {
Manuel Klimek80829bd2013-05-23 09:41:43 +0000834 if (!tryToParseBracedList()) {
Manuel Klimekb7d98a12013-09-04 13:34:14 +0000835 parseChildBlock();
Manuel Klimek80829bd2013-05-23 09:41:43 +0000836 }
Manuel Klimekbb42bf12013-01-10 11:52:21 +0000837 break;
Nico Weber2afbe522013-02-10 04:38:23 +0000838 }
Nico Weberd74fcdb2013-02-10 20:35:35 +0000839 case tok::at:
840 nextToken();
Manuel Klimek96e888b2013-05-28 11:55:06 +0000841 if (FormatTok->Tok.is(tok::l_brace))
Nico Weberd74fcdb2013-02-10 20:35:35 +0000842 parseBracedList();
843 break;
Daniel Jasperbac016b2012-12-03 18:12:45 +0000844 default:
845 nextToken();
846 break;
847 }
848 } while (!eof());
849}
850
851void UnwrappedLineParser::parseIfThenElse() {
Manuel Klimek96e888b2013-05-28 11:55:06 +0000852 assert(FormatTok->Tok.is(tok::kw_if) && "'if' expected");
Daniel Jasperbac016b2012-12-03 18:12:45 +0000853 nextToken();
Manuel Klimek96e888b2013-05-28 11:55:06 +0000854 if (FormatTok->Tok.is(tok::l_paren))
Manuel Klimekd4658432013-01-11 18:28:36 +0000855 parseParens();
Daniel Jasperbac016b2012-12-03 18:12:45 +0000856 bool NeedsUnwrappedLine = false;
Manuel Klimek96e888b2013-05-28 11:55:06 +0000857 if (FormatTok->Tok.is(tok::l_brace)) {
Manuel Klimeke4907052013-08-02 21:31:59 +0000858 if (Style.BreakBeforeBraces == FormatStyle::BS_Allman)
859 addUnwrappedLine();
Nico Weber27268772013-06-26 00:30:14 +0000860 parseBlock(/*MustBeDeclaration=*/false);
Manuel Klimeke4907052013-08-02 21:31:59 +0000861 if (Style.BreakBeforeBraces == FormatStyle::BS_Allman)
862 addUnwrappedLine();
863 else
864 NeedsUnwrappedLine = true;
Daniel Jasperbac016b2012-12-03 18:12:45 +0000865 } else {
866 addUnwrappedLine();
Manuel Klimek526ed112013-01-09 15:25:02 +0000867 ++Line->Level;
Manuel Klimekf0ab0a32013-01-07 14:56:16 +0000868 parseStructuralElement();
Manuel Klimek526ed112013-01-09 15:25:02 +0000869 --Line->Level;
Daniel Jasperbac016b2012-12-03 18:12:45 +0000870 }
Manuel Klimek96e888b2013-05-28 11:55:06 +0000871 if (FormatTok->Tok.is(tok::kw_else)) {
Daniel Jasperbac016b2012-12-03 18:12:45 +0000872 nextToken();
Manuel Klimek96e888b2013-05-28 11:55:06 +0000873 if (FormatTok->Tok.is(tok::l_brace)) {
Manuel Klimeke4907052013-08-02 21:31:59 +0000874 if (Style.BreakBeforeBraces == FormatStyle::BS_Allman)
875 addUnwrappedLine();
Nico Weber27268772013-06-26 00:30:14 +0000876 parseBlock(/*MustBeDeclaration=*/false);
Daniel Jasperbac016b2012-12-03 18:12:45 +0000877 addUnwrappedLine();
Manuel Klimek96e888b2013-05-28 11:55:06 +0000878 } else if (FormatTok->Tok.is(tok::kw_if)) {
Daniel Jasperbac016b2012-12-03 18:12:45 +0000879 parseIfThenElse();
880 } else {
881 addUnwrappedLine();
Manuel Klimek526ed112013-01-09 15:25:02 +0000882 ++Line->Level;
Manuel Klimekf0ab0a32013-01-07 14:56:16 +0000883 parseStructuralElement();
Manuel Klimek526ed112013-01-09 15:25:02 +0000884 --Line->Level;
Daniel Jasperbac016b2012-12-03 18:12:45 +0000885 }
886 } else if (NeedsUnwrappedLine) {
887 addUnwrappedLine();
888 }
889}
890
Alexander Kornienko15757312012-12-06 18:03:27 +0000891void UnwrappedLineParser::parseNamespace() {
Manuel Klimek96e888b2013-05-28 11:55:06 +0000892 assert(FormatTok->Tok.is(tok::kw_namespace) && "'namespace' expected");
Alexander Kornienko15757312012-12-06 18:03:27 +0000893 nextToken();
Manuel Klimek96e888b2013-05-28 11:55:06 +0000894 if (FormatTok->Tok.is(tok::identifier))
Alexander Kornienko15757312012-12-06 18:03:27 +0000895 nextToken();
Manuel Klimek96e888b2013-05-28 11:55:06 +0000896 if (FormatTok->Tok.is(tok::l_brace)) {
Manuel Klimeke4907052013-08-02 21:31:59 +0000897 if (Style.BreakBeforeBraces == FormatStyle::BS_Linux ||
898 Style.BreakBeforeBraces == FormatStyle::BS_Allman)
Manuel Klimek44135b82013-05-13 12:51:40 +0000899 addUnwrappedLine();
900
Daniel Jaspereff18b92013-07-31 23:16:02 +0000901 bool AddLevel = Style.NamespaceIndentation == FormatStyle::NI_All ||
902 (Style.NamespaceIndentation == FormatStyle::NI_Inner &&
903 DeclarationScopeStack.size() > 1);
904 parseBlock(/*MustBeDeclaration=*/true, AddLevel);
Manuel Klimek7fc2db02013-02-06 16:08:09 +0000905 // Munch the semicolon after a namespace. This is more common than one would
906 // think. Puttin the semicolon into its own line is very ugly.
Manuel Klimek96e888b2013-05-28 11:55:06 +0000907 if (FormatTok->Tok.is(tok::semi))
Manuel Klimek7fc2db02013-02-06 16:08:09 +0000908 nextToken();
Alexander Kornienko15757312012-12-06 18:03:27 +0000909 addUnwrappedLine();
910 }
911 // FIXME: Add error handling.
912}
913
Alexander Kornienko2e97cfc2012-12-05 15:06:06 +0000914void UnwrappedLineParser::parseForOrWhileLoop() {
Manuel Klimek96e888b2013-05-28 11:55:06 +0000915 assert((FormatTok->Tok.is(tok::kw_for) || FormatTok->Tok.is(tok::kw_while)) &&
Alexander Kornienko2e97cfc2012-12-05 15:06:06 +0000916 "'for' or 'while' expected");
917 nextToken();
Manuel Klimek96e888b2013-05-28 11:55:06 +0000918 if (FormatTok->Tok.is(tok::l_paren))
Manuel Klimek6eca03f2013-01-11 19:23:05 +0000919 parseParens();
Manuel Klimek96e888b2013-05-28 11:55:06 +0000920 if (FormatTok->Tok.is(tok::l_brace)) {
Manuel Klimeke4907052013-08-02 21:31:59 +0000921 if (Style.BreakBeforeBraces == FormatStyle::BS_Allman)
922 addUnwrappedLine();
Nico Weber27268772013-06-26 00:30:14 +0000923 parseBlock(/*MustBeDeclaration=*/false);
Alexander Kornienko2e97cfc2012-12-05 15:06:06 +0000924 addUnwrappedLine();
925 } else {
926 addUnwrappedLine();
Manuel Klimek526ed112013-01-09 15:25:02 +0000927 ++Line->Level;
Manuel Klimekf0ab0a32013-01-07 14:56:16 +0000928 parseStructuralElement();
Manuel Klimek526ed112013-01-09 15:25:02 +0000929 --Line->Level;
Alexander Kornienko2e97cfc2012-12-05 15:06:06 +0000930 }
931}
932
Daniel Jasperbac016b2012-12-03 18:12:45 +0000933void UnwrappedLineParser::parseDoWhile() {
Manuel Klimek96e888b2013-05-28 11:55:06 +0000934 assert(FormatTok->Tok.is(tok::kw_do) && "'do' expected");
Daniel Jasperbac016b2012-12-03 18:12:45 +0000935 nextToken();
Manuel Klimek96e888b2013-05-28 11:55:06 +0000936 if (FormatTok->Tok.is(tok::l_brace)) {
Manuel Klimeke4907052013-08-02 21:31:59 +0000937 if (Style.BreakBeforeBraces == FormatStyle::BS_Allman)
938 addUnwrappedLine();
Nico Weber27268772013-06-26 00:30:14 +0000939 parseBlock(/*MustBeDeclaration=*/false);
Daniel Jasperbac016b2012-12-03 18:12:45 +0000940 } else {
941 addUnwrappedLine();
Manuel Klimek526ed112013-01-09 15:25:02 +0000942 ++Line->Level;
Manuel Klimekf0ab0a32013-01-07 14:56:16 +0000943 parseStructuralElement();
Manuel Klimek526ed112013-01-09 15:25:02 +0000944 --Line->Level;
Daniel Jasperbac016b2012-12-03 18:12:45 +0000945 }
946
Alexander Kornienko393b0082012-12-04 15:40:36 +0000947 // FIXME: Add error handling.
Manuel Klimek96e888b2013-05-28 11:55:06 +0000948 if (!FormatTok->Tok.is(tok::kw_while)) {
Alexander Kornienko393b0082012-12-04 15:40:36 +0000949 addUnwrappedLine();
950 return;
951 }
952
Daniel Jasperbac016b2012-12-03 18:12:45 +0000953 nextToken();
Manuel Klimekf0ab0a32013-01-07 14:56:16 +0000954 parseStructuralElement();
Daniel Jasperbac016b2012-12-03 18:12:45 +0000955}
956
957void UnwrappedLineParser::parseLabel() {
Daniel Jasperbac016b2012-12-03 18:12:45 +0000958 nextToken();
Manuel Klimek526ed112013-01-09 15:25:02 +0000959 unsigned OldLineLevel = Line->Level;
Daniel Jasperbcca7e42013-03-20 10:23:53 +0000960 if (Line->Level > 1 || (!Line->InPPDirective && Line->Level > 0))
Manuel Klimek526ed112013-01-09 15:25:02 +0000961 --Line->Level;
Manuel Klimek96e888b2013-05-28 11:55:06 +0000962 if (CommentsBeforeNextToken.empty() && FormatTok->Tok.is(tok::l_brace)) {
Manuel Klimeke4907052013-08-02 21:31:59 +0000963 if (Style.BreakBeforeBraces == FormatStyle::BS_Allman)
964 addUnwrappedLine();
Nico Weber27268772013-06-26 00:30:14 +0000965 parseBlock(/*MustBeDeclaration=*/false);
Manuel Klimeke4907052013-08-02 21:31:59 +0000966 if (FormatTok->Tok.is(tok::kw_break)) {
967 // "break;" after "}" on its own line only for BS_Allman
968 if (Style.BreakBeforeBraces == FormatStyle::BS_Allman)
969 addUnwrappedLine();
970 parseStructuralElement();
971 }
Daniel Jasperbac016b2012-12-03 18:12:45 +0000972 }
973 addUnwrappedLine();
Manuel Klimek526ed112013-01-09 15:25:02 +0000974 Line->Level = OldLineLevel;
Daniel Jasperbac016b2012-12-03 18:12:45 +0000975}
976
977void UnwrappedLineParser::parseCaseLabel() {
Manuel Klimek96e888b2013-05-28 11:55:06 +0000978 assert(FormatTok->Tok.is(tok::kw_case) && "'case' expected");
Daniel Jasperbac016b2012-12-03 18:12:45 +0000979 // FIXME: fix handling of complex expressions here.
980 do {
981 nextToken();
Manuel Klimek96e888b2013-05-28 11:55:06 +0000982 } while (!eof() && !FormatTok->Tok.is(tok::colon));
Daniel Jasperbac016b2012-12-03 18:12:45 +0000983 parseLabel();
984}
985
986void UnwrappedLineParser::parseSwitch() {
Manuel Klimek96e888b2013-05-28 11:55:06 +0000987 assert(FormatTok->Tok.is(tok::kw_switch) && "'switch' expected");
Daniel Jasperbac016b2012-12-03 18:12:45 +0000988 nextToken();
Manuel Klimek96e888b2013-05-28 11:55:06 +0000989 if (FormatTok->Tok.is(tok::l_paren))
Manuel Klimek6eca03f2013-01-11 19:23:05 +0000990 parseParens();
Manuel Klimek96e888b2013-05-28 11:55:06 +0000991 if (FormatTok->Tok.is(tok::l_brace)) {
Manuel Klimeke4907052013-08-02 21:31:59 +0000992 if (Style.BreakBeforeBraces == FormatStyle::BS_Allman)
993 addUnwrappedLine();
Daniel Jaspereff18b92013-07-31 23:16:02 +0000994 parseBlock(/*MustBeDeclaration=*/false);
Daniel Jasperbac016b2012-12-03 18:12:45 +0000995 addUnwrappedLine();
996 } else {
997 addUnwrappedLine();
Daniel Jaspere865cc52013-07-25 11:31:57 +0000998 ++Line->Level;
Manuel Klimekf0ab0a32013-01-07 14:56:16 +0000999 parseStructuralElement();
Daniel Jaspere865cc52013-07-25 11:31:57 +00001000 --Line->Level;
Daniel Jasperbac016b2012-12-03 18:12:45 +00001001 }
1002}
1003
1004void UnwrappedLineParser::parseAccessSpecifier() {
1005 nextToken();
Alexander Kornienko56e49c52012-12-10 16:34:48 +00001006 // Otherwise, we don't know what it is, and we'd better keep the next token.
Manuel Klimek96e888b2013-05-28 11:55:06 +00001007 if (FormatTok->Tok.is(tok::colon))
Alexander Kornienko56e49c52012-12-10 16:34:48 +00001008 nextToken();
Daniel Jasperbac016b2012-12-03 18:12:45 +00001009 addUnwrappedLine();
1010}
1011
1012void UnwrappedLineParser::parseEnum() {
Manuel Klimek308232c2013-01-21 19:17:52 +00001013 nextToken();
Daniel Jaspercbeb1c62013-08-20 12:42:50 +00001014 // Eat up enum class ...
1015 if (FormatTok->Tok.is(tok::kw_class) ||
1016 FormatTok->Tok.is(tok::kw_struct))
1017 nextToken();
Manuel Klimek96e888b2013-05-28 11:55:06 +00001018 if (FormatTok->Tok.is(tok::identifier) ||
1019 FormatTok->Tok.is(tok::kw___attribute) ||
1020 FormatTok->Tok.is(tok::kw___declspec)) {
Manuel Klimek308232c2013-01-21 19:17:52 +00001021 nextToken();
1022 // We can have macros or attributes in between 'enum' and the enum name.
Manuel Klimek96e888b2013-05-28 11:55:06 +00001023 if (FormatTok->Tok.is(tok::l_paren)) {
Alexander Kornienkoa166e732012-12-04 14:46:19 +00001024 parseParens();
Daniel Jasperbac016b2012-12-03 18:12:45 +00001025 }
Manuel Klimek96e888b2013-05-28 11:55:06 +00001026 if (FormatTok->Tok.is(tok::identifier))
Manuel Klimek308232c2013-01-21 19:17:52 +00001027 nextToken();
1028 }
Daniel Jasper4b434cf2013-08-30 10:10:19 +00001029 bool HasError = false;
Manuel Klimek96e888b2013-05-28 11:55:06 +00001030 if (FormatTok->Tok.is(tok::l_brace)) {
Manuel Klimekd3a247c2013-08-07 19:20:45 +00001031 if (Style.BreakBeforeBraces == FormatStyle::BS_Allman)
1032 addUnwrappedLine();
Manuel Klimek308232c2013-01-21 19:17:52 +00001033 nextToken();
1034 addUnwrappedLine();
1035 ++Line->Level;
1036 do {
Manuel Klimek96e888b2013-05-28 11:55:06 +00001037 switch (FormatTok->Tok.getKind()) {
Manuel Klimek308232c2013-01-21 19:17:52 +00001038 case tok::l_paren:
1039 parseParens();
1040 break;
1041 case tok::r_brace:
1042 addUnwrappedLine();
1043 nextToken();
1044 --Line->Level;
Daniel Jasper4b434cf2013-08-30 10:10:19 +00001045 if (HasError) {
1046 if (FormatTok->is(tok::semi))
1047 nextToken();
1048 addUnwrappedLine();
1049 }
Manuel Klimek308232c2013-01-21 19:17:52 +00001050 return;
Daniel Jasper4b434cf2013-08-30 10:10:19 +00001051 case tok::semi:
1052 HasError = true;
1053 nextToken();
1054 addUnwrappedLine();
1055 break;
Manuel Klimek308232c2013-01-21 19:17:52 +00001056 case tok::comma:
1057 nextToken();
1058 addUnwrappedLine();
1059 break;
1060 default:
1061 nextToken();
1062 break;
1063 }
1064 } while (!eof());
1065 }
1066 // We fall through to parsing a structural element afterwards, so that in
1067 // enum A {} n, m;
1068 // "} n, m;" will end up in one unwrapped line.
Daniel Jasperbac016b2012-12-03 18:12:45 +00001069}
1070
Manuel Klimek47ea7f62013-01-15 13:38:33 +00001071void UnwrappedLineParser::parseRecord() {
Manuel Klimekde768542013-01-07 18:10:23 +00001072 nextToken();
Manuel Klimek96e888b2013-05-28 11:55:06 +00001073 if (FormatTok->Tok.is(tok::identifier) ||
1074 FormatTok->Tok.is(tok::kw___attribute) ||
1075 FormatTok->Tok.is(tok::kw___declspec)) {
Manuel Klimek47ea7f62013-01-15 13:38:33 +00001076 nextToken();
1077 // We can have macros or attributes in between 'class' and the class name.
Manuel Klimek96e888b2013-05-28 11:55:06 +00001078 if (FormatTok->Tok.is(tok::l_paren)) {
Manuel Klimek47ea7f62013-01-15 13:38:33 +00001079 parseParens();
Manuel Klimekde768542013-01-07 18:10:23 +00001080 }
Manuel Klimekb8b1ce12013-02-06 15:57:54 +00001081 // The actual identifier can be a nested name specifier, and in macros
1082 // it is often token-pasted.
Manuel Klimek96e888b2013-05-28 11:55:06 +00001083 while (FormatTok->Tok.is(tok::identifier) ||
1084 FormatTok->Tok.is(tok::coloncolon) ||
1085 FormatTok->Tok.is(tok::hashhash))
Manuel Klimek47ea7f62013-01-15 13:38:33 +00001086 nextToken();
1087
Manuel Klimek3a3408c2013-01-21 13:58:54 +00001088 // Note that parsing away template declarations here leads to incorrectly
1089 // accepting function declarations as record declarations.
1090 // In general, we cannot solve this problem. Consider:
1091 // class A<int> B() {}
1092 // which can be a function definition or a class definition when B() is a
1093 // macro. If we find enough real-world cases where this is a problem, we
1094 // can parse for the 'template' keyword in the beginning of the statement,
1095 // and thus rule out the record production in case there is no template
1096 // (this would still leave us with an ambiguity between template function
1097 // and class declarations).
Manuel Klimek96e888b2013-05-28 11:55:06 +00001098 if (FormatTok->Tok.is(tok::colon) || FormatTok->Tok.is(tok::less)) {
1099 while (!eof() && FormatTok->Tok.isNot(tok::l_brace)) {
1100 if (FormatTok->Tok.is(tok::semi))
Manuel Klimek47ea7f62013-01-15 13:38:33 +00001101 return;
1102 nextToken();
1103 }
1104 }
1105 }
Manuel Klimek96e888b2013-05-28 11:55:06 +00001106 if (FormatTok->Tok.is(tok::l_brace)) {
Manuel Klimeke4907052013-08-02 21:31:59 +00001107 if (Style.BreakBeforeBraces == FormatStyle::BS_Linux ||
1108 Style.BreakBeforeBraces == FormatStyle::BS_Allman)
Manuel Klimek44135b82013-05-13 12:51:40 +00001109 addUnwrappedLine();
1110
Nico Weber27268772013-06-26 00:30:14 +00001111 parseBlock(/*MustBeDeclaration=*/true);
Manuel Klimek44135b82013-05-13 12:51:40 +00001112 }
Manuel Klimek3a3408c2013-01-21 13:58:54 +00001113 // We fall through to parsing a structural element afterwards, so
1114 // class A {} n, m;
1115 // will end up in one unwrapped line.
Manuel Klimekde768542013-01-07 18:10:23 +00001116}
1117
Nico Weber1abe6ea2013-01-09 21:15:03 +00001118void UnwrappedLineParser::parseObjCProtocolList() {
Manuel Klimek96e888b2013-05-28 11:55:06 +00001119 assert(FormatTok->Tok.is(tok::less) && "'<' expected.");
Nico Weber1abe6ea2013-01-09 21:15:03 +00001120 do
1121 nextToken();
Manuel Klimek96e888b2013-05-28 11:55:06 +00001122 while (!eof() && FormatTok->Tok.isNot(tok::greater));
Nico Weber1abe6ea2013-01-09 21:15:03 +00001123 nextToken(); // Skip '>'.
1124}
1125
1126void UnwrappedLineParser::parseObjCUntilAtEnd() {
1127 do {
Manuel Klimek96e888b2013-05-28 11:55:06 +00001128 if (FormatTok->Tok.isObjCAtKeyword(tok::objc_end)) {
Nico Weber1abe6ea2013-01-09 21:15:03 +00001129 nextToken();
1130 addUnwrappedLine();
1131 break;
1132 }
Daniel Jasper7186ccc2013-08-28 08:04:23 +00001133 if (FormatTok->is(tok::l_brace)) {
1134 parseBlock(/*MustBeDeclaration=*/false);
1135 // In ObjC interfaces, nothing should be following the "}".
1136 addUnwrappedLine();
1137 } else {
1138 parseStructuralElement();
1139 }
Nico Weber1abe6ea2013-01-09 21:15:03 +00001140 } while (!eof());
1141}
1142
Nico Weber50767d82013-01-09 23:25:37 +00001143void UnwrappedLineParser::parseObjCInterfaceOrImplementation() {
Nico Weber27d13672013-01-09 20:25:35 +00001144 nextToken();
Daniel Jasperf9955d32013-03-20 12:37:50 +00001145 nextToken(); // interface name
Nico Weber27d13672013-01-09 20:25:35 +00001146
1147 // @interface can be followed by either a base class, or a category.
Manuel Klimek96e888b2013-05-28 11:55:06 +00001148 if (FormatTok->Tok.is(tok::colon)) {
Nico Weber27d13672013-01-09 20:25:35 +00001149 nextToken();
Daniel Jasperf9955d32013-03-20 12:37:50 +00001150 nextToken(); // base class name
Manuel Klimek96e888b2013-05-28 11:55:06 +00001151 } else if (FormatTok->Tok.is(tok::l_paren))
Nico Weber27d13672013-01-09 20:25:35 +00001152 // Skip category, if present.
1153 parseParens();
1154
Manuel Klimek96e888b2013-05-28 11:55:06 +00001155 if (FormatTok->Tok.is(tok::less))
Nico Weber1abe6ea2013-01-09 21:15:03 +00001156 parseObjCProtocolList();
Nico Weber27d13672013-01-09 20:25:35 +00001157
1158 // If instance variables are present, keep the '{' on the first line too.
Manuel Klimek96e888b2013-05-28 11:55:06 +00001159 if (FormatTok->Tok.is(tok::l_brace))
Nico Weber27268772013-06-26 00:30:14 +00001160 parseBlock(/*MustBeDeclaration=*/true);
Nico Weber27d13672013-01-09 20:25:35 +00001161
1162 // With instance variables, this puts '}' on its own line. Without instance
1163 // variables, this ends the @interface line.
1164 addUnwrappedLine();
1165
Nico Weber1abe6ea2013-01-09 21:15:03 +00001166 parseObjCUntilAtEnd();
1167}
Nico Weber27d13672013-01-09 20:25:35 +00001168
Nico Weber1abe6ea2013-01-09 21:15:03 +00001169void UnwrappedLineParser::parseObjCProtocol() {
1170 nextToken();
Daniel Jasperf9955d32013-03-20 12:37:50 +00001171 nextToken(); // protocol name
Nico Weber1abe6ea2013-01-09 21:15:03 +00001172
Manuel Klimek96e888b2013-05-28 11:55:06 +00001173 if (FormatTok->Tok.is(tok::less))
Nico Weber1abe6ea2013-01-09 21:15:03 +00001174 parseObjCProtocolList();
1175
1176 // Check for protocol declaration.
Manuel Klimek96e888b2013-05-28 11:55:06 +00001177 if (FormatTok->Tok.is(tok::semi)) {
Nico Weber1abe6ea2013-01-09 21:15:03 +00001178 nextToken();
1179 return addUnwrappedLine();
1180 }
1181
1182 addUnwrappedLine();
1183 parseObjCUntilAtEnd();
Nico Weber27d13672013-01-09 20:25:35 +00001184}
1185
Daniel Jasperbac016b2012-12-03 18:12:45 +00001186void UnwrappedLineParser::addUnwrappedLine() {
Daniel Jaspercbb6c412013-01-16 09:10:19 +00001187 if (Line->Tokens.empty())
Daniel Jasper26f7e782013-01-08 14:56:18 +00001188 return;
Manuel Klimek8fa37992013-01-16 12:31:12 +00001189 DEBUG({
Manuel Klimeka28fc062013-02-11 12:33:24 +00001190 llvm::dbgs() << "Line(" << Line->Level << ")"
1191 << (Line->InPPDirective ? " MACRO" : "") << ": ";
Manuel Klimekdcb3f2a2013-05-28 13:42:28 +00001192 for (std::list<FormatToken *>::iterator I = Line->Tokens.begin(),
1193 E = Line->Tokens.end();
Manuel Klimek8fa37992013-01-16 12:31:12 +00001194 I != E; ++I) {
Manuel Klimekdcb3f2a2013-05-28 13:42:28 +00001195 llvm::dbgs() << (*I)->Tok.getName() << " ";
Manuel Klimek8fa37992013-01-16 12:31:12 +00001196 }
1197 llvm::dbgs() << "\n";
1198 });
Manuel Klimek525fe162013-01-18 14:04:34 +00001199 CurrentLines->push_back(*Line);
Daniel Jaspercbb6c412013-01-16 09:10:19 +00001200 Line->Tokens.clear();
Manuel Klimek525fe162013-01-18 14:04:34 +00001201 if (CurrentLines == &Lines && !PreprocessorDirectives.empty()) {
Daniel Jasper516fb312013-03-01 18:11:39 +00001202 for (std::vector<UnwrappedLine>::iterator
1203 I = PreprocessorDirectives.begin(),
1204 E = PreprocessorDirectives.end();
Manuel Klimek525fe162013-01-18 14:04:34 +00001205 I != E; ++I) {
1206 CurrentLines->push_back(*I);
1207 }
1208 PreprocessorDirectives.clear();
1209 }
Daniel Jasperbac016b2012-12-03 18:12:45 +00001210}
1211
Manuel Klimek96e888b2013-05-28 11:55:06 +00001212bool UnwrappedLineParser::eof() const { return FormatTok->Tok.is(tok::eof); }
Daniel Jasperbac016b2012-12-03 18:12:45 +00001213
Manuel Klimek86721d22013-01-22 16:31:55 +00001214void UnwrappedLineParser::flushComments(bool NewlineBeforeNext) {
1215 bool JustComments = Line->Tokens.empty();
Manuel Klimek96e888b2013-05-28 11:55:06 +00001216 for (SmallVectorImpl<FormatToken *>::const_iterator
Manuel Klimek86721d22013-01-22 16:31:55 +00001217 I = CommentsBeforeNextToken.begin(),
1218 E = CommentsBeforeNextToken.end();
1219 I != E; ++I) {
Manuel Klimek96e888b2013-05-28 11:55:06 +00001220 if ((*I)->NewlinesBefore && JustComments) {
Manuel Klimek86721d22013-01-22 16:31:55 +00001221 addUnwrappedLine();
1222 }
1223 pushToken(*I);
1224 }
1225 if (NewlineBeforeNext && JustComments) {
1226 addUnwrappedLine();
1227 }
1228 CommentsBeforeNextToken.clear();
1229}
1230
Daniel Jasperbac016b2012-12-03 18:12:45 +00001231void UnwrappedLineParser::nextToken() {
1232 if (eof())
1233 return;
Manuel Klimek96e888b2013-05-28 11:55:06 +00001234 flushComments(FormatTok->NewlinesBefore > 0);
Manuel Klimek86721d22013-01-22 16:31:55 +00001235 pushToken(FormatTok);
Manuel Klimekd4397b92013-01-04 23:34:14 +00001236 readToken();
1237}
1238
1239void UnwrappedLineParser::readToken() {
Manuel Klimek86721d22013-01-22 16:31:55 +00001240 bool CommentsInCurrentLine = true;
1241 do {
1242 FormatTok = Tokens->getNextToken();
Manuel Klimek96e888b2013-05-28 11:55:06 +00001243 while (!Line->InPPDirective && FormatTok->Tok.is(tok::hash) &&
1244 (FormatTok->HasUnescapedNewline || FormatTok->IsFirst)) {
Manuel Klimek86721d22013-01-22 16:31:55 +00001245 // If there is an unfinished unwrapped line, we flush the preprocessor
1246 // directives only after that unwrapped line was finished later.
Daniel Jasperf9955d32013-03-20 12:37:50 +00001247 bool SwitchToPreprocessorLines =
1248 !Line->Tokens.empty() && CurrentLines == &Lines;
Manuel Klimek86721d22013-01-22 16:31:55 +00001249 ScopedLineState BlockState(*this, SwitchToPreprocessorLines);
Alexander Kornienko4128e192013-04-03 12:38:53 +00001250 // Comments stored before the preprocessor directive need to be output
1251 // before the preprocessor directive, at the same level as the
1252 // preprocessor directive, as we consider them to apply to the directive.
Manuel Klimek96e888b2013-05-28 11:55:06 +00001253 flushComments(FormatTok->NewlinesBefore > 0);
Manuel Klimek86721d22013-01-22 16:31:55 +00001254 parsePPDirective();
1255 }
Alexander Kornienko6fb46b02013-05-24 18:24:24 +00001256
1257 if (!PPStack.empty() && (PPStack.back() == PP_Unreachable) &&
1258 !Line->InPPDirective) {
1259 continue;
1260 }
1261
Manuel Klimek96e888b2013-05-28 11:55:06 +00001262 if (!FormatTok->Tok.is(tok::comment))
Manuel Klimek86721d22013-01-22 16:31:55 +00001263 return;
Manuel Klimek96e888b2013-05-28 11:55:06 +00001264 if (FormatTok->NewlinesBefore > 0 || FormatTok->IsFirst) {
Manuel Klimek86721d22013-01-22 16:31:55 +00001265 CommentsInCurrentLine = false;
1266 }
1267 if (CommentsInCurrentLine) {
1268 pushToken(FormatTok);
1269 } else {
1270 CommentsBeforeNextToken.push_back(FormatTok);
1271 }
1272 } while (!eof());
1273}
1274
Manuel Klimek96e888b2013-05-28 11:55:06 +00001275void UnwrappedLineParser::pushToken(FormatToken *Tok) {
Manuel Klimekdcb3f2a2013-05-28 13:42:28 +00001276 Line->Tokens.push_back(Tok);
Manuel Klimek86721d22013-01-22 16:31:55 +00001277 if (MustBreakBeforeNextToken) {
Manuel Klimekdcb3f2a2013-05-28 13:42:28 +00001278 Line->Tokens.back()->MustBreakBefore = true;
Manuel Klimek86721d22013-01-22 16:31:55 +00001279 MustBreakBeforeNextToken = false;
Manuel Klimekd4397b92013-01-04 23:34:14 +00001280 }
Daniel Jasperbac016b2012-12-03 18:12:45 +00001281}
1282
Daniel Jaspercd162382013-01-07 13:26:07 +00001283} // end namespace format
1284} // end namespace clang