xref: /freebsd-src/contrib/llvm-project/clang/lib/Format/QualifierAlignmentFixer.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
15f757f3fSDimitry Andric //===--- QualifierAlignmentFixer.h -------------------------------*- C++-*-===//
2349cc55cSDimitry Andric //
3349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6349cc55cSDimitry Andric //
7349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
8349cc55cSDimitry Andric ///
9349cc55cSDimitry Andric /// \file
105f757f3fSDimitry Andric /// This file declares QualifierAlignmentFixer, a TokenAnalyzer that
11349cc55cSDimitry Andric /// enforces either east or west const depending on the style.
12349cc55cSDimitry Andric ///
13349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
14349cc55cSDimitry Andric 
15349cc55cSDimitry Andric #ifndef LLVM_CLANG_LIB_FORMAT_QUALIFIERALIGNMENTFIXER_H
16349cc55cSDimitry Andric #define LLVM_CLANG_LIB_FORMAT_QUALIFIERALIGNMENTFIXER_H
17349cc55cSDimitry Andric 
18349cc55cSDimitry Andric #include "TokenAnalyzer.h"
19349cc55cSDimitry Andric 
20349cc55cSDimitry Andric namespace clang {
21349cc55cSDimitry Andric namespace format {
22349cc55cSDimitry Andric 
23349cc55cSDimitry Andric typedef std::function<std::pair<tooling::Replacements, unsigned>(
24349cc55cSDimitry Andric     const Environment &)>
25349cc55cSDimitry Andric     AnalyzerPass;
26349cc55cSDimitry Andric 
2706c3fb27SDimitry Andric void addQualifierAlignmentFixerPasses(const FormatStyle &Style,
2806c3fb27SDimitry Andric                                       SmallVectorImpl<AnalyzerPass> &Passes);
29349cc55cSDimitry Andric 
3006c3fb27SDimitry Andric void prepareLeftRightOrderingForQualifierAlignmentFixer(
3106c3fb27SDimitry Andric     const std::vector<std::string> &Order, std::vector<std::string> &LeftOrder,
32349cc55cSDimitry Andric     std::vector<std::string> &RightOrder,
33349cc55cSDimitry Andric     std::vector<tok::TokenKind> &Qualifiers);
34349cc55cSDimitry Andric 
35*0fca6ea1SDimitry Andric // Is the Token a simple or qualifier type
36*0fca6ea1SDimitry Andric bool isQualifierOrType(const FormatToken *Tok, const LangOptions &LangOpts);
37*0fca6ea1SDimitry Andric bool isConfiguredQualifierOrType(const FormatToken *Tok,
38*0fca6ea1SDimitry Andric                                  const std::vector<tok::TokenKind> &Qualifiers,
39*0fca6ea1SDimitry Andric                                  const LangOptions &LangOpts);
40*0fca6ea1SDimitry Andric 
41*0fca6ea1SDimitry Andric // Is the Token likely a Macro
42*0fca6ea1SDimitry Andric bool isPossibleMacro(const FormatToken *Tok);
43*0fca6ea1SDimitry Andric 
44349cc55cSDimitry Andric class LeftRightQualifierAlignmentFixer : public TokenAnalyzer {
45349cc55cSDimitry Andric   std::string Qualifier;
46349cc55cSDimitry Andric   bool RightAlign;
47349cc55cSDimitry Andric   SmallVector<tok::TokenKind, 8> QualifierTokens;
48349cc55cSDimitry Andric   std::vector<tok::TokenKind> ConfiguredQualifierTokens;
49349cc55cSDimitry Andric 
50349cc55cSDimitry Andric public:
51349cc55cSDimitry Andric   LeftRightQualifierAlignmentFixer(
52349cc55cSDimitry Andric       const Environment &Env, const FormatStyle &Style,
53349cc55cSDimitry Andric       const std::string &Qualifier,
54349cc55cSDimitry Andric       const std::vector<tok::TokenKind> &ConfiguredQualifierTokens,
55349cc55cSDimitry Andric       bool RightAlign);
56349cc55cSDimitry Andric 
57349cc55cSDimitry Andric   std::pair<tooling::Replacements, unsigned>
58349cc55cSDimitry Andric   analyze(TokenAnnotator &Annotator,
59349cc55cSDimitry Andric           SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,
60349cc55cSDimitry Andric           FormatTokenLexer &Tokens) override;
61349cc55cSDimitry Andric 
62349cc55cSDimitry Andric   static tok::TokenKind getTokenFromQualifier(const std::string &Qualifier);
63349cc55cSDimitry Andric 
645f757f3fSDimitry Andric   void fixQualifierAlignment(SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,
655f757f3fSDimitry Andric                              FormatTokenLexer &Tokens,
665f757f3fSDimitry Andric                              tooling::Replacements &Fixes);
675f757f3fSDimitry Andric 
6804eeddc0SDimitry Andric   const FormatToken *analyzeRight(const SourceManager &SourceMgr,
69349cc55cSDimitry Andric                                   const AdditionalKeywords &Keywords,
7004eeddc0SDimitry Andric                                   tooling::Replacements &Fixes,
7104eeddc0SDimitry Andric                                   const FormatToken *Tok,
72349cc55cSDimitry Andric                                   const std::string &Qualifier,
73349cc55cSDimitry Andric                                   tok::TokenKind QualifierType);
74349cc55cSDimitry Andric 
7504eeddc0SDimitry Andric   const FormatToken *analyzeLeft(const SourceManager &SourceMgr,
76349cc55cSDimitry Andric                                  const AdditionalKeywords &Keywords,
7704eeddc0SDimitry Andric                                  tooling::Replacements &Fixes,
7804eeddc0SDimitry Andric                                  const FormatToken *Tok,
79349cc55cSDimitry Andric                                  const std::string &Qualifier,
80349cc55cSDimitry Andric                                  tok::TokenKind QualifierType);
81349cc55cSDimitry Andric };
82349cc55cSDimitry Andric 
83349cc55cSDimitry Andric } // end namespace format
84349cc55cSDimitry Andric } // end namespace clang
85349cc55cSDimitry Andric 
86349cc55cSDimitry Andric #endif
87