1 //===--- UnwrappedLineFormatter.h - Format C++ code -------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
10 /// Implements a combinatorial exploration of all the different
11 /// linebreaks unwrapped lines can be formatted in.
13 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_CLANG_LIB_FORMAT_UNWRAPPEDLINEFORMATTER_H
16 #define LLVM_CLANG_LIB_FORMAT_UNWRAPPEDLINEFORMATTER_H
18 #include "ContinuationIndenter.h"
19 #include "clang/Format/Format.h"
25 class ContinuationIndenter
;
26 class WhitespaceManager
;
28 class UnwrappedLineFormatter
{
30 UnwrappedLineFormatter(ContinuationIndenter
*Indenter
,
31 WhitespaceManager
*Whitespaces
,
32 const FormatStyle
&Style
,
33 const AdditionalKeywords
&Keywords
,
34 const SourceManager
&SourceMgr
,
35 FormattingAttemptStatus
*Status
)
36 : Indenter(Indenter
), Whitespaces(Whitespaces
), Style(Style
),
37 Keywords(Keywords
), SourceMgr(SourceMgr
), Status(Status
) {}
39 /// Format the current block and return the penalty.
40 unsigned format(const SmallVectorImpl
<AnnotatedLine
*> &Lines
,
41 bool DryRun
= false, int AdditionalIndent
= 0,
42 bool FixBadIndentation
= false, unsigned FirstStartColumn
= 0,
43 unsigned NextStartColumn
= 0, unsigned LastStartColumn
= 0);
46 /// Add a new line and the required indent before the first Token
47 /// of the \c UnwrappedLine if there was no structural parsing error.
48 void formatFirstToken(const AnnotatedLine
&Line
,
49 const AnnotatedLine
*PreviousLine
,
50 const AnnotatedLine
*PrevPrevLine
,
51 const SmallVectorImpl
<AnnotatedLine
*> &Lines
,
52 unsigned Indent
, unsigned NewlineIndent
);
54 /// Returns the column limit for a line, taking into account whether we
55 /// need an escaped newline due to a continued preprocessor directive.
56 unsigned getColumnLimit(bool InPPDirective
,
57 const AnnotatedLine
*NextLine
) const;
59 // Cache to store the penalty of formatting a vector of AnnotatedLines
60 // starting from a specific additional offset. Improves performance if there
61 // are many nested blocks.
62 std::map
<std::pair
<const SmallVectorImpl
<AnnotatedLine
*> *, unsigned>,
66 ContinuationIndenter
*Indenter
;
67 WhitespaceManager
*Whitespaces
;
68 const FormatStyle
&Style
;
69 const AdditionalKeywords
&Keywords
;
70 const SourceManager
&SourceMgr
;
71 FormattingAttemptStatus
*Status
;
73 } // end namespace format
74 } // end namespace clang
76 #endif // LLVM_CLANG_LIB_FORMAT_UNWRAPPEDLINEFORMATTER_H