Browse Source

Make Any* macros reusable (#6933)

Use parens to delay macro expansion to address the comma separator case,
allowing reuse in AnyBindingOrExportDecl. Also add
CARBON_INST_CATEGORY_ANY_EXPAND to reduce some boilerplate.

Assisted-by: Google Antigravity with Gemini
Jon Ross-Perkins 1 tháng trước cách đây
mục cha
commit
7b3f120f97
2 tập tin đã thay đổi với 71 bổ sung83 xóa
  1. 6 6
      toolchain/base/kind_switch.h
  2. 65 77
      toolchain/sem_ir/inst_categories.h

+ 6 - 6
toolchain/base/kind_switch.h

@@ -41,10 +41,10 @@
 // - Each type passed to `CARBON_KIND_ANY` must have a macro of the form:
 //   ```
 //   #define AnyKind_CARBON_KIND_ANY_EXPAND   \
-//     CARBON_KIND_ANY_EXPAND_BEGIN CARBON_KIND_ANY_EXPAND_CASE(Kind1) \
-//     CARBON_KIND_ANY_EXPAND_SEP   CARBON_KIND_ANY_EXPAND_CASE(Kind2) \
+//     CARBON_KIND_ANY_EXPAND_BEGIN() CARBON_KIND_ANY_EXPAND_CASE(Kind1) \
+//     CARBON_KIND_ANY_EXPAND_SEP()   CARBON_KIND_ANY_EXPAND_CASE(Kind2) \
 //     ...
-//     CARBON_KIND_ANY_EXPAND_SEP   CARBON_KIND_ANY_EXPAND_CASE(KindN)
+//     CARBON_KIND_ANY_EXPAND_SEP()   CARBON_KIND_ANY_EXPAND_CASE(KindN)
 //   ```
 //   Note the prefix `,` is required.
 //
@@ -71,10 +71,10 @@
       : CARBON_KIND_INTERNAL_DECLARE(typed_variable_decl)
 
 // Macros for clients to add support for `Type_CARBON_KIND_ANY_EXPAND` (see
-// example above).
+// example above). Empty parameters are used to allow delaying macro expansion.
 #define CARBON_KIND_ANY_EXPAND_CASE(X) CARBON_KIND_INTERNAL_CASE_VALUE(X)
-#define CARBON_KIND_ANY_EXPAND_BEGIN ,
-#define CARBON_KIND_ANY_EXPAND_SEP : case
+#define CARBON_KIND_ANY_EXPAND_BEGIN() ,
+#define CARBON_KIND_ANY_EXPAND_SEP() : case
 
 // Produces a case-compatible block of code that also instantiates a local typed
 // variable. Versus `CARBON_KIND(int i)`, note this requires a comma after the

+ 65 - 77
toolchain/sem_ir/inst_categories.h

@@ -39,18 +39,23 @@ struct CategoryOf {
       CARBON_INST_CATEGORY_INFO_INTERNAL_NAME, \
       CARBON_INST_CATEGORY_INFO_INTERNAL_COMMA)>
 #define CARBON_INST_CATEGORY_INFO_INTERNAL_NAME(Name) Name
-#define CARBON_INST_CATEGORY_INFO_INTERNAL_COMMA ,
+#define CARBON_INST_CATEGORY_INFO_INTERNAL_COMMA() ,
+
+// Helper for defining `AnyKind_CARBON_KIND_ANY_EXPAND`.
+#define CARBON_INST_CATEGORY_ANY_EXPAND(AnyKind)              \
+  CARBON_KIND_ANY_EXPAND_BEGIN()                              \
+  AnyKind##_CARBON_INST_CATEGORY(CARBON_KIND_ANY_EXPAND_CASE, \
+                                 CARBON_KIND_ANY_EXPAND_SEP)
 
 // clang-format off
 #define AnyAggregateAccess_CARBON_INST_CATEGORY(X, Sep) \
-  X(::Carbon::SemIR::ClassElementAccess) Sep            \
-  X(::Carbon::SemIR::StructAccess) Sep                  \
+  X(::Carbon::SemIR::ClassElementAccess) Sep()          \
+  X(::Carbon::SemIR::StructAccess) Sep()                \
   X(::Carbon::SemIR::TupleAccess)
 // clang-format on
 
