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