brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.8 KiB · ef55909 Raw
108 lines · c
1//===--- TokenAnalyzer.h - Analyze Token Streams ----------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8///9/// \file10/// This file declares an abstract TokenAnalyzer, and associated helper11/// classes. TokenAnalyzer can be extended to generate replacements based on12/// an annotated and pre-processed token stream.13///14//===----------------------------------------------------------------------===//15 16#ifndef LLVM_CLANG_LIB_FORMAT_TOKENANALYZER_H17#define LLVM_CLANG_LIB_FORMAT_TOKENANALYZER_H18 19#include "AffectedRangeManager.h"20#include "FormatTokenLexer.h"21#include "TokenAnnotator.h"22 23namespace clang {24namespace format {25 26class Environment {27public:28  // This sets up an virtual file system with file \p FileName containing the29  // fragment \p Code. Assumes that \p Code starts at \p FirstStartColumn,30  // that the next lines of \p Code should start at \p NextStartColumn, and31  // that \p Code should end at \p LastStartColumn if it ends in newline.32  // See also the documentation of clang::format::internal::reformat.33  Environment(StringRef Code, StringRef FileName, unsigned FirstStartColumn = 0,34              unsigned NextStartColumn = 0, unsigned LastStartColumn = 0);35 36  FileID getFileID() const { return ID; }37 38  SourceManager &getSourceManager() const { return SM; }39 40  ArrayRef<CharSourceRange> getCharRanges() const { return CharRanges; }41 42  // Returns the column at which the fragment of code managed by this43  // environment starts.44  unsigned getFirstStartColumn() const { return FirstStartColumn; }45 46  // Returns the column at which subsequent lines of the fragment of code47  // managed by this environment should start.48  unsigned getNextStartColumn() const { return NextStartColumn; }49 50  // Returns the column at which the fragment of code managed by this51  // environment should end if it ends in a newline.52  unsigned getLastStartColumn() const { return LastStartColumn; }53 54  // Returns nullptr and prints a diagnostic to stderr if the environment55  // can't be created.56  static std::unique_ptr<Environment> make(StringRef Code, StringRef FileName,57                                           ArrayRef<tooling::Range> Ranges,58                                           unsigned FirstStartColumn = 0,59                                           unsigned NextStartColumn = 0,60                                           unsigned LastStartColumn = 0);61 62private:63  // This is only set if constructed from string.64  std::unique_ptr<SourceManagerForFile> VirtualSM;65 66  // This refers to either a SourceManager provided by users or VirtualSM67  // created for a single file.68  SourceManager &SM;69  FileID ID;70 71  SmallVector<CharSourceRange, 8> CharRanges;72  unsigned FirstStartColumn;73  unsigned NextStartColumn;74  unsigned LastStartColumn;75};76 77class TokenAnalyzer : public UnwrappedLineConsumer {78public:79  TokenAnalyzer(const Environment &Env, const FormatStyle &Style);80 81  std::pair<tooling::Replacements, unsigned>82  process(bool SkipAnnotation = false);83 84protected:85  virtual std::pair<tooling::Replacements, unsigned>86  analyze(TokenAnnotator &Annotator,87          SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,88          FormatTokenLexer &Tokens) = 0;89 90  void consumeUnwrappedLine(const UnwrappedLine &TheLine) override;91 92  void finishRun() override;93 94  FormatStyle Style;95  LangOptions LangOpts;96  // Stores Style, FileID and SourceManager etc.97  const Environment &Env;98  // AffectedRangeMgr stores ranges to be fixed.99  AffectedRangeManager AffectedRangeMgr;100  SmallVector<SmallVector<UnwrappedLine, 16>, 2> UnwrappedLines;101  encoding::Encoding Encoding;102};103 104} // end namespace format105} // end namespace clang106 107#endif108