xref: /aosp_15_r20/external/clang/lib/Format/TokenAnalyzer.h (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===--- TokenAnalyzer.h - Analyze Token Streams ----------------*- 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 This file declares an abstract TokenAnalyzer, and associated helper
12*67e74705SXin Li /// classes. TokenAnalyzer can be extended to generate replacements based on
13*67e74705SXin Li /// an annotated and pre-processed token stream.
14*67e74705SXin Li ///
15*67e74705SXin Li //===----------------------------------------------------------------------===//
16*67e74705SXin Li 
17*67e74705SXin Li #ifndef LLVM_CLANG_LIB_FORMAT_TOKENANALYZER_H
18*67e74705SXin Li #define LLVM_CLANG_LIB_FORMAT_TOKENANALYZER_H
19*67e74705SXin Li 
20*67e74705SXin Li #include "AffectedRangeManager.h"
21*67e74705SXin Li #include "Encoding.h"
22*67e74705SXin Li #include "FormatToken.h"
23*67e74705SXin Li #include "FormatTokenLexer.h"
24*67e74705SXin Li #include "TokenAnnotator.h"
25*67e74705SXin Li #include "UnwrappedLineParser.h"
26*67e74705SXin Li #include "clang/Basic/Diagnostic.h"
27*67e74705SXin Li #include "clang/Basic/DiagnosticOptions.h"
28*67e74705SXin Li #include "clang/Basic/FileManager.h"
29*67e74705SXin Li #include "clang/Basic/SourceManager.h"
30*67e74705SXin Li #include "clang/Format/Format.h"
31*67e74705SXin Li #include "llvm/ADT/STLExtras.h"
32*67e74705SXin Li #include "llvm/Support/Debug.h"
33*67e74705SXin Li 
34*67e74705SXin Li #define DEBUG_TYPE "format-formatter"
35*67e74705SXin Li 
36*67e74705SXin Li namespace clang {
37*67e74705SXin Li namespace format {
38*67e74705SXin Li 
39*67e74705SXin Li class Environment {
40*67e74705SXin Li public:
Environment(SourceManager & SM,FileID ID,ArrayRef<CharSourceRange> Ranges)41*67e74705SXin Li   Environment(SourceManager &SM, FileID ID, ArrayRef<CharSourceRange> Ranges)
42*67e74705SXin Li       : ID(ID), CharRanges(Ranges.begin(), Ranges.end()), SM(SM) {}
43*67e74705SXin Li 
Environment(FileID ID,std::unique_ptr<FileManager> FileMgr,std::unique_ptr<SourceManager> VirtualSM,std::unique_ptr<DiagnosticsEngine> Diagnostics,const std::vector<CharSourceRange> & CharRanges)44*67e74705SXin Li   Environment(FileID ID, std::unique_ptr<FileManager> FileMgr,
45*67e74705SXin Li               std::unique_ptr<SourceManager> VirtualSM,
46*67e74705SXin Li               std::unique_ptr<DiagnosticsEngine> Diagnostics,
47*67e74705SXin Li               const std::vector<CharSourceRange> &CharRanges)
48*67e74705SXin Li       : ID(ID), CharRanges(CharRanges.begin(), CharRanges.end()),
49*67e74705SXin Li         SM(*VirtualSM), FileMgr(std::move(FileMgr)),
50*67e74705SXin Li         VirtualSM(std::move(VirtualSM)), Diagnostics(std::move(Diagnostics)) {}
51*67e74705SXin Li 
52*67e74705SXin Li   // This sets up an virtual file system with file \p FileName containing \p
53*67e74705SXin Li   // Code.
54*67e74705SXin Li   static std::unique_ptr<Environment>
55*67e74705SXin Li   CreateVirtualEnvironment(StringRef Code, StringRef FileName,
56*67e74705SXin Li                            ArrayRef<tooling::Range> Ranges);
57*67e74705SXin Li 
getFileID()58*67e74705SXin Li   FileID getFileID() const { return ID; }
59*67e74705SXin Li 
getFileName()60*67e74705SXin Li   StringRef getFileName() const { return FileName; }
61*67e74705SXin Li 
getCharRanges()62*67e74705SXin Li   ArrayRef<CharSourceRange> getCharRanges() const { return CharRanges; }
63*67e74705SXin Li 
getSourceManager()64*67e74705SXin Li   const SourceManager &getSourceManager() const { return SM; }
65*67e74705SXin Li 
66*67e74705SXin Li private:
67*67e74705SXin Li   FileID ID;
68*67e74705SXin Li   StringRef FileName;
69*67e74705SXin Li   SmallVector<CharSourceRange, 8> CharRanges;
70*67e74705SXin Li   SourceManager &SM;
71*67e74705SXin Li 
72*67e74705SXin Li   // The order of these fields are important - they should be in the same order
73*67e74705SXin Li   // as they are created in `CreateVirtualEnvironment` so that they can be
74*67e74705SXin Li   // deleted in the reverse order as they are created.
75*67e74705SXin Li   std::unique_ptr<FileManager> FileMgr;
76*67e74705SXin Li   std::unique_ptr<SourceManager> VirtualSM;
77*67e74705SXin Li   std::unique_ptr<DiagnosticsEngine> Diagnostics;
78*67e74705SXin Li };
79*67e74705SXin Li 
80*67e74705SXin Li class TokenAnalyzer : public UnwrappedLineConsumer {
81*67e74705SXin Li public:
82*67e74705SXin Li   TokenAnalyzer(const Environment &Env, const FormatStyle &Style);
83*67e74705SXin Li 
84*67e74705SXin Li   tooling::Replacements process();
85*67e74705SXin Li 
86*67e74705SXin Li protected:
87*67e74705SXin Li   virtual tooling::Replacements
88*67e74705SXin Li   analyze(TokenAnnotator &Annotator,
89*67e74705SXin Li           SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,
90*67e74705SXin Li           FormatTokenLexer &Tokens, tooling::Replacements &Result) = 0;
91*67e74705SXin Li 
92*67e74705SXin Li   void consumeUnwrappedLine(const UnwrappedLine &TheLine) override;
93*67e74705SXin Li 
94*67e74705SXin Li   void finishRun() override;
95*67e74705SXin Li 
96*67e74705SXin Li   FormatStyle Style;
97*67e74705SXin Li   // Stores Style, FileID and SourceManager etc.
98*67e74705SXin Li   const Environment &Env;
99*67e74705SXin Li   // AffectedRangeMgr stores ranges to be fixed.
100*67e74705SXin Li   AffectedRangeManager AffectedRangeMgr;
101*67e74705SXin Li   SmallVector<SmallVector<UnwrappedLine, 16>, 2> UnwrappedLines;
102*67e74705SXin Li   encoding::Encoding Encoding;
103*67e74705SXin Li };
104*67e74705SXin Li 
105*67e74705SXin Li } // end namespace format
106*67e74705SXin Li } // end namespace clang
107*67e74705SXin Li 
108*67e74705SXin Li #endif
109