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