17#include "llvm/Support/Debug.h"
18#include "llvm/Support/Regex.h"
23#define DEBUG_TYPE "format-qualifier-alignment-fixer"
30 std::vector<std::string> LeftOrder;
31 std::vector<std::string> RightOrder;
32 std::vector<tok::TokenKind> ConfiguredQualifierTokens;
34 Style.
QualifierOrder, LeftOrder, RightOrder, ConfiguredQualifierTokens);
37 for (
const auto &Qualifier : LeftOrder) {
39 [&, Qualifier, ConfiguredQualifierTokens](
const Environment &
Env) {
41 ConfiguredQualifierTokens,
46 for (
const auto &Qualifier : RightOrder) {
48 [&, Qualifier, ConfiguredQualifierTokens](
const Environment &
Env) {
50 ConfiguredQualifierTokens,
61 auto Err = Fixes.
add(Replacement);
64 llvm::errs() <<
"Error while rearranging Qualifier : "
65 << llvm::toString(std::move(Err)) <<
"\n";
73 First->Tok.getEndLoc());
80 const std::string &Qualifier) {
82 First->Tok.getEndLoc());
84 std::string NewText{};
85 NewText +=
First->TokenText;
86 NewText +=
" " + Qualifier;
93 const std::string &Qualifier) {
95 First->Tok.getEndLoc());
97 std::string NewText =
" " + Qualifier +
" ";
98 NewText +=
First->TokenText;
106 return isspace(
s.back());
112 return isspace(
s.front());
128 NewText +=
Last->TokenText;
138 NewText += Tok->TokenText;
146 NewText +=
First->TokenText;
150 Last->Tok.getEndLoc());
157 const std::vector<tok::TokenKind> &
Qualifiers) {
167 case tok::kw_volatile:
170 case tok::kw_constexpr:
171 case tok::kw_restrict:
184 if (Tok->
isNot(QualifierType))
197 const bool IsRightQualifier = PreviousCheck && [PreviousCheck]() {
204 if (PreviousCheck->
is(tok::r_paren))
210 if (PreviousCheck->
is(tok::r_brace))
231 if (PreviousCheck->
is(TT_TemplateCloser)) {
242 if (PreviousCheck->
isOneOf(TT_PointerOrReference, tok::identifier,
257 if (IsRightQualifier) {
279 if (TypeToken->
isOneOf(tok::kw_decltype, tok::kw_typeof, tok::kw__Atomic))
282 const FormatToken *LastSimpleTypeSpecifier = TypeToken;
288 rotateTokens(SourceMgr, Fixes, Tok, LastSimpleTypeSpecifier,
290 return LastSimpleTypeSpecifier;
304 if (TypeToken->
is(tok::kw_typename))
309 if (TypeToken->
is(tok::coloncolon)) {
312 if (TypeToken && TypeToken->
is(tok::kw_template))
321 if (TypeToken->
isOneOf(tok::kw_struct, tok::kw_class))
324 if (TypeToken->
isOneOf(tok::kw_auto, tok::identifier)) {
337 (Next->is(TT_TemplateOpener) ||
338 Next->startsSequence(tok::coloncolon, tok::identifier) ||
339 Next->startsSequence(tok::coloncolon, tok::kw_template,
341 if (Next->is(TT_TemplateOpener)) {
342 assert(Next->MatchingParen &&
"Missing template closer");
343 TypeToken = Next->MatchingParen;
344 }
else if (Next->startsSequence(tok::coloncolon, tok::identifier)) {
345 TypeToken = Next->getNextNonComment();
347 TypeToken = Next->getNextNonComment()->getNextNonComment();
351 if (Next && Next->is(tok::kw_auto))
375 if (Tok->
isNot(QualifierType))
390 TypeToken->
is(tok::r_square)) {
395 ConfiguredQualifierTokens)) {
399 if (FirstQual != Tok)
415 const FormatToken *LastSimpleTypeSpecifier = TypeToken;
418 ConfiguredQualifierTokens,
LangOpts)) {
419 LastSimpleTypeSpecifier =
423 rotateTokens(SourceMgr, Fixes, LastSimpleTypeSpecifier, Tok,
428 if (TypeToken->
isOneOf(tok::kw_auto, tok::identifier, TT_TemplateCloser)) {
429 const auto IsStartOfType = [](
const FormatToken *
const Tok) ->
bool {
435 if (Tok->
is(TT_TemplateCloser))
444 if (Tok->
is(tok::identifier) &&
Previous->is(tok::coloncolon))
450 if (Tok->
is(tok::identifier) &&
Previous->is(tok::kw_template) &&
451 PrePrevious && PrePrevious->
is(tok::coloncolon)) {
461 while (!IsStartOfType(TypeToken)) {
463 if (TypeToken->
is(TT_TemplateCloser)) {
464 assert(TypeToken->
MatchingParen &&
"Missing template opener");
482 PreColonColon->
isOneOf(TT_TemplateCloser, tok::identifier)) {
483 TypeToken = PreColonColon;
485 TypeToken = ColonColon;
490 assert(TypeToken &&
"Should be auto or identifier");
514 const std::string &Qualifier) {
516 return llvm::StringSwitch<tok::TokenKind>(Qualifier)
517 .Case(
"type", tok::kw_typeof)
518 .Case(
"const", tok::kw_const)
519 .Case(
"volatile", tok::kw_volatile)
520 .Case(
"static", tok::kw_static)
521 .Case(
"inline", tok::kw_inline)
522 .Case(
"constexpr", tok::kw_constexpr)
523 .Case(
"restrict", tok::kw_restrict)
524 .Case(
"friend", tok::kw_friend)
525 .Default(tok::identifier);
530 const std::string &Qualifier,
531 const std::vector<tok::TokenKind> &QualifierTokens,
bool RightAlign)
533 ConfiguredQualifierTokens(QualifierTokens) {}
535std::pair<tooling::Replacements, unsigned>
552 assert(QualifierToken != tok::identifier &&
"Unrecognised Qualifier");
556 if (!
Line->Affected ||
Line->InPPDirective)
560 if (
First->Finalized)
565 for (
const auto *Tok =
First; Tok && Tok !=
Last && Tok->Next;
567 if (Tok->MustBreakBefore)
569 if (Tok->is(tok::comment))
572 Tok =
analyzeRight(SourceMgr, Keywords, Fixes, Tok, Qualifier,
575 Tok =
analyzeLeft(SourceMgr, Keywords, Fixes, Tok, Qualifier,
583 const std::vector<std::string> &Order, std::vector<std::string> &LeftOrder,
584 std::vector<std::string> &RightOrder,
591 assert(llvm::is_contained(Order,
"type") &&
592 "QualifierOrder must contain type");
596 for (
const auto &
s : Order) {
604 if (QualifierToken != tok::kw_typeof && QualifierToken != tok::identifier)
609 LeftOrder.insert(LeftOrder.begin(),
s);
611 RightOrder.push_back(
s);
617 return Tok && (Tok->
isTypeName(LangOpts) || Tok->
is(tok::kw_auto) ||
622 const std::vector<tok::TokenKind> &
Qualifiers,
624 return Tok && (Tok->
isTypeName(LangOpts) || Tok->
is(tok::kw_auto) ||
633 if (Tok->
isNot(tok::identifier))
This file declares QualifierAlignmentFixer, a TokenAnalyzer that enforces either east or west const d...
__device__ __2f16 float __ockl_bool s
Represents a character-granular source range.
static CharSourceRange getCharRange(SourceRange R)
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
The collection of all-type qualifiers we support.
This class handles loading and caching of source files into memory.
tok::TokenKind getKind() const
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
The JSON file list parser is used to communicate input to InstallAPI.