12c9372e7SMyDeveloperDay //===--- QualifierAlignmentFixer.h -------------------------------*- C++-*-===// 2a44ab170Smydeveloperday // 3a44ab170Smydeveloperday // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4a44ab170Smydeveloperday // See https://llvm.org/LICENSE.txt for license information. 5a44ab170Smydeveloperday // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6a44ab170Smydeveloperday // 7a44ab170Smydeveloperday //===----------------------------------------------------------------------===// 8a44ab170Smydeveloperday /// 9a44ab170Smydeveloperday /// \file 102c9372e7SMyDeveloperDay /// This file declares QualifierAlignmentFixer, a TokenAnalyzer that 11a44ab170Smydeveloperday /// enforces either east or west const depending on the style. 12a44ab170Smydeveloperday /// 13a44ab170Smydeveloperday //===----------------------------------------------------------------------===// 14a44ab170Smydeveloperday 15a44ab170Smydeveloperday #ifndef LLVM_CLANG_LIB_FORMAT_QUALIFIERALIGNMENTFIXER_H 16a44ab170Smydeveloperday #define LLVM_CLANG_LIB_FORMAT_QUALIFIERALIGNMENTFIXER_H 17a44ab170Smydeveloperday 18a44ab170Smydeveloperday #include "TokenAnalyzer.h" 19a44ab170Smydeveloperday 20a44ab170Smydeveloperday namespace clang { 21a44ab170Smydeveloperday namespace format { 22a44ab170Smydeveloperday 23a44ab170Smydeveloperday typedef std::function<std::pair<tooling::Replacements, unsigned>( 24a44ab170Smydeveloperday const Environment &)> 25a44ab170Smydeveloperday AnalyzerPass; 26a44ab170Smydeveloperday 27899c8677SSedenion void addQualifierAlignmentFixerPasses(const FormatStyle &Style, 28899c8677SSedenion SmallVectorImpl<AnalyzerPass> &Passes); 29a44ab170Smydeveloperday 30899c8677SSedenion void prepareLeftRightOrderingForQualifierAlignmentFixer( 31899c8677SSedenion const std::vector<std::string> &Order, std::vector<std::string> &LeftOrder, 32a44ab170Smydeveloperday std::vector<std::string> &RightOrder, 33a44ab170Smydeveloperday std::vector<tok::TokenKind> &Qualifiers); 34a44ab170Smydeveloperday 35c72e9438SOwen Pan // Is the Token a simple or qualifier type 36*364f988dSOwen Pan bool isQualifierOrType(const FormatToken *Tok, const LangOptions &LangOpts); 37c72e9438SOwen Pan bool isConfiguredQualifierOrType(const FormatToken *Tok, 38c72e9438SOwen Pan const std::vector<tok::TokenKind> &Qualifiers, 39*364f988dSOwen Pan const LangOptions &LangOpts); 40c72e9438SOwen Pan 41c72e9438SOwen Pan // Is the Token likely a Macro 42c72e9438SOwen Pan bool isPossibleMacro(const FormatToken *Tok); 43c72e9438SOwen Pan 44a44ab170Smydeveloperday class LeftRightQualifierAlignmentFixer : public TokenAnalyzer { 45a44ab170Smydeveloperday std::string Qualifier; 46a44ab170Smydeveloperday bool RightAlign; 47a44ab170Smydeveloperday SmallVector<tok::TokenKind, 8> QualifierTokens; 48a44ab170Smydeveloperday std::vector<tok::TokenKind> ConfiguredQualifierTokens; 49a44ab170Smydeveloperday 50a44ab170Smydeveloperday public: 51a44ab170Smydeveloperday LeftRightQualifierAlignmentFixer( 52a44ab170Smydeveloperday const Environment &Env, const FormatStyle &Style, 53a44ab170Smydeveloperday const std::string &Qualifier, 54a44ab170Smydeveloperday const std::vector<tok::TokenKind> &ConfiguredQualifierTokens, 55a44ab170Smydeveloperday bool RightAlign); 56a44ab170Smydeveloperday 57a44ab170Smydeveloperday std::pair<tooling::Replacements, unsigned> 58a44ab170Smydeveloperday analyze(TokenAnnotator &Annotator, 59a44ab170Smydeveloperday SmallVectorImpl<AnnotatedLine *> &AnnotatedLines, 60a44ab170Smydeveloperday FormatTokenLexer &Tokens) override; 61a44ab170Smydeveloperday 62a44ab170Smydeveloperday static tok::TokenKind getTokenFromQualifier(const std::string &Qualifier); 63a44ab170Smydeveloperday 64f0ad9ea3SOwen Pan void fixQualifierAlignment(SmallVectorImpl<AnnotatedLine *> &AnnotatedLines, 65f0ad9ea3SOwen Pan FormatTokenLexer &Tokens, 66f0ad9ea3SOwen Pan tooling::Replacements &Fixes); 67f0ad9ea3SOwen Pan 68031d3eceSmydeveloperday const FormatToken *analyzeRight(const SourceManager &SourceMgr, 69a44ab170Smydeveloperday const AdditionalKeywords &Keywords, 70031d3eceSmydeveloperday tooling::Replacements &Fixes, 71031d3eceSmydeveloperday const FormatToken *Tok, 72a44ab170Smydeveloperday const std::string &Qualifier, 73a44ab170Smydeveloperday tok::TokenKind QualifierType); 74a44ab170Smydeveloperday 75031d3eceSmydeveloperday const FormatToken *analyzeLeft(const SourceManager &SourceMgr, 76a44ab170Smydeveloperday const AdditionalKeywords &Keywords, 77031d3eceSmydeveloperday tooling::Replacements &Fixes, 78031d3eceSmydeveloperday const FormatToken *Tok, 79a44ab170Smydeveloperday const std::string &Qualifier, 80a44ab170Smydeveloperday tok::TokenKind QualifierType); 81a44ab170Smydeveloperday }; 82a44ab170Smydeveloperday 83a44ab170Smydeveloperday } // end namespace format 84a44ab170Smydeveloperday } // end namespace clang 85a44ab170Smydeveloperday 86a44ab170Smydeveloperday #endif 87