xref: /freebsd/contrib/llvm-project/clang/lib/Format/TokenAnalyzer.h (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
1*0b57cec5SDimitry Andric //===--- TokenAnalyzer.h - Analyze Token Streams ----------------*- C++ -*-===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric ///
9*0b57cec5SDimitry Andric /// \file
10*0b57cec5SDimitry Andric /// This file declares an abstract TokenAnalyzer, and associated helper
11*0b57cec5SDimitry Andric /// classes. TokenAnalyzer can be extended to generate replacements based on
12*0b57cec5SDimitry Andric /// an annotated and pre-processed token stream.
13*0b57cec5SDimitry Andric ///
14*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
15*0b57cec5SDimitry Andric 
16*0b57cec5SDimitry Andric #ifndef LLVM_CLANG_LIB_FORMAT_TOKENANALYZER_H
17*0b57cec5SDimitry Andric #define LLVM_CLANG_LIB_FORMAT_TOKENANALYZER_H
18*0b57cec5SDimitry Andric 
19*0b57cec5SDimitry Andric #include "AffectedRangeManager.h"
20*0b57cec5SDimitry Andric #include "Encoding.h"
21*0b57cec5SDimitry Andric #include "FormatToken.h"
22*0b57cec5SDimitry Andric #include "FormatTokenLexer.h"
23*0b57cec5SDimitry Andric #include "TokenAnnotator.h"
24*0b57cec5SDimitry Andric #include "UnwrappedLineParser.h"
25*0b57cec5SDimitry Andric #include "clang/Basic/Diagnostic.h"
26*0b57cec5SDimitry Andric #include "clang/Basic/DiagnosticOptions.h"
27*0b57cec5SDimitry Andric #include "clang/Basic/FileManager.h"
28*0b57cec5SDimitry Andric #include "clang/Basic/SourceManager.h"
29*0b57cec5SDimitry Andric #include "clang/Format/Format.h"
30*0b57cec5SDimitry Andric #include "llvm/ADT/STLExtras.h"
31*0b57cec5SDimitry Andric #include "llvm/Support/Debug.h"
32*0b57cec5SDimitry Andric 
33*0b57cec5SDimitry Andric namespace clang {
34*0b57cec5SDimitry Andric namespace format {
35*0b57cec5SDimitry Andric 
36*0b57cec5SDimitry Andric class Environment {
37*0b57cec5SDimitry Andric public:
38*0b57cec5SDimitry Andric   // This sets up an virtual file system with file \p FileName containing the
39*0b57cec5SDimitry Andric   // fragment \p Code. Assumes that \p Code starts at \p FirstStartColumn,
40*0b57cec5SDimitry Andric   // that the next lines of \p Code should start at \p NextStartColumn, and
41*0b57cec5SDimitry Andric   // that \p Code should end at \p LastStartColumn if it ends in newline.
42*0b57cec5SDimitry Andric   // See also the documentation of clang::format::internal::reformat.
43*0b57cec5SDimitry Andric   Environment(StringRef Code, StringRef FileName,
44*0b57cec5SDimitry Andric               ArrayRef<tooling::Range> Ranges, unsigned FirstStartColumn = 0,
45*0b57cec5SDimitry Andric               unsigned NextStartColumn = 0, unsigned LastStartColumn = 0);
46*0b57cec5SDimitry Andric 
47*0b57cec5SDimitry Andric   FileID getFileID() const { return ID; }
48*0b57cec5SDimitry Andric 
49*0b57cec5SDimitry Andric   const SourceManager &getSourceManager() const { return SM; }
50*0b57cec5SDimitry Andric 
51*0b57cec5SDimitry Andric   ArrayRef<CharSourceRange> getCharRanges() const { return CharRanges; }
52*0b57cec5SDimitry Andric 
53*0b57cec5SDimitry Andric   // Returns the column at which the fragment of code managed by this
54*0b57cec5SDimitry Andric   // environment starts.
55*0b57cec5SDimitry Andric   unsigned getFirstStartColumn() const { return FirstStartColumn; }
56*0b57cec5SDimitry Andric 
57*0b57cec5SDimitry Andric   // Returns the column at which subsequent lines of the fragment of code
58*0b57cec5SDimitry Andric   // managed by this environment should start.
59*0b57cec5SDimitry Andric   unsigned getNextStartColumn() const { return NextStartColumn; }
60*0b57cec5SDimitry Andric 
61*0b57cec5SDimitry Andric   // Returns the column at which the fragment of code managed by this
62*0b57cec5SDimitry Andric   // environment should end if it ends in a newline.
63*0b57cec5SDimitry Andric   unsigned getLastStartColumn() const { return LastStartColumn; }
64*0b57cec5SDimitry Andric 
65*0b57cec5SDimitry Andric private:
66*0b57cec5SDimitry Andric   // This is only set if constructed from string.
67*0b57cec5SDimitry Andric   std::unique_ptr<SourceManagerForFile> VirtualSM;
68*0b57cec5SDimitry Andric 
69*0b57cec5SDimitry Andric   // This refers to either a SourceManager provided by users or VirtualSM
70*0b57cec5SDimitry Andric   // created for a single file.
71*0b57cec5SDimitry Andric   SourceManager &SM;
72*0b57cec5SDimitry Andric   FileID ID;
73*0b57cec5SDimitry Andric 
74*0b57cec5SDimitry Andric   SmallVector<CharSourceRange, 8> CharRanges;
75*0b57cec5SDimitry Andric   unsigned FirstStartColumn;
76*0b57cec5SDimitry Andric   unsigned NextStartColumn;
77*0b57cec5SDimitry Andric   unsigned LastStartColumn;
78*0b57cec5SDimitry Andric };
79*0b57cec5SDimitry Andric 
80*0b57cec5SDimitry Andric class TokenAnalyzer : public UnwrappedLineConsumer {
81*0b57cec5SDimitry Andric public:
82*0b57cec5SDimitry Andric   TokenAnalyzer(const Environment &Env, const FormatStyle &Style);
83*0b57cec5SDimitry Andric 
84*0b57cec5SDimitry Andric   std::pair<tooling::Replacements, unsigned> process();
85*0b57cec5SDimitry Andric 
86*0b57cec5SDimitry Andric protected:
87*0b57cec5SDimitry Andric   virtual std::pair<tooling::Replacements, unsigned>
88*0b57cec5SDimitry Andric   analyze(TokenAnnotator &Annotator,
89*0b57cec5SDimitry Andric           SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,
90*0b57cec5SDimitry Andric           FormatTokenLexer &Tokens) = 0;
91*0b57cec5SDimitry Andric 
92*0b57cec5SDimitry Andric   void consumeUnwrappedLine(const UnwrappedLine &TheLine) override;
93*0b57cec5SDimitry Andric 
94*0b57cec5SDimitry Andric   void finishRun() override;
95*0b57cec5SDimitry Andric 
96*0b57cec5SDimitry Andric   FormatStyle Style;
97*0b57cec5SDimitry Andric   // Stores Style, FileID and SourceManager etc.
98*0b57cec5SDimitry Andric   const Environment &Env;
99*0b57cec5SDimitry Andric   // AffectedRangeMgr stores ranges to be fixed.
100*0b57cec5SDimitry Andric   AffectedRangeManager AffectedRangeMgr;
101*0b57cec5SDimitry Andric   SmallVector<SmallVector<UnwrappedLine, 16>, 2> UnwrappedLines;
102*0b57cec5SDimitry Andric   encoding::Encoding Encoding;
103*0b57cec5SDimitry Andric };
104*0b57cec5SDimitry Andric 
105*0b57cec5SDimitry Andric } // end namespace format
106*0b57cec5SDimitry Andric } // end namespace clang
107*0b57cec5SDimitry Andric 
108*0b57cec5SDimitry Andric #endif
109