123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- //===--- 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"
- #include <memory>
- 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, unsigned FirstStartColumn = 0,
- unsigned NextStartColumn = 0, unsigned LastStartColumn = 0);
- FileID getFileID() const { return ID; }
- const SourceManager &getSourceManager() const { return SM; }
- ArrayRef<CharSourceRange> 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; }
- // Returns nullptr and prints a diagnostic to stderr if the environment
- // can't be created.
- static std::unique_ptr<Environment> make(StringRef Code, StringRef FileName,
- ArrayRef<tooling::Range> Ranges,
- unsigned FirstStartColumn = 0,
- unsigned NextStartColumn = 0,
- unsigned LastStartColumn = 0);
- private:
- // This is only set if constructed from string.
- std::unique_ptr<SourceManagerForFile> VirtualSM;
- // This refers to either a SourceManager provided by users or VirtualSM
- // created for a single file.
- SourceManager &SM;
- FileID ID;
- SmallVector<CharSourceRange, 8> CharRanges;
- unsigned FirstStartColumn;
- unsigned NextStartColumn;
- unsigned LastStartColumn;
- };
- class TokenAnalyzer : public UnwrappedLineConsumer {
- public:
- TokenAnalyzer(const Environment &Env, const FormatStyle &Style);
- std::pair<tooling::Replacements, unsigned> process();
- protected:
- virtual std::pair<tooling::Replacements, unsigned>
- analyze(TokenAnnotator &Annotator,
- SmallVectorImpl<AnnotatedLine *> &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<SmallVector<UnwrappedLine, 16>, 2> UnwrappedLines;
- encoding::Encoding Encoding;
- };
- } // end namespace format
- } // end namespace clang
- #endif
|