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) {
281 if (TypeToken->
isOneOf(tok::kw_decltype, tok::kw_typeof, tok::kw__Atomic))
284 const FormatToken *LastSimpleTypeSpecifier = TypeToken;
290 rotateTokens(SourceMgr, Fixes, Tok, LastSimpleTypeSpecifier,
292 return LastSimpleTypeSpecifier;
298 if (PreviousCheck && PreviousCheck->
isTypeName(IsCpp)) {
306 if (TypeToken->
is(tok::kw_typename))
311 if (TypeToken->
is(tok::coloncolon)) {
314 if (TypeToken && TypeToken->
is(tok::kw_template))
323 if (TypeToken->
isOneOf(tok::kw_struct, tok::kw_class))
326 if (TypeToken->
isOneOf(tok::kw_auto, tok::identifier)) {
339 (Next->is(TT_TemplateOpener) ||
340 Next->startsSequence(tok::coloncolon, tok::identifier) ||
341 Next->startsSequence(tok::coloncolon, tok::kw_template,
343 if (Next->is(TT_TemplateOpener)) {
344 assert(Next->MatchingParen &&
"Missing template closer");
345 TypeToken = Next->MatchingParen;
346 }
else if (Next->startsSequence(tok::coloncolon, tok::identifier)) {
347 TypeToken = Next->getNextNonComment();
349 TypeToken = Next->getNextNonComment()->getNextNonComment();
353 if (Next->is(tok::kw_auto))
377 if (Tok->
isNot(QualifierType))
396 ConfiguredQualifierTokens)) {
400 if (FirstQual != Tok)
416 const FormatToken *LastSimpleTypeSpecifier = TypeToken;
419 ConfiguredQualifierTokens, IsCpp)) {
420 LastSimpleTypeSpecifier =
424 rotateTokens(SourceMgr, Fixes, LastSimpleTypeSpecifier, Tok,
429 if (TypeToken->
isOneOf(tok::kw_auto, tok::identifier, TT_TemplateCloser)) {
430 const auto IsStartOfType = [](
const FormatToken *
const Tok) ->
bool {
436 if (Tok->
is(TT_TemplateCloser))
445 if (Tok->
is(tok::identifier) &&
Previous->is(tok::coloncolon))
451 if (Tok->
is(tok::identifier) &&
Previous->is(tok::kw_template) &&
452 PrePrevious && PrePrevious->
is(tok::coloncolon)) {
462 while (!IsStartOfType(TypeToken)) {
464 if (TypeToken->
is(TT_TemplateCloser)) {
465 assert(TypeToken->
MatchingParen &&
"Missing template opener");
483 PreColonColon->
isOneOf(TT_TemplateCloser, tok::identifier)) {
484 TypeToken = PreColonColon;
486 TypeToken = ColonColon;
491 assert(TypeToken &&
"Should be auto or identifier");
515 const std::string &Qualifier) {
517 return llvm::StringSwitch<tok::TokenKind>(Qualifier)
518 .Case(
"type", tok::kw_typeof)
519 .Case(
"const", tok::kw_const)
520 .Case(
"volatile", tok::kw_volatile)
521 .Case(
"static", tok::kw_static)
522 .Case(
"inline", tok::kw_inline)
523 .Case(
"constexpr", tok::kw_constexpr)
524 .Case(
"restrict", tok::kw_restrict)
525 .Case(
"friend", tok::kw_friend)
526 .Default(tok::identifier);
531 const std::string &Qualifier,
532 const std::vector<tok::TokenKind> &QualifierTokens,
bool RightAlign)
534 ConfiguredQualifierTokens(QualifierTokens) {}
536std::pair<tooling::Replacements, unsigned>
553 assert(QualifierToken != tok::identifier &&
"Unrecognised Qualifier");
557 if (!
Line->Affected ||
Line->InPPDirective)
561 if (
First->Finalized)
566 for (
const auto *Tok =
First; Tok && Tok !=
Last && Tok->Next;
568 if (Tok->MustBreakBefore)
570 if (Tok->is(tok::comment))
573 Tok =
analyzeRight(SourceMgr, Keywords, Fixes, Tok, Qualifier,
576 Tok =
analyzeLeft(SourceMgr, Keywords, Fixes, Tok, Qualifier,
584 const std::vector<std::string> &Order, std::vector<std::string> &LeftOrder,
585 std::vector<std::string> &RightOrder,
592 assert(llvm::is_contained(Order,
"type") &&
593 "QualifierOrder must contain type");
597 for (
const auto &
s : Order) {
605 if (QualifierToken != tok::kw_typeof && QualifierToken != tok::identifier)
610 LeftOrder.insert(LeftOrder.begin(),
s);
612 RightOrder.push_back(
s);
626 return Tok && (Tok->
isTypeName(IsCpp) || Tok->
is(tok::kw_auto) ||
635 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)
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.