blob: b0c9dd259fb8df807a4afee7ce80a8a11aee78f6 [file] [log] [blame]
Eric Liu4cfb88a2016-04-25 15:09:22 +00001//===--- AffectedRangeManager.h - Format C++ code ---------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9///
10/// \file
Adrian Prantl9fc8faf2018-05-09 01:00:01 +000011/// AffectedRangeManager class manages affected ranges in the code.
Eric Liu4cfb88a2016-04-25 15:09:22 +000012///
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_CLANG_LIB_FORMAT_AFFECTEDRANGEMANAGER_H
16#define LLVM_CLANG_LIB_FORMAT_AFFECTEDRANGEMANAGER_H
17
18#include "clang/Basic/SourceManager.h"
19
20namespace clang {
21namespace format {
22
23struct FormatToken;
24class AnnotatedLine;
25
26class AffectedRangeManager {
27public:
Eric Liu635423e2016-04-28 07:52:03 +000028 AffectedRangeManager(const SourceManager &SourceMgr,
Eric Liu4cfb88a2016-04-25 15:09:22 +000029 const ArrayRef<CharSourceRange> Ranges)
30 : SourceMgr(SourceMgr), Ranges(Ranges.begin(), Ranges.end()) {}
31
32 // Determines which lines are affected by the SourceRanges given as input.
Manuel Klimek0dddcf72018-04-23 09:34:26 +000033 // Returns \c true if at least one line in \p Lines or one of their
Eric Liu4cfb88a2016-04-25 15:09:22 +000034 // children is affected.
Manuel Klimek0dddcf72018-04-23 09:34:26 +000035 bool computeAffectedLines(SmallVectorImpl<AnnotatedLine *> &Lines);
Eric Liu4cfb88a2016-04-25 15:09:22 +000036
37 // Returns true if 'Range' intersects with one of the input ranges.
38 bool affectsCharSourceRange(const CharSourceRange &Range);
39
40private:
41 // Returns true if the range from 'First' to 'Last' intersects with one of the
42 // input ranges.
43 bool affectsTokenRange(const FormatToken &First, const FormatToken &Last,
44 bool IncludeLeadingNewlines);
45
46 // Returns true if one of the input ranges intersect the leading empty lines
47 // before 'Tok'.
48 bool affectsLeadingEmptyLines(const FormatToken &Tok);
49
50 // Marks all lines between I and E as well as all their children as affected.
51 void markAllAsAffected(SmallVectorImpl<AnnotatedLine *>::iterator I,
52 SmallVectorImpl<AnnotatedLine *>::iterator E);
53
54 // Determines whether 'Line' is affected by the SourceRanges given as input.
55 // Returns \c true if line or one if its children is affected.
Manuel Klimek0dddcf72018-04-23 09:34:26 +000056 bool nonPPLineAffected(AnnotatedLine *Line, const AnnotatedLine *PreviousLine,
57 SmallVectorImpl<AnnotatedLine *> &Lines);
Eric Liuc5cad392016-04-28 07:51:47 +000058
Eric Liu635423e2016-04-28 07:52:03 +000059 const SourceManager &SourceMgr;
Eric Liu4cfb88a2016-04-25 15:09:22 +000060 const SmallVector<CharSourceRange, 8> Ranges;
61};
62
63} // namespace format
64} // namespace clang
65
Eric Liuc5cad392016-04-28 07:51:47 +000066#endif // LLVM_CLANG_LIB_FORMAT_AFFECTEDRANGEMANAGER_H