Merge pull request #2603 from wsnyder/prefix
Fix prefix and event trigger operator missing spaces
diff --git a/verible/verilog/formatting/formatter_function_task_test.cc b/verible/verilog/formatting/formatter_function_task_test.cc
index 88e30bb..74db8f5 100644
--- a/verible/verilog/formatting/formatter_function_task_test.cc
+++ b/verible/verilog/formatting/formatter_function_task_test.cc
@@ -190,7 +190,7 @@
"function\nvoid\tpete;repeat(3) "
"++k\n;endfunction\n",
"function void pete;\n"
- " repeat (3)++k;\n" // TODO(fangism): space before ++
+ " repeat (3) ++k;\n"
"endfunction\n"},
{// repeat loop, forced break
"function\nvoid\tpete;repeat(3)//\n"
@@ -211,7 +211,7 @@
"function\nvoid\twily;while( coyote ) "
"++ super_genius\n; endfunction\n",
"function void wily;\n"
- " while (coyote)++super_genius;\n" // TODO(fangism): space before ++
+ " while (coyote) ++super_genius;\n"
"endfunction\n"},
{// while loop, forced break
"function\nvoid\twily;while( coyote ) //\n "
@@ -1841,6 +1841,14 @@
"endtask\n",
},
{
+ // assert property statement, with prefix inc/dec
+ "task t ;assert property( x) ++j; else --k;endtask",
+ "task t;\n"
+ " assert property (x) ++j;\n"
+ " else --k;\n"
+ "endtask\n",
+ },
+ {
// assert property statements, with action block
"task t ;assert property( x) begin j();end "
" assert\tproperty(y )begin\tk( ); end endtask",
diff --git a/verible/verilog/formatting/formatter_module_test.cc b/verible/verilog/formatting/formatter_module_test.cc
index 4290e5e..f6e142b 100644
--- a/verible/verilog/formatting/formatter_module_test.cc
+++ b/verible/verilog/formatting/formatter_module_test.cc
@@ -2794,6 +2794,36 @@
"endmodule\n",
},
{
+ // prefix increment/decrement as statement after a ')'
+ "module m ;function automatic void f;"
+ "if(a==8'ha0)++result; if(b==8'ha0)--result;"
+ "i++; j--; c[i]++;"
+ "endfunction endmodule",
+ "module m;\n"
+ " function automatic void f;\n"
+ " if (a == 8'ha0) ++result;\n"
+ " if (b == 8'ha0) --result;\n"
+ " i++;\n"
+ " j--;\n"
+ " c[i]++;\n"
+ " endfunction\n"
+ "endmodule\n",
+ },
+ {
+ "module t;initial #2 ->e1; initial #3 ->>e1[3]; "
+ "initial begin ->a; ->b; ->>c; ->>d; end endmodule",
+ "module t;\n"
+ " initial #2 ->e1;\n"
+ " initial #3 ->>e1[3];\n"
+ " initial begin\n"
+ " ->a;\n"
+ " ->b;\n"
+ " ->>c;\n"
+ " ->>d;\n"
+ " end\n"
+ "endmodule\n",
+ },
+ {
// qualified variables
"module m ;initial begin automatic int a; "
" static byte s=0;end endmodule",
diff --git a/verible/verilog/formatting/token-annotator.cc b/verible/verilog/formatting/token-annotator.cc
index ebaeb21..fc6d2f0 100644
--- a/verible/verilog/formatting/token-annotator.cc
+++ b/verible/verilog/formatting/token-annotator.cc
@@ -483,6 +483,16 @@
if (right.TokenEnum() == TK_POUNDPOUND) {
return {1, "Space before ## (delay) operator"};
}
+ if ((right.TokenEnum() == verilog_tokentype::TK_INCR ||
+ right.TokenEnum() == verilog_tokentype::TK_DECR) &&
+ right_context.IsInside(NodeEnum::kIncrementDecrementExpression) &&
+ !left_context.IsInside(NodeEnum::kIncrementDecrementExpression)) {
+ return {1, "Space before prefix '++'/'--'."};
+ }
+ if (right.TokenEnum() == verilog_tokentype::TK_TRIGGER ||
+ right.TokenEnum() == verilog_tokentype::TK_NONBLOCKING_TRIGGER) {
+ return {1, "Space before event trigger '->'/'->>' statement."};
+ }
if (left.format_token_enum == FormatTokenType::unary_operator) {
return {0, "++i over ++ i"}; // "++i" instead of "++ i"
}
diff --git a/verible/verilog/formatting/token-annotator_test.cc b/verible/verilog/formatting/token-annotator_test.cc
index 04c9832..2adf936 100644
--- a/verible/verilog/formatting/token-annotator_test.cc
+++ b/verible/verilog/formatting/token-annotator_test.cc
@@ -2716,6 +2716,43 @@
{0, SpacingOptions::kMustAppend},
},
+ // Postfix "i++"/"j--": operand and operator share the same
+ // kIncrementDecrementExpression node, so no space is required.
+ {
+ DefaultStyle,
+ {verilog_tokentype::SymbolIdentifier, "i"},
+ {verilog_tokentype::TK_INCR, "++"},
+ {NodeEnum::kIncrementDecrementExpression},
+ {NodeEnum::kIncrementDecrementExpression},
+ {0, SpacingOptions::kUndecided},
+ },
+ {
+ DefaultStyle,
+ {verilog_tokentype::SymbolIdentifier, "j"},
+ {verilog_tokentype::TK_DECR, "--"},
+ {NodeEnum::kIncrementDecrementExpression},
+ {NodeEnum::kIncrementDecrementExpression},
+ {0, SpacingOptions::kUndecided},
+ },
+ // Prefix "++i"/"--j" used as its own statement/expression: the
+ // preceding token (e.g. a ')') is not part of the same expression
+ {
+ DefaultStyle,
+ {')', ")"},
+ {verilog_tokentype::TK_INCR, "++"},
+ {/* any context */},
+ {NodeEnum::kIncrementDecrementExpression},
+ {1, SpacingOptions::kUndecided},
+ },
+ {
+ DefaultStyle,
+ {')', ")"},
+ {verilog_tokentype::TK_DECR, "--"},
+ {/* any context */},
+ {NodeEnum::kIncrementDecrementExpression},
+ {1, SpacingOptions::kUndecided},
+ },
+
// Handle '->' as a unary prefix expression.
{
DefaultStyle,
@@ -2734,6 +2771,24 @@
{0, SpacingOptions::kUndecided}, // could be MustAppend though
},
+ // Handle '->'/'->>' as event trigger statements
+ {
+ DefaultStyle,
+ {verilog_tokentype::TK_DecNumber, "1"},
+ {TK_TRIGGER, "->"},
+ {/* any context */}, // context
+ {/* any context */}, // context
+ {1, SpacingOptions::kUndecided},
+ },
+ {
+ DefaultStyle,
+ {verilog_tokentype::TK_DecNumber, "1"},
+ {TK_NONBLOCKING_TRIGGER, "->>"},
+ {/* any context */}, // context
+ {/* any context */}, // context
+ {1, SpacingOptions::kUndecided},
+ },
+
// Handle '->' as a binary operator
{
DefaultStyle,
diff --git a/verible/verilog/formatting/tree-unwrapper.cc b/verible/verilog/formatting/tree-unwrapper.cc
index 09fa8c0..652d03e 100644
--- a/verible/verilog/formatting/tree-unwrapper.cc
+++ b/verible/verilog/formatting/tree-unwrapper.cc
@@ -962,11 +962,13 @@
case NodeEnum::kProceduralContinuousDeassignmentStatement:
case NodeEnum::kProceduralContinuousForceStatement:
case NodeEnum::kProceduralContinuousReleaseStatement:
- case NodeEnum::kNetVariableAssignment: // e.g. x=y
- case NodeEnum::kBlockingAssignmentStatement: // id=expr
- case NodeEnum::kNonblockingAssignmentStatement: // dest <= src;
- case NodeEnum::kAssignModifyStatement: // id+=expr
- case NodeEnum::kIncrementDecrementExpression: // --y
+ case NodeEnum::kNetVariableAssignment: // e.g. x=y
+ case NodeEnum::kBlockingAssignmentStatement: // id=expr
+ case NodeEnum::kBlockingEventTriggerStatement: // ->e;
+ case NodeEnum::kNonblockingAssignmentStatement: // dest <= src;
+ case NodeEnum::kNonblockingEventTriggerStatement: // ->>e;
+ case NodeEnum::kAssignModifyStatement: // id+=expr
+ case NodeEnum::kIncrementDecrementExpression: // --y
case NodeEnum::kProceduralTimingControlStatement:
// various flow control constructs