xref: /freebsd-src/contrib/llvm-project/clang/lib/Format/QualifierAlignmentFixer.h (revision 349cc55c9796c4596a5b9904cd3281af295f878f)
1*349cc55cSDimitry Andric //===--- LeftRightQualifierAlignmentFixer.h ------------------------------*- C++
2*349cc55cSDimitry Andric //-*-===//
3*349cc55cSDimitry Andric //
4*349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
6*349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*349cc55cSDimitry Andric //
8*349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
9*349cc55cSDimitry Andric ///
10*349cc55cSDimitry Andric /// \file
11*349cc55cSDimitry Andric /// This file declares LeftRightQualifierAlignmentFixer, a TokenAnalyzer that
12*349cc55cSDimitry Andric /// enforces either east or west const depending on the style.
13*349cc55cSDimitry Andric ///
14*349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
15*349cc55cSDimitry Andric 
16*349cc55cSDimitry Andric #ifndef LLVM_CLANG_LIB_FORMAT_QUALIFIERALIGNMENTFIXER_H
17*349cc55cSDimitry Andric #define LLVM_CLANG_LIB_FORMAT_QUALIFIERALIGNMENTFIXER_H
18*349cc55cSDimitry Andric 
19*349cc55cSDimitry Andric #include "TokenAnalyzer.h"
20*349cc55cSDimitry Andric 
21*349cc55cSDimitry Andric namespace clang {
22*349cc55cSDimitry Andric namespace format {
23*349cc55cSDimitry Andric 
24*349cc55cSDimitry Andric typedef std::function<std::pair<tooling::Replacements, unsigned>(
25*349cc55cSDimitry Andric     const Environment &)>
26*349cc55cSDimitry Andric     AnalyzerPass;
27*349cc55cSDimitry Andric 
28*349cc55cSDimitry Andric class QualifierAlignmentFixer : public TokenAnalyzer {
29*349cc55cSDimitry Andric   // Left to Right ordering requires multiple passes
30*349cc55cSDimitry Andric   SmallVector<AnalyzerPass, 8> Passes;
31*349cc55cSDimitry Andric   StringRef &Code;
32*349cc55cSDimitry Andric   ArrayRef<tooling::Range> Ranges;
33*349cc55cSDimitry Andric   unsigned FirstStartColumn;
34*349cc55cSDimitry Andric   unsigned NextStartColumn;
35*349cc55cSDimitry Andric   unsigned LastStartColumn;
36*349cc55cSDimitry Andric   StringRef FileName;
37*349cc55cSDimitry Andric 
38*349cc55cSDimitry Andric public:
39*349cc55cSDimitry Andric   QualifierAlignmentFixer(const Environment &Env, const FormatStyle &Style,
40*349cc55cSDimitry Andric                           StringRef &Code, ArrayRef<tooling::Range> Ranges,
41*349cc55cSDimitry Andric                           unsigned FirstStartColumn, unsigned NextStartColumn,
42*349cc55cSDimitry Andric                           unsigned LastStartColumn, StringRef FileName);
43*349cc55cSDimitry Andric 
44*349cc55cSDimitry Andric   std::pair<tooling::Replacements, unsigned>
45*349cc55cSDimitry Andric   analyze(TokenAnnotator &Annotator,
46*349cc55cSDimitry Andric           SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,
47*349cc55cSDimitry Andric           FormatTokenLexer &Tokens) override;
48*349cc55cSDimitry Andric 
49*349cc55cSDimitry Andric   static void PrepareLeftRightOrdering(const std::vector<std::string> &Order,
50*349cc55cSDimitry Andric                                        std::vector<std::string> &LeftOrder,
51*349cc55cSDimitry Andric                                        std::vector<std::string> &RightOrder,
52*349cc55cSDimitry Andric                                        std::vector<tok::TokenKind> &Qualifiers);
53*349cc55cSDimitry Andric };
54*349cc55cSDimitry Andric 
55*349cc55cSDimitry Andric class LeftRightQualifierAlignmentFixer : public TokenAnalyzer {
56*349cc55cSDimitry Andric   std::string Qualifier;
57*349cc55cSDimitry Andric   bool RightAlign;
58*349cc55cSDimitry Andric   SmallVector<tok::TokenKind, 8> QualifierTokens;
59*349cc55cSDimitry Andric   std::vector<tok::TokenKind> ConfiguredQualifierTokens;
60*349cc55cSDimitry Andric 
61*349cc55cSDimitry Andric public:
62*349cc55cSDimitry Andric   LeftRightQualifierAlignmentFixer(
63*349cc55cSDimitry Andric       const Environment &Env, const FormatStyle &Style,
64*349cc55cSDimitry Andric       const std::string &Qualifier,
65*349cc55cSDimitry Andric       const std::vector<tok::TokenKind> &ConfiguredQualifierTokens,
66*349cc55cSDimitry Andric       bool RightAlign);
67*349cc55cSDimitry Andric 
68*349cc55cSDimitry Andric   std::pair<tooling::Replacements, unsigned>
69*349cc55cSDimitry Andric   analyze(TokenAnnotator &Annotator,
70*349cc55cSDimitry Andric           SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,
71*349cc55cSDimitry Andric           FormatTokenLexer &Tokens) override;
72*349cc55cSDimitry Andric 
73*349cc55cSDimitry Andric   static tok::TokenKind getTokenFromQualifier(const std::string &Qualifier);
74*349cc55cSDimitry Andric 
75*349cc55cSDimitry Andric   FormatToken *analyzeRight(const SourceManager &SourceMgr,
76*349cc55cSDimitry Andric                             const AdditionalKeywords &Keywords,
77*349cc55cSDimitry Andric                             tooling::Replacements &Fixes, FormatToken *Tok,
78*349cc55cSDimitry Andric                             const std::string &Qualifier,
79*349cc55cSDimitry Andric                             tok::TokenKind QualifierType);
80*349cc55cSDimitry Andric 
81*349cc55cSDimitry Andric   FormatToken *analyzeLeft(const SourceManager &SourceMgr,
82*349cc55cSDimitry Andric                            const AdditionalKeywords &Keywords,
83*349cc55cSDimitry Andric                            tooling::Replacements &Fixes, FormatToken *Tok,
84*349cc55cSDimitry Andric                            const std::string &Qualifier,
85*349cc55cSDimitry Andric                            tok::TokenKind QualifierType);
86*349cc55cSDimitry Andric 
87*349cc55cSDimitry Andric   // is the Token a simple or qualifier type
88*349cc55cSDimitry Andric   static bool isQualifierOrType(const FormatToken *Tok,
89*349cc55cSDimitry Andric                                 const std::vector<tok::TokenKind> &Qualifiers);
90*349cc55cSDimitry Andric 
91*349cc55cSDimitry Andric   // is the Token likely a Macro
92*349cc55cSDimitry Andric   static bool isPossibleMacro(const FormatToken *Tok);
93*349cc55cSDimitry Andric };
94*349cc55cSDimitry Andric 
95*349cc55cSDimitry Andric } // end namespace format
96*349cc55cSDimitry Andric } // end namespace clang
97*349cc55cSDimitry Andric 
98*349cc55cSDimitry Andric #endif
99