1*12c85518Srobert //===--- LeftRightQualifierAlignmentFixer.h ------------------------------*- C++ 2*12c85518Srobert //-*-===// 3*12c85518Srobert // 4*12c85518Srobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*12c85518Srobert // See https://llvm.org/LICENSE.txt for license information. 6*12c85518Srobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*12c85518Srobert // 8*12c85518Srobert //===----------------------------------------------------------------------===// 9*12c85518Srobert /// 10*12c85518Srobert /// \file 11*12c85518Srobert /// This file declares LeftRightQualifierAlignmentFixer, a TokenAnalyzer that 12*12c85518Srobert /// enforces either east or west const depending on the style. 13*12c85518Srobert /// 14*12c85518Srobert //===----------------------------------------------------------------------===// 15*12c85518Srobert 16*12c85518Srobert #ifndef LLVM_CLANG_LIB_FORMAT_QUALIFIERALIGNMENTFIXER_H 17*12c85518Srobert #define LLVM_CLANG_LIB_FORMAT_QUALIFIERALIGNMENTFIXER_H 18*12c85518Srobert 19*12c85518Srobert #include "TokenAnalyzer.h" 20*12c85518Srobert 21*12c85518Srobert namespace clang { 22*12c85518Srobert namespace format { 23*12c85518Srobert 24*12c85518Srobert typedef std::function<std::pair<tooling::Replacements, unsigned>( 25*12c85518Srobert const Environment &)> 26*12c85518Srobert AnalyzerPass; 27*12c85518Srobert 28*12c85518Srobert class QualifierAlignmentFixer : public TokenAnalyzer { 29*12c85518Srobert // Left to Right ordering requires multiple passes 30*12c85518Srobert SmallVector<AnalyzerPass, 8> Passes; 31*12c85518Srobert StringRef &Code; 32*12c85518Srobert ArrayRef<tooling::Range> Ranges; 33*12c85518Srobert unsigned FirstStartColumn; 34*12c85518Srobert unsigned NextStartColumn; 35*12c85518Srobert unsigned LastStartColumn; 36*12c85518Srobert StringRef FileName; 37*12c85518Srobert 38*12c85518Srobert public: 39*12c85518Srobert QualifierAlignmentFixer(const Environment &Env, const FormatStyle &Style, 40*12c85518Srobert StringRef &Code, ArrayRef<tooling::Range> Ranges, 41*12c85518Srobert unsigned FirstStartColumn, unsigned NextStartColumn, 42*12c85518Srobert unsigned LastStartColumn, StringRef FileName); 43*12c85518Srobert 44*12c85518Srobert std::pair<tooling::Replacements, unsigned> 45*12c85518Srobert analyze(TokenAnnotator &Annotator, 46*12c85518Srobert SmallVectorImpl<AnnotatedLine *> &AnnotatedLines, 47*12c85518Srobert FormatTokenLexer &Tokens) override; 48*12c85518Srobert 49*12c85518Srobert static void PrepareLeftRightOrdering(const std::vector<std::string> &Order, 50*12c85518Srobert std::vector<std::string> &LeftOrder, 51*12c85518Srobert std::vector<std::string> &RightOrder, 52*12c85518Srobert std::vector<tok::TokenKind> &Qualifiers); 53*12c85518Srobert }; 54*12c85518Srobert 55*12c85518Srobert class LeftRightQualifierAlignmentFixer : public TokenAnalyzer { 56*12c85518Srobert std::string Qualifier; 57*12c85518Srobert bool RightAlign; 58*12c85518Srobert SmallVector<tok::TokenKind, 8> QualifierTokens; 59*12c85518Srobert std::vector<tok::TokenKind> ConfiguredQualifierTokens; 60*12c85518Srobert 61*12c85518Srobert public: 62*12c85518Srobert LeftRightQualifierAlignmentFixer( 63*12c85518Srobert const Environment &Env, const FormatStyle &Style, 64*12c85518Srobert const std::string &Qualifier, 65*12c85518Srobert const std::vector<tok::TokenKind> &ConfiguredQualifierTokens, 66*12c85518Srobert bool RightAlign); 67*12c85518Srobert 68*12c85518Srobert std::pair<tooling::Replacements, unsigned> 69*12c85518Srobert analyze(TokenAnnotator &Annotator, 70*12c85518Srobert SmallVectorImpl<AnnotatedLine *> &AnnotatedLines, 71*12c85518Srobert FormatTokenLexer &Tokens) override; 72*12c85518Srobert 73*12c85518Srobert static tok::TokenKind getTokenFromQualifier(const std::string &Qualifier); 74*12c85518Srobert 75*12c85518Srobert const FormatToken *analyzeRight(const SourceManager &SourceMgr, 76*12c85518Srobert const AdditionalKeywords &Keywords, 77*12c85518Srobert tooling::Replacements &Fixes, 78*12c85518Srobert const FormatToken *Tok, 79*12c85518Srobert const std::string &Qualifier, 80*12c85518Srobert tok::TokenKind QualifierType); 81*12c85518Srobert 82*12c85518Srobert const FormatToken *analyzeLeft(const SourceManager &SourceMgr, 83*12c85518Srobert const AdditionalKeywords &Keywords, 84*12c85518Srobert tooling::Replacements &Fixes, 85*12c85518Srobert const FormatToken *Tok, 86*12c85518Srobert const std::string &Qualifier, 87*12c85518Srobert tok::TokenKind QualifierType); 88*12c85518Srobert 89*12c85518Srobert // is the Token a simple or qualifier type 90*12c85518Srobert static bool isQualifierOrType(const FormatToken *Tok, 91*12c85518Srobert const std::vector<tok::TokenKind> &Qualifiers); 92*12c85518Srobert 93*12c85518Srobert // is the Token likely a Macro 94*12c85518Srobert static bool isPossibleMacro(const FormatToken *Tok); 95*12c85518Srobert }; 96*12c85518Srobert 97*12c85518Srobert } // end namespace format 98*12c85518Srobert } // end namespace clang 99*12c85518Srobert 100*12c85518Srobert #endif 101