10b57cec5SDimitry Andric //===--- TokenAnalyzer.h - Analyze Token Streams ----------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric /// 90b57cec5SDimitry Andric /// \file 100b57cec5SDimitry Andric /// This file declares an abstract TokenAnalyzer, and associated helper 110b57cec5SDimitry Andric /// classes. TokenAnalyzer can be extended to generate replacements based on 120b57cec5SDimitry Andric /// an annotated and pre-processed token stream. 130b57cec5SDimitry Andric /// 140b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric #ifndef LLVM_CLANG_LIB_FORMAT_TOKENANALYZER_H 170b57cec5SDimitry Andric #define LLVM_CLANG_LIB_FORMAT_TOKENANALYZER_H 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric #include "AffectedRangeManager.h" 200b57cec5SDimitry Andric #include "Encoding.h" 210b57cec5SDimitry Andric #include "FormatToken.h" 220b57cec5SDimitry Andric #include "FormatTokenLexer.h" 230b57cec5SDimitry Andric #include "TokenAnnotator.h" 240b57cec5SDimitry Andric #include "UnwrappedLineParser.h" 250b57cec5SDimitry Andric #include "clang/Basic/Diagnostic.h" 260b57cec5SDimitry Andric #include "clang/Basic/DiagnosticOptions.h" 270b57cec5SDimitry Andric #include "clang/Basic/FileManager.h" 280b57cec5SDimitry Andric #include "clang/Basic/SourceManager.h" 290b57cec5SDimitry Andric #include "clang/Format/Format.h" 300b57cec5SDimitry Andric #include "llvm/ADT/STLExtras.h" 310b57cec5SDimitry Andric #include "llvm/Support/Debug.h" 32*349cc55cSDimitry Andric #include <memory> 330b57cec5SDimitry Andric 340b57cec5SDimitry Andric namespace clang { 350b57cec5SDimitry Andric namespace format { 360b57cec5SDimitry Andric 370b57cec5SDimitry Andric class Environment { 380b57cec5SDimitry Andric public: 390b57cec5SDimitry Andric // This sets up an virtual file system with file \p FileName containing the 400b57cec5SDimitry Andric // fragment \p Code. Assumes that \p Code starts at \p FirstStartColumn, 410b57cec5SDimitry Andric // that the next lines of \p Code should start at \p NextStartColumn, and 420b57cec5SDimitry Andric // that \p Code should end at \p LastStartColumn if it ends in newline. 430b57cec5SDimitry Andric // See also the documentation of clang::format::internal::reformat. 44*349cc55cSDimitry Andric Environment(StringRef Code, StringRef FileName, unsigned FirstStartColumn = 0, 450b57cec5SDimitry Andric unsigned NextStartColumn = 0, unsigned LastStartColumn = 0); 460b57cec5SDimitry Andric 470b57cec5SDimitry Andric FileID getFileID() const { return ID; } 480b57cec5SDimitry Andric 490b57cec5SDimitry Andric const SourceManager &getSourceManager() const { return SM; } 500b57cec5SDimitry Andric 510b57cec5SDimitry Andric ArrayRef<CharSourceRange> getCharRanges() const { return CharRanges; } 520b57cec5SDimitry Andric 530b57cec5SDimitry Andric // Returns the column at which the fragment of code managed by this 540b57cec5SDimitry Andric // environment starts. 550b57cec5SDimitry Andric unsigned getFirstStartColumn() const { return FirstStartColumn; } 560b57cec5SDimitry Andric 570b57cec5SDimitry Andric // Returns the column at which subsequent lines of the fragment of code 580b57cec5SDimitry Andric // managed by this environment should start. 590b57cec5SDimitry Andric unsigned getNextStartColumn() const { return NextStartColumn; } 600b57cec5SDimitry Andric 610b57cec5SDimitry Andric // Returns the column at which the fragment of code managed by this 620b57cec5SDimitry Andric // environment should end if it ends in a newline. 630b57cec5SDimitry Andric unsigned getLastStartColumn() const { return LastStartColumn; } 640b57cec5SDimitry Andric 65*349cc55cSDimitry Andric // Returns nullptr and prints a diagnostic to stderr if the environment 66*349cc55cSDimitry Andric // can't be created. 67*349cc55cSDimitry Andric static std::unique_ptr<Environment> make(StringRef Code, StringRef FileName, 68*349cc55cSDimitry Andric ArrayRef<tooling::Range> Ranges, 69*349cc55cSDimitry Andric unsigned FirstStartColumn = 0, 70*349cc55cSDimitry Andric unsigned NextStartColumn = 0, 71*349cc55cSDimitry Andric unsigned LastStartColumn = 0); 72*349cc55cSDimitry Andric 730b57cec5SDimitry Andric private: 740b57cec5SDimitry Andric // This is only set if constructed from string. 750b57cec5SDimitry Andric std::unique_ptr<SourceManagerForFile> VirtualSM; 760b57cec5SDimitry Andric 770b57cec5SDimitry Andric // This refers to either a SourceManager provided by users or VirtualSM 780b57cec5SDimitry Andric // created for a single file. 790b57cec5SDimitry Andric SourceManager &SM; 800b57cec5SDimitry Andric FileID ID; 810b57cec5SDimitry Andric 820b57cec5SDimitry Andric SmallVector<CharSourceRange, 8> CharRanges; 830b57cec5SDimitry Andric unsigned FirstStartColumn; 840b57cec5SDimitry Andric unsigned NextStartColumn; 850b57cec5SDimitry Andric unsigned LastStartColumn; 860b57cec5SDimitry Andric }; 870b57cec5SDimitry Andric 880b57cec5SDimitry Andric class TokenAnalyzer : public UnwrappedLineConsumer { 890b57cec5SDimitry Andric public: 900b57cec5SDimitry Andric TokenAnalyzer(const Environment &Env, const FormatStyle &Style); 910b57cec5SDimitry Andric 920b57cec5SDimitry Andric std::pair<tooling::Replacements, unsigned> process(); 930b57cec5SDimitry Andric 940b57cec5SDimitry Andric protected: 950b57cec5SDimitry Andric virtual std::pair<tooling::Replacements, unsigned> 960b57cec5SDimitry Andric analyze(TokenAnnotator &Annotator, 970b57cec5SDimitry Andric SmallVectorImpl<AnnotatedLine *> &AnnotatedLines, 980b57cec5SDimitry Andric FormatTokenLexer &Tokens) = 0; 990b57cec5SDimitry Andric 1000b57cec5SDimitry Andric void consumeUnwrappedLine(const UnwrappedLine &TheLine) override; 1010b57cec5SDimitry Andric 1020b57cec5SDimitry Andric void finishRun() override; 1030b57cec5SDimitry Andric 1040b57cec5SDimitry Andric FormatStyle Style; 1050b57cec5SDimitry Andric // Stores Style, FileID and SourceManager etc. 1060b57cec5SDimitry Andric const Environment &Env; 1070b57cec5SDimitry Andric // AffectedRangeMgr stores ranges to be fixed. 1080b57cec5SDimitry Andric AffectedRangeManager AffectedRangeMgr; 1090b57cec5SDimitry Andric SmallVector<SmallVector<UnwrappedLine, 16>, 2> UnwrappedLines; 1100b57cec5SDimitry Andric encoding::Encoding Encoding; 1110b57cec5SDimitry Andric }; 1120b57cec5SDimitry Andric 1130b57cec5SDimitry Andric } // end namespace format 1140b57cec5SDimitry Andric } // end namespace clang 1150b57cec5SDimitry Andric 1160b57cec5SDimitry Andric #endif 117