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