1*5f757f3fSDimitry 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 10*5f757f3fSDimitry 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 35349cc55cSDimitry Andric class LeftRightQualifierAlignmentFixer : public TokenAnalyzer { 36349cc55cSDimitry Andric std::string Qualifier; 37349cc55cSDimitry Andric bool RightAlign; 38349cc55cSDimitry Andric SmallVector<tok::TokenKind, 8> QualifierTokens; 39349cc55cSDimitry Andric std::vector<tok::TokenKind> ConfiguredQualifierTokens; 40349cc55cSDimitry Andric 41349cc55cSDimitry Andric public: 42349cc55cSDimitry Andric LeftRightQualifierAlignmentFixer( 43349cc55cSDimitry Andric const Environment &Env, const FormatStyle &Style, 44349cc55cSDimitry Andric const std::string &Qualifier, 45349cc55cSDimitry Andric const std::vector<tok::TokenKind> &ConfiguredQualifierTokens, 46349cc55cSDimitry Andric bool RightAlign); 47349cc55cSDimitry Andric 48349cc55cSDimitry Andric std::pair<tooling::Replacements, unsigned> 49349cc55cSDimitry Andric analyze(TokenAnnotator &Annotator, 50349cc55cSDimitry Andric SmallVectorImpl<AnnotatedLine *> &AnnotatedLines, 51349cc55cSDimitry Andric FormatTokenLexer &Tokens) override; 52349cc55cSDimitry Andric 53349cc55cSDimitry Andric static tok::TokenKind getTokenFromQualifier(const std::string &Qualifier); 54349cc55cSDimitry Andric 55*5f757f3fSDimitry Andric void fixQualifierAlignment(SmallVectorImpl<AnnotatedLine *> &AnnotatedLines, 56*5f757f3fSDimitry Andric FormatTokenLexer &Tokens, 57*5f757f3fSDimitry Andric tooling::Replacements &Fixes); 58*5f757f3fSDimitry Andric 5904eeddc0SDimitry Andric const FormatToken *analyzeRight(const SourceManager &SourceMgr, 60349cc55cSDimitry Andric const AdditionalKeywords &Keywords, 6104eeddc0SDimitry Andric tooling::Replacements &Fixes, 6204eeddc0SDimitry Andric const FormatToken *Tok, 63349cc55cSDimitry Andric const std::string &Qualifier, 64349cc55cSDimitry Andric tok::TokenKind QualifierType); 65349cc55cSDimitry Andric 6604eeddc0SDimitry Andric const FormatToken *analyzeLeft(const SourceManager &SourceMgr, 67349cc55cSDimitry Andric const AdditionalKeywords &Keywords, 6804eeddc0SDimitry Andric tooling::Replacements &Fixes, 6904eeddc0SDimitry Andric const FormatToken *Tok, 70349cc55cSDimitry Andric const std::string &Qualifier, 71349cc55cSDimitry Andric tok::TokenKind QualifierType); 72349cc55cSDimitry Andric 7306c3fb27SDimitry Andric // Is the Token a simple or qualifier type 7406c3fb27SDimitry Andric static bool isQualifierOrType(const FormatToken *Tok); 7506c3fb27SDimitry Andric static bool 7606c3fb27SDimitry Andric isConfiguredQualifierOrType(const FormatToken *Tok, 77349cc55cSDimitry Andric const std::vector<tok::TokenKind> &Qualifiers); 78349cc55cSDimitry Andric 7906c3fb27SDimitry Andric // Is the Token likely a Macro 80349cc55cSDimitry Andric static bool isPossibleMacro(const FormatToken *Tok); 81349cc55cSDimitry Andric }; 82349cc55cSDimitry Andric 83349cc55cSDimitry Andric } // end namespace format 84349cc55cSDimitry Andric } // end namespace clang 85349cc55cSDimitry Andric 86349cc55cSDimitry Andric #endif 87