//===--- TokenAnalyzer.h - Analyze Token Streams ----------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// /// \file /// This file declares an abstract TokenAnalyzer, and associated helper /// classes. TokenAnalyzer can be extended to generate replacements based on /// an annotated and pre-processed token stream. /// //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_LIB_FORMAT_TOKENANALYZER_H #define LLVM_CLANG_LIB_FORMAT_TOKENANALYZER_H #include "AffectedRangeManager.h" #include "Encoding.h" #include "FormatToken.h" #include "FormatTokenLexer.h" #include "TokenAnnotator.h" #include "UnwrappedLineParser.h" #include "clang/Basic/Diagnostic.h" #include "clang/Basic/DiagnosticOptions.h" #include "clang/Basic/FileManager.h" #include "clang/Basic/SourceManager.h" #include "clang/Format/Format.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Support/Debug.h" namespace clang { namespace format { class Environment { public: // This sets up an virtual file system with file \p FileName containing the // fragment \p Code. Assumes that \p Code starts at \p FirstStartColumn, // that the next lines of \p Code should start at \p NextStartColumn, and // that \p Code should end at \p LastStartColumn if it ends in newline. // See also the documentation of clang::format::internal::reformat. Environment(StringRef Code, StringRef FileName, ArrayRef Ranges, unsigned FirstStartColumn = 0, unsigned NextStartColumn = 0, unsigned LastStartColumn = 0); FileID getFileID() const { return ID; } const SourceManager &getSourceManager() const { return SM; } ArrayRef getCharRanges() const { return CharRanges; } // Returns the column at which the fragment of code managed by this // environment starts. unsigned getFirstStartColumn() const { return FirstStartColumn; } // Returns the column at which subsequent lines of the fragment of code // managed by this environment should start. unsigned getNextStartColumn() const { return NextStartColumn; } // Returns the column at which the fragment of code managed by this // environment should end if it ends in a newline. unsigned getLastStartColumn() const { return LastStartColumn; } private: // This is only set if constructed from string. std::unique_ptr VirtualSM; // This refers to either a SourceManager provided by users or VirtualSM // created for a single file. SourceManager &SM; FileID ID; SmallVector CharRanges; unsigned FirstStartColumn; unsigned NextStartColumn; unsigned LastStartColumn; }; class TokenAnalyzer : public UnwrappedLineConsumer { public: TokenAnalyzer(const Environment &Env, const FormatStyle &Style); std::pair process(); protected: virtual std::pair analyze(TokenAnnotator &Annotator, SmallVectorImpl &AnnotatedLines, FormatTokenLexer &Tokens) = 0; void consumeUnwrappedLine(const UnwrappedLine &TheLine) override; void finishRun() override; FormatStyle Style; // Stores Style, FileID and SourceManager etc. const Environment &Env; // AffectedRangeMgr stores ranges to be fixed. AffectedRangeManager AffectedRangeMgr; SmallVector, 2> UnwrappedLines; encoding::Encoding Encoding; }; } // end namespace format } // end namespace clang #endif