Merge pull request #2601 from hzeller/feature-20260910-fix2597

formatter: Preserve operator spacing in ternary expressions inside subscript brackets
diff --git a/.github/bin/run-build-cleaner.sh b/.github/bin/run-build-cleaner.sh
index b8d1af5..d5b03f7 100755
--- a/.github/bin/run-build-cleaner.sh
+++ b/.github/bin/run-build-cleaner.sh
@@ -18,6 +18,10 @@
 
 BANT=$($(dirname $0)/get-bant-path.sh)
 
+# Run build so that we have all dependencies downloaded and genrules
+# materialized.
+bazel build -k --remote_download_outputs=all ...
+
 if "${BANT}" -q dwyu ... ; then
   echo "Dependencies ok." >&2
 else
diff --git a/MODULE.bazel b/MODULE.bazel
index 463c634..724056c 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -20,4 +20,4 @@
 bazel_dep(name = "googletest", version = "1.17.0.bcr.2", dev_dependency = True)
 
 # To build compilation DB and run build-cleaning
-bazel_dep(name = "bant", version = "0.3.4", dev_dependency = True)
+bazel_dep(name = "bant", version = "0.3.6", dev_dependency = True)
diff --git a/verible/verilog/formatting/BUILD b/verible/verilog/formatting/BUILD
index eb089df..6e4782e 100644
--- a/verible/verilog/formatting/BUILD
+++ b/verible/verilog/formatting/BUILD
@@ -193,77 +193,118 @@
     ],
 )
 
