xref: /aosp_15_r20/external/clang/lib/Format/AffectedRangeManager.h (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===--- AffectedRangeManager.h - Format C++ code ---------------*- C++ -*-===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li ///
10*67e74705SXin Li /// \file
11*67e74705SXin Li /// \brief AffectedRangeManager class manages affected ranges in the code.
12*67e74705SXin Li ///
13*67e74705SXin Li //===----------------------------------------------------------------------===//
14*67e74705SXin Li 
15*67e74705SXin Li #ifndef LLVM_CLANG_LIB_FORMAT_AFFECTEDRANGEMANAGER_H
16*67e74705SXin Li #define LLVM_CLANG_LIB_FORMAT_AFFECTEDRANGEMANAGER_H
17*67e74705SXin Li 
18*67e74705SXin Li #include "clang/Basic/SourceManager.h"
19*67e74705SXin Li 
20*67e74705SXin Li namespace clang {
21*67e74705SXin Li namespace format {
22*67e74705SXin Li 
23*67e74705SXin Li struct FormatToken;
24*67e74705SXin Li class AnnotatedLine;
25*67e74705SXin Li 
26*67e74705SXin Li class AffectedRangeManager {
27*67e74705SXin Li public:
AffectedRangeManager(const SourceManager & SourceMgr,const ArrayRef<CharSourceRange> Ranges)28*67e74705SXin Li   AffectedRangeManager(const SourceManager &SourceMgr,
29*67e74705SXin Li                        const ArrayRef<CharSourceRange> Ranges)
30*67e74705SXin Li       : SourceMgr(SourceMgr), Ranges(Ranges.begin(), Ranges.end()) {}
31*67e74705SXin Li 
32*67e74705SXin Li   // Determines which lines are affected by the SourceRanges given as input.
33*67e74705SXin Li   // Returns \c true if at least one line between I and E or one of their
34*67e74705SXin Li   // children is affected.
35*67e74705SXin Li   bool computeAffectedLines(SmallVectorImpl<AnnotatedLine *>::iterator I,
36*67e74705SXin Li                             SmallVectorImpl<AnnotatedLine *>::iterator E);
37*67e74705SXin Li 
38*67e74705SXin Li   // Returns true if 'Range' intersects with one of the input ranges.
39*67e74705SXin Li   bool affectsCharSourceRange(const CharSourceRange &Range);
40*67e74705SXin Li 
41*67e74705SXin Li private:
42*67e74705SXin Li   // Returns true if the range from 'First' to 'Last' intersects with one of the
43*67e74705SXin Li   // input ranges.
44*67e74705SXin Li   bool affectsTokenRange(const FormatToken &First, const FormatToken &Last,
45*67e74705SXin Li                          bool IncludeLeadingNewlines);
46*67e74705SXin Li 
47*67e74705SXin Li   // Returns true if one of the input ranges intersect the leading empty lines
48*67e74705SXin Li   // before 'Tok'.
49*67e74705SXin Li   bool affectsLeadingEmptyLines(const FormatToken &Tok);
50*67e74705SXin Li 
51*67e74705SXin Li   // Marks all lines between I and E as well as all their children as affected.
52*67e74705SXin Li   void markAllAsAffected(SmallVectorImpl<AnnotatedLine *>::iterator I,
53*67e74705SXin Li                          SmallVectorImpl<AnnotatedLine *>::iterator E);
54*67e74705SXin Li 
55*67e74705SXin Li   // Determines whether 'Line' is affected by the SourceRanges given as input.
56*67e74705SXin Li   // Returns \c true if line or one if its children is affected.
57*67e74705SXin Li   bool nonPPLineAffected(AnnotatedLine *Line,
58*67e74705SXin Li                          const AnnotatedLine *PreviousLine);
59*67e74705SXin Li 
60*67e74705SXin Li   const SourceManager &SourceMgr;
61*67e74705SXin Li   const SmallVector<CharSourceRange, 8> Ranges;
62*67e74705SXin Li };
63*67e74705SXin Li 
64*67e74705SXin Li } // namespace format
65*67e74705SXin Li } // namespace clang
66*67e74705SXin Li 
67*67e74705SXin Li #endif // LLVM_CLANG_LIB_FORMAT_AFFECTEDRANGEMANAGER_H
68