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