xref: /freebsd-src/contrib/llvm-project/clang/lib/Format/QualifierAlignmentFixer.h (revision 04eeddc0aa8e0a417a16eaf9d7d095207f4a8623)
1349cc55cSDimitry Andric //===--- LeftRightQualifierAlignmentFixer.h ------------------------------*- C++
2349cc55cSDimitry Andric //-*-===//
3349cc55cSDimitry Andric //
4349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
6349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7349cc55cSDimitry Andric //
8349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
9349cc55cSDimitry Andric ///
10349cc55cSDimitry Andric /// \file
11349cc55cSDimitry Andric /// This file declares LeftRightQualifierAlignmentFixer, a TokenAnalyzer that
12349cc55cSDimitry Andric /// enforces either east or west const depending on the style.
13349cc55cSDimitry Andric ///
14349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
15349cc55cSDimitry Andric 
16349cc55cSDimitry Andric #ifndef LLVM_CLANG_LIB_FORMAT_QUALIFIERALIGNMENTFIXER_H
17349cc55cSDimitry Andric #define LLVM_CLANG_LIB_FORMAT_QUALIFIERALIGNMENTFIXER_H
18349cc55cSDimitry Andric 
19349cc55cSDimitry Andric #include "TokenAnalyzer.h"
20349cc55cSDimitry Andric 
21349cc55cSDimitry Andric namespace clang {
22349cc55cSDimitry Andric namespace format {
23349cc55cSDimitry Andric 
24349cc55cSDimitry Andric typedef std::function<std::pair<tooling::Replacements, unsigned>(
25349cc55cSDimitry Andric     const Environment &)>
26349cc55cSDimitry Andric     AnalyzerPass;
27349cc55cSDimitry Andric 
28349cc55cSDimitry Andric class QualifierAlignmentFixer : public TokenAnalyzer {
29349cc55cSDimitry Andric   // Left to Right ordering requires multiple passes
30349cc55cSDimitry Andric   SmallVector<AnalyzerPass, 8> Passes;
31349cc55cSDimitry Andric   StringRef &Code;
32349cc55cSDimitry Andric   ArrayRef<tooling::Range> Ranges;
33349cc55cSDimitry Andric   unsigned FirstStartColumn;
34349cc55cSDimitry Andric   unsigned NextStartColumn;
35349cc55cSDimitry Andric   unsigned LastStartColumn;
36349cc55cSDimitry Andric   StringRef FileName;
37349cc55cSDimitry Andric 
38349cc55cSDimitry Andric public:
39349cc55cSDimitry Andric   QualifierAlignmentFixer(const Environment &Env, const FormatStyle &Style,
40349cc55cSDimitry Andric                           StringRef &Code, ArrayRef<tooling::Range> Ranges,
41349cc55cSDimitry Andric                           unsigned FirstStartColumn, unsigned NextStartColumn,
42349cc55cSDimitry Andric                           unsigned LastStartColumn, StringRef FileName);
43349cc55cSDimitry Andric 
44349cc55cSDimitry Andric   std::pair<tooling::Replacements, unsigned>
45349cc55cSDimitry Andric   analyze(TokenAnnotator &Annotator,
46349cc55cSDimitry Andric           SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,
47349cc55cSDimitry Andric           FormatTokenLexer &Tokens) override;
48349cc55cSDimitry Andric 
49349cc55cSDimitry Andric   static void PrepareLeftRightOrdering(const std::vector<std::string> &Order,
50349cc55cSDimitry Andric                                        std::vector<std::string> &LeftOrder,
51349cc55cSDimitry Andric                                        std::vector<std::string> &RightOrder,
52349cc55cSDimitry Andric                                        std::vector<tok::TokenKind> &Qualifiers);
53349cc55cSDimitry Andric };
54349cc55cSDimitry Andric 
55349cc55cSDimitry Andric class LeftRightQualifierAlignmentFixer : public TokenAnalyzer {
56349cc55cSDimitry Andric   std::string Qualifier;
57349cc55cSDimitry Andric   bool RightAlign;
58349cc55cSDimitry Andric   SmallVector<tok::TokenKind, 8> QualifierTokens;
59349cc55cSDimitry Andric   std::vector<tok::TokenKind> ConfiguredQualifierTokens;
60349cc55cSDimitry Andric 
61349cc55cSDimitry Andric public:
62349cc55cSDimitry Andric   LeftRightQualifierAlignmentFixer(
63349cc55cSDimitry Andric       const Environment &Env, const FormatStyle &Style,
64349cc55cSDimitry Andric       const std::string &Qualifier,
65349cc55cSDimitry Andric       const std::vector<tok::TokenKind> &ConfiguredQualifierTokens,
66349cc55cSDimitry Andric       bool RightAlign);
67349cc55cSDimitry Andric 
68349cc55cSDimitry Andric   std::pair<tooling::Replacements, unsigned>
69349cc55cSDimitry Andric   analyze(TokenAnnotator &Annotator,
70349cc55cSDimitry Andric           SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,
71349cc55cSDimitry Andric           FormatTokenLexer &Tokens) override;
72349cc55cSDimitry Andric 
73349cc55cSDimitry Andric   static tok::TokenKind getTokenFromQualifier(const std::string &Qualifier);
74349cc55cSDimitry Andric 
75*04eeddc0SDimitry Andric   const FormatToken *analyzeRight(const SourceManager &SourceMgr,
76349cc55cSDimitry Andric                                   const AdditionalKeywords &Keywords,
77*04eeddc0SDimitry Andric                                   tooling::Replacements &Fixes,
78*04eeddc0SDimitry Andric                                   const FormatToken *Tok,
79349cc55cSDimitry Andric                                   const std::string &Qualifier,
80349cc55cSDimitry Andric                                   tok::TokenKind QualifierType);
81349cc55cSDimitry Andric 
82*04eeddc0SDimitry Andric   const FormatToken *analyzeLeft(const SourceManager &SourceMgr,
83349cc55cSDimitry Andric                                  const AdditionalKeywords &Keywords,
84*04eeddc0SDimitry Andric                                  tooling::Replacements &Fixes,
85*04eeddc0SDimitry Andric                                  const FormatToken *Tok,
86349cc55cSDimitry Andric                                  const std::string &Qualifier,
87349cc55cSDimitry Andric                                  tok::TokenKind QualifierType);
88349cc55cSDimitry Andric 
89349cc55cSDimitry Andric   // is the Token a simple or qualifier type
90349cc55cSDimitry Andric   static bool isQualifierOrType(const FormatToken *Tok,
91349cc55cSDimitry Andric                                 const std::vector<tok::TokenKind> &Qualifiers);
92349cc55cSDimitry Andric 
93349cc55cSDimitry Andric   // is the Token likely a Macro
94349cc55cSDimitry Andric   static bool isPossibleMacro(const FormatToken *Tok);
95349cc55cSDimitry Andric };
96349cc55cSDimitry Andric 
97349cc55cSDimitry Andric } // end namespace format
98349cc55cSDimitry Andric } // end namespace clang
99349cc55cSDimitry Andric 
100349cc55cSDimitry Andric #endif
101