1 //===--- UnwrappedLineFormatter.h - Format C++ code -------------*- C++ -*-===// 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 /// \file 10 /// Implements a combinatorial exploration of all the different 11 /// linebreaks unwrapped lines can be formatted in. 12 /// 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_CLANG_LIB_FORMAT_UNWRAPPEDLINEFORMATTER_H 16 #define LLVM_CLANG_LIB_FORMAT_UNWRAPPEDLINEFORMATTER_H 17 18 #include "ContinuationIndenter.h" 19 #include "clang/Format/Format.h" 20 #include <map> 21 22 namespace clang { 23 namespace format { 24 25 class ContinuationIndenter; 26 class WhitespaceManager; 27 28 class UnwrappedLineFormatter { 29 public: 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) {} 38 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); 44 45 private: 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); 53 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; 58 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>, 63 unsigned> 64 PenaltyCache; 65 66 ContinuationIndenter *Indenter; 67 WhitespaceManager *Whitespaces; 68 const FormatStyle &Style; 69 const AdditionalKeywords &Keywords; 70 const SourceManager &SourceMgr; 71 FormattingAttemptStatus *Status; 72 }; 73 } // end namespace format 74 } // end namespace clang 75 76 #endif // LLVM_CLANG_LIB_FORMAT_UNWRAPPEDLINEFORMATTER_H 77