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 "FormatTokenLexer.h" 210b57cec5SDimitry Andric #include "TokenAnnotator.h" 220b57cec5SDimitry Andric 230b57cec5SDimitry Andric namespace clang { 240b57cec5SDimitry Andric namespace format { 250b57cec5SDimitry Andric 260b57cec5SDimitry Andric class Environment { 270b57cec5SDimitry Andric public: 280b57cec5SDimitry Andric // This sets up an virtual file system with file \p FileName containing the 290b57cec5SDimitry Andric // fragment \p Code. Assumes that \p Code starts at \p FirstStartColumn, 300b57cec5SDimitry Andric // that the next lines of \p Code should start at \p NextStartColumn, and 310b57cec5SDimitry Andric // that \p Code should end at \p LastStartColumn if it ends in newline. 320b57cec5SDimitry Andric // See also the documentation of clang::format::internal::reformat. 33349cc55cSDimitry Andric Environment(StringRef Code, StringRef FileName, unsigned FirstStartColumn = 0, 340b57cec5SDimitry Andric unsigned NextStartColumn = 0, unsigned LastStartColumn = 0); 350b57cec5SDimitry Andric getFileID()360b57cec5SDimitry Andric FileID getFileID() const { return ID; } 370b57cec5SDimitry Andric getSourceManager()3806c3fb27SDimitry Andric SourceManager &getSourceManager() const { return SM; } 390b57cec5SDimitry Andric getCharRanges()400b57cec5SDimitry Andric ArrayRef<CharSourceRange> getCharRanges() const { return CharRanges; } 410b57cec5SDimitry Andric 420b57cec5SDimitry Andric // Returns the column at which the fragment of code managed by this 430b57cec5SDimitry Andric // environment starts. getFirstStartColumn()440b57cec5SDimitry Andric unsigned getFirstStartColumn() const { return FirstStartColumn; } 450b57cec5SDimitry Andric 460b57cec5SDimitry Andric // Returns the column at which subsequent lines of the fragment of code 470b57cec5SDimitry Andric // managed by this environment should start. getNextStartColumn()480b57cec5SDimitry Andric unsigned getNextStartColumn() const { return NextStartColumn; } 490b57cec5SDimitry Andric 500b57cec5SDimitry Andric // Returns the column at which the fragment of code managed by this 510b57cec5SDimitry Andric // environment should end if it ends in a newline. getLastStartColumn()520b57cec5SDimitry Andric unsigned getLastStartColumn() const { return LastStartColumn; } 530b57cec5SDimitry Andric 54349cc55cSDimitry Andric // Returns nullptr and prints a diagnostic to stderr if the environment 55349cc55cSDimitry Andric // can't be created. 56349cc55cSDimitry Andric static std::unique_ptr<Environment> make(StringRef Code, StringRef FileName, 57349cc55cSDimitry Andric ArrayRef<tooling::Range> Ranges, 58349cc55cSDimitry Andric unsigned FirstStartColumn = 0, 59349cc55cSDimitry Andric unsigned NextStartColumn = 0, 60349cc55cSDimitry Andric unsigned LastStartColumn = 0); 61349cc55cSDimitry Andric 620b57cec5SDimitry Andric private: 630b57cec5SDimitry Andric // This is only set if constructed from string. 640b57cec5SDimitry Andric std::unique_ptr<SourceManagerForFile> VirtualSM; 650b57cec5SDimitry Andric 660b57cec5SDimitry Andric // This refers to either a SourceManager provided by users or VirtualSM 670b57cec5SDimitry Andric // created for a single file. 680b57cec5SDimitry Andric SourceManager &SM; 690b57cec5SDimitry Andric FileID ID; 700b57cec5SDimitry Andric 710b57cec5SDimitry Andric SmallVector<CharSourceRange, 8> CharRanges; 720b57cec5SDimitry Andric unsigned FirstStartColumn; 730b57cec5SDimitry Andric unsigned NextStartColumn; 740b57cec5SDimitry Andric unsigned LastStartColumn; 750b57cec5SDimitry Andric }; 760b57cec5SDimitry Andric 770b57cec5SDimitry Andric class TokenAnalyzer : public UnwrappedLineConsumer { 780b57cec5SDimitry Andric public: 790b57cec5SDimitry Andric TokenAnalyzer(const Environment &Env, const FormatStyle &Style); 800b57cec5SDimitry Andric 81bdd1243dSDimitry Andric std::pair<tooling::Replacements, unsigned> 82bdd1243dSDimitry Andric process(bool SkipAnnotation = false); 830b57cec5SDimitry Andric 840b57cec5SDimitry Andric protected: 850b57cec5SDimitry Andric virtual std::pair<tooling::Replacements, unsigned> 860b57cec5SDimitry Andric analyze(TokenAnnotator &Annotator, 870b57cec5SDimitry Andric SmallVectorImpl<AnnotatedLine *> &AnnotatedLines, 880b57cec5SDimitry Andric FormatTokenLexer &Tokens) = 0; 890b57cec5SDimitry Andric 900b57cec5SDimitry Andric void consumeUnwrappedLine(const UnwrappedLine &TheLine) override; 910b57cec5SDimitry Andric 920b57cec5SDimitry Andric void finishRun() override; 930b57cec5SDimitry Andric 940b57cec5SDimitry Andric FormatStyle Style; 95*0fca6ea1SDimitry Andric LangOptions LangOpts; 960b57cec5SDimitry Andric // Stores Style, FileID and SourceManager etc. 970b57cec5SDimitry Andric const Environment &Env; 980b57cec5SDimitry Andric // AffectedRangeMgr stores ranges to be fixed. 990b57cec5SDimitry Andric AffectedRangeManager AffectedRangeMgr; 1000b57cec5SDimitry Andric SmallVector<SmallVector<UnwrappedLine, 16>, 2> UnwrappedLines; 1010b57cec5SDimitry Andric encoding::Encoding Encoding; 1020b57cec5SDimitry Andric }; 1030b57cec5SDimitry Andric 1040b57cec5SDimitry Andric } // end namespace format 1050b57cec5SDimitry Andric } // end namespace clang 1060b57cec5SDimitry Andric 1070b57cec5SDimitry Andric #endif 108