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