clang 18.0.0git
TokenAnalyzer.h
Go to the documentation of this file.
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-exception
6//
7//===----------------------------------------------------------------------===//
8///
9/// \file
10/// This file declares an abstract TokenAnalyzer, and associated helper
11/// classes. TokenAnalyzer can be extended to generate replacements based on
12/// an annotated and pre-processed token stream.
13///
14//===----------------------------------------------------------------------===//
15
16#ifndef LLVM_CLANG_LIB_FORMAT_TOKENANALYZER_H
17#define LLVM_CLANG_LIB_FORMAT_TOKENANALYZER_H
18
20#include "Encoding.h"
21#include "FormatToken.h"
22#include "FormatTokenLexer.h"
23#include "TokenAnnotator.h"
24#include "UnwrappedLineParser.h"
29#include "clang/Format/Format.h"
30#include "llvm/ADT/STLExtras.h"
31#include "llvm/Support/Debug.h"
32#include <memory>
33
34namespace clang {
35namespace format {
36
38public:
39 // This sets up an virtual file system with file \p FileName containing the
40 // fragment \p Code. Assumes that \p Code starts at \p FirstStartColumn,
41 // that the next lines of \p Code should start at \p NextStartColumn, and
42 // that \p Code should end at \p LastStartColumn if it ends in newline.
43 // See also the documentation of clang::format::internal::reformat.
44 Environment(StringRef Code, StringRef FileName, unsigned FirstStartColumn = 0,
45 unsigned NextStartColumn = 0, unsigned LastStartColumn = 0);
46
47 FileID getFileID() const { return ID; }
48
49 SourceManager &getSourceManager() const { return SM; }
50
51 ArrayRef<CharSourceRange> getCharRanges() const { return CharRanges; }
52
53 // Returns the column at which the fragment of code managed by this
54 // environment starts.
55 unsigned getFirstStartColumn() const { return FirstStartColumn; }
56
57 // Returns the column at which subsequent lines of the fragment of code
58 // managed by this environment should start.
59 unsigned getNextStartColumn() const { return NextStartColumn; }
60
61 // Returns the column at which the fragment of code managed by this
62 // environment should end if it ends in a newline.
63 unsigned getLastStartColumn() const { return LastStartColumn; }
64
65 // Returns nullptr and prints a diagnostic to stderr if the environment
66 // can't be created.
67 static std::unique_ptr<Environment> make(StringRef Code, StringRef FileName,
69 unsigned FirstStartColumn = 0,
70 unsigned NextStartColumn = 0,
71 unsigned LastStartColumn = 0);
72
73private:
74 // This is only set if constructed from string.
75 std::unique_ptr<SourceManagerForFile> VirtualSM;
76
77 // This refers to either a SourceManager provided by users or VirtualSM
78 // created for a single file.
79 SourceManager &SM;
80 FileID ID;
81
83 unsigned FirstStartColumn;
84 unsigned NextStartColumn;
85 unsigned LastStartColumn;
86};
87
89public:
91
92 std::pair<tooling::Replacements, unsigned>
93 process(bool SkipAnnotation = false);
94
95protected:
96 virtual std::pair<tooling::Replacements, unsigned>
99 FormatTokenLexer &Tokens) = 0;
100
101 void consumeUnwrappedLine(const UnwrappedLine &TheLine) override;
102
103 void finishRun() override;
104
106 // Stores Style, FileID and SourceManager etc.
108 // AffectedRangeMgr stores ranges to be fixed.
112};
113
114} // end namespace format
115} // end namespace clang
116
117#endif
AffectedRangeManager class manages affected ranges in the code.
Defines the Diagnostic-related interfaces.
Contains functions for text encoding manipulation.
Defines the clang::FileManager interface and associated types.
This file contains FormatTokenLexer, which tokenizes a source file into a token stream suitable for C...
This file contains the declaration of the FormatToken, a wrapper around Token with additional informa...
Various functions to configurably format source code.
Defines the SourceManager interface.
This file implements a token annotator, i.e.
This file contains the declaration of the UnwrappedLineParser, which turns a stream of tokens into Un...
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
This class handles loading and caching of source files into memory.
SourceManager & getSourceManager() const
Definition: TokenAnalyzer.h:49
unsigned getNextStartColumn() const
Definition: TokenAnalyzer.h:59
ArrayRef< CharSourceRange > getCharRanges() const
Definition: TokenAnalyzer.h:51
unsigned getLastStartColumn() const
Definition: TokenAnalyzer.h:63
static std::unique_ptr< Environment > make(StringRef Code, StringRef FileName, ArrayRef< tooling::Range > Ranges, unsigned FirstStartColumn=0, unsigned NextStartColumn=0, unsigned LastStartColumn=0)
unsigned getFirstStartColumn() const
Definition: TokenAnalyzer.h:55
encoding::Encoding Encoding
virtual std::pair< tooling::Replacements, unsigned > analyze(TokenAnnotator &Annotator, SmallVectorImpl< AnnotatedLine * > &AnnotatedLines, FormatTokenLexer &Tokens)=0
AffectedRangeManager AffectedRangeMgr
const Environment & Env
SmallVector< SmallVector< UnwrappedLine, 16 >, 2 > UnwrappedLines
std::pair< tooling::Replacements, unsigned > process(bool SkipAnnotation=false)
void consumeUnwrappedLine(const UnwrappedLine &TheLine) override
Determines extra information about the tokens comprising an UnwrappedLine.
Interface for users of the UnwrappedLineParser to receive the parsed lines.
The FormatStyle is used to configure the formatting to follow specific guidelines.
Definition: Format.h:55
An unwrapped line is a sequence of Token, that we would like to put on a single line if there was no ...