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 combinartorial 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
22namespace clang {
23namespace format {
24
25class ContinuationIndenter;
26class WhitespaceManager;
27
28class UnwrappedLineFormatter {
29public:
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
45private:
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 SmallVectorImpl<AnnotatedLine *> &Lines,
51                        unsigned Indent, unsigned NewlineIndent);
52
53  /// Returns the column limit for a line, taking into account whether we
54  /// need an escaped newline due to a continued preprocessor directive.
55  unsigned getColumnLimit(bool InPPDirective,
56                          const AnnotatedLine *NextLine) const;
57
58  // Cache to store the penalty of formatting a vector of AnnotatedLines
59  // starting from a specific additional offset. Improves performance if there
60  // are many nested blocks.
61  std::map<std::pair<const SmallVectorImpl<AnnotatedLine *> *, unsigned>,
62           unsigned>
63      PenaltyCache;
64
65  ContinuationIndenter *Indenter;
66  WhitespaceManager *Whitespaces;
67  const FormatStyle &Style;
68  const AdditionalKeywords &Keywords;
69  const SourceManager &SourceMgr;
70  FormattingAttemptStatus *Status;
71};
72} // end namespace format
73} // end namespace clang
74
75#endif // LLVM_CLANG_LIB_FORMAT_UNWRAPPEDLINEFORMATTER_H
76