-#define AnyAggregateAccess_CARBON_KIND_ANY_EXPAND                       \
-  CARBON_KIND_ANY_EXPAND_BEGIN AnyAggregateAccess_CARBON_INST_CATEGORY( \
-      CARBON_KIND_ANY_EXPAND_CASE, CARBON_KIND_ANY_EXPAND_SEP)
+#define AnyAggregateAccess_CARBON_KIND_ANY_EXPAND \
+  CARBON_INST_CATEGORY_ANY_EXPAND(AnyAggregateAccess)
 
 // Common representation for aggregate access nodes, which access a fixed
 // element of an aggregate.
@@ -65,15 +70,14 @@ struct AnyAggregateAccess {
 
 // clang-format off
 #define AnyAggregateInit_CARBON_INST_CATEGORY(X, Sep) \
-  X(::Carbon::SemIR::ArrayInit) Sep                   \
-  X(::Carbon::SemIR::ClassInit) Sep                   \
-  X(::Carbon::SemIR::StructInit) Sep                  \
+  X(::Carbon::SemIR::ArrayInit) Sep()                 \
+  X(::Carbon::SemIR::ClassInit) Sep()                 \
+  X(::Carbon::SemIR::StructInit) Sep()                \
   X(::Carbon::SemIR::TupleInit)
 // clang-format on
 
-#define AnyAggregateInit_CARBON_KIND_ANY_EXPAND                       \
-  CARBON_KIND_ANY_EXPAND_BEGIN AnyAggregateInit_CARBON_INST_CATEGORY( \
-      CARBON_KIND_ANY_EXPAND_CASE, CARBON_KIND_ANY_EXPAND_SEP)
+#define AnyAggregateInit_CARBON_KIND_ANY_EXPAND \
+  CARBON_INST_CATEGORY_ANY_EXPAND(AnyAggregateInit)
 
 // Common representation for all kinds of aggregate initialization.
 struct AnyAggregateInit {
@@ -87,13 +91,12 @@ struct AnyAggregateInit {
 
 // clang-format off
 #define AnyAggregateValue_CARBON_INST_CATEGORY(X, Sep) \
-  X(::Carbon::SemIR::StructValue) Sep                  \
+  X(::Carbon::SemIR::StructValue) Sep()                \
   X(::Carbon::SemIR::TupleValue)
 // clang-format on
 
-#define AnyAggregateValue_CARBON_KIND_ANY_EXPAND                       \
-  CARBON_KIND_ANY_EXPAND_BEGIN AnyAggregateValue_CARBON_INST_CATEGORY( \
-      CARBON_KIND_ANY_EXPAND_CASE, CARBON_KIND_ANY_EXPAND_SEP)
+#define AnyAggregateValue_CARBON_KIND_ANY_EXPAND \
+  CARBON_INST_CATEGORY_ANY_EXPAND(AnyAggregateValue)
 
 // Common representation for all kinds of aggregate value.
 struct AnyAggregateValue {
@@ -106,15 +109,14 @@ struct AnyAggregateValue {
 
 // clang-format off
 #define AnyBindingPattern_CARBON_INST_CATEGORY(X, Sep) \
-  X(::Carbon::SemIR::FormBindingPattern) Sep           \
-  X(::Carbon::SemIR::RefBindingPattern) Sep            \
-  X(::Carbon::SemIR::SymbolicBindingPattern) Sep       \
+  X(::Carbon::SemIR::FormBindingPattern) Sep()         \
+  X(::Carbon::SemIR::RefBindingPattern) Sep()          \
+  X(::Carbon::SemIR::SymbolicBindingPattern) Sep()     \
   X(::Carbon::SemIR::ValueBindingPattern)
 // clang-format on
 
-#define AnyBindingPattern_CARBON_KIND_ANY_EXPAND                       \
-  CARBON_KIND_ANY_EXPAND_BEGIN AnyBindingPattern_CARBON_INST_CATEGORY( \
-      CARBON_KIND_ANY_EXPAND_CASE, CARBON_KIND_ANY_EXPAND_SEP)
+#define AnyBindingPattern_CARBON_KIND_ANY_EXPAND \
+  CARBON_INST_CATEGORY_ANY_EXPAND(AnyBindingPattern)
 
 // Common representation for various `*binding_pattern` nodes.
 struct AnyBindingPattern {
@@ -135,16 +137,15 @@ struct AnyBindingPattern {
 
 // clang-format off
 #define AnyBinding_CARBON_INST_CATEGORY(X, Sep) \
-  X(::Carbon::SemIR::AliasBinding) Sep          \
-  X(::Carbon::SemIR::FormBinding) Sep           \
-  X(::Carbon::SemIR::RefBinding) Sep            \
-  X(::Carbon::SemIR::SymbolicBinding) Sep       \
+  X(::Carbon::SemIR::AliasBinding) Sep()        \
+  X(::Carbon::SemIR::FormBinding) Sep()         \
+  X(::Carbon::SemIR::RefBinding) Sep()          \
+  X(::Carbon::SemIR::SymbolicBinding) Sep()     \
   X(::Carbon::SemIR::ValueBinding)
 // clang-format on
 
-#define AnyBinding_CARBON_KIND_ANY_EXPAND                       \
-  CARBON_KIND_ANY_EXPAND_BEGIN AnyBinding_CARBON_INST_CATEGORY( \
-      CARBON_KIND_ANY_EXPAND_CASE, CARBON_KIND_ANY_EXPAND_SEP)
+#define AnyBinding_CARBON_KIND_ANY_EXPAND \
+  CARBON_INST_CATEGORY_ANY_EXPAND(AnyBinding)
 
 // Common representation for various `bind*` nodes.
 struct AnyBinding {
@@ -161,18 +162,13 @@ struct AnyBinding {
 };
 
 // clang-format off
-#define AnyBindingOrExportDecl_CARBON_INST_CATEGORY(X, Sep)            \
-  X(::Carbon::SemIR::AliasBinding) Sep                                 \
-  X(::Carbon::SemIR::FormBinding) Sep                                  \
-  X(::Carbon::SemIR::RefBinding) Sep                                   \
-  X(::Carbon::SemIR::SymbolicBinding) Sep                              \
-  X(::Carbon::SemIR::ValueBinding) Sep                                 \
+#define AnyBindingOrExportDecl_CARBON_INST_CATEGORY(X, Sep) \
+  AnyBinding_CARBON_INST_CATEGORY(X, Sep) Sep()             \
   X(::Carbon::SemIR::ExportDecl)
 // clang-format on
 
-#define AnyBindingOrExportDecl_CARBON_KIND_ANY_EXPAND                       \
-  CARBON_KIND_ANY_EXPAND_BEGIN AnyBindingOrExportDecl_CARBON_INST_CATEGORY( \
-      CARBON_KIND_ANY_EXPAND_CASE, CARBON_KIND_ANY_EXPAND_SEP)
+#define AnyBindingOrExportDecl_CARBON_KIND_ANY_EXPAND \
+  CARBON_INST_CATEGORY_ANY_EXPAND(AnyBindingOrExportDecl)
 
 // Common representation for various `bind*` nodes, and `export name`.
 struct AnyBindingOrExportDecl {
@@ -187,14 +183,13 @@ struct AnyBindingOrExportDecl {
 
 // clang-format off
 #define AnyBranch_CARBON_INST_CATEGORY(X, Sep) \
-  X(::Carbon::SemIR::Branch) Sep               \
-  X(::Carbon::SemIR::BranchIf) Sep             \
+  X(::Carbon::SemIR::Branch) Sep()             \
+  X(::Carbon::SemIR::BranchIf) Sep()           \
   X(::Carbon::SemIR::BranchWithArg)
 // clang-format on
 
-#define AnyBranch_CARBON_KIND_ANY_EXPAND                       \
-  CARBON_KIND_ANY_EXPAND_BEGIN AnyBranch_CARBON_INST_CATEGORY( \
-      CARBON_KIND_ANY_EXPAND_CASE, CARBON_KIND_ANY_EXPAND_SEP)
+#define AnyBranch_CARBON_KIND_ANY_EXPAND \
+  CARBON_INST_CATEGORY_ANY_EXPAND(AnyBranch)
 
 // Common representation for all kinds of `Branch*` node.
 struct AnyBranch {
@@ -209,13 +204,12 @@ struct AnyBranch {
 
 // clang-format off
 #define AnyFoundationDecl_CARBON_INST_CATEGORY(X, Sep) \
-  X(::Carbon::SemIR::AdaptDecl) Sep                    \
+  X(::Carbon::SemIR::AdaptDecl) Sep()                  \
   X(::Carbon::SemIR::BaseDecl)
 // clang-format on
 
-#define AnyFoundationDecl_CARBON_KIND_ANY_EXPAND                       \
-  CARBON_KIND_ANY_EXPAND_BEGIN AnyFoundationDecl_CARBON_INST_CATEGORY( \
-      CARBON_KIND_ANY_EXPAND_CASE, CARBON_KIND_ANY_EXPAND_SEP)
+#define AnyFoundationDecl_CARBON_KIND_ANY_EXPAND \
+  CARBON_INST_CATEGORY_ANY_EXPAND(AnyFoundationDecl)
 
 // Common representation for declarations describing the foundation type of a
 // class -- either its adapted type or its base class.
@@ -231,13 +225,12 @@ struct AnyFoundationDecl {
 
 // clang-format off
 #define AnyImportRef_CARBON_INST_CATEGORY(X, Sep) \
-  X(::Carbon::SemIR::ImportRefLoaded) Sep \
+  X(::Carbon::SemIR::ImportRefLoaded) Sep()       \
   X(::Carbon::SemIR::ImportRefUnloaded)
 // clang-format on
 
-#define AnyImportRef_CARBON_KIND_ANY_EXPAND                       \
-  CARBON_KIND_ANY_EXPAND_BEGIN AnyImportRef_CARBON_INST_CATEGORY( \
-      CARBON_KIND_ANY_EXPAND_CASE, CARBON_KIND_ANY_EXPAND_SEP)
+#define AnyImportRef_CARBON_KIND_ANY_EXPAND \
+  CARBON_INST_CATEGORY_ANY_EXPAND(AnyImportRef)
 
 // Common representation for all kinds of `ImportRef*` node.
 struct AnyImportRef {
@@ -253,14 +246,13 @@ struct AnyImportRef {
 
 // clang-format off
 #define AnyParam_CARBON_INST_CATEGORY(X, Sep) \
-  X(::Carbon::SemIR::OutParam) Sep            \
-  X(::Carbon::SemIR::RefParam) Sep            \
+  X(::Carbon::SemIR::OutParam) Sep()          \
+  X(::Carbon::SemIR::RefParam) Sep()          \
   X(::Carbon::SemIR::ValueParam)
 // clang-format on
 
-#define AnyParam_CARBON_KIND_ANY_EXPAND                       \
-  CARBON_KIND_ANY_EXPAND_BEGIN AnyParam_CARBON_INST_CATEGORY( \
-      CARBON_KIND_ANY_EXPAND_CASE, CARBON_KIND_ANY_EXPAND_SEP)
+#define AnyParam_CARBON_KIND_ANY_EXPAND \
+  CARBON_INST_CATEGORY_ANY_EXPAND(AnyParam)
 
 // A `Call` parameter for a function or other parameterized block.
 struct AnyParam {
@@ -278,16 +270,15 @@ struct AnyParam {
 
 // clang-format off
 #define AnyParamPattern_CARBON_INST_CATEGORY(X, Sep) \
-  X(::Carbon::SemIR::FormParamPattern) Sep           \
-  X(::Carbon::SemIR::OutParamPattern) Sep            \
-  X(::Carbon::SemIR::RefParamPattern) Sep            \
-  X(::Carbon::SemIR::ValueParamPattern) Sep          \
+  X(::Carbon::SemIR::FormParamPattern) Sep()         \
+  X(::Carbon::SemIR::OutParamPattern) Sep()          \
+  X(::Carbon::SemIR::RefParamPattern) Sep()          \
+  X(::Carbon::SemIR::ValueParamPattern) Sep()        \
   X(::Carbon::SemIR::VarParamPattern)
 // clang-format on
 
-#define AnyParamPattern_CARBON_KIND_ANY_EXPAND                       \
-  CARBON_KIND_ANY_EXPAND_BEGIN AnyParamPattern_CARBON_INST_CATEGORY( \
-      CARBON_KIND_ANY_EXPAND_CASE, CARBON_KIND_ANY_EXPAND_SEP)
+#define AnyParamPattern_CARBON_KIND_ANY_EXPAND \
+  CARBON_INST_CATEGORY_ANY_EXPAND(AnyParamPattern)
 
 // A pattern that represents a `Call` parameter. It delegates to subpattern_id
 // in pattern matching.
@@ -304,14 +295,13 @@ struct AnyParamPattern {
 
 // clang-format off
 #define AnyPrimitiveForm_CARBON_INST_CATEGORY(X, Sep) \
-  X(::Carbon::SemIR::InitForm) Sep                    \
-  X(::Carbon::SemIR::RefForm) Sep                     \
+  X(::Carbon::SemIR::InitForm) Sep()                  \
+  X(::Carbon::SemIR::RefForm) Sep()                   \
   X(::Carbon::SemIR::ValueForm)
 // clang-format on
 
-#define AnyPrimitiveForm_CARBON_KIND_ANY_EXPAND                       \
-  CARBON_KIND_ANY_EXPAND_BEGIN AnyPrimitiveForm_CARBON_INST_CATEGORY( \
-      CARBON_KIND_ANY_EXPAND_CASE, CARBON_KIND_ANY_EXPAND_SEP)
+#define AnyPrimitiveForm_CARBON_KIND_ANY_EXPAND \
+  CARBON_INST_CATEGORY_ANY_EXPAND(AnyPrimitiveForm)
 
 // An inst that represents a primitive form.
 struct AnyPrimitiveForm {
@@ -328,14 +318,13 @@ struct AnyPrimitiveForm {
 
 // clang-format off
 #define AnyQualifiedType_CARBON_INST_CATEGORY(X, Sep) \
-  X(::Carbon::SemIR::ConstType) Sep                   \
-  X(::Carbon::SemIR::MaybeUnformedType) Sep           \
+  X(::Carbon::SemIR::ConstType) Sep()                 \
+  X(::Carbon::SemIR::MaybeUnformedType) Sep()         \
   X(::Carbon::SemIR::PartialType)
 // clang-format on
 
-#define AnyQualifiedType_CARBON_KIND_ANY_EXPAND                       \
-  CARBON_KIND_ANY_EXPAND_BEGIN AnyQualifiedType_CARBON_INST_CATEGORY( \
-      CARBON_KIND_ANY_EXPAND_CASE, CARBON_KIND_ANY_EXPAND_SEP)
+#define AnyQualifiedType_CARBON_KIND_ANY_EXPAND \
+  CARBON_INST_CATEGORY_ANY_EXPAND(AnyQualifiedType)
 
 // A type qualifier that wraps another type and has the same object
 // representation. Qualifiers are arranged so that adding a qualifier is
@@ -351,13 +340,12 @@ struct AnyQualifiedType {
 
 // clang-format off
 #define AnyStructType_CARBON_INST_CATEGORY(X, Sep) \
-  X(::Carbon::SemIR::CustomLayoutType) Sep         \
+  X(::Carbon::SemIR::CustomLayoutType) Sep()       \
   X(::Carbon::SemIR::StructType)
 // clang-format on
 
-#define AnyStructType_CARBON_KIND_ANY_EXPAND                       \
-  CARBON_KIND_ANY_EXPAND_BEGIN AnyStructType_CARBON_INST_CATEGORY( \
-      CARBON_KIND_ANY_EXPAND_CASE, CARBON_KIND_ANY_EXPAND_SEP)
+#define AnyStructType_CARBON_KIND_ANY_EXPAND \
+  CARBON_INST_CATEGORY_ANY_EXPAND(AnyStructType)
 
 // A struct-like type with a list of named fields.
 struct AnyStructType {