| //===--- LeftRightQualifierAlignmentFixer.h ------------------------------*- C++ |
| //-*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| /// |
| /// \file |
| /// This file declares LeftRightQualifierAlignmentFixer, a TokenAnalyzer that |
| /// enforces either east or west const depending on the style. |
| /// |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_CLANG_LIB_FORMAT_QUALIFIERALIGNMENTFIXER_H |
| #define LLVM_CLANG_LIB_FORMAT_QUALIFIERALIGNMENTFIXER_H |
| |
| #include "TokenAnalyzer.h" |
| |
| namespace clang { |
| namespace format { |
| |
| typedef std::function<std::pair<tooling::Replacements, unsigned>( |
| const Environment &)> |
| AnalyzerPass; |
| |
| class QualifierAlignmentFixer : public TokenAnalyzer { |
| // Left to Right ordering requires multiple passes |
| SmallVector<AnalyzerPass, 8> Passes; |
| StringRef &Code; |
| ArrayRef<tooling::Range> Ranges; |
| unsigned FirstStartColumn; |
| unsigned NextStartColumn; |
| unsigned LastStartColumn; |
| StringRef FileName; |
| |
| public: |
| QualifierAlignmentFixer(const Environment &Env, const FormatStyle &Style, |
| StringRef &Code, ArrayRef<tooling::Range> Ranges, |
| unsigned FirstStartColumn, unsigned NextStartColumn, |
| unsigned LastStartColumn, StringRef FileName); |
| |
| std::pair<tooling::Replacements, unsigned> |
| analyze(TokenAnnotator &Annotator, |
| SmallVectorImpl<AnnotatedLine *> &AnnotatedLines, |
| FormatTokenLexer &Tokens) override; |
| |
| static void PrepareLeftRightOrdering(const std::vector<std::string> &Order, |
| std::vector<std::string> &LeftOrder, |
| std::vector<std::string> &RightOrder, |
| std::vector<tok::TokenKind> &Qualifiers); |
| }; |
| |
| class LeftRightQualifierAlignmentFixer : public TokenAnalyzer { |
| std::string Qualifier; |
| bool RightAlign; |
| SmallVector<tok::TokenKind, 8> QualifierTokens; |
| std::vector<tok::TokenKind> ConfiguredQualifierTokens; |
| |
| public: |
| LeftRightQualifierAlignmentFixer( |
| const Environment &Env, const FormatStyle &Style, |
| const std::string &Qualifier, |
| const std::vector<tok::TokenKind> &ConfiguredQualifierTokens, |
| bool RightAlign); |
| |
| std::pair<tooling::Replacements, unsigned> |
| analyze(TokenAnnotator &Annotator, |
| SmallVectorImpl<AnnotatedLine *> &AnnotatedLines, |
| FormatTokenLexer &Tokens) override; |
| |
| static tok::TokenKind getTokenFromQualifier(const std::string &Qualifier); |
| |
| FormatToken *analyzeRight(const SourceManager &SourceMgr, |
| const AdditionalKeywords &Keywords, |
| tooling::Replacements &Fixes, FormatToken *Tok, |
| const std::string &Qualifier, |
| tok::TokenKind QualifierType); |
| |
| FormatToken *analyzeLeft(const SourceManager &SourceMgr, |
| const AdditionalKeywords &Keywords, |
| tooling::Replacements &Fixes, FormatToken *Tok, |
| const std::string &Qualifier, |
| tok::TokenKind QualifierType); |
| |
| // is the Token a simple or qualifier type |
| static bool isQualifierOrType(const FormatToken *Tok, |
| const std::vector<tok::TokenKind> &Qualifiers); |
| |
| // is the Token likely a Macro |
| static bool isPossibleMacro(const FormatToken *Tok); |
| }; |
| |
| } // end namespace format |
| } // end namespace clang |
| |
| #endif |