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