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