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;