1349cc55cSDimitry Andric //===--- LeftRightQualifierAlignmentFixer.h ------------------------------*- C++ 2349cc55cSDimitry Andric //-*-===// 3349cc55cSDimitry Andric // 4349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 6349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7349cc55cSDimitry Andric // 8349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 9349cc55cSDimitry Andric /// 10349cc55cSDimitry Andric /// \file 11349cc55cSDimitry Andric /// This file declares LeftRightQualifierAlignmentFixer, a TokenAnalyzer that 12349cc55cSDimitry Andric /// enforces either east or west const depending on the style. 13349cc55cSDimitry Andric /// 14349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 15349cc55cSDimitry Andric 16349cc55cSDimitry Andric #ifndef LLVM_CLANG_LIB_FORMAT_QUALIFIERALIGNMENTFIXER_H 17349cc55cSDimitry Andric #define LLVM_CLANG_LIB_FORMAT_QUALIFIERALIGNMENTFIXER_H 18349cc55cSDimitry Andric 19349cc55cSDimitry Andric #include "TokenAnalyzer.h" 20349cc55cSDimitry Andric 21349cc55cSDimitry Andric namespace clang { 22349cc55cSDimitry Andric namespace format { 23349cc55cSDimitry Andric 24349cc55cSDimitry Andric typedef std::function<std::pair<tooling::Replacements, unsigned>( 25349cc55cSDimitry Andric const Environment &)> 26349cc55cSDimitry Andric AnalyzerPass; 27349cc55cSDimitry Andric 28349cc55cSDimitry Andric class QualifierAlignmentFixer : public TokenAnalyzer { 29349cc55cSDimitry Andric // Left to Right ordering requires multiple passes 30349cc55cSDimitry Andric SmallVector<AnalyzerPass, 8> Passes; 31349cc55cSDimitry Andric StringRef &Code; 32349cc55cSDimitry Andric ArrayRef<tooling::Range> Ranges; 33349cc55cSDimitry Andric unsigned FirstStartColumn; 34349cc55cSDimitry Andric unsigned NextStartColumn; 35349cc55cSDimitry Andric unsigned LastStartColumn; 36349cc55cSDimitry Andric StringRef FileName; 37349cc55cSDimitry Andric 38349cc55cSDimitry Andric public: 39349cc55cSDimitry Andric QualifierAlignmentFixer(const Environment &Env, const FormatStyle &Style, 40349cc55cSDimitry Andric StringRef &Code, ArrayRef<tooling::Range> Ranges, 41349cc55cSDimitry Andric unsigned FirstStartColumn, unsigned NextStartColumn, 42349cc55cSDimitry Andric unsigned LastStartColumn, StringRef FileName); 43349cc55cSDimitry Andric 44349cc55cSDimitry Andric std::pair<tooling::Replacements, unsigned> 45349cc55cSDimitry Andric analyze(TokenAnnotator &Annotator, 46349cc55cSDimitry Andric SmallVectorImpl<AnnotatedLine *> &AnnotatedLines, 47349cc55cSDimitry Andric FormatTokenLexer &Tokens) override; 48349cc55cSDimitry Andric 49349cc55cSDimitry Andric static void PrepareLeftRightOrdering(const std::vector<std::string> &Order, 50349cc55cSDimitry Andric std::vector<std::string> &LeftOrder, 51349cc55cSDimitry Andric std::vector<std::string> &RightOrder, 52349cc55cSDimitry Andric std::vector<tok::TokenKind> &Qualifiers); 53349cc55cSDimitry Andric }; 54349cc55cSDimitry Andric 55349cc55cSDimitry Andric class LeftRightQualifierAlignmentFixer : public TokenAnalyzer { 56349cc55cSDimitry Andric std::string Qualifier; 57349cc55cSDimitry Andric bool RightAlign; 58349cc55cSDimitry Andric SmallVector<tok::TokenKind, 8> QualifierTokens; 59349cc55cSDimitry Andric std::vector<tok::TokenKind> ConfiguredQualifierTokens; 60349cc55cSDimitry Andric 61349cc55cSDimitry Andric public: 62349cc55cSDimitry Andric LeftRightQualifierAlignmentFixer( 63349cc55cSDimitry Andric const Environment &Env, const FormatStyle &Style, 64349cc55cSDimitry Andric const std::string &Qualifier, 65349cc55cSDimitry Andric const std::vector<tok::TokenKind> &ConfiguredQualifierTokens, 66349cc55cSDimitry Andric bool RightAlign); 67349cc55cSDimitry Andric 68349cc55cSDimitry Andric std::pair<tooling::Replacements, unsigned> 69349cc55cSDimitry Andric analyze(TokenAnnotator &Annotator, 70349cc55cSDimitry Andric SmallVectorImpl<AnnotatedLine *> &AnnotatedLines, 71349cc55cSDimitry Andric FormatTokenLexer &Tokens) override; 72349cc55cSDimitry Andric 73349cc55cSDimitry Andric static tok::TokenKind getTokenFromQualifier(const std::string &Qualifier); 74349cc55cSDimitry Andric 75*04eeddc0SDimitry Andric const FormatToken *analyzeRight(const SourceManager &SourceMgr, 76349cc55cSDimitry Andric const AdditionalKeywords &Keywords, 77*04eeddc0SDimitry Andric tooling::Replacements &Fixes, 78*04eeddc0SDimitry Andric const FormatToken *Tok, 79349cc55cSDimitry Andric const std::string &Qualifier, 80349cc55cSDimitry Andric tok::TokenKind QualifierType); 81349cc55cSDimitry Andric 82*04eeddc0SDimitry Andric const FormatToken *analyzeLeft(const SourceManager &SourceMgr, 83349cc55cSDimitry Andric const AdditionalKeywords &Keywords, 84*04eeddc0SDimitry Andric tooling::Replacements &Fixes, 85*04eeddc0SDimitry Andric const FormatToken *Tok, 86349cc55cSDimitry Andric const std::string &Qualifier, 87349cc55cSDimitry Andric tok::TokenKind QualifierType); 88349cc55cSDimitry Andric 89349cc55cSDimitry Andric // is the Token a simple or qualifier type 90349cc55cSDimitry Andric static bool isQualifierOrType(const FormatToken *Tok, 91349cc55cSDimitry Andric const std::vector<tok::TokenKind> &Qualifiers); 92349cc55cSDimitry Andric 93349cc55cSDimitry Andric // is the Token likely a Macro 94349cc55cSDimitry Andric static bool isPossibleMacro(const FormatToken *Tok); 95349cc55cSDimitry Andric }; 96349cc55cSDimitry Andric 97349cc55cSDimitry Andric } // end namespace format 98349cc55cSDimitry Andric } // end namespace clang 99349cc55cSDimitry Andric 100349cc55cSDimitry Andric #endif 101