BreakableToken.h revision 3d9ffcf3aa0ed84fa297e3c461bb84e48221aa2d
170ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko//===--- BreakableToken.h - Format C++ code -------------------------------===//
270ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko//
370ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko//                     The LLVM Compiler Infrastructure
470ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko//
570ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko// This file is distributed under the University of Illinois Open Source
670ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko// License. See LICENSE.TXT for details.
770ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko//
870ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko//===----------------------------------------------------------------------===//
970ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko///
1070ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko/// \file
1170ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko/// \brief Declares BreakableToken, BreakableStringLiteral, and
1270ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko/// BreakableBlockComment classes, that contain token type-specific logic to
1370ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko/// break long lines in tokens.
1470ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko///
1570ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko//===----------------------------------------------------------------------===//
1670ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko
1770ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko#ifndef LLVM_CLANG_FORMAT_BREAKABLETOKEN_H
1870ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko#define LLVM_CLANG_FORMAT_BREAKABLETOKEN_H
1970ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko
2000895106f9ed602af67984ec4d225a0cdc8c12afAlexander Kornienko#include "Encoding.h"
2170ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko#include "TokenAnnotator.h"
2270ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko#include "WhitespaceManager.h"
2370ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko#include <utility>
2470ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko
2570ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienkonamespace clang {
2670ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienkonamespace format {
2770ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko
28de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimekstruct FormatStyle;
29de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek
30de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek/// \brief Base class for strategies on how to break tokens.
31de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek///
32de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek/// FIXME: The interface seems set in stone, so we might want to just pull the
33de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek/// strategy into the class, instead of controlling it from the outside.
3470ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienkoclass BreakableToken {
3570ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienkopublic:
362785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko  /// \brief Contains starting character index and length of split.
37de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  typedef std::pair<StringRef::size_type, unsigned> Split;
38de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek
3970ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko  virtual ~BreakableToken() {}
40de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek
41de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  /// \brief Returns the number of lines in this token in the original code.
4270ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko  virtual unsigned getLineCount() const = 0;
43de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek
442785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko  /// \brief Returns the number of columns required to format the piece of line
452785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko  /// at \p LineIndex, from byte offset \p Offset with length \p Length.
46de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  ///
472785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko  /// Note that previous breaks are not taken into account. \p Offset is always
482785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko  /// specified from the start of the (original) line.
492785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko  /// \p Length can be set to StringRef::npos, which means "to the end of line".
502785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko  virtual unsigned
512a409b62126d8f0b8f5749d5ed435ad2b394b526Daniel Jasper  getLineLengthAfterSplit(unsigned LineIndex, unsigned Offset,
522a409b62126d8f0b8f5749d5ed435ad2b394b526Daniel Jasper                          StringRef::size_type Length) const = 0;
5370ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko
54de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  /// \brief Returns a range (offset, length) at which to break the line at
55de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  /// \p LineIndex, if previously broken at \p TailOffset. If possible, do not
56de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  /// violate \p ColumnLimit.
5770ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko  virtual Split getSplit(unsigned LineIndex, unsigned TailOffset,
58919398bb40d5d643f38b6595f5e8eac641e89d50Alexander Kornienko                         unsigned ColumnLimit) const = 0;
59de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek
60de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  /// \brief Emits the previously retrieved \p Split via \p Whitespaces.
6170ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko  virtual void insertBreak(unsigned LineIndex, unsigned TailOffset, Split Split,
6270ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko                           WhitespaceManager &Whitespaces) = 0;
63de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek
64de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  /// \brief Replaces the whitespace between \p LineIndex-1 and \p LineIndex.
65de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  virtual void replaceWhitespaceBefore(unsigned LineIndex,
66de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek                                       WhitespaceManager &Whitespaces) {}
67de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek
68919398bb40d5d643f38b6595f5e8eac641e89d50Alexander Kornienkoprotected:
693d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko  BreakableToken(const FormatToken &Tok, unsigned IndentLevel,
703d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko                 bool InPPDirective, encoding::Encoding Encoding,
713d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko                 const FormatStyle &Style)
723d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko      : Tok(Tok), IndentLevel(IndentLevel), InPPDirective(InPPDirective),
733d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko        Encoding(Encoding), Style(Style) {}
74de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek
75919398bb40d5d643f38b6595f5e8eac641e89d50Alexander Kornienko  const FormatToken &Tok;
763d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko  const unsigned IndentLevel;
7716a0ec60507a4eec275a5c3a86d4501b1b7b817bAlexander Kornienko  const bool InPPDirective;
7816a0ec60507a4eec275a5c3a86d4501b1b7b817bAlexander Kornienko  const encoding::Encoding Encoding;
790b62cc30c9aa462184de0435dc083d944a41d67fAlexander Kornienko  const FormatStyle &Style;
8070ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko};
8170ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko
82de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek/// \brief Base class for single line tokens that can be broken.
83de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek///
84de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek/// \c getSplit() needs to be implemented by child classes.
85de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimekclass BreakableSingleLineToken : public BreakableToken {
8670ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienkopublic:
87de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  virtual unsigned getLineCount() const;
8870ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko  virtual unsigned getLineLengthAfterSplit(unsigned LineIndex,
892785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko                                           unsigned TailOffset,
902785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko                                           StringRef::size_type Length) const;
9170ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko
92de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimekprotected:
933d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko  BreakableSingleLineToken(const FormatToken &Tok, unsigned IndentLevel,
943d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko                           unsigned StartColumn, StringRef Prefix,
953d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko                           StringRef Postfix, bool InPPDirective,
963d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko                           encoding::Encoding Encoding,
970b62cc30c9aa462184de0435dc083d944a41d67fAlexander Kornienko                           const FormatStyle &Style);
9870ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko
99de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // The column in which the token starts.
100de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  unsigned StartColumn;
101de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // The prefix a line needs after a break in the token.
102de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  StringRef Prefix;
103de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // The postfix a line needs before introducing a break.
104de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  StringRef Postfix;
105de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // The token text excluding the prefix and postfix.
106de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  StringRef Line;
10770ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko};
10870ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko
109de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimekclass BreakableStringLiteral : public BreakableSingleLineToken {
11070ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienkopublic:
111de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  /// \brief Creates a breakable token for a single line string literal.
112de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  ///
113de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  /// \p StartColumn specifies the column in which the token will start
114de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  /// after formatting.
1153d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko  BreakableStringLiteral(const FormatToken &Tok, unsigned IndentLevel,
1163d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko                         unsigned StartColumn, StringRef Prefix,
1173d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko                         StringRef Postfix, bool InPPDirective,
1183d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko                         encoding::Encoding Encoding, const FormatStyle &Style);
11970ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko
12070ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko  virtual Split getSplit(unsigned LineIndex, unsigned TailOffset,
121919398bb40d5d643f38b6595f5e8eac641e89d50Alexander Kornienko                         unsigned ColumnLimit) const;
1222b2faa53ecd32e823c55430d0889c11ea91b582cAlexander Kornienko  virtual void insertBreak(unsigned LineIndex, unsigned TailOffset, Split Split,
1232b2faa53ecd32e823c55430d0889c11ea91b582cAlexander Kornienko                           WhitespaceManager &Whitespaces);
12470ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko};
12570ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko
126de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimekclass BreakableLineComment : public BreakableSingleLineToken {
127919398bb40d5d643f38b6595f5e8eac641e89d50Alexander Kornienkopublic:
128de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  /// \brief Creates a breakable token for a line comment.
129de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  ///
130de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  /// \p StartColumn specifies the column in which the comment will start
131de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  /// after formatting.
1323d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko  BreakableLineComment(const FormatToken &Token, unsigned IndentLevel,
1333d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko                       unsigned StartColumn, bool InPPDirective,
1343d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko                       encoding::Encoding Encoding, const FormatStyle &Style);
135919398bb40d5d643f38b6595f5e8eac641e89d50Alexander Kornienko
136de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  virtual Split getSplit(unsigned LineIndex, unsigned TailOffset,
137de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek                         unsigned ColumnLimit) const;
1382b2faa53ecd32e823c55430d0889c11ea91b582cAlexander Kornienko  virtual void insertBreak(unsigned LineIndex, unsigned TailOffset, Split Split,
13916a0ec60507a4eec275a5c3a86d4501b1b7b817bAlexander Kornienko                           WhitespaceManager &Whitespaces);
1402b2faa53ecd32e823c55430d0889c11ea91b582cAlexander Kornienko  virtual void replaceWhitespaceBefore(unsigned LineIndex,
1412b2faa53ecd32e823c55430d0889c11ea91b582cAlexander Kornienko                                       WhitespaceManager &Whitespaces);
1422b2faa53ecd32e823c55430d0889c11ea91b582cAlexander Kornienko
1432b2faa53ecd32e823c55430d0889c11ea91b582cAlexander Kornienkoprivate:
1442b2faa53ecd32e823c55430d0889c11ea91b582cAlexander Kornienko  // The prefix without an additional space if one was added.
1452b2faa53ecd32e823c55430d0889c11ea91b582cAlexander Kornienko  StringRef OriginalPrefix;
146de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek};
147919398bb40d5d643f38b6595f5e8eac641e89d50Alexander Kornienko
148de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimekclass BreakableBlockComment : public BreakableToken {
149de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimekpublic:
150de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  /// \brief Creates a breakable token for a block comment.
151de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  ///
152de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  /// \p StartColumn specifies the column in which the comment will start
153de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  /// after formatting, while \p OriginalStartColumn specifies in which
154de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  /// column the comment started before formatting.
155de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  /// If the comment starts a line after formatting, set \p FirstInLine to true.
1563d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko  BreakableBlockComment(const FormatToken &Token, unsigned IndentLevel,
1573d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko                        unsigned StartColumn, unsigned OriginaStartColumn,
1583d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko                        bool FirstInLine, bool InPPDirective,
1593d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko                        encoding::Encoding Encoding, const FormatStyle &Style);
160de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek
161de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  virtual unsigned getLineCount() const;
162919398bb40d5d643f38b6595f5e8eac641e89d50Alexander Kornienko  virtual unsigned getLineLengthAfterSplit(unsigned LineIndex,
1632785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko                                           unsigned TailOffset,
1642785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko                                           StringRef::size_type Length) const;
165de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  virtual Split getSplit(unsigned LineIndex, unsigned TailOffset,
166de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek                         unsigned ColumnLimit) const;
167de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  virtual void insertBreak(unsigned LineIndex, unsigned TailOffset, Split Split,
16816a0ec60507a4eec275a5c3a86d4501b1b7b817bAlexander Kornienko                           WhitespaceManager &Whitespaces);
169de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  virtual void replaceWhitespaceBefore(unsigned LineIndex,
170de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek                                       WhitespaceManager &Whitespaces);
171919398bb40d5d643f38b6595f5e8eac641e89d50Alexander Kornienko
172919398bb40d5d643f38b6595f5e8eac641e89d50Alexander Kornienkoprivate:
173de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // Rearranges the whitespace between Lines[LineIndex-1] and Lines[LineIndex],
174de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // so that all whitespace between the lines is accounted to Lines[LineIndex]
175de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // as leading whitespace:
176de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // - Lines[LineIndex] points to the text after that whitespace
177de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // - Lines[LineIndex-1] shrinks by its trailing whitespace
178de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // - LeadingWhitespace[LineIndex] is updated with the complete whitespace
179de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  //   between the end of the text of Lines[LineIndex-1] and Lines[LineIndex]
180de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  //
181de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // Sets StartOfLineColumn to the intended column in which the text at
182de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // Lines[LineIndex] starts (note that the decoration, if present, is not
183de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // considered part of the text).
1840b62cc30c9aa462184de0435dc083d944a41d67fAlexander Kornienko  void adjustWhitespace(unsigned LineIndex, int IndentDelta);
185de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek
186de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // Returns the column at which the text in line LineIndex starts, when broken
187de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // at TailOffset. Note that the decoration (if present) is not considered part
188de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // of the text.
189de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  unsigned getContentStartColumn(unsigned LineIndex, unsigned TailOffset) const;
190de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek
191de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // Contains the text of the lines of the block comment, excluding the leading
192de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // /* in the first line and trailing */ in the last line, and excluding all
193de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // trailing whitespace between the lines. Note that the decoration (if
194de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // present) is also not considered part of the text.
195de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  SmallVector<StringRef, 16> Lines;
196919398bb40d5d643f38b6595f5e8eac641e89d50Alexander Kornienko
197de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // LeadingWhitespace[i] is the number of characters regarded as whitespace in
198de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // front of Lines[i]. Note that this can include "* " sequences, which we
199de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // regard as whitespace when all lines have a "*" prefix.
200de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  SmallVector<unsigned, 16> LeadingWhitespace;
201de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek
202de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // StartOfLineColumn[i] is the target column at which Line[i] should be.
203de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // Note that this excludes a leading "* " or "*" in case all lines have
204de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // a "*" prefix.
205de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  SmallVector<unsigned, 16> StartOfLineColumn;
206de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek
207de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // The column at which the text of a broken line should start.
208de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // Note that an optional decoration would go before that column.
209de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // IndentAtLineBreak is a uniform position for all lines in a block comment,
210de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // regardless of their relative position.
211de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // FIXME: Revisit the decision to do this; the main reason was to support
212de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // patterns like
213de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // /**************//**
214de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  //  * Comment
215de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // We could also support such patterns by special casing the first line
216de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // instead.
217de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  unsigned IndentAtLineBreak;
218919398bb40d5d643f38b6595f5e8eac641e89d50Alexander Kornienko
2191659dedac63858de50ee60175a88c42ff974e61bAlexander Kornienko  // This is to distinguish between the case when the last line was empty and
2201659dedac63858de50ee60175a88c42ff974e61bAlexander Kornienko  // the case when it started with a decoration ("*" or "* ").
2211659dedac63858de50ee60175a88c42ff974e61bAlexander Kornienko  bool LastLineNeedsDecoration;
2221659dedac63858de50ee60175a88c42ff974e61bAlexander Kornienko
223de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  // Either "* " if all lines begin with a "*", or empty.
224de008c0f3bf66103185fc9f7f49995fa431451a6Manuel Klimek  StringRef Decoration;
225919398bb40d5d643f38b6595f5e8eac641e89d50Alexander Kornienko};
226919398bb40d5d643f38b6595f5e8eac641e89d50Alexander Kornienko
22770ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko} // namespace format
22870ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko} // namespace clang
22970ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko
23070ce7881fc30a39b795b2873f008e7eca72ba669Alexander Kornienko#endif // LLVM_CLANG_FORMAT_BREAKABLETOKEN_H
231