1 //===--- UnwrappedLineFormatter.cpp - Format C++ code ---------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "UnwrappedLineFormatter.h"
10 #include "FormatToken.h"
11 #include "NamespaceEndCommentsFixer.h"
12 #include "WhitespaceManager.h"
13 #include "llvm/Support/Debug.h"
14 #include <queue>
15 
16 #define DEBUG_TYPE "format-formatter"
17 
18 namespace clang {
19 namespace format {
20 
21 namespace {
22 
startsExternCBlock(const AnnotatedLine & Line)23 bool startsExternCBlock(const AnnotatedLine &Line) {
24   const FormatToken *Next = Line.First->getNextNonComment();
25   const FormatToken *NextNext = Next ? Next->getNextNonComment() : nullptr;
26   return Line.startsWith(tok::kw_extern) && Next && Next->isStringLiteral() &&
27          NextNext && NextNext->is(tok::l_brace);
28 }
29 
isRecordLBrace(const FormatToken & Tok)30 bool isRecordLBrace(const FormatToken &Tok) {
31   return Tok.isOneOf(TT_ClassLBrace, TT_EnumLBrace, TT_RecordLBrace,
32                      TT_StructLBrace, TT_UnionLBrace);
33 }
34 
35 /// Tracks the indent level of \c AnnotatedLines across levels.
36 ///
37 /// \c nextLine must be called for each \c AnnotatedLine, after which \c
38 /// getIndent() will return the indent for the last line \c nextLine was called
39 /// with.
40 /// If the line is not formatted (and thus the indent does not change), calling
41 /// \c adjustToUnmodifiedLine after the call to \c nextLine will cause
42 /// subsequent lines on the same level to be indented at the same level as the
43 /// given line.
44 class LevelIndentTracker {
45 public:
LevelIndentTracker(const FormatStyle & Style,const AdditionalKeywords & Keywords,unsigned StartLevel,int AdditionalIndent)46   LevelIndentTracker(const FormatStyle &Style,
47                      const AdditionalKeywords &Keywords, unsigned StartLevel,
48                      int AdditionalIndent)
49       : Style(Style), Keywords(Keywords), AdditionalIndent(AdditionalIndent) {
50     for (unsigned i = 0; i != StartLevel; ++i)
51       IndentForLevel.push_back(Style.IndentWidth * i + AdditionalIndent);
52   }
53 
54   /// Returns the indent for the current line.
getIndent() const55   unsigned getIndent() const { return Indent; }
56 
57   /// Update the indent state given that \p Line is going to be formatted
58   /// next.
nextLine(const AnnotatedLine & Line)59   void nextLine(const AnnotatedLine &Line) {
60     Offset = getIndentOffset(*Line.First);
61     // Update the indent level cache size so that we can rely on it
62     // having the right size in adjustToUnmodifiedline.
63     if (Line.Level >= IndentForLevel.size())
64       IndentForLevel.resize(Line.Level + 1, -1);
65     if (Style.IndentPPDirectives != FormatStyle::PPDIS_None &&
66         (Line.InPPDirective ||
67          (Style.IndentPPDirectives == FormatStyle::PPDIS_BeforeHash &&
68           Line.Type == LT_CommentAbovePPDirective))) {
69       unsigned PPIndentWidth =
70           (Style.PPIndentWidth >= 0) ? Style.PPIndentWidth : Style.IndentWidth;
71       Indent = Line.InMacroBody
72                    ? Line.PPLevel * PPIndentWidth +
73                          (Line.Level - Line.PPLevel) * Style.IndentWidth
74                    : Line.Level * PPIndentWidth;
75       Indent += AdditionalIndent;
76     } else {
77       // When going to lower levels, forget previous higher levels so that we
78       // recompute future higher levels. But don't forget them if we enter a PP
79       // directive, since these do not terminate a C++ code block.
80       if (!Line.InPPDirective) {
81         assert(Line.Level <= IndentForLevel.size());
82         IndentForLevel.resize(Line.Level + 1);
83       }
84       Indent = getIndent(Line.Level);
85     }
86     if (static_cast<int>(Indent) + Offset >= 0)
87       Indent += Offset;
88     if (Line.IsContinuation)
89       Indent = Line.Level * Style.IndentWidth + Style.ContinuationIndentWidth;
90   }
91 
92   /// Update the level indent to adapt to the given \p Line.
93   ///
94   /// When a line is not formatted, we move the subsequent lines on the same
95   /// level to the same indent.
96   /// Note that \c nextLine must have been called before this method.
adjustToUnmodifiedLine(const AnnotatedLine & Line)97   void adjustToUnmodifiedLine(const AnnotatedLine &Line) {
98     if (Line.InPPDirective || Line.IsContinuation)
99       return;
100     assert(Line.Level < IndentForLevel.size());
101     if (Line.First->is(tok::comment) && IndentForLevel[Line.Level] != -1)
102       return;
103     unsigned LevelIndent = Line.First->OriginalColumn;
104     if (static_cast<int>(LevelIndent) - Offset >= 0)
105       LevelIndent -= Offset;
106     IndentForLevel[Line.Level] = LevelIndent;
107   }
108 
109 private:
110   /// Get the offset of the line relatively to the level.
111   ///
112   /// For example, 'public:' labels in classes are offset by 1 or 2
113   /// characters to the left from their level.
getIndentOffset(const FormatToken & RootToken)114   int getIndentOffset(const FormatToken &RootToken) {
115     if (Style.Language == FormatStyle::LK_Java || Style.isJavaScript() ||
116         Style.isCSharp()) {
117       return 0;
118     }
119 
120     auto IsAccessModifier = [this, &RootToken]() {
121       if (RootToken.isAccessSpecifier(Style.isCpp())) {
122         return true;
123       } else if (RootToken.isObjCAccessSpecifier()) {
124         return true;
125       }
126       // Handle Qt signals.
127       else if (RootToken.isOneOf(Keywords.kw_signals, Keywords.kw_qsignals) &&
128                RootToken.Next && RootToken.Next->is(tok::colon)) {
129         return true;
130       } else if (RootToken.Next &&
131                  RootToken.Next->isOneOf(Keywords.kw_slots,
132                                          Keywords.kw_qslots) &&
133                  RootToken.Next->Next && RootToken.Next->Next->is(tok::colon)) {
134         return true;
135       }
136       // Handle malformed access specifier e.g. 'private' without trailing ':'.
137       else if (!RootToken.Next && RootToken.isAccessSpecifier(false)) {
138         return true;
139       }
140       return false;
141     };
142 
143     if (IsAccessModifier()) {
144       // The AccessModifierOffset may be overridden by IndentAccessModifiers,
145       // in which case we take a negative value of the IndentWidth to simulate
146       // the upper indent level.
147       return Style.IndentAccessModifiers ? -Style.IndentWidth
148                                          : Style.AccessModifierOffset;
149     }
150     return 0;
151   }
152 
153   /// Get the indent of \p Level from \p IndentForLevel.
154   ///
155   /// \p IndentForLevel must contain the indent for the level \c l
156   /// at \p IndentForLevel[l], or a value < 0 if the indent for
157   /// that level is unknown.
getIndent(unsigned Level) const158   unsigned getIndent(unsigned Level) const {
159     assert(Level < IndentForLevel.size());
160     if (IndentForLevel[Level] != -1)
161       return IndentForLevel[Level];
162     if (Level == 0)
163       return 0;
164     return getIndent(Level - 1) + Style.IndentWidth;
165   }
166 
167   const FormatStyle &Style;
168   const AdditionalKeywords &Keywords;
169   const unsigned AdditionalIndent;
170 
171   /// The indent in characters for each level. It remembers the indent of
172   /// previous lines (that are not PP directives) of equal or lower levels. This
173   /// is used to align formatted lines to the indent of previous non-formatted
174   /// lines. Think about the --lines parameter of clang-format.
175   SmallVector<int> IndentForLevel;
176 
177   /// Offset of the current line relative to the indent level.
178   ///
179   /// For example, the 'public' keywords is often indented with a negative
180   /// offset.
181   int Offset = 0;
182 
183   /// The current line's indent.
184   unsigned Indent = 0;
185 };
186 
getMatchingNamespaceToken(const AnnotatedLine * Line,const SmallVectorImpl<AnnotatedLine * > & AnnotatedLines)187 const FormatToken *getMatchingNamespaceToken(
188     const AnnotatedLine *Line,
189     const SmallVectorImpl<AnnotatedLine *> &AnnotatedLines) {
190   if (!Line->startsWith(tok::r_brace))
191     return nullptr;
192   size_t StartLineIndex = Line->MatchingOpeningBlockLineIndex;
193   if (StartLineIndex == UnwrappedLine::kInvalidIndex)
194     return nullptr;
195   assert(StartLineIndex < AnnotatedLines.size());
196   return AnnotatedLines[StartLineIndex]->First->getNamespaceToken();
197 }
198 
getNamespaceTokenText(const AnnotatedLine * Line)199 StringRef getNamespaceTokenText(const AnnotatedLine *Line) {
200   const FormatToken *NamespaceToken = Line->First->getNamespaceToken();
201   return NamespaceToken ? NamespaceToken->TokenText : StringRef();
202 }
203 
getMatchingNamespaceTokenText(const AnnotatedLine * Line,const SmallVectorImpl<AnnotatedLine * > & AnnotatedLines)204 StringRef getMatchingNamespaceTokenText(
205     const AnnotatedLine *Line,
206     const SmallVectorImpl<AnnotatedLine *> &AnnotatedLines) {
207   const FormatToken *NamespaceToken =
208       getMatchingNamespaceToken(Line, AnnotatedLines);
209   return NamespaceToken ? NamespaceToken->TokenText : StringRef();
210 }
211 
212 class LineJoiner {
213 public:
LineJoiner(const FormatStyle & Style,const AdditionalKeywords & Keywords,const SmallVectorImpl<AnnotatedLine * > & Lines)214   LineJoiner(const FormatStyle &Style, const AdditionalKeywords &Keywords,
215              const SmallVectorImpl<AnnotatedLine *> &Lines)
216       : Style(Style), Keywords(Keywords), End(Lines.end()), Next(Lines.begin()),
217         AnnotatedLines(Lines) {}
218 
219   /// Returns the next line, merging multiple lines into one if possible.
getNextMergedLine(bool DryRun,LevelIndentTracker & IndentTracker)220   const AnnotatedLine *getNextMergedLine(bool DryRun,
221                                          LevelIndentTracker &IndentTracker) {
222     if (Next == End)
223       return nullptr;
224     const AnnotatedLine *Current = *Next;
225     IndentTracker.nextLine(*Current);
226     unsigned MergedLines = tryFitMultipleLinesInOne(IndentTracker, Next, End);
227     if (MergedLines > 0 && Style.ColumnLimit == 0) {
228       // Disallow line merging if there is a break at the start of one of the
229       // input lines.
230       for (unsigned i = 0; i < MergedLines; ++i)
231         if (Next[i + 1]->First->NewlinesBefore > 0)
232           MergedLines = 0;
233     }
234     if (!DryRun)
235       for (unsigned i = 0; i < MergedLines; ++i)
236         join(*Next[0], *Next[i + 1]);
237     Next = Next + MergedLines + 1;
238     return Current;
239   }
240 
241 private:
242   /// Calculates how many lines can be merged into 1 starting at \p I.
243   unsigned
tryFitMultipleLinesInOne(LevelIndentTracker & IndentTracker,SmallVectorImpl<AnnotatedLine * >::const_iterator I,SmallVectorImpl<AnnotatedLine * >::const_iterator E)244   tryFitMultipleLinesInOne(LevelIndentTracker &IndentTracker,
245                            SmallVectorImpl<AnnotatedLine *>::const_iterator I,
246                            SmallVectorImpl<AnnotatedLine *>::const_iterator E) {
247     const unsigned Indent = IndentTracker.getIndent();
248 
249     // Can't join the last line with anything.
250     if (I + 1 == E)
251       return 0;
252     // We can never merge stuff if there are trailing line comments.
253     const AnnotatedLine *TheLine = *I;
254     if (TheLine->Last->is(TT_LineComment))
255       return 0;
256     const auto &NextLine = *I[1];
257     if (NextLine.Type == LT_Invalid || NextLine.First->MustBreakBefore)
258       return 0;
259     if (TheLine->InPPDirective &&
260         (!NextLine.InPPDirective || NextLine.First->HasUnescapedNewline)) {
261       return 0;
262     }
263 
264     if (Style.ColumnLimit > 0 && Indent > Style.ColumnLimit)
265       return 0;
266 
267     unsigned Limit =
268         Style.ColumnLimit == 0 ? UINT_MAX : Style.ColumnLimit - Indent;
269     // If we already exceed the column limit, we set 'Limit' to 0. The different
270     // tryMerge..() functions can then decide whether to still do merging.
271     Limit = TheLine->Last->TotalLength > Limit
272                 ? 0
273                 : Limit - TheLine->Last->TotalLength;
274 
275     if (TheLine->Last->is(TT_FunctionLBrace) &&
276         TheLine->First == TheLine->Last &&
277         !Style.BraceWrapping.SplitEmptyFunction &&
278         NextLine.First->is(tok::r_brace)) {
279       return tryMergeSimpleBlock(I, E, Limit);
280     }
281 
282     const auto *PreviousLine = I != AnnotatedLines.begin() ? I[-1] : nullptr;
283     // Handle empty record blocks where the brace has already been wrapped.
284     if (PreviousLine && TheLine->Last->is(tok::l_brace) &&
285         TheLine->First == TheLine->Last) {
286       bool EmptyBlock = NextLine.First->is(tok::r_brace);
287 
288       const FormatToken *Tok = PreviousLine->First;
289       if (Tok && Tok->is(tok::comment))
290         Tok = Tok->getNextNonComment();
291 
292       if (Tok && Tok->getNamespaceToken()) {
293         return !Style.BraceWrapping.SplitEmptyNamespace && EmptyBlock
294                    ? tryMergeSimpleBlock(I, E, Limit)
295                    : 0;
296       }
297 
298       if (Tok && Tok->is(tok::kw_typedef))
299         Tok = Tok->getNextNonComment();
300       if (Tok && Tok->isOneOf(tok::kw_class, tok::kw_struct, tok::kw_union,
301                               tok::kw_extern, Keywords.kw_interface)) {
302         return !Style.BraceWrapping.SplitEmptyRecord && EmptyBlock
303                    ? tryMergeSimpleBlock(I, E, Limit)
304                    : 0;
305       }
306 
307       if (Tok && Tok->is(tok::kw_template) &&
308           Style.BraceWrapping.SplitEmptyRecord && EmptyBlock) {
309         return 0;
310       }
311     }
312 
313     auto ShouldMergeShortFunctions = [this, &I, &NextLine, PreviousLine,
314                                       TheLine]() {
315       if (Style.AllowShortFunctionsOnASingleLine == FormatStyle::SFS_All)
316         return true;
317       if (Style.AllowShortFunctionsOnASingleLine >= FormatStyle::SFS_Empty &&
318           NextLine.First->is(tok::r_brace)) {
319         return true;
320       }
321 
322       if (Style.AllowShortFunctionsOnASingleLine &
323           FormatStyle::SFS_InlineOnly) {
324         // Just checking TheLine->Level != 0 is not enough, because it
325         // provokes treating functions inside indented namespaces as short.
326         if (Style.isJavaScript() && TheLine->Last->is(TT_FunctionLBrace))
327           return true;
328 
329         if (TheLine->Level != 0) {
330           if (!PreviousLine)
331             return false;
332 
333           // TODO: Use IndentTracker to avoid loop?
334           // Find the last line with lower level.
335           const AnnotatedLine *Line = nullptr;
336           for (auto J = I - 1; J >= AnnotatedLines.begin(); --J) {
337             assert(*J);
338             if (!(*J)->InPPDirective && !(*J)->isComment() &&
339                 (*J)->Level < TheLine->Level) {
340               Line = *J;
341               break;
342             }
343           }
344 
345           if (!Line)
346             return false;
347 
348           // Check if the found line starts a record.
349           const auto *LastNonComment = Line->getLastNonComment();
350           // There must be another token (usually `{`), because we chose a
351           // non-PPDirective and non-comment line that has a smaller level.
352           assert(LastNonComment);
353           return isRecordLBrace(*LastNonComment);
354         }
355       }
356 
357       return false;
358     };
359 
360     bool MergeShortFunctions = ShouldMergeShortFunctions();
361 
362     const auto *FirstNonComment = TheLine->getFirstNonComment();
363     if (!FirstNonComment)
364       return 0;
365     // FIXME: There are probably cases where we should use FirstNonComment
366     // instead of TheLine->First.
367 
368     if (Style.CompactNamespaces) {
369       if (const auto *NSToken = TheLine->First->getNamespaceToken()) {
370         int J = 1;
371         assert(TheLine->MatchingClosingBlockLineIndex > 0);
372         for (auto ClosingLineIndex = TheLine->MatchingClosingBlockLineIndex - 1;
373              I + J != E && NSToken->TokenText == getNamespaceTokenText(I[J]) &&
374              ClosingLineIndex == I[J]->MatchingClosingBlockLineIndex &&
375              I[J]->Last->TotalLength < Limit;
376              ++J, --ClosingLineIndex) {
377           Limit -= I[J]->Last->TotalLength;
378 
379           // Reduce indent level for bodies of namespaces which were compacted,
380           // but only if their content was indented in the first place.
381           auto *ClosingLine = AnnotatedLines.begin() + ClosingLineIndex + 1;
382           const int OutdentBy = I[J]->Level - TheLine->Level;
383           assert(OutdentBy >= 0);
384           for (auto *CompactedLine = I + J; CompactedLine <= ClosingLine;
385                ++CompactedLine) {
386             if (!(*CompactedLine)->InPPDirective) {
387               const int Level = (*CompactedLine)->Level;
388               (*CompactedLine)->Level = std::max(Level - OutdentBy, 0);
389             }
390           }
391         }
392         return J - 1;
393       }
394 
395       if (auto nsToken = getMatchingNamespaceToken(TheLine, AnnotatedLines)) {
396         int i = 0;
397         unsigned openingLine = TheLine->MatchingOpeningBlockLineIndex - 1;
398         for (; I + 1 + i != E &&
399                nsToken->TokenText ==
400                    getMatchingNamespaceTokenText(I[i + 1], AnnotatedLines) &&
401                openingLine == I[i + 1]->MatchingOpeningBlockLineIndex;
402              i++, --openingLine) {
403           // No space between consecutive braces.
404           I[i + 1]->First->SpacesRequiredBefore =
405               I[i]->Last->isNot(tok::r_brace);
406 
407           // Indent like the outer-most namespace.
408           IndentTracker.nextLine(*I[i + 1]);
409         }
410         return i;
411       }
412     }
413 
414     const auto *LastNonComment = TheLine->getLastNonComment();
415     assert(LastNonComment);
416     // FIXME: There are probably cases where we should use LastNonComment
417     // instead of TheLine->Last.
418 
419     // Try to merge a function block with left brace unwrapped.
420     if (LastNonComment->is(TT_FunctionLBrace) &&
421         TheLine->First != LastNonComment) {
422       return MergeShortFunctions ? tryMergeSimpleBlock(I, E, Limit) : 0;
423     }
424     // Try to merge a control statement block with left brace unwrapped.
425     if (TheLine->Last->is(tok::l_brace) && FirstNonComment != TheLine->Last &&
426         FirstNonComment->isOneOf(tok::kw_if, tok::kw_while, tok::kw_for,
427                                  TT_ForEachMacro)) {
428       return Style.AllowShortBlocksOnASingleLine != FormatStyle::SBS_Never
429                  ? tryMergeSimpleBlock(I, E, Limit)
430                  : 0;
431     }
432     // Try to merge a control statement block with left brace wrapped.
433     if (NextLine.First->is(tok::l_brace)) {
434       if ((TheLine->First->isOneOf(tok::kw_if, tok::kw_else, tok::kw_while,
435                                    tok::kw_for, tok::kw_switch, tok::kw_try,
436                                    tok::kw_do, TT_ForEachMacro) ||
437            (TheLine->First->is(tok::r_brace) && TheLine->First->Next &&
438             TheLine->First->Next->isOneOf(tok::kw_else, tok::kw_catch))) &&
439           Style.BraceWrapping.AfterControlStatement ==
440               FormatStyle::BWACS_MultiLine) {
441         // If possible, merge the next line's wrapped left brace with the
442         // current line. Otherwise, leave it on the next line, as this is a
443         // multi-line control statement.
444         return (Style.ColumnLimit == 0 || TheLine->Level * Style.IndentWidth +
445                                                   TheLine->Last->TotalLength <=
446                                               Style.ColumnLimit)
447                    ? 1
448                    : 0;
449       }
450       if (TheLine->First->isOneOf(tok::kw_if, tok::kw_else, tok::kw_while,
451                                   tok::kw_for, TT_ForEachMacro)) {
452         return (Style.BraceWrapping.AfterControlStatement ==
453                 FormatStyle::BWACS_Always)
454                    ? tryMergeSimpleBlock(I, E, Limit)
455                    : 0;
456       }
457       if (TheLine->First->isOneOf(tok::kw_else, tok::kw_catch) &&
458           Style.BraceWrapping.AfterControlStatement ==
459               FormatStyle::BWACS_MultiLine) {
460         // This case if different from the upper BWACS_MultiLine processing
461         // in that a preceding r_brace is not on the same line as else/catch
462         // most likely because of BeforeElse/BeforeCatch set to true.
463         // If the line length doesn't fit ColumnLimit, leave l_brace on the
464         // next line to respect the BWACS_MultiLine.
465         return (Style.ColumnLimit == 0 ||
466                 TheLine->Last->TotalLength <= Style.ColumnLimit)
467                    ? 1
468                    : 0;
469       }
470     }
471     if (PreviousLine && TheLine->First->is(tok::l_brace)) {
472       switch (PreviousLine->First->Tok.getKind()) {
473       case tok::at:
474         // Don't merge block with left brace wrapped after ObjC special blocks.
475         if (PreviousLine->First->Next) {
476           tok::ObjCKeywordKind kwId =
477               PreviousLine->First->Next->Tok.getObjCKeywordID();
478           if (kwId == tok::objc_autoreleasepool ||
479               kwId == tok::objc_synchronized) {
480             return 0;
481           }
482         }
483         break;
484 
485       case tok::kw_case:
486       case tok::kw_default:
487         // Don't merge block with left brace wrapped after case labels.
488         return 0;
489 
490       default:
491         break;
492       }
493     }
494 
495     // Don't merge an empty template class or struct if SplitEmptyRecords
496     // is defined.
497     if (PreviousLine && Style.BraceWrapping.SplitEmptyRecord &&
498         TheLine->Last->is(tok::l_brace) && PreviousLine->Last) {
499       const FormatToken *Previous = PreviousLine->Last;
500       if (Previous) {
501         if (Previous->is(tok::comment))
502           Previous = Previous->getPreviousNonComment();
503         if (Previous) {
504           if (Previous->is(tok::greater) && !PreviousLine->InPPDirective)
505             return 0;
506           if (Previous->is(tok::identifier)) {
507             const FormatToken *PreviousPrevious =
508                 Previous->getPreviousNonComment();
509             if (PreviousPrevious &&
510                 PreviousPrevious->isOneOf(tok::kw_class, tok::kw_struct)) {
511               return 0;
512             }
513           }
514         }
515       }
516     }
517 
518     if (TheLine->Last->is(tok::l_brace)) {
519       bool ShouldMerge = false;
520       // Try to merge records.
521       if (TheLine->Last->is(TT_EnumLBrace)) {
522         ShouldMerge = Style.AllowShortEnumsOnASingleLine;
523       } else if (TheLine->Last->is(TT_RequiresExpressionLBrace)) {
524         ShouldMerge = Style.AllowShortCompoundRequirementOnASingleLine;
525       } else if (TheLine->Last->isOneOf(TT_ClassLBrace, TT_StructLBrace)) {
526         // NOTE: We use AfterClass (whereas AfterStruct exists) for both classes
527         // and structs, but it seems that wrapping is still handled correctly
528         // elsewhere.
529         ShouldMerge = !Style.BraceWrapping.AfterClass ||
530                       (NextLine.First->is(tok::r_brace) &&
531                        !Style.BraceWrapping.SplitEmptyRecord);
532       } else if (TheLine->InPPDirective ||
533                  !TheLine->First->isOneOf(tok::kw_class, tok::kw_enum,
534                                           tok::kw_struct)) {
535         // Try to merge a block with left brace unwrapped that wasn't yet
536         // covered.
537         ShouldMerge = !Style.BraceWrapping.AfterFunction ||
538                       (NextLine.First->is(tok::r_brace) &&
539                        !Style.BraceWrapping.SplitEmptyFunction);
540       }
541       return ShouldMerge ? tryMergeSimpleBlock(I, E, Limit) : 0;
542     }
543 
544     // Try to merge a function block with left brace wrapped.
545     if (NextLine.First->is(TT_FunctionLBrace) &&
546         Style.BraceWrapping.AfterFunction) {
547       if (NextLine.Last->is(TT_LineComment))
548         return 0;
549 
550       // Check for Limit <= 2 to account for the " {".
551       if (Limit <= 2 || (Style.ColumnLimit == 0 && containsMustBreak(TheLine)))
552         return 0;
553       Limit -= 2;
554 
555       unsigned MergedLines = 0;
556       if (MergeShortFunctions ||
557           (Style.AllowShortFunctionsOnASingleLine >= FormatStyle::SFS_Empty &&
558            NextLine.First == NextLine.Last && I + 2 != E &&
559            I[2]->First->is(tok::r_brace))) {
560         MergedLines = tryMergeSimpleBlock(I + 1, E, Limit);
561         // If we managed to merge the block, count the function header, which is
562         // on a separate line.
563         if (MergedLines > 0)
564           ++MergedLines;
565       }
566       return MergedLines;
567     }
568     auto IsElseLine = [&TheLine]() -> bool {
569       const FormatToken *First = TheLine->First;
570       if (First->is(tok::kw_else))
571         return true;
572 
573       return First->is(tok::r_brace) && First->Next &&
574              First->Next->is(tok::kw_else);
575     };
576     if (TheLine->First->is(tok::kw_if) ||
577         (IsElseLine() && (Style.AllowShortIfStatementsOnASingleLine ==
578                           FormatStyle::SIS_AllIfsAndElse))) {
579       return Style.AllowShortIfStatementsOnASingleLine
580                  ? tryMergeSimpleControlStatement(I, E, Limit)
581                  : 0;
582     }
583     if (TheLine->First->isOneOf(tok::kw_for, tok::kw_while, tok::kw_do,
584                                 TT_ForEachMacro)) {
585       return Style.AllowShortLoopsOnASingleLine
586                  ? tryMergeSimpleControlStatement(I, E, Limit)
587                  : 0;
588     }
589     if (TheLine->First->isOneOf(tok::kw_case, tok::kw_default)) {
590       return Style.AllowShortCaseLabelsOnASingleLine
591                  ? tryMergeShortCaseLabels(I, E, Limit)
592                  : 0;
593     }
594     if (TheLine->InPPDirective &&
595         (TheLine->First->HasUnescapedNewline || TheLine->First->IsFirst)) {
596       return tryMergeSimplePPDirective(I, E, Limit);
597     }
598     return 0;
599   }
600 
601   unsigned
tryMergeSimplePPDirective(SmallVectorImpl<AnnotatedLine * >::const_iterator I,SmallVectorImpl<AnnotatedLine * >::const_iterator E,unsigned Limit)602   tryMergeSimplePPDirective(SmallVectorImpl<AnnotatedLine *>::const_iterator I,
603                             SmallVectorImpl<AnnotatedLine *>::const_iterator E,
604                             unsigned Limit) {
605     if (Limit == 0)
606       return 0;
607     if (I + 2 != E && I[2]->InPPDirective && !I[2]->First->HasUnescapedNewline)
608       return 0;
609     if (1 + I[1]->Last->TotalLength > Limit)
610       return 0;
611     return 1;
612   }
613 
tryMergeSimpleControlStatement(SmallVectorImpl<AnnotatedLine * >::const_iterator I,SmallVectorImpl<AnnotatedLine * >::const_iterator E,unsigned Limit)614   unsigned tryMergeSimpleControlStatement(
615       SmallVectorImpl<AnnotatedLine *>::const_iterator I,
616       SmallVectorImpl<AnnotatedLine *>::const_iterator E, unsigned Limit) {
617     if (Limit == 0)
618       return 0;
619     if (Style.BraceWrapping.AfterControlStatement ==
620             FormatStyle::BWACS_Always &&
621         I[1]->First->is(tok::l_brace) &&
622         Style.AllowShortBlocksOnASingleLine == FormatStyle::SBS_Never) {
623       return 0;
624     }
625     if (I[1]->InPPDirective != (*I)->InPPDirective ||
626         (I[1]->InPPDirective && I[1]->First->HasUnescapedNewline)) {
627       return 0;
628     }
629     Limit = limitConsideringMacros(I + 1, E, Limit);
630     AnnotatedLine &Line = **I;
631     if (Line.First->isNot(tok::kw_do) && Line.First->isNot(tok::kw_else) &&
632         Line.Last->isNot(tok::kw_else) && Line.Last->isNot(tok::r_paren)) {
633       return 0;
634     }
635     // Only merge `do while` if `do` is the only statement on the line.
636     if (Line.First->is(tok::kw_do) && Line.Last->isNot(tok::kw_do))
637       return 0;
638     if (1 + I[1]->Last->TotalLength > Limit)
639       return 0;
640     // Don't merge with loops, ifs, a single semicolon or a line comment.
641     if (I[1]->First->isOneOf(tok::semi, tok::kw_if, tok::kw_for, tok::kw_while,
642                              TT_ForEachMacro, TT_LineComment)) {
643       return 0;
644     }
645     // Only inline simple if's (no nested if or else), unless specified
646     if (Style.AllowShortIfStatementsOnASingleLine ==
647         FormatStyle::SIS_WithoutElse) {
648       if (I + 2 != E && Line.startsWith(tok::kw_if) &&
649           I[2]->First->is(tok::kw_else)) {
650         return 0;
651       }
652     }
653     return 1;
654   }
655 
656   unsigned
tryMergeShortCaseLabels(SmallVectorImpl<AnnotatedLine * >::const_iterator I,SmallVectorImpl<AnnotatedLine * >::const_iterator E,unsigned Limit)657   tryMergeShortCaseLabels(SmallVectorImpl<AnnotatedLine *>::const_iterator I,
658                           SmallVectorImpl<AnnotatedLine *>::const_iterator E,
659                           unsigned Limit) {
660     if (Limit == 0 || I + 1 == E ||
661         I[1]->First->isOneOf(tok::kw_case, tok::kw_default)) {
662       return 0;
663     }
664     if (I[0]->Last->is(tok::l_brace) || I[1]->First->is(tok::l_brace))
665       return 0;
666     unsigned NumStmts = 0;
667     unsigned Length = 0;
668     bool EndsWithComment = false;
669     bool InPPDirective = I[0]->InPPDirective;
670     bool InMacroBody = I[0]->InMacroBody;
671     const unsigned Level = I[0]->Level;
672     for (; NumStmts < 3; ++NumStmts) {
673       if (I + 1 + NumStmts == E)
674         break;
675       const AnnotatedLine *Line = I[1 + NumStmts];
676       if (Line->InPPDirective != InPPDirective)
677         break;
678       if (Line->InMacroBody != InMacroBody)
679         break;
680       if (Line->First->isOneOf(tok::kw_case, tok::kw_default, tok::r_brace))
681         break;
682       if (Line->First->isOneOf(tok::kw_if, tok::kw_for, tok::kw_switch,
683                                tok::kw_while) ||
684           EndsWithComment) {
685         return 0;
686       }
687       if (Line->First->is(tok::comment)) {
688         if (Level != Line->Level)
689           return 0;
690         SmallVectorImpl<AnnotatedLine *>::const_iterator J = I + 2 + NumStmts;
691         for (; J != E; ++J) {
692           Line = *J;
693           if (Line->InPPDirective != InPPDirective)
694             break;
695           if (Line->First->isOneOf(tok::kw_case, tok::kw_default, tok::r_brace))
696             break;
697           if (Line->First->isNot(tok::comment) || Level != Line->Level)
698             return 0;
699         }
700         break;
701       }
702       if (Line->Last->is(tok::comment))
703         EndsWithComment = true;
704       Length += I[1 + NumStmts]->Last->TotalLength + 1; // 1 for the space.
705     }
706     if (NumStmts == 0 || NumStmts == 3 || Length > Limit)
707       return 0;
708     return NumStmts;
709   }
710 
711   unsigned
tryMergeSimpleBlock(SmallVectorImpl<AnnotatedLine * >::const_iterator I,SmallVectorImpl<AnnotatedLine * >::const_iterator E,unsigned Limit)712   tryMergeSimpleBlock(SmallVectorImpl<AnnotatedLine *>::const_iterator I,
713                       SmallVectorImpl<AnnotatedLine *>::const_iterator E,
714                       unsigned Limit) {
715     // Don't merge with a preprocessor directive.
716     if (I[1]->Type == LT_PreprocessorDirective)
717       return 0;
718 
719     AnnotatedLine &Line = **I;
720 
721     // Don't merge ObjC @ keywords and methods.
722     // FIXME: If an option to allow short exception handling clauses on a single
723     // line is added, change this to not return for @try and friends.
724     if (Style.Language != FormatStyle::LK_Java &&
725         Line.First->isOneOf(tok::at, tok::minus, tok::plus)) {
726       return 0;
727     }
728 
729     // Check that the current line allows merging. This depends on whether we
730     // are in a control flow statements as well as several style flags.
731     if (Line.First->is(tok::kw_case) ||
732         (Line.First->Next && Line.First->Next->is(tok::kw_else))) {
733       return 0;
734     }
735     // default: in switch statement
736     if (Line.First->is(tok::kw_default)) {
737       const FormatToken *Tok = Line.First->getNextNonComment();
738       if (Tok && Tok->is(tok::colon))
739         return 0;
740     }
741 
742     auto IsCtrlStmt = [](const auto &Line) {
743       return Line.First->isOneOf(tok::kw_if, tok::kw_else, tok::kw_while,
744                                  tok::kw_do, tok::kw_for, TT_ForEachMacro);
745     };
746 
747     const bool IsSplitBlock =
748         Style.AllowShortBlocksOnASingleLine == FormatStyle::SBS_Never ||
749         (Style.AllowShortBlocksOnASingleLine == FormatStyle::SBS_Empty &&
750          I[1]->First->isNot(tok::r_brace));
751 
752     if (IsCtrlStmt(Line) ||
753         Line.First->isOneOf(tok::kw_try, tok::kw___try, tok::kw_catch,
754                             tok::kw___finally, tok::r_brace,
755                             Keywords.kw___except)) {
756       if (IsSplitBlock)
757         return 0;
758       // Don't merge when we can't except the case when
759       // the control statement block is empty
760       if (!Style.AllowShortIfStatementsOnASingleLine &&
761           Line.First->isOneOf(tok::kw_if, tok::kw_else) &&
762           !Style.BraceWrapping.AfterControlStatement &&
763           I[1]->First->isNot(tok::r_brace)) {
764         return 0;
765       }
766       if (!Style.AllowShortIfStatementsOnASingleLine &&
767           Line.First->isOneOf(tok::kw_if, tok::kw_else) &&
768           Style.BraceWrapping.AfterControlStatement ==
769               FormatStyle::BWACS_Always &&
770           I + 2 != E && I[2]->First->isNot(tok::r_brace)) {
771         return 0;
772       }
773       if (!Style.AllowShortLoopsOnASingleLine &&
774           Line.First->isOneOf(tok::kw_while, tok::kw_do, tok::kw_for,
775                               TT_ForEachMacro) &&
776           !Style.BraceWrapping.AfterControlStatement &&
777           I[1]->First->isNot(tok::r_brace)) {
778         return 0;
779       }
780       if (!Style.AllowShortLoopsOnASingleLine &&
781           Line.First->isOneOf(tok::kw_while, tok::kw_do, tok::kw_for,
782                               TT_ForEachMacro) &&
783           Style.BraceWrapping.AfterControlStatement ==
784               FormatStyle::BWACS_Always &&
785           I + 2 != E && I[2]->First->isNot(tok::r_brace)) {
786         return 0;
787       }
788       // FIXME: Consider an option to allow short exception handling clauses on
789       // a single line.
790       // FIXME: This isn't covered by tests.
791       // FIXME: For catch, __except, __finally the first token on the line
792       // is '}', so this isn't correct here.
793       if (Line.First->isOneOf(tok::kw_try, tok::kw___try, tok::kw_catch,
794                               Keywords.kw___except, tok::kw___finally)) {
795         return 0;
796       }
797     }
798 
799     if (const auto *LastNonComment = Line.getLastNonComment();
800         LastNonComment && LastNonComment->is(tok::l_brace)) {
801       if (IsSplitBlock && Line.First == Line.Last &&
802           I > AnnotatedLines.begin() &&
803           (I[-1]->endsWith(tok::kw_else) || IsCtrlStmt(*I[-1]))) {
804         return 0;
805       }
806       FormatToken *Tok = I[1]->First;
807       auto ShouldMerge = [Tok]() {
808         if (Tok->isNot(tok::r_brace) || Tok->MustBreakBefore)
809           return false;
810         const FormatToken *Next = Tok->getNextNonComment();
811         return !Next || Next->is(tok::semi);
812       };
813 
814       if (ShouldMerge()) {
815         // We merge empty blocks even if the line exceeds the column limit.
816         Tok->SpacesRequiredBefore =
817             (Style.SpaceInEmptyBlock || Line.Last->is(tok::comment)) ? 1 : 0;
818         Tok->CanBreakBefore = true;
819         return 1;
820       } else if (Limit != 0 && !Line.startsWithNamespace() &&
821                  !startsExternCBlock(Line)) {
822         // We don't merge short records.
823         if (isRecordLBrace(*Line.Last))
824           return 0;
825 
826         // Check that we still have three lines and they fit into the limit.
827         if (I + 2 == E || I[2]->Type == LT_Invalid)
828           return 0;
829         Limit = limitConsideringMacros(I + 2, E, Limit);
830 
831         if (!nextTwoLinesFitInto(I, Limit))
832           return 0;
833 
834         // Second, check that the next line does not contain any braces - if it
835         // does, readability declines when putting it into a single line.
836         if (I[1]->Last->is(TT_LineComment))
837           return 0;
838         do {
839           if (Tok->is(tok::l_brace) && Tok->isNot(BK_BracedInit))
840             return 0;
841           Tok = Tok->Next;
842         } while (Tok);
843 
844         // Last, check that the third line starts with a closing brace.
845         Tok = I[2]->First;
846         if (Tok->isNot(tok::r_brace))
847           return 0;
848 
849         // Don't merge "if (a) { .. } else {".
850         if (Tok->Next && Tok->Next->is(tok::kw_else))
851           return 0;
852 
853         // Don't merge a trailing multi-line control statement block like:
854         // } else if (foo &&
855         //            bar)
856         // { <-- current Line
857         //   baz();
858         // }
859         if (Line.First == Line.Last && Line.First->isNot(TT_FunctionLBrace) &&
860             Style.BraceWrapping.AfterControlStatement ==
861                 FormatStyle::BWACS_MultiLine) {
862           return 0;
863         }
864 
865         return 2;
866       }
867     } else if (I[1]->First->is(tok::l_brace)) {
868       if (I[1]->Last->is(TT_LineComment))
869         return 0;
870 
871       // Check for Limit <= 2 to account for the " {".
872       if (Limit <= 2 || (Style.ColumnLimit == 0 && containsMustBreak(*I)))
873         return 0;
874       Limit -= 2;
875       unsigned MergedLines = 0;
876       if (Style.AllowShortBlocksOnASingleLine != FormatStyle::SBS_Never ||
877           (I[1]->First == I[1]->Last && I + 2 != E &&
878            I[2]->First->is(tok::r_brace))) {
879         MergedLines = tryMergeSimpleBlock(I + 1, E, Limit);
880         // If we managed to merge the block, count the statement header, which
881         // is on a separate line.
882         if (MergedLines > 0)
883           ++MergedLines;
884       }
885       return MergedLines;
886     }
887     return 0;
888   }
889 
890   /// Returns the modified column limit for \p I if it is inside a macro and
891   /// needs a trailing '\'.
892   unsigned
limitConsideringMacros(SmallVectorImpl<AnnotatedLine * >::const_iterator I,SmallVectorImpl<AnnotatedLine * >::const_iterator E,unsigned Limit)893   limitConsideringMacros(SmallVectorImpl<AnnotatedLine *>::const_iterator I,
894                          SmallVectorImpl<AnnotatedLine *>::const_iterator E,
895                          unsigned Limit) {
896     if (I[0]->InPPDirective && I + 1 != E &&
897         !I[1]->First->HasUnescapedNewline && I[1]->First->isNot(tok::eof)) {
898       return Limit < 2 ? 0 : Limit - 2;
899     }
900     return Limit;
901   }
902 
nextTwoLinesFitInto(SmallVectorImpl<AnnotatedLine * >::const_iterator I,unsigned Limit)903   bool nextTwoLinesFitInto(SmallVectorImpl<AnnotatedLine *>::const_iterator I,
904                            unsigned Limit) {
905     if (I[1]->First->MustBreakBefore || I[2]->First->MustBreakBefore)
906       return false;
907     return 1 + I[1]->Last->TotalLength + 1 + I[2]->Last->TotalLength <= Limit;
908   }
909 
containsMustBreak(const AnnotatedLine * Line)910   bool containsMustBreak(const AnnotatedLine *Line) {
911     assert(Line->First);
912     // Ignore the first token, because in this situation, it applies more to the
913     // last token of the previous line.
914     for (const FormatToken *Tok = Line->First->Next; Tok; Tok = Tok->Next)
915       if (Tok->MustBreakBefore)
916         return true;
917     return false;
918   }
919 
join(AnnotatedLine & A,const AnnotatedLine & B)920   void join(AnnotatedLine &A, const AnnotatedLine &B) {
921     assert(!A.Last->Next);
922     assert(!B.First->Previous);
923     if (B.Affected)
924       A.Affected = true;
925     A.Last->Next = B.First;
926     B.First->Previous = A.Last;
927     B.First->CanBreakBefore = true;
928     unsigned LengthA = A.Last->TotalLength + B.First->SpacesRequiredBefore;
929     for (FormatToken *Tok = B.First; Tok; Tok = Tok->Next) {
930       Tok->TotalLength += LengthA;
931       A.Last = Tok;
932     }
933   }
934 
935   const FormatStyle &Style;
936   const AdditionalKeywords &Keywords;
937   const SmallVectorImpl<AnnotatedLine *>::const_iterator End;
938 
939   SmallVectorImpl<AnnotatedLine *>::const_iterator Next;
940   const SmallVectorImpl<AnnotatedLine *> &AnnotatedLines;
941 };
942 
markFinalized(FormatToken * Tok)943 static void markFinalized(FormatToken *Tok) {
944   if (Tok->is(tok::hash) && !Tok->Previous && Tok->Next &&
945       Tok->Next->isOneOf(tok::pp_if, tok::pp_ifdef, tok::pp_ifndef,
946                          tok::pp_elif, tok::pp_elifdef, tok::pp_elifndef,
947                          tok::pp_else, tok::pp_endif)) {
948     Tok = Tok->Next;
949   }
950   for (; Tok; Tok = Tok->Next) {
951     if (Tok->MacroCtx && Tok->MacroCtx->Role == MR_ExpandedArg) {
952       // In the first pass we format all macro arguments in the expanded token
953       // stream. Instead of finalizing the macro arguments, we mark that they
954       // will be modified as unexpanded arguments (as part of the macro call
955       // formatting) in the next pass.
956       Tok->MacroCtx->Role = MR_UnexpandedArg;
957       // Reset whether spaces or a line break are required before this token, as
958       // that is context dependent, and that context may change when formatting
959       // the macro call.  For example, given M(x) -> 2 * x, and the macro call
960       // M(var), the token 'var' will have SpacesRequiredBefore = 1 after being
961       // formatted as part of the expanded macro, but SpacesRequiredBefore = 0
962       // for its position within the macro call.
963       Tok->SpacesRequiredBefore = 0;
964       if (!Tok->MustBreakBeforeFinalized)
965         Tok->MustBreakBefore = 0;
966     } else {
967       Tok->Finalized = true;
968     }
969   }
970 }
971 
972 #ifndef NDEBUG
printLineState(const LineState & State)973 static void printLineState(const LineState &State) {
974   llvm::dbgs() << "State: ";
975   for (const ParenState &P : State.Stack) {
976     llvm::dbgs() << (P.Tok ? P.Tok->TokenText : "F") << "|" << P.Indent << "|"
977                  << P.LastSpace << "|" << P.NestedBlockIndent << " ";
978   }
979   llvm::dbgs() << State.NextToken->TokenText << "\n";
980 }
981 #endif
982 
983 /// Base class for classes that format one \c AnnotatedLine.
984 class LineFormatter {
985 public:
LineFormatter(ContinuationIndenter * Indenter,WhitespaceManager * Whitespaces,const FormatStyle & Style,UnwrappedLineFormatter * BlockFormatter)986   LineFormatter(ContinuationIndenter *Indenter, WhitespaceManager *Whitespaces,
987                 const FormatStyle &Style,
988                 UnwrappedLineFormatter *BlockFormatter)
989       : Indenter(Indenter), Whitespaces(Whitespaces), Style(Style),
990         BlockFormatter(BlockFormatter) {}
~LineFormatter()991   virtual ~LineFormatter() {}
992 
993   /// Formats an \c AnnotatedLine and returns the penalty.
994   ///
995   /// If \p DryRun is \c false, directly applies the changes.
996   virtual unsigned formatLine(const AnnotatedLine &Line, unsigned FirstIndent,
997                               unsigned FirstStartColumn, bool DryRun) = 0;
998 
999 protected:
1000   /// If the \p State's next token is an r_brace closing a nested block,
1001   /// format the nested block before it.
1002   ///
1003   /// Returns \c true if all children could be placed successfully and adapts
1004   /// \p Penalty as well as \p State. If \p DryRun is false, also directly
1005   /// creates changes using \c Whitespaces.
1006   ///
1007   /// The crucial idea here is that children always get formatted upon
1008   /// encountering the closing brace right after the nested block. Now, if we
1009   /// are currently trying to keep the "}" on the same line (i.e. \p NewLine is
1010   /// \c false), the entire block has to be kept on the same line (which is only
1011   /// possible if it fits on the line, only contains a single statement, etc.
1012   ///
1013   /// If \p NewLine is true, we format the nested block on separate lines, i.e.
1014   /// break after the "{", format all lines with correct indentation and the put
1015   /// the closing "}" on yet another new line.
1016   ///
1017   /// This enables us to keep the simple structure of the
1018   /// \c UnwrappedLineFormatter, where we only have two options for each token:
1019   /// break or don't break.
formatChildren(LineState & State,bool NewLine,bool DryRun,unsigned & Penalty)1020   bool formatChildren(LineState &State, bool NewLine, bool DryRun,
1021                       unsigned &Penalty) {
1022     const FormatToken *LBrace = State.NextToken->getPreviousNonComment();
1023     bool HasLBrace = LBrace && LBrace->is(tok::l_brace) && LBrace->is(BK_Block);
1024     FormatToken &Previous = *State.NextToken->Previous;
1025     if (Previous.Children.size() == 0 || (!HasLBrace && !LBrace->MacroParent)) {
1026       // The previous token does not open a block. Nothing to do. We don't
1027       // assert so that we can simply call this function for all tokens.
1028       return true;
1029     }
1030 
1031     if (NewLine || Previous.MacroParent) {
1032       const ParenState &P = State.Stack.back();
1033 
1034       int AdditionalIndent =
1035           P.Indent - Previous.Children[0]->Level * Style.IndentWidth;
1036       Penalty +=
1037           BlockFormatter->format(Previous.Children, DryRun, AdditionalIndent,
1038                                  /*FixBadIndentation=*/true);
1039       return true;
1040     }
1041 
1042     if (Previous.Children[0]->First->MustBreakBefore)
1043       return false;
1044 
1045     // Cannot merge into one line if this line ends on a comment.
1046     if (Previous.is(tok::comment))
1047       return false;
1048 
1049     // Cannot merge multiple statements into a single line.
1050     if (Previous.Children.size() > 1)
1051       return false;
1052 
1053     const AnnotatedLine *Child = Previous.Children[0];
1054     // We can't put the closing "}" on a line with a trailing comment.
1055     if (Child->Last->isTrailingComment())
1056       return false;
1057 
1058     // If the child line exceeds the column limit, we wouldn't want to merge it.
1059     // We add +2 for the trailing " }".
1060     if (Style.ColumnLimit > 0 &&
1061         Child->Last->TotalLength + State.Column + 2 > Style.ColumnLimit) {
1062       return false;
1063     }
1064 
1065     if (!DryRun) {
1066       Whitespaces->replaceWhitespace(
1067           *Child->First, /*Newlines=*/0, /*Spaces=*/1,
1068           /*StartOfTokenColumn=*/State.Column, /*IsAligned=*/false,
1069           State.Line->InPPDirective);
1070     }
1071     Penalty +=
1072         formatLine(*Child, State.Column + 1, /*FirstStartColumn=*/0, DryRun);
1073     if (!DryRun)
1074       markFinalized(Child->First);
1075 
1076     State.Column += 1 + Child->Last->TotalLength;
1077     return true;
1078   }
1079 
1080   ContinuationIndenter *Indenter;
1081 
1082 private:
1083   WhitespaceManager *Whitespaces;
1084   const FormatStyle &Style;
1085   UnwrappedLineFormatter *BlockFormatter;
1086 };
1087 
1088 /// Formatter that keeps the existing line breaks.
1089 class NoColumnLimitLineFormatter : public LineFormatter {
1090 public:
NoColumnLimitLineFormatter(ContinuationIndenter * Indenter,WhitespaceManager * Whitespaces,const FormatStyle & Style,UnwrappedLineFormatter * BlockFormatter)1091   NoColumnLimitLineFormatter(ContinuationIndenter *Indenter,
1092                              WhitespaceManager *Whitespaces,
1093                              const FormatStyle &Style,
1094                              UnwrappedLineFormatter *BlockFormatter)
1095       : LineFormatter(Indenter, Whitespaces, Style, BlockFormatter) {}
1096 
1097   /// Formats the line, simply keeping all of the input's line breaking
1098   /// decisions.
formatLine(const AnnotatedLine & Line,unsigned FirstIndent,unsigned FirstStartColumn,bool DryRun)1099   unsigned formatLine(const AnnotatedLine &Line, unsigned FirstIndent,
1100                       unsigned FirstStartColumn, bool DryRun) override {
1101     assert(!DryRun);
1102     LineState State = Indenter->getInitialState(FirstIndent, FirstStartColumn,
1103                                                 &Line, /*DryRun=*/false);
1104     while (State.NextToken) {
1105       bool Newline =
1106           Indenter->mustBreak(State) ||
1107           (Indenter->canBreak(State) && State.NextToken->NewlinesBefore > 0);
1108       unsigned Penalty = 0;
1109       formatChildren(State, Newline, /*DryRun=*/false, Penalty);
1110       Indenter->addTokenToState(State, Newline, /*DryRun=*/false);
1111     }
1112     return 0;
1113   }
1114 };
1115 
1116 /// Formatter that puts all tokens into a single line without breaks.
1117 class NoLineBreakFormatter : public LineFormatter {
1118 public:
NoLineBreakFormatter(ContinuationIndenter * Indenter,WhitespaceManager * Whitespaces,const FormatStyle & Style,UnwrappedLineFormatter * BlockFormatter)1119   NoLineBreakFormatter(ContinuationIndenter *Indenter,
1120                        WhitespaceManager *Whitespaces, const FormatStyle &Style,
1121                        UnwrappedLineFormatter *BlockFormatter)
1122       : LineFormatter(Indenter, Whitespaces, Style, BlockFormatter) {}
1123 
1124   /// Puts all tokens into a single line.
formatLine(const AnnotatedLine & Line,unsigned FirstIndent,unsigned FirstStartColumn,bool DryRun)1125   unsigned formatLine(const AnnotatedLine &Line, unsigned FirstIndent,
1126                       unsigned FirstStartColumn, bool DryRun) override {
1127     unsigned Penalty = 0;
1128     LineState State =
1129         Indenter->getInitialState(FirstIndent, FirstStartColumn, &Line, DryRun);
1130     while (State.NextToken) {
1131       formatChildren(State, /*NewLine=*/false, DryRun, Penalty);
1132       Indenter->addTokenToState(
1133           State, /*Newline=*/State.NextToken->MustBreakBefore, DryRun);
1134     }
1135     return Penalty;
1136   }
1137 };
1138 
1139 /// Finds the best way to break lines.
1140 class OptimizingLineFormatter : public LineFormatter {
1141 public:
OptimizingLineFormatter(ContinuationIndenter * Indenter,WhitespaceManager * Whitespaces,const FormatStyle & Style,UnwrappedLineFormatter * BlockFormatter)1142   OptimizingLineFormatter(ContinuationIndenter *Indenter,
1143                           WhitespaceManager *Whitespaces,
1144                           const FormatStyle &Style,
1145                           UnwrappedLineFormatter *BlockFormatter)
1146       : LineFormatter(Indenter, Whitespaces, Style, BlockFormatter) {}
1147 
1148   /// Formats the line by finding the best line breaks with line lengths
1149   /// below the column limit.
formatLine(const AnnotatedLine & Line,unsigned FirstIndent,unsigned FirstStartColumn,bool DryRun)1150   unsigned formatLine(const AnnotatedLine &Line, unsigned FirstIndent,
1151                       unsigned FirstStartColumn, bool DryRun) override {
1152     LineState State =
1153         Indenter->getInitialState(FirstIndent, FirstStartColumn, &Line, DryRun);
1154 
1155     // If the ObjC method declaration does not fit on a line, we should format
1156     // it with one arg per line.
1157     if (State.Line->Type == LT_ObjCMethodDecl)
1158       State.Stack.back().BreakBeforeParameter = true;
1159 
1160     // Find best solution in solution space.
1161     return analyzeSolutionSpace(State, DryRun);
1162   }
1163 
1164 private:
1165   struct CompareLineStatePointers {
operator ()clang::format::__anon1029540c0111::OptimizingLineFormatter::CompareLineStatePointers1166     bool operator()(LineState *obj1, LineState *obj2) const {
1167       return *obj1 < *obj2;
1168     }
1169   };
1170 
1171   /// A pair of <penalty, count> that is used to prioritize the BFS on.
1172   ///
1173   /// In case of equal penalties, we want to prefer states that were inserted
1174   /// first. During state generation we make sure that we insert states first
1175   /// that break the line as late as possible.
1176   typedef std::pair<unsigned, unsigned> OrderedPenalty;
1177 
1178   /// An edge in the solution space from \c Previous->State to \c State,
1179   /// inserting a newline dependent on the \c NewLine.
1180   struct StateNode {
StateNodeclang::format::__anon1029540c0111::OptimizingLineFormatter::StateNode1181     StateNode(const LineState &State, bool NewLine, StateNode *Previous)
1182         : State(State), NewLine(NewLine), Previous(Previous) {}
1183     LineState State;
1184     bool NewLine;
1185     StateNode *Previous;
1186   };
1187 
1188   /// An item in the prioritized BFS search queue. The \c StateNode's
1189   /// \c State has the given \c OrderedPenalty.
1190   typedef std::pair<OrderedPenalty, StateNode *> QueueItem;
1191 
1192   /// The BFS queue type.
1193   typedef std::priority_queue<QueueItem, SmallVector<QueueItem>,
1194                               std::greater<QueueItem>>
1195       QueueType;
1196 
1197   /// Analyze the entire solution space starting from \p InitialState.
1198   ///
1199   /// This implements a variant of Dijkstra's algorithm on the graph that spans
1200   /// the solution space (\c LineStates are the nodes). The algorithm tries to
1201   /// find the shortest path (the one with lowest penalty) from \p InitialState
1202   /// to a state where all tokens are placed. Returns the penalty.
1203   ///
1204   /// If \p DryRun is \c false, directly applies the changes.
analyzeSolutionSpace(LineState & InitialState,bool DryRun)1205   unsigned analyzeSolutionSpace(LineState &InitialState, bool DryRun) {
1206     std::set<LineState *, CompareLineStatePointers> Seen;
1207 
1208     // Increasing count of \c StateNode items we have created. This is used to
1209     // create a deterministic order independent of the container.
1210     unsigned Count = 0;
1211     QueueType Queue;
1212 
1213     // Insert start element into queue.
1214     StateNode *RootNode =
1215         new (Allocator.Allocate()) StateNode(InitialState, false, nullptr);
1216     Queue.push(QueueItem(OrderedPenalty(0, Count), RootNode));
1217     ++Count;
1218 
1219     unsigned Penalty = 0;
1220 
1221     // While not empty, take first element and follow edges.
1222     while (!Queue.empty()) {
1223       // Quit if we still haven't found a solution by now.
1224       if (Count > 25000000)
1225         return 0;
1226 
1227       Penalty = Queue.top().first.first;
1228       StateNode *Node = Queue.top().second;
1229       if (!Node->State.NextToken) {
1230         LLVM_DEBUG(llvm::dbgs()
1231                    << "\n---\nPenalty for line: " << Penalty << "\n");
1232         break;
1233       }
1234       Queue.pop();
1235 
1236       // Cut off the analysis of certain solutions if the analysis gets too
1237       // complex. See description of IgnoreStackForComparison.
1238       if (Count > 50000)
1239         Node->State.IgnoreStackForComparison = true;
1240 
1241       if (!Seen.insert(&Node->State).second) {
1242         // State already examined with lower penalty.
1243         continue;
1244       }
1245 
1246       FormatDecision LastFormat = Node->State.NextToken->getDecision();
1247       if (LastFormat == FD_Unformatted || LastFormat == FD_Continue)
1248         addNextStateToQueue(Penalty, Node, /*NewLine=*/false, &Count, &Queue);
1249       if (LastFormat == FD_Unformatted || LastFormat == FD_Break)
1250         addNextStateToQueue(Penalty, Node, /*NewLine=*/true, &Count, &Queue);
1251     }
1252 
1253     if (Queue.empty()) {
1254       // We were unable to find a solution, do nothing.
1255       // FIXME: Add diagnostic?
1256       LLVM_DEBUG(llvm::dbgs() << "Could not find a solution.\n");
1257       return 0;
1258     }
1259 
1260     // Reconstruct the solution.
1261     if (!DryRun)
1262       reconstructPath(InitialState, Queue.top().second);
1263 
1264     LLVM_DEBUG(llvm::dbgs()
1265                << "Total number of analyzed states: " << Count << "\n");
1266     LLVM_DEBUG(llvm::dbgs() << "---\n");
1267 
1268     return Penalty;
1269   }
1270 
1271   /// Add the following state to the analysis queue \c Queue.
1272   ///
1273   /// Assume the current state is \p PreviousNode and has been reached with a
1274   /// penalty of \p Penalty. Insert a line break if \p NewLine is \c true.
addNextStateToQueue(unsigned Penalty,StateNode * PreviousNode,bool NewLine,unsigned * Count,QueueType * Queue)1275   void addNextStateToQueue(unsigned Penalty, StateNode *PreviousNode,
1276                            bool NewLine, unsigned *Count, QueueType *Queue) {
1277     if (NewLine && !Indenter->canBreak(PreviousNode->State))
1278       return;
1279     if (!NewLine && Indenter->mustBreak(PreviousNode->State))
1280       return;
1281 
1282     StateNode *Node = new (Allocator.Allocate())
1283         StateNode(PreviousNode->State, NewLine, PreviousNode);
1284     if (!formatChildren(Node->State, NewLine, /*DryRun=*/true, Penalty))
1285       return;
1286 
1287     Penalty += Indenter->addTokenToState(Node->State, NewLine, true);
1288 
1289     Queue->push(QueueItem(OrderedPenalty(Penalty, *Count), Node));
1290     ++(*Count);
1291   }
1292 
1293   /// Applies the best formatting by reconstructing the path in the
1294   /// solution space that leads to \c Best.
reconstructPath(LineState & State,StateNode * Best)1295   void reconstructPath(LineState &State, StateNode *Best) {
1296     llvm::SmallVector<StateNode *> Path;
1297     // We do not need a break before the initial token.
1298     while (Best->Previous) {
1299       Path.push_back(Best);
1300       Best = Best->Previous;
1301     }
1302     for (const auto &Node : llvm::reverse(Path)) {
1303       unsigned Penalty = 0;
1304       formatChildren(State, Node->NewLine, /*DryRun=*/false, Penalty);
1305       Penalty += Indenter->addTokenToState(State, Node->NewLine, false);
1306 
1307       LLVM_DEBUG({
1308         printLineState(Node->Previous->State);
1309         if (Node->NewLine) {
1310           llvm::dbgs() << "Penalty for placing "
1311                        << Node->Previous->State.NextToken->Tok.getName()
1312                        << " on a new line: " << Penalty << "\n";
1313         }
1314       });
1315     }
1316   }
1317 
1318   llvm::SpecificBumpPtrAllocator<StateNode> Allocator;
1319 };
1320 
1321 } // anonymous namespace
1322 
format(const SmallVectorImpl<AnnotatedLine * > & Lines,bool DryRun,int AdditionalIndent,bool FixBadIndentation,unsigned FirstStartColumn,unsigned NextStartColumn,unsigned LastStartColumn)1323 unsigned UnwrappedLineFormatter::format(
1324     const SmallVectorImpl<AnnotatedLine *> &Lines, bool DryRun,
1325     int AdditionalIndent, bool FixBadIndentation, unsigned FirstStartColumn,
1326     unsigned NextStartColumn, unsigned LastStartColumn) {
1327   LineJoiner Joiner(Style, Keywords, Lines);
1328 
1329   // Try to look up already computed penalty in DryRun-mode.
1330   std::pair<const SmallVectorImpl<AnnotatedLine *> *, unsigned> CacheKey(
1331       &Lines, AdditionalIndent);
1332   auto CacheIt = PenaltyCache.find(CacheKey);
1333   if (DryRun && CacheIt != PenaltyCache.end())
1334     return CacheIt->second;
1335 
1336   assert(!Lines.empty());
1337   unsigned Penalty = 0;
1338   LevelIndentTracker IndentTracker(Style, Keywords, Lines[0]->Level,
1339                                    AdditionalIndent);
1340   const AnnotatedLine *PrevPrevLine = nullptr;
1341   const AnnotatedLine *PreviousLine = nullptr;
1342   const AnnotatedLine *NextLine = nullptr;
1343 
1344   // The minimum level of consecutive lines that have been formatted.
1345   unsigned RangeMinLevel = UINT_MAX;
1346 
1347   bool FirstLine = true;
1348   for (const AnnotatedLine *Line =
1349            Joiner.getNextMergedLine(DryRun, IndentTracker);
1350        Line; PrevPrevLine = PreviousLine, PreviousLine = Line, Line = NextLine,
1351                            FirstLine = false) {
1352     assert(Line->First);
1353     const AnnotatedLine &TheLine = *Line;
1354     unsigned Indent = IndentTracker.getIndent();
1355 
1356     // We continue formatting unchanged lines to adjust their indent, e.g. if a
1357     // scope was added. However, we need to carefully stop doing this when we
1358     // exit the scope of affected lines to prevent indenting the entire
1359     // remaining file if it currently missing a closing brace.
1360     bool PreviousRBrace =
1361         PreviousLine && PreviousLine->startsWith(tok::r_brace);
1362     bool ContinueFormatting =
1363         TheLine.Level > RangeMinLevel ||
1364         (TheLine.Level == RangeMinLevel && !PreviousRBrace &&
1365          !TheLine.startsWith(tok::r_brace));
1366 
1367     bool FixIndentation = (FixBadIndentation || ContinueFormatting) &&
1368                           Indent != TheLine.First->OriginalColumn;
1369     bool ShouldFormat = TheLine.Affected || FixIndentation;
1370     // We cannot format this line; if the reason is that the line had a
1371     // parsing error, remember that.
1372     if (ShouldFormat && TheLine.Type == LT_Invalid && Status) {
1373       Status->FormatComplete = false;
1374       Status->Line =
1375           SourceMgr.getSpellingLineNumber(TheLine.First->Tok.getLocation());
1376     }
1377 
1378     if (ShouldFormat && TheLine.Type != LT_Invalid) {
1379       if (!DryRun) {
1380         bool LastLine = TheLine.First->is(tok::eof);
1381         formatFirstToken(TheLine, PreviousLine, PrevPrevLine, Lines, Indent,
1382                          LastLine ? LastStartColumn : NextStartColumn + Indent);
1383       }
1384 
1385       NextLine = Joiner.getNextMergedLine(DryRun, IndentTracker);
1386       unsigned ColumnLimit = getColumnLimit(TheLine.InPPDirective, NextLine);
1387       bool FitsIntoOneLine =
1388           !TheLine.ContainsMacroCall &&
1389           (TheLine.Last->TotalLength + Indent <= ColumnLimit ||
1390            (TheLine.Type == LT_ImportStatement &&
1391             (!Style.isJavaScript() || !Style.JavaScriptWrapImports)) ||
1392            (Style.isCSharp() &&
1393             TheLine.InPPDirective)); // don't split #regions in C#
1394       if (Style.ColumnLimit == 0) {
1395         NoColumnLimitLineFormatter(Indenter, Whitespaces, Style, this)
1396             .formatLine(TheLine, NextStartColumn + Indent,
1397                         FirstLine ? FirstStartColumn : 0, DryRun);
1398       } else if (FitsIntoOneLine) {
1399         Penalty += NoLineBreakFormatter(Indenter, Whitespaces, Style, this)
1400                        .formatLine(TheLine, NextStartColumn + Indent,
1401                                    FirstLine ? FirstStartColumn : 0, DryRun);
1402       } else {
1403         Penalty += OptimizingLineFormatter(Indenter, Whitespaces, Style, this)
1404                        .formatLine(TheLine, NextStartColumn + Indent,
1405                                    FirstLine ? FirstStartColumn : 0, DryRun);
1406       }
1407       RangeMinLevel = std::min(RangeMinLevel, TheLine.Level);
1408     } else {
1409       // If no token in the current line is affected, we still need to format
1410       // affected children.
1411       if (TheLine.ChildrenAffected) {
1412         for (const FormatToken *Tok = TheLine.First; Tok; Tok = Tok->Next)
1413           if (!Tok->Children.empty())
1414             format(Tok->Children, DryRun);
1415       }
1416 
1417       // Adapt following lines on the current indent level to the same level
1418       // unless the current \c AnnotatedLine is not at the beginning of a line.
1419       bool StartsNewLine =
1420           TheLine.First->NewlinesBefore > 0 || TheLine.First->IsFirst;
1421       if (StartsNewLine)
1422         IndentTracker.adjustToUnmodifiedLine(TheLine);
1423       if (!DryRun) {
1424         bool ReformatLeadingWhitespace =
1425             StartsNewLine && ((PreviousLine && PreviousLine->Affected) ||
1426                               TheLine.LeadingEmptyLinesAffected);
1427         // Format the first token.
1428         if (ReformatLeadingWhitespace) {
1429           formatFirstToken(TheLine, PreviousLine, PrevPrevLine, Lines,
1430                            TheLine.First->OriginalColumn,
1431                            TheLine.First->OriginalColumn);
1432         } else {
1433           Whitespaces->addUntouchableToken(*TheLine.First,
1434                                            TheLine.InPPDirective);
1435         }
1436 
1437         // Notify the WhitespaceManager about the unchanged whitespace.
1438         for (FormatToken *Tok = TheLine.First->Next; Tok; Tok = Tok->Next)
1439           Whitespaces->addUntouchableToken(*Tok, TheLine.InPPDirective);
1440       }
1441       NextLine = Joiner.getNextMergedLine(DryRun, IndentTracker);
1442       RangeMinLevel = UINT_MAX;
1443     }
1444     if (!DryRun)
1445       markFinalized(TheLine.First);
1446   }
1447   PenaltyCache[CacheKey] = Penalty;
1448   return Penalty;
1449 }
1450 
computeNewlines(const AnnotatedLine & Line,const AnnotatedLine * PreviousLine,const AnnotatedLine * PrevPrevLine,const SmallVectorImpl<AnnotatedLine * > & Lines,const FormatStyle & Style)1451 static auto computeNewlines(const AnnotatedLine &Line,
1452                             const AnnotatedLine *PreviousLine,
1453                             const AnnotatedLine *PrevPrevLine,
1454                             const SmallVectorImpl<AnnotatedLine *> &Lines,
1455                             const FormatStyle &Style) {
1456   const auto &RootToken = *Line.First;
1457   auto Newlines =
1458       std::min(RootToken.NewlinesBefore, Style.MaxEmptyLinesToKeep + 1);
1459   // Remove empty lines before "}" where applicable.
1460   if (RootToken.is(tok::r_brace) &&
1461       (!RootToken.Next ||
1462        (RootToken.Next->is(tok::semi) && !RootToken.Next->Next)) &&
1463       // Do not remove empty lines before namespace closing "}".
1464       !getNamespaceToken(&Line, Lines)) {
1465     Newlines = std::min(Newlines, 1u);
1466   }
1467   // Remove empty lines at the start of nested blocks (lambdas/arrow functions)
1468   if (!PreviousLine && Line.Level > 0)
1469     Newlines = std::min(Newlines, 1u);
1470   if (Newlines == 0 && !RootToken.IsFirst)
1471     Newlines = 1;
1472   if (RootToken.IsFirst && !RootToken.HasUnescapedNewline)
1473     Newlines = 0;
1474 
1475   // Remove empty lines after "{".
1476   if (!Style.KeepEmptyLinesAtTheStartOfBlocks && PreviousLine &&
1477       PreviousLine->Last->is(tok::l_brace) &&
1478       !PreviousLine->startsWithNamespace() &&
1479       !(PrevPrevLine && PrevPrevLine->startsWithNamespace() &&
1480         PreviousLine->startsWith(tok::l_brace)) &&
1481       !startsExternCBlock(*PreviousLine)) {
1482     Newlines = 1;
1483   }
1484 
1485   // Insert or remove empty line before access specifiers.
1486   if (PreviousLine && RootToken.isAccessSpecifier()) {
1487     switch (Style.EmptyLineBeforeAccessModifier) {
1488     case FormatStyle::ELBAMS_Never:
1489       if (Newlines > 1)
1490         Newlines = 1;
1491       break;
1492     case FormatStyle::ELBAMS_Leave:
1493       Newlines = std::max(RootToken.NewlinesBefore, 1u);
1494       break;
1495     case FormatStyle::ELBAMS_LogicalBlock:
1496       if (PreviousLine->Last->isOneOf(tok::semi, tok::r_brace) && Newlines <= 1)
1497         Newlines = 2;
1498       if (PreviousLine->First->isAccessSpecifier())
1499         Newlines = 1; // Previous is an access modifier remove all new lines.
1500       break;
1501     case FormatStyle::ELBAMS_Always: {
1502       const FormatToken *previousToken;
1503       if (PreviousLine->Last->is(tok::comment))
1504         previousToken = PreviousLine->Last->getPreviousNonComment();
1505       else
1506         previousToken = PreviousLine->Last;
1507       if ((!previousToken || previousToken->isNot(tok::l_brace)) &&
1508           Newlines <= 1) {
1509         Newlines = 2;
1510       }
1511     } break;
1512     }
1513   }
1514 
1515   // Insert or remove empty line after access specifiers.
1516   if (PreviousLine && PreviousLine->First->isAccessSpecifier() &&
1517       (!PreviousLine->InPPDirective || !RootToken.HasUnescapedNewline)) {
1518     // EmptyLineBeforeAccessModifier is handling the case when two access
1519     // modifiers follow each other.
1520     if (!RootToken.isAccessSpecifier()) {
1521       switch (Style.EmptyLineAfterAccessModifier) {
1522       case FormatStyle::ELAAMS_Never:
1523         Newlines = 1;
1524         break;
1525       case FormatStyle::ELAAMS_Leave:
1526         Newlines = std::max(Newlines, 1u);
1527         break;
1528       case FormatStyle::ELAAMS_Always:
1529         if (RootToken.is(tok::r_brace)) // Do not add at end of class.
1530           Newlines = 1u;
1531         else
1532           Newlines = std::max(Newlines, 2u);
1533         break;
1534       }
1535     }
1536   }
1537 
1538   return Newlines;
1539 }
1540 
formatFirstToken(const AnnotatedLine & Line,const AnnotatedLine * PreviousLine,const AnnotatedLine * PrevPrevLine,const SmallVectorImpl<AnnotatedLine * > & Lines,unsigned Indent,unsigned NewlineIndent)1541 void UnwrappedLineFormatter::formatFirstToken(
1542     const AnnotatedLine &Line, const AnnotatedLine *PreviousLine,
1543     const AnnotatedLine *PrevPrevLine,
1544     const SmallVectorImpl<AnnotatedLine *> &Lines, unsigned Indent,
1545     unsigned NewlineIndent) {
1546   FormatToken &RootToken = *Line.First;
1547   if (RootToken.is(tok::eof)) {
1548     unsigned Newlines =
1549         std::min(RootToken.NewlinesBefore,
1550                  Style.KeepEmptyLinesAtEOF ? Style.MaxEmptyLinesToKeep + 1 : 1);
1551     unsigned TokenIndent = Newlines ? NewlineIndent : 0;
1552     Whitespaces->replaceWhitespace(RootToken, Newlines, TokenIndent,
1553                                    TokenIndent);
1554     return;
1555   }
1556 
1557   if (RootToken.Newlines < 0) {
1558     RootToken.Newlines =
1559         computeNewlines(Line, PreviousLine, PrevPrevLine, Lines, Style);
1560     assert(RootToken.Newlines >= 0);
1561   }
1562 
1563   if (RootToken.Newlines > 0)
1564     Indent = NewlineIndent;
1565 
1566   // Preprocessor directives get indented before the hash only if specified. In
1567   // Javascript import statements are indented like normal statements.
1568   if (!Style.isJavaScript() &&
1569       Style.IndentPPDirectives != FormatStyle::PPDIS_BeforeHash &&
1570       (Line.Type == LT_PreprocessorDirective ||
1571        Line.Type == LT_ImportStatement)) {
1572     Indent = 0;
1573   }
1574 
1575   Whitespaces->replaceWhitespace(RootToken, RootToken.Newlines, Indent, Indent,
1576                                  /*IsAligned=*/false,
1577                                  Line.InPPDirective &&
1578                                      !RootToken.HasUnescapedNewline);
1579 }
1580 
1581 unsigned
getColumnLimit(bool InPPDirective,const AnnotatedLine * NextLine) const1582 UnwrappedLineFormatter::getColumnLimit(bool InPPDirective,
1583                                        const AnnotatedLine *NextLine) const {
1584   // In preprocessor directives reserve two chars for trailing " \" if the
1585   // next line continues the preprocessor directive.
1586   bool ContinuesPPDirective =
1587       InPPDirective &&
1588       // If there is no next line, this is likely a child line and the parent
1589       // continues the preprocessor directive.
1590       (!NextLine ||
1591        (NextLine->InPPDirective &&
1592         // If there is an unescaped newline between this line and the next, the
1593         // next line starts a new preprocessor directive.
1594         !NextLine->First->HasUnescapedNewline));
1595   return Style.ColumnLimit - (ContinuesPPDirective ? 2 : 0);
1596 }
1597 
1598 } // namespace format
1599 } // namespace clang
1600