diff options
author | Marek Kurdej <marek.kurdej+llvm.org@gmail.com> | 2022-05-21 00:05:51 +0200 |
---|---|---|
committer | Marek Kurdej <marek.kurdej+llvm.org@gmail.com> | 2022-05-26 15:02:33 +0200 |
commit | d4d28f2ace764a0420a33462628b43a1c71fc3dc (patch) | |
tree | 48cfc9adf4a2a2eb483477dd4cced17ffda6488d /clang/lib/Format/QualifierAlignmentFixer.cpp | |
parent | 605651135b4c37e423825a9201b06a16ff6160a1 (diff) | |
download | llvm-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.cpp | 62 |
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; |