Index: include/clang/Format/Format.h =================================================================== --- include/clang/Format/Format.h +++ include/clang/Format/Format.h @@ -80,12 +80,17 @@ /// If ``true``, aligns consecutive assignments. /// - /// This will align the assignment operators of consecutive lines. This - /// will result in formattings like + /// This will align the declaration names of consecutive lines and + /// matching assignment operators. This includes consecutive |=, += + /// -=, /=, *=. This will result in formattings like /// \code /// int aaaa = 12; /// int b = 23; /// int ccc = 23; + /// + /// int ddd += 12; + /// int ee += 22; + /// int f += 23; /// \endcode bool AlignConsecutiveAssignments; Index: lib/Format/WhitespaceManager.cpp =================================================================== --- lib/Format/WhitespaceManager.cpp +++ lib/Format/WhitespaceManager.cpp @@ -432,20 +432,26 @@ void WhitespaceManager::alignConsecutiveAssignments() { if (!Style.AlignConsecutiveAssignments) return; + std::vector assignment_tokens = + {tok::equal, tok::pipeequal, tok::caretequal, tok::percentequal, + tok::ampequal, tok::plusequal, tok::minusequal, tok::starequal, + tok::slashequal, tok::lesslessequal, tok::greatergreaterequal}; + for (auto assignment_token : assignment_tokens) + { + AlignTokens(Style, + [&](const Change &C) { + // Do not align on equal signs that are first on a line. + if (C.NewlinesBefore > 0) + return false; - AlignTokens(Style, - [&](const Change &C) { - // Do not align on equal signs that are first on a line. - if (C.NewlinesBefore > 0) - return false; + // Do not align on equal signs that are last on a line. + if (&C != &Changes.back() && (&C + 1)->NewlinesBefore > 0) + return false; - // Do not align on equal signs that are last on a line. - if (&C != &Changes.back() && (&C + 1)->NewlinesBefore > 0) - return false; - - return C.Tok->is(tok::equal); - }, - Changes, /*StartAt=*/0); + return C.Tok->is(assignment_token); + }, + Changes, /*StartAt=*/0); + } } void WhitespaceManager::alignConsecutiveDeclarations() {