-_FORMATTER_E2E_TEST_DEPS = [
-    ":format-style",
-    ":formatter",
-    ":formatter-test-utils",
-    "//verible/common/formatting:align",
-    "//verible/common/formatting:basic-format-style",
-    "//verible/common/strings:display-utils",
-    "//verible/common/strings:position",
-    "//verible/common/text:text-structure",
-    "//verible/common/util:interval",
-    "//verible/common/util:logging",
-    "//verible/verilog/analysis:verilog-analyzer",
-    "@abseil-cpp//absl/log:die_if_null",
-    "@abseil-cpp//absl/status",
-    "@abseil-cpp//absl/strings",
-    "@googletest//:gtest",
-    "@googletest//:gtest_main",
-]
-
 cc_test(
     name = "formatter_test",
     srcs = ["formatter_test.cc"],
-    deps = _FORMATTER_E2E_TEST_DEPS,
+    deps = [
+        ":format-style",
+        ":formatter",
+        ":formatter-test-utils",
+        "//verible/common/text:text-structure",
+        "//verible/common/util:logging",
+        "//verible/verilog/analysis:verilog-analyzer",
+        "@abseil-cpp//absl/log:die_if_null",
+        "@abseil-cpp//absl/status",
+        "@googletest//:gtest",
+        "@googletest//:gtest_main",
+    ],
 )
 
 cc_test(
     name = "formatter_macro_test",
     srcs = ["formatter_macro_test.cc"],
-    deps = _FORMATTER_E2E_TEST_DEPS,
+    deps = [
+        ":formatter-test-utils",
+        "@googletest//:gtest",
+        "@googletest//:gtest_main",
+    ],
 )
 
 cc_test(
     name = "formatter_module_test",
     srcs = ["formatter_module_test.cc"],
-    deps = _FORMATTER_E2E_TEST_DEPS,
+    deps = [
+        ":formatter-test-utils",
+        "@googletest//:gtest",
+        "@googletest//:gtest_main",
+    ],
 )
 
 cc_test(
     name = "formatter_class_package_test",
     srcs = ["formatter_class_package_test.cc"],
-    deps = _FORMATTER_E2E_TEST_DEPS,
+    deps = [
+        ":formatter-test-utils",
+        "@googletest//:gtest",
+        "@googletest//:gtest_main",
+    ],
 )
 
 cc_test(
     name = "formatter_function_task_test",
     srcs = ["formatter_function_task_test.cc"],
-    deps = _FORMATTER_E2E_TEST_DEPS,
+    deps = [
+        ":formatter-test-utils",
+        "@googletest//:gtest",
+        "@googletest//:gtest_main",
+    ],
 )
 
 cc_test(
     name = "formatter_align_test",
     srcs = ["formatter_align_test.cc"],
-    deps = _FORMATTER_E2E_TEST_DEPS,
+    deps = [
+        ":format-style",
+        ":formatter",
+        ":formatter-test-utils",
+        "//verible/common/formatting:align",
+        "//verible/common/util:logging",
+        "@googletest//:gtest",
+        "@googletest//:gtest_main",
+    ],
 )
 
 cc_test(
     name = "formatter_wrap_style_test",
     srcs = ["formatter_wrap_style_test.cc"],
-    deps = _FORMATTER_E2E_TEST_DEPS,
+    deps = [
+        ":format-style",
+        ":formatter",
+        ":formatter-test-utils",
+        "//verible/common/formatting:align",
+        "//verible/common/formatting:basic-format-style",
+        "//verible/common/strings:display-utils",
+        "//verible/common/strings:position",
+        "//verible/common/util:interval",
+        "//verible/common/util:logging",
+        "@abseil-cpp//absl/status",
+        "@abseil-cpp//absl/strings",
+        "@googletest//:gtest",
+        "@googletest//:gtest_main",
+    ],
 )
 
 cc_test(
     name = "formatter_disable_test",
     srcs = ["formatter_disable_test.cc"],
-    deps = _FORMATTER_E2E_TEST_DEPS,
+    deps = [
+        ":formatter-test-utils",
+        "@googletest//:gtest",
+        "@googletest//:gtest_main",
+    ],
 )
 
 cc_test(
     name = "formatter_issue_regression_test",
     srcs = ["formatter_issue_regression_test.cc"],
-    deps = _FORMATTER_E2E_TEST_DEPS,
+    deps = [
+        ":format-style",
+        ":formatter",
+        ":formatter-test-utils",
+        "//verible/common/util:logging",
+        "@googletest//:gtest",
+        "@googletest//:gtest_main",
+    ],
 )
 
 cc_test(
diff --git a/verible/verilog/formatting/formatter_class_package_test.cc b/verible/verilog/formatting/formatter_class_package_test.cc
index 0c5e067..ee45c51 100644
--- a/verible/verilog/formatting/formatter_class_package_test.cc
+++ b/verible/verilog/formatting/formatter_class_package_test.cc
@@ -96,6 +96,18 @@
         "endinterface\n",
     },
     {
+        // Keep space before explicit modport port name
+        "interface\tfoo  ;"
+        "modport mp1(input  .a(sig), output  .b(sig));"
+        "endinterface",
+        "interface foo;\n"
+        "  modport mp1(\n"
+        "      input .a(sig),\n"
+        "      output .b(sig)\n"
+        "  );\n"
+        "endinterface\n",
+    },
+    {
         // interface with long modport port names
         "interface\tfoo_if  ;"
         "modport  mp1\t( output a_long_output, input detailed_input_name);"
diff --git a/verible/verilog/formatting/token-annotator.cc b/verible/verilog/formatting/token-annotator.cc
index 959364e..d66042f 100644
--- a/verible/verilog/formatting/token-annotator.cc
+++ b/verible/verilog/formatting/token-annotator.cc
@@ -282,6 +282,12 @@
 
   // TODO(fangism): Never insert trailing spaces before a newline.
 
+  // Modport port name separator, e.g. "input .a("
+  if (right.TokenEnum() == '.' &&
+      right_context.IsInside(NodeEnum::kModportSimplePort)) {
+    return {1, "Space before modport explicit port name '.'"};
+  }
+
   // Hierarchy examples: "a.b", "a::b"
   if (left.format_token_enum == FormatTokenType::hierarchy ||
       right.format_token_enum == FormatTokenType::hierarchy) {
diff --git a/verible/verilog/formatting/token-annotator_test.cc b/verible/verilog/formatting/token-annotator_test.cc
index 0bd6485..c0f7e86 100644
--- a/verible/verilog/formatting/token-annotator_test.cc
+++ b/verible/verilog/formatting/token-annotator_test.cc
@@ -2753,6 +2753,24 @@
           {1, SpacingOptions::kUndecided},
       },
 
+      // Modport explicit port name, e.g. "input .a(sig)"
+      {
+          DefaultStyle,
+          {TK_input, "input"},
+          {'.', "."},
+          {/* any context */},
+          {NodeEnum::kModportSimplePort},
+          {1, SpacingOptions::kUndecided},
+      },
+      {
+          DefaultStyle,
+          {TK_output, "output"},
+          {'.', "."},
+          {/* any context */},
+          {NodeEnum::kModportSimplePort},
+          {1, SpacingOptions::kUndecided},
+      },
+
       // Handle '->' as a unary prefix expression.
       {
           DefaultStyle,