[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