Align case-inside.

issues #413

PiperOrigin-RevId: 331618081
diff --git a/verilog/formatting/align.cc b/verilog/formatting/align.cc
index 2639aea..6652089 100644
--- a/verilog/formatting/align.cc
+++ b/verilog/formatting/align.cc
@@ -720,8 +720,9 @@
   CaseItemColumnSchemaScanner() = default;
 
   bool ParentContextIsCaseItem() const {
-    return Context().DirectParentIsOneOf(
-        {NodeEnum::kCaseItem, NodeEnum::kDefaultItem});
+    return Context().DirectParentIsOneOf({NodeEnum::kCaseItem,
+                                          NodeEnum::kCaseInsideItem,
+                                          NodeEnum::kDefaultItem});
   }
 
   void Visit(const SyntaxTreeNode& node) override {
@@ -737,6 +738,7 @@
     } else {
       switch (tag) {
         case NodeEnum::kCaseItem:
+        case NodeEnum::kCaseInsideItem:
         case NodeEnum::kDefaultItem: {
           // Start a new column right away.
           ReserveNewColumn(node, FlushLeft);
@@ -854,44 +856,43 @@
   if (node == nullptr) return;
   // Dispatch aligning function based on syntax tree node type.
 
-  static const auto* const kAlignHandlers =
-      new std::map<NodeEnum, AlignedFormattingConfiguration>{
-          {NodeEnum::kPortDeclarationList,
-           {kPortDeclarationAligner,
-            [](const FormatStyle& vstyle) {
-              return vstyle.port_declarations_alignment;
-            }}},
-          {NodeEnum::kActualParameterByNameList,
-           {kActualNamedParameterAligner,
-            [](const FormatStyle& vstyle) {
-              return vstyle.named_parameter_alignment;
-            }}},
-          {NodeEnum::kPortActualList,
-           {kActualNamedPortAligner,
-            [](const FormatStyle& vstyle) {
-              return vstyle.named_port_alignment;
-            }}},
-          {NodeEnum::kModuleItemList,
-           {kDataDeclarationAligner,
-            [](const FormatStyle& vstyle) {
-              return vstyle.module_net_variable_alignment;
-            }}},
-          {NodeEnum::kFormalParameterList,
-           {kParameterDeclarationAligner,
-            [](const FormatStyle& vstyle) {
-              return vstyle.formal_parameters_alignment;
-            }}},
-          {NodeEnum::kClassItems,
-           {kClassPropertyAligner,
-            [](const FormatStyle& vstyle) {
-              return vstyle.class_member_variable_alignment;
-            }}},
-          {NodeEnum::kCaseItemList,
-           {kCaseItemAligner,
-            [](const FormatStyle& vstyle) {
-              return vstyle.case_items_alignment;
-            }}},
-      };
+  static const auto* const kAlignHandlers = new std::map<
+      NodeEnum, AlignedFormattingConfiguration>{
+      {NodeEnum::kPortDeclarationList,
+       {kPortDeclarationAligner,
+        [](const FormatStyle& vstyle) {
+          return vstyle.port_declarations_alignment;
+        }}},
+      {NodeEnum::kActualParameterByNameList,
+       {kActualNamedParameterAligner,
+        [](const FormatStyle& vstyle) {
+          return vstyle.named_parameter_alignment;
+        }}},
+      {NodeEnum::kPortActualList,
+       {kActualNamedPortAligner,
+        [](const FormatStyle& vstyle) { return vstyle.named_port_alignment; }}},
+      {NodeEnum::kModuleItemList,
+       {kDataDeclarationAligner,
+        [](const FormatStyle& vstyle) {
+          return vstyle.module_net_variable_alignment;
+        }}},
+      {NodeEnum::kFormalParameterList,
+       {kParameterDeclarationAligner,
+        [](const FormatStyle& vstyle) {
+          return vstyle.formal_parameters_alignment;
+        }}},
+      {NodeEnum::kClassItems,
+       {kClassPropertyAligner,
+        [](const FormatStyle& vstyle) {
+          return vstyle.class_member_variable_alignment;
+        }}},
+      {NodeEnum::kCaseItemList,
+       {kCaseItemAligner,
+        [](const FormatStyle& vstyle) { return vstyle.case_items_alignment; }}},
+      {NodeEnum::kCaseInsideItemList,
+       {kCaseItemAligner,
+        [](const FormatStyle& vstyle) { return vstyle.case_items_alignment; }}},
+  };
   const auto handler_iter = kAlignHandlers->find(NodeEnum(node->Tag().tag));
   if (handler_iter == kAlignHandlers->end()) return;
   verible::TabularAlignTokens(partition_ptr, handler_iter->second.handler,
diff --git a/verilog/formatting/formatter_test.cc b/verilog/formatting/formatter_test.cc
index bebb9bf..f5f7c3e 100644
--- a/verilog/formatting/formatter_test.cc
+++ b/verilog/formatting/formatter_test.cc
@@ -3849,6 +3849,18 @@
      "    //c5\n"
      "  endcase\n"
      "endfunction\n"},
+    {// case inside statement, comments
+     "function f; case (x)inside \n//comment\n"
+     "[0:1]:x=y; \n"
+     "    //comment\n"
+     "endcase endfunction\n",
+     "function f;\n"
+     "  case (x) inside\n"
+     "    //comment\n"
+     "    [0 : 1]: x = y;\n"
+     "    //comment\n"
+     "  endcase\n"
+     "endfunction\n"},
     {// case inside statement
      "function f; case (x)inside k1 : return b; k2 : begin return b; end "
      "endcase endfunction\n",
@@ -7265,6 +7277,46 @@
        "    kVVV:   cd = 24;\n"  // aligned
        "  endcase\n"
        "endtask\n"},
+      {// case-inside: small difference between flush-left and align, so align
+       "function f; case (x)inside [0:3]  :yy=zzz; [4:11] :yy=zz;"
+       "endcase endfunction\n",
+       "function f;\n"
+       "  case (x) inside\n"
+       "    [0 : 3]:  yy = zzz;\n"  // aligned, only adds 1 spaces
+       "    [4 : 11]: yy = zz;\n"
+       "  endcase\n"
+       "endfunction\n"},
+      {// case-inside: align with comments
+       "function f; case (x)inside \n//c1\n[0:3]  :yy=zzz;\n//c2\n"
+       " [4:11] :yy=zz;\n//c3\n"
+       "endcase endfunction\n",
+       "function f;\n"
+       "  case (x) inside\n"
+       "    //c1\n"
+       "    [0 : 3]:  yy = zzz;\n"  // aligned, only adds 1 spaces
+       "    //c2\n"
+       "    [4 : 11]: yy = zz;\n"
+       "    //c3\n"
+       "  endcase\n"
+       "endfunction\n"},
+      {// case-inside: flush left
+       "function f; case (x)inside [0:3]  :yy=zzz; [4:999999] :yy=zz;"
+       "endcase endfunction\n",
+       "function f;\n"
+       "  case (x) inside\n"
+       "    [0 : 3]: yy = zzz;\n"  // flush-left
+       "    [4 : 999999]: yy = zz;\n"
+       "  endcase\n"
+       "endfunction\n"},
+      {// case-inside: induce alignment
+       "function f; case (x)inside [0:3    ]  :yy=zzz; [4:999999] :yy=zz;"
+       "endcase endfunction\n",
+       "function f;\n"
+       "  case (x) inside\n"
+       "    [0 : 3]:      yy = zzz;\n"  // aligned
+       "    [4 : 999999]: yy = zz;\n"
+       "  endcase\n"
+       "endfunction\n"},
   };
   // Use a fixed style.
   FormatStyle style;
diff --git a/verilog/formatting/tree_unwrapper.cc b/verilog/formatting/tree_unwrapper.cc
index e8feffb..575521e 100644
--- a/verilog/formatting/tree_unwrapper.cc
+++ b/verilog/formatting/tree_unwrapper.cc
@@ -529,6 +529,7 @@
     case NodeEnum::kSpecifyItemList:
     case NodeEnum::kBlockItemStatementList:
     case NodeEnum::kCaseItemList:
+    case NodeEnum::kCaseInsideItemList:
     case NodeEnum::kConstraintExpressionList:
     case NodeEnum::kConstraintBlockItemList:
       LookAheadBeyondCurrentNode();
@@ -945,7 +946,6 @@
     case NodeEnum::kPackageItemList:
     case NodeEnum::kInterfaceClassDeclaration:
     case NodeEnum::kGenerateItemList:
-    case NodeEnum::kCaseInsideItemList:
     case NodeEnum::kCasePatternItemList:
     case NodeEnum::kGenerateCaseItemList:
     case NodeEnum::kStructUnionMemberList:
@@ -1005,6 +1005,7 @@
     }
 
     case NodeEnum::kCaseItemList:
+    case NodeEnum::kCaseInsideItemList:
     case NodeEnum::kClassItems:
     case NodeEnum::kModuleItemList: {
       const int indent = suppress_indentation ? 0 : style_.indentation_spaces;