aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Format/QualifierAlignmentFixer.cpp
diff options
context:
space:
mode:
authorMarek Kurdej <marek.kurdej+llvm.org@gmail.com>2022-05-21 00:05:51 +0200
committerMarek Kurdej <marek.kurdej+llvm.org@gmail.com>2022-05-26 15:02:33 +0200
commitd4d28f2ace764a0420a33462628b43a1c71fc3dc (patch)
tree48cfc9adf4a2a2eb483477dd4cced17ffda6488d /clang/lib/Format/QualifierAlignmentFixer.cpp
parent605651135b4c37e423825a9201b06a16ff6160a1 (diff)
downloadllvm-d4d28f2ace764a0420a33462628b43a1c71fc3dc.zip
llvm-d4d28f2ace764a0420a33462628b43a1c71fc3dc.tar.gz
llvm-d4d28f2ace764a0420a33462628b43a1c71fc3dc.tar.bz2
[clang-format] Fix QualifierAlignment with global namespace qualified types.
Fixes https://github.com/llvm/llvm-project/issues/55610. Reviewed By: MyDeveloperDay Differential Revision: https://reviews.llvm.org/D126096
Diffstat (limited to 'clang/lib/Format/QualifierAlignmentFixer.cpp')
-rw-r--r--clang/lib/Format/QualifierAlignmentFixer.cpp62
1 files changed, 42 insertions, 20 deletions
diff --git a/clang/lib/Format/QualifierAlignmentFixer.cpp b/clang/lib/Format/QualifierAlignmentFixer.cpp
index dd12298..61f17ca 100644
--- a/clang/lib/Format/QualifierAlignmentFixer.cpp
+++ b/clang/lib/Format/QualifierAlignmentFixer.cpp
@@ -216,6 +216,29 @@ const FormatToken *LeftRightQualifierAlignmentFixer::analyzeRight(
if (LeftRightQualifierAlignmentFixer::isPossibleMacro(Tok->Next))
return Tok;
+ auto AnalyzeTemplate =
+ [&](const FormatToken *Tok,
+ const FormatToken *StartTemplate) -> const FormatToken * {
+ // Read from the TemplateOpener to TemplateCloser.
+ FormatToken *EndTemplate = StartTemplate->MatchingParen;
+ if (EndTemplate) {
+ // Move to the end of any template class members e.g.
+ // `Foo<int>::iterator`.
+ if (EndTemplate->startsSequence(TT_TemplateCloser, tok::coloncolon,
+ tok::identifier)) {
+ EndTemplate = EndTemplate->Next->Next;
+ }
+ }
+ if (EndTemplate && EndTemplate->Next &&
+ !EndTemplate->Next->isOneOf(tok::equal, tok::l_paren)) {
+ insertQualifierAfter(SourceMgr, Fixes, EndTemplate, Qualifier);
+ // Remove the qualifier.
+ removeToken(SourceMgr, Fixes, Tok);
+ return Tok;
+ }
+ return nullptr;
+ };
+
FormatToken *Qual = Tok->Next;
FormatToken *LastQual = Qual;
while (Qual && isQualifierOrType(Qual, ConfiguredQualifierTokens)) {
@@ -233,27 +256,24 @@ const FormatToken *LeftRightQualifierAlignmentFixer::analyzeRight(
return Tok;
} else if (Tok->startsSequence(QualifierType, tok::identifier,
TT_TemplateOpener)) {
- // Read from the TemplateOpener to
- // TemplateCloser as in const ArrayRef<int> a; const ArrayRef<int> &a;
- FormatToken *EndTemplate = Tok->Next->Next->MatchingParen;
- if (EndTemplate) {
- // Move to the end of any template class members e.g.
- // `Foo<int>::iterator`.
- if (EndTemplate->startsSequence(TT_TemplateCloser, tok::coloncolon,
- tok::identifier)) {
- EndTemplate = EndTemplate->Next->Next;
- }
- }
- if (EndTemplate && EndTemplate->Next &&
- !EndTemplate->Next->isOneOf(tok::equal, tok::l_paren)) {
- insertQualifierAfter(SourceMgr, Fixes, EndTemplate, Qualifier);
- // Remove the qualifier.
- removeToken(SourceMgr, Fixes, Tok);
- return Tok;
- }
- } else if (Tok->startsSequence(QualifierType, tok::identifier)) {
+ // `const ArrayRef<int> a;`
+ // `const ArrayRef<int> &a;`
+ const FormatToken *NewTok = AnalyzeTemplate(Tok, Tok->Next->Next);
+ if (NewTok)
+ return NewTok;
+ } else if (Tok->startsSequence(QualifierType, tok::coloncolon,
+ tok::identifier, TT_TemplateOpener)) {
+ // `const ::ArrayRef<int> a;`
+ // `const ::ArrayRef<int> &a;`
+ const FormatToken *NewTok = AnalyzeTemplate(Tok, Tok->Next->Next->Next);
+ if (NewTok)
+ return NewTok;
+ } else if (Tok->startsSequence(QualifierType, tok::identifier) ||
+ Tok->startsSequence(QualifierType, tok::coloncolon,
+ tok::identifier)) {
FormatToken *Next = Tok->Next;
// The case `const Foo` -> `Foo const`
+ // The case `const ::Foo` -> `::Foo const`
// The case `const Foo *` -> `Foo const *`
// The case `const Foo &` -> `Foo const &`
// The case `const Foo &&` -> `Foo const &&`
@@ -331,7 +351,9 @@ const FormatToken *LeftRightQualifierAlignmentFixer::analyzeLeft(
Tok->Next->Next && Tok->Next->Next->is(QualifierType)) {
rotateTokens(SourceMgr, Fixes, Tok->Next, Tok->Next->Next, /*Left=*/true);
}
- if (Tok->startsSequence(tok::identifier) && Tok->Next) {
+ if ((Tok->startsSequence(tok::coloncolon, tok::identifier) ||
+ Tok->is(tok::identifier)) &&
+ Tok->Next) {
if (Tok->Previous &&
Tok->Previous->isOneOf(tok::star, tok::ampamp, tok::amp)) {
return Tok;