[clang-format] QualifierOrder does not reorder template arguments

https://github.com/llvm/llvm-project/issues/53981

Reorder the qualifiers inside the template argument. This should handle the simple cases of

```
<const T>
<T const>
```

But only by relaxing that single letter capital variables are not possible macros

Fixes: #53981

Reviewed By: HazardyKnusperkeks, curdeius

Differential Revision: https://reviews.llvm.org/D120710
This commit is contained in:
mydeveloperday 2022-03-05 18:07:16 +00:00
parent 9b03c08e85
commit 28bb040ded
2 changed files with 53 additions and 2 deletions

View file

@ -223,6 +223,12 @@ const FormatToken *LeftRightQualifierAlignmentFixer::analyzeRight(
if (LastQual && Qual != LastQual) {
rotateTokens(SourceMgr, Fixes, Tok, LastQual, /*Left=*/false);
Tok = LastQual;
} else if (Tok->startsSequence(QualifierType, tok::identifier,
TT_TemplateCloser)) {
FormatToken *Closer = Tok->Next->Next;
rotateTokens(SourceMgr, Fixes, Tok, Tok->Next, /*Left=*/false);
Tok = Closer;
return Tok;
} else if (Tok->startsSequence(QualifierType, tok::identifier,
TT_TemplateOpener)) {
// Read from the TemplateOpener to
@ -307,6 +313,11 @@ const FormatToken *LeftRightQualifierAlignmentFixer::analyzeLeft(
rotateTokens(SourceMgr, Fixes, Tok, Tok->Next, /*Left=*/true);
Tok = Tok->Next;
}
} else if (Tok->startsSequence(tok::identifier, QualifierType,
TT_TemplateCloser)) {
FormatToken *Closer = Tok->Next->Next;
rotateTokens(SourceMgr, Fixes, Tok, Tok->Next, /*Left=*/true);
Tok = Closer;
}
}
if (Tok->is(TT_TemplateOpener) && Tok->Next &&
@ -329,8 +340,12 @@ const FormatToken *LeftRightQualifierAlignmentFixer::analyzeLeft(
Next = Next->getNextNonComment();
assert(Next->MatchingParen && "Missing template closer");
Next = Next->MatchingParen;
// If the template closer is closing the requires clause,
// then stop and go back to the TemplateOpener and do whatever is
// inside the <>.
if (Next->ClosesRequiresClause)
return Next;
return Next->MatchingParen;
Next = Next->Next;
// Move to the end of any template class members e.g.
@ -461,7 +476,8 @@ bool LeftRightQualifierAlignmentFixer::isPossibleMacro(const FormatToken *Tok) {
if (!Tok->is(tok::identifier))
return false;
if (Tok->TokenText.upper() == Tok->TokenText.str())
return true;
// T,K,U,V likely could be template arguments
return (Tok->TokenText.size() != 1);
return false;
}

View file

@ -895,5 +895,40 @@ TEST_F(QualifierFixerTest, DisableRegions) {
Style);
}
TEST_F(QualifierFixerTest, TemplatesRight) {
FormatStyle Style = getLLVMStyle();
Style.QualifierAlignment = FormatStyle::QAS_Custom;
Style.QualifierOrder = {"type", "const"};
verifyFormat("template <typename T>\n"
" requires Concept<T const>\n"
"void f();",
"template <typename T>\n"
" requires Concept<const T>\n"
"void f();",
Style);
verifyFormat("TemplateType<T const> t;", "TemplateType<const T> t;", Style);
verifyFormat("TemplateType<Container const> t;",
"TemplateType<const Container> t;", Style);
}
TEST_F(QualifierFixerTest, TemplatesLeft) {
FormatStyle Style = getLLVMStyle();
Style.QualifierAlignment = FormatStyle::QAS_Custom;
Style.QualifierOrder = {"const", "type"};
verifyFormat("template <const T> t;", "template <T const> t;", Style);
verifyFormat("template <typename T>\n"
" requires Concept<const T>\n"
"void f();",
"template <typename T>\n"
" requires Concept<T const>\n"
"void f();",
Style);
verifyFormat("TemplateType<const T> t;", "TemplateType<T const> t;", Style);
verifyFormat("TemplateType<const Container> t;",
"TemplateType<Container const> t;", Style);
}
} // namespace format
} // namespace clang