[clang] Add AlignConsecutiveEnums (PR #194154)

via cfe-commits cfe-commits at lists.llvm.org
Sat Apr 25 09:10:23 PDT 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-format

Author: Aaron (aaronsms)

<details>
<summary>Changes</summary>

Address #<!-- -->52983. Add ability to align enums similar to how bit fields are done.

---
Full diff: https://github.com/llvm/llvm-project/pull/194154.diff


7 Files Affected:

- (modified) clang/include/clang/Format/Format.h (+12) 
- (modified) clang/lib/Format/Format.cpp (+2) 
- (modified) clang/lib/Format/FormatToken.h (+1) 
- (modified) clang/lib/Format/TokenAnnotator.cpp (+6) 
- (modified) clang/lib/Format/TokenAnnotator.h (+2) 
- (modified) clang/lib/Format/WhitespaceManager.cpp (+10-5) 
- (modified) clang/lib/Format/WhitespaceManager.h (+4-1) 


``````````diff
diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h
index 48ce5aa2bdfa1..fee77bfe6e657 100644
--- a/clang/include/clang/Format/Format.h
+++ b/clang/include/clang/Format/Format.h
@@ -301,6 +301,17 @@ struct FormatStyle {
   /// \endcode
   /// \version 11
   AlignConsecutiveStyle AlignConsecutiveBitFields;
+  /// Style of aligning consecutive enum assignments.
+  ///
+  /// ``Consecutive`` will align the enum assignments of consecutive lines.
+  /// This will result in formattings like:
+  /// \code
+  ///   flag_aaaa = 1,
+  ///   flag_b    = 12,
+  ///   flag_ccc  = 8,
+  /// \endcode
+  /// \version 23
+  AlignConsecutiveStyle AlignConsecutiveEnums;
   /// Style of aligning consecutive declarations.
   ///
   /// ``Consecutive`` will align the declaration names of consecutive lines.
@@ -5910,6 +5921,7 @@ struct FormatStyle {
            AlignArrayOfStructures == R.AlignArrayOfStructures &&
            AlignConsecutiveAssignments == R.AlignConsecutiveAssignments &&
            AlignConsecutiveBitFields == R.AlignConsecutiveBitFields &&
+           AlignConsecutiveEnums == R.AlignConsecutiveEnums &&
            AlignConsecutiveDeclarations == R.AlignConsecutiveDeclarations &&
            AlignConsecutiveMacros == R.AlignConsecutiveMacros &&
            AlignConsecutiveShortCaseStatements ==
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp
index 48e139ea9d058..8595b6b91be8b 100644
--- a/clang/lib/Format/Format.cpp
+++ b/clang/lib/Format/Format.cpp
@@ -1164,6 +1164,7 @@ template <> struct MappingTraits<FormatStyle> {
                    Style.AlignConsecutiveAssignments);
     IO.mapOptional("AlignConsecutiveBitFields",
                    Style.AlignConsecutiveBitFields);
+    IO.mapOptional("AlignConsecutiveEnums", Style.AlignConsecutiveEnums);
     IO.mapOptional("AlignConsecutiveDeclarations",
                    Style.AlignConsecutiveDeclarations);
     IO.mapOptional("AlignConsecutiveMacros", Style.AlignConsecutiveMacros);
@@ -1749,6 +1750,7 @@ FormatStyle getLLVMStyle(FormatStyle::LanguageKind Language) {
   LLVMStyle.AlignConsecutiveAssignments = {};
   LLVMStyle.AlignConsecutiveAssignments.PadOperators = true;
   LLVMStyle.AlignConsecutiveBitFields = {};
+  LLVMStyle.AlignConsecutiveEnums = {};
   LLVMStyle.AlignConsecutiveDeclarations = {};
   LLVMStyle.AlignConsecutiveDeclarations.AlignFunctionDeclarations = true;
   LLVMStyle.AlignConsecutiveMacros = {};
diff --git a/clang/lib/Format/FormatToken.h b/clang/lib/Format/FormatToken.h
index 68d94b087136d..1d8f0f1cfe412 100644
--- a/clang/lib/Format/FormatToken.h
+++ b/clang/lib/Format/FormatToken.h
@@ -76,6 +76,7 @@ namespace format {
   TYPE(DoWhile)                                                                \
   TYPE(ElseLBrace)                                                             \
   TYPE(ElseRBrace)                                                             \
+  TYPE(EnumEqual)                                                              \
   TYPE(EnumLBrace)                                                             \
   TYPE(EnumRBrace)                                                             \
   TYPE(EnumUnderlyingTypeColon)                                                \
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index 5af9d26f7a84d..04ec1c1945488 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -139,6 +139,8 @@ class AnnotatingParser {
     case TT_StructLBrace:
     case TT_UnionLBrace:
       return ST_Class;
+    case TT_EnumLBrace:
+      return ST_Enum;
     case TT_CompoundRequirementLBrace:
       return ST_CompoundRequirement;
     default:
@@ -1832,6 +1834,10 @@ class AnnotatingParser {
         Tok->setType(TT_TrailingReturnArrow);
       break;
     case tok::equal:
+      if ((CurrentToken && CurrentToken->is(tok::numeric_constant)) &&
+          (!Scopes.empty() && Scopes.back() == ST_Enum)) {
+        Tok->setType(TT_EnumEqual);
+      }
       // In TableGen, there must be a value after "=";
       if (Style.isTableGen() && !parseTableGenValue())
         return false;
diff --git a/clang/lib/Format/TokenAnnotator.h b/clang/lib/Format/TokenAnnotator.h
index 597dd890ee990..33c7df9d0f949 100644
--- a/clang/lib/Format/TokenAnnotator.h
+++ b/clang/lib/Format/TokenAnnotator.h
@@ -40,6 +40,8 @@ enum LineType {
 enum ScopeType {
   // Contained in class declaration/definition.
   ST_Class,
+  // Contained in enum declaration/definition.
+  ST_Enum,
   // Contained in compound requirement.
   ST_CompoundRequirement,
   // Contained in other blocks (function, lambda, loop, if/else, child, etc).
diff --git a/clang/lib/Format/WhitespaceManager.cpp b/clang/lib/Format/WhitespaceManager.cpp
index 74aa8a2795150..235591b7bbb33 100644
--- a/clang/lib/Format/WhitespaceManager.cpp
+++ b/clang/lib/Format/WhitespaceManager.cpp
@@ -132,6 +132,7 @@ const tooling::Replacements &WhitespaceManager::generateReplacements() {
   alignConsecutiveShortCaseStatements(/*IsExpr=*/false);
   alignConsecutiveDeclarations();
   alignConsecutiveBitFields();
+  alignConsecutiveEnums();
   alignConsecutiveAssignments();
   if (Style.isTableGen()) {
     alignConsecutiveTableGenBreakingDAGArgColons();
@@ -846,10 +847,14 @@ void WhitespaceManager::alignConsecutiveAssignments() {
 }
 
 void WhitespaceManager::alignConsecutiveBitFields() {
-  alignConsecutiveColons(Style.AlignConsecutiveBitFields, TT_BitFieldColon);
+  alignConsecutiveTokens(Style.AlignConsecutiveBitFields, TT_BitFieldColon);
 }
 
-void WhitespaceManager::alignConsecutiveColons(
+void WhitespaceManager::alignConsecutiveEnums() {
+  alignConsecutiveTokens(Style.AlignConsecutiveEnums, TT_EnumEqual);
+}
+
+void WhitespaceManager::alignConsecutiveTokens(
     const FormatStyle::AlignConsecutiveStyle &AlignStyle, TokenType Type) {
   if (!AlignStyle.Enabled)
     return;
@@ -897,17 +902,17 @@ void WhitespaceManager::alignConsecutiveShortCaseStatements(bool IsExpr) {
 }
 
 void WhitespaceManager::alignConsecutiveTableGenBreakingDAGArgColons() {
-  alignConsecutiveColons(Style.AlignConsecutiveTableGenBreakingDAGArgColons,
+  alignConsecutiveTokens(Style.AlignConsecutiveTableGenBreakingDAGArgColons,
                          TT_TableGenDAGArgListColonToAlign);
 }
 
 void WhitespaceManager::alignConsecutiveTableGenCondOperatorColons() {
-  alignConsecutiveColons(Style.AlignConsecutiveTableGenCondOperatorColons,
+  alignConsecutiveTokens(Style.AlignConsecutiveTableGenCondOperatorColons,
                          TT_TableGenCondOperatorColon);
 }
 
 void WhitespaceManager::alignConsecutiveTableGenDefinitions() {
-  alignConsecutiveColons(Style.AlignConsecutiveTableGenDefinitionColons,
+  alignConsecutiveTokens(Style.AlignConsecutiveTableGenDefinitionColons,
                          TT_InheritanceColon);
 }
 
diff --git a/clang/lib/Format/WhitespaceManager.h b/clang/lib/Format/WhitespaceManager.h
index 66a064ae81dbf..07db6173104ba 100644
--- a/clang/lib/Format/WhitespaceManager.h
+++ b/clang/lib/Format/WhitespaceManager.h
@@ -235,9 +235,12 @@ class WhitespaceManager {
   /// Align consecutive bitfields over all \c Changes.
   void alignConsecutiveBitFields();
 
+  /// Align consecutive enums over all \c Changes.
+  void alignConsecutiveEnums();
+
   /// Align consecutive colon. For bitfields, TableGen DAGArgs and definitions.
   void
-  alignConsecutiveColons(const FormatStyle::AlignConsecutiveStyle &AlignStyle,
+  alignConsecutiveTokens(const FormatStyle::AlignConsecutiveStyle &AlignStyle,
                          TokenType Type);
 
   /// Align consecutive declarations over all \c Changes.

``````````

</details>


https://github.com/llvm/llvm-project/pull/194154


More information about the cfe-commits mailing list