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 28*06c3fb27SDimitry Andric void addQualifierAlignmentFixerPasses(const FormatStyle &Style, 29*06c3fb27SDimitry Andric SmallVectorImpl<AnalyzerPass> &Passes); 30349cc55cSDimitry Andric 31*06c3fb27SDimitry Andric void prepareLeftRightOrderingForQualifierAlignmentFixer( 32*06c3fb27SDimitry Andric const std::vector<std::string> &Order, std::vector<std::string> &LeftOrder, 33349cc55cSDimitry Andric std::vector<std::string> &RightOrder, 34349cc55cSDimitry Andric std::vector<tok::TokenKind> &Qualifiers); 35349cc55cSDimitry Andric 36349cc55cSDimitry Andric class LeftRightQualifierAlignmentFixer : public TokenAnalyzer { 37349cc55cSDimitry Andric std::string Qualifier; 38349cc55cSDimitry Andric bool RightAlign; 39349cc55cSDimitry Andric SmallVector<tok::TokenKind, 8> QualifierTokens; 40349cc55cSDimitry Andric std::vector<tok::TokenKind> ConfiguredQualifierTokens; 41349cc55cSDimitry Andric 42349cc55cSDimitry Andric public: 43349cc55cSDimitry Andric LeftRightQualifierAlignmentFixer( 44349cc55cSDimitry Andric const Environment &Env, const FormatStyle &Style, 45349cc55cSDimitry Andric const std::string &Qualifier, 46349cc55cSDimitry Andric const std::vector<tok::TokenKind> &ConfiguredQualifierTokens, 47349cc55cSDimitry Andric bool RightAlign); 48349cc55cSDimitry Andric 49349cc55cSDimitry Andric std::pair<tooling::Replacements, unsigned> 50349cc55cSDimitry Andric analyze(TokenAnnotator &Annotator, 51349cc55cSDimitry Andric SmallVectorImpl<AnnotatedLine *> &AnnotatedLines, 52349cc55cSDimitry Andric FormatTokenLexer &Tokens) override; 53349cc55cSDimitry Andric 54349cc55cSDimitry Andric static tok::TokenKind getTokenFromQualifier(const std::string &Qualifier); 55349cc55cSDimitry Andric 5604eeddc0SDimitry Andric const FormatToken *analyzeRight(const SourceManager &SourceMgr, 57349cc55cSDimitry Andric const AdditionalKeywords &Keywords, 5804eeddc0SDimitry Andric tooling::Replacements &Fixes, 5904eeddc0SDimitry Andric const FormatToken *Tok, 60349cc55cSDimitry Andric const std::string &Qualifier, 61349cc55cSDimitry Andric tok::TokenKind QualifierType); 62349cc55cSDimitry Andric 6304eeddc0SDimitry Andric const FormatToken *analyzeLeft(const SourceManager &SourceMgr, 64349cc55cSDimitry Andric const AdditionalKeywords &Keywords, 6504eeddc0SDimitry Andric tooling::Replacements &Fixes, 6604eeddc0SDimitry Andric const FormatToken *Tok, 67349cc55cSDimitry Andric const std::string &Qualifier, 68349cc55cSDimitry Andric tok::TokenKind QualifierType); 69349cc55cSDimitry Andric 70*06c3fb27SDimitry Andric // Is the Token a simple or qualifier type 71*06c3fb27SDimitry Andric static bool isQualifierOrType(const FormatToken *Tok); 72*06c3fb27SDimitry Andric static bool 73*06c3fb27SDimitry Andric isConfiguredQualifierOrType(const FormatToken *Tok, 74349cc55cSDimitry Andric const std::vector<tok::TokenKind> &Qualifiers); 75349cc55cSDimitry Andric 76*06c3fb27SDimitry Andric // Is the Token likely a Macro 77349cc55cSDimitry Andric static bool isPossibleMacro(const FormatToken *Tok); 78349cc55cSDimitry Andric }; 79349cc55cSDimitry Andric 80349cc55cSDimitry Andric } // end namespace format 81349cc55cSDimitry Andric } // end namespace clang 82349cc55cSDimitry Andric 83349cc55cSDimitry Andric #endif 84