Merge branch 'chipsalliance:master' into fix/2352
diff --git a/.github/bin/run-format.sh b/.github/bin/run-format.sh
index 3c1c724..d5ccfa1 100755
--- a/.github/bin/run-format.sh
+++ b/.github/bin/run-format.sh
@@ -31,10 +31,16 @@
 
 FORMAT_OUT=${TMPDIR:-/tmp}/clang-format-diff.out
 
-# Use the provided Clang format binary, or try to fallback to clang-format-17
-# or clang-format.
+# Use the provided Clang format binary, or try clang-format-19 (CI version),
+# then older numbered versions, then unversioned clang-format.
 if [[ ! -v CLANG_FORMAT ]]; then
-  if command -v "clang-format-17" 2>&1 >/dev/null
+  if command -v "clang-format-19" 2>&1 >/dev/null
+  then
+    CLANG_FORMAT="clang-format-19"
+  elif command -v "clang-format-18" 2>&1 >/dev/null
+  then
+    CLANG_FORMAT="clang-format-18"
+  elif command -v "clang-format-17" 2>&1 >/dev/null
   then
     CLANG_FORMAT="clang-format-17"
   elif command -v "clang-format" 2>&1 >/dev/null
@@ -44,6 +50,7 @@
     (echo "-- Missing the clang-format binary! --"; exit 1)
   fi
 fi
+echo "Using ${CLANG_FORMAT} ($("${CLANG_FORMAT}" --version))"
 
 BUILDIFIER=${BUILDIFIER:-buildifier}
 
diff --git a/.github/bin/smoke-projects.hashes b/.github/bin/smoke-projects.hashes
new file mode 100644
index 0000000..5298441
--- /dev/null
+++ b/.github/bin/smoke-projects.hashes
@@ -0,0 +1,20 @@
+a12778b40ae905f82eb2c23ea4ac037f98099fae https://github.com/jamieiles/80x86
+4da15979747f326bde2f9869c64e587ce599772c https://github.com/pulp-platform/axi
+b48037e28544425839dbd617d45b1a82631bc1a9 https://github.com/bespoke-silicon-group/basejump_stl
+f91010f654a5dfd00f83dbe25dbda482218d540b https://github.com/black-parrot/black-parrot
+86d09682492176a1f8fd1732e469bc2d309453a3 https://github.com/chipsalliance/caliptra-rtl
+f9fbd09655ec6ee457438140c13a168390ebd043 https://github.com/chipsalliance/Cores-VeeR-EH2
+3ac6208ed0210ff66a557dd7dc4e79e34f1f2f4a https://github.com/openhwgroup/cva6
+0602ee4627b10f301298f2673d826cdd6baa9327 https://github.com/ijor/fx68k
+8b8ee086aef72e0833b7f0493d9d33f1e4d3c8e2 https://github.com/lowRISC/ibex
+a19e629a1879801ffcc6f2e6256ca435c20570f3 https://github.com/steveicarus/ivtest
+8e83643c22a3ba7612a9bb9cec93292dad618ab5 https://github.com/trivialmips/nontrivial-mips
+00981352642fb65ef2b6c47143a0f6bb31fd4a97 https://github.com/lowRISC/opentitan
+491a4dc9bb25c33e0183caaf683102b9ce273bc1 https://github.com/gtaylormb/opl3_fpga
+7b65f6ba0bce58d4d859082660123b7100aae975 https://github.com/rsd-devel/rsd
+ebb5e3551a9d93c0ee95f0b767dd878b8927e702 https://github.com/syntacore/scr1
+f200eb2ed7b69ac1c6b8eddd47654522aeee5ce8 https://github.com/olofk/serv
+c4229f3bd5220e6d3ba8f390e5d09c87e462e9c7 https://github.com/chipsalliance/sv-tests
+7e9841ff775ea22fba3f222f7bdfe35668345e00 https://github.com/taichi-ishitani/tnoc
+5d72b6618acfddece7f09382a032ccbc05862fdc https://github.com/SymbiFlow/uvm
+1c8e05fd1e9a79ceb8b996a0996674122eed086f https://github.com/SymbiFlow/XilinxUnisimLibrary
diff --git a/.github/bin/smoke-test.sh b/.github/bin/smoke-test.sh
index ba3ff96..5532187 100755
--- a/.github/bin/smoke-test.sh
+++ b/.github/bin/smoke-test.sh
@@ -29,16 +29,13 @@
 # crash Verible, we're good.
 ###
 
-# Suppress '... aborted' messages bash would print when a tool crashes.
-# Comment out to see syntax errors in bash while working on script.
-exec 2>/dev/null
-
 set -u   # Be strict: only allow using a variable after it is assigned
 
 BAZEL_BUILD_OPTIONS="-c opt"
 
 TMPDIR="${TMPDIR:-/tmp}"
 readonly BASE_TEST_DIR="${TMPDIR}/test/verible-smoke-test"
+readonly PROJECT_HASHES_FILE="$(dirname $0)/smoke-projects.hashes"
 
 # Write log files to this directory
 readonly SMOKE_LOGGING_DIR="${SMOKE_LOGGING_DIR:-$BASE_TEST_DIR/error-logs}"
@@ -81,29 +78,11 @@
 #
 # There are some known issues which are all recorded in the associative
 # array below, mapping them to Verible issue tracker numbers.
-# TODO(hzeller): there should be a configuration file that contains two
-# columns: URL + hash, so that we can fetch a particular known version not
-# a moving target.
-readonly TEST_GIT_PROJECTS="https://github.com/lowRISC/ibex \
-         https://github.com/lowRISC/opentitan \
-         https://github.com/chipsalliance/sv-tests \
-         https://github.com/chipsalliance/Cores-VeeR-EH2 \
-         https://github.com/chipsalliance/caliptra-rtl \
-         https://github.com/openhwgroup/cva6 \
-         https://github.com/SymbiFlow/uvm \
-         https://github.com/taichi-ishitani/tnoc \
-         https://github.com/ijor/fx68k \
-         https://github.com/jamieiles/80x86 \
-         https://github.com/SymbiFlow/XilinxUnisimLibrary \
-         https://github.com/black-parrot/black-parrot
-         https://github.com/steveicarus/ivtest \
-         https://github.com/trivialmips/nontrivial-mips \
-         https://github.com/pulp-platform/axi \
-         https://github.com/rsd-devel/rsd \
-         https://github.com/syntacore/scr1 \
-         https://github.com/olofk/serv \
-         https://github.com/bespoke-silicon-group/basejump_stl \
-         https://github.com/gtaylormb/opl3_fpga"
+
+if [ ! -f "${PROJECT_HASHES_FILE}" ]; then
+  echo "Project hashes file not found: ${PROJECT_HASHES_FILE}"
+  exit 1
+fi
 
 ##
 # Some of the files in the projects will have issues.
@@ -135,24 +114,24 @@
 
 ExpectedFailCount[syntax:ibex]=13
 ExpectedFailCount[lint:ibex]=13
-ExpectedFailCount[project:ibex]=218
-ExpectedFailCount[preprocessor:ibex]=397
+ExpectedFailCount[project:ibex]=224
+ExpectedFailCount[preprocessor:ibex]=403
 
 ExpectedFailCount[syntax:opentitan]=88
 ExpectedFailCount[lint:opentitan]=88
-ExpectedFailCount[project:opentitan]=1068
+ExpectedFailCount[project:opentitan]=1077
 ExpectedFailCount[formatter:opentitan]=0
-ExpectedFailCount[preprocessor:opentitan]=3074
+ExpectedFailCount[preprocessor:opentitan]=3017
 
 ExpectedFailCount[syntax:sv-tests]=74
 ExpectedFailCount[lint:sv-tests]=73
 ExpectedFailCount[project:sv-tests]=176
-ExpectedFailCount[preprocessor:sv-tests]=128
+ExpectedFailCount[preprocessor:sv-tests]=129
 
-ExpectedFailCount[syntax:caliptra-rtl]=39
-ExpectedFailCount[lint:caliptra-rtl]=38
-ExpectedFailCount[project:caliptra-rtl]=453
-ExpectedFailCount[preprocessor:caliptra-rtl]=911
+ExpectedFailCount[syntax:caliptra-rtl]=41
+ExpectedFailCount[lint:caliptra-rtl]=40
+ExpectedFailCount[project:caliptra-rtl]=474
+ExpectedFailCount[preprocessor:caliptra-rtl]=993
 
 ExpectedFailCount[syntax:Cores-VeeR-EH2]=2
 ExpectedFailCount[lint:Cores-VeeR-EH2]=2
@@ -164,10 +143,10 @@
 ExpectedFailCount[project:cva6]=84
 ExpectedFailCount[preprocessor:cva6]=140
 
-ExpectedFailCount[syntax:uvm]=0
-ExpectedFailCount[lint:uvm]=0
-ExpectedFailCount[project:uvm]=40
-ExpectedFailCount[preprocessor:uvm]=126
+ExpectedFailCount[syntax:uvm]=1
+ExpectedFailCount[lint:uvm]=1
+ExpectedFailCount[project:uvm]=41
+ExpectedFailCount[preprocessor:uvm]=128
 
 ExpectedFailCount[syntax:tnoc]=3
 ExpectedFailCount[lint:tnoc]=3
@@ -187,9 +166,9 @@
 ExpectedFailCount[project:black-parrot]=172
 ExpectedFailCount[preprocessor:black-parrot]=173
 
-ExpectedFailCount[syntax:ivtest]=117
-ExpectedFailCount[lint:ivtest]=117
-ExpectedFailCount[project:ivtest]=146
+ExpectedFailCount[syntax:ivtest]=116
+ExpectedFailCount[lint:ivtest]=116
+ExpectedFailCount[project:ivtest]=145
 ExpectedFailCount[preprocessor:ivtest]=26
 
 ExpectedFailCount[syntax:nontrivial-mips]=2
@@ -237,11 +216,10 @@
   expected_count_key="${TOOL_SHORT_NAME}:${PROJECT_NAME}"
   if [[ -v ExpectedFailCount[${expected_count_key}] ]]; then
     expected_count=${ExpectedFailCount[${expected_count_key}]}
-    # We allow some 5% deviation from expected values before we complain loudly
-    local GRACE_VALUE=$(( ${expected_count} / 20 ))
-    if [ ${GRACE_VALUE} -lt 2 ]; then
-      GRACE_VALUE=2
-    fi
+
+    # Since we have a fixed set of projects and hashes, we don't allow any
+    # derivation from the expected value (used to be 5%)
+    local GRACE_VALUE=0
     if [ ${OBSERVED_NONZERO_COUNT} -gt ${expected_count} ] ; then
       local ALLOWED_UP_TO=$((${expected_count} + ${GRACE_VALUE}))
       if [ ${OBSERVED_NONZERO_COUNT} -gt ${ALLOWED_UP_TO} ]; then
@@ -254,6 +232,7 @@
     elif [ ${OBSERVED_NONZERO_COUNT} -lt ${expected_count} ] ; then
       echo "::notice:: 🎉 Yay, reduced non-zero exit count ${expected_count} -> ${OBSERVED_NONZERO_COUNT}"
       echo "Set ExpectedFailCount[${TOOL_SHORT_NAME}:${PROJECT_NAME}]=${OBSERVED_NONZERO_COUNT}"
+      return 1  # we still want the exact value to be recorded so actively fail
     fi
   else
     if [ ${OBSERVED_NONZERO_COUNT} -gt 0 ] ; then
@@ -270,11 +249,14 @@
 #
 # First parameter : project name
 # Second parameter: name of file containing a list of {System}Verilog files
+# Third parameter : git URL
+# Fourth parameter: git hash (optional, defaults to master)
 function run_smoke_test() {
   local PROJECT_FILE_LIST=${TMPDIR}/filelist.$$.list
   local PROJECT_NAME=$1
   local FILELIST=$2
   local GIT_URL=$3
+  local GIT_HASH=${4:-master}
   local NUM_FILES=$(wc -l < ${FILELIST})
   local result=0
 
@@ -355,7 +337,7 @@
         else
           # This is an so far unknown issue
           echo "::error:: 😱 ${single_file}: crash exit code $EXIT_CODE for $tool"
-          echo "Input File URL: ${GIT_URL}/blob/master/$(echo $single_file | cut -d/ -f6-)"
+          echo "Input File URL: ${GIT_URL}/blob/${GIT_HASH}/$(echo $single_file | cut -d/ -f6-)"
           head -15 ${PROJECT_FILE_TOOL_OUT}   # Might be useful in this case
           result=$((${result} + 1))
         fi
@@ -372,8 +354,55 @@
   return ${result}
 }
 
+# --- main
+
+KEEP_LOGS=0
+VERBOSE=0
+PROJECT_FILTER=""
+
+while [[ $# -gt 0 ]]; do
+  case "$1" in
+    --keep-logs)
+      KEEP_LOGS=1
+      shift
+      ;;
+    --verbose|-v)
+      VERBOSE=1
+      shift
+      ;;
+    --filter=*)
+      PROJECT_FILTER="${1#*=}"
+      shift
+      ;;
+    --filter|-f)
+      if [[ $# -lt 2 ]]; then
+        echo "Error: $1 requires an argument." >&2
+        exit 1
+      fi
+      PROJECT_FILTER="$2"
+      shift 2
+      ;;
+    -h|--help)
+      echo "Usage: $0 [--keep-logs] [--verbose] [--filter=<name>]"
+      exit 0
+      ;;
+    *)
+      echo "Unknown option: $1" >&2
+      echo "Usage: $0 [--keep-logs] [--verbose] [--filter=<name>]" >&2
+      exit 1
+      ;;
+  esac
+done
+
+if [ ${VERBOSE} -eq 0 ]; then
+  # Suppress '... aborted' messages bash would print when a tool crashes.
+  exec 2>/dev/null
+fi
+
 mkdir -p "${BASE_TEST_DIR}"
-trap 'rm -rf -- "${BASE_TEST_DIR}"' EXIT
+if [ ${KEEP_LOGS} -eq 0 ]; then
+  trap 'rm -rf -- "${BASE_TEST_DIR}"' EXIT
+fi
 
 status_sum=0
 
@@ -388,18 +417,26 @@
 bazel build ${BAZEL_BUILD_OPTIONS} :install-binaries &
 
 # While compiling, run potentially slow network ops
-for git_project in ${TEST_GIT_PROJECTS} ; do
-  PROJECT_NAME="$(basename $git_project)"
+while read -r git_hash git_project _; do
+  [[ -z "${git_hash}" || "${git_hash}" =~ ^# ]] && continue
+  PROJECT_NAME="$(basename "${git_project}")"
+  if [[ -n "${PROJECT_FILTER}" && "${PROJECT_NAME}" != *"${PROJECT_FILTER}"* ]]; then
+    continue
+  fi
   PROJECT_DIR="${BASE_TEST_DIR}/${PROJECT_NAME}"
-  git clone ${git_project} ${PROJECT_DIR} 2>/dev/null &
-done
+  ( git clone "${git_project}" "${PROJECT_DIR}" && git -C "${PROJECT_DIR}" checkout -q "${git_hash}" ) 2>/dev/null &
+done < "${PROJECT_HASHES_FILE}"
 
 echo "base test dir ${BASE_TEST_DIR}; writing logs to ${SMOKE_LOGGING_DIR}"
 echo "Waiting... for compilation and project download finished"
 wait
 
-for git_project in ${TEST_GIT_PROJECTS} ; do
-  PROJECT_NAME="$(basename $git_project)"
+while read -r git_hash git_project _; do
+  [[ -z "${git_hash}" || "${git_hash}" =~ ^# ]] && continue
+  PROJECT_NAME="$(basename "${git_project}")"
+  if [[ -n "${PROJECT_FILTER}" && "${PROJECT_NAME}" != *"${PROJECT_FILTER}"* ]]; then
+    continue
+  fi
   PROJECT_DIR="${BASE_TEST_DIR}/${PROJECT_NAME}"
   # Already cloned above
 
@@ -412,17 +449,17 @@
   FILELIST="${PROJECT_DIR}/verible.filelist"
   find "${PROJECT_DIR}" -name "*.sv" -o -name "*.svh" -o -name "*.v" | sort > ${FILELIST}
 
-  run_smoke_test "${PROJECT_NAME}" "${FILELIST}" "${git_project}"
+  run_smoke_test "${PROJECT_NAME}" "${FILELIST}" "${git_project}" "${git_hash}"
   status_sum=$((${status_sum} + $?))
   echo
-done
+done < "${PROJECT_HASHES_FILE}"
 
 echo "::endgroup::"
 
-echo "There were a total of ${status_sum} new, undocumented issues."
+echo "There were a total of ${status_sum} mismatches"
 
 # Let's see if there are any issues that are fixed in the meantime.
-if [ "${#KnownIssue[@]}" -ne 0 ]; then
+if [ -z "${PROJECT_FILTER}" ] && [ "${#KnownIssue[@]}" -ne 0 ]; then
   echo "::warning ::There are ${#KnownIssue[@]} tool/file combinations, that no longer fail"
   declare -A DistinctIssues
   for key in "${!KnownIssue[@]}"; do
@@ -434,7 +471,10 @@
   for issue_id in "${!DistinctIssues[@]}"; do
     echo " 🐞 ${ISSUE_PREFIX}/${issue_id}"
   done
-  echo
+fi
+
+if [ ${KEEP_LOGS} -ne 0 ]; then
+  echo "Logs and project files kept in ${BASE_TEST_DIR} (error logs: ${SMOKE_LOGGING_DIR})"
 fi
 
 exit ${status_sum}
diff --git a/.github/workflows/verible-ci.yml b/.github/workflows/verible-ci.yml
index 5f03f2f..802a7a3 100644
--- a/.github/workflows/verible-ci.yml
+++ b/.github/workflows/verible-ci.yml
@@ -34,6 +34,11 @@
       with:
         fetch-depth: 0
 
+    - name: Set up Go
+      uses: actions/setup-go@v5
+      with:
+        go-version: 'stable'
+
     - name: Install Dependencies
       run: |
         sudo apt-get install clang-format-19
diff --git a/README.md b/README.md
index b813b76..047fb20 100644
--- a/README.md
+++ b/README.md
@@ -172,8 +172,9 @@
 
 Verible's code base is written in C++.
 
-To build, you need the [bazel] build system (Min version 7) and a C++20
-compatible compiler.
+To build, you need the [bazel] build system (get it from
+[bazel install][bazel-install] if not already on your system) and a
+C++20 compatible compiler.
 
 Use your package manager to install the dependencies; on a system with
 the nix package manager simply run `nix-shell` to get a build environment.
@@ -199,6 +200,8 @@
 bazel build -c opt --config=create_static_linked_executables //...
 ```
 
+See [Installation](#installation-1) for install.
+
 ### Optionally using local flex/bison for build
 
 Flex and Bison, that are needed for the parser generation, are compiled as part
@@ -283,6 +286,7 @@
 [UHDM] format. If you are interested in collaborating, contact us.
 
 [bazel]: https://bazel.build/
+[bazel-install]: https://bazel.build/install
 [SV-LRM]: https://ieeexplore.ieee.org/document/8299595
 [lint-rule-list]: https://chipsalliance.github.io/verible/lint.html
 [github-lint-action]: https://github.com/chipsalliance/verible-linter-action
diff --git a/shell.nix b/shell.nix
index 85163eb..408340b 100644
--- a/shell.nix
+++ b/shell.nix
@@ -8,6 +8,17 @@
   #verible_used_stdenv = pkgs.gcc15Stdenv;
   #verible_used_stdenv = pkgs.clang19Stdenv;
   bazel = pkgs.bazel_8;
+
+
+  userNixPath = ./user.nix;  # optional user config
+  userPackages =
+    if builtins.pathExists userNixPath
+    then
+      let loaded = import userNixPath;
+      in if builtins.isFunction loaded
+         then loaded { inherit pkgs; }
+         else loaded
+    else [];
 in
 verible_used_stdenv.mkDerivation {
   name = "verible-build-environment";
@@ -40,7 +51,7 @@
 
       llvmPackages_22.clang-tools    # for clang-tidy
       llvmPackages_19.clang-tools    # for clang-format
-    ];
+    ] ++ userPackages;
   shellHook = ''
       # clang tidy: use latest.
       export CLANG_TIDY=${pkgs.llvmPackages_22.clang-tools}/bin/clang-tidy
diff --git a/verible/common/util/BUILD b/verible/common/util/BUILD
index 48a2105..db499b4 100644
--- a/verible/common/util/BUILD
+++ b/verible/common/util/BUILD
@@ -22,7 +22,6 @@
     hdrs = ["auto-pop-stack.h"],
     deps = [
         ":logging",
-        "@abseil-cpp//absl/base:core_headers",
     ],
 )
 
diff --git a/verible/common/util/auto-pop-stack.h b/verible/common/util/auto-pop-stack.h
index 024ef05..58628eb 100644
--- a/verible/common/util/auto-pop-stack.h
+++ b/verible/common/util/auto-pop-stack.h
@@ -18,7 +18,6 @@
 #include <cstddef>
 #include <vector>
 
-#include "absl/base/attributes.h"
 #include "verible/common/util/logging.h"
 
 namespace verible {
@@ -29,7 +28,7 @@
 // implementing algorithms based on stack data structures like building
 // inheritance stack of traversed tree.
 template <typename T>
-class AutoPopStack {
+class [[maybe_unused]] AutoPopStack {
  public:
   using value_type = T;
   using this_type = AutoPopStack<value_type>;
@@ -105,7 +104,7 @@
 
  private:
   stack_type stack_;
-} ABSL_ATTRIBUTE_UNUSED;
+};
 
 }  // namespace verible
 
diff --git a/verible/common/util/container-proxy_test.cc b/verible/common/util/container-proxy_test.cc
index 5e8220f..4e4cd75 100644
--- a/verible/common/util/container-proxy_test.cc
+++ b/verible/common/util/container-proxy_test.cc
@@ -874,13 +874,14 @@
 
   const int new_capacity = initial_capacity + 42;
   this->proxy.reserve(new_capacity);
-  EXPECT_EQ(this->proxy.capacity(), new_capacity);
-  EXPECT_EQ(this->container.capacity(), new_capacity);
+  EXPECT_GE(this->proxy.capacity(), new_capacity);
+  EXPECT_EQ(this->proxy.capacity(), this->container.capacity());
 
+  const int capacity_after_first_reserve = this->proxy.capacity();
   const int lower_capacity = 1;
   this->proxy.reserve(lower_capacity);
-  EXPECT_EQ(this->proxy.capacity(), new_capacity);
-  EXPECT_EQ(this->container.capacity(), new_capacity);
+  EXPECT_EQ(this->proxy.capacity(), capacity_after_first_reserve);
+  EXPECT_EQ(this->container.capacity(), capacity_after_first_reserve);
 }
 
 }  // namespace
diff --git a/verible/verilog/analysis/checkers/BUILD b/verible/verilog/analysis/checkers/BUILD
index bd3a98b..4681607 100644
--- a/verible/verilog/analysis/checkers/BUILD
+++ b/verible/verilog/analysis/checkers/BUILD
@@ -817,6 +817,7 @@
         "//verible/common/analysis:syntax-tree-lint-rule",
         "//verible/common/analysis/matcher",
         "//verible/common/analysis/matcher:bound-symbol-manager",
+        "//verible/common/text:config-utils",
         "//verible/common/text:symbol",
         "//verible/common/text:syntax-tree-context",
         "//verible/common/text:token-info",
@@ -826,7 +827,9 @@
         "//verible/verilog/CST:verilog-nonterminals",
         "//verible/verilog/analysis:descriptions",
         "//verible/verilog/analysis:lint-rule-registry",
+        "@abseil-cpp//absl/status",
         "@abseil-cpp//absl/strings",
+        "@re2",
     ],
     alwayslink = 1,
 )
@@ -1821,6 +1824,7 @@
         "//verible/common/text:symbol",
         "//verible/common/text:syntax-tree-context",
         "//verible/common/text:token-info",
+        "//verible/common/util:container-util",
         "//verible/verilog/CST:port",
         "//verible/verilog/CST:verilog-matchers",
         "//verible/verilog/analysis:descriptions",
diff --git a/verible/verilog/analysis/checkers/generate-label-prefix-rule.cc b/verible/verilog/analysis/checkers/generate-label-prefix-rule.cc
index c8822ce..e678ad5 100644
--- a/verible/verilog/analysis/checkers/generate-label-prefix-rule.cc
+++ b/verible/verilog/analysis/checkers/generate-label-prefix-rule.cc
@@ -14,12 +14,17 @@
 
 #include "verible/verilog/analysis/checkers/generate-label-prefix-rule.h"
 
+#include <memory>
+#include <string>
 #include <string_view>
 
-#include "absl/strings/match.h"
+#include "absl/status/status.h"
+#include "absl/strings/str_cat.h"
+#include "re2/re2.h"
 #include "verible/common/analysis/lint-rule-status.h"
 #include "verible/common/analysis/matcher/bound-symbol-manager.h"
 #include "verible/common/analysis/matcher/matcher.h"
+#include "verible/common/text/config-utils.h"
 #include "verible/common/text/symbol.h"
 #include "verible/common/text/syntax-tree-context.h"
 #include "verible/common/text/token-info.h"
@@ -38,22 +43,36 @@
 // Register the lint rule
 VERILOG_REGISTER_LINT_RULE(GenerateLabelPrefixRule);
 
-static constexpr std::string_view kMessage =
-    "All generate block labels must start with g_ or gen_";
+static constexpr std::string_view kDefaultStyleRegex = "(g_|gen_).*";
 
-// TODO(fangism): and be lower_snake_case?
-// TODO(fangism): generalize to a configurable pattern and
-// rename this class/rule to GenerateLabelNamingStyle?
+GenerateLabelPrefixRule::GenerateLabelPrefixRule()
+    : style_regex_(
+          std::make_unique<re2::RE2>(kDefaultStyleRegex, re2::RE2::Quiet)) {}
 
 const LintRuleDescriptor &GenerateLabelPrefixRule::GetDescriptor() {
   static const LintRuleDescriptor d{
       .name = "generate-label-prefix",
       .topic = "generate-constructs",
-      .desc = "Checks that every generate block label starts with g_ or gen_.",
+      .desc =
+          "Checks that every generate block label matches the regex defined by "
+          "style_regex. The default regex requires labels to start with g_ or "
+          "gen_. Refer to https://github.com/chipsalliance/verible/tree/master/"
+          "verilog/tools/lint#readme for more detail on verible regex "
+          "patterns.",
+      // NOLINTNEXTLINE(misc-include-cleaner)
+      .param = {{"style_regex", std::string(kDefaultStyleRegex),
+                 "A regex used to check generate label style."}},
   };
   return d;
 }
 
+std::string GenerateLabelPrefixRule::CreateViolationMessage() const {
+  return absl::StrCat(
+      "Generate block label does not match the naming convention defined by "
+      "regex pattern: ",
+      style_regex_->pattern());
+}
+
 // Matches begin statements
 static const Matcher &BlockMatcher() {
   static const Matcher matcher(NodekGenerateBlock());
@@ -84,15 +103,24 @@
       }
 
       if (label != nullptr) {
-        if (!(absl::StartsWith(label->text(), "g_") ||
-              absl::StartsWith(label->text(), "gen_"))) {
-          violations_.insert(verible::LintViolation(*label, kMessage, context));
+        if (!RE2::FullMatch(label->text(), *style_regex_)) {
+          violations_.insert(verible::LintViolation(
+              *label, CreateViolationMessage(), context));
         }
       }
     }
   }
 }
 
+// NOLINTNEXTLINE(misc-include-cleaner)
+absl::Status GenerateLabelPrefixRule::Configure(
+    std::string_view configuration) {
+  using verible::config::SetRegex;
+  absl::Status s = verible::ParseNameValues(
+      configuration, {{"style_regex", SetRegex(&style_regex_)}});
+  return s;
+}
+
 verible::LintRuleStatus GenerateLabelPrefixRule::Report() const {
   return verible::LintRuleStatus(violations_, GetDescriptor());
 }
diff --git a/verible/verilog/analysis/checkers/generate-label-prefix-rule.h b/verible/verilog/analysis/checkers/generate-label-prefix-rule.h
index 9090cf3..e18df9c 100644
--- a/verible/verilog/analysis/checkers/generate-label-prefix-rule.h
+++ b/verible/verilog/analysis/checkers/generate-label-prefix-rule.h
@@ -15,8 +15,13 @@
 #ifndef VERIBLE_VERILOG_ANALYSIS_CHECKERS_GENERATE_LABEL_PREFIX_RULE_H_
 #define VERIBLE_VERILOG_ANALYSIS_CHECKERS_GENERATE_LABEL_PREFIX_RULE_H_
 
+#include <memory>
 #include <set>
+#include <string>
+#include <string_view>
 
+#include "absl/status/status.h"
+#include "re2/re2.h"
 #include "verible/common/analysis/lint-rule-status.h"
 #include "verible/common/analysis/syntax-tree-lint-rule.h"
 #include "verible/common/text/symbol.h"
@@ -27,20 +32,28 @@
 namespace analysis {
 
 // GenerateLabelPrefixRule checks that all generate block labels start
-// with g_ or gen_
+// with g_ or gen_ (configurable via style_regex)
 class GenerateLabelPrefixRule : public verible::SyntaxTreeLintRule {
  public:
   using rule_type = verible::SyntaxTreeLintRule;
 
+  GenerateLabelPrefixRule();
+
   static const LintRuleDescriptor &GetDescriptor();
 
+  std::string CreateViolationMessage() const;
+
   void HandleSymbol(const verible::Symbol &symbol,
                     const verible::SyntaxTreeContext &context) final;
 
   verible::LintRuleStatus Report() const final;
 
+  absl::Status Configure(std::string_view configuration) final;
+
  private:
   std::set<verible::LintViolation> violations_;
+
+  std::unique_ptr<re2::RE2> style_regex_;
 };
 
 }  // namespace analysis
diff --git a/verible/verilog/analysis/checkers/generate-label-prefix-rule_test.cc b/verible/verilog/analysis/checkers/generate-label-prefix-rule_test.cc
index b46bfe4..cb43501 100644
--- a/verible/verilog/analysis/checkers/generate-label-prefix-rule_test.cc
+++ b/verible/verilog/analysis/checkers/generate-label-prefix-rule_test.cc
@@ -27,6 +27,7 @@
 namespace {
 
 using verible::LintTestCase;
+using verible::RunConfiguredLintTestCases;
 using verible::RunLintTestCases;
 
 TEST(GenerateLabelPrefixRuleTest, Various) {
@@ -229,6 +230,40 @@
   RunLintTestCases<VerilogAnalyzer, GenerateLabelPrefixRule>(kTestCases);
 }
 
+TEST(GenerateLabelPrefixRuleTest, CustomRegex) {
+  const std::initializer_list<LintTestCase> kTestCases = {
+      {"module m;\n"
+       "generate\n"
+       "if (1) begin : my_custom_label\n"
+       "end\n"
+       "endgenerate\nendmodule\n"},
+      {"module m;\n"
+       "generate\n"
+       "for (genvar i=0; i<5; i++) begin : my_custom_label\n"
+       "end\n"
+       "endgenerate\nendmodule\n"},
+  };
+  RunConfiguredLintTestCases<VerilogAnalyzer, GenerateLabelPrefixRule>(
+      kTestCases, "style_regex:my_.*");
+
+  const std::initializer_list<LintTestCase> kFailCases = {
+      {"module m;\n"
+       "generate\n"
+       "if (1) begin : ",
+       {SymbolIdentifier, "g_label"},
+       "\nend\n"
+       "endgenerate\nendmodule\n"},
+      {"module m;\n"
+       "generate\n"
+       "if (1) begin : ",
+       {SymbolIdentifier, "gen_label"},
+       "\nend\n"
+       "endgenerate\nendmodule\n"},
+  };
+  RunConfiguredLintTestCases<VerilogAnalyzer, GenerateLabelPrefixRule>(
+      kFailCases, "style_regex:my_.*");
+}
+
 }  // namespace
 }  // namespace analysis
 }  // namespace verilog
diff --git a/verible/verilog/analysis/checkers/port-name-suffix-rule.cc b/verible/verilog/analysis/checkers/port-name-suffix-rule.cc
index 85a0db3..ffecef3 100644
--- a/verible/verilog/analysis/checkers/port-name-suffix-rule.cc
+++ b/verible/verilog/analysis/checkers/port-name-suffix-rule.cc
@@ -28,6 +28,7 @@
 #include "verible/common/text/symbol.h"
 #include "verible/common/text/syntax-tree-context.h"
 #include "verible/common/text/token-info.h"
+#include "verible/common/util/container-util.h"
 #include "verible/verilog/CST/port.h"
 #include "verible/verilog/CST/verilog-matchers.h"
 #include "verible/verilog/analysis/descriptions.h"
@@ -90,10 +91,16 @@
        {"output", {"o", "no", "po"}},
        {"inout", {"io", "nio", "pio"}}};
 
-  // At this point it is guaranteed that the direction will be set to
-  // one of the expected values (used as keys in the map above).
-  // Therefore checking the suffix like this is safe
-  return suffixes.at(direction).count(suffix) == 1;
+  // `direction` is usually one of the map keys, but the grammar also permits a
+  // `ref` port direction, which has no suffix convention. FindWithDefault looks
+  // the direction up with an empty-set fallback, so an unknown direction (e.g.
+  // `ref`) has no required suffixes and is treated as "correct" (no violation),
+  // consistent with Violation() which also ignores non-input/output/inout
+  // directions.
+  static const std::set<std::string_view> kNoConvention;
+  const std::set<std::string_view> &valid =
+      verible::container::FindWithDefault(suffixes, direction, kNoConvention);
+  return valid.empty() || valid.count(suffix) == 1;
 }
 
 void PortNameSuffixRule::HandleSymbol(const Symbol &symbol,
@@ -113,8 +120,11 @@
         absl::StrSplit(name, '_', absl::SkipEmpty());
 
     if (name_parts.size() < 2) {
-      // No suffix at all
+      // No suffix at all. This also covers an all-underscore name (e.g. "_"),
+      // for which SkipEmpty leaves name_parts empty; return here so the
+      // name_parts.back() access below is not reached on an empty vector.
       Violation(direction, token, context);
+      return;
     }
 
     if (!IsSuffixCorrect(name_parts.back(), direction)) {
diff --git a/verible/verilog/analysis/checkers/port-name-suffix-rule_test.cc b/verible/verilog/analysis/checkers/port-name-suffix-rule_test.cc
index 69f18f4..db69d71 100644
--- a/verible/verilog/analysis/checkers/port-name-suffix-rule_test.cc
+++ b/verible/verilog/analysis/checkers/port-name-suffix-rule_test.cc
@@ -57,6 +57,9 @@
       {"module t (input bit name_i); endmodule;"},
       {"module t (output bit abc_o); endmodule;"},
       {"module t (inout bit xyz_io); endmodule;"},
+      // A `ref` port has no suffix convention and must not be flagged (and must
+      // not crash the rule via std::map::at).
+      {"module t (ref logic data_x); endmodule;"},
       {"module t (input logic name_i,\n"
        "output logic abc_o,\n"
        "inout logic xyz_io,\n"
@@ -90,6 +93,10 @@
       {"module t (output logic ", {kToken, "_o"}, "); endmodule;"},
       {"module t (inout logic ", {kToken, "_io"}, "); endmodule;"},
 
+      // An all-underscore name splits (SkipEmpty) to an empty parts list; it
+      // must report a suffix violation, not dereference an empty vector.
+      {"module t (input logic ", {kToken, "_"}, "); endmodule;"},
+
       {"module t (input logic ", {kToken, "namei"}, "); endmodule;"},
       {"module t (input logic ", {kToken, "nam_ei"}, "); endmodule;"},
       {"module t (input logic ", {kToken, "name_o"}, "); endmodule;"},
diff --git a/verible/verilog/analysis/symbol-table_test.cc b/verible/verilog/analysis/symbol-table_test.cc
index e15ec5f..3e6b1a6 100644
--- a/verible/verilog/analysis/symbol-table_test.cc
+++ b/verible/verilog/analysis/symbol-table_test.cc
@@ -73,8 +73,7 @@
   const auto found_##dest(map.find(key)); /* iterator */ \
   ASSERT_NE(found_##dest, map.end())                     \
       << "No element at \"" << key << "\" in " #map;     \
-  const auto &dest ABSL_ATTRIBUTE_UNUSED(                \
-      found_##dest->second); /* mapped_type */
+  const auto &dest [[maybe_unused]] (found_##dest->second); /* mapped_type */
 
 // Assert that container is not empty, and reference its first element.
 // Works on any container type with .begin().
@@ -103,7 +102,7 @@
       << "No symbol at \"" << key << "\" in " << ScopePathPrinter{scope}; \
   EXPECT_EQ(found_##dest->first, key);                                    \
   const SymbolTableNode &dest(found_##dest->second);                      \
-  const SymbolInfo &dest##_info ABSL_ATTRIBUTE_UNUSED(dest.Value())
+  const SymbolInfo &dest##_info [[maybe_unused]] (dest.Value())
 
 // For SymbolInfo::references_map_view_type only: Assert that there is exactly
 // one element at 'key' in 'map' and assign it to 'dest' (DependentReferences).
diff --git a/verible/verilog/analysis/verilog-equivalence.cc b/verible/verilog/analysis/verilog-equivalence.cc
index f8a47d0..d5c12bea 100644
--- a/verible/verilog/analysis/verilog-equivalence.cc
+++ b/verible/verilog/analysis/verilog-equivalence.cc
@@ -89,6 +89,26 @@
   return IsUnlexed(verilog_tokentype(token.token_enum()));
 }
 
+// True when left/right differ only because surrounding whitespace changed
+// token classification (e.g. MacroCallCloseToEndLine vs ')', or
+// MacroIdentifier vs MacroIdItem with unchanged spelling).
+static bool TokensAreWhitespaceDependentFormatEquivalent(
+    const TokenInfo &left, const TokenInfo &right) {
+  if ((left.token_enum() == verilog_tokentype::MacroCallCloseToEndLine &&
+       right.text() == ")") ||
+      (right.token_enum() == verilog_tokentype::MacroCallCloseToEndLine &&
+       left.text() == ")")) {
+    return true;
+  }
+  const auto is_line_ending_macro = [](int token_enum) {
+    return token_enum == verilog_tokentype::MacroIdentifier ||
+           token_enum == verilog_tokentype::MacroIdItem;
+  };
+  return is_line_ending_macro(left.token_enum()) &&
+         is_line_ending_macro(right.token_enum()) &&
+         left.text() == right.text();
+}
+
 DiffStatus VerilogLexicallyEquivalent(
     std::string_view left, std::string_view right,
     const std::function<bool(const verible::TokenInfo &)> &remove_predicate,
@@ -167,11 +187,11 @@
   DiffStatus diff_status = DiffStatus::kEquivalent;
   auto recursive_comparator = [&](const TokenSequence::const_iterator l,
                                   const TokenSequence::const_iterator r) {
+    // Some token enums differ only by surrounding whitespace (e.g. whether a
+    // macro or ')' ends a line). Treat those pairs as matching enums when the
+    // spelling is unchanged so FormatEquivalent tolerates re-wrapping.
     if (l->token_enum() != r->token_enum() &&
-        !((l->token_enum() == verilog_tokentype::MacroCallCloseToEndLine &&
-           r->text() == ")") ||
-          (r->token_enum() == verilog_tokentype::MacroCallCloseToEndLine &&
-           l->text() == ")"))) {
+        !TokensAreWhitespaceDependentFormatEquivalent(*l, *r)) {
       if (errstream != nullptr) {
         *errstream << "Mismatched token enums.  got: ";
         token_printer(*l, *errstream);
@@ -250,12 +270,7 @@
         return IsWhitespace(verilog_tokentype(t.token_enum()));
       },
       [=](const TokenInfo &l, const TokenInfo &r) {
-        // MacroCallCloseToEndLine should be considered equivalent to ')', as
-        // they are whitespace dependant
-        if (((r.token_enum() == verilog_tokentype::MacroCallCloseToEndLine) &&
-             (l.text() == ")")) ||
-            ((l.token_enum() == verilog_tokentype::MacroCallCloseToEndLine) &&
-             (r.text() == ")"))) {
+        if (TokensAreWhitespaceDependentFormatEquivalent(l, r)) {
           return true;
         }
         return l.EquivalentWithoutLocation(r);
diff --git a/verible/verilog/analysis/verilog-equivalence_test.cc b/verible/verilog/analysis/verilog-equivalence_test.cc
index 90b0ee1..1cb9436 100644
--- a/verible/verilog/analysis/verilog-equivalence_test.cc
+++ b/verible/verilog/analysis/verilog-equivalence_test.cc
@@ -255,6 +255,21 @@
   }
 }
 
+// MacroIdentifier vs MacroIdItem depends on whether the macro ends the line.
+TEST(FormatEquivalentTest, EquivalenceOfMacroIdentifierAndMacroIdItem) {
+  const char *kSameSpelling[] = {
+      "assign x = f(`TOKEN);\n",
+      "assign x = f(\n`TOKEN\n);\n",
+  };
+  ExpectCompareWithErrstream(FormatEquivalent, DiffStatus::kEquivalent,
+                             kSameSpelling[0], kSameSpelling[1]);
+
+  // Different macro names remain different.
+  ExpectCompareWithErrstream(FormatEquivalent, DiffStatus::kDifferent,
+                             "assign x = f(`TOKEN);\n",
+                             "assign x = f(`OTHER);\n");
+}
+
 TEST(FormatEquivalentTest, DiagnosticMismatch) {
   const char *kTestCases[] = {
       "module foo;\n",
diff --git a/verible/verilog/formatting/BUILD b/verible/verilog/formatting/BUILD
index 6150594..eb089df 100644
--- a/verible/verilog/formatting/BUILD
+++ b/verible/verilog/formatting/BUILD
@@ -163,7 +163,6 @@
         "//verible/common/util:expandable-tree-view",
         "//verible/common/util:interval",
         "//verible/common/util:interval-set",
-        "//verible/common/util:iterator-range",
         "//verible/common/util:logging",
         "//verible/common/util:spacer",
         "//verible/common/util:tree-operations",
@@ -175,7 +174,6 @@
         "//verible/verilog/analysis:verilog-equivalence",
         "//verible/verilog/parser:verilog-token-enum",
         "//verible/verilog/preprocessor:verilog-preprocess",
-        "@abseil-cpp//absl/base:core_headers",
         "@abseil-cpp//absl/log:die_if_null",
         "@abseil-cpp//absl/status",
         "@abseil-cpp//absl/status:statusor",
@@ -183,28 +181,91 @@
     ],
 )
 
-cc_test(
-    name = "formatter_test",
-    srcs = ["formatter_test.cc"],
+cc_library(
+    name = "formatter-test-utils",
+    testonly = True,
+    hdrs = ["formatter-test-utils.h"],
     deps = [
         ":format-style",
         ":formatter",
-        "//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",
     ],
 )
 
+_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,
+)
+
+cc_test(
+    name = "formatter_macro_test",
+    srcs = ["formatter_macro_test.cc"],
+    deps = _FORMATTER_E2E_TEST_DEPS,
+)
+
+cc_test(
+    name = "formatter_module_test",
+    srcs = ["formatter_module_test.cc"],
+    deps = _FORMATTER_E2E_TEST_DEPS,
+)
+
+cc_test(
+    name = "formatter_class_package_test",
+    srcs = ["formatter_class_package_test.cc"],
+    deps = _FORMATTER_E2E_TEST_DEPS,
+)
+
+cc_test(
+    name = "formatter_function_task_test",
+    srcs = ["formatter_function_task_test.cc"],
+    deps = _FORMATTER_E2E_TEST_DEPS,
+)
+
+cc_test(
+    name = "formatter_align_test",
+    srcs = ["formatter_align_test.cc"],
+    deps = _FORMATTER_E2E_TEST_DEPS,
+)
+
+cc_test(
+    name = "formatter_wrap_style_test",
+    srcs = ["formatter_wrap_style_test.cc"],
+    deps = _FORMATTER_E2E_TEST_DEPS,
+)
+
+cc_test(
+    name = "formatter_disable_test",
+    srcs = ["formatter_disable_test.cc"],
+    deps = _FORMATTER_E2E_TEST_DEPS,
+)
+
+cc_test(
+    name = "formatter_issue_regression_test",
+    srcs = ["formatter_issue_regression_test.cc"],
+    deps = _FORMATTER_E2E_TEST_DEPS,
+)
+
 cc_test(
     name = "formatter-tuning_test",
     srcs = ["formatter-tuning_test.cc"],
diff --git a/verible/verilog/formatting/README.md b/verible/verilog/formatting/README.md
index 6f815bf..03b6f5e 100644
--- a/verible/verilog/formatting/README.md
+++ b/verible/verilog/formatting/README.md
@@ -16,7 +16,23 @@
 Below is a quick summary of the major components.
 
 [formatter.h](formatter.h) contains the top-level entry point into the
-formatter. Text-in-text-out tests are in [formatter_test.cc](formatter_test.cc).
+formatter. Text-in-text-out tests are split by concern to reduce merge
+conflicts:
+
+- [formatter_test.cc](formatter_test.cc) — core smoke / `VerifyFormatting`
+- [formatter_macro_test.cc](formatter_macro_test.cc) — preprocessor, `` `uvm ``, directives
+- [formatter_module_test.cc](formatter_module_test.cc) — modules, ports, nets, expressions
+- [formatter_class_package_test.cc](formatter_class_package_test.cc) — classes, packages, constraints
+- [formatter_function_task_test.cc](formatter_function_task_test.cc) — functions, tasks, properties
+- [formatter_align_test.cc](formatter_align_test.cc) — tabular / param alignment
+- [formatter_wrap_style_test.cc](formatter_wrap_style_test.cc) — wrap/indent options, diagnostics
+- [formatter_disable_test.cc](formatter_disable_test.cc) — `verilog_format` on/off
+- [formatter_issue_regression_test.cc](formatter_issue_regression_test.cc) — GitHub issue regressions
+- Shared helpers: [formatter-test-utils.h](formatter-test-utils.h)
+
+**New GitHub-issue formatter regressions belong in
+`formatter_issue_regression_test.cc` only** (do not append them to
+`formatter_test.cc`).
 
 [FormatStyle](format_style.h) defines ways in which formatting can be
 configured.
diff --git a/verible/verilog/formatting/format-style-init.cc b/verible/verilog/formatting/format-style-init.cc
index 2dde818..a6d010b 100644
--- a/verible/verilog/formatting/format-style-init.cc
+++ b/verible/verilog/formatting/format-style-init.cc
@@ -140,6 +140,13 @@
           "Use compact binary expressions inside indexing / bit selection "
           "operators");
 
+ABSL_FLAG(bool, class_parameter_space, false,
+          "If true, keep/insert a space before '#' in a class"
+          "parameterized typedef, e.g. \"typedef my_class #(.P(P)) "
+          "my_class_t;\".  If false (default), no space is inserted, "
+          "matching the convention used for IEEE parameterized class "
+          "instantiations, e.g. \"type#(params...)::method(...)\".");
+
 ABSL_FLAG(bool, wrap_end_else_clauses, false,
           "Split end and else keywords into separate lines");
 
@@ -197,6 +204,7 @@
   STYLE_FROM_FLAG(try_wrap_long_lines);
   STYLE_FROM_FLAG(expand_coverpoints);
   STYLE_FROM_FLAG(compact_indexing_and_selections);
+  STYLE_FROM_FLAG(class_parameter_space);
   STYLE_FROM_FLAG(wrap_end_else_clauses);
   STYLE_FROM_FLAG(alignment_group_boundary);
 
diff --git a/verible/verilog/formatting/format-style.h b/verible/verilog/formatting/format-style.h
index 2fad329..55347c5 100644
--- a/verible/verilog/formatting/format-style.h
+++ b/verible/verilog/formatting/format-style.h
@@ -146,6 +146,9 @@
   // Compact binary expressions inside indexing / bit selection operators
   bool compact_indexing_and_selections = true;
 
+  // Keep/insert a space before '#' in a parameterized class typedef
+  bool class_parameter_space = false;
+
   // Split with a \n end and else clauses
   bool wrap_end_else_clauses = false;
 
diff --git a/verible/verilog/formatting/formatter-test-utils.h b/verible/verilog/formatting/formatter-test-utils.h
new file mode 100644
index 0000000..0be6382
--- /dev/null
+++ b/verible/verilog/formatting/formatter-test-utils.h
@@ -0,0 +1,69 @@
+// Copyright 2017-2026 The Verible Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Shared helpers for formatter end-to-end tests.
+// Penalty-sensitive cases belong in formatter-tuning_test.cc.
+
+#ifndef VERIBLE_VERILOG_FORMATTING_FORMATTER_TEST_UTILS_H_
+#define VERIBLE_VERILOG_FORMATTING_FORMATTER_TEST_UTILS_H_
+
+#include <sstream>
+#include <string_view>
+
+#include "gtest/gtest.h"
+#include "verible/common/util/logging.h"
+#include "verible/verilog/formatting/format-style.h"
+#include "verible/verilog/formatting/formatter.h"
+
+#undef EXPECT_OK
+#define EXPECT_OK(value) EXPECT_TRUE((value).ok())
+
+#undef ASSERT_OK
+#define ASSERT_OK(value) ASSERT_TRUE((value).ok())
+
+namespace verilog {
+namespace formatter {
+
+struct FormatterTestCase {
+  std::string_view input;
+  std::string_view expected;
+};
+
+// Runs FormatVerilog on each case and checks status + exact expected output.
+template <typename CaseRange>
+void RunFormatterTestCases(const FormatStyle &style, const CaseRange &cases) {
+  for (const auto &test_case : cases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+// Convenience: column_limit 40 / indent 2 / wrap 4 — the default E2E style.
+template <typename CaseRange>
+void RunFormatterTestCases40(const CaseRange &cases) {
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  RunFormatterTestCases(style, cases);
+}
+
+}  // namespace formatter
+}  // namespace verilog
+
+#endif  // VERIBLE_VERILOG_FORMATTING_FORMATTER_TEST_UTILS_H_
diff --git a/verible/verilog/formatting/formatter.cc b/verible/verilog/formatting/formatter.cc
index 9893b60..9bd3dd2 100644
--- a/verible/verilog/formatting/formatter.cc
+++ b/verible/verilog/formatting/formatter.cc
@@ -26,7 +26,6 @@
 #include <string_view>
 #include <vector>
 
-#include "absl/base/attributes.h"
 #include "absl/log/die_if_null.h"
 #include "absl/status/status.h"
 #include "absl/status/statusor.h"
@@ -50,7 +49,6 @@
 #include "verible/common/util/expandable-tree-view.h"
 #include "verible/common/util/interval-set.h"
 #include "verible/common/util/interval.h"
-#include "verible/common/util/iterator-range.h"
 #include "verible/common/util/logging.h"
 #include "verible/common/util/spacer.h"
 #include "verible/common/util/tree-operations.h"
@@ -749,15 +747,24 @@
       case verible::SpacingDecision::kPreserve: {
         if (token.before.preserved_space_start !=
             verible::string_view_null_iterator()) {
-          *column += token.OriginalLeadingSpaces().length();
+          const std::string_view leading = token.OriginalLeadingSpaces();
+          const auto last_nl = leading.find_last_of('\n');
+          if (last_nl == std::string_view::npos) {
+            *column += leading.length();
+          } else {
+            // Reset column after the last newline, same as FormattedToken
+            // emit (GitHub issue 2542).
+            *column = static_cast<int>(leading.length() - last_nl - 1);
+          }
         } else {
           *column += token.before.spaces;
         }
         break;
       }
       case verible::SpacingDecision::kWrap:
-        *column = 0;
-        ABSL_FALLTHROUGH_INTENDED;
+        // Newline then only the wrap indent (same as FormattedToken emit).
+        *column = token.before.spaces;
+        break;
       case verible::SpacingDecision::kAlign:
       case verible::SpacingDecision::kAppend:
         *column += token.before.spaces;
@@ -766,6 +773,15 @@
   }
 
   static int CalculateEolCommentColumn(const verible::FormattedExcerpt &line) {
+    // Compute the starting column of the trailing EOL comment the same way
+    // FormattedExcerpt::FormattedText emits spaces, including:
+    //   * wrap indents (SpacingDecision::kWrap), and
+    //   * preserved leading whitespace that may contain newlines (common when
+    //     an original line break is kept). Counting those newlines as width
+    //     made continuation comments land on the wrong column and fail to
+    //     converge on re-format (GitHub issue 2542).
+    if (line.Tokens().empty()) return 0;
+
     int column = 0;
     const auto &front = line.Tokens().front();
 
@@ -777,12 +793,16 @@
     }
     column += front.token->text().length();
 
-    for (const auto &ftoken : verible::make_range(line.Tokens().begin() + 1,
-                                                  line.Tokens().end() - 1)) {
+    const auto &tokens = line.Tokens();
+    for (size_t i = 1; i < tokens.size(); ++i) {
+      const auto &ftoken = tokens[i];
       AdjustColumnUsingTokenSpacing(ftoken, &column);
-      column += ftoken.token->text().length();
+      // Do not add the last token's length: that is the EOL comment whose
+      // starting column we want.
+      if (i + 1 < tokens.size()) {
+        column += ftoken.token->text().length();
+      }
     }
-    AdjustColumnUsingTokenSpacing(line.Tokens().back(), &column);
 
     CHECK_GE(column, 0);
     return column;
diff --git a/verible/verilog/formatting/formatter_align_test.cc b/verible/verilog/formatting/formatter_align_test.cc
new file mode 100644
index 0000000..affb5a7
--- /dev/null
+++ b/verible/verilog/formatting/formatter_align_test.cc
@@ -0,0 +1,5066 @@
+// Copyright 2017-2026 The Verible Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Test cases in this file should be *insensitive* to wrapping penalties.
+// Penalty-sensitive tests belong in formatter-tuning_test.cc.
+
+#include <sstream>
+#include <string_view>
+
+#include "gtest/gtest.h"
+#include "verible/common/formatting/align.h"
+#include "verible/common/util/logging.h"
+#include "verible/verilog/formatting/format-style.h"
+#include "verible/verilog/formatting/formatter-test-utils.h"
+#include "verible/verilog/formatting/formatter.h"
+
+namespace verilog {
+namespace formatter {
+namespace {
+
+using verible::AlignmentPolicy;
+
+static constexpr FormatterTestCase kAlignFormatterTestCases[] = {
+    // module instantiation named ports tabular alignment
+    //{// module instantiation with no port, only comments
+    //    "module m;\n"
+    //    "foo bar(\n"
+    //    "\t//comment1\n"
+    //    "//comment2\n"
+    //    ");\n"
+    //    "endmodule\n",
+    //    "module m;\n"
+    //    "  foo bar (\n"
+    //    "      //comment1\n"
+    //    "      //comment2\n"
+    //    "  );\n"
+    //    "endmodule\n"
+    //},
+    {// all named ports
+     "module m;\n"
+     "foo bar(.a(a), .aa(aa), .aaa(aaa));\n"
+     "endmodule\n",
+     "module m;\n"
+     "  foo bar (\n"
+     "      .a  (a),\n"
+     "      .aa (aa),\n"
+     "      .aaa(aaa)\n"
+     "  );\n"
+     "endmodule\n"},
+    {// named ports left unconnected
+     "module m;\n"
+     "foo bar(.a(), .aa(), .aaa());\n"
+     "endmodule\n",
+     "module m;\n"
+     "  foo bar (\n"
+     "      .a  (),\n"
+     "      .aa (),\n"
+     "      .aaa()\n"
+     "  );\n"
+     "endmodule\n"},
+    {// multiple named ports groups separated by blank line
+     "module m;\n"
+     "foo bar(.a(a), .aaa(aaa),\n\n .b(b), .bbbbbb(bbbbb));\n"
+     "endmodule\n",
+     "module m;\n"
+     "  foo bar (\n"
+     "      .a  (a),\n"
+     "      .aaa(aaa),\n"
+     "\n"
+     "      .b     (b),\n"
+     "      .bbbbbb(bbbbb)\n"
+     "  );\n"
+     "endmodule\n"},
+    {// named ports with concatenation
+     "module m;\n"
+     "foo bar(.a(a), .aaa({a,b,c}));\n"
+     "endmodule\n",
+     "module m;\n"
+     "  foo bar (\n"
+     "      .a  (a),\n"
+     "      .aaa({a, b, c})\n"
+     "  );\n"
+     "endmodule\n"},
+    {// name ports with slices
+     "module m;\n"
+     "foo bar(.a(a), .aaa(q[r:s]));\n"
+     "endmodule\n",
+     "module m;\n"
+     "  foo bar (\n"
+     "      .a  (a),\n"
+     "      .aaa(q[r:s])\n"
+     "  );\n"
+     "endmodule\n"},
+    {// named ports with pre-proc directives
+     "module m;\n"
+     "foo bar(.a(a), `ifdef MACRO .aa(aa), `endif .aaa(aaa));\n"
+     "endmodule\n",
+     "module m;\n"
+     "  foo bar (\n"
+     "      .a  (a),\n"
+     "`ifdef MACRO\n"
+     "      .aa (aa),\n"
+     "`endif\n"
+     "      .aaa(aaa)\n"
+     "  );\n"
+     "endmodule\n"},
+    {// named ports with macros
+     "module m;\n"
+     "foo bar(.a(a), .aa(aa[`RANGE]), .aaa(aaa));\n"
+     "endmodule\n",
+     "module m;\n"
+     "  foo bar (\n"
+     "      .a  (a),\n"
+     "      .aa (aa[`RANGE]),\n"
+     "      .aaa(aaa)\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module m;\n"
+     "foo bar(.a(a), .AA, .aaa(aaa));\n"
+     "endmodule\n",
+     "module m;\n"
+     "  foo bar (\n"
+     "      .a  (a),\n"
+     "      .AA,\n"
+     "      .aaa(aaa)\n"
+     "  );\n"
+     "endmodule\n"},
+    {// name ports with comments
+     "module m;\n"
+     "foo bar(.a(a), .aa(aa)/*comment*/, .aaa(aaa));\n"
+     "endmodule\n",
+     "module m;\n"
+     "  foo bar (\n"
+     "      .a  (a),\n"
+     "      .aa (aa)  /*comment*/,\n"
+     "      .aaa(aaa)\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module m;\n"
+     "foo bar(.a(a),//comment1\n .aaa(aaa)//comment2\n);\n"
+     "endmodule\n",
+     "module m;\n"
+     "  foo bar (\n"
+     "      .a  (a),   //comment1\n"
+     "      .aaa(aaa)  //comment2\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module m;\n"
+     "foo bar(.a(a),\n"
+     " //.aa(aa),\n"
+     ".aaa(aaa));\n"
+     "endmodule\n",
+     "module m;\n"
+     "  foo bar (\n"
+     "      .a  (a),\n"
+     "      //.aa(aa),\n"
+     "      .aaa(aaa)\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module m;\n"
+     "foo bar(\n"
+     ".a(a) //comment1\n"
+     ", .aaa(aaa) //comment2\n"
+     ") //comment3\n"
+     ";\n"
+     "endmodule\n",
+     "module m;\n"
+     "  foo bar (\n"
+     "        .a  (a)    //comment1\n"
+     "      , .aaa(aaa)  //comment2\n"
+     "  )  //comment3\n"
+     "  ;\n"
+     "endmodule\n"},
+    {// module instantiation with all implicit connections
+     "module m;\n"
+     "foo bar(.a, .aa, .aaaaa);\n"
+     "endmodule\n",
+     "module m;\n"
+     "  foo bar (\n"
+     "      .a,\n"
+     "      .aa,\n"
+     "      .aaaaa\n"
+     "  );\n"
+     "endmodule\n"},
+    {// named ports corssed with implicit connections
+     "module m;\n"
+     "foo bar(.a(a), .aa, .aaaaa(aaaaa));\n"
+     "endmodule\n",
+     "module m;\n"
+     "  foo bar (\n"
+     "      .a    (a),\n"
+     "      .aa,\n"
+     "      .aaaaa(aaaaa)\n"
+     "  );\n"
+     "endmodule\n"},
+    {// named ports corssed with wildcard connections
+     "module m;\n"
+     "foo bar(.a(a), .aaa(aaa), .*);\n"
+     "endmodule\n",
+     "module m;\n"
+     "  foo bar (\n"
+     "      .a  (a),\n"
+     "      .aaa(aaa),\n"
+     "      .*\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module m;\n"
+     "foo bar(.a(a), .aa(aa), .* , .aaa(aaa));\n"
+     "endmodule\n",
+     "module m;\n"
+     "  foo bar (\n"
+     "      .a  (a),\n"
+     "      .aa (aa),\n"
+     "      .*,\n"
+     "      .aaa(aaa)\n"
+     "  );\n"
+     "endmodule\n"},
+
+    // Parameterized data types, declarations inside #() tabular alignment
+    {// parameterized module with 'list_of_param_assignments'
+     "module foo #(A = 2, AA = 22, AAA = 222);\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    A   = 2,\n"
+     "    AA  = 22,\n"
+     "    AAA = 222\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with 'parameter_declaration'
+     "module foo #(parameter int a = 2, parameter int aa = 22);\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    parameter int a  = 2,\n"
+     "    parameter int aa = 22\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with 'parameter_declaration' and comments
+     "module foo #(//comment\nparameter int a = 2, parameter int aa = 22);\n"
+     "endmodule\n",
+     "module foo #(  //comment\n"
+     "    parameter int a  = 2,\n"
+     "    parameter int aa = 22\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with 'parameter_declaration' and trailing comments
+     "module foo #(parameter int a = 2,//comment\n parameter int aa = 22);\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    parameter int a  = 2,  //comment\n"
+     "    parameter int aa = 22\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with 'parameter_declaration' and pre-proc
+     "module foo #(parameter int a = 2,\n"
+     "`ifdef MACRO parameter int aa = 22, `endif\n"
+     "parameter int aaa = 222);\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    parameter int a   = 2,\n"
+     "`ifdef MACRO\n"
+     "    parameter int aa  = 22,\n"
+     "`endif\n"
+     "    parameter int aaa = 222\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with 'parameter_declaration' and packed dimensions
+     "module foo #(parameter logic [3:0] a = 2, parameter logic [30:0] aa = "
+     "22);\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    parameter logic [ 3:0] a  = 2,\n"
+     "    parameter logic [30:0] aa = 22\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with 'parameter_declaration' and unpacked
+     // dimensions
+     "module foo #(parameter logic a[3:0] = 2, parameter logic  aa [30:0] = "
+     "22);\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    parameter logic a [ 3:0] = 2,\n"
+     "    parameter logic aa[30:0] = 22\n"
+     ");\n"
+     "endmodule\n"},
+
+    {// parameterized module with 'local_parameter_declaration'
+     "module foo #(localparam int a = 2, localparam int aa = 22);\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    localparam int a  = 2,\n"
+     "    localparam int aa = 22\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with 'local_parameter_declaration' and comments
+     "module foo #(//comment\nlocalparam int a = 2, localparam int aa = 22);\n"
+     "endmodule\n",
+     "module foo #(  //comment\n"
+     "    localparam int a  = 2,\n"
+     "    localparam int aa = 22\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with 'local_parameter_declaration' and trailing
+     // comments
+     "module foo #(localparam int a = 2,//comment\n localparam int aa = 22);\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    localparam int a  = 2,  //comment\n"
+     "    localparam int aa = 22\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with 'local_parameter_declaration' and pre-proc
+     "module foo #(localparam int a = 2,\n"
+     "`ifdef MACRO localparam int aa = 22, `endif\n"
+     "localparam int aaa = 222);\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    localparam int a   = 2,\n"
+     "`ifdef MACRO\n"
+     "    localparam int aa  = 22,\n"
+     "`endif\n"
+     "    localparam int aaa = 222\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with 'local_parameter_declaration' and packed
+     // dimensions
+     "module foo #(localparam logic [3:0] a = 2, localparam logic [30:0] aa = "
+     "22);\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    localparam logic [ 3:0] a  = 2,\n"
+     "    localparam logic [30:0] aa = 22\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with 'local_parameter_declaration' and unpacked
+     // dimensions
+     "module foo #(localparam logic a[3:0] = 2, localparam logic  aa [30:0] = "
+     "22);\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    localparam logic a [ 3:0] = 2,\n"
+     "    localparam logic aa[30:0] = 22\n"
+     ");\n"
+     "endmodule\n"},
+
+    {// parameterized module with 'data_type list_of_param_assignments'
+     "module foo #( int a = 2,  real aa = 22, longint aaa = 222);\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    int     a   = 2,\n"
+     "    real    aa  = 22,\n"
+     "    longint aaa = 222\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with 'data_type list_of_param_assignments' and
+     // comments
+     "module foo #(//comment\nint a = 2,  shortreal aa = 22, longint aaa = "
+     "222);\n"
+     "endmodule\n",
+     "module foo #(  //comment\n"
+     "    int       a   = 2,\n"
+     "    shortreal aa  = 22,\n"
+     "    longint   aaa = 222\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with 'data_type list_of_param_assignments' and
+     // trailing comments
+     "module foo #(int a = 2,  shortreal aa = 22,//comment\n longint aaa = "
+     "222);\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    int       a   = 2,\n"
+     "    shortreal aa  = 22,  //comment\n"
+     "    longint   aaa = 222\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with 'data_type list_of_param_assignments' and
+     // pre-proc
+     "module foo #(int a = 2,\n"
+     "`ifdef MACRO shortreal aa = 22, `endif\n"
+     " longint aaa = 222);\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    int       a   = 2,\n"
+     "`ifdef MACRO\n"
+     "    shortreal aa  = 22,\n"
+     "`endif\n"
+     "    longint   aaa = 222\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with 'data_type list_of_param_assignments' and
+     // packed dimensions
+     "module foo #(bit [1:0] a = 2,  reg [12:0] aa = 22, logic [123:0] aaa = "
+     "222);\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    bit   [  1:0] a   = 2,\n"
+     "    reg   [ 12:0] aa  = 22,\n"
+     "    logic [123:0] aaa = 222\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with 'data_type list_of_param_assignments' and
+     // unpacked dimensions
+     "module foo #(bit  a[1:0] = 2,  reg  aa[12:0] = 22, logic aaa [123:0]  = "
+     "222);\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    bit   a  [  1:0] = 2,\n"
+     "    reg   aa [ 12:0] = 22,\n"
+     "    logic aaa[123:0] = 222\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with 'type list_of_type_assignments'
+     "module foo #(type T = int, type TT = bit, type TTT= C#(logic) );\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    type T   = int,\n"
+     "    type TT  = bit,\n"
+     "    type TTT = C#(logic)\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with 'type list_of_type_assignments' and comments
+     "module foo #(//comment\ntype T = int, type TT = bit, type TTT= C#(logic) "
+     ");\n"
+     "endmodule\n",
+     "module foo #(  //comment\n"
+     "    type T   = int,\n"
+     "    type TT  = bit,\n"
+     "    type TTT = C#(logic)\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with 'data_type list_of_param_assignments' and
+     // trailing comments
+     "module foo #(type T = int, type TT = bit, //comment\n type TTT= "
+     "C#(logic) );\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    type T   = int,\n"
+     "    type TT  = bit,       //comment\n"
+     "    type TTT = C#(logic)\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with 'data_type list_of_param_assignments' and
+     // pre-proc
+     "module foo #(type T = int,\n"
+     "`ifdef MACRO type TT = bit, `endif\n"
+     " type TTT= C#(logic));\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    type T   = int,\n"
+     "`ifdef MACRO\n"
+     "    type TT  = bit,\n"
+     "`endif\n"
+     "    type TTT = C#(logic)\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with 'data_type list_of_param_assignments' and
+     // packed dimensions
+     "module foo #(type T = int [3:0], type TT = bit [250:0]);\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    type T  = int [  3:0],\n"
+     "    type TT = bit [250:0]\n"
+     ");\n"
+     "endmodule\n"},
+    {"module foo #(type T = int, "
+     "A = 2, int AA = 22, parameter AAA = 222, parameter longint AAAA = 2222, "
+     "localparam AAAAA = 22222, localparam real AAAAAA = 222222"
+     ");\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "               type    T      = int,\n"
+     "                       A      = 2,\n"
+     "               int     AA     = 22,\n"
+     "    parameter          AAA    = 222,\n"
+     "    parameter  longint AAAA   = 2222,\n"
+     "    localparam         AAAAA  = 22222,\n"
+     "    localparam real    AAAAAA = 222222\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with built-in data type
+     "module foo #(int a = 2, real abc = 2234);\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    int  a   = 2,\n"
+     "    real abc = 2234\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with type
+     "module foo #(type TYPE1 = int, type TYPE2 = boo);\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    type TYPE1 = int,\n"
+     "    type TYPE2 = boo\n"
+     ");\n"
+     "endmodule\n"},
+    {"module foo#(localparam type TYPE1 = int, type TYPE22 = bool, parameter   "
+     " type TYPE333 = real);\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    localparam type TYPE1   = int,\n"
+     "               type TYPE22  = bool,\n"
+     "    parameter  type TYPE333 = real\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with 'data_type list_of_param_assignments' and 1D
+     // packed dimensions
+     "module foo #(parameter type T = int [3:0], type TT = bit [123:0]);\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    parameter type T  = int [  3:0],\n"
+     "              type TT = bit [123:0]\n"
+     ");\n"
+     "endmodule\n"},
+    {// parameterized module with 'data_type list_of_param_assignments' and 2D
+     // packed dimensions
+     "module foo #(type T = int [3:0][123:0], type TT = bit [123:0][1:0]);\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    type T  = int [  3:0][123:0],\n"
+     "    type TT = bit [123:0][  1:0]\n"
+     ");\n"
+     "endmodule\n"},
+    {// parametrized module with user defined data types
+     "module foo #(type T = my_type1_t, type TT = my_pkg::my_type2_t);\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    type T  = my_type1_t,\n"
+     "    type TT = my_pkg::my_type2_t\n"
+     ");\n"
+     "endmodule\n"},
+
+    {// parameterized class with 'list_of_param_assignments'
+     "class foo #(A = 2, AA = 22, AAA = 222);\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    A   = 2,\n"
+     "    AA  = 22,\n"
+     "    AAA = 222\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'parameter_declaration'
+     "class foo #(parameter int a = 2, parameter int aa = 22);\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    parameter int a  = 2,\n"
+     "    parameter int aa = 22\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'parameter_declaration' and comments
+     "class foo #(//comment\nparameter int a = 2, parameter int aa = 22);\n"
+     "endclass\n",
+     "class foo #(  //comment\n"
+     "    parameter int a  = 2,\n"
+     "    parameter int aa = 22\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'parameter_declaration' and trailing comments
+     "class foo #(parameter int a = 2,//comment\n parameter int aa = 22);\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    parameter int a  = 2,  //comment\n"
+     "    parameter int aa = 22\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'parameter_declaration' and pre-proc
+     "class foo #(parameter int a = 2,\n"
+     "`ifdef MACRO parameter int aa = 22, `endif\n"
+     "parameter int aaa = 222);\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    parameter int a   = 2,\n"
+     "`ifdef MACRO\n"
+     "    parameter int aa  = 22,\n"
+     "`endif\n"
+     "    parameter int aaa = 222\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'parameter_declaration' and packed dimensions
+     "class foo #(parameter logic [3:0] a = 2, parameter logic [30:0] aa = "
+     "22);\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    parameter logic [ 3:0] a  = 2,\n"
+     "    parameter logic [30:0] aa = 22\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'parameter_declaration' and unpacked dimensions
+     "class foo #(parameter logic a[3:0] = 2, parameter logic  aa [30:0] = "
+     "22);\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    parameter logic a [ 3:0] = 2,\n"
+     "    parameter logic aa[30:0] = 22\n"
+     ");\n"
+     "endclass\n"},
+
+    {// parameterized class with 'local_parameter_declaration'
+     "class foo #(localparam int a = 2, localparam int aa = 22);\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    localparam int a  = 2,\n"
+     "    localparam int aa = 22\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'local_parameter_declaration' and comments
+     "class foo #(//comment\nlocalparam int a = 2, localparam int aa = 22);\n"
+     "endclass\n",
+     "class foo #(  //comment\n"
+     "    localparam int a  = 2,\n"
+     "    localparam int aa = 22\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'local_parameter_declaration' and trailing
+     // comments
+     "class foo #(localparam int a = 2,//comment\n localparam int aa = 22);\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    localparam int a  = 2,  //comment\n"
+     "    localparam int aa = 22\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'local_parameter_declaration' and pre-proc
+     "class foo #(localparam int a = 2,\n"
+     "`ifdef MACRO localparam int aa = 22, `endif\n"
+     "localparam int aaa = 222);\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    localparam int a   = 2,\n"
+     "`ifdef MACRO\n"
+     "    localparam int aa  = 22,\n"
+     "`endif\n"
+     "    localparam int aaa = 222\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'local_parameter_declaration' and packed
+     // dimensions
+     "class foo #(localparam logic [3:0] a = 2, localparam logic [30:0] aa = "
+     "22);\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    localparam logic [ 3:0] a  = 2,\n"
+     "    localparam logic [30:0] aa = 22\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'local_parameter_declaration' and unpacked
+     // dimensions
+     "class foo #(localparam logic a[3:0] = 2, localparam logic  aa [30:0] = "
+     "22);\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    localparam logic a [ 3:0] = 2,\n"
+     "    localparam logic aa[30:0] = 22\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'data_type list_of_param_assignments'
+     "class foo #( int a = 2,  real aa = 22, longint aaa = 222);\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    int     a   = 2,\n"
+     "    real    aa  = 22,\n"
+     "    longint aaa = 222\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'data_type list_of_param_assignments' and
+     // comments
+     "class foo #(//comment\nint a = 2,  shortreal aa = 22, longint aaa = "
+     "222);\n"
+     "endclass\n",
+     "class foo #(  //comment\n"
+     "    int       a   = 2,\n"
+     "    shortreal aa  = 22,\n"
+     "    longint   aaa = 222\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'data_type list_of_param_assignments' and
+     // trailing comments
+     "class foo #(int a = 2,  shortreal aa = 22,//comment\n longint aaa = "
+     "222);\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    int       a   = 2,\n"
+     "    shortreal aa  = 22,  //comment\n"
+     "    longint   aaa = 222\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'data_type list_of_param_assignments' and
+     // pre-proc
+     "class foo #(int a = 2,\n"
+     "`ifdef MACRO shortreal aa = 22, `endif\n"
+     " longint aaa = 222);\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    int       a   = 2,\n"
+     "`ifdef MACRO\n"
+     "    shortreal aa  = 22,\n"
+     "`endif\n"
+     "    longint   aaa = 222\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'data_type list_of_param_assignments' and
+     // packed dimensions
+     "class foo #(bit [1:0] a = 2,  reg [12:0] aa = 22, logic [123:0] aaa = "
+     "222);\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    bit   [  1:0] a   = 2,\n"
+     "    reg   [ 12:0] aa  = 22,\n"
+     "    logic [123:0] aaa = 222\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'data_type list_of_param_assignments' and
+     // unpacked dimensions
+     "class foo #(bit  a[1:0] = 2,  reg  aa[12:0] = 22, logic aaa [123:0]  = "
+     "222);\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    bit   a  [  1:0] = 2,\n"
+     "    reg   aa [ 12:0] = 22,\n"
+     "    logic aaa[123:0] = 222\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'type list_of_type_assignments'
+     "class foo #(type T = int, type TT = bit, type TTT= C#(logic) );\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    type T   = int,\n"
+     "    type TT  = bit,\n"
+     "    type TTT = C#(logic)\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'type list_of_type_assignments' and comments
+     "class foo #(//comment\ntype T = int, type TT = bit, type TTT= C#(logic) "
+     ");\n"
+     "endclass\n",
+     "class foo #(  //comment\n"
+     "    type T   = int,\n"
+     "    type TT  = bit,\n"
+     "    type TTT = C#(logic)\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'data_type list_of_param_assignments' and
+     // trailing comments
+     "class foo #(type T = int, type TT = bit, //comment\n type TTT= C#(logic) "
+     ");\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    type T   = int,\n"
+     "    type TT  = bit,       //comment\n"
+     "    type TTT = C#(logic)\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'data_type list_of_param_assignments' and
+     // pre-proc
+     "class foo #(type T = int,\n"
+     "`ifdef MACRO type TT = bit, `endif\n"
+     " type TTT= C#(logic));\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    type T   = int,\n"
+     "`ifdef MACRO\n"
+     "    type TT  = bit,\n"
+     "`endif\n"
+     "    type TTT = C#(logic)\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'data_type list_of_param_assignments' and
+     // packed dimensions
+     "class foo #(type T = int [3:0], type TT = bit [250:0]);\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    type T  = int [  3:0],\n"
+     "    type TT = bit [250:0]\n"
+     ");\n"
+     "endclass\n"},
+    {"class foo #(type T = int, "
+     "A = 2, int AA = 22, parameter AAA = 222, parameter longint AAAA = 2222, "
+     "localparam AAAAA = 22222, localparam real AAAAAA = 222222"
+     ");\n"
+     "endclass\n",
+     "class foo #(\n"
+     "               type    T      = int,\n"
+     "                       A      = 2,\n"
+     "               int     AA     = 22,\n"
+     "    parameter          AAA    = 222,\n"
+     "    parameter  longint AAAA   = 2222,\n"
+     "    localparam         AAAAA  = 22222,\n"
+     "    localparam real    AAAAAA = 222222\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with built-in data type
+     "class foo #(int a = 2, real abc = 2234);\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    int  a   = 2,\n"
+     "    real abc = 2234\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with type
+     "class foo #(type TYPE1 = int, type TYPE2 = boo);\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    type TYPE1 = int,\n"
+     "    type TYPE2 = boo\n"
+     ");\n"
+     "endclass\n"},
+    {"class foo#(localparam type TYPE1 = int, type TYPE22 = bool, parameter    "
+     "type TYPE333 = real);\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    localparam type TYPE1   = int,\n"
+     "               type TYPE22  = bool,\n"
+     "    parameter  type TYPE333 = real\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'data_type list_of_param_assignments' and 1D
+     // packed dimensions
+     "class foo #(parameter type T = int [3:0], type TT = bit [123:0]);\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    parameter type T  = int [  3:0],\n"
+     "              type TT = bit [123:0]\n"
+     ");\n"
+     "endclass\n"},
+    {// parameterized class with 'data_type list_of_param_assignments' and 2D
+     // packed dimensions
+     "class foo #(type T = int [3:0][123:0], type TT = bit [123:0][1:0]);\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    type T  = int [  3:0][123:0],\n"
+     "    type TT = bit [123:0][  1:0]\n"
+     ");\n"
+     "endclass\n"},
+    {// parametrized class with user defined data types
+     "class foo #(type T = my_type1_t, type TT = my_pkg::my_type2_t);\n"
+     "endclass\n",
+     "class foo #(\n"
+     "    type T  = my_type1_t,\n"
+     "    type TT = my_pkg::my_type2_t\n"
+     ");\n"
+     "endclass\n"},
+
+    {// parameterized interface with 'local_parameter_declaration'
+     "interface foo #(localparam int a = 2, localparam int aa = 22);\n"
+     "endinterface\n",
+     "interface foo #(\n"
+     "    localparam int a  = 2,\n"
+     "    localparam int aa = 22\n"
+     ");\n"
+     "endinterface\n"},
+    {// parameterized interface with 'local_parameter_declaration' and comments
+     "interface foo #(//comment\nlocalparam int a = 2, localparam int aa = "
+     "22);\n"
+     "endinterface\n",
+     "interface foo #(  //comment\n"
+     "    localparam int a  = 2,\n"
+     "    localparam int aa = 22\n"
+     ");\n"
+     "endinterface\n"},
+    {// parameterized interface with 'local_parameter_declaration' and trailing
+     // comments
+     "interface foo #(localparam int a = 2,//comment\n localparam int aa = "
+     "22);\n"
+     "endinterface\n",
+     "interface foo #(\n"
+     "    localparam int a  = 2,  //comment\n"
+     "    localparam int aa = 22\n"
+     ");\n"
+     "endinterface\n"},
+    {// parameterized interface with 'local_parameter_declaration' and pre-proc
+     "interface foo #(localparam int a = 2,\n"
+     "`ifdef MACRO localparam int aa = 22, `endif\n"
+     "localparam int aaa = 222);\n"
+     "endinterface\n",
+     "interface foo #(\n"
+     "    localparam int a   = 2,\n"
+     "`ifdef MACRO\n"
+     "    localparam int aa  = 22,\n"
+     "`endif\n"
+     "    localparam int aaa = 222\n"
+     ");\n"
+     "endinterface\n"},
+    {// parameterized interface with 'local_parameter_declaration' and packed
+     // dimensions
+     "interface foo #(localparam logic [3:0] a = 2, localparam logic [30:0] aa "
+     "= 22);\n"
+     "endinterface\n",
+     "interface foo #(\n"
+     "    localparam logic [ 3:0] a  = 2,\n"
+     "    localparam logic [30:0] aa = 22\n"
+     ");\n"
+     "endinterface\n"},
+    {// parameterized interface with 'local_parameter_declaration' and unpacked
+     // dimensions
+     "interface foo #(localparam logic a[3:0] = 2, localparam logic  aa [30:0] "
+     "= 22);\n"
+     "endinterface\n",
+     "interface foo #(\n"
+     "    localparam logic a [ 3:0] = 2,\n"
+     "    localparam logic aa[30:0] = 22\n"
+     ");\n"
+     "endinterface\n"},
+    {// parameterized interface with 'data_type list_of_param_assignments'
+     "interface foo #( int a = 2,  real aa = 22, longint aaa = 222);\n"
+     "endinterface\n",
+     "interface foo #(\n"
+     "    int     a   = 2,\n"
+     "    real    aa  = 22,\n"
+     "    longint aaa = 222\n"
+     ");\n"
+     "endinterface\n"},
+    {// parameterized interface with 'data_type list_of_param_assignments' and
+     // comments
+     "interface foo #(//comment\nint a = 2,  shortreal aa = 22, longint aaa = "
+     "222);\n"
+     "endinterface\n",
+     "interface foo #(  //comment\n"
+     "    int       a   = 2,\n"
+     "    shortreal aa  = 22,\n"
+     "    longint   aaa = 222\n"
+     ");\n"
+     "endinterface\n"},
+    {// parameterized interface with 'data_type list_of_param_assignments' and
+     // trailing comments
+     "interface foo #(int a = 2,  shortreal aa = 22,//comment\n longint aaa = "
+     "222);\n"
+     "endinterface\n",
+     "interface foo #(\n"
+     "    int       a   = 2,\n"
+     "    shortreal aa  = 22,  //comment\n"
+     "    longint   aaa = 222\n"
+     ");\n"
+     "endinterface\n"},
+    {// parameterized interface with 'data_type list_of_param_assignments' and
+     // pre-proc
+     "interface foo #(int a = 2,\n"
+     "`ifdef MACRO shortreal aa = 22, `endif\n"
+     " longint aaa = 222);\n"
+     "endinterface\n",
+     "interface foo #(\n"
+     "    int       a   = 2,\n"
+     "`ifdef MACRO\n"
+     "    shortreal aa  = 22,\n"
+     "`endif\n"
+     "    longint   aaa = 222\n"
+     ");\n"
+     "endinterface\n"},
+    {// parameterized interface with 'data_type list_of_param_assignments' and
+     // packed dimensions
+     "interface foo #(bit [1:0] a = 2,  reg [12:0] aa = 22, logic [123:0] aaa "
+     "= 222);\n"
+     "endinterface\n",
+     "interface foo #(\n"
+     "    bit   [  1:0] a   = 2,\n"
+     "    reg   [ 12:0] aa  = 22,\n"
+     "    logic [123:0] aaa = 222\n"
+     ");\n"
+     "endinterface\n"},
+    {// parameterized interface with 'data_type list_of_param_assignments' and
+     // unpacked dimensions
+     "interface foo #(bit  a[1:0] = 2,  reg  aa[12:0] = 22, logic aaa [123:0]  "
+     "= 222);\n"
+     "endinterface\n",
+     "interface foo #(\n"
+     "    bit   a  [  1:0] = 2,\n"
+     "    reg   aa [ 12:0] = 22,\n"
+     "    logic aaa[123:0] = 222\n"
+     ");\n"
+     "endinterface\n"},
+    {// parameterized interface with 'type list_of_type_assignments'
+     "interface foo #(type T = int, type TT = bit, type TTT= C#(logic) );\n"
+     "endinterface\n",
+     "interface foo #(\n"
+     "    type T   = int,\n"
+     "    type TT  = bit,\n"
+     "    type TTT = C#(logic)\n"
+     ");\n"
+     "endinterface\n"},
+    {// parameterized interface with 'type list_of_type_assignments' and
+     // comments
+     "interface foo #(//comment\ntype T = int, type TT = bit, type TTT= "
+     "C#(logic) );\n"
+     "endinterface\n",
+     "interface foo #(  //comment\n"
+     "    type T   = int,\n"
+     "    type TT  = bit,\n"
+     "    type TTT = C#(logic)\n"
+     ");\n"
+     "endinterface\n"},
+    {// parameterized interface with 'data_type list_of_param_assignments' and
+     // trailing comments
+     "interface foo #(type T = int, type TT = bit, //comment\n type TTT= "
+     "C#(logic) );\n"
+     "endinterface\n",
+     "interface foo #(\n"
+     "    type T   = int,\n"
+     "    type TT  = bit,       //comment\n"
+     "    type TTT = C#(logic)\n"
+     ");\n"
+     "endinterface\n"},
+    {// parameterized interface with 'data_type list_of_param_assignments' and
+     // pre-proc
+     "interface foo #(type T = int,\n"
+     "`ifdef MACRO type TT = bit, `endif\n"
+     " type TTT= C#(logic));\n"
+     "endinterface\n",
+     "interface foo #(\n"
+     "    type T   = int,\n"
+     "`ifdef MACRO\n"
+     "    type TT  = bit,\n"
+     "`endif\n"
+     "    type TTT = C#(logic)\n"
+     ");\n"
+     "endinterface\n"},
+    {// parameterized interface with 'data_type list_of_param_assignments' and
+     // packed dimensions
+     "interface foo #(type T = int [3:0], type TT = bit [250:0]);\n"
+     "endinterface\n",
+     "interface foo #(\n"
+     "    type T  = int [  3:0],\n"
+     "    type TT = bit [250:0]\n"
+     ");\n"
+     "endinterface\n"},
+    {"interface foo #(type T = int, "
+     "A = 2, int AA = 22, parameter AAA = 222, parameter longint AAAA = 2222, "
+     "localparam AAAAA = 22222, localparam real AAAAAA = 222222"
+     ");\n"
+     "endinterface\n",
+     "interface foo #(\n"
+     "               type    T      = int,\n"
+     "                       A      = 2,\n"
+     "               int     AA     = 22,\n"
+     "    parameter          AAA    = 222,\n"
+     "    parameter  longint AAAA   = 2222,\n"
+     "    localparam         AAAAA  = 22222,\n"
+     "    localparam real    AAAAAA = 222222\n"
+     ");\n"
+     "endinterface\n"},
+    {// parameterized interface with built-in data type
+     "interface foo #(int a = 2, real abc = 2234);\n"
+     "endinterface\n",
+     "interface foo #(\n"
+     "    int  a   = 2,\n"
+     "    real abc = 2234\n"
+     ");\n"
+     "endinterface\n"},
+    {// parameterized interface with type
+     "interface foo #(type TYPE1 = int, type TYPE2 = boo);\n"
+     "endinterface\n",
+     "interface foo #(\n"
+     "    type TYPE1 = int,\n"
+     "    type TYPE2 = boo\n"
+     ");\n"
+     "endinterface\n"},
+    {"interface foo#(localparam type TYPE1 = int, type TYPE22 = bool, "
+     "parameter    type TYPE333 = real);\n"
+     "endinterface\n",
+     "interface foo #(\n"
+     "    localparam type TYPE1   = int,\n"
+     "               type TYPE22  = bool,\n"
+     "    parameter  type TYPE333 = real\n"
+     ");\n"
+     "endinterface\n"},
+    {// parameterized interface with 'data_type list_of_param_assignments' and
+     // 1D packed dimensions
+     "interface foo #(parameter type T = int [3:0], type TT = bit [123:0]);\n"
+     "endinterface\n",
+     "interface foo #(\n"
+     "    parameter type T  = int [  3:0],\n"
+     "              type TT = bit [123:0]\n"
+     ");\n"
+     "endinterface\n"},
+    {// parameterized interface with 'data_type list_of_param_assignments' and
+     // 2D packed dimensions
+     "interface foo #(type T = int [3:0][123:0], type TT = bit [123:0][1:0]);\n"
+     "endinterface\n",
+     "interface foo #(\n"
+     "    type T  = int [  3:0][123:0],\n"
+     "    type TT = bit [123:0][  1:0]\n"
+     ");\n"
+     "endinterface\n"},
+    {// parametrized interface with user defined data types
+     "interface foo #(type T = my_type1_t, type TT = my_pkg::my_type2_t);\n"
+     "endinterface\n",
+     "interface foo #(\n"
+     "    type T  = my_type1_t,\n"
+     "    type TT = my_pkg::my_type2_t\n"
+     ");\n"
+     "endinterface\n"},
+    {// wildcard import package at module header
+     "module foo import bar::*; (baz); endmodule\n",
+     "module foo\n"
+     "  import bar::*;\n"
+     "(\n"
+     "    baz\n"
+     ");\n"
+     "endmodule\n"},
+    {// import package at module header
+     "module foo import bar::baz; (qux); endmodule\n",
+     "module foo\n"
+     "  import bar::baz;\n"
+     "(\n"
+     "    qux\n"
+     ");\n"
+     "endmodule\n"},
+    {// wildcard import multiple packages at module header
+     "module foo import bar::*,baz::*; (qux); endmodule\n",
+     "module foo\n"
+     "  import bar::*, baz::*;\n"
+     "(\n"
+     "    qux\n"
+     ");\n"
+     "endmodule\n"},
+    {// separate package import declarations in module header
+     "module foo import bar::*,baz::*; import q_pkg::qux; (qux); endmodule\n",
+     "module foo\n"
+     "  import bar::*, baz::*;\n"
+     "  import q_pkg::qux;\n"
+     "(\n"
+     "    qux\n"
+     ");\n"
+     "endmodule\n"},
+    {// import package at module header
+     "module foo import bar::baz; #(int p = 3)(qux); endmodule\n",
+     "module foo\n"
+     "  import bar::baz;\n"
+     "#(\n"
+     "    int p = 3\n"
+     ") (\n"
+     "    qux\n"
+     ");\n"
+     "endmodule\n"},
+    // Space between return keyword and return value
+    {"function int foo(logic [31:0] data); return{<<8{data}}; endfunction",
+     "function int foo(logic [31:0] data);\n"
+     "  return {<<8{data}};\n"
+     "endfunction\n"},
+    {"function int f;return(1);endfunction",
+     "function int f;\n"
+     "  return (1);\n"
+     "endfunction\n"},
+    {"function int f;return-1;endfunction",
+     "function int f;\n"
+     "  return -1;\n"
+     "endfunction\n"},
+    {"function int f ;return    ! x\n;endfunction",
+     "function int f;\n"
+     "  return !x;\n"
+     "endfunction\n"},
+    {"function int f ;return    ~ x\n;endfunction",
+     "function int f;\n"
+     "  return ~x;\n"
+     "endfunction\n"},
+    {"function int f ;return    $x\n;endfunction",
+     "function int f;\n"
+     "  return $x;\n"
+     "endfunction\n"},
+    // String initializers
+    {"string a[] = {\n\"a\"\n};\n", "string a[] = {\"a\"};\n"},
+    {"string abc[] = {\n\"a\",\n\"b\",\n\"c\"\n};\n",
+     "string abc[] = {\"a\", \"b\", \"c\"};\n"},
+    {"string abc[] = {\n"
+     "\"a\",//\n"
+     "\"b\", \"c\"\n"
+     "};\n",
+     "string abc[] = {\"a\",  //\n"
+     "                \"b\",\n"
+     "                \"c\"};\n"},
+    {"string abc[] = {//\n"
+     "\"a\", \"b\", \"c\""
+     "};\n",
+     "string abc[] = {  //\n"
+     "  \"a\",\n"
+     "  \"b\",\n"
+     "  \"c\"\n"
+     "};\n"},
+    {"string abc[] = {\n"
+     "\"a\", \"b\", \"c\"//\n"
+     "};\n",
+     "string abc[] = {\"a\",\n"
+     "                \"b\",\n"
+     "                \"c\"  //\n"
+     "                };\n"},
+    {"string abc[] = {//\n"
+     "\"a\",//\n"
+     "\"b\", \"c\"//\n"
+     "};\n",
+     "string abc[] = {  //\n"
+     "  \"a\",  //\n"
+     "  \"b\",\n"
+     "  \"c\"  //\n"
+     "};\n"},
+    {"string abc[] = {\n"
+     "\"a\",\n"
+     "// comment\n"
+     "// comment\n"
+     "\"b\",\n"
+     "\"c\"\n"
+     "};\n",
+     "string abc[] = {\"a\",\n"
+     "                // comment\n"
+     "                // comment\n"
+     "                \"b\",\n"
+     "                \"c\"};\n"},
+    {"string numbers[] = {\"one\", \"two\", \"three\", \"four\"};\n",
+     "string numbers[] = {\"one\",\n"
+     "                    \"two\",\n"
+     "                    \"three\",\n"
+     "                    \"four\"};\n"},
+    {"string numbers[] = {\"one\", \"two\", THREE, \"four\"};\n",
+     "string numbers[] = {\n"
+     "  \"one\", \"two\", THREE, \"four\"\n"
+     "};\n"},
+    {"string numbers[] = {\"one\", {\"two\", \"three\"}, \"four\"};\n",
+     "string numbers[] = {\n"
+     "  \"one\", {\"two\", \"three\"}, \"four\"\n"
+     "};\n"},
+    {"string numbers[] = {\"one\", {\"two\", //\n"
+     "\"three\"}, \"four\"};\n",
+     "string numbers[] = {\n"
+     "  \"one\",\n"
+     "  {\n"
+     "    \"two\",  //\n"
+     "    \"three\"\n"
+     "  },\n"
+     "  \"four\"\n"
+     "};\n"},
+    {"string years[] = {\"two_thousand_nineteen\", \"two_thousand_twenty\",\n"
+     "\"two_thousand_twenty_one\"};\n",
+     // line with 3rd string would exceed column limit in unwrapped style
+     "string years[] = {\n"
+     "  \"two_thousand_nineteen\",\n"
+     "  \"two_thousand_twenty\",\n"
+     "  \"two_thousand_twenty_one\"\n"
+     "};\n"},
+    {"class class_name;\n"
+     "var_type var_name = new(\"the_string\");\n"
+     "endclass\n",
+     "class class_name;\n"
+     "  var_type var_name = new(\"the_string\");\n"
+     "endclass\n"},
+
+    //{   // parameterized class with 'parameter_declaration' and MACRO
+    //    "class foo #(parameter int a = 2,\n"
+    //    "parameter int aaa = `MACRO);\n"
+    //    "endclass\n",
+    //    "class foo #(\n"
+    //    "    parameter int a   = 2,\n"
+    //    "    parameter int aaa = `MACRO\n"
+    //    ");\n"
+    //    "endclass\n"
+    //},
+    // Struct/Union alignment
+    {"typedef struct {\n"
+     "bit [3:0] first; bit [31:0] second; generic_type_name_t third;\n"
+     "} type_t;",
+     "typedef struct {\n"
+     "  bit [3:0]           first;\n"
+     "  bit [31:0]          second;\n"
+     "  generic_type_name_t third;\n"
+     "} type_t;\n"},
+    {"typedef union soft packed {\n"
+     "bit [3:0] first; bit [31:0] second; generic_type_name_t third;\n"
+     "} type_t;",
+     "typedef union soft packed {\n"
+     "  bit [3:0]           first;\n"
+     "  bit [31:0]          second;\n"
+     "  generic_type_name_t third;\n"
+     "} type_t;\n"},
+    {"typedef union soft {\n"
+     "bit [3:0] first; bit [31:0] second; generic_type_name_t third;\n"
+     "} type_t;",
+     "typedef union soft {\n"
+     "  bit [3:0]           first;\n"
+     "  bit [31:0]          second;\n"
+     "  generic_type_name_t third;\n"
+     "} type_t;\n"},
+    {"typedef struct {\n"
+     "// comment\n"
+     "bit [3:0] first; bit [31:0] second; generic_type_name_t third;\n"
+     "} type_t;",
+     "typedef struct {\n"
+     "  // comment\n"
+     "  bit [3:0]           first;\n"
+     "  bit [31:0]          second;\n"
+     "  generic_type_name_t third;\n"
+     "} type_t;\n"},
+    {"typedef struct {\n"
+     "// comment 0\n"
+     "bit [31:0] first; // a\n"
+     "bit [31:0] second; // b\n"
+     "bit third; // c\n"
+     "uint fourth; // d\n"
+     "\n"
+     "// comment 1\n"
+     "int fifth;\n"
+     "// comment 2.1\n"
+     "// comment 2.2\n"
+     "uint sixth;\n"
+     "} timing_cfg_t;",
+     "typedef struct {\n"
+     "  // comment 0\n"
+     "  bit [31:0] first;   // a\n"
+     "  bit [31:0] second;  // b\n"
+     "  bit        third;   // c\n"
+     "  uint       fourth;  // d\n"
+     "\n"
+     "  // comment 1\n"
+     "  int  fifth;\n"
+     "  // comment 2.1\n"
+     "  // comment 2.2\n"
+     "  uint sixth;\n"
+     "} timing_cfg_t;\n"},
+    {"typedef struct {\n"
+     "// comment\n"
+     "rand int r;\n"
+     "int a;\n"
+     "int aa = 0;\n"
+     "int aaa = 1; // comment\n"
+     "foo#(bar) z;\n"
+     "int [x:y] zz; // comment\n"
+     "int zzz[a:b];\n"
+     "} type_t;",
+     "typedef struct {\n"
+     "  // comment\n"
+     "  rand int   r;\n"
+     "  int        a;\n"
+     "  int        aa        = 0;\n"
+     "  int        aaa       = 1;  // comment\n"
+     "  foo #(bar) z;\n"
+     "  int [x:y]  zz;             // comment\n"
+     "  int        zzz[a:b];\n"
+     "} type_t;\n"},
+    {"typedef struct packed {\n"
+     "struct packed { bit q; logic qq; logic qqq; } a_few_qs;\n"
+     "struct packed {\n"
+     "logic [1:0]  q;\n"
+     "} one_q;\n"
+     "int q;\n"
+     "uint qq;\n"
+     "} nested_qs_t;",
+     "typedef struct packed {\n"
+     "  struct packed {\n"
+     "    bit   q;\n"
+     "    logic qq;\n"
+     "    logic qqq;\n"
+     "  } a_few_qs;\n"
+     "  struct packed {logic [1:0] q;} one_q;\n"
+     "  int  q;\n"
+     "  uint qq;\n"
+     "} nested_qs_t;\n"},
+    {"typedef struct packed {\n"
+     "struct packed { bit q; logic qq; logic qqq; } a_few_qs;\n"
+     "struct packed {\n"
+     "// comment\n"
+     "logic [1:0]  q;\n"
+     "} one_q;\n"
+     "int q;\n"
+     "uint qq;\n"
+     "} nested_qs_t;",
+     "typedef struct packed {\n"
+     "  struct packed {\n"
+     "    bit   q;\n"
+     "    logic qq;\n"
+     "    logic qqq;\n"
+     "  } a_few_qs;\n"
+     "  struct packed {\n"
+     "    // comment\n"
+     "    logic [1:0] q;\n"
+     "  } one_q;\n"
+     "  int  q;\n"
+     "  uint qq;\n"
+     "} nested_qs_t;\n"},
+    {"typedef struct {bit [3:0] first;\n"
+     "`ifdef MACRO\n"
+     "bit [31:0] second; generic_type_name_t third;\n"
+     "`endif\n"
+     "} type_t;\n",
+     "typedef struct {\n"
+     "  bit [3:0]           first;\n"
+     "`ifdef MACRO\n"
+     "  bit [31:0]          second;\n"
+     "  generic_type_name_t third;\n"
+     "`endif\n"
+     "} type_t;\n"},
+    {"typedef struct {\n"
+     "bit [3:0] first // c\n"
+     "; bit [31:0] second"
+     "// c\n"
+     "; generic_type_name_t third // c\n"
+     ";} type_t;\n",
+     "typedef struct {\n"
+     "  bit [3:0]           first  // c\n"
+     ";\n"
+     "  bit [31:0]          second  // c\n"
+     ";\n"
+     "  generic_type_name_t third  // c\n"
+     ";\n"
+     "} type_t;\n"},
+    {"struct {logic test1; // c\n"
+     "logic test2;} test3;\n",
+     "struct {\n"
+     "  logic test1;  // c\n"
+     "  logic test2;\n"
+     "} test3;\n"},
+    {"struct {\n"
+     "  /* t */ logic test1; /* t */\n"
+     "/* t */ logic test2; }test3;\n",
+     "struct {\n"
+     "  /* t */ logic test1;  /* t */\n"
+     "  /* t */ logic test2;\n"
+     "} test3;\n"},
+    // Continuation comment alignment
+    {"`define BAR 1 // A\n"
+     "module foo(); // B\n"
+     "wire baz;     // C\n"
+     "endmodule:foo // D\n",
+     "`define BAR 1 // A\n"
+     "module foo ();  // B\n"
+     "  wire baz;  // C\n"
+     "endmodule : foo  // D\n"},
+    {"`define BAR 1 // A\n"
+     "module foo(); // B\n"
+     "              // B.1\n"
+     "              // B.2\n"
+     "wire baz;     // C\n"
+     "              // C.1\n"
+     "              // C.2\n"
+     "endmodule:foo // D\n"
+     "              // D.1\n"
+     "              // D.2\n",
+     "`define BAR 1 // A\n"
+     "module foo ();  // B\n"
+     "                // B.1\n"
+     "                // B.2\n"
+     "  wire baz;  // C\n"
+     "             // C.1\n"
+     "             // C.2\n"
+     "endmodule : foo  // D\n"
+     "                 // D.1\n"
+     "                 // D.2\n"},
+    {"// W\n"
+     "`define BAR 1 // A\n"
+     "   // X\n"
+     "module foo(); // B\n"
+     "              // B.1\n"
+     "              // B.2\n"
+     " // Y\n"
+     "wire baz;     // C\n"
+     "              // C.1\n"
+     "              // C.2\n"
+     "    // Z\n"
+     "endmodule:foo // D\n"
+     "              // D.1\n"
+     "              // D.2\n",
+     "// W\n"
+     "`define BAR 1 // A\n"
+     "// X\n"
+     "module foo ();  // B\n"
+     "                // B.1\n"
+     "                // B.2\n"
+     "  // Y\n"
+     "  wire baz;  // C\n"
+     "             // C.1\n"
+     "             // C.2\n"
+     "  // Z\n"
+     "endmodule : foo  // D\n"
+     "                 // D.1\n"
+     "                 // D.2\n"},
+    {"module foo( // A\n"
+     "            // A.1\n"
+     "// X\n"
+     "input wire i1 [a:b], // B\n"
+     "                     // B.1\n"
+     "input [c:d] i2, // C\n"
+     "                // C.1\n"
+     "\n"
+     "// Y\n"
+     "output reg o1 // D\n"
+     "              // D.1\n"
+     ");endmodule:foo\n",
+     "module foo (  // A\n"
+     "              // A.1\n"
+     "    // X\n"
+     "    input wire       i1[a:b],  // B\n"
+     "                               // B.1\n"
+     "    input      [c:d] i2,       // C\n"
+     "                               // C.1\n"
+     "\n"
+     "    // Y\n"
+     "    output reg o1  // D\n"
+     "                   // D.1\n"
+     ");\n"
+     "endmodule : foo\n"},
+    // user defined type alignment
+    {
+        "module foo();\n"
+        "  logic [5:0][5:0] net_c;\n"
+        " messy_type_name [1:0] net_e;\n"
+        "endmodule\n",
+        "module foo ();\n"
+        "  logic           [5:0][5:0] net_c;\n"
+        "  messy_type_name [1:0]      net_e;\n"
+        "endmodule\n",
+    },
+    // Continuation comment's original starting column is allowed to differ from
+    // starting comment's original starting column at most by 1.
+    // Starting column of comments B and C will change after formatting.
+    // TODO: refine the column alignment depending on current vs previous line.
+    // https://github.com/chipsalliance/verible/pull/858#discussion_r672844015
+    {"module foo ();  // A\n"     // Starting comment; already on correct column
+     "                 // A.1\n"  // A's column + 1
+     "               // A.2\n"    // A's column - 1
+     "wire baz;      // B\n"      // Starting comment; will be moved left
+     "              // B.1\n"     // B's column - 1
+     "                // B.2\n"   // B's column + 1
+     "               // B.3\n"    // B's column
+     "endmodule:foo // C\n"       // Starting comment; will be moved right
+     "               // C.1\n"    // C's column + 1
+     "             // C.2\n",     // C's column - 1
+     "module foo ();  // A\n"
+     "                // A.1\n"
+     "                // A.2\n"
+     "  wire baz;  // B\n"
+     "             // B.1\n"
+     "             // B.2\n"
+     "             // B.3\n"
+     "endmodule : foo  // C\n"
+     "                 // C.1\n"
+     "                 // C.2\n"},
+    {"module foo\n"
+     "#(\n"
+     "  parameter type baz_t = struct packed { `BAZ(); }\n"
+     ")\n"
+     "();\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    parameter type\n"
+     "        baz_t = struct packed {\n"
+     "      `BAZ();\n"
+     "    }\n"
+     ") ();\n"
+     "endmodule\n"},
+    // The same as the previous test case, but without a semicolon at the macro
+    // call
+    {"module foo\n"
+     "#(\n"
+     "  parameter type baz_t = struct packed { `BAZ() }\n"
+     ")\n"
+     "();\n"
+     "endmodule\n",
+     "module foo #(\n"
+     "    parameter type\n"
+     "        baz_t = struct packed {\n"
+     "      `BAZ()\n"
+     "    }\n"
+     ") ();\n"
+     "endmodule\n"},
+    // Check that comments with too large starting column difference are not
+    // aligned as continuation comments.
+    // Check that starting comments are not linked with a comment in
+    // comment-only line above them, even when the starting column is the same.
+    // All comments in this test case are aligned independently, i.e. none are
+    // "continuation comments".
+    {"                // comment1\n"  // A's column, but is above it
+     "module foo ();  // A\n"
+     "                  // comment2\n"  // A's column + 2
+     "              // comment3\n"      // A's column - 2
+     "wire baz;     // B\n"
+     "            // comment4\n"      // B's column - 2
+     "                // comment5\n"  // B's column + 2
+     "              // comment6\n"    // B's column, but not directly under B
+     "endmodule:foo // C\n"
+     "                // comment7\n"  // C's column + 2
+     "              // comment8\n",   // C's column, but not directly under B
+     "// comment1\n"
+     "module foo ();  // A\n"
+     "  // comment2\n"
+     "  // comment3\n"
+     "  wire baz;  // B\n"
+     "  // comment4\n"
+     "  // comment5\n"
+     "  // comment6\n"
+     "endmodule : foo  // C\n"
+     "// comment7\n"
+     "// comment8\n"},
+    // Continuation comment alignment when a line with the starting comment is
+    // wrapped.
+    {"module foo(output logic very_very_very_very_long_name // A\n"
+     "                                                      // A.1\n"
+     "); endmodule\n",
+     "module foo (\n"
+     "    output logic\n"
+     "        very_very_very_very_long_name  // A\n"
+     "                                       // A.1\n"
+     ");\n"
+     "endmodule\n"},
+
+    // Attachment of ',' to elements in enum list (with and without comments)
+    {"typedef enum {\n"
+     "  first , // c1\n"
+     "  second\n"
+     "} e;\n",
+     "typedef enum {\n"
+     "  first,  // c1\n"
+     "  second\n"
+     "} e;\n"},
+    {"typedef enum {\n"
+     "  first ,\n"
+     "  // c1\n"
+     "  second\n"
+     "} e;\n",
+     "typedef enum {\n"
+     "  first,\n"
+     "  // c1\n"
+     "  second\n"
+     "} e;\n"},
+    {"typedef enum {\n"
+     "  first // c1\n"
+     "  , second\n"
+     "} e;\n",
+     "typedef enum {\n"
+     "    first   // c1\n"
+     "  , second\n"
+     "} e;\n"},
+    {"typedef enum {\n"
+     "  first\n"
+     "  // c1\n"
+     "  , second\n"
+     "} e;\n",
+     "typedef enum {\n"
+     "    first\n"
+     "  // c1\n"
+     "  , second\n"
+     "} e;\n"},
+    {"typedef enum {\n"
+     "  first // c1\n"
+     "  , // c2\n"
+     "  second\n"
+     "} e;\n",
+     "typedef enum {\n"
+     "  first   // c1\n"
+     "  ,  // c2\n"
+     "  second\n"
+     "} e;\n"},
+    {"typedef enum {\n"
+     "  first\n"
+     "  // c1\n"
+     "  ,\n"
+     "  // c2\n"
+     "  second\n"
+     "} e;\n",
+     "typedef enum {\n"
+     "  first\n"
+     "  // c1\n"
+     "  ,  // c2\n"
+     "  second\n"
+     "} e;\n"},
+    {"typedef enum {\n"
+     "  first\n"
+     "  // c1\n"
+     "  , // c2\n"
+     "  // c3\n"
+     "  second\n"
+     "} e;\n",
+     "typedef enum {\n"
+     "  first\n"
+     "  // c1\n"
+     "  ,  // c2\n"
+     "  // c3\n"
+     "  second\n"
+     "} e;\n"},
+    {"typedef enum {\n"
+     "  // c1\n"
+     "  first\n"
+     "  // c2\n"
+     "  , // c3\n"
+     "  // c4\n"
+     "  second\n"
+     "  // c5\n"
+     "} e;\n",
+     "typedef enum {\n"
+     "  // c1\n"
+     "  first\n"
+     "  // c2\n"
+     "  ,  // c3\n"
+     "  // c4\n"
+     "  second\n"
+     "  // c5\n"
+     "} e;\n"},
+    {"typedef enum {\n"
+     "  // c1\n"
+     "  // c1+\n"
+     "  first // c2\n"
+     "        // c2+\n"
+     "  , // c3\n"
+     "    // c3+\n"
+     "  // c4\n"
+     "  // c4+\n"
+     "  second // c5\n"
+     "         // c5+\n"
+     "} e;\n",
+     "typedef enum {\n"
+     "  // c1\n"
+     "  // c1+\n"
+     "  first   // c2\n"
+     "          // c2+\n"
+     "  ,  // c3\n"
+     "     // c3+\n"
+     "  // c4\n"
+     "  // c4+\n"
+     "  second  // c5\n"
+     "          // c5+\n"
+     "} e;\n"},
+    {"typedef enum {\n"
+     "  first , /* c1 */\n"
+     "  second\n"
+     "} e;\n",
+     "typedef enum {\n"
+     "  first,  /* c1 */\n"
+     "  second\n"
+     "} e;\n"},
+    {"typedef enum {\n"
+     "  first ,\n"
+     "  /* c1 */\n"
+     "  second\n"
+     "} e;\n",
+     "typedef enum {\n"
+     "  first,\n"
+     "  /* c1 */\n"
+     "  second\n"
+     "} e;\n"},
+    {"typedef enum {\n"
+     "  first /* c1 */\n"
+     "  , second\n"
+     "} e;\n",
+     "typedef enum {\n"
+     "    first   /* c1 */\n"
+     "  , second\n"
+     "} e;\n"},
+    {"typedef enum {\n"
+     "  first\n"
+     "  /* c1 */\n"
+     "  , second\n"
+     "} e;\n",
+     "typedef enum {\n"
+     "    first\n"
+     "  /* c1 */\n"
+     "  , second\n"
+     "} e;\n"},
+    {"typedef enum {\n"
+     "  first /* c1 */\n"
+     "  , /* c2 */\n"
+     "  second\n"
+     "} e;\n",
+     "typedef enum {\n"
+     "  first   /* c1 */\n"
+     "  ,  /* c2 */\n"
+     "  second\n"
+     "} e;\n"},
+    {"typedef enum {\n"
+     "  first\n"
+     "  /* c1 */\n"
+     "  ,\n"
+     "  /* c2 */\n"
+     "  second\n"
+     "} e;\n",
+     "typedef enum {\n"
+     "  first\n"
+     "  /* c1 */\n"
+     "  ,\n"
+     "  /* c2 */\n"
+     "  second\n"
+     "} e;\n"},
+    {"typedef enum {\n"
+     "  /* c1 */\n"
+     "  first\n"
+     "  /* c2 */\n"
+     "  , /* c3 */\n"
+     "  /* c4 */\n"
+     "  second\n"
+     "  /* c5 */\n"
+     "} e;\n",
+     "typedef enum {\n"
+     "  /* c1 */\n"
+     "  first\n"
+     "  /* c2 */\n"
+     "  ,  /* c3 */\n"
+     "  /* c4 */\n"
+     "  second\n"
+     "  /* c5 */\n"
+     "} e;\n"},
+    {"typedef enum {\n"
+     "  /* c1  */\n"
+     "  /* c1+ */\n"
+     "  first /* c2  */\n"
+     "        /* c2+ */\n"
+     "  , /* c3  */\n"
+     "    /* c3+ */\n"
+     "  /* c4  */\n"
+     "  /* c4+ */\n"
+     "  second /* c5  */\n"
+     "         /* c5+ */\n"
+     "} e;\n",
+     "typedef enum {\n"
+     "  /* c1  */\n"
+     "  /* c1+ */\n"
+     "  first   /* c2  */\n"
+     "  /* c2+ */\n"
+     "  ,  /* c3  */\n"
+     "  /* c3+ */\n"
+     "  /* c4  */\n"
+     "  /* c4+ */\n"
+     "  second  /* c5  */\n"
+     "  /* c5+ */\n"
+     "} e;\n"},
+    {"module m;\n"
+     "typedef enum {\n"
+     "  first,\n"
+     "  second\n"
+     "} // c\n"
+     "e;\n"
+     "endmodule\n",
+     "module m;\n"
+     "  typedef enum {\n"
+     "    first,\n"
+     "    second\n"
+     "  }  // c\n"
+     "  e;\n"
+     "endmodule\n"},
+    // Attachment of ';' preceded by EOL comment
+    {"module m;\n"
+     "typedef enum {\n"
+     "  first,\n"
+     "  second\n"
+     "} e // c\n"
+     ";\n"
+     "endmodule\n",
+     "module m;\n"
+     "  typedef enum {\n"
+     "    first,\n"
+     "    second\n"
+     "  } e  // c\n"
+     "  ;\n"
+     "endmodule\n"},
+    {"module m;\n"
+     "typedef enum {\n"
+     "  first,\n"
+     "  second\n"
+     "} // c1\n"
+     "e // c2\n"
+     ";\n"
+     "endmodule\n",
+     "module m;\n"
+     "  typedef enum {\n"
+     "    first,\n"
+     "    second\n"
+     "  }  // c1\n"
+     "  e  // c2\n"
+     "  ;\n"
+     "endmodule\n"},
+    {"assign foo = bar\n"
+     "// comment\n"
+     ";\n",
+     "assign foo = bar\n"
+     "    // comment\n"
+     "    ;\n"},
+    {"assign foo = bar // comment\n"
+     ";\n",
+     "assign foo = bar  // comment\n"
+     ";\n"},
+
+    // Attachment of ',' to elements in PortActualList (with and without
+    // comments)
+    {"module foo;\n"
+     "  bar foobar(\n"
+     "    .first(1) // c1\n"
+     "    ,\n"
+     "    .second(2) // c2\n"
+     "  );\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar foobar (\n"
+     "        .first (1)  // c1\n"
+     "      , .second(2)  // c2\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar foobar(\n"
+     "    .first(1) // c1\n"
+     "    , .second(2) // c2\n"
+     "  );\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar foobar (\n"
+     "        .first (1)  // c1\n"
+     "      , .second(2)  // c2\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar foobar(\n"
+     "    .first(1)\n"
+     "    // c1\n"
+     "    ,\n"
+     "    .second(2)\n"
+     "    // c2\n"
+     "  );\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar foobar (\n"
+     "        .first (1)\n"
+     "      // c1\n"
+     "      , .second(2)\n"
+     "      // c2\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar foobar(\n"
+     "    .first(1)\n"
+     "    // c1\n"
+     "    , .second(2)\n"
+     "    // c2\n"
+     "  );\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar foobar (\n"
+     "        .first (1)\n"
+     "      // c1\n"
+     "      , .second(2)\n"
+     "      // c2\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar foobar(\n"
+     "    .first(1)\n"
+     "    // c1\n"
+     "    , // c2\n"
+     "    .second(2)\n"
+     "    // c3\n"
+     "  );\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar foobar (\n"
+     "      .first (1)\n"
+     "      // c1\n"
+     "      ,  // c2\n"
+     "      .second(2)\n"
+     "      // c3\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar foobar(\n"
+     "    // c1\n"
+     "    // c1+\n"
+     "    .first(1) // c2\n"
+     "              // c2+\n"
+     "    , // c3\n"
+     "      // c3+\n"
+     "    .second(2) // c4\n"
+     "               // c4+\n"
+     "    // c5\n"
+     "    // c5+\n"
+     "  );\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar foobar (\n"
+     "      // c1\n"
+     "      // c1+\n"
+     "      .first (1)  // c2\n"
+     "                  // c2+\n"
+     "      ,  // c3\n"
+     "         // c3+\n"
+     "      .second(2)  // c4\n"
+     "                  // c4+\n"
+     "      // c5\n"
+     "      // c5+\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar foobar(\n"
+     "    .first(1) /* c1 */\n"
+     "    ,\n"
+     "    .second(2) /* c2 */\n"
+     "  );\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar foobar (\n"
+     "        .first (1)  /* c1 */\n"
+     "      , .second(2)  /* c2 */\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar foobar(\n"
+     "    /* c1 */ .first(1),\n"
+     "    /* c2 */ .second(2)\n"
+     "  );\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar foobar (\n"
+     "      /* c1 */.first (1),\n"
+     "      /* c2 */.second(2)\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar foobar(\n"
+     "    .first(1) /* c1 */\n"
+     "    , .second(2) /* c2 */\n"
+     "  );\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar foobar (\n"
+     "        .first (1)  /* c1 */\n"
+     "      , .second(2)  /* c2 */\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar foobar(\n"
+     "    /* c1 */.first(1)\n"
+     "    /* c2 */, .second(2)\n"
+     "  );\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar foobar (\n"
+     "      /* c1 */  .first (1)\n"
+     "      /* c2 */, .second(2)\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar foobar(\n"
+     "    .first(1)\n"
+     "    /* c1 */\n"
+     "    ,\n"
+     "    .second(2)\n"
+     "    /* c2 */\n"
+     "  );\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar foobar (\n"
+     "        .first (1)\n"
+     "      /* c1 */\n"
+     "      , .second(2)\n"
+     "      /* c2 */\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar foobar(\n"
+     "    .first(1)\n"
+     "    /* c1 */\n"
+     "    , .second(2)\n"
+     "    /* c2 */\n"
+     "  );\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar foobar (\n"
+     "        .first (1)\n"
+     "      /* c1 */\n"
+     "      , .second(2)\n"
+     "      /* c2 */\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar foobar(\n"
+     "    .first(1)\n"
+     "    /* c1 */\n"
+     "    , /* c2 */\n"
+     "    .second(2)\n"
+     "    /* c3 */\n"
+     "  );\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar foobar (\n"
+     "      .first (1)\n"
+     "      /* c1 */\n"
+     "      ,  /* c2 */\n"
+     "      .second(2)\n"
+     "      /* c3 */\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar foobar(\n"
+     "    .first(1)\n"
+     "    /* c1 */\n"
+     "    , /* c2 */\n"
+     "    .second(2)\n"
+     "    /* c3 */\n"
+     "  );\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar foobar (\n"
+     "      .first (1)\n"
+     "      /* c1 */\n"
+     "      ,  /* c2 */\n"
+     "      .second(2)\n"
+     "      /* c3 */\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar foobar(\n"
+     "    /* c1  */\n"
+     "    /* c1+ */\n"
+     "    .first(1) /* c2  */\n"
+     "              /* c2+ */\n"
+     "    , /* c3  */\n"
+     "      /* c3+ */\n"
+     "    .second(2) /* c4  */\n"
+     "               /* c4+ */\n"
+     "    /* c5  */\n"
+     "    /* c5+ */\n"
+     "  );\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar foobar (\n"
+     "      /* c1  */\n"
+     "      /* c1+ */\n"
+     "      .first (1)  /* c2  */\n"
+     "      /* c2+ */\n"
+     "      ,  /* c3  */\n"
+     "      /* c3+ */\n"
+     "      .second(2)  /* c4  */\n"
+     "      /* c4+ */\n"
+     "      /* c5  */\n"
+     "      /* c5+ */\n"
+     "  );\n"
+     "endmodule\n"},
+
+    // Attachment of ',' to elements in ActualNamedParameterList (with and
+    // without comments)
+    {"module foo;\n"
+     "  bar#(\n"
+     "    .first(1) // c1\n"
+     "    ,\n"
+     "    .second(2) // c2\n"
+     "  ) baz ();\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar #(\n"
+     "        .first (1)  // c1\n"
+     "      , .second(2)  // c2\n"
+     "  ) baz ();\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar#(\n"
+     "    .first(1) // c1\n"
+     "    , .second(2) // c2\n"
+     "  ) baz ();\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar #(\n"
+     "        .first (1)  // c1\n"
+     "      , .second(2)  // c2\n"
+     "  ) baz ();\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar#(\n"
+     "    .first(1)\n"
+     "    // c1\n"
+     "    ,\n"
+     "    .second(2)\n"
+     "    // c2\n"
+     "  ) baz ();\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar #(\n"
+     "        .first (1)\n"
+     "      // c1\n"
+     "      , .second(2)\n"
+     "      // c2\n"
+     "  ) baz ();\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar#(\n"
+     "    .first(1)\n"
+     "    // c1\n"
+     "    , .second(2)\n"
+     "    // c2\n"
+     "  ) baz ();\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar #(\n"
+     "        .first (1)\n"
+     "      // c1\n"
+     "      , .second(2)\n"
+     "      // c2\n"
+     "  ) baz ();\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar#(\n"
+     "    .first(1)\n"
+     "    // c1\n"
+     "    , // c2\n"
+     "    .second(2)\n"
+     "    // c3\n"
+     "  ) baz ();\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar #(\n"
+     "      .first (1)\n"
+     "      // c1\n"
+     "      ,  // c2\n"
+     "      .second(2)\n"
+     "      // c3\n"
+     "  ) baz ();\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar#(\n"
+     "    // c1\n"
+     "    // c1+\n"
+     "    .first(1) // c2\n"
+     "              // c2+\n"
+     "    , // c3\n"
+     "      // c3+\n"
+     "    .second(2) // c4\n"
+     "               // c4+\n"
+     "    // c5\n"
+     "    // c5+\n"
+     "  ) baz ();\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar #(\n"
+     "      // c1\n"
+     "      // c1+\n"
+     "      .first (1)  // c2\n"
+     "                  // c2+\n"
+     "      ,  // c3\n"
+     "         // c3+\n"
+     "      .second(2)  // c4\n"
+     "                  // c4+\n"
+     "      // c5\n"
+     "      // c5+\n"
+     "  ) baz ();\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar#(\n"
+     "    .first(1) /* c1 */\n"
+     "    ,\n"
+     "    .second(2) /* c2 */\n"
+     "  ) baz ();\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar #(\n"
+     "        .first (1)  /* c1 */\n"
+     "      , .second(2)  /* c2 */\n"
+     "  ) baz ();\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar#(\n"
+     "    /* c1 */ .first(1),\n"
+     "    /* c2 */ .second(2)\n"
+     "  ) baz ();\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar #(\n"
+     "      /* c1 */.first (1),\n"
+     "      /* c2 */.second(2)\n"
+     "  ) baz ();\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar#(\n"
+     "    .first(1) /* c1 */\n"
+     "    , .second(2) /* c2 */\n"
+     "  ) baz ();\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar #(\n"
+     "        .first (1)  /* c1 */\n"
+     "      , .second(2)  /* c2 */\n"
+     "  ) baz ();\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar#(\n"
+     "    /* c1 */.first(1)\n"
+     "    /* c2 */, .second(2)\n"
+     "  ) baz ();\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar #(\n"
+     "      /* c1 */  .first (1)\n"
+     "      /* c2 */, .second(2)\n"
+     "  ) baz ();\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar#(\n"
+     "    .first(1)\n"
+     "    /* c1 */\n"
+     "    ,\n"
+     "    .second(2)\n"
+     "    /* c2 */\n"
+     "  ) baz ();\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar #(\n"
+     "        .first (1)\n"
+     "      /* c1 */\n"
+     "      , .second(2)\n"
+     "      /* c2 */\n"
+     "  ) baz ();\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar#(\n"
+     "    .first(1)\n"
+     "    /* c1 */\n"
+     "    , .second(2)\n"
+     "    /* c2 */\n"
+     "  ) baz ();\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar #(\n"
+     "        .first (1)\n"
+     "      /* c1 */\n"
+     "      , .second(2)\n"
+     "      /* c2 */\n"
+     "  ) baz ();\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar#(\n"
+     "    .first(1)\n"
+     "    /* c1 */\n"
+     "    , /* c2 */\n"
+     "    .second(2)\n"
+     "    /* c3 */\n"
+     "  ) baz ();\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar #(\n"
+     "      .first (1)\n"
+     "      /* c1 */\n"
+     "      ,  /* c2 */\n"
+     "      .second(2)\n"
+     "      /* c3 */\n"
+     "  ) baz ();\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar#(\n"
+     "    .first(1)\n"
+     "    /* c1 */\n"
+     "    , /* c2 */\n"
+     "    .second(2)\n"
+     "    /* c3 */\n"
+     "  ) baz ();\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar #(\n"
+     "      .first (1)\n"
+     "      /* c1 */\n"
+     "      ,  /* c2 */\n"
+     "      .second(2)\n"
+     "      /* c3 */\n"
+     "  ) baz ();\n"
+     "endmodule\n"},
+    {"module foo;\n"
+     "  bar#(\n"
+     "    /* c1  */\n"
+     "    /* c1+ */\n"
+     "    .first(1) /* c2  */\n"
+     "              /* c2+ */\n"
+     "    , /* c3  */\n"
+     "      /* c3+ */\n"
+     "    .second(2) /* c4  */\n"
+     "               /* c4+ */\n"
+     "    /* c5  */\n"
+     "    /* c5+ */\n"
+     "  ) baz ();\n"
+     "endmodule\n",
+     "module foo;\n"
+     "  bar #(\n"
+     "      /* c1  */\n"
+     "      /* c1+ */\n"
+     "      .first (1)  /* c2  */\n"
+     "      /* c2+ */\n"
+     "      ,  /* c3  */\n"
+     "      /* c3+ */\n"
+     "      .second(2)  /* c4  */\n"
+     "      /* c4+ */\n"
+     "      /* c5  */\n"
+     "      /* c5+ */\n"
+     "  ) baz ();\n"
+     "endmodule\n"},
+
+    // ":" and "'{" in a single line
+    {"assign foo[2] =\n"
+     "'{\n"
+     "bar: 1'b1,  // c\n"
+     "baz: 1'b0,  // c\n"
+     "foobar: CONSTANT,\n"
+     "qux:\n"
+     "{\n"
+     "a,  // c\n"
+     "b\n"
+     "}\n"
+     "};\n",
+     "assign foo[2] = '{\n"
+     "        bar: 1'b1,  // c\n"
+     "        baz: 1'b0,  // c\n"
+     "        foobar: CONSTANT,\n"
+     "        qux: {\n"
+     "          a,  // c\n"
+     "          b\n"
+     "        }\n"
+     "    };\n"},
+    {"assign a = (b) ? '{c: d[e], f: '1} : g;\n",
+     "assign a = (b) ?\n"
+     "    '{c: d[e], f: '1}\n"
+     "    : g;\n"},
+
+    // -----------------------------------------------------------------
+    // Comments around `else`.
+    // Check whether `else` partition is found correctly and that actual code is
+    // not appended to EOL comments.
+
+    // generate if
+
+    {"module zx;\n"
+     "if (x) assign z=y;\n"
+     "// eol-c\n"
+     "else if (r) assign z=w;\n"
+     "else assign x=y;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  if (x) assign z = y;\n"
+     "  // eol-c\n"
+     "  else if (r) assign z = w;\n"
+     "  else assign x = y;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "if (x) assign z=y;\n"
+     "// eol-c\n"
+     "// eol-c\n"
+     "else if (r) assign z=w;\n"
+     "else assign x=y;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  if (x) assign z = y;\n"
+     "  // eol-c\n"
+     "  // eol-c\n"
+     "  else if (r) assign z = w;\n"
+     "  else assign x = y;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "if (x) assign z=y;\n"
+     "else // eol-c\n"
+     "if (r) assign z=w;\n"
+     "else assign x=y;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  if (x) assign z = y;\n"
+     "  else  // eol-c\n"
+     "  if (r) assign z = w;\n"
+     "  else assign x = y;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "if (x) assign z=y;\n"
+     "else\n"
+     "// eol-c\n"
+     "if (r) assign z=w;\n"
+     "else assign x=y;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  if (x) assign z = y;\n"
+     "  else\n"
+     "  // eol-c\n"
+     "  if (r)\n"
+     "    assign z = w;\n"
+     "  else assign x = y;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "if (x) assign z=y;\n"
+     "// eol-c\n"
+     "else // eol-c\n"
+     "if (r) assign z=w;\n"
+     "else assign x=y;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  if (x) assign z = y;\n"
+     "  // eol-c\n"
+     "  else  // eol-c\n"
+     "  if (r) assign z = w;\n"
+     "  else assign x = y;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "if (x) assign z=y;\n"
+     "else // eol-c\n"
+     "// eol-c\n"
+     "if (r) assign z=w;\n"
+     "else assign x=y;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  if (x) assign z = y;\n"
+     "  else  // eol-c\n"
+     "  // eol-c\n"
+     "  if (r)\n"
+     "    assign z = w;\n"
+     "  else assign x = y;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "if (x) assign z=y;\n"
+     "// eol-c\n"
+     "else // eol-c\n"
+     "// eol-c\n"
+     "if (r) assign z=w;\n"
+     "else assign x=y;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  if (x) assign z = y;\n"
+     "  // eol-c\n"
+     "  else  // eol-c\n"
+     "  // eol-c\n"
+     "  if (r)\n"
+     "    assign z = w;\n"
+     "  else assign x = y;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "if (x) assign z=y;\n"
+     "// eol-c\n"
+     "else // eol-c\n"
+     "// eol-c\n"
+     "if\n"
+     "// eol-c\n"
+     "(r) assign z=w;\n"
+     "else assign x=y;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  if (x) assign z = y;\n"
+     "  // eol-c\n"
+     "  else  // eol-c\n"
+     "  // eol-c\n"
+     "  if\n"
+     "      // eol-c\n"
+     "      (r)\n"
+     "    assign z = w;\n"
+     "  else assign x = y;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "if (x) assign z=y;\n"
+     "// eol-c\n"
+     "// eol-c\n"
+     "else // eol-c\n"
+     "// eol-c\n"
+     "// eol-c\n"
+     "if\n"
+     "// eol-c\n"
+     "// eol-c\n"
+     "(r) assign z=w;\n"
+     "else assign x=y;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  if (x) assign z = y;\n"
+     "  // eol-c\n"
+     "  // eol-c\n"
+     "  else  // eol-c\n"
+     "  // eol-c\n"
+     "  // eol-c\n"
+     "  if\n"
+     "      // eol-c\n"
+     "      // eol-c\n"
+     "      (r)\n"
+     "    assign z = w;\n"
+     "  else assign x = y;\n"
+     "endmodule\n"},
+
+    // generate if with function call
+
+    {"module zx;\n"
+     "if (x) assign z=y;\n"
+     "// eol-c\n"
+     "else if (foo(x) == bar(1, 2)) assign z=w;\n"
+     "else assign x=y;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  if (x) assign z = y;\n"
+     "  // eol-c\n"
+     "  else if (foo(x) == bar(1, 2))\n"
+     "    assign z = w;\n"
+     "  else assign x = y;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "if (x) assign z=y;\n"
+     "// eol-c\n"
+     "// eol-c\n"
+     "else if (foo(x) == bar(1, 2)) assign z=w;\n"
+     "else assign x=y;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  if (x) assign z = y;\n"
+     "  // eol-c\n"
+     "  // eol-c\n"
+     "  else if (foo(x) == bar(1, 2))\n"
+     "    assign z = w;\n"
+     "  else assign x = y;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "if (x) assign z=y;\n"
+     "else // eol-c\n"
+     "if (foo(x) == bar(1, 2)) assign z=w;\n"
+     "else assign x=y;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  if (x) assign z = y;\n"
+     "  else  // eol-c\n"
+     "  if (foo(x) == bar(1, 2)) assign z = w;\n"
+     "  else assign x = y;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "if (x) assign z=y;\n"
+     "else\n"
+     "// eol-c\n"
+     "if (foo(x) == bar(1, 2)) assign z=w;\n"
+     "else assign x=y;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  if (x) assign z = y;\n"
+     "  else\n"
+     "  // eol-c\n"
+     "  if (foo(\n"
+     "          x\n"
+     "      ) == bar(\n"
+     "          1, 2\n"
+     "      ))\n"
+     "    assign z = w;\n"
+     "  else assign x = y;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "if (x) assign z=y;\n"
+     "// eol-c\n"
+     "else // eol-c\n"
+     "if (foo(x) == bar(1, 2)) assign z=w;\n"
+     "else assign x=y;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  if (x) assign z = y;\n"
+     "  // eol-c\n"
+     "  else  // eol-c\n"
+     "  if (foo(x) == bar(1, 2)) assign z = w;\n"
+     "  else assign x = y;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "if (x) assign z=y;\n"
+     "else // eol-c\n"
+     "// eol-c\n"
+     "if (foo(x) == bar(1, 2)) assign z=w;\n"
+     "else assign x=y;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  if (x) assign z = y;\n"
+     "  else  // eol-c\n"
+     "  // eol-c\n"
+     "  if (foo(\n"
+     "          x\n"
+     "      ) == bar(\n"
+     "          1, 2\n"
+     "      ))\n"
+     "    assign z = w;\n"
+     "  else assign x = y;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "if (x) assign z=y;\n"
+     "// eol-c\n"
+     "else // eol-c\n"
+     "// eol-c\n"
+     "if (foo(x) == bar(1, 2)) assign z=w;\n"
+     "else assign x=y;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  if (x) assign z = y;\n"
+     "  // eol-c\n"
+     "  else  // eol-c\n"
+     "  // eol-c\n"
+     "  if (foo(\n"
+     "          x\n"
+     "      ) == bar(\n"
+     "          1, 2\n"
+     "      ))\n"
+     "    assign z = w;\n"
+     "  else assign x = y;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "if (x) assign z=y;\n"
+     "// eol-c\n"
+     "else // eol-c\n"
+     "// eol-c\n"
+     "if\n"
+     "// eol-c\n"
+     "(foo(x) == bar(1, 2)) assign z=w;\n"
+     "else assign x=y;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  if (x) assign z = y;\n"
+     "  // eol-c\n"
+     "  else  // eol-c\n"
+     "  // eol-c\n"
+     "  if\n"
+     "      // eol-c\n"
+     "      (foo(\n"
+     "          x\n"
+     "      ) == bar(\n"
+     "          1, 2\n"
+     "      ))\n"
+     "    assign z = w;\n"
+     "  else assign x = y;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "if (x) assign z=y;\n"
+     "// eol-c\n"
+     "// eol-c\n"
+     "else // eol-c\n"
+     "// eol-c\n"
+     "// eol-c\n"
+     "if\n"
+     "// eol-c\n"
+     "// eol-c\n"
+     "(foo(x) == bar(1, 2)) assign z=w;\n"
+     "else assign x=y;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  if (x) assign z = y;\n"
+     "  // eol-c\n"
+     "  // eol-c\n"
+     "  else  // eol-c\n"
+     "  // eol-c\n"
+     "  // eol-c\n"
+     "  if\n"
+     "      // eol-c\n"
+     "      // eol-c\n"
+     "      (foo(\n"
+     "          x\n"
+     "      ) == bar(\n"
+     "          1, 2\n"
+     "      ))\n"
+     "    assign z = w;\n"
+     "  else assign x = y;\n"
+     "endmodule\n"},
+
+    // else begin
+
+    {"module zx;\n"
+     "always begin\n"
+     "if (a) b<=1;\n"
+     "// eol-c\n"
+     "else begin b<=2;\n"
+     "end\n"
+     "end\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always begin\n"
+     "    if (a) b <= 1;\n"
+     "    // eol-c\n"
+     "    else begin\n"
+     "      b <= 2;\n"
+     "    end\n"
+     "  end\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "always begin\n"
+     "if (a) b<=1;\n"
+     "// eol-c\n"
+     "// eol-c\n"
+     "else begin b<=2;\n"
+     "end\n"
+     "end\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always begin\n"
+     "    if (a) b <= 1;\n"
+     "    // eol-c\n"
+     "    // eol-c\n"
+     "    else begin\n"
+     "      b <= 2;\n"
+     "    end\n"
+     "  end\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "always begin\n"
+     "if (a) b<=1;\n"
+     "else // eol-c\n"
+     "begin b<=2;\n"
+     "end\n"
+     "end\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always begin\n"
+     "    if (a) b <= 1;\n"
+     "    else  // eol-c\n"
+     "    begin\n"
+     "      b <= 2;\n"
+     "    end\n"
+     "  end\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "always begin\n"
+     "if (a) b<=1;\n"
+     "else\n"
+     "// eol-c\n"
+     "begin b<=2;\n"
+     "end\n"
+     "end\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always begin\n"
+     "    if (a) b <= 1;\n"
+     "    else\n"
+     "    // eol-c\n"
+     "    begin\n"
+     "      b <= 2;\n"
+     "    end\n"
+     "  end\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "always begin\n"
+     "if (a) b<=1;\n"
+     "// eol-c\n"
+     "else // eol-c\n"
+     "begin b<=2;\n"
+     "end\n"
+     "end\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always begin\n"
+     "    if (a) b <= 1;\n"
+     "    // eol-c\n"
+     "    else  // eol-c\n"
+     "    begin\n"
+     "      b <= 2;\n"
+     "    end\n"
+     "  end\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "always begin\n"
+     "if (a) b<=1;\n"
+     "else // eol-c\n"
+     "// eol-c\n"
+     "begin b<=2;\n"
+     "end\n"
+     "end\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always begin\n"
+     "    if (a) b <= 1;\n"
+     "    else  // eol-c\n"
+     "    // eol-c\n"
+     "    begin\n"
+     "      b <= 2;\n"
+     "    end\n"
+     "  end\n"
+     "endmodule\n"},
+
+    // else if
+
+    {"module zx;\n"
+     "always @(clr or set)\n"
+     "if (clr) assign q=0;\n"
+     "// eol-c\n"
+     "else if (set) assign q=1;\n"
+     "else deassign q;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always @(clr or set)\n"
+     "    if (clr) assign q = 0;\n"
+     "    // eol-c\n"
+     "    else if (set) assign q = 1;\n"
+     "    else deassign q;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "always @(clr or set)\n"
+     "if (clr) assign q=0;\n"
+     "// eol-c\n"
+     "// eol-c\n"
+     "else if (set) assign q=1;\n"
+     "else deassign q;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always @(clr or set)\n"
+     "    if (clr) assign q = 0;\n"
+     "    // eol-c\n"
+     "    // eol-c\n"
+     "    else if (set) assign q = 1;\n"
+     "    else deassign q;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "always @(clr or set)\n"
+     "if (clr) assign q=0;\n"
+     "else // eol-c\n"
+     "if (set) assign q=1;\n"
+     "else deassign q;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always @(clr or set)\n"
+     "    if (clr) assign q = 0;\n"
+     "    else  // eol-c\n"
+     "    if (set) assign q = 1;\n"
+     "    else deassign q;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "always @(clr or set)\n"
+     "if (clr) assign q=0;\n"
+     "else\n"
+     "// eol-c\n"
+     "if (set) assign q=1;\n"
+     "else deassign q;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always @(clr or set)\n"
+     "    if (clr) assign q = 0;\n"
+     "    else\n"
+     "    // eol-c\n"
+     "    if (set)\n"
+     "      assign q = 1;\n"
+     "    else deassign q;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "always @(clr or set)\n"
+     "if (clr) assign q=0;\n"
+     "// eol-c\n"
+     "else // eol-c\n"
+     "if (set) assign q=1;\n"
+     "else deassign q;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always @(clr or set)\n"
+     "    if (clr) assign q = 0;\n"
+     "    // eol-c\n"
+     "    else  // eol-c\n"
+     "    if (set) assign q = 1;\n"
+     "    else deassign q;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "always @(clr or set)\n"
+     "if (clr) assign q=0;\n"
+     "else // eol-c\n"
+     "// eol-c\n"
+     "if (set) assign q=1;\n"
+     "else deassign q;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always @(clr or set)\n"
+     "    if (clr) assign q = 0;\n"
+     "    else  // eol-c\n"
+     "    // eol-c\n"
+     "    if (set)\n"
+     "      assign q = 1;\n"
+     "    else deassign q;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "always @(clr or set)\n"
+     "if (clr) assign q=0;\n"
+     "// eol-c\n"
+     "else // eol-c\n"
+     "// eol-c\n"
+     "if (set) assign q=1;\n"
+     "else deassign q;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always @(clr or set)\n"
+     "    if (clr) assign q = 0;\n"
+     "    // eol-c\n"
+     "    else  // eol-c\n"
+     "    // eol-c\n"
+     "    if (set)\n"
+     "      assign q = 1;\n"
+     "    else deassign q;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "always @(clr or set)\n"
+     "if (clr) assign q=0;\n"
+     "// eol-c\n"
+     "else // eol-c\n"
+     "// eol-c\n"
+     "if\n"
+     "// eol-c\n"
+     "(set) assign q=1;\n"
+     "else deassign q;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always @(clr or set)\n"
+     "    if (clr) assign q = 0;\n"
+     "    // eol-c\n"
+     "    else  // eol-c\n"
+     "    // eol-c\n"
+     "    if\n"
+     "        // eol-c\n"
+     "        (set)\n"
+     "      assign q = 1;\n"
+     "    else deassign q;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "always @(clr or set)\n"
+     "if (clr) assign q=0;\n"
+     "// eol-c\n"
+     "// eol-c\n"
+     "else // eol-c\n"
+     "// eol-c\n"
+     "// eol-c\n"
+     "if\n"
+     "// eol-c\n"
+     "// eol-c\n"
+     "(set) assign q=1;\n"
+     "else deassign q;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always @(clr or set)\n"
+     "    if (clr) assign q = 0;\n"
+     "    // eol-c\n"
+     "    // eol-c\n"
+     "    else  // eol-c\n"
+     "    // eol-c\n"
+     "    // eol-c\n"
+     "    if\n"
+     "        // eol-c\n"
+     "        // eol-c\n"
+     "        (set)\n"
+     "      assign q = 1;\n"
+     "    else deassign q;\n"
+     "endmodule\n"},
+
+    // else if with function call
+
+    {"module zx;\n"
+     "always @(clr or set)\n"
+     "if (clr) assign q=0;\n"
+     "// eol-c\n"
+     "else if (foo(clr, set, 1)) assign q=1;\n"
+     "else deassign q;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always @(clr or set)\n"
+     "    if (clr) assign q = 0;\n"
+     "    // eol-c\n"
+     "    else if (foo(clr, set, 1))\n"
+     "      assign q = 1;\n"
+     "    else deassign q;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "always @(clr or set)\n"
+     "if (clr) assign q=0;\n"
+     "// eol-c\n"
+     "// eol-c\n"
+     "else if (foo(clr, set, 1)) assign q=1;\n"
+     "else deassign q;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always @(clr or set)\n"
+     "    if (clr) assign q = 0;\n"
+     "    // eol-c\n"
+     "    // eol-c\n"
+     "    else if (foo(clr, set, 1))\n"
+     "      assign q = 1;\n"
+     "    else deassign q;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "always @(clr or set)\n"
+     "if (clr) assign q=0;\n"
+     "else // eol-c\n"
+     "if (foo(clr, set, 1)) assign q=1;\n"
+     "else deassign q;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always @(clr or set)\n"
+     "    if (clr) assign q = 0;\n"
+     "    else  // eol-c\n"
+     "    if (foo(clr, set, 1)) assign q = 1;\n"
+     "    else deassign q;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "always @(clr or set)\n"
+     "if (clr) assign q=0;\n"
+     "else\n"
+     "// eol-c\n"
+     "if (foo(clr, set, 1)) assign q=1;\n"
+     "else deassign q;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always @(clr or set)\n"
+     "    if (clr) assign q = 0;\n"
+     "    else\n"
+     "    // eol-c\n"
+     "    if (foo(\n"
+     "            clr, set, 1\n"
+     "        ))\n"
+     "      assign q = 1;\n"
+     "    else deassign q;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "always @(clr or set)\n"
+     "if (clr) assign q=0;\n"
+     "// eol-c\n"
+     "else // eol-c\n"
+     "if (foo(clr, set, 1)) assign q=1;\n"
+     "else deassign q;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always @(clr or set)\n"
+     "    if (clr) assign q = 0;\n"
+     "    // eol-c\n"
+     "    else  // eol-c\n"
+     "    if (foo(clr, set, 1)) assign q = 1;\n"
+     "    else deassign q;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "always @(clr or set)\n"
+     "if (clr) assign q=0;\n"
+     "else // eol-c\n"
+     "// eol-c\n"
+     "if (foo(clr, set, 1)) assign q=1;\n"
+     "else deassign q;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always @(clr or set)\n"
+     "    if (clr) assign q = 0;\n"
+     "    else  // eol-c\n"
+     "    // eol-c\n"
+     "    if (foo(\n"
+     "            clr, set, 1\n"
+     "        ))\n"
+     "      assign q = 1;\n"
+     "    else deassign q;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "always @(clr or set)\n"
+     "if (clr) assign q=0;\n"
+     "// eol-c\n"
+     "else // eol-c\n"
+     "// eol-c\n"
+     "if (foo(clr, set, 1)) assign q=1;\n"
+     "else deassign q;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always @(clr or set)\n"
+     "    if (clr) assign q = 0;\n"
+     "    // eol-c\n"
+     "    else  // eol-c\n"
+     "    // eol-c\n"
+     "    if (foo(\n"
+     "            clr, set, 1\n"
+     "        ))\n"
+     "      assign q = 1;\n"
+     "    else deassign q;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "always @(clr or set)\n"
+     "if (clr) assign q=0;\n"
+     "// eol-c\n"
+     "else // eol-c\n"
+     "// eol-c\n"
+     "if\n"
+     "// eol-c\n"
+     "(foo(clr, set, 1)) assign q=1;\n"
+     "else deassign q;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always @(clr or set)\n"
+     "    if (clr) assign q = 0;\n"
+     "    // eol-c\n"
+     "    else  // eol-c\n"
+     "    // eol-c\n"
+     "    if\n"
+     "        // eol-c\n"
+     "        (foo(\n"
+     "            clr, set, 1\n"
+     "        ))\n"
+     "      assign q = 1;\n"
+     "    else deassign q;\n"
+     "endmodule\n"},
+    {"module zx;\n"
+     "always @(clr or set)\n"
+     "if (clr) assign q=0;\n"
+     "// eol-c\n"
+     "// eol-c\n"
+     "else // eol-c\n"
+     "// eol-c\n"
+     "// eol-c\n"
+     "if\n"
+     "// eol-c\n"
+     "// eol-c\n"
+     "(foo(clr, set, 1)) assign q=1;\n"
+     "else deassign q;\n"
+     "endmodule\n",
+     "module zx;\n"
+     "  always @(clr or set)\n"
+     "    if (clr) assign q = 0;\n"
+     "    // eol-c\n"
+     "    // eol-c\n"
+     "    else  // eol-c\n"
+     "    // eol-c\n"
+     "    // eol-c\n"
+     "    if\n"
+     "        // eol-c\n"
+     "        // eol-c\n"
+     "        (foo(\n"
+     "            clr, set, 1\n"
+     "        ))\n"
+     "      assign q = 1;\n"
+     "    else deassign q;\n"
+     "endmodule\n"},
+
+    // -----------------------------------------------------------------
+    // Comments around and inside macro calls.
+
+};
+
+TEST(FormatterEndToEndTest, AlignFormatterTestCases) {
+  RunFormatterTestCases40(kAlignFormatterTestCases);
+}
+
+TEST(FormatterEndToEndTest, AlignmentGroupBoundaryNone) {
+  // Default behavior: separator comments and blank lines do NOT break groups.
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// Separator comment does not break alignment group
+       "module m;\n"
+       "assign foo  = 1'b1;\n"
+       "assign baar = 1'b0;\n"
+       "// ============\n"
+       "assign baaaaz = 1'b1;\n"
+       "assign c      = 1'b0;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  assign foo    = 1'b1;\n"
+       "  assign baar   = 1'b0;\n"
+       "  // ============\n"
+       "  assign baaaaz = 1'b1;\n"
+       "  assign c      = 1'b0;\n"
+       "endmodule\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.alignment_group_boundary = AlignmentGroupBoundary::kNone;
+  style.assignment_statement_alignment = AlignmentPolicy::kAlign;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+TEST(FormatterEndToEndTest, AlignmentGroupBoundarySeparatorComments) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// Separator comment breaks alignment group
+       "module m;\n"
+       "assign foo  = 1'b1;\n"
+       "assign baar = 1'b0;\n"
+       "// ============\n"
+       "assign baaaaz = 1'b1;\n"
+       "assign c      = 1'b0;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  assign foo  = 1'b1;\n"
+       "  assign baar = 1'b0;\n"
+       "  // ============\n"
+       "  assign baaaaz = 1'b1;\n"
+       "  assign c      = 1'b0;\n"
+       "endmodule\n"},
+      {// Dashes separator also breaks
+       "module m;\n"
+       "assign foo  = 1'b1;\n"
+       "assign baar = 1'b0;\n"
+       "// ------------\n"
+       "assign baaaaz = 1'b1;\n"
+       "assign c      = 1'b0;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  assign foo  = 1'b1;\n"
+       "  assign baar = 1'b0;\n"
+       "  // ------------\n"
+       "  assign baaaaz = 1'b1;\n"
+       "  assign c      = 1'b0;\n"
+       "endmodule\n"},
+      {// Captioned divider (text between separator runs) also breaks
+       "module m;\n"
+       "assign foo  = 1'b1;\n"
+       "assign baar = 1'b0;\n"
+       "// ------ section heading ------\n"
+       "assign baaaaz = 1'b1;\n"
+       "assign c      = 1'b0;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  assign foo  = 1'b1;\n"
+       "  assign baar = 1'b0;\n"
+       "  // ------ section heading ------\n"
+       "  assign baaaaz = 1'b1;\n"
+       "  assign c      = 1'b0;\n"
+       "endmodule\n"},
+      {// Leading-only divider run with trailing caption text
+       "module m;\n"
+       "assign foo  = 1'b1;\n"
+       "assign baar = 1'b0;\n"
+       "// ==== Registers\n"
+       "assign baaaaz = 1'b1;\n"
+       "assign c      = 1'b0;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  assign foo  = 1'b1;\n"
+       "  assign baar = 1'b0;\n"
+       "  // ==== Registers\n"
+       "  assign baaaaz = 1'b1;\n"
+       "  assign c      = 1'b0;\n"
+       "endmodule\n"},
+      {// No space after // also works
+       "module m;\n"
+       "assign foo  = 1'b1;\n"
+       "assign baar = 1'b0;\n"
+       "//============\n"
+       "assign baaaaz = 1'b1;\n"
+       "assign c      = 1'b0;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  assign foo  = 1'b1;\n"
+       "  assign baar = 1'b0;\n"
+       "  //============\n"
+       "  assign baaaaz = 1'b1;\n"
+       "  assign c      = 1'b0;\n"
+       "endmodule\n"},
+      {// Slash separator (/////) also works
+       "module m;\n"
+       "assign foo  = 1'b1;\n"
+       "assign baar = 1'b0;\n"
+       "//////////\n"
+       "assign baaaaz = 1'b1;\n"
+       "assign c      = 1'b0;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  assign foo  = 1'b1;\n"
+       "  assign baar = 1'b0;\n"
+       "  //////////\n"
+       "  assign baaaaz = 1'b1;\n"
+       "  assign c      = 1'b0;\n"
+       "endmodule\n"},
+      {// Regular comment does NOT break alignment
+       "module m;\n"
+       "assign foo  = 1'b1;\n"
+       "assign baar = 1'b0;\n"
+       "// Title text\n"
+       "assign baaaaz = 1'b1;\n"
+       "assign c      = 1'b0;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  assign foo    = 1'b1;\n"
+       "  assign baar   = 1'b0;\n"
+       "  // Title text\n"
+       "  assign baaaaz = 1'b1;\n"
+       "  assign c      = 1'b0;\n"
+       "endmodule\n"},
+      {// Multi-line comment block with separators
+       "module m;\n"
+       "assign foo  = 1'b1;\n"
+       "assign baar = 1'b0;\n"
+       "// ============\n"
+       "// Title\n"
+       "// ============\n"
+       "assign baaaaz = 1'b1;\n"
+       "assign c      = 1'b0;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  assign foo  = 1'b1;\n"
+       "  assign baar = 1'b0;\n"
+       "  // ============\n"
+       "  // Title\n"
+       "  // ============\n"
+       "  assign baaaaz = 1'b1;\n"
+       "  assign c      = 1'b0;\n"
+       "endmodule\n"},
+      {// Short repeated body (3 chars) does NOT break
+       "module m;\n"
+       "assign foo  = 1'b1;\n"
+       "assign baar = 1'b0;\n"
+       "// ---\n"
+       "assign baaaaz = 1'b1;\n"
+       "assign c      = 1'b0;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  assign foo    = 1'b1;\n"
+       "  assign baar   = 1'b0;\n"
+       "  // ---\n"
+       "  assign baaaaz = 1'b1;\n"
+       "  assign c      = 1'b0;\n"
+       "endmodule\n"},
+      {// Declarations also respect separator comments
+       "module m;\n"
+       "logic       a;\n"
+       "logic [7:0] b;\n"
+       "// ============\n"
+       "logic c_long_name;\n"
+       "logic d;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  logic       a;\n"
+       "  logic [7:0] b;\n"
+       "  // ============\n"
+       "  logic c_long_name;\n"
+       "  logic d;\n"
+       "endmodule\n"},
+      {// Statements in always blocks
+       "module m;\n"
+       "always_comb begin\n"
+       "aaaaa = b;\n"
+       "c     = 1'b0;\n"
+       "// ============\n"
+       "dd = eee;\n"
+       "ffffff = g;\n"
+       "end\n"
+       "endmodule\n",
+       "module m;\n"
+       "  always_comb begin\n"
+       "    aaaaa = b;\n"
+       "    c     = 1'b0;\n"
+       "    // ============\n"
+       "    dd     = eee;\n"
+       "    ffffff = g;\n"
+       "  end\n"
+       "endmodule\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.alignment_group_boundary = AlignmentGroupBoundary::kSeparatorComments;
+  style.assignment_statement_alignment = AlignmentPolicy::kAlign;
+  style.module_net_variable_alignment = AlignmentPolicy::kAlign;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+TEST(FormatterEndToEndTest, AlignmentGroupBoundaryBlankLines) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// Blank line breaks alignment group
+       "module m;\n"
+       "assign foo  = 1'b1;\n"
+       "assign baar = 1'b0;\n"
+       "\n"
+       "assign baaaaz = 1'b1;\n"
+       "assign c      = 1'b0;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  assign foo  = 1'b1;\n"
+       "  assign baar = 1'b0;\n"
+       "\n"
+       "  assign baaaaz = 1'b1;\n"
+       "  assign c      = 1'b0;\n"
+       "endmodule\n"},
+      {// No blank line: single alignment group
+       "module m;\n"
+       "assign foo  = 1'b1;\n"
+       "assign baar = 1'b0;\n"
+       "assign baaaaz = 1'b1;\n"
+       "assign c      = 1'b0;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  assign foo    = 1'b1;\n"
+       "  assign baar   = 1'b0;\n"
+       "  assign baaaaz = 1'b1;\n"
+       "  assign c      = 1'b0;\n"
+       "endmodule\n"},
+      {// Single item before blank line (not enough for alignment)
+       "module m;\n"
+       "assign foo = 1'b1;\n"
+       "\n"
+       "assign baaaaz = 1'b1;\n"
+       "assign c      = 1'b0;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  assign foo = 1'b1;\n"
+       "\n"
+       "  assign baaaaz = 1'b1;\n"
+       "  assign c      = 1'b0;\n"
+       "endmodule\n"},
+      {// Separator comment does NOT break (only blank lines)
+       "module m;\n"
+       "assign foo  = 1'b1;\n"
+       "assign baar = 1'b0;\n"
+       "// ============\n"
+       "assign baaaaz = 1'b1;\n"
+       "assign c      = 1'b0;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  assign foo    = 1'b1;\n"
+       "  assign baar   = 1'b0;\n"
+       "  // ============\n"
+       "  assign baaaaz = 1'b1;\n"
+       "  assign c      = 1'b0;\n"
+       "endmodule\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.alignment_group_boundary = AlignmentGroupBoundary::kBlankLines;
+  style.assignment_statement_alignment = AlignmentPolicy::kAlign;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+TEST(FormatterEndToEndTest,
+     AlignmentGroupBoundaryBlankLinesAndSeparatorComments) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// Both blank line and separator break groups
+       "module m;\n"
+       "assign foo  = 1'b1;\n"
+       "assign baar = 1'b0;\n"
+       "\n"
+       "assign baaaaz = 1'b1;\n"
+       "assign c      = 1'b0;\n"
+       "// ============\n"
+       "assign dd  = 1'b1;\n"
+       "assign eee = 1'b0;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  assign foo  = 1'b1;\n"
+       "  assign baar = 1'b0;\n"
+       "\n"
+       "  assign baaaaz = 1'b1;\n"
+       "  assign c      = 1'b0;\n"
+       "  // ============\n"
+       "  assign dd  = 1'b1;\n"
+       "  assign eee = 1'b0;\n"
+       "endmodule\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.alignment_group_boundary =
+      AlignmentGroupBoundary::kBlankLinesAndSeparatorComments;
+  style.assignment_statement_alignment = AlignmentPolicy::kAlign;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+// Verify kAlign behavior for body-level param/localparam declarations
+// in module and package bodies.
+TEST(FormatterEndToEndTest, ParamDeclarationAlignmentBasics) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// localparam alignment in module body
+       "module m;\n"
+       "localparam foo = 4'b0000;\n"
+       "localparam barr = 4'b0010;\n"
+       "localparam baaaaz = 4'b0111;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  localparam foo    = 4'b0000;\n"
+       "  localparam barr   = 4'b0010;\n"
+       "  localparam baaaaz = 4'b0111;\n"
+       "endmodule\n"},
+      {// localparam alignment in package body
+       "package p;\n"
+       "localparam foo = 4'b0000;\n"
+       "localparam barr = 4'b0010;\n"
+       "localparam baaaaz = 4'b0111;\n"
+       "endpackage\n",
+       "package p;\n"
+       "  localparam foo    = 4'b0000;\n"
+       "  localparam barr   = 4'b0010;\n"
+       "  localparam baaaaz = 4'b0111;\n"
+       "endpackage\n"},
+      {// parameter alignment in module body
+       "module m;\n"
+       "parameter int foo = 1;\n"
+       "parameter int barr = 2;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  parameter int foo  = 1;\n"
+       "  parameter int barr = 2;\n"
+       "endmodule\n"},
+      {// parameter alignment in package body
+       "package p;\n"
+       "parameter int foo = 1;\n"
+       "parameter int barrrr = 2;\n"
+       "endpackage\n",
+       "package p;\n"
+       "  parameter int foo    = 1;\n"
+       "  parameter int barrrr = 2;\n"
+       "endpackage\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+// Verify kFlushLeft behavior: body-level param/localparam declarations
+// are not aligned.
+TEST(FormatterEndToEndTest, ParamDeclarationAlignmentFlushLeft) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// module body: parameters are not aligned
+       "module m;\n"
+       "localparam foo = 4'b0000;\n"
+       "localparam barr = 4'b0010;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  localparam foo = 4'b0000;\n"
+       "  localparam barr = 4'b0010;\n"
+       "endmodule\n"},
+      {// package context: flush-left
+       "package p;\n"
+       "localparam foo = 4'b0000;\n"
+       "localparam barr = 4'b0010;\n"
+       "endpackage\n",
+       "package p;\n"
+       "  localparam foo = 4'b0000;\n"
+       "  localparam barr = 4'b0010;\n"
+       "endpackage\n"},
+      {// generate context: flush-left
+       "module m;\n"
+       "generate\n"
+       "localparam foo = 1;\n"
+       "localparam barr = 2;\n"
+       "endgenerate\n"
+       "endmodule\n",
+       "module m;\n"
+       "  generate\n"
+       "    localparam foo = 1;\n"
+       "    localparam barr = 2;\n"
+       "  endgenerate\n"
+       "endmodule\n"},
+      {// parameter in module body: flush-left
+       "module m;\n"
+       "parameter int W = 8;\n"
+       "parameter int HHHH = 2;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  parameter int W = 8;\n"
+       "  parameter int HHHH = 2;\n"
+       "endmodule\n"},
+      {// mixed parameter and localparam: flush-left, no alignment
+       "module m;\n"
+       "parameter int W = 8;\n"
+       "localparam L = 4;\n"
+       "parameter int H = 2;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  parameter int W = 8;\n"
+       "  localparam L = 4;\n"
+       "  parameter int H = 2;\n"
+       "endmodule\n"},
+      {// interface context: flush-left
+       "interface my_if;\n"
+       "localparam foo = 1;\n"
+       "localparam barr = 2;\n"
+       "endinterface\n",
+       "interface my_if;\n"
+       "  localparam foo = 1;\n"
+       "  localparam barr = 2;\n"
+       "endinterface\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.parameter_declaration_alignment = AlignmentPolicy::kFlushLeft;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+// Verify kPreserve behavior: body-level param/localparam declarations
+// maintain their existing spacing.
+TEST(FormatterEndToEndTest, ParamDeclarationAlignmentPreserve) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// module body: existing spacing is kept
+       "module m;\n"
+       "localparam foo = 4'b0000;\n"
+       "localparam barr  = 4'b0010;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  localparam foo = 4'b0000;\n"
+       "  localparam barr  = 4'b0010;\n"
+       "endmodule\n"},
+      {// package: existing flush-left spacing preserved
+       "package p;\n"
+       "localparam foo = 4'b0000;\n"
+       "localparam barr = 4'b0010;\n"
+       "endpackage\n",
+       "package p;\n"
+       "  localparam foo = 4'b0000;\n"
+       "  localparam barr = 4'b0010;\n"
+       "endpackage\n"},
+      {// generate: existing aligned spacing preserved
+       "module m;\n"
+       "generate\n"
+       "localparam foo  = 1;\n"
+       "localparam barr = 2;\n"
+       "endgenerate\n"
+       "endmodule\n",
+       "module m;\n"
+       "  generate\n"
+       "    localparam foo  = 1;\n"
+       "    localparam barr = 2;\n"
+       "  endgenerate\n"
+       "endmodule\n"},
+      {// parameter flush-left preserved
+       "module m;\n"
+       "parameter int W = 8;\n"
+       "parameter int HHHH = 2;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  parameter int W = 8;\n"
+       "  parameter int HHHH = 2;\n"
+       "endmodule\n"},
+      {// parameter pre-aligned preserved
+       "module m;\n"
+       "parameter int W    = 8;\n"
+       "parameter int HHHH = 2;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  parameter int W    = 8;\n"
+       "  parameter int HHHH = 2;\n"
+       "endmodule\n"},
+      {// interface pre-aligned preserved
+       "interface my_if;\n"
+       "localparam foo  = 1;\n"
+       "localparam barr = 2;\n"
+       "endinterface\n",
+       "interface my_if;\n"
+       "  localparam foo  = 1;\n"
+       "  localparam barr = 2;\n"
+       "endinterface\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.parameter_declaration_alignment = AlignmentPolicy::kPreserve;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+// Verify kAlign behavior for param/localparam declarations across
+// interface, generate, and module body contexts, including mixed
+// param/localparam and packed dimension alignment.
+TEST(FormatterEndToEndTest, ParamDeclarationAlignmentContexts) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// interface body localparam alignment
+       "interface my_if;\n"
+       "localparam foo = 1;\n"
+       "localparam barr = 2;\n"
+       "endinterface\n",
+       "interface my_if;\n"
+       "  localparam foo  = 1;\n"
+       "  localparam barr = 2;\n"
+       "endinterface\n"},
+      {// interface body parameter alignment
+       "interface my_if;\n"
+       "parameter int X = 1;\n"
+       "parameter int Y_LONG = 2;\n"
+       "endinterface\n",
+       "interface my_if;\n"
+       "  parameter int X      = 1;\n"
+       "  parameter int Y_LONG = 2;\n"
+       "endinterface\n"},
+      {// generate block localparam alignment
+       "module m;\n"
+       "generate\n"
+       "localparam foo = 1;\n"
+       "localparam barr = 2;\n"
+       "endgenerate\n"
+       "endmodule\n",
+       "module m;\n"
+       "  generate\n"
+       "    localparam foo  = 1;\n"
+       "    localparam barr = 2;\n"
+       "  endgenerate\n"
+       "endmodule\n"},
+      {// generate block parameter alignment
+       "module m;\n"
+       "generate\n"
+       "parameter int A = 1;\n"
+       "parameter int BB = 2;\n"
+       "endgenerate\n"
+       "endmodule\n",
+       "module m;\n"
+       "  generate\n"
+       "    parameter int A  = 1;\n"
+       "    parameter int BB = 2;\n"
+       "  endgenerate\n"
+       "endmodule\n"},
+      {// mixed param and net declarations form separate alignment groups
+       "module m;\n"
+       "localparam X = 1;\n"
+       "localparam YYY = 2;\n"
+       "logic clk;\n"
+       "logic rst_n;\n"
+       "localparam ZZ = 3;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  localparam X   = 1;\n"
+       "  localparam YYY = 2;\n"
+       "  logic clk;\n"
+       "  logic rst_n;\n"
+       "  localparam ZZ = 3;\n"
+       "endmodule\n"},
+      {// mixed parameter and localparam in same block
+       "module m;\n"
+       "parameter int W = 8;\n"
+       "localparam L = 4;\n"
+       "parameter int H = 2;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  parameter  int W = 8;\n"
+       "  localparam     L = 4;\n"
+       "  parameter  int H = 2;\n"
+       "endmodule\n"},
+      {// packed dimensions are aligned
+       "module m;\n"
+       "parameter bit [7:0] X = 0;\n"
+       "parameter bit [31:0] YYYY = 1;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  parameter bit [ 7:0] X    = 0;\n"
+       "  parameter bit [31:0] YYYY = 1;\n"
+       "endmodule\n"},
+      {// multi-identifier comma-separated params are not split (no-crash)
+       "module m;\n"
+       "parameter int a=1, b=2, ccc=3;\n"
+       "localparam d=4, e=5;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  parameter  int a = 1, b = 2, ccc = 3;\n"
+       "  localparam     d = 4, e = 5;\n"
+       "endmodule\n"},
+      {// parameter type declarations do not crash
+       "module m;\n"
+       "parameter type T = int;\n"
+       "parameter type TT_LONG = bit;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  parameter type T = int;\n"
+       "  parameter type TT_LONG = bit;\n"
+       "endmodule\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+// Verify kInferUserIntent behavior: body-level param/localparam
+// declarations infer alignment intent from existing spacing.
+TEST(FormatterEndToEndTest, ParamDeclarationAlignmentInferUserIntent) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// flush-left localparams with small spacing diff: infer aligns
+       "module m;\n"
+       "localparam foo = 1;\n"
+       "localparam barr = 2;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  localparam foo  = 1;\n"
+       "  localparam barr = 2;\n"
+       "endmodule\n"},
+      {// pre-aligned localparams: infer preserves alignment
+       "module m;\n"
+       "localparam foo    = 1;\n"
+       "localparam barr   = 2;\n"
+       "localparam baaaaz = 3;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  localparam foo    = 1;\n"
+       "  localparam barr   = 2;\n"
+       "  localparam baaaaz = 3;\n"
+       "endmodule\n"},
+      {// flush-left params in package with small spacing diff: infer aligns
+       "package p;\n"
+       "localparam X = 1;\n"
+       "localparam YY = 2;\n"
+       "endpackage\n",
+       "package p;\n"
+       "  localparam X  = 1;\n"
+       "  localparam YY = 2;\n"
+       "endpackage\n"},
+      {// mixed param/localparam flush-left: infer keeps flush-left
+       "module m;\n"
+       "parameter int W = 8;\n"
+       "localparam L = 4;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  parameter int W = 8;\n"
+       "  localparam L = 4;\n"
+       "endmodule\n"},
+      {// interface flush-left with small diff: infer aligns
+       "interface my_if;\n"
+       "localparam foo = 1;\n"
+       "localparam barr = 2;\n"
+       "endinterface\n",
+       "interface my_if;\n"
+       "  localparam foo  = 1;\n"
+       "  localparam barr = 2;\n"
+       "endinterface\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.parameter_declaration_alignment = AlignmentPolicy::kInferUserIntent;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+// Verify boundary behavior for param declarations with
+// kBlankLinesAndSeparatorComments: both blank lines and separator comments
+// break alignment groups.
+TEST(FormatterEndToEndTest, ParamDeclarationAlignmentBoundary) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// separator comment breaks param alignment group
+       "module m;\n"
+       "localparam foo = 1;\n"
+       "localparam barr = 2;\n"
+       "// ============\n"
+       "localparam baaaaz = 1;\n"
+       "localparam c = 2;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  localparam foo  = 1;\n"
+       "  localparam barr = 2;\n"
+       "  // ============\n"
+       "  localparam baaaaz = 1;\n"
+       "  localparam c      = 2;\n"
+       "endmodule\n"},
+      {// blank line breaks param alignment group
+       "module m;\n"
+       "localparam foo = 1;\n"
+       "localparam barr = 2;\n"
+       "\n"
+       "localparam baaaaz = 1;\n"
+       "localparam c = 2;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  localparam foo  = 1;\n"
+       "  localparam barr = 2;\n"
+       "\n"
+       "  localparam baaaaz = 1;\n"
+       "  localparam c      = 2;\n"
+       "endmodule\n"},
+      {// no separator: single alignment group (all aligned together)
+       "module m;\n"
+       "localparam foo = 1;\n"
+       "localparam barr = 2;\n"
+       "localparam baaaaz = 1;\n"
+       "localparam c = 2;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  localparam foo    = 1;\n"
+       "  localparam barr   = 2;\n"
+       "  localparam baaaaz = 1;\n"
+       "  localparam c      = 2;\n"
+       "endmodule\n"},
+      {// regular comment does NOT break alignment group
+       "module m;\n"
+       "localparam foo = 1;\n"
+       "// regular comment\n"
+       "localparam barr = 2;\n"
+       "localparam baaaaz = 1;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  localparam foo    = 1;\n"
+       "  // regular comment\n"
+       "  localparam barr   = 2;\n"
+       "  localparam baaaaz = 1;\n"
+       "endmodule\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
+  style.alignment_group_boundary =
+      AlignmentGroupBoundary::kBlankLinesAndSeparatorComments;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+// Verify edge cases: unpacked dimensions, signed/unsigned, implicit types,
+// complex types, single declarations, deeply nested generate blocks.
+TEST(FormatterEndToEndTest, ParamDeclarationAlignmentEdgeCases) {
+  // Use column_limit = 80 to avoid unintended line wrapping inside
+  // deeply nested generate blocks (generate-if, generate-for), which
+  // would interfere with verifying alignment behavior.
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// unpacked dimension alignment
+       "module m;\n"
+       "parameter bit X [7:0] = 0;\n"
+       "parameter bit YYYY [15:0] = 1;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  parameter bit X   [ 7:0] = 0;\n"
+       "  parameter bit YYYY[15:0] = 1;\n"
+       "endmodule\n"},
+      {// param declarations with only type and default value (no idim)
+       "module m;\n"
+       "parameter int X = 0;\n"
+       "parameter int YYYY = 0;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  parameter int X    = 0;\n"
+       "  parameter int YYYY = 0;\n"
+       "endmodule\n"},
+      {// signed modifier with packed dimensions
+       "module m;\n"
+       "parameter bit signed [7:0] X = 0;\n"
+       "parameter bit signed [31:0] YYYY = 1;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  parameter bit signed [ 7:0] X    = 0;\n"
+       "  parameter bit signed [31:0] YYYY = 1;\n"
+       "endmodule\n"},
+      {// param with complex type (struct/typedef) — does not crash
+       "module m;\n"
+       "parameter foo_t X = foo_t'(0);\n"
+       "parameter foo_t Y_LONG = foo_t'(0);\n"
+       "endmodule\n",
+       "module m;\n"
+       "  parameter foo_t X      = foo_t'(0);\n"
+       "  parameter foo_t Y_LONG = foo_t'(0);\n"
+       "endmodule\n"},
+      {// single param declaration (not enough for alignment group)
+       "module m;\n"
+       "localparam X = 1;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  localparam X = 1;\n"
+       "endmodule\n"},
+      {// params inside generate-if block
+       "module m;\n"
+       "generate\n"
+       "if (1) begin : blk\n"
+       "localparam foo = 1;\n"
+       "localparam barr = 2;\n"
+       "end\n"
+       "endgenerate\n"
+       "endmodule\n",
+       "module m;\n"
+       "  generate\n"
+       "    if (1) begin : blk\n"
+       "      localparam foo  = 1;\n"
+       "      localparam barr = 2;\n"
+       "    end\n"
+       "  endgenerate\n"
+       "endmodule\n"},
+      {// unsigned keyword with packed dimensions (complement to signed)
+       "module m;\n"
+       "parameter bit unsigned [7:0] X = 0;\n"
+       "parameter bit unsigned [31:0] YYYY = 1;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  parameter bit unsigned [ 7:0] X    = 0;\n"
+       "  parameter bit unsigned [31:0] YYYY = 1;\n"
+       "endmodule\n"},
+      {// parameter with implicit type (no explicit type keyword)
+       "module m;\n"
+       "parameter X = 32;\n"
+       "parameter Y_LONG = 64;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  parameter X      = 32;\n"
+       "  parameter Y_LONG = 64;\n"
+       "endmodule\n"},
+      {// params inside generate-for block
+       "module m;\n"
+       "generate\n"
+       "for (i = 0; i < 2; i++) begin : blk\n"
+       "localparam foo = 1;\n"
+       "localparam barr = 2;\n"
+       "end\n"
+       "endgenerate\n"
+       "endmodule\n",
+       "module m;\n"
+       "  generate\n"
+       "    for (i = 0; i < 2; i++) begin : blk\n"
+       "      localparam foo  = 1;\n"
+       "      localparam barr = 2;\n"
+       "    end\n"
+       "  endgenerate\n"
+       "endmodule\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 80;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+// Verify parameter declarations inside generate-case blocks are aligned.
+TEST(FormatterEndToEndTest, ParamDeclarationAlignmentGenerateCase) {
+  // Params inside generate-case need wider column limit to avoid wrapping the
+  // case label / begin block line.
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// params inside generate-case block
+       "module m #(P = 0);\n"
+       "generate\n"
+       "case (P)\n"
+       "0: begin : blk\n"
+       "localparam foo = 1;\n"
+       "localparam barr = 2;\n"
+       "end\n"
+       "endcase\n"
+       "endgenerate\n"
+       "endmodule\n",
+       "module m #(\n"
+       "    P = 0\n"
+       ");\n"
+       "  generate\n"
+       "    case (P)\n"
+       "      0: begin : blk\n"
+       "        localparam foo  = 1;\n"
+       "        localparam barr = 2;\n"
+       "      end\n"
+       "    endcase\n"
+       "  endgenerate\n"
+       "endmodule\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 80;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+TEST(FormatterEndToEndTest, FormalAndBodyParamAlignmentIndependence) {
+  // Verify that --formal_parameters_alignment and
+  // --parameter_declaration_alignment act independently: setting formal params
+  // to kFlushLeft should not affect body-level param alignment, and vice versa.
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// formal flush-left + body align: only body params align
+       "module m #(\n"
+       "int W = 2,\n"
+       "int LLLL = 4\n"
+       ");\n"
+       "localparam foo = 0;\n"
+       "localparam barrrr = 0;\n"
+       "endmodule\n",
+       "module m #(\n"
+       "    int W = 2,\n"
+       "    int LLLL = 4\n"
+       ");\n"
+       "  localparam foo    = 0;\n"
+       "  localparam barrrr = 0;\n"
+       "endmodule\n"},
+      {// formal align + body flush-left: only formal params align
+       "module m #(\n"
+       "int W = 2,\n"
+       "int LLLL = 4\n"
+       ");\n"
+       "localparam foo = 0;\n"
+       "localparam barrrr = 0;\n"
+       "endmodule\n",
+       "module m #(\n"
+       "    int W    = 2,\n"
+       "    int LLLL = 4\n"
+       ");\n"
+       "  localparam foo = 0;\n"
+       "  localparam barrrr = 0;\n"
+       "endmodule\n"},
+      {// both flush-left: no alignment anywhere
+       "module m #(\n"
+       "int W = 2,\n"
+       "int LLLL = 4\n"
+       ");\n"
+       "localparam foo = 0;\n"
+       "localparam barrrr = 0;\n"
+       "endmodule\n",
+       "module m #(\n"
+       "    int W = 2,\n"
+       "    int LLLL = 4\n"
+       ");\n"
+       "  localparam foo = 0;\n"
+       "  localparam barrrr = 0;\n"
+       "endmodule\n"},
+      {// both align: both formal and body params aligned
+       "module m #(\n"
+       "int W = 2,\n"
+       "int LLLL = 4\n"
+       ");\n"
+       "localparam foo = 0;\n"
+       "localparam barrrr = 0;\n"
+       "endmodule\n",
+       "module m #(\n"
+       "    int W    = 2,\n"
+       "    int LLLL = 4\n"
+       ");\n"
+       "  localparam foo    = 0;\n"
+       "  localparam barrrr = 0;\n"
+       "endmodule\n"},
+  };
+  // First case: formal kFlushLeft, body kAlign
+  {
+    FormatStyle style;
+    style.column_limit = 40;
+    style.indentation_spaces = 2;
+    style.wrap_spaces = 4;
+    style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
+    style.formal_parameters_alignment = AlignmentPolicy::kFlushLeft;
+    const auto &tc = kTestCases[0];
+    VLOG(1) << "code-to-format:\n" << tc.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
+  }
+  // Second case: formal kAlign, body kFlushLeft
+  {
+    FormatStyle style;
+    style.column_limit = 40;
+    style.indentation_spaces = 2;
+    style.wrap_spaces = 4;
+    style.parameter_declaration_alignment = AlignmentPolicy::kFlushLeft;
+    style.formal_parameters_alignment = AlignmentPolicy::kAlign;
+    const auto &tc = kTestCases[1];
+    VLOG(1) << "code-to-format:\n" << tc.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
+  }
+  // Third case: both kFlushLeft
+  {
+    FormatStyle style;
+    style.column_limit = 40;
+    style.indentation_spaces = 2;
+    style.wrap_spaces = 4;
+    style.parameter_declaration_alignment = AlignmentPolicy::kFlushLeft;
+    style.formal_parameters_alignment = AlignmentPolicy::kFlushLeft;
+    const auto &tc = kTestCases[2];
+    VLOG(1) << "code-to-format:\n" << tc.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
+  }
+  // Fourth case: both kAlign
+  {
+    FormatStyle style;
+    style.column_limit = 40;
+    style.indentation_spaces = 2;
+    style.wrap_spaces = 4;
+    style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
+    style.formal_parameters_alignment = AlignmentPolicy::kAlign;
+    const auto &tc = kTestCases[3];
+    VLOG(1) << "code-to-format:\n" << tc.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
+  }
+}
+
+TEST(FormatterEndToEndTest, ClassBodyParamNotAffected) {
+  // Verify that class body parameter/localparam declarations are NOT affected
+  // by --parameter_declaration_alignment, which targets only module/generate/
+  // package/interface body-level params.
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// class body params are not affected
+       "class c;\n"
+       "parameter int X = 1;\n"
+       "parameter int YYYY = 2;\n"
+       "localparam foo = 3;\n"
+       "localparam barrrr = 4;\n"
+       "endclass\n",
+       "class c;\n"
+       "  parameter int X = 1;\n"
+       "  parameter int YYYY = 2;\n"
+       "  localparam foo = 3;\n"
+       "  localparam barrrr = 4;\n"
+       "endclass\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+TEST(FormatterEndToEndTest, PackageBodyVariableAlignment) {
+  // Verify that moving kPackageItemList to kTabularAlignment in tree-unwrapper
+  // enables net/variable declaration alignment in package bodies via
+  // module_net_variable_alignment.
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// net/variable declaration alignment in package body
+       "package p;\n"
+       "logic [7:0] a;\n"
+       "logic [31:0] bb;\n"
+       "endpackage\n",
+       "package p;\n"
+       "  logic [ 7:0] a;\n"
+       "  logic [31:0] bb;\n"
+       "endpackage\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.module_net_variable_alignment = AlignmentPolicy::kAlign;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+TEST(FormatterEndToEndTest, ParamDeclarationAlignmentApplyToAll) {
+  // Verify that ApplyToAllAlignmentPolicies affects
+  // parameter_declaration_alignment for all four alignment policies.
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// kAlign aligns identifiers and = signs across declarations
+       "module m;\n"
+       "localparam foo = 1;\n"
+       "localparam barrrr = 2;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  localparam foo    = 1;\n"
+       "  localparam barrrr = 2;\n"
+       "endmodule\n"},
+      {// kFlushLeft: declarations remain flush-left
+       "module m;\n"
+       "localparam foo = 1;\n"
+       "localparam barrrr = 2;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  localparam foo = 1;\n"
+       "  localparam barrrr = 2;\n"
+       "endmodule\n"},
+      {// kPreserve: existing spacing is kept
+       "module m;\n"
+       "localparam foo = 1;\n"
+       "localparam barrrr  = 2;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  localparam foo = 1;\n"
+       "  localparam barrrr  = 2;\n"
+       "endmodule\n"},
+      {// kInferUserIntent: large identifier width difference (3 cols)
+       // suggests flush-left intent, no alignment.
+       "module m;\n"
+       "localparam foo = 1;\n"
+       "localparam barrrr = 2;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  localparam foo = 1;\n"
+       "  localparam barrrr = 2;\n"
+       "endmodule\n"},
+  };
+  // kAlign
+  {
+    FormatStyle style;
+    style.column_limit = 40;
+    style.indentation_spaces = 2;
+    style.wrap_spaces = 4;
+    style.ApplyToAllAlignmentPolicies(AlignmentPolicy::kAlign);
+    const auto &tc = kTestCases[0];
+    std::ostringstream stream;
+    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
+  }
+  // kFlushLeft
+  {
+    FormatStyle style;
+    style.column_limit = 40;
+    style.indentation_spaces = 2;
+    style.wrap_spaces = 4;
+    style.ApplyToAllAlignmentPolicies(AlignmentPolicy::kFlushLeft);
+    const auto &tc = kTestCases[1];
+    std::ostringstream stream;
+    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
+  }
+  // kPreserve
+  {
+    FormatStyle style;
+    style.column_limit = 40;
+    style.indentation_spaces = 2;
+    style.wrap_spaces = 4;
+    style.ApplyToAllAlignmentPolicies(AlignmentPolicy::kPreserve);
+    const auto &tc = kTestCases[2];
+    std::ostringstream stream;
+    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
+  }
+  // kInferUserIntent
+  {
+    FormatStyle style;
+    style.column_limit = 40;
+    style.indentation_spaces = 2;
+    style.wrap_spaces = 4;
+    style.ApplyToAllAlignmentPolicies(AlignmentPolicy::kInferUserIntent);
+    const auto &tc = kTestCases[3];
+    std::ostringstream stream;
+    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
+  }
+}
+
+// Verify that alignment_group_boundary=kBlankLines treats only blank lines
+// (not separator comments) as boundary breaks for param declarations.
+TEST(FormatterEndToEndTest, ParamDeclarationAlignmentBoundaryBlankLines) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// Only blank line breaks group; separator comment does not
+       "module m;\n"
+       "localparam foo = 1;\n"
+       "localparam barr = 2;\n"
+       "\n"
+       "localparam baaaaz = 1;\n"
+       "localparam c = 2;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  localparam foo  = 1;\n"
+       "  localparam barr = 2;\n"
+       "\n"
+       "  localparam baaaaz = 1;\n"
+       "  localparam c      = 2;\n"
+       "endmodule\n"},
+      {// Separator comment does NOT break group with kBlankLines
+       "module m;\n"
+       "localparam foo = 1;\n"
+       "localparam barr = 2;\n"
+       "// ============\n"
+       "localparam baaaaz = 1;\n"
+       "localparam c = 2;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  localparam foo    = 1;\n"
+       "  localparam barr   = 2;\n"
+       "  // ============\n"
+       "  localparam baaaaz = 1;\n"
+       "  localparam c      = 2;\n"
+       "endmodule\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
+  style.alignment_group_boundary = AlignmentGroupBoundary::kBlankLines;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+// Verify that alignment_group_boundary=kNone keeps all param declarations
+// in a single alignment group regardless of blank lines or comments.
+TEST(FormatterEndToEndTest, ParamDeclarationAlignmentBoundaryNone) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// Blank line does NOT break group with kNone
+       "module m;\n"
+       "localparam foo = 1;\n"
+       "localparam barr = 2;\n"
+       "\n"
+       "localparam baaaaz = 1;\n"
+       "localparam c = 2;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  localparam foo    = 1;\n"
+       "  localparam barr   = 2;\n"
+       "\n"
+       "  localparam baaaaz = 1;\n"
+       "  localparam c      = 2;\n"
+       "endmodule\n"},
+      {// Separator comment does NOT break group with kNone
+       "module m;\n"
+       "localparam foo = 1;\n"
+       "localparam barr = 2;\n"
+       "// ============\n"
+       "localparam baaaaz = 1;\n"
+       "localparam c = 2;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  localparam foo    = 1;\n"
+       "  localparam barr   = 2;\n"
+       "  // ============\n"
+       "  localparam baaaaz = 1;\n"
+       "  localparam c      = 2;\n"
+       "endmodule\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
+  style.alignment_group_boundary = AlignmentGroupBoundary::kNone;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+// Verify that alignment_group_boundary=kSeparatorComments treats only
+// separator comments (not blank lines) as boundary breaks for param
+// declarations.
+TEST(FormatterEndToEndTest,
+     ParamDeclarationAlignmentBoundarySeparatorComments) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// Separator comment breaks alignment group
+       "module m;\n"
+       "localparam foo = 1;\n"
+       "localparam barr = 2;\n"
+       "// ============\n"
+       "localparam baaaaz = 1;\n"
+       "localparam c = 2;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  localparam foo  = 1;\n"
+       "  localparam barr = 2;\n"
+       "  // ============\n"
+       "  localparam baaaaz = 1;\n"
+       "  localparam c      = 2;\n"
+       "endmodule\n"},
+      {// Blank line does NOT break group with kSeparatorComments
+       "module m;\n"
+       "localparam foo = 1;\n"
+       "localparam barr = 2;\n"
+       "\n"
+       "localparam baaaaz = 1;\n"
+       "localparam c = 2;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  localparam foo    = 1;\n"
+       "  localparam barr   = 2;\n"
+       "\n"
+       "  localparam baaaaz = 1;\n"
+       "  localparam c      = 2;\n"
+       "endmodule\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
+  style.alignment_group_boundary = AlignmentGroupBoundary::kSeparatorComments;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+// Verify that class body parameter/localparam declarations are NOT affected
+// by --parameter_declaration_alignment for the kFlushLeft, kPreserve,
+// and kInferUserIntent policies (kAlign is covered in
+// ClassBodyParamNotAffected).
+TEST(FormatterEndToEndTest, ClassBodyParamNotAffectedOtherPolicies) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// kFlushLeft: class body params remain flush-left
+       "class c;\n"
+       "parameter int X = 1;\n"
+       "parameter int YYYY = 2;\n"
+       "localparam foo = 3;\n"
+       "localparam barrrr = 4;\n"
+       "endclass\n",
+       "class c;\n"
+       "  parameter int X = 1;\n"
+       "  parameter int YYYY = 2;\n"
+       "  localparam foo = 3;\n"
+       "  localparam barrrr = 4;\n"
+       "endclass\n"},
+      {// kPreserve: parameter_declaration_alignment does not apply to class
+       // bodies; whitespace is normalized by default formatting.
+       "class c;\n"
+       "parameter int X     = 1;\n"
+       "parameter int YYYY  = 2;\n"
+       "endclass\n",
+       "class c;\n"
+       "  parameter int X = 1;\n"
+       "  parameter int YYYY = 2;\n"
+       "endclass\n"},
+      {// kInferUserIntent: class body params infer flush-left
+       "class c;\n"
+       "parameter int X = 1;\n"
+       "parameter int YYYY = 2;\n"
+       "endclass\n",
+       "class c;\n"
+       "  parameter int X = 1;\n"
+       "  parameter int YYYY = 2;\n"
+       "endclass\n"},
+  };
+  // kFlushLeft
+  {
+    FormatStyle style;
+    style.column_limit = 40;
+    style.indentation_spaces = 2;
+    style.wrap_spaces = 4;
+    style.parameter_declaration_alignment = AlignmentPolicy::kFlushLeft;
+    const auto &tc = kTestCases[0];
+    std::ostringstream stream;
+    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
+  }
+  // kPreserve
+  {
+    FormatStyle style;
+    style.column_limit = 40;
+    style.indentation_spaces = 2;
+    style.wrap_spaces = 4;
+    style.parameter_declaration_alignment = AlignmentPolicy::kPreserve;
+    const auto &tc = kTestCases[1];
+    std::ostringstream stream;
+    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
+  }
+  // kInferUserIntent
+  {
+    FormatStyle style;
+    style.column_limit = 40;
+    style.indentation_spaces = 2;
+    style.wrap_spaces = 4;
+    style.parameter_declaration_alignment = AlignmentPolicy::kInferUserIntent;
+    const auto &tc = kTestCases[2];
+    std::ostringstream stream;
+    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
+  }
+}
+
+// Verify formal_parameters_alignment and parameter_declaration_alignment
+// independence for kPreserve and kInferUserIntent combinations.
+TEST(FormatterEndToEndTest,
+     FormalAndBodyParamAlignmentIndependenceOtherPolicies) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// formal kPreserve + body kAlign: only body params aligned
+       "module m #(\n"
+       "int W = 2,\n"
+       "int LLLL = 4\n"
+       ");\n"
+       "localparam foo = 0;\n"
+       "localparam barrrr = 0;\n"
+       "endmodule\n",
+       "module m #(\n"
+       "    int W = 2,\n"
+       "    int LLLL = 4\n"
+       ");\n"
+       "  localparam foo    = 0;\n"
+       "  localparam barrrr = 0;\n"
+       "endmodule\n"},
+      {// formal kAlign + body kPreserve: only formal params aligned
+       "module m #(\n"
+       "int W = 2,\n"
+       "int LLLL = 4\n"
+       ");\n"
+       "localparam foo   = 0;\n"
+       "localparam barrrr = 0;\n"
+       "endmodule\n",
+       "module m #(\n"
+       "    int W    = 2,\n"
+       "    int LLLL = 4\n"
+       ");\n"
+       "  localparam foo   = 0;\n"
+       "  localparam barrrr = 0;\n"
+       "endmodule\n"},
+      {// formal kInferUserIntent + body kAlign: only body params aligned
+       "module m #(\n"
+       "int W = 2,\n"
+       "int LLLL = 4\n"
+       ");\n"
+       "localparam foo = 0;\n"
+       "localparam barrrr = 0;\n"
+       "endmodule\n",
+       "module m #(\n"
+       "    int W = 2,\n"
+       "    int LLLL = 4\n"
+       ");\n"
+       "  localparam foo    = 0;\n"
+       "  localparam barrrr = 0;\n"
+       "endmodule\n"},
+  };
+  // formal kPreserve + body kAlign
+  {
+    FormatStyle style;
+    style.column_limit = 40;
+    style.indentation_spaces = 2;
+    style.wrap_spaces = 4;
+    style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
+    style.formal_parameters_alignment = AlignmentPolicy::kPreserve;
+    const auto &tc = kTestCases[0];
+    std::ostringstream stream;
+    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
+  }
+  // formal kAlign + body kPreserve
+  {
+    FormatStyle style;
+    style.column_limit = 40;
+    style.indentation_spaces = 2;
+    style.wrap_spaces = 4;
+    style.parameter_declaration_alignment = AlignmentPolicy::kPreserve;
+    style.formal_parameters_alignment = AlignmentPolicy::kAlign;
+    const auto &tc = kTestCases[1];
+    std::ostringstream stream;
+    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
+  }
+  // formal kInferUserIntent + body kAlign
+  {
+    FormatStyle style;
+    style.column_limit = 40;
+    style.indentation_spaces = 2;
+    style.wrap_spaces = 4;
+    style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
+    style.formal_parameters_alignment = AlignmentPolicy::kInferUserIntent;
+    const auto &tc = kTestCases[2];
+    std::ostringstream stream;
+    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
+  }
+}
+
+// Verify parameter declarations with string, real, and function-call default
+// value types to exercise the ColumnSchemaScanner on non-standard type tokens.
+TEST(FormatterEndToEndTest, ParamDeclarationAlignmentTypeVariants) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// parameter real type
+       "module m;\n"
+       "parameter real X = 1.0;\n"
+       "parameter real Y_LONG = 2.0;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  parameter real X      = 1.0;\n"
+       "  parameter real Y_LONG = 2.0;\n"
+       "endmodule\n"},
+      {// parameter string type
+       "module m;\n"
+       "parameter string s = \"hello\";\n"
+       "parameter string long_s = \"world\";\n"
+       "endmodule\n",
+       "module m;\n"
+       "  parameter string s      = \"hello\";\n"
+       "  parameter string long_s = \"world\";\n"
+       "endmodule\n"},
+      {// parameter with function call in default value
+       "module m;\n"
+       "parameter int W = func(1, 2);\n"
+       "parameter int H_LONG = other(3);\n"
+       "endmodule\n",
+       "module m;\n"
+       "  parameter int W      = func(1, 2);\n"
+       "  parameter int H_LONG = other(3);\n"
+       "endmodule\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+// Verify parameter_declaration_alignment kInferUserIntent in package bodies.
+TEST(FormatterEndToEndTest, ParamDeclarationAlignmentPackageInfer) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// flush-left params with small diff: infer aligns
+       "package p;\n"
+       "localparam foo = 1;\n"
+       "localparam barr = 2;\n"
+       "endpackage\n",
+       "package p;\n"
+       "  localparam foo  = 1;\n"
+       "  localparam barr = 2;\n"
+       "endpackage\n"},
+      {// pre-aligned params: infer preserves
+       "package p;\n"
+       "localparam foo    = 1;\n"
+       "localparam barr   = 2;\n"
+       "localparam baaaaz = 3;\n"
+       "endpackage\n",
+       "package p;\n"
+       "  localparam foo    = 1;\n"
+       "  localparam barr   = 2;\n"
+       "  localparam baaaaz = 3;\n"
+       "endpackage\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.parameter_declaration_alignment = AlignmentPolicy::kInferUserIntent;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+// Verify parameter_declaration_alignment boundary behavior in package bodies.
+TEST(FormatterEndToEndTest, ParamDeclarationAlignmentPackageBoundary) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// blank line breaks alignment group in package
+       "package p;\n"
+       "localparam foo = 1;\n"
+       "localparam barr = 2;\n"
+       "\n"
+       "localparam baaaaz = 1;\n"
+       "localparam c = 2;\n"
+       "endpackage\n",
+       "package p;\n"
+       "  localparam foo  = 1;\n"
+       "  localparam barr = 2;\n"
+       "\n"
+       "  localparam baaaaz = 1;\n"
+       "  localparam c      = 2;\n"
+       "endpackage\n"},
+      {// separator comment breaks alignment group in package
+       "package p;\n"
+       "localparam foo = 1;\n"
+       "localparam barr = 2;\n"
+       "// ============\n"
+       "localparam baaaaz = 1;\n"
+       "localparam c = 2;\n"
+       "endpackage\n",
+       "package p;\n"
+       "  localparam foo  = 1;\n"
+       "  localparam barr = 2;\n"
+       "  // ============\n"
+       "  localparam baaaaz = 1;\n"
+       "  localparam c      = 2;\n"
+       "endpackage\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
+  style.alignment_group_boundary =
+      AlignmentGroupBoundary::kBlankLinesAndSeparatorComments;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+// Verify the most common default scenario: both formal_parameters_alignment
+// and parameter_declaration_alignment set to kInferUserIntent.
+TEST(FormatterEndToEndTest, BothParamAlignmentsInferUserIntent) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// both flush-left with small diff: infer aligns both formal and body
+       "module m #(\n"
+       "int W = 2,\n"
+       "int LL = 4\n"
+       ");\n"
+       "localparam foo = 0;\n"
+       "localparam barr = 0;\n"
+       "endmodule\n",
+       "module m #(\n"
+       "    int W  = 2,\n"
+       "    int LL = 4\n"
+       ");\n"
+       "  localparam foo  = 0;\n"
+       "  localparam barr = 0;\n"
+       "endmodule\n"},
+      {// both infer: pre-aligned formal, pre-aligned body preserved
+       "module m #(\n"
+       "int W    = 2,\n"
+       "int LLLL = 4\n"
+       ");\n"
+       "localparam foo    = 0;\n"
+       "localparam barrrr = 0;\n"
+       "endmodule\n",
+       "module m #(\n"
+       "    int W    = 2,\n"
+       "    int LLLL = 4\n"
+       ");\n"
+       "  localparam foo    = 0;\n"
+       "  localparam barrrr = 0;\n"
+       "endmodule\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.parameter_declaration_alignment = AlignmentPolicy::kInferUserIntent;
+  style.formal_parameters_alignment = AlignmentPolicy::kInferUserIntent;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+// Verify that a large multi-line comment block between parameter
+// declarations does not crash the formatter.  The tree-unwrapper may
+// produce a partition structure where the comment tokens are absorbed
+// into the following parameter partition, which the alignment code
+// must handle gracefully by skipping alignment for that row.
+TEST(FormatterEndToEndTest, ParamDeclarationAlignmentCommentBlockNoCrash) {
+  // These inputs contain large multi-line comment blocks between
+  // parameter/localparam declarations.  The formatter must not crash
+  // (SIGABRT).  Output correctness is secondary; the formatter may
+  // fall back to preserving the original input when the partition
+  // structure prevents safe alignment.
+  const char *kInputs[] = {
+      "module m;\n"
+      "parameter int W = 8;\n"
+      "// Multi-line comment block\n"
+      "// that spans across\n"
+      "//\n"
+      "// several lines\n"
+      "// of explanatory text\n"
+      "//\n"
+      "// It contains enough\n"
+      "// lines to trigger\n"
+      "// the partition structure\n"
+      "// edge case where\n"
+      "// comment tokens are\n"
+      "// absorbed into the\n"
+      "// following parameter\n"
+      "// partition.\n"
+      "//\n"
+      "localparam int H = 2;\n"
+      "endmodule\n",
+      "package p;\n"
+      "parameter int X = 1;\n"
+      "// Long comment block\n"
+      "// with many lines\n"
+      "//\n"
+      "// of text\n"
+      "//\n"
+      "localparam int Y = 2;\n"
+      "endpackage\n",
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
+  for (const char *input : kInputs) {
+    VLOG(1) << "code-to-format:\n" << input << "<EOF>";
+    std::ostringstream stream;
+    const auto status = FormatVerilog(input, "<filename>", style, stream);
+    // The primary requirement is that the formatter does not crash
+    // (SIGABRT).  Gtest will report failure if the process aborts.
+    // The partition structure may cause output format differences;
+    // the important thing is the formatter handled it gracefully.
+  }
+}
+
+}  // namespace
+}  // namespace formatter
+}  // namespace verilog
diff --git a/verible/verilog/formatting/formatter_class_package_test.cc b/verible/verilog/formatting/formatter_class_package_test.cc
new file mode 100644
index 0000000..0c5e067
--- /dev/null
+++ b/verible/verilog/formatting/formatter_class_package_test.cc
@@ -0,0 +1,974 @@
+// Copyright 2017-2026 The Verible Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Test cases in this file should be *insensitive* to wrapping penalties.
+// Penalty-sensitive tests belong in formatter-tuning_test.cc.
+
+#include "gtest/gtest.h"
+#include "verible/verilog/formatting/formatter-test-utils.h"
+
+namespace verilog {
+namespace formatter {
+namespace {
+
+static constexpr FormatterTestCase kClassPackageFormatterTestCases[] = {
+    // interface test cases
+    {// two interface declarations
+     " interface if1 ; endinterface\t\t"
+     "interface  if2; endinterface   ",
+     "interface if1;\n"
+     "endinterface\n"
+     "interface if2;\n"
+     "endinterface\n"},
+    {// two interface declarations, end labels
+     " interface if1 ; endinterface:if1\t\t"
+     "interface  if2; endinterface    :  if2   ",
+     "interface if1;\n"
+     "endinterface : if1\n"
+     "interface if2;\n"
+     "endinterface : if2\n"},
+    {// interface declaration with parameters
+     " interface if1#( parameter int W= 8 );endinterface\t\t",
+     "interface if1 #(\n"
+     "    parameter int W = 8\n"
+     ");\n"
+     "endinterface\n"},
+    {// interface declaration with ports (empty)
+     " interface if1()\n;endinterface\t\t",
+     "interface if1 ();\n"
+     "endinterface\n"},
+    {// interface declaration with parameter comment only, empty ports
+     " interface if1#( \n"
+     "//param\n"
+     ")();endinterface\t\t",
+     "interface if1 #(\n"
+     "    //param\n"
+     ") ();\n"
+     "endinterface\n"},
+    {// interface declaration with parameter, empty ports
+     " interface if1#( parameter int W= 8 )();endinterface\t\t",
+     "interface if1 #(\n"
+     "    parameter int W = 8\n"
+     ") ();\n"
+     "endinterface\n"},
+    {// interface declaration with ports
+     " interface if1( input\tlogic   z)\n;endinterface\t\t",
+     "interface if1 (\n"
+     "    input logic z\n"
+     ");\n"
+     "endinterface\n"},
+    {// interface declaration with multiple ports
+     " interface if1( input\tlogic   z, output logic a)\n;endinterface\t\t",
+     "interface if1 (\n"
+     "    input  logic z,\n"  // should be one-per-line, even it it fits
+     "    output logic a\n"   // aligned
+     ");\n"
+     "endinterface\n"},
+    {// interface declaration with parameters and ports
+     " interface if1#( parameter int W= 8 )(input logic z);endinterface\t\t",
+     // doesn't fit on one line
+     "interface if1 #(\n"
+     "    parameter int W = 8\n"
+     ") (\n"
+     "    input logic z\n"
+     ");\n"
+     "endinterface\n"},
+    {
+        // interface with modport declarations
+        "interface\tfoo_if  ;"
+        "modport  mp1\t( output a, input b);"
+        "modport\tmp2  (output c,input d );\t"
+        "endinterface",
+        "interface foo_if;\n"
+        "  modport mp1(output a, input b);\n"
+        "  modport mp2(output c, input d);\n"
+        "endinterface\n",
+    },
+    {
+        // interface with long modport port names
+        "interface\tfoo_if  ;"
+        "modport  mp1\t( output a_long_output, input detailed_input_name);"
+        "endinterface",
+        "interface foo_if;\n"
+        "  modport mp1(\n"
+        "      output a_long_output,\n"
+        "      input detailed_input_name\n"
+        "  );\n"
+        "endinterface\n",
+    },
+    {
+        // interface with modport declaration with multiple ports
+        "interface\tfoo_if  ;"
+        "modport  mp1\t( output a_long_output, input detailed_input_name);"
+        "endinterface",
+        "interface foo_if;\n"
+        "  modport mp1(\n"
+        "      output a_long_output,\n"
+        "      input detailed_input_name\n"
+        "  );\n"
+        "endinterface\n",
+    },
+    {
+        // interface with modport TF port declaration
+        "interface\tfoo_if  ;"
+        "modport  mp1\t( output a, input b, import c);"
+        "endinterface",
+        "interface foo_if;\n"
+        "  modport mp1(\n"
+        "      output a,\n"
+        "      input b,\n"
+        "      import c\n"
+        "  );\n"
+        "endinterface\n",
+    },
+    {
+        // interface with complex modport ports list
+        "interface\tfoo_if  ;"
+        "modport producer\t(input ready,\toutput data, valid, user,"
+        " strobe, keep, last,\timport producer_reset, producer_tick);"
+        "modport consumer\t(input data, valid, user, strobe, keep, last,"
+        " output ready,\timport consumer_reset, consumer_tick, consume);"
+        "endinterface",
+        "interface foo_if;\n"
+        "  modport producer(\n"
+        "      input ready,\n"
+        "      output data, valid, user, strobe,\n"
+        "          keep, last,\n"
+        "      import producer_reset,\n"
+        "          producer_tick\n"
+        "  );\n"
+        "  modport consumer(\n"
+        "      input data, valid, user, strobe,\n"
+        "          keep, last,\n"
+        "      output ready,\n"
+        "      import consumer_reset,\n"
+        "          consumer_tick, consume\n"
+        "  );\n"
+        "endinterface\n",
+    },
+    {
+        // interface with modports and comments inside
+        "interface foo_if;\n"
+        " modport mp1(\n"
+        "  // Our output\n"
+        "     output a,\n"
+        "  /* Inputs */\n"
+        "      input b1, b_f /*last*/,"
+        "  import c\n"
+        "  );\n"
+        "endinterface\n",
+        "interface foo_if;\n"
+        "  modport mp1(\n"
+        "      // Our output\n"
+        "      output a,\n"
+        "      /* Inputs */\n"
+        "      input b1, b_f  /*last*/,\n"
+        "      import c\n"
+        "  );\n"
+        "endinterface\n",
+    },
+
+    // class test cases
+    {"class action;int xyz;endclass  :  action\n",
+     "class action;\n"
+     "  int xyz;\n"
+     "endclass : action\n"},
+    {"class action  extends mypkg :: inaction;endclass  :  action\n",
+     "class action extends mypkg::inaction;\n"  // tests for spacing around ::
+     "endclass : action\n"},
+    {"class c;function new;endfunction endclass",
+     "class c;\n"
+     "  function new;\n"
+     "  endfunction\n"
+     "endclass\n"},
+    {"class c;function new ( );endfunction endclass",
+     "class c;\n"
+     "  function new();\n"
+     "  endfunction\n"
+     "endclass\n"},
+    {"class c;function new ( string s );endfunction endclass",
+     "class c;\n"
+     "  function new(string s);\n"
+     "  endfunction\n"
+     "endclass\n"},
+    {"class c;function new ( string s ,int i );endfunction endclass",
+     "class c;\n"
+     "  function new(string s, int i);\n"
+     "  endfunction\n"
+     "endclass\n"},
+    {"class c;function void f;endfunction endclass",
+     "class c;\n"
+     "  function void f;\n"
+     "  endfunction\n"
+     "endclass\n"},
+    {"class c;virtual function void f;endfunction endclass",
+     "class c;\n"
+     "  virtual function void f;\n"
+     "  endfunction\n"
+     "endclass\n"},
+    {"class c;function int f ( );endfunction endclass",
+     "class c;\n"
+     "  function int f();\n"
+     "  endfunction\n"
+     "endclass\n"},
+    {"class c;function int f ( int  ii );endfunction endclass",
+     "class c;\n"
+     "  function int f(int ii);\n"
+     "  endfunction\n"
+     "endclass\n"},
+    {"class c;function int f ( int  ii ,bit  bb );endfunction endclass",
+     "class c;\n"
+     "  function int f(int ii, bit bb);\n"
+     "  endfunction\n"
+     "endclass\n"},
+    {"class c;task t ;endtask endclass",
+     "class c;\n"
+     "  task t;\n"
+     "  endtask\n"
+     "endclass\n"},
+    {"class c;task t ( int  ii ,bit  bb );endtask endclass",
+     "class c;\n"
+     "  task t(int ii, bit bb);\n"
+     "  endtask\n"
+     "endclass\n"},
+    {"class c; task automatic repeated_assigner;"
+     "repeat (count) y = w;"  // single statement body
+     "endtask endclass",
+     "class c;\n"
+     "  task automatic repeated_assigner;\n"
+     "    repeat (count) y = w;\n"
+     "  endtask\n"
+     "endclass\n"},
+    {"class c; task automatic delayed_assigner;"
+     "#   100   y = w;"  // delayed assignment
+     "endtask endclass",
+     "class c;\n"
+     "  task automatic delayed_assigner;\n"
+     "    #100 y = w;\n"
+     "  endtask\n"
+     "endclass\n"},
+    {"class c; task automatic labeled_assigner;"
+     "lbl   :   y = w;"  // delayed assignment
+     "endtask endclass",
+     "class c;\n"
+     "  task automatic labeled_assigner;\n"
+     "    lbl : y = w;\n"  // TODO(fangism): no space before ':'
+     "  endtask\n"
+     "endclass\n"},
+    // task with macro call
+    {"module m1;\ntask automatic t1();\n"
+     "t2(`R1(1)+ 8);endtask : t1\nendmodule",
+     "module m1;\n"
+     "  task automatic t1();\n"
+     "    t2(`R1(1) + 8);\n"
+     "  endtask : t1\n"
+     "endmodule\n"},
+
+    // tasks with control statements
+    {"class c; task automatic waiter;"
+     "if (count == 0) begin #0; return;end "
+     "endtask endclass",
+     "class c;\n"
+     "  task automatic waiter;\n"
+     "    if (count == 0) begin\n"
+     "      #0;\n"
+     "      return;\n"
+     "    end\n"
+     "  endtask\n"
+     "endclass\n"},
+    {"class c; task automatic heartbreaker;"
+     "if( c)if( d) break ;"
+     "endtask endclass",
+     "class c;\n"
+     "  task automatic heartbreaker;\n"
+     "    if (c) if (d) break;\n"
+     "  endtask\n"
+     "endclass\n"},
+    {"class c; task automatic waiter;"
+     "repeat (count) @(posedge clk);"
+     "endtask endclass",
+     "class c;\n"
+     "  task automatic waiter;\n"
+     "    repeat (count) @(posedge clk);\n"
+     "  endtask\n"
+     "endclass\n"},
+    {"class c; task automatic repeat_assigner;"
+     "repeat( r )\ny = w;"
+     "repeat( q )\ny = 1;"
+     "endtask endclass",
+     "class c;\n"
+     "  task automatic repeat_assigner;\n"
+     "    repeat (r) y = w;\n"
+     "    repeat (q) y = 1;\n"
+     "  endtask\n"
+     "endclass\n"},
+    {"class c; task automatic event_control_assigner;"
+     "@ ( posedge clk )\ny = w;"
+     "@ ( negedge clk )\nz = w;"
+     "endtask endclass",
+     "class c;\n"
+     "  task automatic event_control_assigner;\n"
+     "    @(posedge clk) y = w;\n"
+     "    @(negedge clk) z = w;\n"
+     "  endtask\n"
+     "endclass\n"},
+    {
+        // classes with surrrounding comments
+        // vertical spacing preserved
+        "\n// pre-c\n\n"
+        "  class   c  ;\n"
+        "// c stuff\n"
+        "endclass\n"
+        "  // pre-d\n"
+        "\n\nclass d ;\n"
+        " // d stuff\n"
+        "endclass\n"
+        "\n// the end\n",
+        "\n// pre-c\n\n"
+        "class c;\n"
+        "  // c stuff\n"
+        "endclass\n"
+        "// pre-d\n\n\n"
+        "class d;\n"
+        "  // d stuff\n"
+        "endclass\n\n"
+        "// the end\n",
+    },
+    {// class with comments around task/function declarations
+     "class c;      // c is for cookie\n"
+     "    // f is for false\n"
+     "\tfunction f(integer size) ; endfunction\n"
+     " // t is for true\n"
+     "task t();endtask\n"
+     " // class is about to end\n"
+     "endclass",
+     "class c;  // c is for cookie\n"
+     "  // f is for false\n"
+     "  function f(integer size);\n"
+     "  endfunction\n"
+     "  // t is for true\n"
+     "  task t();\n"
+     "  endtask\n"
+     "  // class is about to end\n"
+     "endclass\n"},
+
+    // interface class test cases
+    {"interface class Foo;\nendclass\n",
+     "interface class Foo;\n"
+     "endclass\n"},
+    {"interface   class   Foo  ;  endclass\n",
+     "interface class Foo;\n"
+     "endclass\n"},
+    {"interface class Foo extends Bar , Baz ;\nendclass\n",
+     "interface class Foo extends Bar, Baz;\n"
+     "endclass\n"},
+    {"interface class Foo;\n  pure   virtual   task   foo (  ) ; \nendclass\n",
+     "interface class Foo;\n"
+     "  pure virtual task foo();\n"
+     "endclass\n"},
+
+    // class property alignment test cases
+    {"class c;\n"
+     "int foo  ;\n"
+     "byte bar;\n"
+     "endclass : c\n",
+     "class c;\n"
+     "  int  foo;\n"
+     "  byte bar;\n"
+     "endclass : c\n"},
+    {"class c;\n"
+     "int foo;\n"
+     "const bit b;\n"
+     "endclass : c\n",
+     "class c;\n"
+     "  int       foo;\n"
+     "  const bit b;\n"
+     "endclass : c\n"},
+    {"class c;\n"
+     "rand logic l;\n"
+     "int foo;\n"
+     "endclass : c\n",
+     "class c;\n"
+     "  rand logic l;\n"
+     "  int        foo;\n"
+     "endclass : c\n"},
+    {"class c;\n"
+     "rand logic l;\n"
+     "const static int foo;\n"  // more qualifiers
+     "endclass : c\n",
+     "class c;\n"
+     "  rand logic       l;\n"
+     "  const static int foo;\n"
+     "endclass : c\n"},
+    {"class c;\n"
+     "static local int foo;\n"
+     "const bit b;\n"
+     "endclass : c\n",
+     "class c;\n"
+     "  static local int foo;\n"
+     "  const bit        b;\n"
+     "endclass : c\n"},
+    {// example with queue
+     "class c;\n"
+     "int foo [$] ;\n"
+     "int foo_bar ;\n"
+     "endclass : c\n",
+     "class c;\n"
+     "  int foo     [$];\n"
+     "  int foo_bar;\n"
+     "endclass : c\n"},
+    {// subcolumns
+     "class cc;\n"
+     "rand bit [A-1:0] foo;\n"
+     "rand bit [A-1:0][2] bar;\n"
+     "int foobar[X+1:Y];\n"
+     "int baz[42];\n"
+     "rand bit qux[Z];\n"
+     "rand bit [1:0] quux[3:0];\n"
+     "rand bit [A:BB][42] quuz[7];\n"
+     "endclass\n",
+     "class cc;\n"
+     "  rand bit [A-1: 0]     foo;\n"
+     "  rand bit [A-1: 0][ 2] bar;\n"
+     "  int                   foobar[X+1:Y];\n"
+     "  int                   baz   [   42];\n"
+     "  rand bit              qux   [    Z];\n"
+     "  rand bit [  1: 0]     quux  [  3:0];\n"
+     "  rand bit [  A:BB][42] quuz  [    7];\n"
+     "endclass\n"},
+    {"class cc;\n"
+     "int qux[2];\n"
+     "int quux[SIZE-1+SHIFT:SHIFT];\n"
+     "int quuz[SOME_CONSTANT];\n"
+     "endclass\n",
+     "class cc;\n"
+     "  int qux [                 2];\n"
+     "  int quux[SIZE-1+SHIFT:SHIFT];\n"
+     "  int quuz[     SOME_CONSTANT];\n"
+     "endclass\n"},
+    {// aligns over comments (ignored)
+     "class c;\n"
+     "// foo is...\n"
+     "int foo;\n"
+     "// b is...\n"
+     "const bit b;\n"
+     " // llama is...\n"
+     "logic llama;\n"
+     "endclass : c\n",
+     "class c;\n"
+     "  // foo is...\n"
+     "  int       foo;\n"
+     "  // b is...\n"
+     "  const bit b;\n"
+     "  // llama is...\n"
+     "  logic     llama;\n"
+     "endclass : c\n"},
+    {// aligns over comments (ignored), even with blank lines
+     "class c;\n"
+     "// foo is...\n"
+     "int foo;\n"
+     "\n"
+     "// b is...\n"
+     "const bit b;\n"
+     "\n"
+     " // llama is...\n"
+     "logic llama;\n"
+     "endclass : c\n",
+     "class c;\n"
+     "  // foo is...\n"
+     "  int       foo;\n"
+     "\n"
+     "  // b is...\n"
+     "  const bit b;\n"
+     "\n"
+     "  // llama is...\n"
+     "  logic     llama;\n"
+     "endclass : c\n"},
+    {"class c;\n"
+     "rand logic l;\n"
+     "int [1:0] foo;\n"
+     "endclass : c\n",
+     "class c;\n"
+     "  rand logic       l;\n"
+     "  int        [1:0] foo;\n"
+     "endclass : c\n"},
+    {// non-data-declarations break up groups
+     "class c;\n"
+     "rand logic l;\n"
+     "int foo;\n"
+     "`uvm_bar_foo()\n"
+     "logic k;\n"
+     "rand int bar;\n"
+     "endclass : c\n",
+     "class c;\n"
+     "  rand logic l;\n"
+     "  int        foo;\n"
+     "  `uvm_bar_foo()\n"  // separates alignment groups above/below
+     "  logic    k;\n"
+     "  rand int bar;\n"
+     "endclass : c\n"},
+    {// non-data-declarations break up groups
+     "class c;\n"
+     "logic k;\n"
+     "rand int bar;\n"
+     "function void f();\n"
+     "endfunction\n"
+     "rand logic l;\n"
+     "int foo;\n"
+     "endclass : c\n",
+     "class c;\n"
+     "  logic    k;\n"
+     "  rand int bar;\n"
+     "  function void f();\n"  // function declaration breaks groups
+     "  endfunction\n"
+     "  rand logic l;\n"
+     "  int        foo;\n"
+     "endclass : c\n"},
+    {// align single-value initializers at the '='
+     "class c;\n"
+     "const logic foo=0;\n"
+     "const bit b=1;\n"
+     "endclass : c\n",
+     "class c;\n"
+     "  const logic foo = 0;\n"
+     "  const bit   b   = 1;\n"
+     "endclass : c\n"},
+    {// align single-value initializers at the '=', over non-initialized
+     "class c;\n"
+     "const logic foo=0;\n"
+     "rand int iidrv;\n"
+     "const bit b=1;\n"
+     "endclass : c\n",
+     "class c;\n"
+     "  const logic foo    = 0;\n"
+     "  rand int    iidrv;\n"  // no initializer, but align across this
+     "  const bit   b      = 1;\n"
+     "endclass : c\n"},
+
+    // constraint test cases
+    {
+        "class foo; constraint c1_c{ } endclass",
+        "class foo;\n"
+        "  constraint c1_c {}\n"
+        "endclass\n",
+    },
+    {
+        "class foo; constraint c1_c{  } constraint c2_c{ } endclass",
+        "class foo;\n"
+        "  constraint c1_c {}\n"
+        "  constraint c2_c {}\n"
+        "endclass\n",
+    },
+    {
+        "class foo; constraint c1_c{soft z==y;unique{baz};}endclass",
+        "class foo;\n"
+        "  constraint c1_c {\n"
+        "    soft z == y;\n"
+        "    unique {baz};\n"
+        "  }\n"
+        "endclass\n",
+    },
+    {
+        "class foo; constraint c1_c{ //comment1\n"
+        "//comment2\n"
+        "//comment3\n"
+        "} endclass",
+        "class foo;\n"
+        "  constraint c1_c {  //comment1\n"
+        "    //comment2\n"
+        "    //comment3\n"
+        "  }\n"
+        "endclass\n",
+    },
+
+    {"class foo;constraint c { "
+     "timer_enable dist { [ 8'h0 : 8'hfe ] :/ 90 , 8'hff :/ 10 }; "
+     "} endclass\n",
+     "class foo;\n"
+     "  constraint c {\n"
+     "    timer_enable dist {\n"
+     "      [8'h0 : 8'hfe] :/ 90,\n"
+     "      8'hff          :/ 10\n"  // aligned
+     "    };\n"
+     "  }\n"
+     "endclass\n"},
+
+    {
+        "class Foo; constraint if_c { if (z) { soft x == y; } } endclass\n",
+        "class Foo;\n"
+        "  constraint if_c {\n"
+        "    if (z) {\n"
+        "      soft x == y;\n"
+        "    }\n"
+        "  }\n"
+        "endclass\n",
+    },
+    {
+        "class Foo; constraint if_c { if (z) {\n"
+        "//comment-a\n"
+        "soft x == y;\n"
+        "//comment-b\n"
+        "} } endclass\n",
+        "class Foo;\n"
+        "  constraint if_c {\n"
+        "    if (z) {\n"
+        "      //comment-a\n"  // properly indented
+        "      soft x == y;\n"
+        "      //comment-b\n"  // properly indented
+        "    }\n"
+        "  }\n"
+        "endclass\n",
+    },
+    {
+        "class c; "
+        "constraint c_has_config_error {"
+        "if (yyy) {zzzz == 1;} else {yyyyyyy == 0;}} "
+        "endclass",
+        "class c;\n"
+        "  constraint c_has_config_error {\n"
+        "    if (yyy) {\n"
+        "      zzzz == 1;\n"
+        "    } else {\n"
+        "      yyyyyyy == 0;\n"
+        "    }\n"
+        "  }\n"
+        "endclass\n",
+    },
+    // distributions: colon alignment
+    {"class c;\n"
+     "constraint co {\n"
+     "d dist {\n"
+     "[1:2]:/2,\n"
+     "[11:33]:/22,\n"
+     "[111:444]:/8,\n"
+     "[1:42]:/10,\n"
+     "[11:12]:/3\n"
+     "};\n"
+     "}\n"
+     "endclass\n",
+     "class c;\n"
+     "  constraint co {\n"
+     "    d dist {\n"
+     "      [  1 :   2] :/ 2,\n"
+     "      [ 11 :  33] :/ 22,\n"
+     "      [111 : 444] :/ 8,\n"
+     "      [  1 :  42] :/ 10,\n"
+     "      [ 11 :  12] :/ 3\n"
+     "    };\n"
+     "  }\n"
+     "endclass\n"},
+    // distributions: subcolumns
+    {"class foo;\n"
+     "constraint bar {\n"
+     "baz dist {\n"
+     "[1:2]:/2,\n"
+     "QUX[3:0]:/10,\n"
+     "[11:33]:/22,\n"
+     "ID_LONGER_THAN_RANGES:/3,\n"
+     "[111:QUUZ[Z]]:/8,\n"
+     "[X[4:0]:Y[8:Z-2]]:/8\n"
+     "};\n"
+     "}\n"
+     "endclass\n",
+     "class foo;\n"
+     "  constraint bar {\n"
+     "    baz dist {\n"
+     "      [     1 :        2]   :/ 2,\n"
+     "      QUX[3:0]              :/ 10,\n"
+     "      [    11 :       33]   :/ 22,\n"
+     "      ID_LONGER_THAN_RANGES :/ 3,\n"
+     "      [   111 :  QUUZ[Z]]   :/ 8,\n"
+     "      [X[4:0] : Y[8:Z-2]]   :/ 8\n"
+     "    };\n"
+     "  }\n"
+     "endclass\n"},
+    // class with empty parameter list
+    {"class foo #(); endclass",
+     "class foo #();\n"
+     "endclass\n"},
+    // class with empty parameter list, with comment
+    {"class foo #(  \n"
+     "// comment\n"
+     "); endclass",
+     "class foo #(\n"
+     "    // comment\n"
+     ");\n"
+     "endclass\n"},
+    // class with empty parameter list, extends
+    {"class foo #()extends bar ; endclass",
+     "class foo #() extends bar;\n"
+     "endclass\n"},
+    // class extends from type with named parameters
+    {"class foo extends bar #(.N(N), .M(M)); endclass",
+     "class foo extends bar #(\n"
+     "    .N(N),\n"
+     "    .M(M)\n"
+     ");\n"
+     "endclass\n"},
+
+    // class with one parameter list
+    {"class foo #(type a = b); endclass",
+     "class foo #(\n"
+     "    type a = b\n"
+     ");\n"
+     "endclass\n"},
+
+    // class with multiple paramter list
+    {"class foo #(type a = b, type c = d, type e = f); endclass",
+     "class foo #(\n"
+     "    type a = b,\n"
+     "    type c = d,\n"
+     "    type e = f\n"
+     ");\n"
+     "endclass\n"},
+
+    // class with data members
+    {"class  i_love_data ;const\ninteger  sizer\t;endclass",
+     "class i_love_data;\n"
+     "  const integer sizer;\n"
+     "endclass\n"},
+    {"class  i_love_data ;const\ninteger  sizer=3\t;endclass",
+     "class i_love_data;\n"
+     "  const integer sizer = 3;\n"
+     "endclass\n"},
+    {"class  i_love_data ;protected\nint  count  \t;endclass",
+     "class i_love_data;\n"
+     "  protected int count;\n"
+     "endclass\n"},
+    {"class  i_love_data ;\t\nint  counter\n ;int  countess \t;endclass",
+     "class i_love_data;\n"
+     "  int counter;\n"
+     "  int countess;\n"
+     "endclass\n"},
+    {"class  i_love_params ;foo#( . bar)  baz\t;endclass",
+     "class i_love_params;\n"
+     "  foo #(.bar) baz;\n"
+     "endclass\n"},
+    {"class  i_love_params ;foo#( . bar ( bah ))  baz\t;endclass",
+     "class i_love_params;\n"
+     "  foo #(.bar(bah)) baz;\n"
+     "endclass\n"},
+    {"class  i_love_params ;foo#( . bar ( bah\n),"
+     ".\ncat( dog) )  baz\t;endclass",
+     "class i_love_params;\n"
+     "  foo #(\n"
+     "      .bar(bah),\n"
+     "      .cat(dog)\n"
+     "  ) baz;\n"
+     "endclass\n"},
+    {"class  i_love_params ;foo#( . bar)  baz1,baz2\t;endclass",
+     "class i_love_params;\n"
+     "  foo #(.bar) baz1, baz2;\n"
+     "endclass\n"},
+    {"class  i_love_params ;foo#( . bar)  baz\t;baz#(.foo)bar;endclass",
+     "class i_love_params;\n"
+     "  foo #(.bar) baz;\n"
+     "  baz #(.foo) bar;\n"
+     "endclass\n"},
+    {"class i_love_params // comment\n"
+     ";\n"
+     "foo#(\n"
+     ".foobar(quuuuux) // comment\n"
+     ", .cat(dog)\n"
+     ") baz // comment\n"
+     ";endclass\n",
+     "class i_love_params  // comment\n"
+     ";\n"
+     "  foo #(\n"
+     "        .foobar(quuuuux)  // comment\n"
+     "      , .cat   (dog)\n"
+     "  ) baz  // comment\n"
+     "  ;\n"
+     "endclass\n"},
+
+    // typedef test cases
+    {"typedef enum logic\t{ A=0, B=1 }foo_t;",
+     "typedef enum logic {\n"
+     "  A = 0,\n"
+     "  B = 1\n"
+     "} foo_t;\n"},
+    {"typedef enum uint8_t\t{ kA=8'b0, kB=8'b1 }foo_t;",
+     "typedef enum uint8_t {\n"  // uint8_t is user-defined
+     "  kA = 8'b0,\n"
+     "  kB = 8'b1\n"
+     "} foo_t;\n"},
+    {// With comments on same line as enum value
+     "typedef enum logic\t{ A=0, // foo\n"
+     "B,// bar\n"
+     "`ifndef DO_PANIC\n"
+     "C=42,// answer\n"
+     "`endif\n"
+     "D=3    // baz\n"
+     "}foo_t;",
+     "typedef enum logic {\n"
+     "  A = 0,   // foo\n"
+     "  B,       // bar\n"
+     "`ifndef DO_PANIC\n"
+     "  C = 42,  // answer\n"
+     "`endif\n"
+     "  D = 3    // baz\n"
+     "} foo_t;\n"},
+    {// with scalar dimensions
+     "typedef enum logic[2]\t{ A=0, B=1 }foo_t;",
+     "typedef enum logic [2] {\n"
+     "  A = 0,\n"
+     "  B = 1\n"
+     "} foo_t;\n"},
+    {// with range dimensions
+     "typedef enum logic[1:0]\t{ A=0, B=1 }foo_t;",
+     "typedef enum logic [1:0] {\n"
+     "  A = 0,\n"
+     "  B = 1\n"
+     "} foo_t;\n"},
+    {"typedef foo_pkg::baz_t#(.L(L), .W(W)) bar_t;\n",
+     "typedef foo_pkg::baz_t#(\n"
+     "    .L(L),\n"
+     "    .W(W)\n"
+     ") bar_t;\n"},
+    // By default (class_parameter_space == false), no space before '#'
+    {"typedef dv_base_env_cov #(.CFG_T(tl_agent_env_cfg)) tl_agent_env_cov;\n",
+     "typedef dv_base_env_cov#(\n"
+     "    .CFG_T(tl_agent_env_cfg)\n"
+     ") tl_agent_env_cov;\n"},
+    {"typedef dv_base_env_cov#(.CFG_T(tl_agent_env_cfg)) tl_agent_env_cov;\n",
+     "typedef dv_base_env_cov#(\n"
+     "    .CFG_T(tl_agent_env_cfg)\n"
+     ") tl_agent_env_cov;\n"},
+    // single short parameter stays on one line
+    {"typedef my_class #(.P(P)) my_class_t;\n",
+     "typedef my_class#(.P(P)) my_class_t;\n"},
+
+    // let declarations each stay on their own line
+    {"module t;\n"
+     "let OFF = 4;\n"
+     "let UNIQUE = 32;\n"
+     "let PP(a) = 30 + a;\n"
+     "endmodule\n",
+     "module t;\n"
+     "  let OFF = 4;\n"
+     "  let UNIQUE = 32;\n"
+     "  let PP(a) = 30 + a;\n"
+     "endmodule\n"},
+
+    // let declarations each stay on their own line
+    {"module t;\n"
+     "let OFF = 4;\n"
+     "let UNIQUE = 32;\n"
+     "let PP(a) = 30 + a;\n"
+     "endmodule\n",
+     "module t;\n"
+     "  let OFF = 4;\n"
+     "  let UNIQUE = 32;\n"
+     "  let PP(a) = 30 + a;\n"
+     "endmodule\n"},
+
+    // package test cases
+    {"package fedex;localparam  int  www=3 ;endpackage   :  fedex\n",
+     "package fedex;\n"
+     "  localparam int www = 3;\n"
+     "endpackage : fedex\n"},
+    {"package   typey ;"
+     "typedef enum int{ A=0, B=1 }foo_t;"
+     "typedef enum{ C=0, D=1 }bar_t;"
+     "endpackage:typey\n",
+     "package typey;\n"
+     "  typedef enum int {\n"
+     "    A = 0,\n"
+     "    B = 1\n"
+     "  } foo_t;\n"
+     "  typedef enum {\n"
+     "    C = 0,\n"
+     "    D = 1\n"
+     "  } bar_t;\n"
+     "endpackage : typey\n"},
+    {// net type declarations
+     "package foo_pkg;"
+     "nettype shortreal\t\tfoo  ;"
+     "nettype\nbar[1:0 ] baz  with\tquux ;"
+     "endpackage",
+     "package foo_pkg;\n"
+     "  nettype shortreal foo;\n"
+     "  nettype bar [1:0] baz with quux;\n"
+     "endpackage\n"},
+    {"package foo_pkg; \n"
+     "// function description.......\n"
+     "function automatic void bar();"
+     "endfunction "
+     "endpackage\n",
+     "package foo_pkg;\n"
+     "  // function description.......\n"
+     "  function automatic void bar();\n"
+     "  endfunction\n"
+     "endpackage\n"},
+    {"package foo_pkg; \n"
+     "// function description.......\n"
+     "function void bar(string name=\"x\" ) ;"
+     "endfunction "
+     "endpackage\n",
+     "package foo_pkg;\n"
+     "  // function description.......\n"
+     "  function void bar(string name = \"x\");\n"
+     "  endfunction\n"
+     "endpackage\n"},
+    {" package foo_pkg; \n"
+     "// class description.............\n"
+     "class classy;"
+     "endclass "
+     "endpackage\n",
+     "package foo_pkg;\n"
+     "  // class description.............\n"
+     "  class classy;\n"
+     "  endclass\n"
+     "endpackage\n"},
+    {"package\tfoo_pkg; \n"
+     "// class description.............\n"
+     "class   classy;    \n"
+     "// function description.......\n"
+     "function\nautomatic   void bar( );"
+     "endfunction   "
+     "endclass\t"
+     "endpackage\n",
+     "package foo_pkg;\n"
+     "  // class description.............\n"
+     "  class classy;\n"
+     "    // function description.......\n"
+     "    function automatic void bar();\n"
+     "    endfunction\n"
+     "  endclass\n"
+     "endpackage\n"},
+    {"package fedex;\n"
+     "  import \"asdf\" context function void bar(\n"
+     "    input bit              [2:1] aaaa,   // EOL COMMENT\n"
+     "                                          // another\n"
+     "    input bit foo\n"
+     "  );\n"
+     "endpackage\n",
+     "package fedex;\n"
+     "  import \"asdf\" context\n"
+     "      function void bar(\n"
+     "    input\n        bit [2:1] aaaa,  // EOL COMMENT\n"
+     "                         // another\n"
+     "    input bit foo\n"
+     "  );\n"
+     "endpackage\n"},
+
+};
+
+TEST(FormatterEndToEndTest, ClassPackageFormatterTestCases) {
+  RunFormatterTestCases40(kClassPackageFormatterTestCases);
+}
+
+}  // namespace
+}  // namespace formatter
+}  // namespace verilog
diff --git a/verible/verilog/formatting/formatter_disable_test.cc b/verible/verilog/formatting/formatter_disable_test.cc
new file mode 100644
index 0000000..b653063
--- /dev/null
+++ b/verible/verilog/formatting/formatter_disable_test.cc
@@ -0,0 +1,5814 @@
+// Copyright 2017-2026 The Verible Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Test cases in this file should be *insensitive* to wrapping penalties.
+// Penalty-sensitive tests belong in formatter-tuning_test.cc.
+
+#include "gtest/gtest.h"
+#include "verible/verilog/formatting/formatter-test-utils.h"
+
+namespace verilog {
+namespace formatter {
+namespace {
+
+static constexpr FormatterTestCase kDisableFormatterTestCases[] = {
+    // comment-controlled formatter disabling
+    {"// verilog_format: off\n"  // disables whole file
+     "  `include  \t\t  \"path/to/file.vh\"\n",
+     "// verilog_format: off\n"
+     "  `include  \t\t  \"path/to/file.vh\"\n"},  // keeps bad spacing
+    {"/* verilog_format: off */\n"                // disables whole file
+     "  `include  \t\t  \"path/to/file.svh\"  \n",
+     "/* verilog_format: off */\n"
+     "  `include  \t\t  \"path/to/file.svh\"  \n"},  // keeps bad spacing
+    {"// verilog_format: on\n"  // already enabled, no effect
+     "  `include  \t  \"path/to/file.svh\"  \t\n",
+     "// verilog_format: on\n"
+     "`include \"path/to/file.svh\"\n"},
+    {"// verilog_format: off\n"
+     "// verilog_format: on\n"  // re-enable right away
+     "  `include  \t\t  \"path/to/file.svh\"  \n",
+     "// verilog_format: off\n"
+     "// verilog_format: on\n"
+     "`include \"path/to/file.svh\"\n"},
+    {"/* aaa *//* bbb */\n"                         // not formatting controls
+     "  `include  \t\t  \"path/to/file.svh\"  \n",  // should format
+     "/* aaa */  /* bbb */\n"  // currently inserts 2 spaces
+     "`include \"path/to/file.svh\"\n"},
+    {"/* verilog_format: off *//* verilog_format: on */\n"  // re-enable
+     "  `include  \t\t  \"path/to/file.svh\"  \n",
+     // Note that this case normally wouldn't fit in 40 columns,
+     // but disabling formatting lets it overflow.
+     "/* verilog_format: off *//* verilog_format: on */\n"
+     "`include \"path/to/file.svh\"\n"},
+    {"// verilog_format: off\n"
+     "  `include  \t\t  \"path/to/fileA.svh\"  // verilog_format: on\n"
+     "  `include  \t\t  \"path/to/fileB.svh\"  \n",
+     // re-enable formatting with comment trailing other tokens
+     "// verilog_format: off\n"
+     "  `include  \t\t  \"path/to/fileA.svh\"  // verilog_format: on\n"
+     "`include \"path/to/fileB.svh\"\n"},
+    {"  `include  \t\t  \"path/to/file1.vh\" \n"  // format this
+     "// verilog_format: off\n"                   // start disabling
+     "  `include  \t\t  \"path/to/file2.vh\" \n"
+     "\t\t\n"
+     "  `include  \t\t  \"path/to/file3.vh\" \n"
+     "// verilog_format: on\n"                     // stop disabling
+     "  `include  \t\t  \"path/to/file4.vh\" \n",  // format this
+     "`include \"path/to/file1.vh\"\n"
+     "// verilog_format: off\n"  // start disabling
+     "  `include  \t\t  \"path/to/file2.vh\" \n"
+     "\t\t\n"
+     "  `include  \t\t  \"path/to/file3.vh\" \n"
+     "// verilog_format: on\n"  // stop disabling
+     "`include \"path/to/file4.vh\"\n"},
+    {// disabling formatting on a module (to end of file)
+     "// verilog_format: off\n"
+     "module m;endmodule\n",
+     "// verilog_format: off\n"
+     "module m;endmodule\n"},
+    {// disabling formatting on a module (to end of file)
+     "// verilog_format: off\n"
+     "module m;\n"
+     "unindented instantiation;\n"
+     "endmodule\n",
+     "// verilog_format: off\n"
+     "module m;\n"
+     "unindented instantiation;\n"
+     "endmodule\n"},
+    {// disabling formatting inside a port declaration list disables alignment,
+     // but falls back to standard compaction.
+     "module align_off(\n"
+     "input w  ,\n"
+     "    // verilog_format: off\n"
+     "input wire  [y:z] wwww,\n"
+     "    // verilog_format: on\n"
+     "output  reg    xx\n"
+     ");\n"
+     "endmodule",
+     "module align_off (\n"
+     "    input w  ,\n"  // preserved because group is partially disabled
+     "    // verilog_format: off\n"
+     "input wire  [y:z] wwww,\n"  // not compacted
+     "    // verilog_format: on\n"
+     "    output  reg    xx\n"  // preserved because group is partially disabled
+     ");\n"
+     "endmodule\n"},
+
+    {// multiple tokens with EOL comment
+     "module please;  // don't break before the comment\n"
+     "endmodule\n",
+     "module please\n"
+     "    ;  // don't break before the comment\n"
+     "endmodule\n"},
+    {// one token with EOL comment
+     "module please;\n"
+     "endmodule  // don't break before the comment\n",
+     "module please;\n"
+     "endmodule  // don't break before the comment\n"},
+    {
+        // line with only an EOL comment
+        "module wild;\n"
+        "// a really long comment on its own line to be left alone\n"
+        "endmodule",
+        "module wild;\n"
+        "  // a really long comment on its own line to be left alone\n"
+        "endmodule\n",
+    },
+    {
+        // primitive declaration
+        "primitive primitive1(o, s, r);output o;reg o;input s;input r;table 1 "
+        "? :"
+        " ? : 0; ? 1    : 0   : -; endtable endprimitive",
+        "primitive primitive1(o, s, r);\n"
+        "  output o;\n"
+        "  reg o;\n"
+        "  input s;\n"
+        "  input r;\n"
+        "  table\n"
+        "    1 ? : ? : 0;\n"
+        "    ? 1 : 0 : -;\n"
+        "  endtable\n"
+        "endprimitive\n",
+    },
+    {
+        // one-input combinatorial UDP
+        "primitive primitive1 ( o,i ) ;output o;input i;"
+        " table 1  :   0 ;   0  :  1 ; endtable endprimitive",
+        "primitive primitive1(o, i);\n"
+        "  output o;\n"
+        "  input i;\n"
+        "  table\n"
+        "    1 : 0;\n"
+        "    0 : 1;\n"
+        "  endtable\n"
+        "endprimitive\n",
+    },
+    {
+        // two-input combinatorial UDP
+        "primitive primitive2(o, s, r);output o;input s;input r;"
+        "table 1 ? : 0;? 1 : -; endtable endprimitive",
+        "primitive primitive2(o, s, r);\n"
+        "  output o;\n"
+        "  input s;\n"
+        "  input r;\n"
+        "  table\n"
+        "    1 ? : 0;\n"
+        "    ? 1 : -;\n"
+        "  endtable\n"
+        "endprimitive\n",
+    },
+    {
+        // ten-input combinatorial UDP
+        "primitive comb10(o, i0, i1, i2, i3, i4, i5, i6, i7, i8, i9);"
+        "output o;input i0, i1, i2, i3, i4, i5, i6, i7, i8, i9;"
+        "table 0 ? ? ? ? ? ? ? ? 0 : 0;1 ? ? ? ? ? ? ? ? 0 : 1;"
+        "1 ? ? ? ? ? ? ? ? 1 : 1;0 ? ? ? ? ? ? ? ? 1 : 0;endtable endprimitive",
+        "primitive comb10(o, i0, i1, i2, i3, i4,\n"
+        "                 i5, i6, i7, i8, i9);\n"
+        "  output o;\n"
+        "  input i0, i1, i2, i3, i4, i5, i6, i7,\n"
+        "      i8, i9;\n"
+        "  table\n"
+        "    0 ? ? ? ? ? ? ? ? 0 : 0;\n"
+        "    1 ? ? ? ? ? ? ? ? 0 : 1;\n"
+        "    1 ? ? ? ? ? ? ? ? 1 : 1;\n"
+        "    0 ? ? ? ? ? ? ? ? 1 : 0;\n"
+        "  endtable\n"
+        "endprimitive\n",
+    },
+    {
+        // sequential level-sensitive UDP
+        "primitive level_seq(o, c, d);output o;reg o;"
+        "  input c;input d;table\n"
+        "//  C D  state O\n"
+        "0   ? : ? :  -;  // No Change\n"
+        "? 0   : 0 :  0;  // Unknown\n"
+        "endtable endprimitive",
+        "primitive level_seq(o, c, d);\n"
+        "  output o;\n"
+        "  reg o;\n"
+        "  input c;\n"
+        "  input d;\n"
+        "  table\n"
+        "    //  C D  state O\n"
+        "    0 ? : ? : -;  // No Change\n"
+        "    ? 0 : 0 : 0;  // Unknown\n"
+        "  endtable\n"
+        "endprimitive\n",
+    },
+    {
+        // sequential edge-sensitive UDP
+        "primitive edge_seq(o, c, d);output o;reg o;input c;input d;"
+        "table (01) 0 : ? :  0;(01) 1 : ? :  1;(0?) 1 : 1 :  1;(0?) 0 : 0 :  "
+        "0;\n"
+        "// ignore negative c\n"
+        "(?0) ? : ? :  -;\n"
+        "// ignore changes on steady c\n"
+        "?  (?\?) : ? :  -; endtable endprimitive",
+        "primitive edge_seq(o, c, d);\n"
+        "  output o;\n"
+        "  reg o;\n"
+        "  input c;\n"
+        "  input d;\n"
+        "  table\n"
+        "    (01) 0 : ? : 0;\n"
+        "    (01) 1 : ? : 1;\n"
+        "    (0?) 1 : 1 : 1;\n"
+        "    (0?) 0 : 0 : 0;\n"
+        "    // ignore negative c\n"
+        "    (?0) ? : ? : -;\n"
+        "    // ignore changes on steady c\n"
+        "    ? (?\?) : ? : -;\n"
+        "  endtable\n"
+        "endprimitive\n",
+    },
+    {
+        // mixed sequential UDP
+        "primitive mixed(o, clk, j, k, preset, clear);output o;reg o;"
+        "input c;input j, k;input preset, clear;table "
+        "?  ??  01:?:1 ; // preset logic\n"
+        "?  ??  *1:1:1 ;?  ??  10:?:0 ; // clear logic\n"
+        "?  ??  1*:0:0 ;r  00  00:0:1 ; // normal\n"
+        "r  00  11:?:- ;r  01  11:?:0 ;r  10  11:?:1 ;r  11  11:0:1 ;"
+        "r  11  11:1:0 ;f  ??  ??:?:- ;b  *?  ??:?:- ;"
+        " // j and k\n"
+        "b  ?*  ??:?:- ;endtable endprimitive\n",
+        "primitive mixed(o, clk, j, k, preset,\n"
+        "                clear);\n"
+        "  output o;\n"
+        "  reg o;\n"
+        "  input c;\n"
+        "  input j, k;\n"
+        "  input preset, clear;\n"
+        "  table\n"
+        "    ? ? ? 0 1 : ? : 1;  // preset logic\n"
+        "    ? ? ? * 1 : 1 : 1;\n"
+        "    ? ? ? 1 0 : ? : 0;  // clear logic\n"
+        "    ? ? ? 1 * : 0 : 0;\n"
+        "    r 0 0 0 0 : 0 : 1;  // normal\n"
+        "    r 0 0 1 1 : ? : -;\n"
+        "    r 0 1 1 1 : ? : 0;\n"
+        "    r 1 0 1 1 : ? : 1;\n"
+        "    r 1 1 1 1 : 0 : 1;\n"
+        "    r 1 1 1 1 : 1 : 0;\n"
+        "    f ? ? ? ? : ? : -;\n"
+        "    b * ? ? ? : ? : -;  // j and k\n"
+        "    b ? * ? ? : ? : -;\n"
+        "  endtable\n"
+        "endprimitive\n",
+    },
+    // un-lexed multiline macro arg token
+    {
+        " task  S ; "
+        "`ppgJH3JoxhwyTmZ2dgPiuMQzpRAWiSs("
+        "{xYtxuh6.FIMcVPEWfhtoI2FSe, xYtxuh6.ZVL5XASVGLYz32} == "
+        "SqRgavM[15:2];\n"
+        "JgQLBG == 4'h0;, \"foo\" )\n"
+        "endtask\n",
+        "task S;\n"
+        "  `ppgJH3JoxhwyTmZ2dgPiuMQzpRAWiSs(\n"
+        "      {xYtxuh6.FIMcVPEWfhtoI2FSe, xYtxuh6.ZVL5XASVGLYz32} == "
+        "SqRgavM[15:2];\n"
+        "JgQLBG == 4'h0;,\n"
+        "      \"foo\")\n"
+        "endtask\n",
+    },
+
+    // between identifier and '(', no args
+
+    {"// verilog_syntax: parse-as-module-body",
+     "// verilog_syntax: parse-as-module-body\n"},
+    {"// verilog_syntax: parse-as-statements",
+     "// verilog_syntax: parse-as-statements\n"},
+    {"// verilog_syntax: parse-as-class-body",
+     "// verilog_syntax: parse-as-class-body\n"},
+    {"// verilog_syntax: parse-as-package-body",
+     "// verilog_syntax: parse-as-package-body\n"},
+    {"// verilog_syntax: parse-as-library-map",
+     "// verilog_syntax: parse-as-library-map\n"},
+    {"// verilog_syntax: does-not-exist-mode",
+     "// verilog_syntax: does-not-exist-mode\n"},
+    {"// verilog_syntax: parse-as-module-body\n",
+     "// verilog_syntax: parse-as-module-body\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "// comment",
+     "// verilog_syntax: parse-as-module-body\n"
+     "// comment\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz /* c */ ();\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c */ ();\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz /* c1 */ /* c2 */ ();\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */  /* c2 */ ();\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz /* c */\n"
+     "();\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c */\n"
+     "    ();\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz /* c1 */ /* c2 */\n"
+     "();\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */  /* c2 */\n"
+     "    ();\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz // c\n"
+     "();\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  // c\n"
+     "    ();\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz /* c1 */ // c2\n"
+     "();\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */  // c2\n"
+     "    ();\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c */ ();\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c */ ();\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c1 */ /* c2 */ ();\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c1 */  /* c2 */ ();\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c */\n"
+     "();\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c */\n"
+     "    ();\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c1 */ /* c2 */\n"
+     "();\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c1 */  /* c2 */\n"
+     "    ();\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "// c\n"
+     "();\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    // c\n"
+     "    ();\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c1 */ // c2\n"
+     "();\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c1 */  // c2\n"
+     "    ();\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     "();\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c1 */\n"
+     "    /* c2 */\n"
+     "    ();\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "// c1\n"
+     "// c2\n"
+     "();\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    // c1\n"
+     "    // c2\n"
+     "    ();\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz /* c1 */\n"
+     "/* c2 */ ();\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */\n"
+     "    /* c2 */ ();\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz // c1\n"
+     "/* c2 */ ();\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  // c1\n"
+     "    /* c2 */ ();\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */ ();\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */\n"
+     "    /* c2 */\n"
+     "    /* c3 */ ();\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz /* c1 */\n"
+     "/* c2 */\n"
+     "();\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */\n"
+     "    /* c2 */\n"
+     "    ();\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz // c1\n"
+     "/* c2 */\n"
+     "();\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  // c1\n"
+     "    /* c2 */\n"
+     "    ();\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz /* c1 */\n"
+     "// c2\n"
+     "();\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */\n"
+     "    // c2\n"
+     "    ();\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz // c1\n"
+     "// c2\n"
+     "();\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  // c1\n"
+     "    // c2\n"
+     "    ();\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     "();\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */\n"
+     "    /* c2 */\n"
+     "    /* c3 */\n"
+     "    ();\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz // c1\n"
+     "// c2\n"
+     "// c3\n"
+     "();\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  // c1\n"
+     "    // c2\n"
+     "    // c3\n"
+     "    ();\n"},
+
+    // between identifier and '(', with arg
+
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz /* c */ (arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c */ (arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz /* c1 */ /* c2 */ (arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */  /* c2 */ (arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz /* c */\n"
+     "(arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c */\n"
+     "    (arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz /* c1 */ /* c2 */\n"
+     "(arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */  /* c2 */\n"
+     "    (arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz // c\n"
+     "(arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  // c\n"
+     "    (arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz /* c1 */ // c2\n"
+     "(arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */  // c2\n"
+     "    (arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c */ (arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c */ (arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c1 */ /* c2 */ (arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c1 */  /* c2 */ (arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c */\n"
+     "(arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c */\n"
+     "    (arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c1 */ /* c2 */\n"
+     "(arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c1 */  /* c2 */\n"
+     "    (arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "// c\n"
+     "(arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    // c\n"
+     "    (arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c1 */ // c2\n"
+     "(arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c1 */  // c2\n"
+     "    (arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     "(arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c1 */\n"
+     "    /* c2 */\n"
+     "    (arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "// c1\n"
+     "// c2\n"
+     "(arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    // c1\n"
+     "    // c2\n"
+     "    (arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz /* c1 */\n"
+     "/* c2 */ (arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */\n"
+     "    /* c2 */ (arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz // c1\n"
+     "/* c2 */ (arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  // c1\n"
+     "    /* c2 */ (arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */ (arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */\n"
+     "    /* c2 */\n"
+     "    /* c3 */ (arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz /* c1 */\n"
+     "/* c2 */\n"
+     "(arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */\n"
+     "    /* c2 */\n"
+     "    (arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz // c1\n"
+     "/* c2 */\n"
+     "(arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  // c1\n"
+     "    /* c2 */\n"
+     "    (arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz /* c1 */\n"
+     "// c2\n"
+     "(arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */\n"
+     "    // c2\n"
+     "    (arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz // c1\n"
+     "// c2\n"
+     "(arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  // c1\n"
+     "    // c2\n"
+     "    (arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     "(arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */\n"
+     "    /* c2 */\n"
+     "    /* c3 */\n"
+     "    (arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz // c1\n"
+     "// c2\n"
+     "// c3\n"
+     "(arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  // c1\n"
+     "    // c2\n"
+     "    // c3\n"
+     "    (arg);\n"},
+
+    // after '(', no args
+
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(/* c */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  /* c */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(/* c1 */ /* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  /* c1 */  /* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(/* c */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  /* c */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(/* c1 */ /* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  /* c1 */  /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(// c\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  // c\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(/* c1 */ // c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  /* c1 */  // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "/* c */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "/* c */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "/* c1 */ /* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "/* c1 */  /* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "/* c */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "    /* c */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "/* c1 */ /* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "    /* c1 */  /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "// c\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "    // c\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "/* c1 */ // c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "    /* c1 */  // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "    /* c1 */\n"
+     "    /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "// c1\n"
+     "// c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "    // c1\n"
+     "    // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(/* c1 */\n"
+     "/* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  /* c1 */\n"
+     "/* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(// c1\n"
+     "/* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  // c1\n"
+     "/* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  /* c1 */\n"
+     "    /* c2 */\n"
+     "/* c3 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(/* c1 */\n"
+     "/* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  /* c1 */\n"
+     "    /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(// c1\n"
+     "/* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  // c1\n"
+     "    /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(/* c1 */\n"
+     "// c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  /* c1 */\n"
+     "    // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(// c1\n"
+     "// c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  // c1\n"
+     "    // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  /* c1 */\n"
+     "    /* c2 */\n"
+     "    /* c3 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(// c1\n"
+     "// c2\n"
+     "// c3\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  // c1\n"
+     "    // c2\n"
+     "    // c3\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */ /* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */  /* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */ /* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */  /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(// c\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  // c\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */ // c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */  // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c1 */ /* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c1 */  /* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    /* c */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c1 */ /* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    /* c1 */  /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "// c\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    // c\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c1 */ // c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    /* c1 */  // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    /* c1 */\n"
+     "    /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "// c1\n"
+     "// c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    // c1\n"
+     "    // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */\n"
+     "/* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */\n"
+     "/* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(// c1\n"
+     "/* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  // c1\n"
+     "/* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */\n"
+     "    /* c2 */\n"
+     "/* c3 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */\n"
+     "/* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */\n"
+     "    /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(// c1\n"
+     "/* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  // c1\n"
+     "    /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */\n"
+     "// c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */\n"
+     "    // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(// c1\n"
+     "// c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  // c1\n"
+     "    // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */\n"
+     "    /* c2 */\n"
+     "    /* c3 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(// c1\n"
+     "// c2\n"
+     "// c3\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  // c1\n"
+     "    // c2\n"
+     "    // c3\n"
+     ");\n"},
+
+    // after '(', with arg
+
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(/* c */arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  /* c */ arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(/* c1 */ /* c2 */arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  /* c1 */  /* c2 */ arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(/* c */\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  /* c */\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(/* c1 */ /* c2 */\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  /* c1 */  /* c2 */\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(// c\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  // c\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(/* c1 */ // c2\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  /* c1 */  // c2\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "/* c */arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "    /* c */ arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "/* c1 */ /* c2 */arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "    /* c1 */  /* c2 */ arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "/* c */\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "    /* c */\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "/* c1 */ /* c2 */\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "    /* c1 */  /* c2 */\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "// c\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "    // c\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "/* c1 */ // c2\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "    /* c1 */  // c2\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "    /* c1 */\n"
+     "    /* c2 */\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "// c1\n"
+     "// c2\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(\n"
+     "    // c1\n"
+     "    // c2\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(/* c1 */\n"
+     "/* c2 */arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  /* c1 */\n"
+     "    /* c2 */ arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(// c1\n"
+     "/* c2 */arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  // c1\n"
+     "    /* c2 */ arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  /* c1 */\n"
+     "    /* c2 */\n"
+     "    /* c3 */ arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(/* c1 */\n"
+     "/* c2 */\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  /* c1 */\n"
+     "    /* c2 */\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(// c1\n"
+     "/* c2 */\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  // c1\n"
+     "    /* c2 */\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(/* c1 */\n"
+     "// c2\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  /* c1 */\n"
+     "    // c2\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(// c1\n"
+     "// c2\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  // c1\n"
+     "    // c2\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  /* c1 */\n"
+     "    /* c2 */\n"
+     "    /* c3 */\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(// c1\n"
+     "// c2\n"
+     "// c3\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(  // c1\n"
+     "    // c2\n"
+     "    // c3\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c */arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c */ arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */ /* c2 */arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */  /* c2 */ arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c */\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c */\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */ /* c2 */\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */  /* c2 */\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(// c\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  // c\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */ // c2\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */  // c2\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c */arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    /* c */ arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c1 */ /* c2 */arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    /* c1 */  /* c2 */ arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c */\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    /* c */\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c1 */ /* c2 */\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    /* c1 */  /* c2 */\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "// c\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    // c\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c1 */ // c2\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    /* c1 */  // c2\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    /* c1 */\n"
+     "    /* c2 */\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "// c1\n"
+     "// c2\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    // c1\n"
+     "    // c2\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */\n"
+     "/* c2 */arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */\n"
+     "    /* c2 */ arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(// c1\n"
+     "/* c2 */arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  // c1\n"
+     "    /* c2 */ arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */\n"
+     "    /* c2 */\n"
+     "    /* c3 */ arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */\n"
+     "/* c2 */\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */\n"
+     "    /* c2 */\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(// c1\n"
+     "/* c2 */\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  // c1\n"
+     "    /* c2 */\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */\n"
+     "// c2\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */\n"
+     "    // c2\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(// c1\n"
+     "// c2\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  // c1\n"
+     "    // c2\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */\n"
+     "    /* c2 */\n"
+     "    /* c3 */\n"
+     "    arg);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(// c1\n"
+     "// c2\n"
+     "// c3\n"
+     "arg);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  // c1\n"
+     "    // c2\n"
+     "    // c3\n"
+     "    arg);\n"},
+
+    // after single arg
+
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg/* c */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg  /* c */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg/* c1 */ /* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg  /* c1 */  /* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg/* c */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg  /* c */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg/* c1 */ /* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg  /* c1 */  /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg// c\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg  // c\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg/* c1 */ // c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg  /* c1 */  // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg\n"
+     "/* c */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg\n"
+     "/* c */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg\n"
+     "/* c1 */ /* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg\n"
+     "/* c1 */  /* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg\n"
+     "/* c */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg\n"
+     "           /* c */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg\n"
+     "/* c1 */ /* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg\n"
+     "           /* c1 */  /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg\n"
+     "// c\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg\n"
+     "           // c\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg\n"
+     "/* c1 */ // c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg\n"
+     "           /* c1 */  // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg\n"
+     "           /* c1 */\n"
+     "           /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg\n"
+     "// c1\n"
+     "// c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg\n"
+     "           // c1\n"
+     "           // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg/* c1 */\n"
+     "/* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg  /* c1 */\n"
+     "/* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg// c1\n"
+     "/* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg  // c1\n"
+     "/* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg  /* c1 */\n"
+     "           /* c2 */\n"
+     "/* c3 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg/* c1 */\n"
+     "/* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg  /* c1 */\n"
+     "           /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg// c1\n"
+     "/* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg  // c1\n"
+     "           /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg/* c1 */\n"
+     "// c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg  /* c1 */\n"
+     "           // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg// c1\n"
+     "// c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg  // c1\n"
+     "           // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg  /* c1 */\n"
+     "           /* c2 */\n"
+     "           /* c3 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg// c1\n"
+     "// c2\n"
+     "// c3\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg  // c1\n"
+     "           // c2\n"
+     "           // c3\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg/* c */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg  /* c */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg/* c1 */ /* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg  /* c1 */  /* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg/* c */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg  /* c */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg/* c1 */ /* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg  /* c1 */  /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg// c\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg  // c\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg/* c1 */ // c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg  /* c1 */  // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg\n"
+     "/* c */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg\n"
+     "/* c */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg\n"
+     "/* c1 */ /* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg\n"
+     "/* c1 */  /* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg\n"
+     "/* c */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg\n"
+     "           /* c */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg\n"
+     "/* c1 */ /* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg\n"
+     "           /* c1 */  /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg\n"
+     "// c\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg\n"
+     "           // c\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg\n"
+     "/* c1 */ // c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg\n"
+     "           /* c1 */  // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg\n"
+     "           /* c1 */\n"
+     "           /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg\n"
+     "// c1\n"
+     "// c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg\n"
+     "           // c1\n"
+     "           // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg/* c1 */\n"
+     "/* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg  /* c1 */\n"
+     "/* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg// c1\n"
+     "/* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg  // c1\n"
+     "/* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg  /* c1 */\n"
+     "           /* c2 */\n"
+     "/* c3 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg/* c1 */\n"
+     "/* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg  /* c1 */\n"
+     "           /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg// c1\n"
+     "/* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg  // c1\n"
+     "           /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg/* c1 */\n"
+     "// c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg  /* c1 */\n"
+     "           // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg// c1\n"
+     "// c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg  // c1\n"
+     "           // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg  /* c1 */\n"
+     "           /* c2 */\n"
+     "           /* c3 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg// c1\n"
+     "// c2\n"
+     "// c3\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg  // c1\n"
+     "           // c2\n"
+     "           // c3\n"
+     ");\n"},
+
+    // before colon
+
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1/* c */, arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1  /* c */, arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1/* c1 */ /* c2 */, arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1  /* c1 */  /* c2 */,\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1/* c */\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1  /* c */\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1/* c1 */ /* c2 */\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1  /* c1 */  /* c2 */\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1// c\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1  // c\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1/* c1 */ // c2\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1  /* c1 */  // c2\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1\n"
+     "/* c */, arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1\n"
+     "           /* c */, arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1\n"
+     "/* c1 */ /* c2 */, arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1\n"
+     "           /* c1 */  /* c2 */, arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1\n"
+     "/* c */\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1\n"
+     "           /* c */\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1\n"
+     "/* c1 */ /* c2 */\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1\n"
+     "           /* c1 */  /* c2 */\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1\n"
+     "// c\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1\n"
+     "           // c\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1\n"
+     "/* c1 */ // c2\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1\n"
+     "           /* c1 */  // c2\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1\n"
+     "           /* c1 */\n"
+     "           /* c2 */\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1\n"
+     "// c1\n"
+     "// c2\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1\n"
+     "           // c1\n"
+     "           // c2\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1/* c1 */\n"
+     "/* c2 */, arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1  /* c1 */\n"
+     "           /* c2 */, arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1// c1\n"
+     "/* c2 */, arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1  // c1\n"
+     "           /* c2 */, arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */, arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1  /* c1 */\n"
+     "           /* c2 */\n"
+     "           /* c3 */, arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1/* c1 */\n"
+     "/* c2 */\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1  /* c1 */\n"
+     "           /* c2 */\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1// c1\n"
+     "/* c2 */\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1  // c1\n"
+     "           /* c2 */\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1/* c1 */\n"
+     "// c2\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1  /* c1 */\n"
+     "           // c2\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1// c1\n"
+     "// c2\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1  // c1\n"
+     "           // c2\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1  /* c1 */\n"
+     "           /* c2 */\n"
+     "           /* c3 */\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1// c1\n"
+     "// c2\n"
+     "// c3\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1  // c1\n"
+     "           // c2\n"
+     "           // c3\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1/* c */, arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1  /* c */, arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1/* c1 */ /* c2 */, arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1  /* c1 */  /* c2 */,\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1/* c */\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1  /* c */\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1/* c1 */ /* c2 */\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1  /* c1 */  /* c2 */\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1// c\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1  // c\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1/* c1 */ // c2\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1  /* c1 */  // c2\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1\n"
+     "/* c */, arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1\n"
+     "           /* c */, arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1\n"
+     "/* c1 */ /* c2 */, arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1\n"
+     "           /* c1 */  /* c2 */, arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1\n"
+     "/* c */\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1\n"
+     "           /* c */\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1\n"
+     "/* c1 */ /* c2 */\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1\n"
+     "           /* c1 */  /* c2 */\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1\n"
+     "// c\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1\n"
+     "           // c\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1\n"
+     "/* c1 */ // c2\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1\n"
+     "           /* c1 */  // c2\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1\n"
+     "           /* c1 */\n"
+     "           /* c2 */\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1\n"
+     "// c1\n"
+     "// c2\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1\n"
+     "           // c1\n"
+     "           // c2\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1/* c1 */\n"
+     "/* c2 */, arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1  /* c1 */\n"
+     "           /* c2 */, arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1// c1\n"
+     "/* c2 */, arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1  // c1\n"
+     "           /* c2 */, arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */, arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1  /* c1 */\n"
+     "           /* c2 */\n"
+     "           /* c3 */, arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1/* c1 */\n"
+     "/* c2 */\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1  /* c1 */\n"
+     "           /* c2 */\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1// c1\n"
+     "/* c2 */\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1  // c1\n"
+     "           /* c2 */\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1/* c1 */\n"
+     "// c2\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1  /* c1 */\n"
+     "           // c2\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1// c1\n"
+     "// c2\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1  // c1\n"
+     "           // c2\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1  /* c1 */\n"
+     "           /* c2 */\n"
+     "           /* c3 */\n"
+     "           , arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1// c1\n"
+     "// c2\n"
+     "// c3\n"
+     ", arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1  // c1\n"
+     "           // c2\n"
+     "           // c3\n"
+     "           , arg2);\n"},
+
+    // after colon
+
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,/* c */arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,  /* c */ arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,/* c1 */ /* c2 */arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,  /* c1 */  /* c2 */\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,/* c */\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,  /* c */\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,/* c1 */ /* c2 */\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,  /* c1 */  /* c2 */\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,// c\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,  // c\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,/* c1 */ // c2\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,  /* c1 */  // c2\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,\n"
+     "/* c */arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,\n"
+     "           /* c */ arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,\n"
+     "/* c1 */ /* c2 */arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,\n"
+     "           /* c1 */  /* c2 */ arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,\n"
+     "/* c */\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,\n"
+     "           /* c */\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,\n"
+     "/* c1 */ /* c2 */\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,\n"
+     "           /* c1 */  /* c2 */\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,\n"
+     "// c\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,\n"
+     "           // c\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,\n"
+     "/* c1 */ // c2\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,\n"
+     "           /* c1 */  // c2\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,\n"
+     "           /* c1 */\n"
+     "           /* c2 */\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,\n"
+     "// c1\n"
+     "// c2\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,\n"
+     "           // c1\n"
+     "           // c2\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,/* c1 */\n"
+     "/* c2 */arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,  /* c1 */\n"
+     "           /* c2 */ arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,// c1\n"
+     "/* c2 */arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,  // c1\n"
+     "           /* c2 */ arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,  /* c1 */\n"
+     "           /* c2 */\n"
+     "           /* c3 */ arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,/* c1 */\n"
+     "/* c2 */\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,  /* c1 */\n"
+     "           /* c2 */\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,// c1\n"
+     "/* c2 */\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,  // c1\n"
+     "           /* c2 */\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,/* c1 */\n"
+     "// c2\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,  /* c1 */\n"
+     "           // c2\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,// c1\n"
+     "// c2\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,  // c1\n"
+     "           // c2\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,  /* c1 */\n"
+     "           /* c2 */\n"
+     "           /* c3 */\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,// c1\n"
+     "// c2\n"
+     "// c3\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,  // c1\n"
+     "           // c2\n"
+     "           // c3\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,/* c */arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,  /* c */ arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,/* c1 */ /* c2 */arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,  /* c1 */  /* c2 */\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,/* c */\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,  /* c */\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,/* c1 */ /* c2 */\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,  /* c1 */  /* c2 */\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,// c\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,  // c\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,/* c1 */ // c2\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,  /* c1 */  // c2\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,\n"
+     "/* c */arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,\n"
+     "           /* c */ arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,\n"
+     "/* c1 */ /* c2 */arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,\n"
+     "           /* c1 */  /* c2 */ arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,\n"
+     "/* c */\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,\n"
+     "           /* c */\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,\n"
+     "/* c1 */ /* c2 */\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,\n"
+     "           /* c1 */  /* c2 */\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,\n"
+     "// c\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,\n"
+     "           // c\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,\n"
+     "/* c1 */ // c2\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,\n"
+     "           /* c1 */  // c2\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,\n"
+     "           /* c1 */\n"
+     "           /* c2 */\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,\n"
+     "// c1\n"
+     "// c2\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,\n"
+     "           // c1\n"
+     "           // c2\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,/* c1 */\n"
+     "/* c2 */arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,  /* c1 */\n"
+     "           /* c2 */ arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,// c1\n"
+     "/* c2 */arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,  // c1\n"
+     "           /* c2 */ arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,  /* c1 */\n"
+     "           /* c2 */\n"
+     "           /* c3 */ arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,/* c1 */\n"
+     "/* c2 */\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,  /* c1 */\n"
+     "           /* c2 */\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,// c1\n"
+     "/* c2 */\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,  // c1\n"
+     "           /* c2 */\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,/* c1 */\n"
+     "// c2\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,  /* c1 */\n"
+     "           // c2\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,// c1\n"
+     "// c2\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,  // c1\n"
+     "           // c2\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,  /* c1 */\n"
+     "           /* c2 */\n"
+     "           /* c3 */\n"
+     "           arg2);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,// c1\n"
+     "// c2\n"
+     "// c3\n"
+     "arg2);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,  // c1\n"
+     "           // c2\n"
+     "           // c3\n"
+     "           arg2);\n"},
+
+    // after last arg
+
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,/* c */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,  /* c */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,/* c1 */ /* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,\n"
+     "           arg2,  /* c1 */  /* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,/* c */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,  /* c */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,/* c1 */ /* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1,\n"
+     "           arg2,  /* c1 */  /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,// c\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,  // c\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,/* c1 */ // c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,  /* c1 */  // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,\n"
+     "/* c */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,\n"
+     "/* c */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,\n"
+     "/* c1 */ /* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,\n"
+     "/* c1 */  /* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,\n"
+     "/* c */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,\n"
+     "           /* c */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,\n"
+     "/* c1 */ /* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,\n"
+     "           /* c1 */  /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,\n"
+     "// c\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,\n"
+     "           // c\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,\n"
+     "/* c1 */ // c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,\n"
+     "           /* c1 */  // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,\n"
+     "           /* c1 */\n"
+     "           /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,\n"
+     "// c1\n"
+     "// c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,\n"
+     "           // c1\n"
+     "           // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,/* c1 */\n"
+     "/* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,  /* c1 */\n"
+     "/* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,// c1\n"
+     "/* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,  // c1\n"
+     "/* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,  /* c1 */\n"
+     "           /* c2 */\n"
+     "/* c3 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,/* c1 */\n"
+     "/* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,  /* c1 */\n"
+     "           /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,// c1\n"
+     "/* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,  // c1\n"
+     "           /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,/* c1 */\n"
+     "// c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,  /* c1 */\n"
+     "           // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,// c1\n"
+     "// c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,  // c1\n"
+     "           // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,  /* c1 */\n"
+     "           /* c2 */\n"
+     "           /* c3 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,// c1\n"
+     "// c2\n"
+     "// c3\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg1, arg2,  // c1\n"
+     "           // c2\n"
+     "           // c3\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,/* c */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,  /* c */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,/* c1 */ /* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,\n"
+     "           arg2,  /* c1 */  /* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,/* c */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,  /* c */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,/* c1 */ /* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1,\n"
+     "           arg2,  /* c1 */  /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,// c\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,  // c\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,/* c1 */ // c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,  /* c1 */  // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,\n"
+     "/* c */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,\n"
+     "/* c */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,\n"
+     "/* c1 */ /* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,\n"
+     "/* c1 */  /* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,\n"
+     "/* c */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,\n"
+     "           /* c */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,\n"
+     "/* c1 */ /* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,\n"
+     "           /* c1 */  /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,\n"
+     "// c\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,\n"
+     "           // c\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,\n"
+     "/* c1 */ // c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,\n"
+     "           /* c1 */  // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,\n"
+     "           /* c1 */\n"
+     "           /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,\n"
+     "// c1\n"
+     "// c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,\n"
+     "           // c1\n"
+     "           // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,/* c1 */\n"
+     "/* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,  /* c1 */\n"
+     "/* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,// c1\n"
+     "/* c2 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,  // c1\n"
+     "/* c2 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */);\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,  /* c1 */\n"
+     "           /* c2 */\n"
+     "/* c3 */);\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,/* c1 */\n"
+     "/* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,  /* c1 */\n"
+     "           /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,// c1\n"
+     "/* c2 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,  // c1\n"
+     "           /* c2 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,/* c1 */\n"
+     "// c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,  /* c1 */\n"
+     "           // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,// c1\n"
+     "// c2\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,  // c1\n"
+     "           // c2\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,  /* c1 */\n"
+     "           /* c2 */\n"
+     "           /* c3 */\n"
+     ");\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,// c1\n"
+     "// c2\n"
+     "// c3\n"
+     ");\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg1, arg2,  // c1\n"
+     "           // c2\n"
+     "           // c3\n"
+     ");\n"},
+
+    // after ')', no args
+
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()/* c */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()  /* c */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()/* c1 */ /* c2 */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()  /* c1 */  /* c2 */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()/* c */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()  /* c */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()/* c1 */ /* c2 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()  /* c1 */  /* c2 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()// c\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()  // c\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()/* c1 */ // c2\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()  /* c1 */  // c2\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()\n"
+     "/* c */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()\n"
+     "/* c */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()\n"
+     "/* c1 */ /* c2 */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()\n"
+     "/* c1 */  /* c2 */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()\n"
+     "/* c */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()\n"
+     "/* c */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()\n"
+     "/* c1 */ /* c2 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()\n"
+     "/* c1 */  /* c2 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()\n"
+     "// c\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()\n"
+     "// c\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()\n"
+     "/* c1 */ // c2\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()\n"
+     "/* c1 */  // c2\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()\n"
+     "// c1\n"
+     "// c2\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()\n"
+     "// c1\n"
+     "// c2\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()/* c1 */\n"
+     "/* c2 */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()  /* c1 */\n"
+     "/* c2 */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()// c1\n"
+     "/* c2 */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()  // c1\n"
+     "/* c2 */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()/* c1 */\n"
+     "/* c2 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()  /* c1 */\n"
+     "/* c2 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()// c1\n"
+     "/* c2 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()  // c1\n"
+     "/* c2 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()/* c1 */\n"
+     "// c2\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()  /* c1 */\n"
+     "// c2\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()// c1\n"
+     "// c2\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()  // c1\n"
+     "// c2\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()// c1\n"
+     "// c2\n"
+     "// c3\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz()  // c1\n"
+     "// c2\n"
+     "// c3\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()/* c */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()  /* c */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()/* c1 */ /* c2 */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()  /* c1 */  /* c2 */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()/* c */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()  /* c */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()/* c1 */ /* c2 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()  /* c1 */  /* c2 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()// c\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()  // c\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()/* c1 */ // c2\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()  /* c1 */  // c2\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()\n"
+     "/* c */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()\n"
+     "/* c */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()\n"
+     "/* c1 */ /* c2 */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()\n"
+     "/* c1 */  /* c2 */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()\n"
+     "/* c */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()\n"
+     "/* c */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()\n"
+     "/* c1 */ /* c2 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()\n"
+     "/* c1 */  /* c2 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()\n"
+     "// c\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()\n"
+     "// c\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()\n"
+     "/* c1 */ // c2\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()\n"
+     "/* c1 */  // c2\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()\n"
+     "// c1\n"
+     "// c2\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()\n"
+     "// c1\n"
+     "// c2\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()/* c1 */\n"
+     "/* c2 */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()  /* c1 */\n"
+     "/* c2 */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()// c1\n"
+     "/* c2 */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()  // c1\n"
+     "/* c2 */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()/* c1 */\n"
+     "/* c2 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()  /* c1 */\n"
+     "/* c2 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()// c1\n"
+     "/* c2 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()  // c1\n"
+     "/* c2 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()/* c1 */\n"
+     "// c2\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()  /* c1 */\n"
+     "// c2\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()// c1\n"
+     "// c2\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()  // c1\n"
+     "// c2\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()// c1\n"
+     "// c2\n"
+     "// c3\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ()  // c1\n"
+     "// c2\n"
+     "// c3\n"
+     ";\n"},
+
+    // after ')', with arg
+
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)/* c */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)  /* c */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)/* c1 */ /* c2 */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)  /* c1 */  /* c2 */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)/* c */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)  /* c */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)/* c1 */ /* c2 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)  /* c1 */  /* c2 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)// c\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)  // c\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)/* c1 */ // c2\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)  /* c1 */  // c2\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)\n"
+     "/* c */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)\n"
+     "/* c */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)\n"
+     "/* c1 */ /* c2 */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)\n"
+     "/* c1 */  /* c2 */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)\n"
+     "/* c */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)\n"
+     "/* c */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)\n"
+     "/* c1 */ /* c2 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)\n"
+     "/* c1 */  /* c2 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)\n"
+     "// c\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)  // c\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)\n"
+     "/* c1 */ // c2\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)\n"
+     "/* c1 */  // c2\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)\n"
+     "// c1\n"
+     "// c2\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)\n"
+     "// c1\n"
+     "// c2\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)/* c1 */\n"
+     "/* c2 */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)  /* c1 */\n"
+     "/* c2 */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)// c1\n"
+     "/* c2 */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)  // c1\n"
+     "/* c2 */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)/* c1 */\n"
+     "/* c2 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)  /* c1 */\n"
+     "/* c2 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)// c1\n"
+     "/* c2 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)  // c1\n"
+     "/* c2 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)/* c1 */\n"
+     "// c2\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)  /* c1 */\n"
+     "// c2\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)// c1\n"
+     "// c2\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)  // c1\n"
+     "// c2\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)// c1\n"
+     "// c2\n"
+     "// c3\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg)  // c1\n"
+     "// c2\n"
+     "// c3\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)/* c */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)  /* c */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)/* c1 */ /* c2 */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)  /* c1 */  /* c2 */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)/* c */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)  /* c */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)/* c1 */ /* c2 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)  /* c1 */  /* c2 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)// c\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)  // c\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)/* c1 */ // c2\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)  /* c1 */  // c2\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)\n"
+     "/* c */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)\n"
+     "/* c */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)\n"
+     "/* c1 */ /* c2 */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)\n"
+     "/* c1 */  /* c2 */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)\n"
+     "/* c */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)\n"
+     "/* c */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)\n"
+     "/* c1 */ /* c2 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)\n"
+     "/* c1 */  /* c2 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)\n"
+     "// c\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)\n"
+     "// c\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)\n"
+     "/* c1 */ // c2\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)\n"
+     "/* c1 */  // c2\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)\n"
+     "// c1\n"
+     "// c2\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)\n"
+     "// c1\n"
+     "// c2\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)/* c1 */\n"
+     "/* c2 */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)  /* c1 */\n"
+     "/* c2 */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)// c1\n"
+     "/* c2 */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)  // c1\n"
+     "/* c2 */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */;\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */;\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)/* c1 */\n"
+     "/* c2 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)  /* c1 */\n"
+     "/* c2 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)// c1\n"
+     "/* c2 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)  // c1\n"
+     "/* c2 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)/* c1 */\n"
+     "// c2\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)  /* c1 */\n"
+     "// c2\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)// c1\n"
+     "// c2\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)  // c1\n"
+     "// c2\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ";\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)// c1\n"
+     "// c2\n"
+     "// c3\n"
+     ";\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg)  // c1\n"
+     "// c2\n"
+     "// c3\n"
+     ";\n"},
+
+    // after ';', no args
+
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();  /* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();  /* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();  /* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();  /* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();// c\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();  // c\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();/* c1 */ // c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();  /* c1 */  // c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();\n"
+     "/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();\n"
+     "/* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();\n"
+     "/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();\n"
+     "/* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();\n"
+     "/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();\n"
+     "/* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();\n"
+     "/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();\n"
+     "/* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();\n"
+     "// c\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();\n"
+     "// c\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();\n"
+     "/* c1 */ // c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();\n"
+     "/* c1 */  // c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();\n"
+     "/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();\n"
+     "/* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();\n"
+     "// c1\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();\n"
+     "// c1\n"
+     "// c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();  /* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();// c1\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();  // c1\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();  /* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();// c1 c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();  // c1 c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();/* c1 */\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();  /* c1 */\n"
+     "// c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();// c1\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();  // c1\n"
+     "// c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();// c1\n"
+     "// c2\n"
+     "// c3\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz();  // c1\n"
+     "// c2\n"
+     "// c3\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();  /* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();  /* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();  /* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();  /* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();// c\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();  // c\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();/* c1 */ // c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();  /* c1 */  // c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();\n"
+     "/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();\n"
+     "/* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();\n"
+     "/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();\n"
+     "/* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();\n"
+     "/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();\n"
+     "/* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();\n"
+     "/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();\n"
+     "/* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();\n"
+     "// c\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();\n"
+     "// c\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();\n"
+     "/* c1 */ // c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();\n"
+     "/* c1 */  // c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();\n"
+     "/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();\n"
+     "/* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();\n"
+     "// c1\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();\n"
+     "// c1\n"
+     "// c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();  /* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();// c1\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();  // c1\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();  /* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();// c1\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();  // c1\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();/* c1 */\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();  /* c1 */\n"
+     "// c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();// c1\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();  // c1\n"
+     "// c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();// c1\n"
+     "// c2\n"
+     "// c3\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ();  // c1\n"
+     "// c2\n"
+     "// c3\n"},
+
+    // after ';', with arg
+
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);  /* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);  /* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);  /* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);  /* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);// c\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);  // c\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);/* c1 */ // c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);  /* c1 */  // c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);\n"
+     "/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);\n"
+     "/* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);\n"
+     "/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);\n"
+     "/* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);\n"
+     "/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);\n"
+     "/* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);\n"
+     "/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);\n"
+     "/* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);\n"
+     "// c\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);\n"
+     "// c\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);\n"
+     "/* c1 */ // c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);\n"
+     "/* c1 */  // c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);\n"
+     "/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);\n"
+     "/* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);\n"
+     "// c1\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);\n"
+     "// c1\n"
+     "// c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);  /* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);// c1\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);  // c1\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);  /* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);// c1 c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);  // c1 c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);/* c1 */\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);  /* c1 */\n"
+     "// c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);// c1\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);  // c1\n"
+     "// c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);// c1\n"
+     "// c2\n"
+     "// c3\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz(arg);  // c1\n"
+     "// c2\n"
+     "// c3\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);  /* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);  /* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);  /* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);  /* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);// c\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);  // c\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);/* c1 */ // c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);  /* c1 */  // c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);\n"
+     "/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);\n"
+     "/* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);\n"
+     "/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);\n"
+     "/* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);\n"
+     "/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);\n"
+     "/* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);\n"
+     "/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);\n"
+     "/* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);\n"
+     "// c\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);\n"
+     "// c\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);\n"
+     "/* c1 */ // c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);\n"
+     "/* c1 */  // c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);\n"
+     "/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);\n"
+     "/* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);\n"
+     "// c1\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);\n"
+     "// c1\n"
+     "// c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);  /* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);// c1\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);  // c1\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);  /* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);// c1\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);  // c1\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);/* c1 */\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);  /* c1 */\n"
+     "// c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);// c1\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);  // c1\n"
+     "// c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);// c1\n"
+     "// c2\n"
+     "// c3\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(arg);  // c1\n"
+     "// c2\n"
+     "// c3\n"},
+
+    // everywhere, no args
+
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz/* c */(/* c */)/* c */;/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c */\n"
+     "    (  /* c */)  /* c */;  /* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz/* c1 */ /* c2 */(/* c1 */ /* c2 */)/* c1 */ /* c2 */;/* c1 */ "
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */  /* c2 */\n"
+     "    (  /* c1 */  /* c2 */)  /* c1 */  /* c2 */;  /* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz/* c */\n"
+     "(/* c */\n"
+     ")/* c */\n"
+     ";/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c */\n"
+     "    (  /* c */\n"
+     "    )  /* c */\n"
+     ";  /* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz/* c1 */ /* c2 */\n"
+     "(/* c1 */ /* c2 */\n"
+     ")/* c1 */ /* c2 */\n"
+     ";/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */  /* c2 */\n"
+     "    (  /* c1 */  /* c2 */\n"
+     "    )  /* c1 */  /* c2 */\n"
+     ";  /* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz// c\n"
+     "(// c\n"
+     ")// c\n"
+     ";// c\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  // c\n"
+     "    (  // c\n"
+     "    )  // c\n"
+     ";  // c\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz/* c1 */ // c2\n"
+     "(/* c1 */ // c2\n"
+     ")/* c1 */ // c2\n"
+     ";/* c1 */ // c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */  // c2\n"
+     "    (  /* c1 */  // c2\n"
+     "    )  /* c1 */  // c2\n"
+     ";  /* c1 */  // c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c */(\n"
+     "/* c */)\n"
+     "/* c */;\n"
+     "/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c */ (\n"
+     "    /* c */)\n"
+     "/* c */;\n"
+     "/* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c1 */ /* c2 */(\n"
+     "/* c1 */ /* c2 */)\n"
+     "/* c1 */ /* c2 */;\n"
+     "/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c1 */  /* c2 */ (\n"
+     "    /* c1 */  /* c2 */)\n"
+     "/* c1 */  /* c2 */;\n"
+     "/* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c */\n"
+     "(\n"
+     "/* c */\n"
+     ")\n"
+     "/* c */\n"
+     ";\n"
+     "/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c */\n"
+     "    (\n"
+     "        /* c */\n"
+     "    )\n"
+     "/* c */\n"
+     ";\n"
+     "/* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c1 */ /* c2 */\n"
+     "(\n"
+     "/* c1 */ /* c2 */\n"
+     ")\n"
+     "/* c1 */ /* c2 */\n"
+     ";\n"
+     "/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c1 */  /* c2 */\n"
+     "    (\n"
+     "        /* c1 */  /* c2 */\n"
+     "    )\n"
+     "/* c1 */  /* c2 */\n"
+     ";\n"
+     "/* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "// c\n"
+     "(\n"
+     "// c\n"
+     ")\n"
+     "// c\n"
+     ";\n"
+     "// c\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    // c\n"
+     "    (\n"
+     "        // c\n"
+     "    )\n"
+     "// c\n"
+     ";\n"
+     "// c\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c1 */ // c2\n"
+     "(\n"
+     "/* c1 */ // c2\n"
+     ")\n"
+     "/* c1 */ // c2\n"
+     ";\n"
+     "/* c1 */ // c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c1 */  // c2\n"
+     "    (\n"
+     "        /* c1 */  // c2\n"
+     "    )\n"
+     "/* c1 */  // c2\n"
+     ";\n"
+     "/* c1 */  // c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     "(\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ")\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ";\n"
+     "/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c1 */\n"
+     "    /* c2 */\n"
+     "    (\n"
+     "        /* c1 */\n"
+     "        /* c2 */\n"
+     "    )\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ";\n"
+     "/* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "// c1\n"
+     "// c2\n"
+     "(\n"
+     "// c1\n"
+     "// c2\n"
+     ")\n"
+     "// c1\n"
+     "// c2\n"
+     ";\n"
+     "// c1\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    // c1\n"
+     "    // c2\n"
+     "    (\n"
+     "        // c1\n"
+     "        // c2\n"
+     "    )\n"
+     "// c1\n"
+     "// c2\n"
+     ";\n"
+     "// c1\n"
+     "// c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz/* c1 */\n"
+     "/* c2 */(/* c1 */\n"
+     "/* c2 */)/* c1 */\n"
+     "/* c2 */;/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */\n"
+     "    /* c2 */ (  /* c1 */\n"
+     "    /* c2 */)  /* c1 */\n"
+     "/* c2 */;  /* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz// c1\n"
+     "/* c2 */(// c1\n"
+     "/* c2 */)// c1\n"
+     "/* c2 */;// c1\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  // c1\n"
+     "    /* c2 */ (  // c1\n"
+     "    /* c2 */)  // c1\n"
+     "/* c2 */;  // c1\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */(/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */)/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */;/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */\n"
+     "    /* c2 */\n"
+     "    /* c3 */ (  /* c1 */\n"
+     "        /* c2 */\n"
+     "    /* c3 */)  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */;  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz/* c1 */\n"
+     "/* c2 */\n"
+     "(/* c1 */\n"
+     "/* c2 */\n"
+     ")/* c1 */\n"
+     "/* c2 */\n"
+     ";/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */\n"
+     "    /* c2 */\n"
+     "    (  /* c1 */\n"
+     "        /* c2 */\n"
+     "    )  /* c1 */\n"
+     "/* c2 */\n"
+     ";  /* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz// c1\n"
+     "/* c2 */\n"
+     "(// c1\n"
+     "/* c2 */\n"
+     ")// c1\n"
+     "/* c2 */\n"
+     ";// c1\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  // c1\n"
+     "    /* c2 */\n"
+     "    (  // c1\n"
+     "        /* c2 */\n"
+     "    )  // c1\n"
+     "/* c2 */\n"
+     ";  // c1\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz/* c1 */\n"
+     "// c2\n"
+     "(/* c1 */\n"
+     "// c2\n"
+     ")/* c1 */\n"
+     "// c2\n"
+     ";/* c1 */\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */\n"
+     "    // c2\n"
+     "    (  /* c1 */\n"
+     "        // c2\n"
+     "    )  /* c1 */\n"
+     "// c2\n"
+     ";  /* c1 */\n"
+     "// c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz// c1\n"
+     "// c2\n"
+     "(// c1\n"
+     "// c2\n"
+     ")// c1\n"
+     "// c2\n"
+     ";// c1\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  // c1\n"
+     "    // c2\n"
+     "    (  // c1\n"
+     "       // c2\n"
+     "    )  // c1\n"
+     "       // c2\n"
+     ";  // c1\n"
+     "   // c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     "(/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ")/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ";/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */\n"
+     "    /* c2 */\n"
+     "    /* c3 */\n"
+     "    (  /* c1 */\n"
+     "        /* c2 */\n"
+     "        /* c3 */\n"
+     "    )  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ";  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz// c1\n"
+     "// c2\n"
+     "// c3\n"
+     "(// c1\n"
+     "// c2\n"
+     "// c3\n"
+     ")// c1\n"
+     "// c2\n"
+     "// c3\n"
+     ";// c1\n"
+     "// c2\n"
+     "// c3\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  // c1\n"
+     "    // c2\n"
+     "    // c3\n"
+     "    (  // c1\n"
+     "       // c2\n"
+     "       // c3\n"
+     "    )  // c1\n"
+     "       // c2\n"
+     "       // c3\n"
+     ";  // c1\n"
+     "   // c2\n"
+     "   // c3\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c */)/* c */;/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c */)  /* c */;  /* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */ /* c2 */)/* c1 */ /* c2 */;/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */  /* c2 */)  /* c1 */  /* c2 */;  /* c1 */  /* c2 "
+     "*/\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c */\n"
+     ")/* c */\n"
+     ";/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c */\n"
+     ")  /* c */\n"
+     ";  /* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */ /* c2 */\n"
+     ")/* c1 */ /* c2 */\n"
+     ";/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */  /* c2 */\n"
+     ")  /* c1 */  /* c2 */\n"
+     ";  /* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(// c\n"
+     ")// c\n"
+     ";// c\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  // c\n"
+     ")  // c\n"
+     ";  // c\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */ // c2\n"
+     ")/* c1 */ // c2\n"
+     ";/* c1 */ // c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */  // c2\n"
+     ")  /* c1 */  // c2\n"
+     ";  /* c1 */  // c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c */)\n"
+     "/* c */;\n"
+     "/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c */)\n"
+     "/* c */;\n"
+     "/* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c1 */ /* c2 */)\n"
+     "/* c1 */ /* c2 */;\n"
+     "/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c1 */  /* c2 */)\n"
+     "/* c1 */  /* c2 */;\n"
+     "/* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c */\n"
+     ")\n"
+     "/* c */\n"
+     ";\n"
+     "/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    /* c */\n"
+     ")\n"
+     "/* c */\n"
+     ";\n"
+     "/* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c1 */ /* c2 */\n"
+     ")\n"
+     "/* c1 */ /* c2 */\n"
+     ";\n"
+     "/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    /* c1 */  /* c2 */\n"
+     ")\n"
+     "/* c1 */  /* c2 */\n"
+     ";\n"
+     "/* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "// c\n"
+     ")\n"
+     "// c\n"
+     ";\n"
+     "// c\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    // c\n"
+     ")\n"
+     "// c\n"
+     ";\n"
+     "// c\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c1 */ // c2\n"
+     ")\n"
+     "/* c1 */ // c2\n"
+     ";\n"
+     "/* c1 */ // c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    /* c1 */  // c2\n"
+     ")\n"
+     "/* c1 */  // c2\n"
+     ";\n"
+     "/* c1 */  // c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ")\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ";\n"
+     "/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    /* c1 */\n"
+     "    /* c2 */\n"
+     ")\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ";\n"
+     "/* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "// c1\n"
+     "// c2\n"
+     ")\n"
+     "// c1\n"
+     "// c2\n"
+     ";\n"
+     "// c1\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    // c1\n"
+     "    // c2\n"
+     ")\n"
+     "// c1\n"
+     "// c2\n"
+     ";\n"
+     "// c1\n"
+     "// c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */\n"
+     "/* c2 */)/* c1 */\n"
+     "/* c2 */;/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */\n"
+     "/* c2 */)  /* c1 */\n"
+     "/* c2 */;  /* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(// c1\n"
+     "/* c2 */)// c1\n"
+     "/* c2 */;// c1\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  // c1\n"
+     "/* c2 */)  // c1\n"
+     "/* c2 */;  // c1\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */)/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */;/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */\n"
+     "    /* c2 */\n"
+     "/* c3 */)  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */;  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */\n"
+     "/* c2 */\n"
+     ")/* c1 */\n"
+     "/* c2 */\n"
+     ";/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */\n"
+     "    /* c2 */\n"
+     ")  /* c1 */\n"
+     "/* c2 */\n"
+     ";  /* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(// c1\n"
+     "/* c2 */\n"
+     ")// c1\n"
+     "/* c2 */\n"
+     ";// c1\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  // c1\n"
+     "    /* c2 */\n"
+     ")  // c1\n"
+     "/* c2 */\n"
+     ";  // c1\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */\n"
+     "// c2\n"
+     ")/* c1 */\n"
+     "// c2\n"
+     ";/* c1 */\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */\n"
+     "    // c2\n"
+     ")  /* c1 */\n"
+     "// c2\n"
+     ";  /* c1 */\n"
+     "// c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(// c1\n"
+     "// c2\n"
+     ")// c1\n"
+     "// c2\n"
+     ";// c1\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  // c1\n"
+     "    // c2\n"
+     ")  // c1\n"
+     "   // c2\n"
+     ";  // c1\n"
+     "   // c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ")/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ";/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */\n"
+     "    /* c2 */\n"
+     "    /* c3 */\n"
+     ")  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ";  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(// c1\n"
+     "// c2\n"
+     "// c3\n"
+     ")// c1\n"
+     "// c2\n"
+     "// c3\n"
+     ";// c1\n"
+     "// c2\n"
+     "// c3\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  // c1\n"
+     "    // c2\n"
+     "    // c3\n"
+     ")  // c1\n"
+     "   // c2\n"
+     "   // c3\n"
+     ";  // c1\n"
+     "   // c2\n"
+     "   // c3\n"},
+
+    // everywhere, with args
+
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz/* c */(/* c */arg1/* c */,/* c */arg2/* c */)/* c */;/* c "
+     "*/\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c */ (  /* c */\n"
+     "    arg1  /* c */,  /* c */\n"
+     "    arg2  /* c */)  /* c */;  /* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz/* c1 */ /* c2 */(/* c1 */ /* c2 */arg1/* c1 */ /* c2 */,/* c1 "
+     "*/ /* c2 */arg2/* c1 */ /* c2 */)/* c1 */ /* c2 */;/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */  /* c2 */ (  /* c1 */  /* c2 */\n"
+     "    arg1  /* c1 */  /* c2 */,  /* c1 */  /* c2 */\n"
+     "    arg2  /* c1 */  /* c2 */)  /* c1 */  /* c2 */;  /* c1 */  /* c2 "
+     "*/\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz/* c */\n"
+     "(/* c */\n"
+     "arg1/* c */\n"
+     ",/* c */\n"
+     "arg2/* c */\n"
+     ")/* c */\n"
+     ";/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c */\n"
+     "    (  /* c */\n"
+     "        arg1  /* c */\n"
+     "        ,  /* c */\n"
+     "        arg2  /* c */\n"
+     "    )  /* c */\n"
+     ";  /* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz/* c1 */ /* c2 */\n"
+     "(/* c1 */ /* c2 */\n"
+     "arg1/* c1 */ /* c2 */\n"
+     ",/* c1 */ /* c2 */\n"
+     "arg2/* c1 */ /* c2 */\n"
+     ")/* c1 */ /* c2 */\n"
+     ";/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */  /* c2 */\n"
+     "    (  /* c1 */  /* c2 */\n"
+     "        arg1  /* c1 */  /* c2 */\n"
+     "        ,  /* c1 */  /* c2 */\n"
+     "        arg2  /* c1 */  /* c2 */\n"
+     "    )  /* c1 */  /* c2 */\n"
+     ";  /* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz// c\n"
+     "(// c\n"
+     "arg1// c\n"
+     ",// c\n"
+     "arg2// c\n"
+     ")// c\n"
+     ";// c\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  // c\n"
+     "    (  // c\n"
+     "        arg1  // c\n"
+     "        ,  // c\n"
+     "        arg2  // c\n"
+     "    )  // c\n"
+     ";  // c\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz/* c1 */ // c2\n"
+     "(/* c1 */ // c2\n"
+     "arg1/* c1 */ // c2\n"
+     ",/* c1 */ // c2\n"
+     "arg2/* c1 */ // c2\n"
+     ")/* c1 */ // c2\n"
+     ";/* c1 */ // c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */  // c2\n"
+     "    (  /* c1 */  // c2\n"
+     "        arg1  /* c1 */  // c2\n"
+     "        ,  /* c1 */  // c2\n"
+     "        arg2  /* c1 */  // c2\n"
+     "    )  /* c1 */  // c2\n"
+     ";  /* c1 */  // c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c */(\n"
+     "/* c */arg1\n"
+     "/* c */,\n"
+     "/* c */arg2\n"
+     "/* c */)\n"
+     "/* c */;\n"
+     "/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c */ (\n"
+     "        /* c */ arg1\n"
+     "        /* c */,\n"
+     "        /* c */ arg2\n"
+     "    /* c */)\n"
+     "/* c */;\n"
+     "/* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c1 */ /* c2 */(\n"
+     "/* c1 */ /* c2 */arg1\n"
+     "/* c1 */ /* c2 */,\n"
+     "/* c1 */ /* c2 */arg2\n"
+     "/* c1 */ /* c2 */)\n"
+     "/* c1 */ /* c2 */;\n"
+     "/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c1 */  /* c2 */ (\n"
+     "        /* c1 */  /* c2 */ arg1\n"
+     "        /* c1 */  /* c2 */,\n"
+     "        /* c1 */  /* c2 */ arg2\n"
+     "    /* c1 */  /* c2 */)\n"
+     "/* c1 */  /* c2 */;\n"
+     "/* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c */\n"
+     "(\n"
+     "/* c */\n"
+     "arg1\n"
+     "/* c */\n"
+     ",\n"
+     "/* c */\n"
+     "arg2\n"
+     "/* c */\n"
+     ")\n"
+     "/* c */\n"
+     ";\n"
+     "/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c */\n"
+     "    (\n"
+     "        /* c */\n"
+     "        arg1\n"
+     "        /* c */\n"
+     "        ,\n"
+     "        /* c */\n"
+     "        arg2\n"
+     "        /* c */\n"
+     "    )\n"
+     "/* c */\n"
+     ";\n"
+     "/* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c1 */ /* c2 */\n"
+     "(\n"
+     "/* c1 */ /* c2 */\n"
+     "arg1\n"
+     "/* c1 */ /* c2 */\n"
+     ",\n"
+     "/* c1 */ /* c2 */\n"
+     "arg2\n"
+     "/* c1 */ /* c2 */\n"
+     ")\n"
+     "/* c1 */ /* c2 */\n"
+     ";\n"
+     "/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c1 */  /* c2 */\n"
+     "    (\n"
+     "        /* c1 */  /* c2 */\n"
+     "        arg1\n"
+     "        /* c1 */  /* c2 */\n"
+     "        ,\n"
+     "        /* c1 */  /* c2 */\n"
+     "        arg2\n"
+     "        /* c1 */  /* c2 */\n"
+     "    )\n"
+     "/* c1 */  /* c2 */\n"
+     ";\n"
+     "/* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "// c\n"
+     "(\n"
+     "// c\n"
+     "arg1\n"
+     "// c\n"
+     ",\n"
+     "// c\n"
+     "arg2\n"
+     "// c\n"
+     ")\n"
+     "// c\n"
+     ";\n"
+     "// c\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    // c\n"
+     "    (\n"
+     "        // c\n"
+     "        arg1\n"
+     "        // c\n"
+     "        ,\n"
+     "        // c\n"
+     "        arg2\n"
+     "        // c\n"
+     "    )\n"
+     "// c\n"
+     ";\n"
+     "// c\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c1 */ // c2\n"
+     "(\n"
+     "/* c1 */ // c2\n"
+     "arg1\n"
+     "/* c1 */ // c2\n"
+     ",\n"
+     "/* c1 */ // c2\n"
+     "arg2\n"
+     "/* c1 */ // c2\n"
+     ")\n"
+     "/* c1 */ // c2\n"
+     ";\n"
+     "/* c1 */ // c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c1 */  // c2\n"
+     "    (\n"
+     "        /* c1 */  // c2\n"
+     "        arg1\n"
+     "        /* c1 */  // c2\n"
+     "        ,\n"
+     "        /* c1 */  // c2\n"
+     "        arg2\n"
+     "        /* c1 */  // c2\n"
+     "    )\n"
+     "/* c1 */  // c2\n"
+     ";\n"
+     "/* c1 */  // c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     "(\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     "arg1\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ",\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     "arg2\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ")\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ";\n"
+     "/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    /* c1 */\n"
+     "    /* c2 */\n"
+     "    (\n"
+     "        /* c1 */\n"
+     "        /* c2 */\n"
+     "        arg1\n"
+     "        /* c1 */\n"
+     "        /* c2 */\n"
+     "        ,\n"
+     "        /* c1 */\n"
+     "        /* c2 */\n"
+     "        arg2\n"
+     "        /* c1 */\n"
+     "        /* c2 */\n"
+     "    )\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ";\n"
+     "/* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "// c1\n"
+     "// c2\n"
+     "(\n"
+     "// c1\n"
+     "// c2\n"
+     "arg1\n"
+     "// c1\n"
+     "// c2\n"
+     ",\n"
+     "// c1\n"
+     "// c2\n"
+     "arg2\n"
+     "// c1\n"
+     "// c2\n"
+     ")\n"
+     "// c1\n"
+     "// c2\n"
+     ";\n"
+     "// c1\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz\n"
+     "    // c1\n"
+     "    // c2\n"
+     "    (\n"
+     "        // c1\n"
+     "        // c2\n"
+     "        arg1\n"
+     "        // c1\n"
+     "        // c2\n"
+     "        ,\n"
+     "        // c1\n"
+     "        // c2\n"
+     "        arg2\n"
+     "        // c1\n"
+     "        // c2\n"
+     "    )\n"
+     "// c1\n"
+     "// c2\n"
+     ";\n"
+     "// c1\n"
+     "// c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz/* c1 */\n"
+     "/* c2 */(/* c1 */\n"
+     "/* c2 */arg1/* c1 */\n"
+     "/* c2 */,/* c1 */\n"
+     "/* c2 */arg2/* c1 */\n"
+     "/* c2 */)/* c1 */\n"
+     "/* c2 */;/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */\n"
+     "    /* c2 */ (  /* c1 */\n"
+     "        /* c2 */ arg1  /* c1 */\n"
+     "        /* c2 */,  /* c1 */\n"
+     "        /* c2 */ arg2  /* c1 */\n"
+     "    /* c2 */)  /* c1 */\n"
+     "/* c2 */;  /* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz// c1\n"
+     "/* c2 */(// c1\n"
+     "/* c2 */arg1// c1\n"
+     "/* c2 */,// c1\n"
+     "/* c2 */arg2// c1\n"
+     "/* c2 */)// c1\n"
+     "/* c2 */;// c1\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  // c1\n"
+     "    /* c2 */ (  // c1\n"
+     "        /* c2 */ arg1  // c1\n"
+     "        /* c2 */,  // c1\n"
+     "        /* c2 */ arg2  // c1\n"
+     "    /* c2 */)  // c1\n"
+     "/* c2 */;  // c1\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */(/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */arg1/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */,/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */arg2/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */)/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */;/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */\n"
+     "    /* c2 */\n"
+     "    /* c3 */ (  /* c1 */\n"
+     "        /* c2 */\n"
+     "        /* c3 */ arg1  /* c1 */\n"
+     "        /* c2 */\n"
+     "        /* c3 */,  /* c1 */\n"
+     "        /* c2 */\n"
+     "        /* c3 */ arg2  /* c1 */\n"
+     "        /* c2 */\n"
+     "    /* c3 */)  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */;  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz/* c1 */\n"
+     "/* c2 */\n"
+     "(/* c1 */\n"
+     "/* c2 */\n"
+     "arg1/* c1 */\n"
+     "/* c2 */\n"
+     ",/* c1 */\n"
+     "/* c2 */\n"
+     "arg2/* c1 */\n"
+     "/* c2 */\n"
+     ")/* c1 */\n"
+     "/* c2 */\n"
+     ";/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */\n"
+     "    /* c2 */\n"
+     "    (  /* c1 */\n"
+     "        /* c2 */\n"
+     "        arg1  /* c1 */\n"
+     "        /* c2 */\n"
+     "        ,  /* c1 */\n"
+     "        /* c2 */\n"
+     "        arg2  /* c1 */\n"
+     "        /* c2 */\n"
+     "    )  /* c1 */\n"
+     "/* c2 */\n"
+     ";  /* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz// c1\n"
+     "/* c2 */\n"
+     "(// c1\n"
+     "/* c2 */\n"
+     "arg1// c1\n"
+     "/* c2 */\n"
+     ",// c1\n"
+     "/* c2 */\n"
+     "arg2// c1\n"
+     "/* c2 */\n"
+     ")// c1\n"
+     "/* c2 */\n"
+     ";// c1\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  // c1\n"
+     "    /* c2 */\n"
+     "    (  // c1\n"
+     "        /* c2 */\n"
+     "        arg1  // c1\n"
+     "        /* c2 */\n"
+     "        ,  // c1\n"
+     "        /* c2 */\n"
+     "        arg2  // c1\n"
+     "        /* c2 */\n"
+     "    )  // c1\n"
+     "/* c2 */\n"
+     ";  // c1\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz/* c1 */\n"
+     "// c2\n"
+     "(/* c1 */\n"
+     "// c2\n"
+     "arg1/* c1 */\n"
+     "// c2\n"
+     ",/* c1 */\n"
+     "// c2\n"
+     "arg2/* c1 */\n"
+     "// c2\n"
+     ")/* c1 */\n"
+     "// c2\n"
+     ";/* c1 */\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */\n"
+     "    // c2\n"
+     "    (  /* c1 */\n"
+     "        // c2\n"
+     "        arg1  /* c1 */\n"
+     "        // c2\n"
+     "        ,  /* c1 */\n"
+     "        // c2\n"
+     "        arg2  /* c1 */\n"
+     "        // c2\n"
+     "    )  /* c1 */\n"
+     "// c2\n"
+     ";  /* c1 */\n"
+     "// c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz// c1\n"
+     "// c2\n"
+     "(// c1\n"
+     "// c2\n"
+     "arg1// c1\n"
+     "// c2\n"
+     ",// c1\n"
+     "// c2\n"
+     "arg2// c1\n"
+     "// c2\n"
+     ")// c1\n"
+     "// c2\n"
+     ";// c1\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  // c1\n"
+     "    // c2\n"
+     "    (  // c1\n"
+     "       // c2\n"
+     "        arg1  // c1\n"
+     "        // c2\n"
+     "        ,  // c1\n"
+     "           // c2\n"
+     "        arg2  // c1\n"
+     "        // c2\n"
+     "    )  // c1\n"
+     "       // c2\n"
+     ";  // c1\n"
+     "   // c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     "(/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     "arg1/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ",/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     "arg2/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ")/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ";/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  /* c1 */\n"
+     "    /* c2 */\n"
+     "    /* c3 */\n"
+     "    (  /* c1 */\n"
+     "        /* c2 */\n"
+     "        /* c3 */\n"
+     "        arg1  /* c1 */\n"
+     "        /* c2 */\n"
+     "        /* c3 */\n"
+     "        ,  /* c1 */\n"
+     "        /* c2 */\n"
+     "        /* c3 */\n"
+     "        arg2  /* c1 */\n"
+     "        /* c2 */\n"
+     "        /* c3 */\n"
+     "    )  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ";  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz// c1\n"
+     "// c2\n"
+     "// c3\n"
+     "(// c1\n"
+     "// c2\n"
+     "// c3\n"
+     "arg1// c1\n"
+     "// c2\n"
+     "// c3\n"
+     ",// c1\n"
+     "// c2\n"
+     "// c3\n"
+     "arg2// c1\n"
+     "// c2\n"
+     "// c3\n"
+     ")// c1\n"
+     "// c2\n"
+     "// c3\n"
+     ";// c1\n"
+     "// c2\n"
+     "// c3\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "$foobarbaz  // c1\n"
+     "    // c2\n"
+     "    // c3\n"
+     "    (  // c1\n"
+     "       // c2\n"
+     "       // c3\n"
+     "        arg1  // c1\n"
+     "        // c2\n"
+     "        // c3\n"
+     "        ,  // c1\n"
+     "           // c2\n"
+     "           // c3\n"
+     "        arg2  // c1\n"
+     "        // c2\n"
+     "        // c3\n"
+     "    )  // c1\n"
+     "       // c2\n"
+     "       // c3\n"
+     ";  // c1\n"
+     "   // c2\n"
+     "   // c3\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c */arg1/* c */,/* c */arg2/* c */)/* c */;/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c */\n"
+     "    arg1  /* c */,  /* c */\n"
+     "    arg2  /* c */)  /* c */;  /* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */ /* c2 */arg1/* c1 */ /* c2 */,/* c1 */ /* c2 "
+     "*/arg2/* c1 */ /* c2 */)/* c1 */ /* c2 */;/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */  /* c2 */\n"
+     "    arg1  /* c1 */  /* c2 */,  /* c1 */  /* c2 */\n"
+     "    arg2  /* c1 */  /* c2 */)  /* c1 */  /* c2 */;  /* c1 */  /* c2 "
+     "*/\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c */\n"
+     "arg1/* c */\n"
+     ",/* c */\n"
+     "arg2/* c */\n"
+     ")/* c */\n"
+     ";/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c */\n"
+     "    arg1  /* c */\n"
+     "    ,  /* c */\n"
+     "    arg2  /* c */\n"
+     ")  /* c */\n"
+     ";  /* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */ /* c2 */\n"
+     "arg1/* c1 */ /* c2 */\n"
+     ",/* c1 */ /* c2 */\n"
+     "arg2/* c1 */ /* c2 */\n"
+     ")/* c1 */ /* c2 */\n"
+     ";/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */  /* c2 */\n"
+     "    arg1  /* c1 */  /* c2 */\n"
+     "    ,  /* c1 */  /* c2 */\n"
+     "    arg2  /* c1 */  /* c2 */\n"
+     ")  /* c1 */  /* c2 */\n"
+     ";  /* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(// c\n"
+     "arg1// c\n"
+     ",// c\n"
+     "arg2// c\n"
+     ")// c\n"
+     ";// c\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  // c\n"
+     "    arg1  // c\n"
+     "    ,  // c\n"
+     "    arg2  // c\n"
+     ")  // c\n"
+     ";  // c\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */ // c2\n"
+     "arg1/* c1 */ // c2\n"
+     ",/* c1 */ // c2\n"
+     "arg2/* c1 */ // c2\n"
+     ")/* c1 */ // c2\n"
+     ";/* c1 */ // c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */  // c2\n"
+     "    arg1  /* c1 */  // c2\n"
+     "    ,  /* c1 */  // c2\n"
+     "    arg2  /* c1 */  // c2\n"
+     ")  /* c1 */  // c2\n"
+     ";  /* c1 */  // c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c */arg1\n"
+     "/* c */,\n"
+     "/* c */arg2\n"
+     "/* c */)\n"
+     "/* c */;\n"
+     "/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    /* c */ arg1\n"
+     "    /* c */,\n"
+     "    /* c */ arg2\n"
+     "/* c */)\n"
+     "/* c */;\n"
+     "/* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c1 */ /* c2 */arg1\n"
+     "/* c1 */ /* c2 */,\n"
+     "/* c1 */ /* c2 */arg2\n"
+     "/* c1 */ /* c2 */)\n"
+     "/* c1 */ /* c2 */;\n"
+     "/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    /* c1 */  /* c2 */ arg1\n"
+     "    /* c1 */  /* c2 */,\n"
+     "    /* c1 */  /* c2 */ arg2\n"
+     "/* c1 */  /* c2 */)\n"
+     "/* c1 */  /* c2 */;\n"
+     "/* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c */\n"
+     "arg1\n"
+     "/* c */\n"
+     ",\n"
+     "/* c */\n"
+     "arg2\n"
+     "/* c */\n"
+     ")\n"
+     "/* c */\n"
+     ";\n"
+     "/* c */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    /* c */\n"
+     "    arg1\n"
+     "    /* c */\n"
+     "    ,\n"
+     "    /* c */\n"
+     "    arg2\n"
+     "    /* c */\n"
+     ")\n"
+     "/* c */\n"
+     ";\n"
+     "/* c */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c1 */ /* c2 */\n"
+     "arg1\n"
+     "/* c1 */ /* c2 */\n"
+     ",\n"
+     "/* c1 */ /* c2 */\n"
+     "arg2\n"
+     "/* c1 */ /* c2 */\n"
+     ")\n"
+     "/* c1 */ /* c2 */\n"
+     ";\n"
+     "/* c1 */ /* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    /* c1 */  /* c2 */\n"
+     "    arg1\n"
+     "    /* c1 */  /* c2 */\n"
+     "    ,\n"
+     "    /* c1 */  /* c2 */\n"
+     "    arg2\n"
+     "    /* c1 */  /* c2 */\n"
+     ")\n"
+     "/* c1 */  /* c2 */\n"
+     ";\n"
+     "/* c1 */  /* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "// c\n"
+     "arg1\n"
+     "// c\n"
+     ",\n"
+     "// c\n"
+     "arg2\n"
+     "// c\n"
+     ")\n"
+     "// c\n"
+     ";\n"
+     "// c\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    // c\n"
+     "    arg1\n"
+     "    // c\n"
+     "    ,\n"
+     "    // c\n"
+     "    arg2\n"
+     "    // c\n"
+     ")\n"
+     "// c\n"
+     ";\n"
+     "// c\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c1 */ // c2\n"
+     "arg1\n"
+     "/* c1 */ // c2\n"
+     ",\n"
+     "/* c1 */ // c2\n"
+     "arg2\n"
+     "/* c1 */ // c2\n"
+     ")\n"
+     "/* c1 */ // c2\n"
+     ";\n"
+     "/* c1 */ // c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    /* c1 */  // c2\n"
+     "    arg1\n"
+     "    /* c1 */  // c2\n"
+     "    ,\n"
+     "    /* c1 */  // c2\n"
+     "    arg2\n"
+     "    /* c1 */  // c2\n"
+     ")\n"
+     "/* c1 */  // c2\n"
+     ";\n"
+     "/* c1 */  // c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     "arg1\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ",\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     "arg2\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ")\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ";\n"
+     "/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    /* c1 */\n"
+     "    /* c2 */\n"
+     "    arg1\n"
+     "    /* c1 */\n"
+     "    /* c2 */\n"
+     "    ,\n"
+     "    /* c1 */\n"
+     "    /* c2 */\n"
+     "    arg2\n"
+     "    /* c1 */\n"
+     "    /* c2 */\n"
+     ")\n"
+     "/* c1 */\n"
+     "/* c2 */\n"
+     ";\n"
+     "/* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "// c1\n"
+     "// c2\n"
+     "arg1\n"
+     "// c1\n"
+     "// c2\n"
+     ",\n"
+     "// c1\n"
+     "// c2\n"
+     "arg2\n"
+     "// c1\n"
+     "// c2\n"
+     ")\n"
+     "// c1\n"
+     "// c2\n"
+     ";\n"
+     "// c1\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(\n"
+     "    // c1\n"
+     "    // c2\n"
+     "    arg1\n"
+     "    // c1\n"
+     "    // c2\n"
+     "    ,\n"
+     "    // c1\n"
+     "    // c2\n"
+     "    arg2\n"
+     "    // c1\n"
+     "    // c2\n"
+     ")\n"
+     "// c1\n"
+     "// c2\n"
+     ";\n"
+     "// c1\n"
+     "// c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */\n"
+     "/* c2 */arg1/* c1 */\n"
+     "/* c2 */,/* c1 */\n"
+     "/* c2 */arg2/* c1 */\n"
+     "/* c2 */)/* c1 */\n"
+     "/* c2 */;/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */\n"
+     "    /* c2 */ arg1  /* c1 */\n"
+     "    /* c2 */,  /* c1 */\n"
+     "    /* c2 */ arg2  /* c1 */\n"
+     "/* c2 */)  /* c1 */\n"
+     "/* c2 */;  /* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(// c1\n"
+     "/* c2 */arg1// c1\n"
+     "/* c2 */,// c1\n"
+     "/* c2 */arg2// c1\n"
+     "/* c2 */)// c1\n"
+     "/* c2 */;// c1\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  // c1\n"
+     "    /* c2 */ arg1  // c1\n"
+     "    /* c2 */,  // c1\n"
+     "    /* c2 */ arg2  // c1\n"
+     "/* c2 */)  // c1\n"
+     "/* c2 */;  // c1\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */arg1/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */,/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */arg2/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */)/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */;/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */\n"
+     "    /* c2 */\n"
+     "    /* c3 */ arg1  /* c1 */\n"
+     "    /* c2 */\n"
+     "    /* c3 */,  /* c1 */\n"
+     "    /* c2 */\n"
+     "    /* c3 */ arg2  /* c1 */\n"
+     "    /* c2 */\n"
+     "/* c3 */)  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */;  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */\n"
+     "/* c2 */\n"
+     "arg1/* c1 */\n"
+     "/* c2 */\n"
+     ",/* c1 */\n"
+     "/* c2 */\n"
+     "arg2/* c1 */\n"
+     "/* c2 */\n"
+     ")/* c1 */\n"
+     "/* c2 */\n"
+     ";/* c1 */\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */\n"
+     "    /* c2 */\n"
+     "    arg1  /* c1 */\n"
+     "    /* c2 */\n"
+     "    ,  /* c1 */\n"
+     "    /* c2 */\n"
+     "    arg2  /* c1 */\n"
+     "    /* c2 */\n"
+     ")  /* c1 */\n"
+     "/* c2 */\n"
+     ";  /* c1 */\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(// c1\n"
+     "/* c2 */\n"
+     "arg1// c1\n"
+     "/* c2 */\n"
+     ",// c1\n"
+     "/* c2 */\n"
+     "arg2// c1\n"
+     "/* c2 */\n"
+     ")// c1\n"
+     "/* c2 */\n"
+     ";// c1\n"
+     "/* c2 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  // c1\n"
+     "    /* c2 */\n"
+     "    arg1  // c1\n"
+     "    /* c2 */\n"
+     "    ,  // c1\n"
+     "    /* c2 */\n"
+     "    arg2  // c1\n"
+     "    /* c2 */\n"
+     ")  // c1\n"
+     "/* c2 */\n"
+     ";  // c1\n"
+     "/* c2 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */\n"
+     "// c2\n"
+     "arg1/* c1 */\n"
+     "// c2\n"
+     ",/* c1 */\n"
+     "// c2\n"
+     "arg2/* c1 */\n"
+     "// c2\n"
+     ")/* c1 */\n"
+     "// c2\n"
+     ";/* c1 */\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */\n"
+     "    // c2\n"
+     "    arg1  /* c1 */\n"
+     "    // c2\n"
+     "    ,  /* c1 */\n"
+     "    // c2\n"
+     "    arg2  /* c1 */\n"
+     "    // c2\n"
+     ")  /* c1 */\n"
+     "// c2\n"
+     ";  /* c1 */\n"
+     "// c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(// c1\n"
+     "// c2\n"
+     "arg1// c1\n"
+     "// c2\n"
+     ",// c1\n"
+     "// c2\n"
+     "arg2// c1\n"
+     "// c2\n"
+     ")// c1\n"
+     "// c2\n"
+     ";// c1\n"
+     "// c2\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  // c1\n"
+     "    // c2\n"
+     "    arg1  // c1\n"
+     "    // c2\n"
+     "    ,  // c1\n"
+     "       // c2\n"
+     "    arg2  // c1\n"
+     "    // c2\n"
+     ")  // c1\n"
+     "   // c2\n"
+     ";  // c1\n"
+     "   // c2\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     "arg1/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ",/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     "arg2/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ")/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ";/* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  /* c1 */\n"
+     "    /* c2 */\n"
+     "    /* c3 */\n"
+     "    arg1  /* c1 */\n"
+     "    /* c2 */\n"
+     "    /* c3 */\n"
+     "    ,  /* c1 */\n"
+     "    /* c2 */\n"
+     "    /* c3 */\n"
+     "    arg2  /* c1 */\n"
+     "    /* c2 */\n"
+     "    /* c3 */\n"
+     ")  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"
+     ";  /* c1 */\n"
+     "/* c2 */\n"
+     "/* c3 */\n"},
+    {"// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(// c1\n"
+     "// c2\n"
+     "// c3\n"
+     "arg1// c1\n"
+     "// c2\n"
+     "// c3\n"
+     ",// c1\n"
+     "// c2\n"
+     "// c3\n"
+     "arg2// c1\n"
+     "// c2\n"
+     "// c3\n"
+     ")// c1\n"
+     "// c2\n"
+     "// c3\n"
+     ";// c1\n"
+     "// c2\n"
+     "// c3\n",
+     "// verilog_syntax: parse-as-module-body\n"
+     "`FOOBARBAZ(  // c1\n"
+     "    // c2\n"
+     "    // c3\n"
+     "    arg1  // c1\n"
+     "    // c2\n"
+     "    // c3\n"
+     "    ,  // c1\n"
+     "       // c2\n"
+     "       // c3\n"
+     "    arg2  // c1\n"
+     "    // c2\n"
+     "    // c3\n"
+     ")  // c1\n"
+     "   // c2\n"
+     "   // c3\n"
+     ";  // c1\n"
+     "   // c2\n"
+     "   // c3\n"},
+    {"module indent();\n"
+     "   reg     a;\n"
+     "   reg [32:0] b;\n"
+     "   wire    c;\n"
+     "   wire    d = e ? kFoo : kBar;\n"
+     "endmodule\n",
+     "module indent ();\n"
+     "  reg         a;\n"
+     "  reg  [32:0] b;\n"
+     "  wire        c;\n"
+     "  wire        d = e ? kFoo : kBar;\n"
+     "endmodule\n"},
+
+    {"class C; T1 b; logic [$] a; T1 [$] c; endclass\n",
+     "class C;\n"
+     "  T1        b;\n"
+     "  logic [$] a;\n"
+     "  T1    [$] c;\n"
+     "endclass\n"},
+    {"class C;\n"
+     "  T1 b; //test\n"
+     "  logic [$] a; //test\n"
+     "  T1    [$] c; //test\n"
+     "endclass\n",
+     "class C;\n"
+     "  T1        b;  //test\n"
+     "  logic [$] a;  //test\n"
+     "  T1    [$] c;  //test\n"
+     "endclass\n"},
+    {"class C;\n"
+     "  T1\n"
+     "  b;\n"
+     "  logic\n"
+     "  [$]\n"
+     "  a;\n"
+     "  T1\n"
+     "  [$]\n"
+     "  c;\n"
+     "endclass\n",
+     "class C;\n"
+     "  T1        b;\n"
+     "  logic [$] a;\n"
+     "  T1    [$] c;\n"
+     "endclass\n"},
+    {"class C;\n"
+     "  logic/*t*/ [0 : 1] /*t*/\n"
+     "  a;/*t*/\n"
+     "  T1/*t*/[0 : 1]/*t*/\n"
+     "  c;/*t*/\n"
+     "endclass\n",
+     "class C;\n"
+     "  logic/*t*/ [0 : 1]  /*t*/ a;  /*t*/\n"
+     "  T1/*t*/    [0 : 1]  /*t*/ c;  /*t*/\n"
+     "endclass\n"},
+    {"always @(*/*t*/) begin\n"
+     "end\n",
+     "always @(*  /*t*/) begin\n"
+     "end\n"},
+    {"always @(/*t*/*) begin\n"
+     "end\n",
+     "always @(  /*t*/ *) begin\n"
+     "end\n"},
+    {"always @(/*t*/*/*t*/) begin\n"
+     "end\n",
+     "always @(  /*t*/ *  /*t*/) begin\n"
+     "end\n"},
+    {"always @(*) begin\n"
+     "end\n",
+     "always @(*) begin\n"
+     "end\n"},
+    {"always @(* ) begin\n"
+     "end\n",
+     "always @(*) begin\n"
+     "end\n"},
+    {"always @( *) begin\n"
+     "end\n",
+     "always @(*) begin\n"
+     "end\n"},
+    {"always @( * ) begin\n"
+     "end\n",
+     "always @(*) begin\n"
+     "end\n"},
+    {"always @(  /*t*/  *   /*t*/    ) begin\n"
+     "end\n",
+     "always @(  /*t*/ *  /*t*/) begin\n"
+     "end\n"},
+    {
+        // Don't touch verilog_format:off region #1538
+        R"(
+module testcode;
+  // verilog_format: off
+  assign a = b
+           & c;
+  // verilog_format: on
+      assign e = d;
+endmodule
+)",
+        R"(
+module testcode;
+  // verilog_format: off
+  assign a = b
+           & c;
+  // verilog_format: on
+  assign e = d;
+endmodule
+)",
+
+    },
+
+    // -----------------------------------------------------------------
+};
+
+TEST(FormatterEndToEndTest, DisableFormatterTestCases) {
+  RunFormatterTestCases40(kDisableFormatterTestCases);
+}
+
+}  // namespace
+}  // namespace formatter
+}  // namespace verilog
diff --git a/verible/verilog/formatting/formatter_function_task_test.cc b/verible/verilog/formatting/formatter_function_task_test.cc
new file mode 100644
index 0000000..88e30bb
--- /dev/null
+++ b/verible/verilog/formatting/formatter_function_task_test.cc
@@ -0,0 +1,2234 @@
+// Copyright 2017-2026 The Verible Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Test cases in this file should be *insensitive* to wrapping penalties.
+// Penalty-sensitive tests belong in formatter-tuning_test.cc.
+
+#include "gtest/gtest.h"
+#include "verible/verilog/formatting/formatter-test-utils.h"
+
+namespace verilog {
+namespace formatter {
+namespace {
+
+static constexpr FormatterTestCase kFunctionTaskFormatterTestCases[] = {
+    // function test cases
+    {"function f ;endfunction", "function f;\nendfunction\n"},
+    {"function f ;endfunction:   f", "function f;\nendfunction : f\n"},
+    {"function f ( );endfunction", "function f();\nendfunction\n"},
+    {"function f (input bit x);endfunction",
+     "function f(input bit x);\nendfunction\n"},
+    {"function f (input bit x,logic y );endfunction",
+     "function f(input bit x, logic y);\nendfunction\n"},
+    {"function f;\n// statement comment\nendfunction\n",
+     "function f;\n"
+     "  // statement comment\n"  // indented
+     "endfunction\n"},
+    {"function f();\n// statement comment\nendfunction\n",
+     "function f();\n"
+     "  // statement comment\n"  // indented
+     "endfunction\n"},
+    {"function f(input int x);\n"
+     "// statement comment\n"
+     "f=x;\n"
+     "// statement comment\n"
+     "endfunction\n",
+     "function f(input int x);\n"
+     "  // statement comment\n"  // indented
+     "  f = x;\n"
+     "  // statement comment\n"  // indented
+     "endfunction\n"},
+    {// line breaks around assignments
+     "function f;a=b;c+=d;endfunction",
+     "function f;\n"
+     "  a = b;\n"
+     "  c += d;\n"
+     "endfunction\n"},
+    {"function f;a&=b;c=d;endfunction",
+     "function f;\n"
+     "  a &= b;\n"
+     "  c = d;\n"
+     "endfunction\n"},
+    {"function f;a<<=b;c=b;d>>>=b;endfunction",
+     "function f;\n"
+     "  a <<= b;\n"
+     "  c = b;\n"
+     "  d >>>= b;\n"
+     "endfunction\n"},
+    {// port declaration exceeds line length limit
+     "function f (loooong_type if_it_fits_I_sits);endfunction",
+     "function f(\n"
+     "    loooong_type if_it_fits_I_sits);\n"
+     "endfunction\n"},
+    {"function\nvoid\tspace;a=( b+c )\n;endfunction   :space\n",
+     "function void space;\n"
+     "  a = (b + c);\n"
+     "endfunction : space\n"},
+    {"function\nvoid\twarranty;return  to_sender\n;endfunction   :warranty\n",
+     "function void warranty;\n"
+     "  return to_sender;\n"
+     "endfunction : warranty\n"},
+    {// if statement that fits on one line
+     "function if_i_fits_i_sits;"
+     "if(x)y=x;"
+     "endfunction",
+     "function if_i_fits_i_sits;\n"
+     "  if (x) y = x;\n"
+     "endfunction\n"},
+    {// for loop
+     "function\nvoid\twarranty;for(j=0; j<k; --k)begin "
+     "++j\n;end endfunction   :warranty\n",
+     "function void warranty;\n"
+     "  for (j = 0; j < k; --k) begin\n"
+     "    ++j;\n"
+     "  end\n"
+     "endfunction : warranty\n"},
+    {// for loop that needs wrapping
+     "function\nvoid\twarranty;for(jjjjj=0; jjjjj<kkkkk; --kkkkk)begin "
+     "++j\n;end endfunction   :warranty\n",
+     "function void warranty;\n"
+     "  for (\n"
+     "      jjjjj = 0; jjjjj < kkkkk; --kkkkk\n"
+     "  ) begin\n"
+     "    ++j;\n"
+     "  end\n"
+     "endfunction : warranty\n"},
+    {// for loop that needs more wrapping
+     "function\nvoid\twarranty;"
+     "for(jjjjjjjj=0; jjjjjjjj<kkkkkkkk; --kkkkkkkk)begin "
+     "++j\n;end endfunction   :warranty\n",
+     "function void warranty;\n"
+     "  for (\n"
+     "      jjjjjjjj = 0;\n"
+     "      jjjjjjjj < kkkkkkkk;\n"
+     "      --kkkkkkkk\n"
+     "  ) begin\n"
+     "    ++j;\n"
+     "  end\n"
+     "endfunction : warranty\n"},
+    {// for loop that fits on one line
+     "function loop_fits;"
+     "for(x=0;x<N;++x) y=x;"
+     "endfunction",
+     "function loop_fits;\n"
+     "  for (x = 0; x < N; ++x) y = x;\n"
+     "endfunction\n"},
+    {// for loop that would fit on one line, but is force-split with //comment
+     "function loop_fits;"
+     "for(x=0;x<N;++x) //\n y=x;"
+     "endfunction",
+     "function loop_fits;\n"
+     "  for (x = 0; x < N; ++x)  //\n"
+     "    y = x;\n"
+     "endfunction\n"},
+    {// for loop with function call in initializer
+     "function  void looper(); "
+     "for (int i=f(n); i>=0; i -- ) begin end "
+     "endfunction",
+     "function void looper();\n"
+     "  for (int i = f(n); i >= 0; i--) begin\n"
+     "  end\n"
+     "endfunction\n"},
+    {// for loop with function call in condition
+     "function  void looper(); "
+     "for (int i=0; i<f(m); i -- ) begin end "
+     "endfunction",
+     "function void looper();\n"
+     "  for (int i = 0; i < f(m); i--) begin\n"
+     "  end\n"
+     "endfunction\n"},
+    {// for loop with an attribute instance in the initializer.
+     // Regression: this used to abort with a CHECK failure while reshaping
+     // the kForSpec partitions when an attribute appears in the header.
+     "module m; initial for(int i=0(* a *);i<4;i++) x=i; endmodule",
+     "module m;\n"
+     "  initial\n"
+     "    for (int i = 0 (* a *); i < 4; i++)\n"
+     "      x = i;\n"
+     "endmodule\n"},
+    {// forever loop
+     "function\nvoid\tforevah;forever  begin "
+     "++k\n;end endfunction\n",
+     "function void forevah;\n"
+     "  forever begin\n"
+     "    ++k;\n"
+     "  end\n"
+     "endfunction\n"},
+    {// forever loop
+     "function\nvoid\tforevah;forever  "
+     "++k\n;endfunction\n",
+     "function void forevah;\n"
+     "  forever ++k;\n"
+     "endfunction\n"},
+    {// forever loop, forced break
+     "function\nvoid\tforevah;forever     //\n"
+     "++k\n;endfunction\n",
+     "function void forevah;\n"
+     "  forever  //\n"
+     "    ++k;\n"
+     "endfunction\n"},
+    {// repeat loop
+     "function\nvoid\tpete;repeat(3)  begin "
+     "++k\n;end endfunction\n",
+     "function void pete;\n"
+     "  repeat (3) begin\n"
+     "    ++k;\n"
+     "  end\n"
+     "endfunction\n"},
+    {// repeat loop
+     "function\nvoid\tpete;repeat(3)  "
+     "++k\n;endfunction\n",
+     "function void pete;\n"
+     "  repeat (3)++k;\n"  // TODO(fangism): space before ++
+     "endfunction\n"},
+    {// repeat loop, forced break
+     "function\nvoid\tpete;repeat(3)//\n"
+     "++k\n;endfunction\n",
+     "function void pete;\n"
+     "  repeat (3)  //\n"
+     "    ++k;\n"
+     "endfunction\n"},
+    {// while loop
+     "function\nvoid\twily;while( coyote )  begin "
+     "++super_genius\n;end endfunction\n",
+     "function void wily;\n"
+     "  while (coyote) begin\n"
+     "    ++super_genius;\n"
+     "  end\n"
+     "endfunction\n"},
+    {// while loop
+     "function\nvoid\twily;while( coyote )  "
+     "++ super_genius\n;   endfunction\n",
+     "function void wily;\n"
+     "  while (coyote)++super_genius;\n"  // TODO(fangism): space before ++
+     "endfunction\n"},
+    {// while loop, forced break
+     "function\nvoid\twily;while( coyote ) //\n "
+     "++ super_genius\n;   endfunction\n",
+     "function void wily;\n"
+     "  while (coyote)  //\n"
+     "    ++super_genius;\n"
+     "endfunction\n"},
+    {// do-while loop
+     "function\nvoid\tdonot;do  begin "
+     "++s\n;end  while( z);endfunction\n",
+     "function void donot;\n"
+     "  do begin\n"
+     "    ++s;\n"
+     "  end while (z);\n"
+     "endfunction\n"},
+    {// do-while loop, single statement
+     "function\nvoid\tdonot;do  "
+     "++s\n;  while( z);endfunction\n",
+     "function void donot;\n"
+     "  do ++s; while (z);\n"
+     "endfunction\n"},
+    {// do-while loop, single statement, forced break
+     "function\nvoid\tdonot;do  "
+     "++s\n;//\n  while( z);endfunction\n",
+     "function void donot;\n"
+     "  do\n"
+     "    ++s;  //\n"
+     "  while (z);\n"
+     "endfunction\n"},
+    {// foreach loop
+     "function\nvoid\tforeacher;foreach( m [n] )  begin "
+     "++m\n;end endfunction\n",
+     "function void foreacher;\n"
+     "  foreach (m[n]) begin\n"
+     "    ++m;\n"
+     "  end\n"
+     "endfunction\n"},
+    {// spaces in condition expression
+     "function f; return {a}? {b} :{ c };endfunction",
+     "function f;\n"
+     "  return {a} ? {b} : {c};\n"
+     "endfunction\n"},
+    {"task t;endtask",
+     "task t;\n"
+     "endtask\n"},
+    {"task t (   );endtask",
+     "task t();\n"
+     "endtask\n"},
+    {"task t (input    bit   drill   ) ;endtask",
+     "task t(input bit drill);\n"
+     "endtask\n"},
+    {"task t; ## 100 ;endtask",
+     "task t;\n"
+     "  ##100;\n"
+     "endtask\n"},
+    {"task t; ## (1+1) ;endtask",  // delay expression
+     "task t;\n"
+     "  ##(1 + 1);\n"
+     "endtask\n"},
+    {"task t; ## delay_value ;endtask",
+     "task t;\n"
+     "  ##delay_value;\n"
+     "endtask\n"},
+    {"task t; ## `DELAY_VALUE ;endtask",
+     "task t;\n"
+     "  ##`DELAY_VALUE;\n"
+     "endtask\n"},
+    {"task t;\n"
+     "`uvm_error( foo,bar);\n"
+     "endtask\n",
+     "task t;\n"
+     "  `uvm_error(foo, bar);\n"
+     "endtask\n"},
+    {"task t;\n"
+     "`uvm_error(foo,bar)\n"
+     ";\n"  // null statement
+     "endtask\n",
+     "task t;\n"
+     "  `uvm_error(foo, bar)\n"
+     "  ;\n"
+     "endtask\n"},
+    {"task t;\n"
+     "if(expr)begin\t\n"
+     "`uvm_error(foo,bar);\n"
+     "end\n"
+     "endtask\n",
+     "task t;\n"
+     "  if (expr) begin\n"
+     "    `uvm_error(foo, bar);\n"
+     "  end\n"
+     "endtask\n"},
+    {"task\nrabbit;$kill(the,\nrabbit)\n;endtask:  rabbit\n",
+     "task rabbit;\n"
+     "  $kill(the, rabbit);\n"
+     "endtask : rabbit\n"},
+    {"function  int foo( );if( a )a+=1 ; endfunction",
+     "function int foo();\n"
+     "  if (a) a += 1;\n"
+     "endfunction\n"},
+    {"function  void foo( );foo=`MACRO(b,c) ; endfunction",
+     "function void foo();\n"
+     "  foo = `MACRO(b, c);\n"
+     "endfunction\n"},
+    {"module foo;if    \t  (bar)begin assign a=1; end endmodule",
+     "module foo;\n"
+     "  if (bar) begin\n"
+     "    assign a = 1;\n"
+     "  end\n"
+     "endmodule\n"},
+    {"module proc_cont_assigner;\n"
+     "always begin\n"
+     "assign x1 =   y1;\n"
+     "deassign   x2 ;\n"
+     "force x3=y3;\n"
+     "release   x4 ;\n"
+     "end\n"
+     "endmodule\n",
+     "module proc_cont_assigner;\n"
+     "  always begin\n"
+     "    assign x1 = y1;\n"
+     "    deassign x2;\n"
+     "    force x3 = y3;\n"
+     "    release x4;\n"
+     "  end\n"
+     "endmodule\n"},
+    {"module g_test(  );\n"
+     "\tinitial begin:main_test \t"
+     "for(int i=0;i<k;i++)begin "
+     "case(i )\n"
+     " 6'd0  :release in[0];  \n"
+     "   endcase  "
+     " \t\tend \t"
+     "\t end:main_test\n"
+     "endmodule:g_test\n",
+     "module g_test ();\n"
+     "  initial begin : main_test\n"
+     "    for (int i = 0; i < k; i++) begin\n"
+     "      case (i)\n"
+     "        6'd0: release in[0];\n"
+     "      endcase\n"
+     "    end\n"
+     "  end : main_test\n"
+     "endmodule : g_test\n"},
+    {// conditional generate (case)
+     "module mc; case(s)a : bb c ; d : ee f; endcase endmodule",
+     "module mc;\n"
+     "  case (s)\n"
+     "    a: bb c;\n"
+     "    d: ee f;\n"
+     "  endcase\n"
+     "endmodule\n"},
+    {// conditional generate (case), with comments
+     "module mc; case(s)\n//comment a\na:bb  c;\n//comment b\n endcase "
+     "endmodule",
+     "module mc;\n"
+     "  case (s)\n"
+     "    //comment a\n"  // indented to case-item level
+     "    a: bb c;\n"
+     "    //comment b\n"  // indented to case-item level
+     "  endcase\n"
+     "endmodule\n"},
+
+    {// "default:", not "default :"
+     "function f; case (x) default: x=y; endcase endfunction\n",
+     "function f;\n"
+     "  case (x)\n"
+     "    default: x = y;\n"
+     "  endcase\n"
+     "endfunction\n"},
+    {// default with null statement: "default: ;", not "default :;"
+     "function f; case (x) default :; endcase endfunction\n",
+     "function f;\n"
+     "  case (x)\n"
+     "    default: ;\n"
+     "  endcase\n"
+     "endfunction\n"},
+    {// case statement
+     "function f; case (x) State0 : a=b; State1 : begin a=b; end "
+     "endcase endfunction\n",
+     "function f;\n"
+     "  case (x)\n"
+     "    State0: a = b;\n"
+     "    State1: begin\n"
+     "      a = b;\n"
+     "    end\n"
+     "  endcase\n"
+     "endfunction\n"},
+    {// case statement, interleaved with comments
+     "function f; case (x) \n//c1\nState0 : a=b;//c2\n//c3\n State1 : "
+     "a=b;//c4\n//c5\n "
+     "endcase endfunction\n",
+     "function f;\n"
+     "  case (x)\n"
+     "    //c1\n"
+     "    State0: a = b;  //c2\n"
+     "    //c3\n"
+     "    State1: a = b;  //c4\n"
+     "    //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",
+     "function f;\n"
+     "  case (x) inside\n"
+     "    k1: return b;\n"
+     "    k2: begin\n"
+     "      return b;\n"
+     "    end\n"
+     "  endcase\n"
+     "endfunction\n"},
+    {// case inside statement, with ranges
+     "function f; case (x) inside[a:b] : return b; [c:d] : return b; "
+     "default :return z;"
+     "endcase endfunction\n",
+     "function f;\n"
+     "  case (x) inside\n"
+     "    [a : b]: return b;\n"
+     "    [c : d]: return b;\n"
+     "    default: return z;\n"
+     "  endcase\n"
+     "endfunction\n"},
+    {// case pattern statement
+     "function f;"
+     "case (y) matches "
+     ".foo   : return 0;"
+     ".*\t: return 1;"
+     "endcase "
+     "case (z) matches "
+     ".foo\t\t: return 0;"
+     ".*   : return 1;"
+     "endcase "
+     "endfunction",
+     "function f;\n"
+     "  case (y) matches\n"
+     "    .foo: return 0;\n"
+     "    .*: return 1;\n"
+     "  endcase\n"
+     "  case (z) matches\n"
+     "    .foo: return 0;\n"
+     "    .*: return 1;\n"
+     "  endcase\n"
+     "endfunction\n"},
+    {// keep short case items on one line
+     "function f; case (x)k1 : if( b )break; default :return 2;"
+     "endcase endfunction\n",
+     "function f;\n"
+     "  case (x)\n"
+     "    k1:      if (b) break;\n"  // aligned
+     "    default: return 2;\n"
+     "  endcase\n"
+     "endfunction\n"},
+    {// keep short default items on one line
+     "function f; case (x)k1 :break; default :if( c )return 2;"
+     "endcase endfunction\n",
+     "function f;\n"
+     "  case (x)\n"
+     "    k1:      break;\n"  // aligned
+     "    default: if (c) return 2;\n"
+     "  endcase\n"
+     "endfunction\n"},
+    {// keep short case inside items on one line
+     "function f; case (x)inside k1 : if( b )return c; k2 : return a;"
+     "endcase endfunction\n",
+     "function f;\n"
+     "  case (x) inside\n"
+     "    k1: if (b) return c;\n"
+     "    k2: return a;\n"
+     "  endcase\n"
+     "endfunction\n"},
+    {// keep short case pattern items on one line
+     "function f;"
+     "case (y) matches "
+     ".foo   :if( n )return 0;"
+     ".*\t: return 1;"
+     "endcase "
+     "endfunction",
+     "function f;\n"
+     "  case (y) matches\n"
+     "    .foo: if (n) return 0;\n"
+     "    .*: return 1;\n"
+     "  endcase\n"
+     "endfunction\n"},
+    {// randcase
+     "function f; randcase k1 : return c; k2 : return a;"
+     "endcase endfunction\n",
+     "function f;\n"
+     "  randcase\n"
+     "    k1: return c;\n"
+     "    k2: return a;\n"
+     "  endcase\n"
+     "endfunction\n"},
+
+    // This tests checks for not breaking around hierarchy operators.
+    {"function\nvoid\twarranty;"
+     "foo.bar = fancyfunction(aaaaaaaa.bbbbbbb,"
+     "    ccccccccc.ddddddddd) ;"
+     "endfunction   :warranty\n",
+     "function void warranty;\n"
+     "  foo.bar = fancyfunction(\n"
+     "      aaaaaaaa.bbbbbbb,\n"
+     "      ccccccccc.ddddddddd\n"
+     "  );\n"
+     "endfunction : warranty\n"},
+
+    // Group of tests testing partitioning of arguments inside function calls
+    {// function with function call inside if statement header
+     "function foo;if(aa(bb,cc));endfunction\n",
+     "function foo;\n"
+     "  if (aa(bb, cc));\n"
+     "endfunction\n"},
+    {// function with function call inside if statement header and with
+     // begin-end block
+     "function foo;if (aa(bb,cc,dd,ee))begin end endfunction\n",
+     "function foo;\n"
+     "  if (aa(bb, cc, dd, ee)) begin\n"
+     "  end\n"
+     "endfunction\n"},
+    {// function with kMethodCallExtension inside if statement header and with
+     // begin-end block
+     "function foo;if (aa.bb(cc,dd,ee))begin end endfunction\n",
+     "function foo;\n"
+     "  if (aa.bb(cc, dd, ee)) begin\n"
+     "  end\n"
+     "endfunction\n"},
+    {// nested kMethodCallExtension calls - one level
+     "function foo;aa.bb(cc.dd(a1), ee.ff(a2));endfunction\n",
+     "function foo;\n"
+     "  aa.bb(cc.dd(a1), ee.ff(a2));\n"
+     "endfunction\n"},
+    {// nested kMethodCallExtension calls - two level
+     "function foo;aa.bb(cc.dd(a1.b1(a2), b1), ee.ff(c1, d1));endfunction\n",
+     "function foo;\n"
+     "  aa.bb(cc.dd(a1.b1(a2), b1), ee.ff(\n"
+     "        c1, d1));\n"
+     "endfunction\n"},
+
+    {// simple initial statement with function call
+     "module m;initial aa(bb,cc,dd,ee);endmodule\n",
+     "module m;\n"
+     "  initial aa(bb, cc, dd, ee);\n"
+     "endmodule\n"},
+    {// expressions and function calls inside if-statement headers
+     "module m;initial begin if(aa(bb)==cc(dd))a=b;if (xx()) b = a;end "
+     "endmodule\n",
+     "module m;\n"
+     "  initial begin\n"
+     "    if (aa(bb) == cc(dd)) a = b;\n"
+     "    if (xx()) b = a;\n"
+     "  end\n"
+     "endmodule\n"},
+    {// fuction with two arguments inside if-statement headers
+     "module\nm;initial\nbegin\nif(aa(bb,cc))x=y;end\nendmodule\n",
+     "module m;\n"
+     "  initial begin\n"
+     "    if (aa(bb, cc)) x = y;\n"
+     "  end\n"
+     "endmodule\n"},
+    {// kMethodCallExtension inside if-statement headers
+     "module m;initial begin if (aa.bb(cc)) x = y;end endmodule",
+     "module m;\n"
+     "  initial begin\n"
+     "    if (aa.bb(cc)) x = y;\n"
+     "  end\n"
+     "endmodule\n"},
+    {// initial statement with object method call
+     "module m; initial a.b(a,b,c); endmodule\n",
+     "module m;\n"
+     "  initial a.b(a, b, c);\n"
+     "endmodule\n"},
+    {// initial statement with method call on indexed object
+     "module m; initial a[i].b(a,b,c); endmodule\n",
+     "module m;\n"
+     "  initial a[i].b(a, b, c);\n"
+     "endmodule\n"},
+    {// initial statement with method call on function returned object
+     "module m; initial a(d,e,f).b(a,b,c); endmodule\n",
+     "module m;\n"
+     "  initial a(d, e, f).b(a, b, c);\n"
+     "endmodule\n"},
+    {// initial statement with indexed access to function returned object
+     "module m; initial a(a,b,c)[i]; endmodule\n",
+     "module m;\n"
+     "  initial a(a, b, c) [i];\n"
+     "endmodule\n"},
+    {// method call with no arguments on an object
+     "module m; initial foo.bar();endmodule\n",
+     "module m;\n"
+     "  initial foo.bar();\n"
+     "endmodule\n"},
+    {// method call with one argument on an object
+     "module m; initial foo.bar(aa);endmodule\n",
+     "module m;\n"
+     "  initial foo.bar(aa);\n"
+     "endmodule\n"},
+    {// method call with two arguments on an object
+     "module m; initial foo.bar(aa,bb);endmodule\n",
+     "module m;\n"
+     "  initial foo.bar(aa, bb);\n"
+     "endmodule\n"},
+    {// method call with three arguments on an object
+     "module m; initial foo.bar(aa,bb,cc);endmodule\n",
+     "module m;\n"
+     "  initial foo.bar(aa, bb, cc);\n"
+     "endmodule\n"},
+
+    {
+        // This tests for if-statements with null statements
+        "function foo;"
+        "if (zz) ; "
+        "if (yy) ; "
+        "endfunction",
+        "function foo;\n"
+        "  if (zz);\n"
+        "  if (yy);\n"
+        "endfunction\n",
+    },
+
+    {
+        // This tests for if-statements starting on their own line.
+        "function foo;"
+        "if (zz) begin "
+        "return 0;"
+        "end "
+        "if (yy) begin "
+        "return 1;"
+        "end "
+        "endfunction",
+        "function foo;\n"
+        "  if (zz) begin\n"
+        "    return 0;\n"
+        "  end\n"
+        "  if (yy) begin\n"
+        "    return 1;\n"
+        "  end\n"
+        "endfunction\n",
+    },
+
+    {
+        // This tests for if-statements with single statement bodies
+        "function foo;"
+        "if (zz) return 0;"
+        "if (yy) return 1;"
+        "endfunction",
+        "function foo;\n"
+        "  if (zz) return 0;\n"
+        "  if (yy) return 1;\n"
+        "endfunction\n",
+    },
+
+    {
+        // This tests for if-statement mixed with plain statements
+        "function foo;"
+        "a=b;"
+        "if (zz) return 0;"
+        "c=d;"
+        "endfunction",
+        "function foo;\n"
+        "  a = b;\n"
+        "  if (zz) return 0;\n"
+        "  c = d;\n"
+        "endfunction\n",
+    },
+
+    {
+        // This tests for if-statement with forced break mixed with others
+        "function foo;"
+        "a=b;"
+        "if (zz)//\n return 0;"
+        "c=d;"
+        "endfunction",
+        "function foo;\n"
+        "  a = b;\n"
+        "  if (zz)  //\n"
+        "    return 0;\n"
+        "  c = d;\n"
+        "endfunction\n",
+    },
+    {
+        "function t;"
+        "if (r == t)"
+        "a.b(c);"
+        "endfunction",
+        "function t;\n"
+        "  if (r == t) a.b(c);\n"
+        "endfunction\n",
+    },
+
+    {// This tests for for-statement with forced break mixed with others
+     "function f;"
+     "x=y;"
+     "for (int i=0; i<S*IPS; i++) #1ps a += $urandom();"
+     "return 2;"
+     "endfunction",
+     "function f;\n"
+     "  x = y;\n"
+     "  for (int i = 0; i < S * IPS; i++)\n"  // doesn't fit, so indents
+     "    #1ps a += $urandom();\n"
+     "  return 2;\n"
+     "endfunction\n"},
+
+    {
+        // This tests for-statements with null statements
+        "function foo;"
+        "for(;;)  ;\t"
+        "for(;;)  ;\t"
+        "endfunction",
+        "function foo;\n"
+        "  for (;;);\n"
+        "  for (;;);\n"
+        "endfunction\n",
+    },
+
+    {
+        // This tests for if-else-statements with null statements
+        "function foo;"
+        "if (zz) ;  else  ;"
+        "if (yy) ;   else   ;"
+        "endfunction",
+        "function foo;\n"
+        "  if (zz);\n"
+        "  else;\n"
+        "  if (yy);\n"
+        "  else;\n"
+        "endfunction\n",
+    },
+
+    {
+        // This tests for end-else-begin.
+        "function foo;"
+        "if (zz) begin "
+        "return 0;"
+        "end "
+        "else "
+        "begin "
+        "return 1;"
+        "end "
+        "endfunction",
+        "function foo;\n"
+        "  if (zz) begin\n"
+        "    return 0;\n"
+        "  end else begin\n"
+        "    return 1;\n"
+        "  end\n"
+        "endfunction\n",
+    },
+    {
+        // This tests for end-else-if
+        "function foo;"
+        "if (zz) begin "
+        "return 0;"
+        "end "
+        "else "
+        "if(yy)begin "
+        "return 1;"
+        "end "
+        "endfunction",
+        "function foo;\n"
+        "  if (zz) begin\n"
+        "    return 0;\n"
+        "  end else if (yy) begin\n"
+        "    return 1;\n"
+        "  end\n"
+        "endfunction\n",
+    },
+    {
+        // This tests labeled end-else-if
+        "function foo;"
+        "if (zz) begin : label1 "
+        "return 0;"
+        "end : label1 "
+        "else if (yy) begin : label2 "
+        "return 1;"
+        "end : label2 "
+        "endfunction",
+        "function foo;\n"
+        "  if (zz) begin : label1\n"
+        "    return 0;\n"
+        "  end : label1\n"
+        "  else if (yy) begin : label2\n"
+        "    return 1;\n"
+        "  end : label2\n"
+        "endfunction\n",
+    },
+    {
+        // This tests labeled end-else-if-else
+        "function foo;"
+        "if (zz) begin : label1 "
+        "return 0;"
+        "end : label1 "
+        "else if (yy) begin : label2 "
+        "return 1;"
+        "end : label2 "
+        "else begin : label3 "
+        "return 2;"
+        "end : label3 "
+        "endfunction",
+        "function foo;\n"
+        "  if (zz) begin : label1\n"
+        "    return 0;\n"
+        "  end : label1\n"
+        "  else if (yy) begin : label2\n"
+        "    return 1;\n"
+        "  end : label2\n"
+        "  else begin : label3\n"
+        "    return 2;\n"
+        "  end : label3\n"
+        "endfunction\n",
+    },
+
+    {
+        // randomize function
+        "function r ;"
+        "if ( ! randomize (bar )) begin    end "
+        "if ( ! obj.randomize (bar )) begin    end "
+        "endfunction",
+        "function r;\n"
+        "  if (!randomize(bar)) begin\n"
+        "  end\n"
+        "  if (!obj.randomize(bar)) begin\n"
+        "  end\n"
+        "endfunction\n",
+    },
+    {
+        // randomize-with call, with comments
+        "function f;"
+        "s = std::randomize() with {\n"
+        "// comment1\n"
+        "a == e;\n"
+        "// comment2\n"
+        "};"
+        "endfunction\n",
+        "function f;\n"
+        "  s = std::randomize() with {\n"
+        "    // comment1\n"
+        "    a == e;\n"
+        "    // comment2\n"
+        "  };\n"
+        "endfunction\n",
+    },
+    {
+        // randomize-with call, with comments, one joined
+        "function f;"
+        "s = std::randomize() with {\n"
+        "// comment1\n"
+        "a == e;// comment2\n"
+        "};"
+        "endfunction\n",
+        "function f;\n"
+        "  s = std::randomize() with {\n"
+        "    // comment1\n"
+        "    a == e;  // comment2\n"
+        "  };\n"
+        "endfunction\n",
+    },
+    {
+        // randomize-with call, with comment, and conditional
+        "function f;"
+        "s = std::randomize() with {\n"
+        "// comment\n"
+        "a == e;"
+        "if (x) {"
+        "a;"
+        "}"
+        "};"
+        "endfunction\n",
+        "function f;\n"
+        "  s = std::randomize() with {\n"
+        "    // comment\n"
+        "    a == e;\n"
+        "    if (x) {a;}\n"  // TODO(fangism): consider expanding
+        "  };\n"
+        "endfunction\n",
+    },
+
+    // module declaration test cases
+    {"   module       foo  ;     endmodule\n",
+     "module foo;\n"
+     "endmodule\n"},
+    {"   module       foo   (    )   ;     endmodule\n",
+     "module foo ();\n"
+     "endmodule\n"},
+    {"   module       foo   (  .x (  x) );     endmodule\n",
+     "module foo (\n"
+     "    .x(x)\n"
+     ");\n"
+     "endmodule\n"},
+    {"   module       foo   (  .x (  x)  \n,\n . y "
+     "  ( \ny) );     endmodule\n",
+     "module foo (\n"
+     "    .x(x),\n"
+     "    .y(y)\n"
+     ");\n"
+     "endmodule\n"},
+
+    // module instantiation test cases
+    {"  module foo   ; bar bq();endmodule\n",
+     "module foo;\n"
+     "  bar bq ();\n"  // single instance
+     "endmodule\n"},
+    {"  module foo   ; bar bq(), bq2(  );endmodule\n",
+     "module foo;\n"
+     "  bar bq (), bq2 ();\n"  // multiple instances, still fitting on one line
+     "endmodule\n"},
+    {"module foo; bar #(.N(N)) bq (.bus(bus));endmodule\n",
+     // instance parameter and port fits on line
+     "module foo;\n"
+     "  bar #(.N(N)) bq (.bus(bus));\n"
+     "endmodule\n"},
+    {"module foo; bar #(.N(N),.M(M)) bq ();endmodule\n",  // two named params
+     "module foo;\n"
+     "  bar #(\n"
+     "      .N(N),\n"
+     "      .M(M)\n"
+     "  ) bq ();\n"
+     "endmodule\n"},
+    {"module foo; bar #(//comment\n.N(N),.M(M)) bq ();endmodule\n",
+     "module foo;\n"
+     "  bar #(  //comment\n"  // EOL comment before first param
+     "      .N(N),\n"
+     "      .M(M)\n"
+     "  ) bq ();\n"
+     "endmodule\n"},
+    {"module foo; bar #(.N(N),//comment\n.M(M)) bq ();endmodule\n",
+     "module foo;\n"
+     "  bar #(\n"
+     "      .N(N),  //comment\n"  // EOL comment after first param
+     "      .M(M)\n"
+     "  ) bq ();\n"
+     "endmodule\n"},
+    {"module foo; bar #(.N(N),.M(M)//comment\n) bq ();endmodule\n",
+     "module foo;\n"
+     "  bar #(\n"
+     "      .N(N),\n"
+     "      .M(M)   //comment\n"  // EOL comment after last param
+     "  ) bq ();\n"
+     "endmodule\n"},
+    {"  module foo   ; bar bq(aa,bb,cc);endmodule\n",
+     "module foo;\n"
+     "  bar bq (\n"
+     "      aa,\n"
+     "      bb,\n"
+     "      cc\n"
+     "  );\n"  // multiple positional ports, one per line
+     "endmodule\n"},
+    {"  module foo   ; bar bq(aa,\n"
+     "`ifdef BB\n"
+     "bb,\n"
+     "`endif\n"
+     "cc);endmodule\n",
+     "module foo;\n"
+     "  bar bq (\n"
+     "      aa,\n"
+     "`ifdef BB\n"
+     "      bb,\n"  // keep same indentation as outside conditional
+     "`endif\n"
+     "      cc\n"
+     "  );\n"  // multiple positional ports, one per line
+     "endmodule\n"},
+    {"  module foo   ; bar bq(.aa,.bb);endmodule\n",
+     "module foo;\n"
+     "  bar bq (\n"
+     "      .aa,\n"
+     "      .bb\n"
+     "  );\n"  // multiple named ports, one per line
+     "endmodule\n"},
+    {"  module foo   ; bar bq(.aa(aa),.bb(bb));endmodule\n",
+     "module foo;\n"
+     "  bar bq (\n"
+     "      .aa(aa),\n"
+     "      .bb(bb)\n"
+     "  );\n"  // multiple named ports, one per line
+     "endmodule\n"},
+    {"  module foo   ; bar bq(.aa(aa),\n"
+     "`ifdef ZZ\n"
+     ".zz(  zz  ),\n"
+     "`else\n"
+     ".yy(  yy  ),\n"
+     "`endif\n"
+     ".bb(bb)\n"
+     ");endmodule\n",
+     "module foo;\n"
+     "  bar bq (\n"
+     "      .aa(aa),\n"
+     "`ifdef ZZ\n"
+     "      .zz(zz),\n"
+     "`else\n"
+     "      .yy(yy),\n"
+     "`endif\n"
+     "      .bb(bb)\n"
+     "  );\n"  // multiple named ports, one per line
+     "endmodule\n"},
+    {"  module foo   ; bar#(NNNNNNNN)"
+     "bq(.aa(aaaaaa),.bb(bbbbbb));endmodule\n",
+     "module foo;\n"
+     "  bar #(NNNNNNNN) bq (\n"
+     "      .aa(aaaaaa),\n"
+     "      .bb(bbbbbb)\n"
+     "  );\n"
+     "endmodule\n"},
+    {" module foo   ; barrrrrrr "
+     "bq(.aaaaaa(aaaaaa),.bbbbbb(bbbbbb));endmodule\n",
+     "module foo;\n"
+     "  barrrrrrr bq (\n"
+     "      .aaaaaa(aaaaaa),\n"
+     "      .bbbbbb(bbbbbb)\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module foo; bar #(.NNNNN(NNNNN)) bq (.bussss(bussss));endmodule\n",
+     // instance parameter and port does not fit on line
+     "module foo;\n"
+     "  bar #(\n"
+     "      .NNNNN(NNNNN)\n"
+     "  ) bq (\n"
+     "      .bussss(bussss)\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module foo; bar #(//\n.N(N)) bq (.bus(bus));endmodule\n",
+     "module foo;\n"
+     "  bar #(  //\n"  // would fit on one line, but forced to expand by //
+     "      .N(N)\n"
+     "  ) bq (\n"
+     "      .bus(bus)\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module foo; bar #(\n"
+     "`ifdef MM\n"
+     ".M(M)\n"
+     "`else\n"
+     ".N(N)\n"
+     "`endif\n"
+     ") bq (.bus(bus));endmodule\n",
+     "module foo;\n"
+     "  bar #(\n"
+     "`ifdef MM\n"
+     "      .M(M)\n"
+     "`else\n"
+     "      .N(N)\n"
+     "`endif\n"
+     "  ) bq (\n"
+     "      .bus(bus)\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module foo; bar #(.N(N)//\n) bq (.bus(bus));endmodule\n",
+     "module foo;\n"
+     "  bar #(\n"  // would fit on one line, but forced to expand by //
+     "      .N(N)  //\n"
+     "  ) bq (\n"
+     "      .bus(bus)\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module foo; bar #(.N(N)) bq (//\n.bus(bus));endmodule\n",
+     "module foo;\n"
+     "  bar #(\n"  // would fit on one line, but forced to expand by //
+     "      .N(N)\n"
+     "  ) bq (  //\n"
+     "      .bus(bus)\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module foo; bar #(.N(N)) bq (.bus(bus)//\n);endmodule\n",
+     "module foo;\n"
+     "  bar #(\n"  // would fit on one line, but forced to expand by //
+     "      .N(N)\n"
+     "  ) bq (\n"
+     "      .bus(bus)  //\n"
+     "  );\n"
+     "endmodule\n"},
+    {" module foo   ; bar "
+     "bq(.aaa(aaa),.bbb(bbb),.ccc(ccc),.ddd(ddd));endmodule\n",
+     "module foo;\n"
+     "  bar bq (\n"
+     "      .aaa(aaa),\n"  // ports don't fit on one line, so expanded
+     "      .bbb(bbb),\n"
+     "      .ccc(ccc),\n"
+     "      .ddd(ddd)\n"
+     "  );\n"
+     "endmodule\n"},
+    {" module foo   ; bar "
+     "bq(.aa(aa),.bb(bb),.cc(cc),.dd(dd));endmodule\n",
+     "module foo;\n"
+     "  bar bq (\n"
+     "      .aa(aa),\n"  // one named port per line
+     "      .bb(bb),\n"
+     "      .cc(cc),\n"
+     "      .dd(dd)\n"
+     "  );\n"
+     "endmodule\n"},
+    {" module foo   ; bar "
+     "bq(.aa(aa),//\n.bb(bb),.cc(cc),.dd(dd));endmodule\n",
+     "module foo;\n"
+     "  bar bq (\n"
+     "      .aa(aa),  //\n"  // forced to expand by //
+     "      .bb(bb),\n"
+     "      .cc(cc),\n"
+     "      .dd(dd)\n"
+     "  );\n"
+     "endmodule\n"},
+    {" module foo   ; bar "
+     "bq(.aa(aa),.bb(bb),.cc(cc),.dd(dd)//\n);endmodule\n",
+     "module foo;\n"
+     "  bar bq (\n"
+     "      .aa(aa),\n"
+     "      .bb(bb),\n"
+     "      .cc(cc),\n"
+     "      .dd(dd)   //\n"  // forced to expand by //
+     "  );\n"
+     "endmodule\n"},
+    {// gate instantiation test
+     "module m;"
+     "and\tx0(a, \t\tb,c);"
+     "or\nx1(a,  \n b,    d);"
+     "endmodule\n",
+     "module m;\n"
+     "  and x0 (a, b, c);\n"
+     "  or x1 (a, b, d);\n"
+     "endmodule\n"},
+    {// ifdef inside port actuals
+     "module m;  foo bar   (\n"
+     "`ifdef   BAZ\n"
+     "`endif\n"
+     ")  ;endmodule\n",
+     "module m;\n"
+     "  foo bar (\n"
+     "`ifdef BAZ\n"
+     "`endif\n"
+     "  );\n"
+     "endmodule\n"},
+    {// ifdef inside port actuals after a port connection
+     "module m;  foo bar   ( .a (a) ,\n"
+     "`ifdef   BAZ\n"
+     "`endif\n"
+     ")  ;endmodule\n",
+     "module m;\n"
+     "  foo bar (\n"
+     "      .a(a),\n"
+     "`ifdef BAZ\n"
+     "`endif\n"
+     "  );\n"
+     "endmodule\n"},
+    {// ifdef inside port actuals before a port connection
+     "module m;  foo bar   (\n"
+     "`ifdef   BAZ\n"
+     "`endif\n"
+     ". b(b) )  ;endmodule\n",
+     "module m;\n"
+     "  foo bar (\n"
+     "`ifdef BAZ\n"
+     "`endif\n"
+     "      .b(b)\n"
+     "  );\n"
+     "endmodule\n"},
+    {// ifdef-conditional port connection
+     "module m;  foo bar   (\n"
+     "`ifdef   BAZ\n"
+     ". c (\tc) \n"
+     "`endif\n"
+     " )  ;endmodule\n",
+     "module m;\n"
+     "  foo bar (\n"
+     "`ifdef BAZ\n"
+     "      .c(c)\n"
+     "`endif\n"
+     "  );\n"
+     "endmodule\n"},
+    {// ifndef-else-conditional port connection
+     "module m;  foo bar   (\n"
+     "`ifndef   BAZ\n"
+     ". c (\tc) \n"
+     "  `else\n"
+     " . d(d\t)\n"
+     "  `endif\n"
+     " )  ;endmodule\n",
+     "module m;\n"
+     "  foo bar (\n"
+     "`ifndef BAZ\n"
+     "      .c(c)\n"
+     "`else\n"
+     "      .d(d)\n"
+     "`endif\n"
+     "  );\n"
+     "endmodule\n"},
+
+    {// comment following a delay in next line
+     "module t;\n"
+     "reg x;\n"
+     "initial begin\n"
+     "#20\n"
+     "//comment\n"
+     "x = 1;\n"
+     "x = 2;\n"
+     "end\n"
+     "endmodule\n",
+     "module t;\n"
+     "  reg x;\n"
+     "  initial begin\n"
+     "    #20\n"
+     "    //comment\n"
+     "    x = 1;\n"
+     "    x = 2;\n"
+     "  end\n"
+     "endmodule\n"},
+    {// comment following a delay in the same line
+     "module t;\n"
+     "reg x;\n"
+     "initial begin\n"
+     "#20 //comment\n"
+     "x = 1;\n"
+     "x = 2;\n"
+     "end\n"
+     "endmodule\n",
+     "module t;\n"
+     "  reg x;\n"
+     "  initial begin\n"
+     "    #20  //comment\n"
+     "    x = 1;\n"
+     "    x = 2;\n"
+     "  end\n"
+     "endmodule\n"},
+    // Macro calls inside [...]
+    {"module foo;\nlogic [`BAR(1)\n+2] foo;\nendmodule",
+     "module foo;\n"
+     "  logic [`BAR(1)\n"
+     "+2] foo;\n"
+     "endmodule\n"},
+    {"module foo;\nlogic [`BAR(1)+2] foo;\nendmodule",
+     "module foo;\n"
+     "  logic [`BAR(1)+2] foo;\n"
+     "endmodule\n"},
+    {"module foo ();\n  function bar();\n    "
+     "logic [12:34] data[`AAAAAAAAAAAAAAAAAAAAAAAA(1) : "
+     "`BBBBBBBBBBBBBBBBBBBBBBBB(2) + 3];\n  "
+     "endfunction\nendmodule",
+     "module foo ();\n"
+     "  function bar();\n"
+     "    logic [12:34] data[\n"
+     "    `AAAAAAAAAAAAAAAAAAAAAAAA(1) :\n"
+     "    `BBBBBBBBBBBBBBBBBBBBBBBB(2) + 3];\n"
+     "  endfunction\n"
+     "endmodule\n"},
+    {
+        // test that alternate top-syntax mode works
+        "// verilog_syntax: parse-as-module-body\n"
+        "`define           FOO\n",
+        "// verilog_syntax: parse-as-module-body\n"
+        "`define FOO\n",
+    },
+    {
+        // test alternate parsing mode in macro expansion
+        "class foo;\n"
+        "`MY_MACRO(\n"
+        " // verilog_syntax: parse-as-statements\n"
+        " // EOL comment\n"
+        " int count;\n"
+        " if(cfg.enable) begin\n"
+        " count = 1;\n"
+        " end,\n"
+        " utils_pkg::decrement())\n"
+        "endclass\n",
+        "class foo;\n"
+        "  `MY_MACRO(\n"
+        "      // verilog_syntax: parse-as-statements\n"
+        "      // EOL comment\n"
+        "      int count;\n"
+        "      if (cfg.enable) begin\n"
+        "        count = 1;\n"
+        "      end, utils_pkg::decrement())\n"
+        "endclass\n",
+    },
+
+    // tests top-level data declarations
+    {"a;",  // implicit type
+     "a;\n"},
+    {"a\tb;",  // explicit type
+     "a b;\n"},
+    {"a;b;",
+     "a;\n"
+     "b;\n"},
+    {"a ,b;",  // implicit type
+     "a, b;\n"},
+    /* TODO(b/149591599): implicit type data declarations in module body
+    {"module\tm ;a ;endmodule",
+     "module m;\n"
+     "  a;\n"
+     "endmodule\n"},
+    */
+    {"package\tp ;a ;endpackage",  // implicit type
+     "package p;\n"
+     "  a;\n"
+     "endpackage\n"},
+    {"package\tp ;a ,b ;endpackage",  // implicit type
+     "package p;\n"
+     "  a, b;\n"
+     "endpackage\n"},
+    {"package\tp ;a ;b ;endpackage",  // implicit type
+     "package p;\n"
+     "  a;\n"
+     "  b;\n"
+     "endpackage\n"},
+    /* TODO(b/149591627) : implicit type data declarations in class body
+    {"class\tc ;a ;endclass",
+     "class c;\n"
+     "  a;\n"
+     "endclass\n"},
+     */
+    {"function\tf ;a ;endfunction",  // implicit type
+     "function f;\n"
+     "  a;\n"
+     "endfunction\n"},
+    {"function\tf ;a   ;x ;endfunction",  // implicit type
+     "function f;\n"
+     "  a;\n"
+     "  x;\n"
+     "endfunction\n"},
+    /* TODO(b/149592527): multi-variable data declaration as block_item_decl
+     // same inside tasks
+    {"function\tf ;a  \t,x ;endfunction",  // implicit type
+     "function f;\n"
+     "  a, x;\n"
+     "endfunction\n"},
+     */
+    {"task\tt ;a ;endtask",  // implicit type
+     "task t;\n"
+     "  a;\n"
+     "endtask\n"},
+    {"task\tt ;a   ;x ;endtask",  // implicit type
+     "task t;\n"
+     "  a;\n"
+     "  x;\n"
+     "endtask\n"},
+
+    {// tests bind declaration
+     "bind   foo   bar baz  ( . clk ( clk  ) ) ;",
+     "bind foo bar baz (.clk(clk));\n"},
+    {// tests bind declaration, with type params
+     "bind   foo   bar# ( . W ( W ) ) baz  ( . clk ( clk  ) ) ;",
+     "bind foo bar #(.W(W)) baz (.clk(clk));\n"},
+    {// tests bind declarations
+     "bind   foo   bar baz  ( ) ;"
+     "bind goo  car  caz (   );",
+     "bind foo bar baz ();\n"
+     "bind goo car caz ();\n"},
+
+    {"bind blah foo #( .MaxCount(MaxCount), .MaxDelta(MaxDelta)) bar ("
+     "    .clk(clk), .rst(rst), .value(value) );",
+     "bind blah foo #(\n"
+     "    .MaxCount(MaxCount),\n"
+     "    .MaxDelta(MaxDelta)\n"
+     ") bar (\n"
+     "    .clk  (clk),\n"
+     "    .rst  (rst),\n"
+     "    .value(value)\n"
+     ");\n"},
+    {"bind foo bar baz(\\\n"
+     "`undef d\\\n"
+     "`undef d);",
+     "bind foo bar baz (\\\n"
+     "    `undef d\\\n"
+     "    `undef d\n"
+     ");\n"},
+    {
+        "bind expaaaaaaaaaaand_meeee looooooooong_name# ("
+        ".W(W_CONST), .H(H_CONST), .D(D_CONST)  )"
+        "instaaance_name (.in(iiiiiiiin), .out(ooooooout), .clk(ccccccclk));",
+        "bind expaaaaaaaaaaand_meeee\n"
+        "    looooooooong_name #(\n"
+        "    .W(W_CONST),\n"
+        "    .H(H_CONST),\n"
+        "    .D(D_CONST)\n"
+        ") instaaance_name (\n"
+        "    .in (iiiiiiiin),\n"
+        "    .out(ooooooout),\n"
+        "    .clk(ccccccclk)\n"
+        ");\n",
+    },
+
+    {
+        "bind expand_inst name# ("
+        ".W(W_CONST), .H(H_CONST), .D(D_CONST)  )"
+        "instaaance_name (.in(iiiiiiiin), .out(ooooooout), .clk(ccccccclk));",
+        "bind expand_inst name #(\n"
+        "    .W(W_CONST),\n"
+        "    .H(H_CONST),\n"
+        "    .D(D_CONST)\n"
+        ") instaaance_name (\n"
+        "    .in (iiiiiiiin),\n"
+        "    .out(ooooooout),\n"
+        "    .clk(ccccccclk)\n"
+        ");\n",
+    },
+
+    {
+        // tests import declaration
+        "import  foo_pkg :: bar ;",
+        "import foo_pkg::bar;\n",
+    },
+    {
+        // tests import declaration with wildcard
+        "import  foo_pkg :: * ;",
+        "import foo_pkg::*;\n",
+    },
+    {
+        // tests import declarations
+        "import  foo_pkg :: *\t;"
+        "import  goo_pkg\n:: thing ;",
+        "import foo_pkg::*;\n"
+        "import goo_pkg::thing;\n",
+    },
+    // preserve spaces inside [] dimensions, but limit spaces around ':' to one
+    // and adjust everything else
+    {"foo[W-1:0]a[0:K-1];",  // data declaration
+     "foo [W-1:0] a[0:K-1];\n"},
+    {"foo[W-1 : 0]a[0 : K-1];", "foo [W-1 : 0] a[0 : K-1];\n"},
+    {"foo[W  -  1 : 0 ]a [ 0  :  K  -  1] ;",
+     "foo [W  -  1 : 0] a[0 : K  -  1];\n"},
+    // remove spaces between [...] [...] in multi-dimension arrays
+    {"foo[K] [W]a;",  //
+     "foo [K][W] a;\n"},
+    {"foo b [K] [W] ;",  //
+     "foo b[K][W];\n"},
+    {"logic[K:1] [W:1]a;",  //
+     "logic [K:1][W:1] a;\n"},
+    {"logic b [K:1] [W:1] ;",  //
+     "logic b[K:1][W:1];\n"},
+    // spaces in bit slicing
+    {
+        // preserve 0 spaces
+        "always_ff @(posedge clk) begin "
+        "dummy  <=\tfoo  [  7:2  ] ; "
+        "end",
+        "always_ff @(posedge clk) begin\n"
+        "  dummy <= foo[7:2];\n"
+        "end\n",
+    },
+    {
+        // preserve 1 space
+        "always_ff @(posedge clk) begin "
+        "dummy  <=\tfoo  [  7 : 2  ] ; "
+        "end",
+        "always_ff @(posedge clk) begin\n"
+        "  dummy <= foo[7 : 2];\n"
+        "end\n",
+    },
+    {
+        // limit multiple spaces to 1
+        "always_ff @(posedge clk) begin "
+        "dummy  <=\tfoo  [  7  :  2  ] ; "
+        "end",
+        "always_ff @(posedge clk) begin\n"
+        "  dummy <= foo[7 : 2];\n"
+        "end\n",
+    },
+    {
+        "always_ff @(posedge clk) begin "
+        "dummy  <=\tfoo  [  7  : 2  ] ; "
+        "end",
+        "always_ff @(posedge clk) begin\n"
+        "  dummy <= foo[7 : 2];\n"
+        "end\n",
+    },
+    {
+        // keep value on the left when symmetrizing
+        "always_ff @(posedge clk) begin "
+        "dummy  <=\tfoo  [  7: 2  ] ; "
+        "end",
+        "always_ff @(posedge clk) begin\n"
+        "  dummy <= foo[7:2];\n"
+        "end\n",
+    },
+    {
+        "always_ff @(posedge clk) begin "
+        "dummy  <=\tfoo  [  7:  2  ] ; "
+        "end",
+        "always_ff @(posedge clk) begin\n"
+        "  dummy <= foo[7:2];\n"
+        "end\n",
+    },
+    {
+        "always_ff @(posedge clk) begin "
+        "dummy  <=\tfoo  [  7 :2  ] ; "
+        "end",
+        "always_ff @(posedge clk) begin\n"
+        "  dummy <= foo[7 : 2];\n"
+        "end\n",
+    },
+    {
+        "always_ff @(posedge clk) begin "
+        "dummy  <=\tfoo  [  7 :  2  ] ; "
+        "end",
+        "always_ff @(posedge clk) begin\n"
+        "  dummy <= foo[7 : 2];\n"
+        "end\n",
+    },
+    {
+        // use value on the left, but limit to 1 space
+        "always_ff @(posedge clk) begin "
+        "dummy  <=\tfoo  [  7  :2  ] ; "
+        "end",
+        "always_ff @(posedge clk) begin\n"
+        "  dummy <= foo[7 : 2];\n"
+        "end\n",
+    },
+
+    // task test cases
+    {"task t ;endtask:t",  //
+     "task t;\n"
+     "endtask : t\n"},
+    {"task t ;#   10 ;# 5ns ; # 0.1 ; # 1step ;endtask",
+     "task t;\n"
+     "  #10;\n"  // no space in delay expression
+     "  #5ns;\n"
+     "  #0.1;\n"
+     "  #1step;\n"
+     "endtask\n"},
+    {"task t\n;a<=b ;c<=d ;endtask\n",
+     "task t;\n"
+     "  a <= b;\n"
+     "  c <= d;\n"
+     "endtask\n"},
+    {"class c;   virtual protected task\tt  ( foo bar);"
+     "a.a<=b.b;\t\tc.c\n<=   d.d; endtask   endclass",
+     "class c;\n"
+     "  virtual protected task t(foo bar);\n"
+     "    a.a <= b.b;\n"
+     "    c.c <= d.d;\n"
+     "  endtask\n"
+     "endclass\n"},
+    {"task t;\n// statement comment\nendtask\n",
+     "task t;\n"
+     "  // statement comment\n"  // indented
+     "endtask\n"},
+    {"task t( );\n// statement comment\nendtask\n",
+     "task t();\n"
+     "  // statement comment\n"  // indented
+     "endtask\n"},
+    {"task t( input x  );\n"
+     "// statement comment\n"
+     "s();\n"
+     "// statement comment\n"
+     "endtask\n",
+     "task t(input x);\n"
+     "  // statement comment\n"  // indented
+     "  s();\n"
+     "  // statement comment\n"  // indented
+     "endtask\n"},
+    {"task fj;fork join fork join\tendtask",
+     "task fj;\n"
+     "  fork\n"
+     "  join\n"
+     "  fork\n"
+     "  join\n"
+     "endtask\n"},
+    {"task fj;fork join_any fork join_any\tendtask",
+     "task fj;\n"
+     "  fork\n"
+     "  join_any\n"
+     "  fork\n"
+     "  join_any\n"
+     "endtask\n"},
+    {"task fj;fork join_none fork join_none\tendtask",
+     "task fj;\n"
+     "  fork\n"
+     "  join_none\n"
+     "  fork\n"
+     "  join_none\n"
+     "endtask\n"},
+    {"task fj;fork\n"
+     "//c1\njoin\n"
+     "//c2\n"
+     "fork  \n"
+     "//c3\n"
+     "join\tendtask",
+     "task fj;\n"
+     "  fork\n"
+     "    //c1\n"
+     "  join\n"
+     "  //c2\n"
+     "  fork\n"
+     "    //c3\n"
+     "  join\n"
+     "endtask\n"},
+    {"task fj;\n"
+     "fork "
+     "begin "
+     "end "
+     "foo();"
+     "begin "
+     "end "
+     "join_any endtask",
+     "task fj;\n"
+     "  fork\n"
+     "    begin\n"
+     "    end\n"
+     "    foo();\n"
+     "    begin\n"
+     "    end\n"
+     "  join_any\n"
+     "endtask\n"},
+    {
+        // call and assertion statements
+        "task  t ;Fire() ;assert ( x);assert(y );endtask",
+        "task t;\n"
+        "  Fire();\n"
+        "  assert (x);\n"
+        "  assert (y);\n"
+        "endtask\n",
+    },
+    {
+        // assertion statements with body clause
+        "task  t ;Fire() ;assert ( x) fee ( );assert(y ) foo ( ) ;endtask",
+        "task t;\n"
+        "  Fire();\n"
+        "  assert (x) fee();\n"
+        "  assert (y) foo();\n"
+        "endtask\n",
+    },
+    {
+        // assertion statements with else clause
+        "task  t ;Fire() ;assert ( x) else  fee ( );"
+        "assert(y ) else  foo ( ) ;endtask",
+        "task t;\n"
+        "  Fire();\n"
+        "  assert (x)\n"
+        "  else fee();\n"
+        "  assert (y)\n"
+        "  else foo();\n"
+        "endtask\n",
+    },
+    {
+        // assertion statements with else clause
+        "task  t ;Fire() ;assert ( x) fa(); else  fee ( );"
+        "assert(y ) fi(); else  foo ( ) ;endtask",
+        "task t;\n"
+        "  Fire();\n"
+        "  assert (x) fa();\n"
+        "  else fee();\n"
+        "  assert (y) fi();\n"
+        "  else foo();\n"
+        "endtask\n",
+    },
+    {
+        // assume statements
+        "task  t ;Fire() ;assume ( x);assume(y );endtask",
+        "task t;\n"
+        "  Fire();\n"
+        "  assume (x);\n"
+        "  assume (y);\n"
+        "endtask\n",
+    },
+    {
+        // cover statements
+        "task  t ;Fire() ;cover ( x);cover(y );endtask",
+        "task t;\n"
+        "  Fire();\n"
+        "  cover (x);\n"
+        "  cover (y);\n"
+        "endtask\n",
+    },
+    {
+        // cover statements, with action
+        "task  t ;Fire() ;cover ( x)g( );cover(y ) h();endtask",
+        "task t;\n"
+        "  Fire();\n"
+        "  cover (x) g();\n"
+        "  cover (y) h();\n"
+        "endtask\n",
+    },
+    {
+        // cover statements, with action block
+        "task  t ;Fire() ;cover ( x) begin g( ); end "
+        "cover(y ) begin h(); end endtask",
+        "task t;\n"
+        "  Fire();\n"
+        "  cover (x) begin\n"
+        "    g();\n"
+        "  end\n"
+        "  cover (y) begin\n"
+        "    h();\n"
+        "  end\n"
+        "endtask\n",
+    },
+    {// shuffle calls
+     "task t; foo. shuffle  ( );bar .shuffle( ); endtask",
+     "task t;\n"
+     "  foo.shuffle();\n"
+     "  bar.shuffle();\n"
+     "endtask\n"},
+    {// wait statements (null)
+     "task t; wait  (a==b);wait(c<d); endtask",
+     "task t;\n"
+     "  wait (a == b);\n"
+     "  wait (c < d);\n"
+     "endtask\n"},
+    {// wait statements, single action statement
+     "task t; wait  (a==b) p();wait(c<d) q(); endtask",
+     "task t;\n"
+     "  wait (a == b) p();\n"
+     "  wait (c < d) q();\n"
+     "endtask\n"},
+    {// wait statements, block action statement
+     "task t; wait  (a==b) begin p(); end "
+     "wait(c<d) begin q(); end endtask",
+     "task t;\n"
+     "  wait (a == b) begin\n"
+     "    p();\n"
+     "  end\n"
+     "  wait (c < d) begin\n"
+     "    q();\n"
+     "  end\n"
+     "endtask\n"},
+    {// wait fork statements
+     "task t ; wait\tfork;wait   fork ;endtask",
+     "task t;\n"
+     "  wait fork;\n"
+     "  wait fork;\n"
+     "endtask\n"},
+    {// labeled single statements (prefix-style)
+     "task t;l1:x<=y ;endtask",
+     "task t;\n"
+     "  l1 : x <= y;\n"
+     "endtask\n"},
+    {// labeled block statements (prefix-style)
+     "task t;l1:begin end:l1 endtask",
+     "task t;\n"
+     "  l1 : begin\n"
+     "  end : l1\n"
+     "endtask\n"},
+    {// labeled seq block statements
+     "task t;begin:l1 end:l1 endtask",
+     "task t;\n"
+     "  begin : l1\n"
+     "  end : l1\n"
+     "endtask\n"},
+    {// labeled par block statements
+     "task t;fork:l1 join:l1 endtask",
+     "task t;\n"
+     "  fork : l1\n"
+     "  join : l1\n"
+     "endtask\n"},
+    {// task with disable statements
+     "task  t ;fork\tjoin\tdisable\tfork;endtask",
+     "task t;\n"
+     "  fork\n"
+     "  join\n"
+     "  disable fork;\n"
+     "endtask\n"},
+    {"task  t ;fork\tjoin_any\tdisable\tfork  ;endtask",
+     "task t;\n"
+     "  fork\n"
+     "  join_any\n"
+     "  disable fork;\n"
+     "endtask\n"},
+    {"task  t ;disable\tbean_counter  ;endtask",
+     "task t;\n"
+     "  disable bean_counter;\n"
+     "endtask\n"},
+    {
+        // task with if-statement
+        "task t;"
+        "if (r == t)"
+        "a.b(c);"
+        "endtask",
+        "task t;\n"
+        "  if (r == t) a.b(c);\n"
+        "endtask\n",
+    },
+    {
+        // task with system call inside if header
+        "task t;"
+        "if (!$cast(ssssssssssssssss,vvvvvvvvvv,gggggggg))begin end endtask:t",
+        "task t;\n"
+        "  if (!$cast(\n"
+        "          ssssssssssssssss,\n"
+        "          vvvvvvvvvv,\n"
+        "          gggggggg\n"
+        "      )) begin\n"
+        "  end\n"
+        "endtask : t\n",
+    },
+    {
+        // task with nested subtask call and arguments passed by name
+        "task t;"
+        "if (!$cast(ssssssssssssssss, vvvvvvvvvv.gggggggg("
+        ".ppppppp(ppppppp),"
+        ".yyyyy(\"xxxxxxxxxxxxx\")"
+        "))) begin "
+        "end "
+        "endtask : t",
+        "task t;\n"
+        "  if (!$cast(\n"
+        "          ssssssssssssssss,\n"
+        "          vvvvvvvvvv.gggggggg(\n"
+        "              .ppppppp(ppppppp),\n"
+        "              .yyyyy(\"xxxxxxxxxxxxx\")\n"
+        "          )\n"
+        "      )) begin\n"
+        "  end\n"
+        "endtask : t\n",
+    },
+
+    {
+        // assert property statements
+        "task  t ;assert  property( x);assert\tproperty(y );endtask",
+        "task t;\n"
+        "  assert property (x);\n"
+        "  assert property (y);\n"
+        "endtask\n",
+    },
+    {
+        // assert property statements, with action
+        "task  t ;assert  property( x) j();assert\tproperty(y )k( );endtask",
+        "task t;\n"
+        "  assert property (x) j();\n"
+        "  assert property (y) 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",
+        "task t;\n"
+        "  assert property (x) begin\n"
+        "    j();\n"
+        "  end\n"
+        "  assert property (y) begin\n"
+        "    k();\n"
+        "  end\n"
+        "endtask\n",
+    },
+    {
+        // assert property statements, else with null
+        "task  t ;assert  property( x) else;assert\tproperty(y )else;endtask",
+        "task t;\n"
+        "  assert property (x)\n"
+        "  else;\n"
+        "  assert property (y)\n"
+        "  else;\n"
+        "endtask\n",
+    },
+    {
+        // assert property statements, else with actions
+        "task  t ;assert  property( x) f(); else p(); "
+        "\tassert\tproperty(y ) g();else  q( );endtask",
+        "task t;\n"
+        "  assert property (x) f();\n"
+        "  else p();\n"
+        "  assert property (y) g();\n"
+        "  else q();\n"
+        "endtask\n",
+    },
+    {
+        // assert property statement, with action block, else statement
+        "task  t ;assert  property( x) begin j();end  else\tk( );  endtask",
+        "task t;\n"
+        "  assert property (x) begin\n"
+        "    j();\n"
+        "  end else k();\n"
+        "endtask\n",
+    },
+    {
+        // assert property statement, with action statement, else block
+        "task  t ;assert  property( x) j();  else  begin\tk( );end  endtask",
+        "task t;\n"
+        "  assert property (x) j();\n"
+        "  else begin\n"
+        "    k();\n"
+        "  end\n"
+        "endtask\n",
+    },
+    {
+        // assert property statement, with action block, else block
+        "task  t ;assert  property( x)begin j();end  "
+        "else  begin\tk( );end  endtask",
+        "task t;\n"
+        "  assert property (x) begin\n"
+        "    j();\n"
+        "  end else begin\n"
+        "    k();\n"
+        "  end\n"
+        "endtask\n",
+    },
+
+    {
+        // assume property statements
+        "task  t ;assume  property( x);assume\tproperty(y );endtask",
+        "task t;\n"
+        "  assume property (x);\n"
+        "  assume property (y);\n"
+        "endtask\n",
+    },
+    {
+        // assume property statements, with action
+        "task  t ;assume  property( x) j();assume\tproperty(y )k( );endtask",
+        "task t;\n"
+        "  assume property (x) j();\n"
+        "  assume property (y) k();\n"
+        "endtask\n",
+    },
+    {
+        // assume property statements, with action block
+        "task  t ;assume  property( x) begin j();end "
+        " assume\tproperty(y )begin\tk( );  end endtask",
+        "task t;\n"
+        "  assume property (x) begin\n"
+        "    j();\n"
+        "  end\n"
+        "  assume property (y) begin\n"
+        "    k();\n"
+        "  end\n"
+        "endtask\n",
+    },
+    {
+        // assume property statements, else with null
+        "task  t ;assume  property( x) else;assume\tproperty(y )else;endtask",
+        "task t;\n"
+        "  assume property (x)\n"
+        "  else;\n"
+        "  assume property (y)\n"
+        "  else;\n"
+        "endtask\n",
+    },
+    {
+        // assume property statements, else with actions
+        "task  t ;assume  property( x) f(); else p(); "
+        "\tassume\tproperty(y ) g();else  q( );endtask",
+        "task t;\n"
+        "  assume property (x) f();\n"
+        "  else p();\n"
+        "  assume property (y) g();\n"
+        "  else q();\n"
+        "endtask\n",
+    },
+    {
+        // assume property statement, with action block, else statement
+        "task  t ;assume  property( x) begin j();end  else\tk( );  endtask",
+        "task t;\n"
+        "  assume property (x) begin\n"
+        "    j();\n"
+        "  end else k();\n"
+        "endtask\n",
+    },
+    {
+        // assume property statement, with action statement, else block
+        "task  t ;assume  property( x) j();  else  begin\tk( );end  endtask",
+        "task t;\n"
+        "  assume property (x) j();\n"
+        "  else begin\n"
+        "    k();\n"
+        "  end\n"
+        "endtask\n",
+    },
+    {
+        // assume property statement, with action block, else block
+        "task  t ;assume  property( x)begin j();end  "
+        "else  begin\tk( );end  endtask",
+        "task t;\n"
+        "  assume property (x) begin\n"
+        "    j();\n"
+        "  end else begin\n"
+        "    k();\n"
+        "  end\n"
+        "endtask\n",
+    },
+
+    {
+        // expect property statements
+        "task  t ;expect  ( x);expect\t(y );endtask",
+        "task t;\n"
+        "  expect (x);\n"
+        "  expect (y);\n"
+        "endtask\n",
+    },
+    {
+        // expect property statements, with action
+        "task  t ;expect  ( x) j();expect\t(y )k( );endtask",
+        "task t;\n"
+        "  expect (x) j();\n"
+        "  expect (y) k();\n"
+        "endtask\n",
+    },
+    {
+        // expect property statements, with action block
+        "task  t ;expect  ( x) begin j();end "
+        " expect\t(y )begin\tk( );  end endtask",
+        "task t;\n"
+        "  expect (x) begin\n"
+        "    j();\n"
+        "  end\n"
+        "  expect (y) begin\n"
+        "    k();\n"
+        "  end\n"
+        "endtask\n",
+    },
+    {
+        // expect property statements, else with null
+        "task  t ;expect  ( x) else;expect\t(y )else;endtask",
+        "task t;\n"
+        "  expect (x)\n"
+        "  else;\n"
+        "  expect (y)\n"
+        "  else;\n"
+        "endtask\n",
+    },
+    {
+        // expect property statements, else with actions
+        "task  t ;expect  ( x) f(); else p(); "
+        "\texpect\t(y ) g();else  q( );endtask",
+        "task t;\n"
+        "  expect (x) f();\n"
+        "  else p();\n"
+        "  expect (y) g();\n"
+        "  else q();\n"
+        "endtask\n",
+    },
+    {
+        // expect property statement, with action block, else statement
+        "task  t ;expect  ( x) begin j();end  else\tk( );  endtask",
+        "task t;\n"
+        "  expect (x) begin\n"
+        "    j();\n"
+        "  end else k();\n"
+        "endtask\n",
+    },
+    {
+        // expect property statement, with action statement, else block
+        "task  t ;expect  ( x) j();  else  begin\tk( );end  endtask",
+        "task t;\n"
+        "  expect (x) j();\n"
+        "  else begin\n"
+        "    k();\n"
+        "  end\n"
+        "endtask\n",
+    },
+    {
+        // expect property statement, with action block, else block
+        "task  t ;expect  ( x)begin j();end  "
+        "else  begin\tk( );end  endtask",
+        "task t;\n"
+        "  expect (x) begin\n"
+        "    j();\n"
+        "  end else begin\n"
+        "    k();\n"
+        "  end\n"
+        "endtask\n",
+    },
+
+    {
+        // cover property statements
+        "task  t ;cover  property( x);cover\tproperty(y );endtask",
+        "task t;\n"
+        "  cover property (x);\n"
+        "  cover property (y);\n"
+        "endtask\n",
+    },
+    {
+        // cover property statements, with action
+        "task  t ;cover  property( x) j();cover\tproperty(y )k( );endtask",
+        "task t;\n"
+        "  cover property (x) j();\n"
+        "  cover property (y) k();\n"
+        "endtask\n",
+    },
+    {
+        // cover property statements, with action block
+        "task  t ;cover  property( x) begin j();end "
+        " cover\tproperty(y )begin\tk( );  end endtask",
+        "task t;\n"
+        "  cover property (x) begin\n"
+        "    j();\n"
+        "  end\n"
+        "  cover property (y) begin\n"
+        "    k();\n"
+        "  end\n"
+        "endtask\n",
+    },
+
+    {
+        // cover sequence statements
+        "task  t ;cover  sequence( x);cover\tsequence(y );endtask",
+        "task t;\n"
+        "  cover sequence (x);\n"
+        "  cover sequence (y);\n"
+        "endtask\n",
+    },
+    {
+        // cover sequence statements, with action
+        "task  t ;cover  sequence( x) j();cover\tsequence(y )k( );endtask",
+        "task t;\n"
+        "  cover sequence (x) j();\n"
+        "  cover sequence (y) k();\n"
+        "endtask\n",
+    },
+    {
+        // cover sequence statements, with action block
+        "task  t ;cover  sequence( x) begin j();end "
+        " cover\tsequence(y )begin\tk( );  end endtask",
+        "task t;\n"
+        "  cover sequence (x) begin\n"
+        "    j();\n"
+        "  end\n"
+        "  cover sequence (y) begin\n"
+        "    k();\n"
+        "  end\n"
+        "endtask\n",
+    },
+
+    {// module with disable statements
+     "module m;always begin :block disable m.block; end endmodule",
+     "module m;\n"
+     "  always begin : block\n"
+     "    disable m.block;\n"
+     "  end\n"
+     "endmodule\n"},
+    {"module m;always begin disable m.block; end endmodule",
+     "module m;\n"
+     "  always begin\n"
+     "    disable m.block;\n"
+     "  end\n"
+     "endmodule\n"},
+
+    // property test cases
+    {"module mp ;property p1 ; a|->b;endproperty endmodule",
+     "module mp;\n"
+     "  property p1;\n"
+     "    a |-> b;\n"
+     "  endproperty\n"
+     "endmodule\n"},
+    {"module mp ;property p1 ; a|->b;endproperty:p1 endmodule",
+     "module mp;\n"
+     "  property p1;\n"
+     "    a |-> b;\n"
+     "  endproperty : p1\n"  // with end label
+     "endmodule\n"},
+    {"module mp ;property p1 ; a|->## 1  b;endproperty endmodule",
+     "module mp;\n"
+     "  property p1;\n"
+     "    a |-> ##1 b;\n"  // with delay
+     "  endproperty\n"
+     "endmodule\n"},
+    {"module mp ;property p1 ; a|->## [0: 1]  b;endproperty endmodule",
+     "module mp;\n"
+     "  property p1;\n"
+     "    a |-> ##[0:1] b;\n"  // prefer no spaces with delay range
+     "  endproperty\n"
+     "endmodule\n"},
+    {"module mp ;property p1 ; a|->## [0  : 1]  b;endproperty endmodule",
+     "module mp;\n"
+     "  property p1;\n"
+     "    a |-> ##[0 : 1] b;\n"  // limit to one space, symmetrize
+     "  endproperty\n"
+     "endmodule\n"},
+    {"module mp ;property p1 ; a## 1  b;endproperty endmodule",
+     "module mp;\n"
+     "  property p1;\n"
+     "    a ##1 b;\n"
+     "  endproperty\n"
+     "endmodule\n"},
+    {"module mp ;property p1 ; (a^c)## 1  b;endproperty endmodule",
+     "module mp;\n"
+     "  property p1;\n"
+     "    (a ^ c) ##1 b;\n"
+     "  endproperty\n"
+     "endmodule\n"},
+
+    // covergroup test cases
+    {// Minimal case
+     "covergroup c; endgroup\n",
+     "covergroup c;\n"
+     "endgroup\n"},
+    {// Minimal useful case
+     "covergroup c @ (posedge clk); coverpoint a; endgroup\n",
+     "covergroup c @(posedge clk);\n"
+     "  coverpoint a;\n"
+     "endgroup\n"},
+    {// Multiple coverpoints
+     "covergroup foo @(posedge clk); coverpoint a; coverpoint b; "
+     "coverpoint c; coverpoint d; endgroup\n",
+     "covergroup foo @(posedge clk);\n"
+     "  coverpoint a;\n"
+     "  coverpoint b;\n"
+     "  coverpoint c;\n"
+     "  coverpoint d;\n"
+     "endgroup\n"},
+    {// Multiple bins
+     "covergroup memory @ (posedge ce); address  :coverpoint addr {"
+     "bins low={0,127}; bins high={128,255};} endgroup\n",
+     "covergroup memory @(posedge ce);\n"
+     "  address: coverpoint addr {\n"
+     "    bins low = {0, 127};\n"
+     "    bins high = {128, 255};\n"
+     "  }\n"
+     "endgroup\n"},
+    {// Custom sample() function
+     "covergroup c with function sample(bit i); endgroup\n",
+     "covergroup c with function sample (\n"
+     "    bit i\n"  // test cases are wrapped at 40
+     ");\n"
+     "endgroup\n"},
+
+};
+
+TEST(FormatterEndToEndTest, FunctionTaskFormatterTestCases) {
+  RunFormatterTestCases40(kFunctionTaskFormatterTestCases);
+}
+
+}  // namespace
+}  // namespace formatter
+}  // namespace verilog
diff --git a/verible/verilog/formatting/formatter_issue_regression_test.cc b/verible/verilog/formatting/formatter_issue_regression_test.cc
new file mode 100644
index 0000000..8f1fcef
--- /dev/null
+++ b/verible/verilog/formatting/formatter_issue_regression_test.cc
@@ -0,0 +1,319 @@
+// Copyright 2017-2026 The Verible Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Test cases in this file should be *insensitive* to wrapping penalties.
+// Penalty-sensitive tests belong in formatter-tuning_test.cc.
+
+#include <sstream>
+#include <string_view>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "verible/common/util/logging.h"
+#include "verible/verilog/formatting/format-style.h"
+#include "verible/verilog/formatting/formatter-test-utils.h"
+#include "verible/verilog/formatting/formatter.h"
+
+namespace verilog {
+namespace formatter {
+namespace {
+
+// Regression for https://github.com/chipsalliance/verible/issues/2547:
+// A localparam initialized to a sum of long macros must converge: infix `+`
+// stays with the following operand so re-format does not oscillate between
+// `+\n`MACRO` and `+ `MACRO`.
+TEST(FormatterEndToEndTest, LongMacroSumLocalparamConverges) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {"module m;\n"
+       "  localparam N =\n"
+       "      `MACRO_GEN3_SCRAMBLE_LFSR_REGOUT\n"
+       "      + `MACRO_GEN3_SCRAMBLE_REGIN\n"
+       "      + `MACRO_GEN3_SCRAMBLE_REGOUT\n"
+       "      ;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  localparam N =\n"
+       "  `MACRO_GEN3_SCRAMBLE_LFSR_REGOUT\n"
+       "  + `MACRO_GEN3_SCRAMBLE_REGIN\n"
+       "  + `MACRO_GEN3_SCRAMBLE_REGOUT;\n"
+       "endmodule\n"},
+      // Already in pass-1 form must stay stable.
+      {"module m;\n"
+       "  localparam N =\n"
+       "  `MACRO_GEN3_SCRAMBLE_LFSR_REGOUT\n"
+       "  + `MACRO_GEN3_SCRAMBLE_REGIN\n"
+       "  + `MACRO_GEN3_SCRAMBLE_REGOUT;\n"
+       "endmodule\n",
+       "module m;\n"
+       "  localparam N =\n"
+       "  `MACRO_GEN3_SCRAMBLE_LFSR_REGOUT\n"
+       "  + `MACRO_GEN3_SCRAMBLE_REGIN\n"
+       "  + `MACRO_GEN3_SCRAMBLE_REGOUT;\n"
+       "endmodule\n"},
+  };
+  FormatStyle style;  // default column_limit (100)
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+// Regression for https://github.com/chipsalliance/verible/issues/2544:
+// Wrapping a $bits(...)'(...) cast may leave `MACRO at EOL, reclassifying
+// MacroIdentifier as MacroIdItem. FormatEquivalent must accept that, and
+// formatting must still pass verification.
+TEST(FormatterEndToEndTest, MacroBeforeCloseParenFormatEquivalent) {
+  static constexpr std::string_view kInput =
+      "module m;\n"
+      "  assign result_value = $bits(result_value)'( "
+      "compare_bytes(input_data[DATA_WIDTH_INT-1:0], "
+      "input_datak[STROBE_WIDTH_INT-1:0], `TOKEN_BYTE) );\n"
+      "endmodule\n";
+  FormatStyle style;
+  std::ostringstream stream;
+  const auto status = FormatVerilog(kInput, "<filename>", style, stream);
+  EXPECT_OK(status) << status.message();
+  EXPECT_THAT(stream.str(), testing::HasSubstr("`TOKEN_BYTE"));
+}
+
+// Regression for https://github.com/chipsalliance/verible/issues/2542:
+// Continuation EOL comments after a wrapped assign must keep a stable column
+// across re-format (convergence).
+TEST(FormatterEndToEndTest, ContinuationCommentAfterWrappedAssignConverges) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// Comments originally column-aligned after a wrapped assign
+       "module m;\n"
+       "  assign status_ur = !(status_sc || status_ca ||\n"
+       "    status_crs);      // Completions with a Reserved Completion\n"
+       "                      // Status value are treated as UR\n"
+       "endmodule\n",
+       "module m;\n"
+       "  assign status_ur =\n"
+       "      !(status_sc || status_ca || status_crs);  // Completions with a "
+       "Reserved Completion\n"
+       "                                                // Status value are "
+       "treated as UR\n"
+       "endmodule\n"},
+      {// Previously mis-aligned continuation is not treated as a continuation
+       // (column delta > 1) and must still converge
+       "module m;\n"
+       "  assign status_ur = !(status_sc || status_ca ||\n"
+       "    status_crs);      // Completions with a Reserved Completion\n"
+       "                                                                       "
+       "// Status value are treated as UR\n"
+       "endmodule\n",
+       "module m;\n"
+       "  assign status_ur =\n"
+       "      !(status_sc || status_ca || status_crs);  // Completions with a "
+       "Reserved Completion\n"
+       "  // Status value are treated as UR\n"
+       "endmodule\n"},
+  };
+  FormatStyle style;  // default column_limit (100)
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+// Regression for https://github.com/chipsalliance/verible/issues/2540:
+// Trailing EOL comment after `end` before `else if` must not change whether
+// the else-if assignment stays on one line across re-format (convergence).
+TEST(FormatterEndToEndTest, EndElseIfWithEOLCommentConverges) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// Comment on its own line between end and else if
+       "module m;\n"
+       "  always_comb begin\n"
+       "    case (state)\n"
+       "      STATE_A: begin\n"
+       "        if (cond_aaaa) next_state_value = STATE_B;\n"
+       "        else if (cond_bbbb) begin\n"
+       "          next_state_value = STATE_B;\n"
+       "        end\n"
+       "        // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"
+       "        else if (cond_cccc) next_state_value = STATE_C;\n"
+       "      end\n"
+       "    endcase\n"
+       "  end\n"
+       "endmodule\n",
+       "module m;\n"
+       "  always_comb begin\n"
+       "    case (state)\n"
+       "      STATE_A: begin\n"
+       "        if (cond_aaaa) next_state_value = STATE_B;\n"
+       "        else if (cond_bbbb) begin\n"
+       "          next_state_value = STATE_B;\n"
+       "        end  // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"
+       "        else if (cond_cccc) next_state_value = STATE_C;\n"
+       "      end\n"
+       "    endcase\n"
+       "  end\n"
+       "endmodule\n"},
+      {// Same construct with comment already on the end line
+       "module m;\n"
+       "  always_comb begin\n"
+       "    case (state)\n"
+       "      STATE_A: begin\n"
+       "        if (cond_aaaa) next_state_value = STATE_B;\n"
+       "        else if (cond_bbbb) begin\n"
+       "          next_state_value = STATE_B;\n"
+       "        end  // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"
+       "        else if (cond_cccc) next_state_value = STATE_C;\n"
+       "      end\n"
+       "    endcase\n"
+       "  end\n"
+       "endmodule\n",
+       "module m;\n"
+       "  always_comb begin\n"
+       "    case (state)\n"
+       "      STATE_A: begin\n"
+       "        if (cond_aaaa) next_state_value = STATE_B;\n"
+       "        else if (cond_bbbb) begin\n"
+       "          next_state_value = STATE_B;\n"
+       "        end  // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"
+       "        else if (cond_cccc) next_state_value = STATE_C;\n"
+       "      end\n"
+       "    endcase\n"
+       "  end\n"
+       "endmodule\n"},
+  };
+  FormatStyle style;  // default column_limit (100)
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+// Regression for https://github.com/chipsalliance/verible/issues/2008
+// (also https://github.com/chipsalliance/verible/issues/2474 and
+// https://github.com/chipsalliance/verible/issues/2063):
+// Non-ANSI "input wire signed" used to abort in the tree-unwrapper because
+// the CST visited "signed" before "wire", which is the reverse of source
+// order.
+TEST(FormatterEndToEndTest, NonAnsiWireSignedModulePortDoesNotAbort) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {// Original issue #2008 sample
+       "module uut( sig1 );\n"
+       "\n"
+       "input wire signed [15:0] sig1;\n"
+       "\n"
+       "endmodule\n",
+       "module uut (\n"
+       "    sig1\n"
+       ");\n"
+       "\n"
+       "  input wire signed [15:0] sig1;\n"
+       "\n"
+       "endmodule\n"},
+      {// Issue #2474 sample
+       "module myModule (\n"
+       "    myinput\n"
+       ");\n"
+       "input wire signed [7:0] myInput;\n"
+       "endmodule\n",
+       "module myModule (\n"
+       "    myinput\n"
+       ");\n"
+       "  input wire signed [7:0] myInput;\n"
+       "endmodule\n"},
+      {// Issue #2063 sample: signed wire with no packed dimensions
+       "module top(a);\n"
+       "    input wire signed a;\n"
+       "endmodule\n",
+       "module top (\n"
+       "    a\n"
+       ");\n"
+       "  input wire signed a;\n"
+       "endmodule\n"},
+      {// Same production with logic instead of wire
+       "module uut(sig1);\n"
+       "input logic signed [15:0] sig1;\n"
+       "endmodule\n",
+       "module uut (\n"
+       "    sig1\n"
+       ");\n"
+       "  input logic signed [15:0] sig1;\n"
+       "endmodule\n"},
+      {// output / inout net types
+       "module uut(sig1, sig2);\n"
+       "output wire signed [15:0] sig1;\n"
+       "inout wire signed [7:0] sig2;\n"
+       "endmodule\n",
+       "module uut (\n"
+       "    sig1,\n"
+       "    sig2\n"
+       ");\n"
+       "  output wire signed [15:0] sig1;\n"
+       "  inout wire signed [7:0] sig2;\n"
+       "endmodule\n"},
+      {// unsigned is the same production
+       "module uut(sig1);\n"
+       "input wire unsigned [15:0] sig1;\n"
+       "endmodule\n",
+       "module uut (\n"
+       "    sig1\n"
+       ");\n"
+       "  input wire unsigned [15:0] sig1;\n"
+       "endmodule\n"},
+      {// ANSI form already worked; keep as a regression
+       "module uut(input wire signed [15:0] sig1);\n"
+       "endmodule\n",
+       "module uut (\n"
+       "    input wire signed [15:0] sig1\n"
+       ");\n"
+       "endmodule\n"},
+      {// Non-ANSI without signed still works
+       "module uut(sig1);\n"
+       "input wire [15:0] sig1;\n"
+       "endmodule\n",
+       "module uut (\n"
+       "    sig1\n"
+       ");\n"
+       "  input wire [15:0] sig1;\n"
+       "endmodule\n"},
+      {// Non-ANSI signed without net type still works
+       "module uut(sig1);\n"
+       "input signed [15:0] sig1;\n"
+       "endmodule\n",
+       "module uut (\n"
+       "    sig1\n"
+       ");\n"
+       "  input signed [15:0] sig1;\n"
+       "endmodule\n"},
+  };
+  FormatStyle style;  // default column_limit (100)
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+}  // namespace
+}  // namespace formatter
+}  // namespace verilog
diff --git a/verible/verilog/formatting/formatter_macro_test.cc b/verible/verilog/formatting/formatter_macro_test.cc
new file mode 100644
index 0000000..25f4b90
--- /dev/null
+++ b/verible/verilog/formatting/formatter_macro_test.cc
@@ -0,0 +1,555 @@
+// Copyright 2017-2026 The Verible Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Test cases in this file should be *insensitive* to wrapping penalties.
+// Penalty-sensitive tests belong in formatter-tuning_test.cc.
+
+#include "gtest/gtest.h"
+#include "verible/verilog/formatting/formatter-test-utils.h"
+
+namespace verilog {
+namespace formatter {
+namespace {
+
+static constexpr FormatterTestCase kMacroFormatterTestCases[] = {
+    // preprocessor test cases
+    {"`include    \"path/to/file.vh\"\n", "`include \"path/to/file.vh\"\n"},
+    {"`include    `\"path/to/file.vh`\"\n", "`include `\"path/to/file.vh`\"\n"},
+    {"`define    FOO\n", "`define FOO\n"},
+    {"`define    FOO   BAR\n", "`define FOO BAR\n"},
+    {"`define    FOO\n"
+     "`define  BAR\n",
+     "`define FOO\n"
+     "`define BAR\n"},
+    {"`define FOO_``BAR 1\n", "`define FOO_``BAR 1\n"},
+    {"`define FOO_```BAR 1\n", "`define FOO_```BAR 1\n"},
+    {"`define FOO ``BAR\n", "`define FOO ``BAR\n"},
+    {"`define A``B``C 2\n", "`define A``B``C 2\n"},
+    {"`define A(x)``y\n", "`define A(x) ``y\n"},
+    {"`define    FOO_``BAR\n", "`define FOO_``BAR\n"},
+    {"`ifndef    FOO\n"
+     "`endif // FOO\n",
+     "`ifndef FOO\n"
+     "`endif  // FOO\n"},
+    {"`ifndef    FOO\n"
+     "`define   BAR\n"
+     "`endif\n",
+     "`ifndef FOO\n"
+     "`define BAR\n"
+     "`endif\n"},
+    {"`ifndef    FOO\n"
+     "`define   BAR\n\n"  // one more blank line
+     "`endif\n",
+     "`ifndef FOO\n"
+     "`define BAR\n\n"
+     "`endif\n"},
+    {"`define    FOO   \\\n"
+     "  BAR\n",
+     "`define FOO \\\n"  // TODO(b/72527558): right align '\'s to column limit
+     "  BAR\n"},
+    {"`define    FOOOOOOOOOOOOOOOO   \\\n"
+     "  BAAAAAAAAAAAAAAAAR BAAAAAAAAAAAAAZ;\n",
+     "`define FOOOOOOOOOOOOOOOO \\\n"  // macro text starts at '\'
+     "  BAAAAAAAAAAAAAAAAR BAAAAAAAAAAAAAZ;\n"},
+    {"`ifdef      FOO\n"
+     "  `fine()\n"
+     "`else\n"
+     "  `error()\n"
+     "`endif\n",
+     "`ifdef FOO\n"
+     "`fine()\n"
+     "`else\n"
+     "`error()\n"
+     "`endif\n"},
+    {"`ifdef      FOO\n"
+     "  `fine()\n"
+     "`else // trouble\n"
+     "  `error()\n"
+     "`endif\n",
+     "`ifdef FOO\n"
+     "`fine()\n"
+     "`else  // trouble\n"
+     "`error()\n"
+     "`endif\n"},
+    {"`ifdef      FOO\n"
+     "  `fine()\n"
+     "`else /* trouble */\n"
+     "  `error()\n"
+     "`endif\n",
+     "`ifdef FOO\n"
+     "`fine()\n"
+     "`else  /* trouble */\n"
+     "`error()\n"
+     "`endif\n"},
+    {"    // lonely comment\n", "// lonely comment\n"},
+    {"    // first comment\n"
+     "  // last comment\n",
+     "// first comment\n"
+     "// last comment\n"},
+    {"    // starting comment\n"
+     "  `define   FOO\n",
+     "// starting comment\n"
+     "`define FOO\n"},
+    {"  `define   FOO\n"
+     "   // trailing comment\n",
+     "`define FOO\n"
+     "// trailing comment\n"},
+    {"  `define   FOO\n"
+     "   // trailing comment 1\n"
+     "      // trailing comment 2\n",
+     "`define FOO\n"
+     "// trailing comment 1\n"
+     "// trailing comment 2\n"},
+    {
+        "  `define   FOO    \\\n"  // multiline macro definition
+        " 1\n",
+        "`define FOO \\\n"
+        " 1\n"  // TODO(b/141517267): Reflowing macro definitions
+    },
+    {"`define FOO    \\\n"  // multiline macro definition
+     "        b\n",
+     "`define FOO \\\n"  // no need to align '\'
+     "        b\n"},
+    {"`define FOO    \\\n"  // multiline macro definition
+     "        a +    \\\n"
+     "        b\n",
+     "`define FOO    \\\n"  // preserve spacing before '\'
+     "        a +    \\\n"  // to stay aligned with this one
+     "        b\n"},
+    {"    // comment with backslash\\\n", "// comment with backslash\\\n"},
+    {// macro with MacroArg tokens as arguments
+     "`FOOOOOO(\nbar1...\n,\nbar2...\n,\nbar3...\n,\nbar4\n)\n",
+     "`FOOOOOO(bar1..., bar2..., bar3...,\n"
+     "         bar4)\n"},
+    {// macro declaration exceeds line length limit
+     "`F_MACRO(looooooong_type if_it_fits_I_sits)\n",
+     "`F_MACRO(\n"
+     "    looooooong_type if_it_fits_I_sits)\n"},
+    {// macro call with not fitting arguments
+     "`MACRO_FFFFFFFFFFF("
+     "type_a_aaaa,type_b_bbbbb,"
+     "type_c_cccccc,type_d_dddddddd,"
+     "type_e_eeeeeeee,type_f_ffff)\n",
+     "`MACRO_FFFFFFFFFFF(\n"
+     "    type_a_aaaa, type_b_bbbbb,\n"
+     "    type_c_cccccc, type_d_dddddddd,\n"
+     "    type_e_eeeeeeee, type_f_ffff)\n"},
+    {// nested macro call
+     "`MACRO_FFFFFFFFFFF( "
+     "`A(type_a_aaaa), `B(type_b_bbbbb), "
+     "`C(type_c_cccccc), `D(type_d_dddddddd), "
+     "`E(type_e_eeeeeeee), `F(type_f_ffff))\n",
+     "`MACRO_FFFFFFFFFFF(`A(type_a_aaaa),\n"
+     "                   `B(type_b_bbbbb),\n"
+     "                   `C(type_c_cccccc),\n"
+     "                   `D(type_d_dddddddd),\n"
+     "                   `E(type_e_eeeeeeee),\n"
+     "                   `F(type_f_ffff))\n"},
+    {// two-level nested macro call
+     "`MACRO_FFFFFFFFFFF( "
+     "`A(type_a_aaaa, `B(type_b_bbbbb)), "
+     "`C(type_c_cccccc, `D(type_d_dddddddd)), "
+     "`E(type_e_eeeeeeee, `F(type_f_ffff)))\n",
+     "`MACRO_FFFFFFFFFFF(\n"
+     "    `A(type_a_aaaa, `B(type_b_bbbbb)),\n"
+     "    `C(type_c_cccccc,\n"
+     "       `D(type_d_dddddddd)),\n"
+     "    `E(type_e_eeeeeeee,\n"
+     "       `F(type_f_ffff)))\n"},
+    {// three-level nested macro call
+     "`MACRO_FFFFFFFFFFF(`A(type_a_aaaa,"
+     "`B(type_b_bbbbb,`C(type_c_cccccc))),"
+     "`D(type_d_dddddddd,`E(type_e_eeeeeeee,"
+     "`F(type_f_ffff))))\n",
+     "`MACRO_FFFFFFFFFFF(\n"
+     "    `A(type_a_aaaa,\n"
+     "       `B(type_b_bbbbb,\n"
+     "          `C(type_c_cccccc))),\n"
+     "    `D(type_d_dddddddd,\n"
+     "       `E(type_e_eeeeeeee,\n"
+     "          `F(type_f_ffff))))\n"},
+    {// macro call with MacroArg tokens as arugments and with semicolon
+     "`FOOOOOO(\nbar1...\n,\nbar2...\n,\nbar3...\n,\nbar4\n);\n",
+     "`FOOOOOO(bar1..., bar2..., bar3...,\n"
+     "         bar4);\n"},
+    {// macro declaration exceeds line length limit and contains semicolon
+     "`F_MACRO(looooooong_type if_it_fits_I_sits);\n",
+     "`F_MACRO(\n"
+     "    looooooong_type if_it_fits_I_sits);\n"},
+    {// macro call with not fitting arguments and semicolon
+     "`MACRO_FFFFFFFFFFF("
+     "type_a_aaaa,type_b_bbbbb,"
+     "type_c_cccccc,type_d_dddddddd,"
+     "type_e_eeeeeeee,type_f_ffff);\n",
+     "`MACRO_FFFFFFFFFFF(\n"
+     "    type_a_aaaa, type_b_bbbbb,\n"
+     "    type_c_cccccc, type_d_dddddddd,\n"
+     "    type_e_eeeeeeee, type_f_ffff);\n"},
+    {// nested macro call with semicolon
+     "`MACRO_FFFFFFFFFFF( "
+     "`A(type_a_aaaa), `B(type_b_bbbbb), "
+     "`C(type_c_cccccc), `D(type_d_dddddddd), "
+     "`E(type_e_eeeeeeee), `F(type_f_ffff));\n",
+     "`MACRO_FFFFFFFFFFF(`A(type_a_aaaa),\n"
+     "                   `B(type_b_bbbbb),\n"
+     "                   `C(type_c_cccccc),\n"
+     "                   `D(type_d_dddddddd),\n"
+     "                   `E(type_e_eeeeeeee),\n"
+     "                   `F(type_f_ffff));\n"},
+    {// two-level nested macro call with semicolon
+     "`MACRO_FFFFFFFFFFF( "
+     "`A(type_a_aaaa, `B(type_b_bbbbb)), "
+     "`C(type_c_cccccc, `D(type_d_dddddddd)), "
+     "`E(type_e_eeeeeeee, `F(type_f_ffff)));\n",
+     "`MACRO_FFFFFFFFFFF(\n"
+     "    `A(type_a_aaaa, `B(type_b_bbbbb)),\n"
+     "    `C(type_c_cccccc,\n"
+     "       `D(type_d_dddddddd)),\n"
+     "    `E(type_e_eeeeeeee,\n"
+     "       `F(type_f_ffff)));\n"},
+    {// three-level nested macro call with semicolon
+     "`MACRO_FFFFFFFFFFF(`A(type_a_aaaa,"
+     "`B(type_b_bbbbb,`C(type_c_cccccc))),"
+     "`D(type_d_dddddddd,`E(type_e_eeeeeeee,"
+     "`F(type_f_ffff))));\n",
+     "`MACRO_FFFFFFFFFFF(\n"
+     "    `A(type_a_aaaa,\n"
+     "       `B(type_b_bbbbb,\n"
+     "          `C(type_c_cccccc))),\n"
+     "    `D(type_d_dddddddd,\n"
+     "       `E(type_e_eeeeeeee,\n"
+     "          `F(type_f_ffff))));\n"},
+    {// macro call with no args
+     "`FOOOOOO()\n", "`FOOOOOO()\n"},
+    {// macro call with no args and semicolon
+     "`FOOOOOO();\n", "`FOOOOOO();\n"},
+    {// macro call with no args and semicolon separated by space
+     "`FOOOOOO() ;\n", "`FOOOOOO();\n"},
+    {// macro call with comments in argument list
+     "`FOO(aa, //aa\nbb , // bb\ncc)\n",
+     "`FOO(aa,  //aa\n"
+     "     bb,  // bb\n"
+     "     cc)\n"},
+    {// macro call with comment before first argument
+     "`FOO(//aa\naa, //bb\nbb , // cc\ncc)\n",
+     "`FOO(  //aa\n"
+     "    aa,  //bb\n"
+     "    bb,  // cc\n"
+     "    cc)\n"},
+    {// macro call with argument including trailing EOL comment
+     "`FOO(aa, bb,//cc\ndd)\n",
+     "`FOO(aa, bb,  //cc\n"
+     "     dd)\n"},
+    {// macro call with argument including EOL comment on own line
+     "`FOOOO(aa, bb,\n//cc\ndd)\n",
+     "`FOOOO(aa, bb,\n"
+     "       //cc\n"
+     "       dd)\n"},
+    {"  // leading comment\n"
+     "  `define   FOO    \\\n"  // multiline macro definition
+     "1\n"
+     "   // trailing comment\n",
+     "// leading comment\n"
+     "`define FOO \\\n"
+     "1\n"  // TODO(b/141517267): Reflowing macro definitions
+     "// trailing comment\n"},
+    {// macro call after define
+     "`define   FOO   BAR\n"
+     "  `FOO( bar )\n",
+     "`define FOO BAR\n"
+     "`FOO(bar)\n"},
+    {// multiple argument macro call
+     "  `FOO( bar , baz )\n", "`FOO(bar, baz)\n"},
+    {// long macro call breaking
+     " `ASSERT_INIT(S, (D == 4 && K inside {0, 1}) ||"
+     " (D == 3 && K== 4))\n",
+     "`ASSERT_INIT(\n"
+     "    S, (D == 4 && K inside {0, 1}) ||\n"
+     "           (D == 3 && K == 4))\n"},
+    {// long macro call breaking
+     " `AINIT(S, (D == 4 && K inside {0, 1}) ||"
+     " (D == 3 && K== 4))\n",
+     "`AINIT(S, (D == 4 && K inside {0, 1}) ||\n"
+     "              (D == 3 && K == 4))\n"},
+    {// long macro call breaking
+     " `ASSERT_INIT(S, D == 4 && K inside {0, 1})\n",
+     "`ASSERT_INIT(S,\n"
+     "             D == 4 && K inside {0, 1})\n"},
+    {// macro call in function
+     "function void foo( );   foo=`FOO( bar , baz ) ; endfunction\n",
+     "function void foo();\n"
+     "  foo = `FOO(bar, baz);\n"
+     "endfunction\n"},
+    {// nested macro call in function
+     "function void foo( );   foo=`FOO( `BAR ( baz ) ) ; endfunction\n",
+     "function void foo();\n"
+     "  foo = `FOO(`BAR(baz));\n"
+     "endfunction\n"},
+    {// macro call in class
+     "class foo;    `FOO  ( bar , baz ) ; endclass\n",
+     "class foo;\n"
+     "  `FOO(bar, baz);\n"
+     "endclass\n"},
+    {// nested macro call in class
+     "class foo;    `FOO  ( `BAR ( baz1 , baz2 ) ) ; endclass\n",
+     "class foo;\n"
+     "  `FOO(`BAR(baz1, baz2));\n"
+     "endclass\n"},
+    {// multi-line macro arg "aaaa..." should start on its own line,
+     // even if its first line would fit under the column limit
+     "`CHECK_FATAL(rd_tr,\n"
+     "             aaaa     == zzz;\n"
+     "             ggg      == vv::w;,\n"
+     "             \"Failed to ..........\")\n",
+     "`CHECK_FATAL(rd_tr,\n"
+     "             aaaa     == zzz;\n"
+     "             ggg      == vv::w;,\n"
+     "             \"Failed to ..........\")\n"},
+    {// macro call nested with function call containing an ifdef
+     "`J(D(`ifdef e))\n",
+     "`J(D(\n"
+     "   `ifdef e))\n"},
+
+    // `uvm macros indenting
+    {
+        // simple test case
+        "`uvm_object_utils_begin(aa)\n"
+        "`uvm_field_int(bb, UVM_DEFAULT)\n"
+        "`uvm_field_int(cc, UVM_DEFAULT)\n"
+        "`uvm_object_utils_end\n",
+        "`uvm_object_utils_begin(aa)\n"
+        "  `uvm_field_int(bb, UVM_DEFAULT)\n"
+        "  `uvm_field_int(cc, UVM_DEFAULT)\n"
+        "`uvm_object_utils_end\n",
+    },
+    {// multiple uvm.*begin - uvm.*end ranges
+     "`uvm_object_utils_begin(aa)\n"
+     "`uvm_field_int(bb, UVM_DEFAULT)\n"
+     "`uvm_field_int(cc, UVM_DEFAULT)\n"
+     "`uvm_object_utils_end\n"
+     "`uvm_field_int(bb, UVM_DEFAULT)\n"
+     "`uvm_field_int(cc, UVM_DEFAULT)\n"
+     "`uvm_object_utils_begin(bb)\n"
+     "`uvm_field_int(bb, UVM_DEFAULT)\n"
+     "`uvm_field_int(cc, UVM_DEFAULT)\n"
+     "`uvm_object_utils_end\n"
+     "`uvm_field_int(bb, UVM_DEFAULT)\n"
+     "`uvm_field_int(cc, UVM_DEFAULT)\n",
+     "`uvm_object_utils_begin(aa)\n"
+     "  `uvm_field_int(bb, UVM_DEFAULT)\n"
+     "  `uvm_field_int(cc, UVM_DEFAULT)\n"
+     "`uvm_object_utils_end\n"
+     "`uvm_field_int(bb, UVM_DEFAULT)\n"
+     "`uvm_field_int(cc, UVM_DEFAULT)\n"
+     "`uvm_object_utils_begin(bb)\n"
+     "  `uvm_field_int(bb, UVM_DEFAULT)\n"
+     "  `uvm_field_int(cc, UVM_DEFAULT)\n"
+     "`uvm_object_utils_end\n"
+     "`uvm_field_int(bb, UVM_DEFAULT)\n"
+     "`uvm_field_int(cc, UVM_DEFAULT)\n"},
+    {
+        // empty uvm.*begin - uvm.*end range
+        "`uvm_component_utils_begin(aa)\n"
+        "`uvm_component_utils_end\n",
+        "`uvm_component_utils_begin(aa)\n"
+        "`uvm_component_utils_end\n",
+    },
+    {
+        // uvm_field_utils
+        "`uvm_field_utils_begin(aa)\n"
+        "`uvm_field_int(bb, UVM_DEFAULT)\n"
+        "`uvm_field_int(cc, UVM_DEFAULT)\n"
+        "`uvm_field_utils_end\n",
+        "`uvm_field_utils_begin(aa)\n"
+        "  `uvm_field_int(bb, UVM_DEFAULT)\n"
+        "  `uvm_field_int(cc, UVM_DEFAULT)\n"
+        "`uvm_field_utils_end\n",
+    },
+    {
+        // uvm_component
+        "`uvm_component_utils_begin(aa)\n"
+        "`uvm_field_int(bb, UVM_DEFAULT)\n"
+        "`uvm_field_int(cc, UVM_DEFAULT)\n"
+        "`uvm_component_utils_end\n",
+        "`uvm_component_utils_begin(aa)\n"
+        "  `uvm_field_int(bb, UVM_DEFAULT)\n"
+        "  `uvm_field_int(cc, UVM_DEFAULT)\n"
+        "`uvm_component_utils_end\n",
+    },
+    {
+        // nested uvm macros
+        "`uvm_field_int(l0, UVM_DEFAULT)\n"
+        "`uvm_component_utils_begin(l0)\n"
+        "`uvm_field_int(l1, UVM_DEFAULT)\n"
+        "`uvm_component_utils_begin(l1)\n"
+        "`uvm_field_int(l2, UVM_DEFAULT)\n"
+        "`uvm_component_utils_begin(l2)\n"
+        "`uvm_field_int(l3, UVM_DEFAULT)\n"
+        "`uvm_component_utils_end\n"
+        "`uvm_field_int(l2, UVM_DEFAULT)\n"
+        "`uvm_component_utils_end\n"
+        "`uvm_field_int(l1, UVM_DEFAULT)\n"
+        "`uvm_component_utils_end\n"
+        "`uvm_field_int(l0, UVM_DEFAULT)\n",
+        "`uvm_field_int(l0, UVM_DEFAULT)\n"
+        "`uvm_component_utils_begin(l0)\n"
+        "  `uvm_field_int(l1, UVM_DEFAULT)\n"
+        "  `uvm_component_utils_begin(l1)\n"
+        "    `uvm_field_int(l2, UVM_DEFAULT)\n"
+        "    `uvm_component_utils_begin(l2)\n"
+        "      `uvm_field_int(l3, UVM_DEFAULT)\n"
+        "    `uvm_component_utils_end\n"
+        "    `uvm_field_int(l2, UVM_DEFAULT)\n"
+        "  `uvm_component_utils_end\n"
+        "  `uvm_field_int(l1, UVM_DEFAULT)\n"
+        "`uvm_component_utils_end\n"
+        "`uvm_field_int(l0, UVM_DEFAULT)\n",
+    },
+    {
+        // non-uvm macro
+        "`my_macro_begin(aa)\n"
+        "`my_field(b)\n"
+        "`my_field(c)\n"
+        "`my_macro_end\n",
+        "`my_macro_begin(aa)\n"
+        "`my_field(b)\n"
+        "`my_field(c)\n"
+        "`my_macro_end\n",
+    },
+    {
+        // unbalanced uvm macros: missing uvm.*end macro
+        "`uvm_component_utils_begin(aa)\n"
+        "`uvm_field_int(bb, UVM_DEFAULT)\n"
+        "`uvm_field_int(cc, UVM_DEFAULT)\n",
+        "`uvm_component_utils_begin(aa)\n"
+        "`uvm_field_int(bb, UVM_DEFAULT)\n"
+        "`uvm_field_int(cc, UVM_DEFAULT)\n",
+    },
+    {
+        // unbalanced uvm macros: missing uvm.*begin macro
+        "`uvm_field_int(bb, UVM_DEFAULT)\n"
+        "`uvm_field_int(cc, UVM_DEFAULT)\n"
+        "`uvm_component_utils_end\n",
+        "`uvm_field_int(bb, UVM_DEFAULT)\n"
+        "`uvm_field_int(cc, UVM_DEFAULT)\n"
+        "`uvm_component_utils_end\n",
+    },
+    {// unbalanced uvm macros: missing _begin macro between
+     // matching uvm.*begin-uvm.*end macros
+     "`uvm_component_utils_begin(aa)\n"
+     "`uvm_field_int(bb, UVM_DEFAULT)\n"
+     "`uvm_field_int(cc, UVM_DEFAULT)\n"
+     "`uvm_component_utils_end\n"
+     "`uvm_field_int(bb, UVM_DEFAULT)\n"
+     "`uvm_field_int(bb, UVM_DEFAULT)\n"
+     "`uvm_field_int(cc, UVM_DEFAULT)\n"
+     "`uvm_component_utils_end\n"
+     "`uvm_field_int(bb, UVM_DEFAULT)\n"
+     "`uvm_component_utils_begin(aa)\n"
+     "`uvm_field_int(bb, UVM_DEFAULT)\n"
+     "`uvm_field_int(cc, UVM_DEFAULT)\n"
+     "`uvm_component_utils_end\n",
+     "`uvm_component_utils_begin(aa)\n"
+     "  `uvm_field_int(bb, UVM_DEFAULT)\n"
+     "  `uvm_field_int(cc, UVM_DEFAULT)\n"
+     "`uvm_component_utils_end\n"
+     "`uvm_field_int(bb, UVM_DEFAULT)\n"
+     "`uvm_field_int(bb, UVM_DEFAULT)\n"
+     "`uvm_field_int(cc, UVM_DEFAULT)\n"
+     "`uvm_component_utils_end\n"
+     "`uvm_field_int(bb, UVM_DEFAULT)\n"
+     "`uvm_component_utils_begin(aa)\n"
+     "  `uvm_field_int(bb, UVM_DEFAULT)\n"
+     "  `uvm_field_int(cc, UVM_DEFAULT)\n"
+     "`uvm_component_utils_end\n"},
+
+    // top-level directive test cases
+    {"`timescale  1ns/1ps\n",  //
+     "`timescale 1ns / 1ps\n"},
+
+    // Multiple compiler directives should remain on separate lines
+    // (regression test for bug where they were merged onto one line)
+    {"`timescale 1 ps / 1 ps\n"
+     "`default_nettype none\n",
+     "`timescale 1 ps / 1 ps\n"
+     "`default_nettype none\n"},
+    {"`resetall\n"
+     "`timescale 1ns/1ps\n"
+     "`default_nettype wire\n",
+     "`resetall\n"
+     "`timescale 1ns / 1ps\n"
+     "`default_nettype wire\n"},
+    // Test with multiple different compiler directives
+    {"`resetall\n"
+     "`celldefine\n"
+     "`timescale 1ns/1ps\n"
+     "`default_nettype none\n",
+     "`resetall\n"
+     "`celldefine\n"
+     "`timescale 1ns / 1ps\n"
+     "`default_nettype none\n"},
+    // Test with compiler directives before module
+    {"`timescale 1ps/1ps\n"
+     "`default_nettype none\n"
+     "module foo;endmodule\n",
+     "`timescale 1ps / 1ps\n"
+     "`default_nettype none\n"
+     "module foo;\nendmodule\n"},
+    // Test with various compiler directives
+    {"`suppress_faults\n"
+     "`enable_portfaults\n"
+     "`delay_mode_distributed\n",
+     "`suppress_faults\n"
+     "`enable_portfaults\n"
+     "`delay_mode_distributed\n"},
+    {"`default_decay_time 10\n"
+     "`default_trireg_strength 50\n",
+     "`default_decay_time 10\n"
+     "`default_trireg_strength 50\n"},
+    // Alignment should ignore compiler directives; declarations align normally.
+    // Place directives at top-level between modules (valid SystemVerilog).
+    {"`timescale 1ns/1ps\n"
+     "module m;\n"
+     "  logic a;\n"
+     "  logic very_long_name;\n"
+     "endmodule\n"
+     "`default_nettype none\n"
+     "module n;\n"
+     "  logic b;\n"
+     "endmodule\n",
+     "`timescale 1ns / 1ps\n"
+     "module m;\n"
+     "  logic a;\n"
+     "  logic very_long_name;\n"
+     "endmodule\n"
+     "`default_nettype none\n"
+     "module n;\n"
+     "  logic b;\n"
+     "endmodule\n"},
+    {"`begin_keywords \"1800-2017\"\n"
+     "module test;endmodule\n"
+     "`end_keywords\n",
+     "`begin_keywords \"1800-2017\"\n"
+     "module test;\nendmodule\n"
+     "`end_keywords\n"},
+
+};
+
+TEST(FormatterEndToEndTest, MacroFormatterTestCases) {
+  RunFormatterTestCases40(kMacroFormatterTestCases);
+}
+
+}  // namespace
+}  // namespace formatter
+}  // namespace verilog
diff --git a/verible/verilog/formatting/formatter_module_test.cc b/verible/verilog/formatting/formatter_module_test.cc
new file mode 100644
index 0000000..4290e5e
--- /dev/null
+++ b/verible/verilog/formatting/formatter_module_test.cc
@@ -0,0 +1,3025 @@
+// Copyright 2017-2026 The Verible Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Test cases in this file should be *insensitive* to wrapping penalties.
+// Penalty-sensitive tests belong in formatter-tuning_test.cc.
+
+#include "gtest/gtest.h"
+#include "verible/verilog/formatting/formatter-test-utils.h"
+
+namespace verilog {
+namespace formatter {
+namespace {
+
+static constexpr FormatterTestCase kModuleFormatterTestCases[] = {
+    // parameter test cases
+    {
+        "  parameter  int   foo=0 ;",
+        "parameter int foo = 0;\n",
+    },
+    {
+        "  parameter  int   foo=bar [ 0 ] ;",  // index expression
+        "parameter int foo = bar[0];\n",
+    },
+    {
+        "  parameter  int   foo=bar [ a+b ] ;",  // binary inside index expr
+        "parameter int foo = bar[a+b];\n",       // allowed to be 0 spaces
+                                                 // (preserved)
+    },
+    {
+        "  parameter  int   foo=bar [ a+ b ] ;",  // binary inside index expr
+        "parameter int foo = bar[a+b];\n",        // allowed to be 0 spaces
+                                                  // (symmetrized)
+    },
+    {
+        "  parameter  int   foo=bar [ a +b ] ;",  // compact binary inside
+        "parameter int foo = bar[a+b];\n",        // index expression
+    },
+    {
+        "  parameter  int   foo=bar [ a  +b ] ;",  // compact binary inside
+        "parameter int foo = bar[a+b];\n",         // index expression
+    },
+    {
+        // with line continuations
+        "  parameter  \\\nint   \\\nfoo=a+ \\\nb ;",
+        "parameter\\\n    int\\\n    foo = a +\\\n    b;\n",
+        // TODO(fangism): should text following a line continuation hang-indent?
+    },
+    // unary prefix expressions
+    {
+        "  parameter  int   foo=- 1 ;",
+        "parameter int foo = -1;\n",
+    },
+    {
+        "  parameter  int   foo=+ 7 ;",
+        "parameter int foo = +7;\n",
+    },
+    {
+        "  parameter  int   foo=- J ;",
+        "parameter int foo = -J;\n",
+    },
+    {
+        "  parameter  int   foo=- ( y ) ;",
+        "parameter int foo = -(y);\n",
+    },
+    {
+        "  parameter  int   foo=- ( z*y ) ;",
+        "parameter int foo = -(z * y);\n",
+    },
+    {
+        "  parameter  int   foo=-  z*- y  ;",
+        "parameter int foo = -z * -y;\n",
+    },
+    {
+        "  parameter  int   foo=( - 2 ) ;",  //
+        "parameter int foo = (-2);\n",
+    },
+    {
+        "  parameter  int   foo=$bar(-  z,- y ) ;",
+        "parameter int foo = $bar(-z, -y);\n",
+    },
+    {"  parameter int a=b&~(c<<d);", "parameter int a = b & ~(c << d);\n"},
+    {"  parameter int a=~~~~b;", "parameter int a = ~~~~b;\n"},
+    {"  parameter int a = ~ ~ ~ ~ b;", "parameter int a = ~~~~b;\n"},
+    {"  parameter int a   =   ~--b;", "parameter int a = ~--b;\n"},
+    {"  parameter int a   =   ~ --b;", "parameter int a = ~--b;\n"},
+    {"  parameter int a = ~ ++ b;", "parameter int a = ~++b;\n"},
+    {"  parameter int a=--b- --c;", "parameter int a = --b - --c;\n"},
+    // ^~ and ~^ are bitwise nor, but ^ ~ isn't
+    {"  parameter int a=b^~(c<<d);", "parameter int a = b ^~ (c << d);\n"},
+    {"  parameter int a=b~^(c<<d);", "parameter int a = b ~^ (c << d);\n"},
+    {"  parameter int a=b^ ~ (c<<d);", "parameter int a = b ^ ~(c << d);\n"},
+    {"  parameter int a=b ^ ~(c<<d);", "parameter int a = b ^ ~(c << d);\n"},
+
+    {"  parameter int a=b^~{c};", "parameter int a = b ^~ {c};\n"},
+    {"  parameter int a=b~^{c};", "parameter int a = b ~^ {c};\n"},
+    {"  parameter int a=b^ ~ {c};", "parameter int a = b ^ ~{c};\n"},
+    {"  parameter int a=b ^ ~{c};", "parameter int a = b ^ ~{c};\n"},
+
+    {"  parameter int a={a}^{b};", "parameter int a = {a} ^ {b};\n"},
+    {"  parameter int a={b}^(c);", "parameter int a = {b} ^ (c);\n"},
+    {"  parameter int a=b[0]^ {c};", "parameter int a = b[0] ^ {c};\n"},
+    {"  parameter int a={c}^a[b];", "parameter int a = {c} ^ a[b];\n"},
+    {"  parameter int a=(c)^{a[b]};", "parameter int a = (c) ^ {a[b]};\n"},
+
+    {"  parameter int a={^{a,^b},c};", "parameter int a = {^{a, ^b}, c};\n"},
+    {"  parameter int a=(a)^(^d[e]^{c});",
+     "parameter int a = (a) ^ (^d[e] ^ {c});\n"},
+    {"  parameter int a=(a)^(^d[e]^f[g]);",
+     "parameter int a = (a) ^ (^d[e] ^ f[g]);\n"},
+    {"  parameter int a=(b^(c^(d^e)));",
+     "parameter int a = (b ^ (c ^ (d ^ e)));\n"},
+    {"  parameter int a={b^{c^{d^e}}};",
+     "parameter int a = {b ^ {c ^ {d ^ e}}};\n"},
+    {"  parameter int a={b^{c[d^e]}};",
+     "parameter int a = {b ^ {c[d^e]}};\n"},  // allow 0 spaces inside "[d^e]"
+    {"  parameter int a={(b^c),(d^^e)};",
+     "parameter int a = {(b ^ c), (d ^ ^e)};\n"},
+
+    {"  parameter int a={(b[x]^{c[y]})};",
+     "parameter int a = {(b[x] ^ {c[y]})};\n"},
+    {"  parameter int a={d^^e[f] ^ (g)};",
+     "parameter int a = {d ^ ^e[f] ^ (g)};\n"},
+
+    // ~| is unary reduction NOR, |~ and | ~ aren't
+    {"  parameter int a=b| ~(c<<d);", "parameter int a = b | ~(c << d);\n"},
+    {"  parameter int a=b|~(c<<d);", "parameter int a = b | ~(c << d);\n"},
+    {"  parameter int a=b| ~| ( c<<d);", "parameter int a = b | ~|(c << d);\n"},
+    {"  parameter int a=b| ~| ~| ( c<<d);",
+     "parameter int a = b | ~|~|(c << d);\n"},
+    {"  parameter int a=b| ~~~( c<<d);",
+     "parameter int a = b | ~~~(c << d);\n"},
+    {
+        "  parameter  int   foo=- - 1 ;",  // double negative
+        "parameter int foo = - -1;\n",
+    },
+    {
+        "  parameter  int   ternary=1?2:3;",
+        "parameter int ternary = 1 ? 2 : 3;\n",
+    },
+    {
+        "  parameter  int   ternary=a?b:c;",
+        "parameter int ternary = a ? b : c;\n",
+    },
+    {
+        "  parameter  int   ternary=\"a\"?\"b\":\"c\";",
+        "parameter int ternary = \"a\" ? \"b\" : \"c\";\n",
+    },
+    {
+        "  parameter  int   t=`\"a`\"?`\"b`\":`\"c`\";",
+        "parameter int t = `\"a`\" ? `\"b`\" : `\"c`\";\n",
+    },
+    {
+        "  parameter  int   ternary=(a)?(b):(c);",
+        "parameter int ternary = (a) ? (b) : (c);\n",
+    },
+    {
+        "  parameter  int   ternary={a}?{b}:{c};",
+        "parameter int ternary = {a} ? {b} : {c};\n",
+    },
+    {
+        "  parameter  int   long_ternary=cond?long_option_t:long_option_f;",
+        "parameter int long_ternary = cond ?\n"
+        "    long_option_t : long_option_f;\n",
+    },
+    {
+        "  parameter  int   break_two=cond\n"
+        "? a_really_long_option_number_one:a_really_long_option_number_two;",
+        "parameter int break_two = cond ?\n"
+        "    a_really_long_option_number_one :\n"
+        "    a_really_long_option_number_two;\n",
+    },
+    {
+        "  assign   ternary=1?2:3;",
+        "assign ternary = 1 ? 2 : 3;\n",
+    },
+    {
+        "  assign   ternary=a?b:c;",
+        "assign ternary = a ? b : c;\n",
+    },
+    {
+        "  assign   ternary={a}?{b}:{c};",
+        "assign ternary = {a} ? {b} : {c};\n",
+    },
+    {
+        "  assign   break_two=cond\n"
+        "? a_really_long_option_number_one:a_really_long_option_number_two;",
+        "assign break_two = cond ?\n"
+        "    a_really_long_option_number_one :\n"
+        "    a_really_long_option_number_two;\n",
+    },
+    {
+        "assign prefetch_d     =\n"
+        "lookup_grant_ic0 ? (lookup_addr_aligned + ADDR) :\n"
+        "                   addr_i;",
+        "assign prefetch_d = lookup_grant_ic0 ?\n"
+        "    (lookup_addr_aligned + ADDR) :\n"
+        "    addr_i;\n",
+    },
+    {
+        "assign prefetch_d     =\n"
+        "lookup_grant_ic0 ? (lookup_addr + 1) :\n"
+        "                   addr_i;",
+        "assign prefetch_d = lookup_grant_ic0 ?\n"
+        "    (lookup_addr + 1) : addr_i;\n",
+    },
+    {
+        "module test;\n"
+        " assign next = // EOL\n"
+        "  foo ? '0 :\n"
+        "  cnt;\n"
+        "endmodule\n",
+        "module test;\n"
+        "  assign next =  // EOL\n"
+        "      foo ? '0 : cnt;\n"
+        "endmodule\n",
+    },
+    {
+        "module test;\n"
+        " assign next = foo // EOL\n"
+        "  ? '0 :\n"
+        "  cnt;\n"
+        "endmodule\n",
+        "module test;\n"
+        "  assign next = foo  // EOL\n"
+        "      ? '0 : cnt;\n"
+        "endmodule\n",
+    },
+    {
+        "module test;\n"
+        " assign next = foo ? // EOL\n"
+        "  '0 :\n"
+        "  cnt;\n"
+        "endmodule\n",
+        "module test;\n"
+        "  assign next = foo ?  // EOL\n"
+        "      '0 : cnt;\n"
+        "endmodule\n",
+    },
+    {
+        "module test;\n"
+        " assign next = foo ? '0 // EOL\n"
+        "  :\n"
+        "  cnt;\n"
+        "endmodule\n",
+        "module test;\n"
+        "  assign next = foo ? '0  // EOL\n"
+        "      : cnt;\n"
+        "endmodule\n",
+    },
+    {
+        "module test;\n"
+        " assign next = foo ? '0 : // EOL\n"
+        "  cnt;\n"
+        "endmodule\n",
+        "module test;\n"
+        "  assign next = foo ? '0 :  // EOL\n"
+        "      cnt;\n"
+        "endmodule\n",
+    },
+    {
+        "module test;\n"
+        " assign next = foo ? '0 : // EOL\n"
+        "  bar ? '1 : '0;\n"
+        "endmodule\n",
+        "module test;\n"
+        "  assign next = foo ? '0 :  // EOL\n"
+        "      bar ? '1 : '0;\n"
+        "endmodule\n",
+    },
+    {
+        "module test;\n"
+        " assign next = foo ? '0 : // EOL\n"
+        "  bar // EOL2\n"
+        " ? '1 : '0;\n"
+        "endmodule\n",
+        "module test;\n"
+        "  assign next = foo ? '0 :  // EOL\n"
+        "      bar  // EOL2\n"
+        "      ? '1 : '0;\n"
+        "endmodule\n",
+    },
+    {
+        "module test;\n"
+        " assign next = foo ? '0 : // EOL\n"
+        "  bar ? // EOL2\n"
+        "  '1 : '0;\n"
+        "endmodule\n",
+        "module test;\n"
+        "  assign next = foo ? '0 :  // EOL\n"
+        "      bar ?  // EOL2\n"
+        "      '1 : '0;\n"
+        "endmodule\n",
+    },
+    {
+        "module test;\n"
+        " assign next = foo ? '0 : // EOL\n"
+        "  bar ? '1 // EOL2\n"
+        "  : '0;\n"
+        "endmodule\n",
+        "module test;\n"
+        "  assign next = foo ? '0 :  // EOL\n"
+        "      bar ? '1  // EOL2\n"
+        "      : '0;\n"
+        "endmodule\n",
+    },
+    {
+        "module test;\n"
+        " assign next = foo ? '0 : // EOL\n"
+        "  bar ? '1 : // EOL2\n"
+        "  '0;\n"
+        "endmodule\n",
+        "module test;\n"
+        "  assign next = foo ? '0 :  // EOL\n"
+        "      bar ? '1 :  // EOL2\n"
+        "      '0;\n"
+        "endmodule\n",
+    },
+    {
+        "assign prefetch_d     =\n"
+        "lookup_ic0 ? // EOL\n"
+        " (lookup_addr + 1) :// BOO\n"
+        "                   addr_i;",
+        "assign prefetch_d = lookup_ic0 ?  // EOL\n"
+        "    (lookup_addr + 1) :  // BOO\n"
+        "    addr_i;\n",
+    },
+    {
+        "module test;\n"
+        " assign next = (foo) ? '0          : // clear \n"
+        "           (bar) ? cnt + 1'b1  : // count \n"
+        "                   cnt;\n"
+        "endmodule\n",
+        "module test;\n"
+        "  assign next = (foo) ? '0 :  // clear \n"
+        "      (bar) ? cnt + 1'b1 :  // count \n"
+        "      cnt;\n"
+        "endmodule\n",
+    },
+    {
+        "module test;\n"
+        " assign next = // FOO\n"
+        "  (foo) ? '0          : // clear \n"
+        "           (bar) ? cnt + 1'b1  : // count \n"
+        "                   cnt;\n"
+        "endmodule\n",
+        "module test;\n"
+        "  assign next =  // FOO\n"
+        "      (foo) ? '0 :  // clear \n"
+        "      (bar) ? cnt + 1'b1 :  // count \n"
+        "      cnt;\n"
+        "endmodule\n",
+    },
+    {
+        "module test;\n"
+        " assign next = foo ? a_really_long_identifier : // EOL\n"
+        "  cnt;\n"
+        "endmodule\n",
+        "module test;\n"
+        "  assign next = foo ?\n"
+        "      a_really_long_identifier :  // EOL\n"
+        "      cnt;\n"
+        "endmodule\n",
+    },
+    {
+        "module test;\n"
+        " assign next = foo ? a_really_long_identifier : // EOL\n"
+        "  another_really_long_identifier;\n"
+        "endmodule\n",
+        "module test;\n"
+        "  assign next = foo ?\n"
+        "      a_really_long_identifier :  // EOL\n"
+        "      another_really_long_identifier;\n"
+        "endmodule\n",
+    },
+    {
+        "module test;\n"
+        " assign next = foo ? a_really_long_identifier : "
+        "another_really_long_identifier;\n"
+        "endmodule\n",
+        "module test;\n"
+        "  assign next = foo ?\n"
+        "      a_really_long_identifier :\n"
+        "      another_really_long_identifier;\n"
+        "endmodule\n",
+    },
+    {
+        "assign m = check                ? {10'b0, foo} :\n"
+        "           (bar && (baz == '0)) ? hello        :\n"
+        "           world                ? temp1        : temp2;\n",
+        "assign m = check ? {10'b0, foo} :\n"
+        "    (bar && (baz == '0)) ? hello :\n"
+        "    world ? temp1 : temp2;\n",
+    },
+    {
+        "assign {a, b} = !(c == d) ? {1'b0, e} :\n"
+        "                ((e == f) && g) ?\n"
+        "                {1'b0, f} : (h) ?\n"
+        "                {1'b0, e} - 1'b1 :\n"
+        "                {1'b0, e} + 1'b1;\n",
+        "assign {a, b} = !(c == d) ? {1'b0, e} :\n"
+        "    ((e == f) && g) ? {1'b0, f} : (h) ?\n"
+        "    {1'b0, e} - 1'b1 : {1'b0, e} + 1'b1;\n",
+    },
+    {
+        "assign {aaaaaaaaaa, bbbbbbbbb} = {1'b0, cccccccccccccccccc[15:0]} +\n"
+        "                                 {1'b0, ddddddddddddddddd[15:0]};\n",
+        "assign {aaaaaaaaaa, bbbbbbbbb} =\n"
+        "    {1'b0, cccccccccccccccccc[15:0]} +\n"
+        "    {1'b0, ddddddddddddddddd[15:0]};\n",
+    },
+    {
+        "covergroup a(string b);\n"
+        "foobar: cross foo, bar {"
+        "ignore_bins baz = binsof(qux) intersect {1, 2, 3, 4, 5, 6, 7};"
+        "}\n"
+        "endgroup : a\n",
+        "covergroup a(string b);\n"
+        "  foobar: cross foo, bar{\n"
+        "    ignore_bins baz =\n"
+        "        binsof (qux) intersect {\n"
+        "      1, 2, 3, 4, 5, 6, 7\n"
+        "    };\n"
+        "  }\n"
+        "endgroup : a\n",
+    },
+    {
+        "assign {aa, bb} = {1'b0, cc} + {1'b0, dd};\n",
+        "assign {aa, bb} = {1'b0, cc} +\n"
+        "    {1'b0, dd};\n",
+    },
+
+    // streaming operators
+    {
+        "   parameter  int  b={ >>   { a } } ;",
+        "parameter int b = {>>{a}};\n",
+    },
+    {
+        "   parameter  int  b={ >>   { a , b,  c } } ;",
+        "parameter int b = {>>{a, b, c}};\n",
+    },
+    {
+        "   parameter  int  b={ >> 4  { a } } ;",
+        "parameter int b = {>>4{a}};\n",
+    },
+    {
+        "   parameter  int  b={ >> byte  { a } } ;",
+        "parameter int b = {>>byte{a}};\n",
+    },
+    {
+        "   parameter  int  b={ >> my_type_t  { a } } ;",
+        "parameter int b = {>>my_type_t{a}};\n",
+    },
+    {
+        "   parameter  int  b={ >> `GET_TYPE  { a } } ;",
+        "parameter int b = {>>`GET_TYPE{a}};\n",
+    },
+    {
+        "   parameter  int  b={ >> 4  {{ >> 2 { a }  }} } ;",
+        "parameter int b = {>>4{{>>2{a}}}};\n",
+    },
+    {
+        "   parameter  int  b={ <<   { a } } ;",
+        "parameter int b = {<<{a}};\n",
+    },
+    {
+        "   parameter  int  b={ <<   { a , b,  c } } ;",
+        "parameter int b = {<<{a, b, c}};\n",
+    },
+    {
+        "   parameter  int  b={ << 4  { a } } ;",
+        "parameter int b = {<<4{a}};\n",
+    },
+    {
+        "   parameter  int  b={ << byte  { a } } ;",
+        "parameter int b = {<<byte{a}};\n",
+    },
+    {
+        "   parameter  int  b={ << my_type_t  { a } } ;",
+        "parameter int b = {<<my_type_t{a}};\n",
+    },
+    {
+        "   parameter  int  b={ << `GET_TYPE  { a } } ;",
+        "parameter int b = {<<`GET_TYPE{a}};\n",
+    },
+    {
+        "   parameter  int  b={ << 4  {{ << 2 { a }  }} } ;",
+        "parameter int b = {<<4{{<<2{a}}}};\n",
+    },
+
+    // basic module test cases
+    {"module foo;endmodule:foo\n",
+     "module foo;\n"
+     "endmodule : foo\n"},
+    {"module\nfoo\n;\nendmodule\n:\nfoo\n",
+     "module foo;\n"
+     "endmodule : foo\n"},
+    {"module\tfoo\t;\tendmodule\t:\tfoo",
+     "module foo;\n"
+     "endmodule : foo\n"},
+    {"module foo;     // foo\n"
+     "endmodule:foo\n",
+     "module foo;  // foo\n"
+     "endmodule : foo\n"},
+    {"module foo;/* foo */endmodule:foo\n",
+     "module foo;  /* foo */\n"
+     "endmodule : foo\n"},
+    {"module pm #(\n"
+     "//comment\n"
+     ") (wire ww);\n"
+     "endmodule\n",
+     "module pm #(\n"
+     "    //comment\n"  // comment indented
+     ") (\n"
+     "    wire ww\n"
+     ");\n"
+     "endmodule\n"},
+    {"module pm ( ) ;\n"  // empty ports list
+     "endmodule\n",
+     "module pm ();\n"
+     "endmodule\n"},
+    {"module pm #(\n"
+     "//comment\n"
+     ") ( );\n"
+     "endmodule\n",
+     "module pm #(\n"
+     "    //comment\n"  // comment indented
+     ") ();\n"          // (); grouped together
+     "endmodule\n"},
+    {"`ifdef FOO\n"
+     "    `ifndef BAR\n"
+     "    `endif\n"
+     "`endif\n",
+     "`ifdef FOO\n"
+     "`ifndef BAR\n"
+     "`endif\n"
+     "`endif\n"},
+    {"module foo(\n"
+     "       `include \"ports.svh\"\n"
+     "         ) ; endmodule\n",
+     "module foo (\n"
+     "    `include \"ports.svh\"\n"
+     ");\n"
+     "endmodule\n"},
+    {"module foo(\n"
+     "       `define FOO\n"
+     "`undef\tFOO\n"
+     "         ) ; endmodule\n",
+     "module foo (\n"
+     "    `define FOO\n"
+     "    `undef FOO\n"
+     ");\n"
+     "endmodule\n"},
+    {"module foo(  input x  , output y ) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input  x,\n"  // aligned
+     "    output y\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(\n"
+     "// comment\n"
+     "  input x  , output y ) ;endmodule:foo\n",
+     "module foo (\n"
+     "    // comment\n"
+     "    input  x,\n"  // aligned
+     "    output y\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input[2:0]x  , output y [3:0] ) ;endmodule:foo\n",
+     // each port item should be on its own line
+     "module foo (\n"
+     "    input  [2:0] x,\n"  // aligned
+     "    output       y[3:0]\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input wire x  , output reg yy ) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input  wire x,\n"  // aligned
+     "    output reg  yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input wire x  ,//c1\n"
+     "output reg yyy //c2\n"
+     " ) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input  wire x,   //c1\n"  // aligned
+     "    output reg  yyy  //c2\n"  // aligned
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input wire x  ,/* c1 */\n"
+     "output reg yyy /* c2 */\n"
+     " ) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input  wire x,   /* c1 */\n"  // aligned
+     "    output reg  yyy  /* c2 */\n"  // aligned
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(\n"
+     "// comment\n"
+     "input wire x  ,//c1\n"
+     "output reg yyy //c2\n"
+     " ) ;endmodule:foo\n",
+     "module foo (\n"
+     "    // comment\n"
+     "    input  wire x,   //c1\n"  // aligned
+     "    output reg  yyy  //c2\n"  // aligned
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(\n"
+     "/* comment */\n"
+     "input wire x  ,/* c1 */\n"
+     "output reg yyy /* c2 */\n"
+     " ) ;endmodule:foo\n",
+     "module foo (\n"
+     "    /* comment */\n"
+     "    input  wire x,   /* c1 */\n"  // aligned
+     "    output reg  yyy  /* c2 */\n"  // aligned
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input wire x  ,/* c1\n"
+     "c2\n"
+     "c3 */\n"
+     "output reg yyy /* c4 */\n"
+     " ) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input  wire x,   /* c1\n"
+     "c2\n"
+     "c3 */\n"  // TODO: align multiline comments
+     "    output reg  yyy  /* c4 */\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input wire x  ,/* c1 */\n"
+     "output reg yyy,\n"
+     "output z // c2\n"
+     " ) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input  wire x,    /* c1 */\n"  // aligned
+     "    output reg  yyy,\n"
+     "    output      z     // c2\n"  // aligned
+     ");\n"
+     "endmodule : foo\n"},
+    {"module m(input logic [4:0] foo,  // comment\n"
+     "input logic bar // comment\n"
+     " ) ;endmodule:m\n",
+     "module m (\n"
+     "    input logic [4:0] foo,  // comment\n"  // aligned
+     "    input logic       bar   // comment\n"  // aligned
+     ");\n"
+     "endmodule : m\n"},
+    {"module foo(  input wire x  , output yy ) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input  wire x,\n"  // aligned
+     "    output      yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input   x  , output reg yy ) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input      x,\n"  // aligned
+     "    output reg yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input   x  , output reg[a:b]yy ) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input            x,\n"  // aligned
+     "    output reg [a:b] yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input   [a:b]x  , output reg  yy ) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input      [a:b] x,\n"  // aligned
+     "    output reg       yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input   x  , "
+     "  output logic  yy ) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input        x,\n"  // aligned
+     "    output logic yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input   [a:c]x  , "
+     "  output logic[a-b: c]  yy ) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input        [  a:c] x,\n"  // aligned
+     "    output logic [a-b:c] yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input   [a:c]x  , "
+     "  output logic[a - b: c]  yy ) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input        [    a:c] x,\n"  // aligned
+     "    output logic [a - b:c] yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input   [a:c]x  , input zzz ,"
+     "  output logic[a - b: c]  yy ) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input        [    a:c] x,\n"    // aligned []'s
+     "    input                  zzz,\n"  // aligned ids
+     "    output logic [a - b:c] yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input   [a:b]x  , "
+     "  output reg[e: f]  yy ) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input      [a:b] x,\n"  // aligned
+     "    output reg [e:f] yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input   tri[aa: bb]x  , "
+     "  output reg[e: f]  yy ) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input  tri [aa:bb] x,\n"  // aligned
+     "    output reg [  e:f] yy\n"  // TODO(b/70310743): align ':'
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input   [a:b][c:d]x  , "
+     "  output reg[e: f]  yy ) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input      [a:b][c:d] x,\n"  // aligned
+     "    output reg [e:f]      yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input wire x  [j:k], output reg yy ) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input  wire x [j:k],\n"  // aligned
+     "    output reg  yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input wire x  , output reg yy [j:k]) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input  wire x,\n"  // aligned
+     "    output reg  yy[j:k]\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input wire x  [p:q], output reg yy [j:k]) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input  wire x [p:q],\n"  // aligned
+     "    output reg  yy[j:k]\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input wire x  [p:q][r:s], output reg yy [j:k]) "
+     ";endmodule:foo\n",
+     "module foo (\n"
+     "    input  wire x [p:q][r:s],\n"  // aligned
+     "    output reg  yy[j:k]\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input wire x  [p:q][rr:ss], output reg yy [jj:kk][m:n]) "
+     ";endmodule:foo\n",
+     "module foo (\n"
+     // TODO(b/70310743): align :'s
+     "    input  wire x [  p:q][rr:ss],\n"
+     "    output reg  yy[jj:kk][  m:n]\n"  // aligned
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input wire   [p:q]x, output reg yy [j:k]) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input  wire [p:q] x,\n"  // aligned
+     "    output reg        yy[j:k]\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input wire  x [p:q], output reg[j:k]yy) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input  wire       x [p:q],\n"  // aligned
+     "    output reg  [j:k] yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input pkg::bar_t  x , output reg  yy) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input  pkg::bar_t x,\n"  // aligned
+     "    output reg        yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input wire  x , output pkg::bar_t  yy) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input  wire       x,\n"  // aligned
+     "    output pkg::bar_t yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input pkg::bar_t#(1)  x , output reg  yy) ;endmodule:foo\n",
+     "module foo (\n"  // with parameterized port type
+     "    input  pkg::bar_t#(1) x,\n"
+     "    output reg            yy\n"  // aligned
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input signed x , output reg  yy) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input  signed x,\n"  // aligned
+     "    output reg    yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input signed x , output reg [m:n] yy) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input  signed       x,\n"  // aligned
+     "    output reg    [m:n] yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input int signed x , output reg [m:n] yy) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input  int signed       x,\n"  // aligned
+     "    output reg        [m:n] yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(  input signed x , output pkg::bar_t  yy) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input  signed     x,\n"  // aligned
+     "    output pkg::bar_t yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module somefunction ("
+     "logic clk, int   a, int b);endmodule",
+     "module somefunction (\n"
+     "    logic clk,\n"  // direction missing
+     "    int   a,\n"    // direction missing
+     "    int   b\n"     // direction missing
+     ");\n"
+     "endmodule\n"},
+    {"module somefunction ("
+     "logic clk, input int   a, int b);endmodule",
+     "module somefunction (\n"
+     "          logic clk,\n"  // direction missing
+     "    input int   a,\n"
+     "          int   b\n"  // direction missing
+     ");\n"
+     "endmodule\n"},
+    {"module somefunction ("
+     "input logic clk, input int   a, int b);endmodule",
+     "module somefunction (\n"
+     "    input logic clk,\n"
+     "    input int   a,\n"
+     "          int   b\n"  // direction missing
+     ");\n"
+     "endmodule\n"},
+    {"module somefunction ("
+     "input clk, input int   a, int b);endmodule",
+     "module somefunction (\n"
+     "    input     clk,\n"  // type missing
+     "    input int a,\n"
+     "          int b\n"
+     ");\n"
+     "endmodule\n"},
+    {"module somefunction ("
+     "input logic clk, input a, int b);endmodule",
+     "module somefunction (\n"
+     "    input logic clk,\n"
+     "    input       a,\n"  // type missing
+     "          int   b\n"   // direction missing
+     ");\n"
+     "endmodule\n"},
+    {"module t;\n"
+     "    input bit i_bit;\n"
+     "input   byte  i_byte ;\n"
+     "input chandle i_chandle;\n"
+     "input event i_event;\n"
+     "input int i_int;\n"
+     "input integer i_inte;\n"
+     "input longint i_longint;\n"
+     "input real i_real;\n"
+     "input realtime i_realtime;\n"
+     "input shortint i_shortint;\n"
+     "input shortreal i_shortreal;\n"
+     "input string i_string;\n"
+     "input time i_time;\n"
+     "     output bit o_bit;\n"
+     "output    byte   o_byte  ;  \n"
+     "output chandle o_chandle;\n"
+     "output event o_event;\n"
+     "output int o_int;\n"
+     "output integer o_inte;\n"
+     "output longint o_longint;\n"
+     "output real o_real;\n"
+     "output realtime o_realtime;\n"
+     "output shortint o_shortint;\n"
+     "output shortreal o_shortreal;\n"
+     "output string o_string;\n"
+     "output time o_time;\n"
+     "endmodule\n",
+     "module t;\n"
+     "  input bit i_bit;\n"
+     "  input byte i_byte;\n"
+     "  input chandle i_chandle;\n"
+     "  input event i_event;\n"
+     "  input int i_int;\n"
+     "  input integer i_inte;\n"
+     "  input longint i_longint;\n"
+     "  input real i_real;\n"
+     "  input realtime i_realtime;\n"
+     "  input shortint i_shortint;\n"
+     "  input shortreal i_shortreal;\n"
+     "  input string i_string;\n"
+     "  input time i_time;\n"
+     "  output bit o_bit;\n"
+     "  output byte o_byte;\n"
+     "  output chandle o_chandle;\n"
+     "  output event o_event;\n"
+     "  output int o_int;\n"
+     "  output integer o_inte;\n"
+     "  output longint o_longint;\n"
+     "  output real o_real;\n"
+     "  output realtime o_realtime;\n"
+     "  output shortint o_shortint;\n"
+     "  output shortreal o_shortreal;\n"
+     "  output string o_string;\n"
+     "  output time o_time;\n"
+     "endmodule\n"},
+    {"module t (\n"
+     "    input bit i_bit,\n"
+     "input     byte   i_byte  ,\n"
+     "input chandle i_chandle,\n"
+     "input event i_event,\n"
+     "input int i_int,\n"
+     "input integer i_inte,\n"
+     "input longint i_longint,\n"
+     "input real i_real,\n"
+     "input realtime i_realtime,\n"
+     "input shortint i_shortint,\n"
+     "input shortreal i_shortreal,\n"
+     "input string i_string,\n"
+     "input time i_time,\n"
+     "    output bit o_bit,\n"
+     "output     byte   o_byte  ,  \n"
+     "output chandle o_chandle,\n"
+     "output event o_event,\n"
+     "output int o_int,\n"
+     "output integer o_inte,\n"
+     "output longint o_longint,\n"
+     "output real o_real,\n"
+     "output realtime o_realtime,\n"
+     "output shortint o_shortint,\n"
+     "output shortreal o_shortreal,\n"
+     "output string o_string,\n"
+     "output time o_time);\n"
+     "endmodule\n",
+     "module t (\n"
+     "    input  bit       i_bit,\n"
+     "    input  byte      i_byte,\n"
+     "    input  chandle   i_chandle,\n"
+     "    input  event     i_event,\n"
+     "    input  int       i_int,\n"
+     "    input  integer   i_inte,\n"
+     "    input  longint   i_longint,\n"
+     "    input  real      i_real,\n"
+     "    input  realtime  i_realtime,\n"
+     "    input  shortint  i_shortint,\n"
+     "    input  shortreal i_shortreal,\n"
+     "    input  string    i_string,\n"
+     "    input  time      i_time,\n"
+     "    output bit       o_bit,\n"
+     "    output byte      o_byte,\n"
+     "    output chandle   o_chandle,\n"
+     "    output event     o_event,\n"
+     "    output int       o_int,\n"
+     "    output integer   o_inte,\n"
+     "    output longint   o_longint,\n"
+     "    output real      o_real,\n"
+     "    output realtime  o_realtime,\n"
+     "    output shortint  o_shortint,\n"
+     "    output shortreal o_shortreal,\n"
+     "    output string    o_string,\n"
+     "    output time      o_time\n"
+     ");\n"
+     "endmodule\n"},
+    {"module m;foo bar(.baz({larry, moe, curly}));endmodule",
+     "module m;\n"
+     "  foo bar (.baz({larry, moe, curly}));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.baz({larry,// expand this\n"
+     "moe, curly}));endmodule",
+     "module m;\n"
+     "  foo bar (\n"
+     "      .baz({\n"
+     "        larry,  // expand this\n"
+     "        moe,\n"
+     "        curly\n"
+     "      })\n"
+     "  );\n"
+     "endmodule\n"},
+    {"parameter priv_reg_t impl_csr[] = {\n"
+     "// Machine mode mode CSR\n"
+     "MVENDORID, //\n"
+     "MARCHID,   //\n"
+     "DSCRATCH0, //\n"
+     "DSCRATCH1  //\n"
+     "};",
+     "parameter priv_reg_t impl_csr[] = {\n"
+     "  // Machine mode mode CSR\n"
+     "  MVENDORID,  //\n"
+     "  MARCHID,  //\n"
+     "  DSCRATCH0,  //\n"
+     "  DSCRATCH1  //\n"
+     "};\n"},
+    {"parameter priv_reg_t impl_csr[] = {\n"
+     "// Expand elements\n"
+     "MVENDORID,\n"
+     "MARCHID,\n"
+     "DSCRATCH0,\n"
+     "DSCRATCH1\n"
+     "};",
+     "parameter priv_reg_t impl_csr[] = {\n"
+     "  // Expand elements\n"
+     "  MVENDORID,\n"
+     "  MARCHID,\n"
+     "  DSCRATCH0,\n"
+     "  DSCRATCH1\n"
+     "};\n"},
+    /* TODO(b/158131099): to fix these, reinterpret 'b' as a kPortDeclaration
+    {"module somefunction ("
+     "input logic clk, input a, b);endmodule",
+     "module somefunction (\n"
+     "    input logic clk,\n"
+     "    input       a,\n"  // type missing
+     "                b\n"  // type and direction missing
+     ");\n"
+     "endmodule\n"},
+    {"module somefunction ("
+     "input logic clk, int a, b);endmodule",
+     "module somefunction (\n"
+     "    input logic clk,\n"
+     "          int   a,\n"  // direction missing
+     "                b\n"  // type and direction missing
+     ");\n"
+     "endmodule\n"},
+     */
+    {"module foo(\n"
+     "//c1\n"
+     "input wire x , \n"
+     "//c2\n"
+     "output reg  yy\n"
+     "//c3\n"
+     ") ;endmodule:foo\n",
+     "module foo (\n"
+     "    //c1\n"
+     "    input  wire x,\n"  // aligned, ignoring comments
+     "    //c2\n"
+     "    output reg  yy\n"
+     "    //c3\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(\n"
+     "//c1\n"
+     "input wire x , \n"
+     "//c2a\n"  // longer comment
+     "//c2b\n"
+     "output reg  yy\n"
+     "//c3\n"
+     ") ;endmodule:foo\n",
+     "module foo (\n"
+     "    //c1\n"
+     "    input  wire x,\n"  // aligned, ignoring comments
+     "    //c2a\n"           // note: separated by 2 lines of comments
+     "    //c2b\n"
+     "    output reg  yy\n"
+     "    //c3\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(\n"
+     "`ifdef   FOO\n"
+     "input wire x , \n"
+     " `else\n"
+     "output reg  yy\n"
+     " `endif\n"
+     ") ;endmodule:foo\n",
+     "module foo (\n"
+     "`ifdef FOO\n"
+     "    input  wire x,\n"  // aligned, ignoring preprocessor conditionals
+     "`else\n"
+     "    output reg  yy\n"
+     "`endif\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(\n"
+     "input w , \n"
+     "`define   FOO BAR\n"
+     "input wire x , \n"
+     " `include  \"stuff.svh\"\n"
+     "output reg  yy\n"
+     " `undef    FOO\n"
+     "output zz\n"
+     ") ;endmodule:foo\n",
+     "module foo (\n"
+     "    input       w,\n"  // aligned, ignoring preprocessor directives
+     "    `define FOO BAR\n"
+     "    input  wire x,\n"
+     "    `include \"stuff.svh\"\n"
+     "    output reg  yy\n"
+     "    `undef FOO\n"
+     "    output      zz\n"  // aligned, ignoring preprocessor directives
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(\n"
+     "input wire x , \n  \n"  // blank line, separating alignment groups
+     "output reg  yy\n"
+     ") ;endmodule:foo\n",
+     "module foo (\n"
+     "    input wire x,\n"  // not aligned, due to blank line separating groups
+     "\n"
+     "    output reg yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(\n"
+     "input wire x1 [r:s],\n"
+     "input [p:q] x2 , \n  \n"  // blank line, separating alignment groups
+     "output reg  [jj:kk]yy1,\n"
+     "output pkg::barr_t [mm:nn] yy2\n"
+     ") ;endmodule:foo\n",
+     "module foo (\n"
+     "    input wire       x1[r:s],\n"  // aligned in this group, but not across
+                                        // groups
+     "    input      [p:q] x2,\n"
+     "\n"
+     "    output reg         [jj:kk] yy1,\n"
+     "    output pkg::barr_t [mm:nn] yy2\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo(\n"  // same as previous, with comments
+     " //c1\n"
+     "input wire x1 [r:s],\n"
+     "input [p:q] x2 , \n"
+     " //c2\n\n"  // blank line, separating alignment groups
+     " //c3\n"
+     "output reg  [jj:kk]yy1,\n"
+     " //c4\n"
+     "output pkg::barr_t [mm:nn] yy2\n"
+     ") ;endmodule:foo\n",
+     "module foo (\n"
+     "    //c1\n"
+     "    input wire       x1[r:s],\n"  // aligned in this group, but not across
+                                        // groups
+     "    input      [p:q] x2,\n"
+     "    //c2\n"
+     "\n"
+     "    //c3\n"
+     "    output reg         [jj:kk] yy1,\n"
+     "    //c4\n"
+     "    output pkg::barr_t [mm:nn] yy2\n"
+     ");\n"
+     "endmodule : foo\n"},
+
+    {// align null-statement (issue #824)
+     "class sample;"
+     "bit a;;"
+     "bit b;"
+     "endclass",
+     "class sample;\n"
+     "  bit a;\n"
+     "  ;\n"
+     "  bit b;\n"
+     "endclass\n"},
+    {"class sample;"
+     "bit a;;"
+     "endclass",
+     "class sample;\n"
+     "  bit a;\n"
+     "  ;\n"
+     "endclass\n"},
+    {"class sample;"
+     "bit a;"
+     "bit b;;"
+     "endclass",
+     "class sample;\n"
+     "  bit a;\n"
+     "  bit b;\n"
+     "  ;\n"
+     "endclass\n"},
+
+    {// aligning here just barely fits in the 40col limit
+     "module foo(  input int signed x [a:b],"
+     "output reg [mm:nn] yy) ;endmodule:foo\n",
+     "module foo (\n"
+     // ---------------40col----------------->
+     "    input  int signed         x [a:b],\n"  // aligned, still fits
+     "    output reg        [mm:nn] yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {// when aligning would result in exceeding column limit, don't align for
+     // now
+     "module foo(  input int signed x [aa:bb],"
+     "output reg [mm:nn] yy) ;endmodule:foo\n",
+     "module foo (\n"
+     // ---------------40col----------------->
+     //   input  int signed         x [aa:bb],\n"
+     //   output reg        [mm:nn] yy\n"
+     "    input  int signed         x [aa:bb],\n"  // aligned, still fits
+     "    output reg        [mm:nn] yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {// when aligning would result in exceeding column limit, don't align for
+     // now
+     "module foo(  input int signed x [aa:bb],"
+     "output reg [mm:nn] yyy) ;endmodule:foo\n",
+     "module foo (\n"
+     // ---------------40col----------------->
+     //   input  int signed         x  [aa:bb],\n"  // over limit, by comma
+     //   output reg        [mm:nn] yyy\n"
+     "    input int signed x[aa:bb],\n"  // aligned would be 41 columns
+     "    output reg [mm:nn] yyy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {// when aligning would result in exceeding column limit, don't align for
+     // now
+     "module foo(  input int signed x [a:b],//c\n"
+     "output reg [m:n] yy) ;endmodule:foo\n",
+     "module foo (\n"
+     // ---------------40col---------------->
+     //   input  int signed       x [a:b],  //c\n"  // over limit, by comment
+     //   output reg        [m:n] yy\n"
+     "    input int signed x[a:b],  //c\n"  // aligned would be 42 columns
+     "    output reg [m:n] yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {// aligning interfaces in port headers like types
+     // TODO(b/161181877): flush interface port type left (multi-column)
+     "module foo(  input clk , inter.face yy) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input            clk,\n"  // aligned
+     "          inter.face yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {// aligning interfaces in port headers like types
+     // TODO(b/161181877): flush interface port type left (multi-column)
+     "module foo(  input wire   clk , inter.face yy) ;endmodule:foo\n",
+     "module foo (\n"
+     "    input wire       clk,\n"  // aligned
+     "          inter.face yy\n"
+     ");\n"
+     "endmodule : foo\n"},
+
+    // module local variable/net declaration alignment test cases
+    {"module m;\n"
+     "logic a;\n"
+     "bit b;\n"
+     "endmodule\n",
+     "module m;\n"
+     "  logic a;\n"
+     "  bit   b;\n"
+     "endmodule\n"},
+    {"module m;\n"
+     "logic a;\n"
+     "bit b;\n"
+     "initial e=f;\n"  // separates alignment groups
+     "wire c;\n"
+     "bit d;\n"
+     "endmodule\n",
+     "module m;\n"
+     "  logic a;\n"
+     "  bit   b;\n"
+     "  initial e = f;\n"  // separates alignment groups
+     "  wire c;\n"
+     "  bit  d;\n"
+     "endmodule\n"},
+    {"module m;\n"
+     "// hello a\n"
+     "logic a;\n"
+     "// hello b\n"
+     "bit b;\n"
+     "endmodule\n",
+     "module m;\n"
+     "  // hello a\n"
+     "  logic a;\n"
+     "  // hello b\n"
+     "  bit   b;\n"  // aligned across comments
+     "endmodule\n"},
+    {"module m;\n"
+     "// hello a\n"
+     "logic a;\n"
+     "\n"  // extra blank line
+     "// hello b\n"
+     "bit b;\n"
+     "endmodule\n",
+     "module m;\n"
+     "  // hello a\n"
+     "  logic a;\n"
+     "\n"              // extra blank line
+     "  // hello b\n"  // aligned across blank lines
+     "  bit   b;\n"    // aligned across comments
+     "endmodule\n"},
+    {"module m;\n"
+     "logic [x:y]a;\n"  // packed dimensions
+     "bit b;\n"
+     "endmodule\n",
+     "module m;\n"
+     "  logic [x:y] a;\n"
+     "  bit         b;\n"
+     "endmodule\n"},
+    {"module m;\n"
+     "logic a;\n"
+     "bit [pp:qq]b;\n"  // packed dimensions
+     "endmodule\n",
+     "module m;\n"
+     "  logic         a;\n"
+     "  bit   [pp:qq] b;\n"
+     "endmodule\n"},
+    {"module m;\n"
+     "logic [x:y]a;\n"  // packed dimensions
+     "bit [pp:qq]b;\n"  // packed dimensions
+     "endmodule\n",
+     "module m;\n"
+     "  logic [  x:y] a;\n"
+     "  bit   [pp:qq] b;\n"
+     "endmodule\n"},
+    {"module m;\n"
+     "logic [x:y]a;\n"         // packed dimensions
+     "wire [pp:qq] [e:f]b;\n"  // packed dimensions, 2D
+     "endmodule\n",
+     "module m;\n"
+     "  logic [  x:y]      a;\n"
+     "  wire  [pp:qq][e:f] b;\n"
+     "endmodule\n"},
+    {"module m;\n"
+     "logic a [x:y];\n"  // unpacked dimensions
+     "bit bbb;\n"
+     "endmodule\n",
+     "module m;\n"
+     "  logic a   [x:y];\n"
+     "  bit   bbb;\n"
+     "endmodule\n"},
+    {"module m;\n"
+     "logic aaa ;\n"
+     "wire w [yy:zz];\n"  // unpacked dimensions
+     "endmodule\n",
+     "module m;\n"
+     "  logic aaa;\n"
+     "  wire  w   [yy:zz];\n"
+     "endmodule\n"},
+    {"module m;\n"
+     "logic aaa [s:t] ;\n"  // unpacked dimensions
+     "wire w [yy:zz];\n"    // unpacked dimensions
+     "endmodule\n",
+     "module m;\n"
+     "  logic aaa[  s:t];\n"
+     "  wire  w  [yy:zz];\n"
+     "endmodule\n"},
+    {"module m;\n"
+     "logic aaa [s:t] ;\n"     // unpacked dimensions
+     "wire w [yy:zz][u:v];\n"  // unpacked dimensions, 2D
+     "endmodule\n",
+     "module m;\n"
+     "  logic aaa[  s:t];\n"
+     "  wire  w  [yy:zz] [u:v];\n"
+     // TODO(b/165323560): unwanted space between unpacked dimensions of 'w'
+     "endmodule\n"},
+    {"module m;\n"
+     "qqq::rrr s;\n"     // user-defined type
+     "wire [pp:qq]w;\n"  // packed dimensions
+     "endmodule\n",
+     "module m;\n"
+     "  qqq::rrr         s;\n"
+     "  wire     [pp:qq] w;\n"
+     "endmodule\n"},
+    {"module m;\n"
+     "qqq#(rr) s;\n"     // parameterized type
+     "wire [pp:qq]w;\n"  // packed dimensions
+     "endmodule\n",
+     "module m;\n"
+     "  qqq #(rr)         s;\n"
+     "  wire      [pp:qq] w;\n"
+     "endmodule\n"},
+    {"module m;\n"
+     "logic a;\n"
+     "bit b;\n"
+     "my_module  my_inst( );\n"  // module instance separates alignment groups
+     "wire c;\n"
+     "bit d;\n"
+     "endmodule\n",
+     "module m;\n"
+     "  logic a;\n"  // these two are aligned
+     "  bit   b;\n"
+     "  my_module my_inst ();\n"  // module instance separates alignment groups
+     "  wire c;\n"                // these two are aligned
+     "  bit  d;\n"
+     "endmodule\n"},
+    {"module m;\n"
+     "logic aaa = expr1;\n"
+     "bit b = expr2;\n"
+     "endmodule\n",
+     "module m;\n"
+     "  logic aaa = expr1;\n"
+     "  bit   b = expr2;\n"  // no alignment at '=' yet
+     "endmodule\n"},
+    {"(* foo='{\"bar_.*\"} *)\n"  // funny attribute
+     "module mattr;\n"
+     "(* attr1=\"value1\" *)\n"  // attribute ignored
+     "ex_input_pins_t ex_input_pins;\n"
+     "(* attr2=\"value2\" *)\n"  // attribute ignored
+     "ex_output_pins_t ex_output_pins;\n"
+     "(* attr3=\"value3\" *)\n"  // attribute ignored
+     "ex wrap_ex ( );\n"
+     "endmodule\n",
+     "(* foo='{\"bar_.*\"} *)\n"
+     "module mattr;\n"
+     "  (* attr1=\"value1\" *)\n"           // indented
+     "  ex_input_pins_t  ex_input_pins;\n"  // aligned
+     "  (* attr2=\"value2\" *)\n"           // indented
+     "  ex_output_pins_t ex_output_pins;\n"
+     "  (* attr3=\"value3\" *)\n"  // indented
+     "  ex wrap_ex ();\n"
+     "endmodule\n"},
+    {"module mattr;\n"
+     "ex_input_pins_t ex_input_pins;\n"
+     "ex_output_pins_t ex_output_pins;\n"
+     "(* package_definition=\"ex_pkg\" *)\n"  // attribute ignored
+     "ex wrap_ex (\n"
+     ".clk(ex_input_pins.clk),\n"
+     ".rst(ex_input_pins.rst),\n"
+     ".in(ex_input_pins.in)\n"
+     ");\n"
+     "endmodule\n",
+     "module mattr;\n"
+     "  ex_input_pins_t  ex_input_pins;\n"  // aligned
+     "  ex_output_pins_t ex_output_pins;\n"
+     "  (* package_definition=\"ex_pkg\" *)\n"  // indented
+     "  ex wrap_ex (\n"
+     "      .clk(ex_input_pins.clk),\n"
+     "      .rst(ex_input_pins.rst),\n"
+     "      .in (ex_input_pins.in)\n"  // aligned
+     "  );\n"
+     "endmodule\n"},
+    {"module test;\n"
+     "bind entropy_src tlul_assert #(.EndpointType(\"Device\"))\n"
+     "tlul_assert_device (.clk_i, .rst_ni, .h2d(tl_i), .d2h(tl_o));\n"
+     "endmodule\n",
+     "module test;\n"
+     "  bind entropy_src tlul_assert #(\n"
+     "      .EndpointType(\"Device\")\n"
+     "  ) tlul_assert_device (\n"
+     "      .clk_i,\n"
+     "      .rst_ni,\n"
+     "      .h2d(tl_i),\n"
+     "      .d2h(tl_o)\n"
+     "  );\n"
+     "endmodule\n"},
+    {"module test;\n"
+     "bind entropy_src tlul_assert #(.EndpointType(\"Device\"))\n"
+     "tlul_assert_device (.clk_i, .rst_ni,\n\n .h2d(tl_i),\n\n .d2h(tl_o));\n"
+     "endmodule\n",
+     "module test;\n"
+     "  bind entropy_src tlul_assert #(\n"
+     "      .EndpointType(\"Device\")\n"
+     "  ) tlul_assert_device (\n"
+     "      .clk_i,\n"
+     "      .rst_ni,\n"
+     "\n"
+     "      .h2d(tl_i),\n"
+     "\n"
+     "      .d2h(tl_o)\n"
+     "  );\n"
+     "endmodule\n"},
+    {"bind expand_me long_name #(.W(W_CONST), .D(D_CONST)) instaaance_name ("
+     ".in(iiiiiiiin),\n\n .out(ooooooout),\n .clk(ccccccclk),\n\n"
+     ".in1234 (in),\n //c1\n .out1234(out),\n .clk1234(clk),);",
+     "bind expand_me long_name #(\n"
+     "    .W(W_CONST),\n"
+     "    .D(D_CONST)\n"
+     ") instaaance_name (\n"
+     "    .in(iiiiiiiin),\n"
+     "\n"
+     "    .out(ooooooout),\n"
+     "    .clk(ccccccclk),\n"
+     "\n"
+     "    .in1234 (in),\n"
+     "    //c1\n"
+     "    .out1234(out),\n"
+     "    .clk1234(clk),\n"
+     ");\n"},
+    {"initial // clock generation\n begin\n clk = 0;\n forever begin\n"
+     "#4ns clk = !clk;\n end\n end\n",
+     "initial  // clock generation\n"
+     "  begin\n"
+     "    clk = 0;\n"
+     "    forever begin\n"
+     "      #4ns clk = !clk;\n"
+     "    end\n"
+     "  end\n"},
+    {"module foo #(int x,int y) ;endmodule:foo\n",  // parameters
+     "module foo #(\n"
+     "    int x,\n"
+     "    int y\n"
+     ");\n"  // each parameter on its own line
+     "endmodule : foo\n"},
+    {"module foo #(int x)(input y) ;endmodule:foo\n",
+     // parameter and port
+     "module foo #(\n"
+     "    int x\n"
+     ") (\n"
+     "    input y\n"
+     ");\n"  // each paramater and port item should be on its own line
+     "endmodule : foo\n"},
+    {"module foo #(parameter int x,parameter int y) ;endmodule:foo\n",
+     // parameters don't fit (also should be on its own line)
+     "module foo #(\n"
+     "    parameter int x,\n"
+     "    parameter int y\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo #(parameter int xxxx,parameter int yyyy) ;endmodule:foo\n",
+     // parameters don't fit
+     "module foo #(\n"
+     "    parameter int xxxx,\n"
+     "    parameter int yyyy\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo #(parameter int x = $clog2  (N) ,parameter int y ) "
+     ";endmodule:foo\n",
+     // parameters don't fit
+     "module foo #(\n"
+     "    parameter int x = $clog2(N),\n"  // no space after $clog2
+     "    parameter int y\n"
+     ");\n"
+     "endmodule : foo\n"},
+    {"module foo #(//comment\n"
+     "parameter bar =1,\n"
+     "localparam baz =2"
+     ") ();"
+     "endmodule",
+     "module foo #(  //comment\n"
+     "    parameter  bar = 1,\n"
+     "    localparam baz = 2\n"
+     ") ();\n"
+     "endmodule\n"},
+    {"module foo #("
+     "parameter  bar =1,//comment\n"
+     "localparam baz =2"
+     ") ();"
+     "endmodule",
+     "module foo #(\n"
+     "    parameter  bar = 1,  //comment\n"
+     "    localparam baz = 2\n"
+     ") ();\n"
+     "endmodule\n"},
+    {"module foo #("
+     "parameter  bar =1,"
+     "localparam baz =2//comment\n"
+     ") ();"
+     "endmodule",
+     "module foo #(\n"
+     "    parameter  bar = 1,\n"
+     "    localparam baz = 2   //comment\n"
+     ") ();\n"
+     "endmodule\n"},
+    {"module foo #("
+     "parameter  bar =1//comment\n"
+     ",localparam baz =2\n"
+     ") ();"
+     "endmodule",
+     "module foo #(\n"
+     "      parameter  bar = 1  //comment\n"
+     "    , localparam baz = 2\n"
+     ") ();\n"
+     "endmodule\n"},
+    {"module foo;"
+     // fit in one line
+     "parameter int i = '{\n"
+     "1,\n"
+     "2,\n"
+     "3\n"
+     "};\n"
+     "endmodule",
+     "module foo;\n"
+     "  parameter int i = '{1, 2, 3};\n"
+     "endmodule\n"},
+    {"module foo;"
+     // too long for one line, expand
+     "localparam logic [63:0] RC[24] = '{\n"
+     "64'h 1,\n"
+     "64'h 2,\n"
+     "64'h 3\n"
+     "};\n"
+     "endmodule",
+     "module foo;\n"
+     "  localparam logic [63:0] RC[24] = '{\n"
+     "      64'h1,\n"
+     "      64'h2,\n"
+     "      64'h3\n"
+     "  };\n"
+     "endmodule\n"},
+    {"module foo;"
+     "parameter int i = '{\n"
+     // force expansion
+     "1, //\n"
+     "2,\n"
+     "3\n"
+     "};\n"
+     "endmodule",
+     "module foo;\n"
+     "  parameter int i = '{\n"
+     "      1,  //\n"
+     "      2,\n"
+     "      3\n"
+     "  };\n"
+     "endmodule\n"},
+    {"module foo;"
+     "localparam logic [63:0] RC[24] = '{\n"
+     "64'h 0000_0000_0000_0001, // 0\n"
+     "64'h 0000_0000_0000_8082, // 1\n"
+     "64'h 8000_0000_8000_8008 // 23\n"
+     "};\n"
+     "endmodule",
+     "module foo;\n"
+     "  localparam logic [63:0] RC[24] = '{\n"
+     "      64'h0000_0000_0000_0001,  // 0\n"
+     "      64'h0000_0000_0000_8082,  // 1\n"
+     "      64'h8000_0000_8000_8008  // 23\n"
+     "  };\n"
+     "endmodule\n"},
+    {"module foo;"
+     // nest two patterns
+     "parameter logic [11:0] i = '{\n"
+     "'{1,2,3},\n"
+     "'{1,2,3}\n"
+     "};\n"
+     "endmodule",
+     "module foo;\n"
+     "  parameter logic [11:0] i = '{\n"
+     "      '{1, 2, 3},\n"
+     "      '{1, 2, 3}\n"
+     "  };\n"
+     "endmodule\n"},
+    {"module foo;"
+     // nest two patterns, expand interior
+     "parameter logic [11:0] i = '{\n"
+     "'{1, //\n"
+     " 2,3},\n"
+     "'{1,2,3}\n"
+     "};\n"
+     "endmodule",
+     "module foo;\n"
+     "  parameter logic [11:0] i = '{\n"
+     "      '{\n"
+     "          1,  //\n"
+     "          2,\n"
+     "          3\n"
+     "      },\n"
+     "      '{1, 2, 3}\n"
+     "  };\n"
+     "endmodule\n"},
+    {"module foo;"
+     // nest two patterns, expand both
+     "parameter nest [2] i = '{\n"
+     "'{first : 32'h0000_0001,\n"
+     "  second : 32'h0000_0011,\n"
+     "  third: 32'h0000_0111},\n"
+     "'{first : 32'h1000_0001,\n"
+     "  second : 32'h1000_0011,\n"
+     "  third: 32'h1000_0111}\n"
+     "};\n"
+     "endmodule",
+     "module foo;\n"
+     "  parameter nest [2] i = '{\n"
+     "      '{\n"
+     "          first : 32'h0000_0001,\n"
+     "          second : 32'h0000_0011,\n"
+     "          third: 32'h0000_0111\n"
+     "      },\n"
+     "      '{\n"
+     "          first : 32'h1000_0001,\n"
+     "          second : 32'h1000_0011,\n"
+     "          third: 32'h1000_0111\n"
+     "      }\n"
+     "  };\n"
+     "endmodule\n"},
+    {"module foo;"
+     // nest three patterns
+     "parameter logic [11:0] i = '{\n"
+     "'{'{1,2,3},4}\n"
+     "};\n"
+     "endmodule",
+     "module foo;\n"
+     "  parameter logic [11:0] i = '{\n"
+     "      '{'{1, 2, 3}, 4}\n"
+     "  };\n"
+     "endmodule\n"},
+    {"module foo;"
+     // nest three patterns, expand interior
+     "parameter logic [11:0] i = '{\n"
+     "'{\n"
+     "'{first : 32'h0000_0001,\n"
+     "  second : 32'h0000_0011,\n"
+     "  third: 32'h0000_0111},\n"
+     "  4},\n"
+     "  5,\n"
+     "  '{1,2,3}\n"
+     "};\n"
+     "endmodule",
+     "module foo;\n"
+     "  parameter logic [11:0] i = '{\n"
+     "      '{\n"
+     "          '{\n"
+     "              first : 32'h0000_0001,\n"
+     "              second : 32'h0000_0011,\n"
+     "              third: 32'h0000_0111\n"
+     "          },\n"
+     "          4\n"
+     "      },\n"
+     "      5,\n"
+     "      '{1, 2, 3}\n"
+     "  };\n"
+     "endmodule\n"},
+    {"module    top;"
+     "foo#(  \"test\"  ) foo(  );"
+     "bar#(  \"test\"  ,5) bar(  );"
+     "endmodule\n",
+     "module top;\n"
+     "  foo #(\"test\") foo ();\n"  // module instantiation, string arg
+     "  bar #(\"test\", 5) bar ();\n"
+     "endmodule\n"},
+    {"module    top;"
+     "foo#(  `\"test`\"  ) foo(  );"
+     "bar#(  `\"test`\"  ,5) bar(  );"
+     "endmodule\n",
+     "module top;\n"
+     "  foo #(`\"test`\") foo ();\n"  // module instantiation, eval string arg
+     "  bar #(`\"test`\", 5) bar ();\n"
+     "endmodule\n"},
+    {"`ifdef FOO\n"
+     "  module bar;endmodule\n"
+     "`endif\n",
+     "`ifdef FOO\n"
+     "module bar;\n"
+     "endmodule\n"
+     "`endif\n"},
+    {"`ifdef FOO\n"
+     "  module bar;endmodule\n"
+     "`else module baz;endmodule\n"
+     "`endif\n",
+     "`ifdef FOO\n"
+     "module bar;\n"
+     "endmodule\n"
+     "`else\n"
+     "module baz;\n"
+     "endmodule\n"
+     "`endif\n"},
+    {"`ifdef FOO\n"
+     "  module bar;endmodule\n"
+     "`else /* glue me */ module baz;endmodule\n"
+     "`endif\n",
+     "`ifdef FOO\n"
+     "module bar;\n"
+     "endmodule\n"
+     "`else  /* glue me */\n"
+     "module baz;\n"
+     "endmodule\n"
+     "`endif\n"},
+    {"`ifdef FOO\n"
+     "  module bar;endmodule\n"
+     "`else// different unit\n"
+     "  module baz;endmodule\n"
+     "`endif\n",
+     "`ifdef FOO\n"
+     "module bar;\n"
+     "endmodule\n"
+     "`else  // different unit\n"
+     "module baz;\n"
+     "endmodule\n"
+     "`endif\n"},
+
+    // unary: + - !  ~ & | ^  ~& ~| ~^ ^~
+    {"module m;foo bar(.x(-{a,b}));endmodule",
+     "module m;\n"
+     "  foo bar (.x(-{a, b}));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(!{a,b}));endmodule",
+     "module m;\n"
+     "  foo bar (.x(!{a, b}));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(~{a,b}));endmodule",
+     "module m;\n"
+     "  foo bar (.x(~{a, b}));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(&{a,b}));endmodule",
+     "module m;\n"
+     "  foo bar (.x(&{a, b}));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(|{a,b}));endmodule",
+     "module m;\n"
+     "  foo bar (.x(|{a, b}));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(^{a,b}));endmodule",
+     "module m;\n"
+     "  foo bar (.x(^{a, b}));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(~&{a,b}));endmodule",
+     "module m;\n"
+     "  foo bar (.x(~&{a, b}));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(~|{a,b}));endmodule",
+     "module m;\n"
+     "  foo bar (.x(~|{a, b}));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(~^{a,b}));endmodule",
+     "module m;\n"
+     "  foo bar (.x(~^{a, b}));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(^~{a,b}));endmodule",
+     "module m;\n"
+     "  foo bar (.x(^~{a, b}));\n"
+     "endmodule\n"},
+
+    // binary: + - * / % & | ^ ^~ ~^ && ||
+    {"module m;foo bar(.x(a+b));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a + b));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(a-b));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a - b));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(a*b));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a * b));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(a/b));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a / b));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(a%b));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a % b));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(a&b));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a & b));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(a|b));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a | b));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(a^b));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a ^ b));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(a^~b));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a ^~ b));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(a~^b));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a ~^ b));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(a&&b));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a && b));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(a||b));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a || b));\n"
+     "endmodule\n"},
+
+    // {a} op {b}
+    {"module m;foo bar(.x({a}+{b}));endmodule",
+     "module m;\n"
+     "  foo bar (.x({a} + {b}));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x({a}-{b}));endmodule",
+     "module m;\n"
+     "  foo bar (.x({a} - {b}));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x({a}*{b}));endmodule",
+     "module m;\n"
+     "  foo bar (.x({a} * {b}));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x({a}/{b}));endmodule",
+     "module m;\n"
+     "  foo bar (.x({a} / {b}));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x({a}%{b}));endmodule",
+     "module m;\n"
+     "  foo bar (.x({a} % {b}));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x({a}&{b}));endmodule",
+     "module m;\n"
+     "  foo bar (.x({a} & {b}));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x({a}|{b}));endmodule",
+     "module m;\n"
+     "  foo bar (.x({a} | {b}));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x({a}^{b}));endmodule",
+     "module m;\n"
+     "  foo bar (.x({a} ^ {b}));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x({a}^~{b}));endmodule",
+     "module m;\n"
+     "  foo bar (.x({a} ^~ {b}));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x({a}~^{b}));endmodule",
+     "module m;\n"
+     "  foo bar (.x({a} ~^ {b}));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x({a}&&{b}));endmodule",
+     "module m;\n"
+     "  foo bar (.x({a} && {b}));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x({a}||{b}));endmodule",
+     "module m;\n"
+     "  foo bar (.x({a} || {b}));\n"
+     "endmodule\n"},
+
+    // (a) op (b)
+    {"module m;foo bar(.x((a)+(b)));endmodule",
+     "module m;\n"
+     "  foo bar (.x((a) + (b)));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x((a)-(b)));endmodule",
+     "module m;\n"
+     "  foo bar (.x((a) - (b)));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x((a)*(b)));endmodule",
+     "module m;\n"
+     "  foo bar (.x((a) * (b)));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x((a)/(b)));endmodule",
+     "module m;\n"
+     "  foo bar (.x((a) / (b)));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x((a)%(b)));endmodule",
+     "module m;\n"
+     "  foo bar (.x((a) % (b)));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x((a)&(b)));endmodule",
+     "module m;\n"
+     "  foo bar (.x((a) & (b)));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x((a)|(b)));endmodule",
+     "module m;\n"
+     "  foo bar (.x((a) | (b)));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x((a)^(b)));endmodule",
+     "module m;\n"
+     "  foo bar (.x((a) ^ (b)));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x((a)^~(b)));endmodule",
+     "module m;\n"
+     "  foo bar (.x((a) ^~ (b)));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x((a)~^(b)));endmodule",
+     "module m;\n"
+     "  foo bar (.x((a) ~^ (b)));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x((a)&&(b)));endmodule",
+     "module m;\n"
+     "  foo bar (.x((a) && (b)));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x((a)||(b)));endmodule",
+     "module m;\n"
+     "  foo bar (.x((a) || (b)));\n"
+     "endmodule\n"},
+
+    // a[b] op c
+    {"module m;foo bar(.x(a[b]+c));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a[b] + c));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(a[b]-c));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a[b] - c));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(a[b]*c));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a[b] * c));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(a[b]/c));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a[b] / c));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(a[b]%c));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a[b] % c));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(a[b]&c));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a[b] & c));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(a[b]|c));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a[b] | c));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(a[b]^c));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a[b] ^ c));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(a[b]^~c));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a[b] ^~ c));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(a[b]~^c));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a[b] ~^ c));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(a[b]&&c));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a[b] && c));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(a[b]||c));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a[b] || c));\n"
+     "endmodule\n"},
+
+    // misc
+    {"module m;foo bar(.x(a[1:0]^b[2:1]));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a[1:0] ^ b[2:1]));\n"
+     "endmodule\n"},
+
+    {"module m;foo bar(.x(a[b] | b[c]));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a[b] | b[c]));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x(a[b] & b[c]));endmodule",
+     "module m;\n"
+     "  foo bar (.x(a[b] & b[c]));\n"
+     "endmodule\n"},
+
+    {"module m;foo bar(.x((a^c)^(b^ ~c)));endmodule",
+     "module m;\n"
+     "  foo bar (.x((a ^ c) ^ (b ^ ~c)));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x((a^c)^(b^~c)));endmodule",
+     "module m;\n"
+     "  foo bar (.x((a ^ c) ^ (b ^~ c)));\n"
+     "endmodule\n"},
+    {"module m;foo bar(.x((a^{c,d})^(b^^{c,d})));endmodule",
+     "module m;\n"
+     "  foo bar (\n"
+     "      .x((a ^ {c, d}) ^ (b ^ ^{c, d}))\n"
+     "  );\n"
+     "endmodule\n"},
+
+    {// module items mixed with preprocessor conditionals and comments
+     "    module foo;\n"
+     "// comment1\n"
+     "  `ifdef SIM\n"
+     "// comment2\n"
+     " `elsif SYN\n"
+     " // comment3\n"
+     "       `else\n"
+     "// comment4\n"
+     " `endif\n"
+     "// comment5\n"
+     "  endmodule",
+     "module foo;\n"
+     "  // comment1\n"
+     "`ifdef SIM\n"
+     "  // comment2\n"
+     "`elsif SYN\n"
+     "  // comment3\n"
+     "`else\n"
+     "  // comment4\n"
+     "`endif\n"
+     "  // comment5\n"
+     "endmodule\n"},
+    {"  module bar;wire foo;reg bear;endmodule\n",
+     "module bar;\n"
+     "  wire foo;\n"
+     "  reg  bear;\n"  // aligned
+     "endmodule\n"},
+    {" module bar;initial\nbegin a<=b . c ; end endmodule\n",
+     "module bar;\n"
+     "  initial begin\n"
+     "    a <= b.c;\n"
+     "  end\n"
+     "endmodule\n"},
+    {"module foo ();\nif (1) begin\n$finish(\n"
+     "      1    ); $finish    ();\n  end\nendmodule",
+     "module foo ();\n"
+     "  if (1) begin\n"
+     "    $finish(1);\n"
+     "    $finish();\n"
+     "  end\n"
+     "endmodule\n"},
+    {"  module bar;for(genvar i = 0 ; i<N ; ++ i  ) begin end endmodule\n",
+     "module bar;\n"
+     "  for (genvar i = 0; i < N; ++i) begin\n"
+     "  end\n"
+     "endmodule\n"},
+    {"  module bar;for(genvar i = 0 ; i!=N ; i ++  ) begin "
+     "foo f;end endmodule\n",
+     "module bar;\n"
+     "  for (genvar i = 0; i != N; i++) begin\n"
+     "    foo f;\n"
+     "  end\n"
+     "endmodule\n"},
+    {
+        "module block_generate;\n"
+        "`ASSERT(blah)\n"
+        "generate endgenerate endmodule\n",
+        "module block_generate;\n"
+        "  `ASSERT(blah)\n"
+        "  generate\n"
+        "  endgenerate\n"
+        "endmodule\n",
+    },
+    {
+        "module conditional_generate;\n"
+        "if(foo)  ; \t"  // null action
+        "endmodule\n",
+        "module conditional_generate;\n"
+        "  if (foo);\n"
+        "endmodule\n",
+    },
+    {
+        "module conditional_generate;\n"
+        "if(foo[a*b+c])  ; \t"  // null action
+        "endmodule\n",
+        "module conditional_generate;\n"
+        "  if (foo[a*b+c]);\n"  // allow compact expressions inside []
+        "endmodule\n",
+    },
+    {
+        "module conditional_generate;\n"
+        "if(foo)begin\n"
+        "`ASSERT()\n"
+        "`COVER()\n"
+        " end\n"
+        "endmodule\n",
+        "module conditional_generate;\n"
+        "  if (foo) begin\n"
+        "    `ASSERT()\n"
+        "    `COVER()\n"
+        "  end\n"
+        "endmodule\n",
+    },
+    {
+        "module conditional_generate;\n"
+        "`ASSERT()\n"
+        "if(foo)begin\n"
+        " end\n"
+        "`COVER()\n"
+        "endmodule\n",
+        "module conditional_generate;\n"
+        "  `ASSERT()\n"
+        "  if (foo) begin\n"
+        "  end\n"
+        "  `COVER()\n"
+        "endmodule\n",
+    },
+    {
+        "module conditional_generate;\n"
+        "if(foo)begin\n"
+        "           // comment1\n"
+        " // comment2\n"
+        " end\n"
+        "endmodule\n",
+        "module conditional_generate;\n"
+        "  if (foo) begin\n"
+        "    // comment1\n"
+        "    // comment2\n"
+        "  end\n"
+        "endmodule\n",
+    },
+    {
+        "module m ;"
+        "for(genvar i=0; ;)\n; "   // null generate statement
+        "for(genvar j=0 ;; )\n; "  // null generate statement
+        "endmodule",
+        "module m;\n"
+        "  for (genvar i = 0;;);\n"
+        "  for (genvar j = 0;;);\n"
+        "endmodule\n",
+    },
+    {
+        "module m ;"
+        "for (genvar f = 0; f < N; f++) begin "
+        "assign x = y; assign y = z;"
+        "end endmodule",
+        "module m;\n"
+        "  for (genvar f = 0; f < N; f++) begin\n"
+        "    assign x = y;\n"
+        "    assign y = z;\n"
+        "  end\n"
+        "endmodule\n",
+    },
+    {
+        // standalone genvar statement
+        "module m ;"
+        "genvar f;"
+        "for(f=0; f<N; f ++ )begin "
+        "end endmodule",
+        "module m;\n"
+        "  genvar f;\n"
+        "  for (f = 0; f < N; f++) begin\n"
+        "  end\n"
+        "endmodule\n",
+    },
+    {
+        // multiple arguments to genvar statement
+        "module m ;"
+        "genvar f, g;"
+        "for(f=0; f<N; f ++ )begin "
+        "end for(g=N; g>0; g -- )begin "
+        "end endmodule",
+        "module m;\n"
+        "  genvar f, g;\n"
+        "  for (f = 0; f < N; f++) begin\n"
+        "  end\n"
+        "  for (g = N; g > 0; g--) begin\n"
+        "  end\n"
+        "endmodule\n",
+    },
+    {
+        // multiple genvar statements
+        "module m ;"
+        "genvar f;"
+        "genvar g;"
+        "for(f=0; f<N; f ++ )begin "
+        "end for(g=N; g>0; g -- )begin "
+        "end endmodule",
+        "module m;\n"
+        "  genvar f;\n"
+        "  genvar g;\n"
+        "  for (f = 0; f < N; f++) begin\n"
+        "  end\n"
+        "  for (g = N; g > 0; g--) begin\n"
+        "  end\n"
+        "endmodule\n",
+    },
+    {
+        "module event_control ;"
+        "always@ ( posedge   clk )z<=y;"
+        "endmodule\n",
+        "module event_control;\n"
+        "  always @(posedge clk) z <= y;\n"
+        "endmodule\n",
+    },
+    {
+        "module always_if ;"
+        "always@ ( posedge   clk ) if (expr) z<=y;"
+        "endmodule\n",
+        "module always_if;\n"
+        "  always @(posedge clk)\n"  // doesn't fit
+        "    if (expr)\n"
+        "      z <= y;\n"
+        "endmodule\n",
+    },
+    {
+        "module always_if ;"
+        "always@*  if (expr) z<=y;"
+        "endmodule\n",
+        "module always_if;\n"
+        "  always @* if (expr) z <= y;\n"  // fits
+        "endmodule\n",
+    },
+    {
+        "module \talways_if_else ;"
+        "always@*  if (expr) z<=y; else g<=0;"
+        "endmodule\n",
+        "module always_if_else;\n"
+        "  always @*\n"
+        "    if (expr) z <= y;\n"  // fits
+        "    else g <= 0;\n"       // fits
+        "endmodule\n",
+    },
+    {
+        "module \talways_if_else_if ;"
+        "always@*  if (expr) z<=y; else if (w) g<=0;"
+        "endmodule\n",
+        "module always_if_else_if;\n"
+        "  always @*\n"
+        "    if (expr) z <= y;\n"    // fits
+        "    else if (w) g <= 0;\n"  // fits
+        "endmodule\n",
+    },
+    {
+        "module \talways_if_else_if_else ;"
+        "always@*  if (expr) z<=y; else if (w) g<=0;else h<=1;"
+        "endmodule\n",
+        "module always_if_else_if_else;\n"
+        "  always @*\n"
+        "    if (expr) z <= y;\n"    // fits
+        "    else if (w) g <= 0;\n"  // fits
+        "    else h <= 1;\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(b,  c)"
+        "  for (;;)\ts = y;"
+        "endmodule",
+        "module m;\n"
+        "  always @(b, c) for (;;) s = y;\n"  // fits
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)"
+        "  for (i=0;i<k;++i)\ts = y;"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    for (i = 0; i < k; ++i)\n"
+        "      s = y;\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)"
+        "  repeat (jj+kk)\ts = y;"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    repeat (jj + kk)\n"
+        "      s = y;\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)"
+        "  foreach(jj[kk])\ts = y;"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    foreach (jj[kk])\n"
+        "      s = y;\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)"
+        "  while(jj[kk])\ts = y;"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    while (jj[kk])\n"
+        "      s = y;\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)"
+        "  do s=y;while(jj[kk]);\t"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    do\n"
+        "      s = y;\n"
+        "    while (jj[kk]);\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)  \n"
+        "  case(jj)\tS:s = y;endcase\t"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    case (jj)\n"
+        "      S: s = y;\n"
+        "    endcase\n"
+        "endmodule\n",
+    },
+
+    {
+        "module always_if ;"
+        "always@ ( posedge   clk ) if (expr) z<=y;"
+        "endmodule\n",
+        "module always_if;\n"
+        "  always @(posedge clk)\n"  // doesn't fit
+        "    if (expr)\n"
+        "      z <= y;\n"
+        "endmodule\n",
+    },
+    {
+        "module always_if ;"
+        "always@*  if (expr) z<=y;"
+        "endmodule\n",
+        "module always_if;\n"
+        "  always @* if (expr) z <= y;\n"  // fits
+        "endmodule\n",
+    },
+    {
+        "module \talways_if_else ;"
+        "always@*  if (expr) z<=y; else g<=0;"
+        "endmodule\n",
+        "module always_if_else;\n"
+        "  always @*\n"
+        "    if (expr) z <= y;\n"  // fits
+        "    else g <= 0;\n"       // fits
+        "endmodule\n",
+    },
+    {
+        "module \talways_if_else_if ;"
+        "always@*  if (expr) z<=y; else if (w) g<=0;"
+        "endmodule\n",
+        "module always_if_else_if;\n"
+        "  always @*\n"
+        "    if (expr) z <= y;\n"    // fits
+        "    else if (w) g <= 0;\n"  // fits
+        "endmodule\n",
+    },
+    {
+        "module \talways_if_else_if_else ;"
+        "always@*  if (expr) z<=y; else if (w) g<=0;else h<=1;"
+        "endmodule\n",
+        "module always_if_else_if_else;\n"
+        "  always @*\n"
+        "    if (expr) z <= y;\n"    // fits
+        "    else if (w) g <= 0;\n"  // fits
+        "    else h <= 1;\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(b,  c)"
+        "  for (;;)\ts = y;"
+        "endmodule",
+        "module m;\n"
+        "  always @(b, c) for (;;) s = y;\n"  // fits
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)"
+        "  for (i=0;i<k;++i)\ts = y;"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    for (i = 0; i < k; ++i)\n"
+        "      s = y;\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)"
+        "  repeat (jj+kk)\ts = y;"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    repeat (jj + kk)\n"
+        "      s = y;\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)"
+        "  foreach(jj[kk])\ts = y;"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    foreach (jj[kk])\n"
+        "      s = y;\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)"
+        "  while(jj[kk])\ts = y;"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    while (jj[kk])\n"
+        "      s = y;\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)"
+        "  do s=y;while(jj[kk]);\t"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    do\n"
+        "      s = y;\n"
+        "    while (jj[kk]);\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)  \n"
+        "  case(jj)\tS:s = y;endcase\t"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    case (jj)\n"
+        "      S: s = y;\n"
+        "    endcase\n"
+        "endmodule\n",
+    },
+
+    {
+        "module always_if ;"
+        "always@ ( posedge   clk ) if (expr) z<=y;"
+        "endmodule\n",
+        "module always_if;\n"
+        "  always @(posedge clk)\n"  // doesn't fit
+        "    if (expr)\n"
+        "      z <= y;\n"
+        "endmodule\n",
+    },
+    {
+        "module always_if ;"
+        "always@*  if (expr) z<=y;"
+        "endmodule\n",
+        "module always_if;\n"
+        "  always @* if (expr) z <= y;\n"  // fits
+        "endmodule\n",
+    },
+    {
+        "module \talways_if_else ;"
+        "always@*  if (expr) z<=y; else g<=0;"
+        "endmodule\n",
+        "module always_if_else;\n"
+        "  always @*\n"
+        "    if (expr) z <= y;\n"  // fits
+        "    else g <= 0;\n"       // fits
+        "endmodule\n",
+    },
+    {
+        "module \talways_if_else_if ;"
+        "always@*  if (expr) z<=y; else if (w) g<=0;"
+        "endmodule\n",
+        "module always_if_else_if;\n"
+        "  always @*\n"
+        "    if (expr) z <= y;\n"    // fits
+        "    else if (w) g <= 0;\n"  // fits
+        "endmodule\n",
+    },
+    {
+        "module \talways_if_else_if_else ;"
+        "always@*  if (expr) z<=y; else if (w) g<=0;else h<=1;"
+        "endmodule\n",
+        "module always_if_else_if_else;\n"
+        "  always @*\n"
+        "    if (expr) z <= y;\n"    // fits
+        "    else if (w) g <= 0;\n"  // fits
+        "    else h <= 1;\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(b,  c)"
+        "  for (;;)\ts = y;"
+        "endmodule",
+        "module m;\n"
+        "  always @(b, c) for (;;) s = y;\n"  // fits
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)"
+        "  for (i=0;i<k;++i)\ts = y;"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    for (i = 0; i < k; ++i)\n"
+        "      s = y;\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)"
+        "  repeat (jj+kk)\ts = y;"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    repeat (jj + kk)\n"
+        "      s = y;\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)"
+        "  foreach(jj[kk])\ts = y;"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    foreach (jj[kk])\n"
+        "      s = y;\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)"
+        "  while(jj[kk])\ts = y;"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    while (jj[kk])\n"
+        "      s = y;\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)"
+        "  do s=y;while(jj[kk]);\t"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    do\n"
+        "      s = y;\n"
+        "    while (jj[kk]);\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)  \n"
+        "  case(jj)\tS:s = y;endcase\t"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    case (jj)\n"
+        "      S: s = y;\n"
+        "    endcase\n"
+        "endmodule\n",
+    },
+
+    {
+        "module always_if ;"
+        "always@ ( posedge   clk ) if (expr) z<=y;"
+        "endmodule\n",
+        "module always_if;\n"
+        "  always @(posedge clk)\n"  // doesn't fit
+        "    if (expr)\n"
+        "      z <= y;\n"
+        "endmodule\n",
+    },
+    {
+        "module always_if ;"
+        "always@*  if (expr) z<=y;"
+        "endmodule\n",
+        "module always_if;\n"
+        "  always @* if (expr) z <= y;\n"  // fits
+        "endmodule\n",
+    },
+    {
+        "module \talways_if_else ;"
+        "always@*  if (expr) z<=y; else g<=0;"
+        "endmodule\n",
+        "module always_if_else;\n"
+        "  always @*\n"
+        "    if (expr) z <= y;\n"  // fits
+        "    else g <= 0;\n"       // fits
+        "endmodule\n",
+    },
+    {
+        "module \talways_if_else_if ;"
+        "always@*  if (expr) z<=y; else if (w) g<=0;"
+        "endmodule\n",
+        "module always_if_else_if;\n"
+        "  always @*\n"
+        "    if (expr) z <= y;\n"    // fits
+        "    else if (w) g <= 0;\n"  // fits
+        "endmodule\n",
+    },
+    {
+        "module \talways_if_else_if_else ;"
+        "always@*  if (expr) z<=y; else if (w) g<=0;else h<=1;"
+        "endmodule\n",
+        "module always_if_else_if_else;\n"
+        "  always @*\n"
+        "    if (expr) z <= y;\n"    // fits
+        "    else if (w) g <= 0;\n"  // fits
+        "    else h <= 1;\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(b,  c)"
+        "  for (;;)\ts = y;"
+        "endmodule",
+        "module m;\n"
+        "  always @(b, c) for (;;) s = y;\n"  // fits
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)"
+        "  for (i=0;i<k;++i)\ts = y;"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    for (i = 0; i < k; ++i)\n"
+        "      s = y;\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)"
+        "  repeat (jj+kk)\ts = y;"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    repeat (jj + kk)\n"
+        "      s = y;\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)"
+        "  foreach(jj[kk])\ts = y;"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    foreach (jj[kk])\n"
+        "      s = y;\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)"
+        "  while(jj[kk])\ts = y;"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    while (jj[kk])\n"
+        "      s = y;\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)"
+        "  do s=y;while(jj[kk]);\t"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    do\n"
+        "      s = y;\n"
+        "    while (jj[kk]);\n"
+        "endmodule\n",
+    },
+    {
+        "module m;\n"
+        "always @(posedge clk)  \n"
+        "  case(jj)\tS:s = y;endcase\t"
+        "endmodule",
+        "module m;\n"
+        "  always @(posedge clk)\n"
+        "    case (jj)\n"
+        "      S: s = y;\n"
+        "    endcase\n"
+        "endmodule\n",
+    },
+
+    {
+        // begin/end with labels
+        "module m ;initial  begin:yyy\tend:yyy endmodule",
+        "module m;\n"
+        "  initial begin : yyy\n"
+        "  end : yyy\n"
+        "endmodule\n",
+    },
+    {
+        // conditional generate begin/end with labels
+        "module m ;if\n( 1)  begin:yyy\tend:yyy endmodule",
+        "module m;\n"
+        "  if (1) begin : yyy\n"
+        "  end : yyy\n"
+        "endmodule\n",
+    },
+    {
+        // begin/end with labels, nested
+        "module m ;initial  begin:yyy if(1)begin:zzz "
+        "end:zzz\tend:yyy endmodule",
+        "module m;\n"
+        "  initial begin : yyy\n"
+        "    if (1) begin : zzz\n"
+        "    end : zzz\n"
+        "  end : yyy\n"
+        "endmodule\n",
+    },
+    {
+        "module m ;initial  begin #  1 x<=y ;end endmodule",
+        "module m;\n"
+        "  initial begin\n"
+        "    #1 x <= y;\n"
+        "  end\n"
+        "endmodule\n",
+    },
+    {
+        "module m ;initial  begin x<=y ;  y<=z;end endmodule",
+        "module m;\n"
+        "  initial begin\n"
+        "    x <= y;\n"
+        "    y <= z;\n"
+        "  end\n"
+        "endmodule\n",
+    },
+    {
+        "module m ;initial  begin # 10 x<=y ;  # 20  y<=z;end endmodule",
+        "module m;\n"
+        "  initial begin\n"
+        "    #10 x <= y;\n"
+        "    #20 y <= z;\n"
+        "  end\n"
+        "endmodule\n",
+    },
+    {
+        // qualified variables
+        "module m ;initial  begin automatic int a; "
+        " static byte s=0;end endmodule",
+        "module m;\n"
+        "  initial begin\n"
+        "    automatic int a;\n"
+        "    static byte   s = 0;\n"  // aligned
+        "  end\n"
+        "endmodule\n",
+    },
+    {
+        "module m ;initial  begin automatic int a,b; "
+        " static byte s,t;end endmodule",
+        "module m;\n"
+        "  initial begin\n"
+        "    automatic int a, b;\n"
+        "    static byte s, t;\n"
+        "  end\n"
+        "endmodule\n",
+    },
+    {
+        "module m ;initial  begin   static byte a=1,b=0;end endmodule",
+        "module m;\n"
+        "  initial begin\n"
+        "    static byte a = 1, b = 0;\n"
+        "  end\n"
+        "endmodule\n",
+    },
+    {
+        "module m ;initial  begin   const int a=0;end endmodule",
+        "module m;\n"
+        "  initial begin\n"
+        "    const int a = 0;\n"
+        "  end\n"
+        "endmodule\n",
+    },
+    {
+        "module m ;initial  begin automatic   const int a=0;end endmodule",
+        "module m;\n"
+        "  initial begin\n"
+        "    automatic const int a = 0;\n"
+        "  end\n"
+        "endmodule\n",
+    },
+    {
+        "module m ;initial  begin const  var automatic  int a=0;end endmodule",
+        "module m;\n"
+        "  initial begin\n"
+        "    const var automatic int a = 0;\n"
+        "  end\n"
+        "endmodule\n",
+    },
+    {
+        "module m ;initial  begin static byte s  ={<<{a}};end endmodule",
+        "module m;\n"
+        "  initial begin\n"
+        "    static byte s = {<<{a}};\n"
+        "  end\n"
+        "endmodule\n",
+    },
+    {
+        "module m ;initial  begin static int s  ={>>4{a}};end endmodule",
+        "module m;\n"
+        "  initial begin\n"
+        "    static int s = {>>4{a}};\n"
+        "  end\n"
+        "endmodule\n",
+    },
+    {
+        "module m; final  assert   (expr ) ;endmodule",
+        "module m;\n"
+        "  final assert (expr);\n"
+        "endmodule\n",
+    },
+    {
+        "module m; final  begin\tassert   (expr ) ;end  endmodule",
+        "module m;\n"
+        "  final begin\n"
+        "    assert (expr);\n"
+        "  end\n"
+        "endmodule\n",
+    },
+    {
+        "module m; final  assume   (expr ) ;endmodule",
+        "module m;\n"
+        "  final assume (expr);\n"
+        "endmodule\n",
+    },
+    {
+        "module m; final  cover   (expr ) ;endmodule",
+        "module m;\n"
+        "  final cover (expr);\n"
+        "endmodule\n",
+    },
+    {
+        // two consecutive clocking declarations in modules
+        " module mcd ; "
+        "clocking   cb @( posedge clk);\t\tendclocking "
+        "clocking cb2   @ (posedge  clk\n); endclocking endmodule",
+        "module mcd;\n"
+        "  clocking cb @(posedge clk);\n"
+        "  endclocking\n"
+        "  clocking cb2 @(posedge clk);\n"
+        "  endclocking\n"
+        "endmodule\n",
+    },
+    {
+        // two consecutive clocking declarations in modules, with end labels
+        " module mcd ; "
+        "clocking   cb @( posedge clk);\t\tendclocking:  cb "
+        "clocking cb2   @ (posedge  clk\n); endclocking   :cb2 endmodule",
+        "module mcd;\n"
+        "  clocking cb @(posedge clk);\n"
+        "  endclocking : cb\n"
+        "  clocking cb2 @(posedge clk);\n"
+        "  endclocking : cb2\n"
+        "endmodule\n",
+    },
+    {
+        // clocking declarations with ports in modules
+        " module mcd ; "
+        "clocking cb   @ (posedge  clk\n); input a; output b; endclocking "
+        "endmodule",
+        "module mcd;\n"
+        "  clocking cb @(posedge clk);\n"
+        "    input a;\n"
+        "    output b;\n"
+        "  endclocking\n"
+        "endmodule\n",
+    },
+    {
+        // DPI import declarations in modules
+        "module mdi;"
+        "import   \"DPI-C\" function  int add(\n) ;"
+        "import \"DPI-C\"\t\tfunction int\nsleep( input int secs );"
+        "import \"DPI-C\"\t\tfunction int\nwake( input int secs, output bit "
+        "[2:0] z);"
+        "endmodule",
+        "module mdi;\n"
+        "  import \"DPI-C\" function int add();\n"
+        "  import \"DPI-C\" function int sleep(\n"
+        "    input int secs\n"
+        "  );\n"
+        "  import \"DPI-C\" function int wake(\n"
+        "    input  int       secs,\n"
+        "    output bit [2:0] z\n"
+        "  );\n"
+        "endmodule\n",
+    },
+    {
+        // DPI export declarations in modules
+        "module m;"
+        "export \"DPI-C\" function get;"
+        "export \"DPI-C\" function mhpmcounter_get;\n"
+        "export \"DPI-C\"\t\tfunction int\nwake( input int secs, output bit "
+        "[2:0] z);"
+        "endmodule",
+        "module m;\n"
+        "  export \"DPI-C\" function get;\n"
+        "  export \"DPI-C\"\n"
+        "      function mhpmcounter_get;\n"  // doesn't fit in 40-col
+        "  export \"DPI-C\" function int wake(\n"
+        "    input  int       secs,\n"
+        "    output bit [2:0] z\n"
+        "  );\n"
+        "endmodule\n",
+    },
+    {// Two consecutive EOL comments in kDPIImportItem
+     "import \"DPI-C\" context function void foo(\n"
+     "  input bit first,\n"
+     "  // c3\n"
+     "  // c3+\n"
+     "  input bit second\n"
+     ");\n",
+     "import \"DPI-C\" context\n"
+     "    function void foo(\n"
+     "  input bit first,\n"
+     "  // c3\n"
+     "  // c3+\n"
+     "  input bit second\n"
+     ");\n"},
+    {"export \"\" t;\n", "export \"\" t;\n"},
+    {"import \"DPI-C\" context function void func(input bit impl_i,"
+     "input bit op_i,"
+     "input bit [5:0] mode_i,"
+     "input bit [3:0][31:0] iv_i,"
+     "input bit [2:0] key_len_i,"
+     "input bit [7:0][31:0] key_i,"
+     "input bit [7:0] data_i[],"
+     "output bit [7:0] data_o[]);",
+     "import \"DPI-C\" context\n"
+     "    function void func(\n"
+     "  input  bit             impl_i,\n"
+     "  input  bit             op_i,\n"
+     "  input  bit [5:0]       mode_i,\n"
+     "  input  bit [3:0][31:0] iv_i,\n"
+     "  input  bit [2:0]       key_len_i,\n"
+     "  input  bit [7:0][31:0] key_i,\n"
+     "  input  bit [7:0]       data_i   [],\n"
+     "  output bit [7:0]       data_o   []\n"
+     ");\n"},
+    {// module with system task call w or w/o parentheses
+     "module m; initial begin #10 $display(\"foo\"); $display(\"bar\");"
+     "end endmodule",
+     "module m;\n"
+     "  initial begin\n"
+     "    #10 $display(\"foo\");\n"
+     "    $display(\"bar\");\n"
+     "  end\n"
+     "endmodule\n"},
+    {// module with system task call
+     "module m; initial begin #10 $display; $display;"
+     "end endmodule",
+     "module m;\n"
+     "  initial begin\n"
+     "    #10 $display;\n"
+     "    $display;\n"
+     "  end\n"
+     "endmodule\n"},
+
+};
+
+TEST(FormatterEndToEndTest, ModuleFormatterTestCases) {
+  RunFormatterTestCases40(kModuleFormatterTestCases);
+}
+
+}  // namespace
+}  // namespace formatter
+}  // namespace verilog
diff --git a/verible/verilog/formatting/formatter_test.cc b/verible/verilog/formatting/formatter_test.cc
index 9677489..894254f 100644
--- a/verible/verilog/formatting/formatter_test.cc
+++ b/verible/verilog/formatting/formatter_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2017-2020 The Verible Authors.
+// Copyright 2017-2026 The Verible Authors.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -13,42 +13,24 @@
 // limitations under the License.
 
 // Test cases in this file should be *insensitive* to wrapping penalties.
-// Penalty-sensitive tests belong in formatter_tuning_test.cc.
-// Methods for keeping tests penalty insensitive:
-//   * Short lines and partitions.  Lines that fit need no wrapping.
-//   * Forced line breaks using //comments (reduce decision-making)
+// Penalty-sensitive tests belong in formatter-tuning_test.cc.
+// Thematic end-to-end cases live in sibling formatter_*_test.cc files.
+// New GitHub-issue regressions belong in formatter_issue_regression_test.cc.
 
 #include "verible/verilog/formatting/formatter.h"
 
-#include <cctype>
-#include <cstddef>
 #include <memory>
 #include <sstream>
-#include <string>
 #include <string_view>
-#include <vector>
 
 #include "absl/log/die_if_null.h"
 #include "absl/status/status.h"
-#include "absl/strings/match.h"
-#include "absl/strings/str_split.h"
-#include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "verible/common/formatting/align.h"
-#include "verible/common/formatting/basic-format-style.h"
-#include "verible/common/strings/display-utils.h"
-#include "verible/common/strings/position.h"
 #include "verible/common/text/text-structure.h"
-#include "verible/common/util/interval.h"
 #include "verible/common/util/logging.h"
 #include "verible/verilog/analysis/verilog-analyzer.h"
 #include "verible/verilog/formatting/format-style.h"
-
-#undef EXPECT_OK
-#define EXPECT_OK(value) EXPECT_TRUE((value).ok())
-
-#undef ASSERT_OK
-#define ASSERT_OK(value) ASSERT_TRUE((value).ok())
+#include "verible/verilog/formatting/formatter-test-utils.h"
 
 namespace verilog {
 namespace formatter {
@@ -63,12 +45,7 @@
 static constexpr VerilogPreprocess::Config kDefaultPreprocess;
 
 using absl::StatusCode;
-using testing::HasSubstr;
-using verible::AlignmentPolicy;
-using verible::IndentationStyle;
-using verible::LineNumberSet;
 
-// Tests that clean output passes.
 TEST(VerifyFormattingTest, NoError) {
   const std::string_view code("class c;endclass\n");
   const std::unique_ptr<VerilogAnalyzer> analyzer =
@@ -114,15 +91,6 @@
   EXPECT_EQ(status.code(), StatusCode::kDataLoss);
 }
 
-struct FormatterTestCase {
-  std::string_view input;
-  std::string_view expected;
-};
-
-static const LineNumberSet kEnableAllLines;
-
-// Test that the expected output is produced with the formatter using a custom
-// FormatStyle.
 TEST(FormatterTest, FormatCustomStyleTest) {
   static constexpr FormatterTestCase kTestCases[] = {
       {"", ""},
@@ -146,20817 +114,18 @@
   }
 }
 
-static constexpr FormatterTestCase kFormatterTestCases[] = {
+// Small smoke subset; thematic cases live in sibling formatter_*_test.cc files.
+static constexpr FormatterTestCase kSmokeFormatterTestCases[] = {
     {"", ""},
     {"\n", "\n"},
     {"\n\n", "\n\n"},
     {"\t//comment\n", "//comment\n"},
     {"\t/*comment*/\n", "/*comment*/\n"},
     {"\t/*multi-line\ncomment*/\n", "/*multi-line\ncomment*/\n"},
-    // preprocessor test cases
-    {"`include    \"path/to/file.vh\"\n", "`include \"path/to/file.vh\"\n"},
-    {"`include    `\"path/to/file.vh`\"\n", "`include `\"path/to/file.vh`\"\n"},
-    {"`define    FOO\n", "`define FOO\n"},
-    {"`define    FOO   BAR\n", "`define FOO BAR\n"},
-    {"`define    FOO\n"
-     "`define  BAR\n",
-     "`define FOO\n"
-     "`define BAR\n"},
-    {"`define FOO_``BAR 1\n", "`define FOO_``BAR 1\n"},
-    {"`define FOO_```BAR 1\n", "`define FOO_```BAR 1\n"},
-    {"`define FOO ``BAR\n", "`define FOO ``BAR\n"},
-    {"`define A``B``C 2\n", "`define A``B``C 2\n"},
-    {"`define A(x)``y\n", "`define A(x) ``y\n"},
-    {"`define    FOO_``BAR\n", "`define FOO_``BAR\n"},
-    {"`ifndef    FOO\n"
-     "`endif // FOO\n",
-     "`ifndef FOO\n"
-     "`endif  // FOO\n"},
-    {"`ifndef    FOO\n"
-     "`define   BAR\n"
-     "`endif\n",
-     "`ifndef FOO\n"
-     "`define BAR\n"
-     "`endif\n"},
-    {"`ifndef    FOO\n"
-     "`define   BAR\n\n"  // one more blank line
-     "`endif\n",
-     "`ifndef FOO\n"
-     "`define BAR\n\n"
-     "`endif\n"},
-    {"`define    FOO   \\\n"
-     "  BAR\n",
-     "`define FOO \\\n"  // TODO(b/72527558): right align '\'s to column limit
-     "  BAR\n"},
-    {"`define    FOOOOOOOOOOOOOOOO   \\\n"
-     "  BAAAAAAAAAAAAAAAAR BAAAAAAAAAAAAAZ;\n",
-     "`define FOOOOOOOOOOOOOOOO \\\n"  // macro text starts at '\'
-     "  BAAAAAAAAAAAAAAAAR BAAAAAAAAAAAAAZ;\n"},
-    {"`ifdef      FOO\n"
-     "  `fine()\n"
-     "`else\n"
-     "  `error()\n"
-     "`endif\n",
-     "`ifdef FOO\n"
-     "`fine()\n"
-     "`else\n"
-     "`error()\n"
-     "`endif\n"},
-    {"`ifdef      FOO\n"
-     "  `fine()\n"
-     "`else // trouble\n"
-     "  `error()\n"
-     "`endif\n",
-     "`ifdef FOO\n"
-     "`fine()\n"
-     "`else  // trouble\n"
-     "`error()\n"
-     "`endif\n"},
-    {"`ifdef      FOO\n"
-     "  `fine()\n"
-     "`else /* trouble */\n"
-     "  `error()\n"
-     "`endif\n",
-     "`ifdef FOO\n"
-     "`fine()\n"
-     "`else  /* trouble */\n"
-     "`error()\n"
-     "`endif\n"},
-    {"    // lonely comment\n", "// lonely comment\n"},
-    {"    // first comment\n"
-     "  // last comment\n",
-     "// first comment\n"
-     "// last comment\n"},
-    {"    // starting comment\n"
-     "  `define   FOO\n",
-     "// starting comment\n"
-     "`define FOO\n"},
-    {"  `define   FOO\n"
-     "   // trailing comment\n",
-     "`define FOO\n"
-     "// trailing comment\n"},
-    {"  `define   FOO\n"
-     "   // trailing comment 1\n"
-     "      // trailing comment 2\n",
-     "`define FOO\n"
-     "// trailing comment 1\n"
-     "// trailing comment 2\n"},
-    {
-        "  `define   FOO    \\\n"  // multiline macro definition
-        " 1\n",
-        "`define FOO \\\n"
-        " 1\n"  // TODO(b/141517267): Reflowing macro definitions
-    },
-    {"`define FOO    \\\n"  // multiline macro definition
-     "        b\n",
-     "`define FOO \\\n"  // no need to align '\'
-     "        b\n"},
-    {"`define FOO    \\\n"  // multiline macro definition
-     "        a +    \\\n"
-     "        b\n",
-     "`define FOO    \\\n"  // preserve spacing before '\'
-     "        a +    \\\n"  // to stay aligned with this one
-     "        b\n"},
-    {"    // comment with backslash\\\n", "// comment with backslash\\\n"},
-    {// macro with MacroArg tokens as arguments
-     "`FOOOOOO(\nbar1...\n,\nbar2...\n,\nbar3...\n,\nbar4\n)\n",
-     "`FOOOOOO(bar1..., bar2..., bar3...,\n"
-     "         bar4)\n"},
-    {// macro declaration exceeds line length limit
-     "`F_MACRO(looooooong_type if_it_fits_I_sits)\n",
-     "`F_MACRO(\n"
-     "    looooooong_type if_it_fits_I_sits)\n"},
-    {// macro call with not fitting arguments
-     "`MACRO_FFFFFFFFFFF("
-     "type_a_aaaa,type_b_bbbbb,"
-     "type_c_cccccc,type_d_dddddddd,"
-     "type_e_eeeeeeee,type_f_ffff)\n",
-     "`MACRO_FFFFFFFFFFF(\n"
-     "    type_a_aaaa, type_b_bbbbb,\n"
-     "    type_c_cccccc, type_d_dddddddd,\n"
-     "    type_e_eeeeeeee, type_f_ffff)\n"},
-    {// nested macro call
-     "`MACRO_FFFFFFFFFFF( "
-     "`A(type_a_aaaa), `B(type_b_bbbbb), "
-     "`C(type_c_cccccc), `D(type_d_dddddddd), "
-     "`E(type_e_eeeeeeee), `F(type_f_ffff))\n",
-     "`MACRO_FFFFFFFFFFF(`A(type_a_aaaa),\n"
-     "                   `B(type_b_bbbbb),\n"
-     "                   `C(type_c_cccccc),\n"
-     "                   `D(type_d_dddddddd),\n"
-     "                   `E(type_e_eeeeeeee),\n"
-     "                   `F(type_f_ffff))\n"},
-    {// two-level nested macro call
-     "`MACRO_FFFFFFFFFFF( "
-     "`A(type_a_aaaa, `B(type_b_bbbbb)), "
-     "`C(type_c_cccccc, `D(type_d_dddddddd)), "
-     "`E(type_e_eeeeeeee, `F(type_f_ffff)))\n",
-     "`MACRO_FFFFFFFFFFF(\n"
-     "    `A(type_a_aaaa, `B(type_b_bbbbb)),\n"
-     "    `C(type_c_cccccc,\n"
-     "       `D(type_d_dddddddd)),\n"
-     "    `E(type_e_eeeeeeee,\n"
-     "       `F(type_f_ffff)))\n"},
-    {// three-level nested macro call
-     "`MACRO_FFFFFFFFFFF(`A(type_a_aaaa,"
-     "`B(type_b_bbbbb,`C(type_c_cccccc))),"
-     "`D(type_d_dddddddd,`E(type_e_eeeeeeee,"
-     "`F(type_f_ffff))))\n",
-     "`MACRO_FFFFFFFFFFF(\n"
-     "    `A(type_a_aaaa,\n"
-     "       `B(type_b_bbbbb,\n"
-     "          `C(type_c_cccccc))),\n"
-     "    `D(type_d_dddddddd,\n"
-     "       `E(type_e_eeeeeeee,\n"
-     "          `F(type_f_ffff))))\n"},
-    {// macro call with MacroArg tokens as arugments and with semicolon
-     "`FOOOOOO(\nbar1...\n,\nbar2...\n,\nbar3...\n,\nbar4\n);\n",
-     "`FOOOOOO(bar1..., bar2..., bar3...,\n"
-     "         bar4);\n"},
-    {// macro declaration exceeds line length limit and contains semicolon
-     "`F_MACRO(looooooong_type if_it_fits_I_sits);\n",
-     "`F_MACRO(\n"
-     "    looooooong_type if_it_fits_I_sits);\n"},
-    {// macro call with not fitting arguments and semicolon
-     "`MACRO_FFFFFFFFFFF("
-     "type_a_aaaa,type_b_bbbbb,"
-     "type_c_cccccc,type_d_dddddddd,"
-     "type_e_eeeeeeee,type_f_ffff);\n",
-     "`MACRO_FFFFFFFFFFF(\n"
-     "    type_a_aaaa, type_b_bbbbb,\n"
-     "    type_c_cccccc, type_d_dddddddd,\n"
-     "    type_e_eeeeeeee, type_f_ffff);\n"},
-    {// nested macro call with semicolon
-     "`MACRO_FFFFFFFFFFF( "
-     "`A(type_a_aaaa), `B(type_b_bbbbb), "
-     "`C(type_c_cccccc), `D(type_d_dddddddd), "
-     "`E(type_e_eeeeeeee), `F(type_f_ffff));\n",
-     "`MACRO_FFFFFFFFFFF(`A(type_a_aaaa),\n"
-     "                   `B(type_b_bbbbb),\n"
-     "                   `C(type_c_cccccc),\n"
-     "                   `D(type_d_dddddddd),\n"
-     "                   `E(type_e_eeeeeeee),\n"
-     "                   `F(type_f_ffff));\n"},
-    {// two-level nested macro call with semicolon
-     "`MACRO_FFFFFFFFFFF( "
-     "`A(type_a_aaaa, `B(type_b_bbbbb)), "
-     "`C(type_c_cccccc, `D(type_d_dddddddd)), "
-     "`E(type_e_eeeeeeee, `F(type_f_ffff)));\n",
-     "`MACRO_FFFFFFFFFFF(\n"
-     "    `A(type_a_aaaa, `B(type_b_bbbbb)),\n"
-     "    `C(type_c_cccccc,\n"
-     "       `D(type_d_dddddddd)),\n"
-     "    `E(type_e_eeeeeeee,\n"
-     "       `F(type_f_ffff)));\n"},
-    {// three-level nested macro call with semicolon
-     "`MACRO_FFFFFFFFFFF(`A(type_a_aaaa,"
-     "`B(type_b_bbbbb,`C(type_c_cccccc))),"
-     "`D(type_d_dddddddd,`E(type_e_eeeeeeee,"
-     "`F(type_f_ffff))));\n",
-     "`MACRO_FFFFFFFFFFF(\n"
-     "    `A(type_a_aaaa,\n"
-     "       `B(type_b_bbbbb,\n"
-     "          `C(type_c_cccccc))),\n"
-     "    `D(type_d_dddddddd,\n"
-     "       `E(type_e_eeeeeeee,\n"
-     "          `F(type_f_ffff))));\n"},
-    {// macro call with no args
-     "`FOOOOOO()\n", "`FOOOOOO()\n"},
-    {// macro call with no args and semicolon
-     "`FOOOOOO();\n", "`FOOOOOO();\n"},
-    {// macro call with no args and semicolon separated by space
-     "`FOOOOOO() ;\n", "`FOOOOOO();\n"},
-    {// macro call with comments in argument list
-     "`FOO(aa, //aa\nbb , // bb\ncc)\n",
-     "`FOO(aa,  //aa\n"
-     "     bb,  // bb\n"
-     "     cc)\n"},
-    {// macro call with comment before first argument
-     "`FOO(//aa\naa, //bb\nbb , // cc\ncc)\n",
-     "`FOO(  //aa\n"
-     "    aa,  //bb\n"
-     "    bb,  // cc\n"
-     "    cc)\n"},
-    {// macro call with argument including trailing EOL comment
-     "`FOO(aa, bb,//cc\ndd)\n",
-     "`FOO(aa, bb,  //cc\n"
-     "     dd)\n"},
-    {// macro call with argument including EOL comment on own line
-     "`FOOOO(aa, bb,\n//cc\ndd)\n",
-     "`FOOOO(aa, bb,\n"
-     "       //cc\n"
-     "       dd)\n"},
-    {"  // leading comment\n"
-     "  `define   FOO    \\\n"  // multiline macro definition
-     "1\n"
-     "   // trailing comment\n",
-     "// leading comment\n"
-     "`define FOO \\\n"
-     "1\n"  // TODO(b/141517267): Reflowing macro definitions
-     "// trailing comment\n"},
-    {// macro call after define
-     "`define   FOO   BAR\n"
-     "  `FOO( bar )\n",
-     "`define FOO BAR\n"
-     "`FOO(bar)\n"},
-    {// multiple argument macro call
-     "  `FOO( bar , baz )\n", "`FOO(bar, baz)\n"},
-    {// long macro call breaking
-     " `ASSERT_INIT(S, (D == 4 && K inside {0, 1}) ||"
-     " (D == 3 && K== 4))\n",
-     "`ASSERT_INIT(\n"
-     "    S, (D == 4 && K inside {0, 1}) ||\n"
-     "           (D == 3 && K == 4))\n"},
-    {// long macro call breaking
-     " `AINIT(S, (D == 4 && K inside {0, 1}) ||"
-     " (D == 3 && K== 4))\n",
-     "`AINIT(S, (D == 4 && K inside {0, 1}) ||\n"
-     "              (D == 3 && K == 4))\n"},
-    {// long macro call breaking
-     " `ASSERT_INIT(S, D == 4 && K inside {0, 1})\n",
-     "`ASSERT_INIT(S,\n"
-     "             D == 4 && K inside {0, 1})\n"},
-    {// macro call in function
-     "function void foo( );   foo=`FOO( bar , baz ) ; endfunction\n",
-     "function void foo();\n"
-     "  foo = `FOO(bar, baz);\n"
-     "endfunction\n"},
-    {// nested macro call in function
-     "function void foo( );   foo=`FOO( `BAR ( baz ) ) ; endfunction\n",
-     "function void foo();\n"
-     "  foo = `FOO(`BAR(baz));\n"
-     "endfunction\n"},
-    {// macro call in class
-     "class foo;    `FOO  ( bar , baz ) ; endclass\n",
-     "class foo;\n"
-     "  `FOO(bar, baz);\n"
-     "endclass\n"},
-    {// nested macro call in class
-     "class foo;    `FOO  ( `BAR ( baz1 , baz2 ) ) ; endclass\n",
-     "class foo;\n"
-     "  `FOO(`BAR(baz1, baz2));\n"
-     "endclass\n"},
-    {// multi-line macro arg "aaaa..." should start on its own line,
-     // even if its first line would fit under the column limit
-     "`CHECK_FATAL(rd_tr,\n"
-     "             aaaa     == zzz;\n"
-     "             ggg      == vv::w;,\n"
-     "             \"Failed to ..........\")\n",
-     "`CHECK_FATAL(rd_tr,\n"
-     "             aaaa     == zzz;\n"
-     "             ggg      == vv::w;,\n"
-     "             \"Failed to ..........\")\n"},
-    {// macro call nested with function call containing an ifdef
-     "`J(D(`ifdef e))\n",
-     "`J(D(\n"
-     "   `ifdef e))\n"},
-
-    // `uvm macros indenting
-    {
-        // simple test case
-        "`uvm_object_utils_begin(aa)\n"
-        "`uvm_field_int(bb, UVM_DEFAULT)\n"
-        "`uvm_field_int(cc, UVM_DEFAULT)\n"
-        "`uvm_object_utils_end\n",
-        "`uvm_object_utils_begin(aa)\n"
-        "  `uvm_field_int(bb, UVM_DEFAULT)\n"
-        "  `uvm_field_int(cc, UVM_DEFAULT)\n"
-        "`uvm_object_utils_end\n",
-    },
-    {// multiple uvm.*begin - uvm.*end ranges
-     "`uvm_object_utils_begin(aa)\n"
-     "`uvm_field_int(bb, UVM_DEFAULT)\n"
-     "`uvm_field_int(cc, UVM_DEFAULT)\n"
-     "`uvm_object_utils_end\n"
-     "`uvm_field_int(bb, UVM_DEFAULT)\n"
-     "`uvm_field_int(cc, UVM_DEFAULT)\n"
-     "`uvm_object_utils_begin(bb)\n"
-     "`uvm_field_int(bb, UVM_DEFAULT)\n"
-     "`uvm_field_int(cc, UVM_DEFAULT)\n"
-     "`uvm_object_utils_end\n"
-     "`uvm_field_int(bb, UVM_DEFAULT)\n"
-     "`uvm_field_int(cc, UVM_DEFAULT)\n",
-     "`uvm_object_utils_begin(aa)\n"
-     "  `uvm_field_int(bb, UVM_DEFAULT)\n"
-     "  `uvm_field_int(cc, UVM_DEFAULT)\n"
-     "`uvm_object_utils_end\n"
-     "`uvm_field_int(bb, UVM_DEFAULT)\n"
-     "`uvm_field_int(cc, UVM_DEFAULT)\n"
-     "`uvm_object_utils_begin(bb)\n"
-     "  `uvm_field_int(bb, UVM_DEFAULT)\n"
-     "  `uvm_field_int(cc, UVM_DEFAULT)\n"
-     "`uvm_object_utils_end\n"
-     "`uvm_field_int(bb, UVM_DEFAULT)\n"
-     "`uvm_field_int(cc, UVM_DEFAULT)\n"},
-    {
-        // empty uvm.*begin - uvm.*end range
-        "`uvm_component_utils_begin(aa)\n"
-        "`uvm_component_utils_end\n",
-        "`uvm_component_utils_begin(aa)\n"
-        "`uvm_component_utils_end\n",
-    },
-    {
-        // uvm_field_utils
-        "`uvm_field_utils_begin(aa)\n"
-        "`uvm_field_int(bb, UVM_DEFAULT)\n"
-        "`uvm_field_int(cc, UVM_DEFAULT)\n"
-        "`uvm_field_utils_end\n",
-        "`uvm_field_utils_begin(aa)\n"
-        "  `uvm_field_int(bb, UVM_DEFAULT)\n"
-        "  `uvm_field_int(cc, UVM_DEFAULT)\n"
-        "`uvm_field_utils_end\n",
-    },
-    {
-        // uvm_component
-        "`uvm_component_utils_begin(aa)\n"
-        "`uvm_field_int(bb, UVM_DEFAULT)\n"
-        "`uvm_field_int(cc, UVM_DEFAULT)\n"
-        "`uvm_component_utils_end\n",
-        "`uvm_component_utils_begin(aa)\n"
-        "  `uvm_field_int(bb, UVM_DEFAULT)\n"
-        "  `uvm_field_int(cc, UVM_DEFAULT)\n"
-        "`uvm_component_utils_end\n",
-    },
-    {
-        // nested uvm macros
-        "`uvm_field_int(l0, UVM_DEFAULT)\n"
-        "`uvm_component_utils_begin(l0)\n"
-        "`uvm_field_int(l1, UVM_DEFAULT)\n"
-        "`uvm_component_utils_begin(l1)\n"
-        "`uvm_field_int(l2, UVM_DEFAULT)\n"
-        "`uvm_component_utils_begin(l2)\n"
-        "`uvm_field_int(l3, UVM_DEFAULT)\n"
-        "`uvm_component_utils_end\n"
-        "`uvm_field_int(l2, UVM_DEFAULT)\n"
-        "`uvm_component_utils_end\n"
-        "`uvm_field_int(l1, UVM_DEFAULT)\n"
-        "`uvm_component_utils_end\n"
-        "`uvm_field_int(l0, UVM_DEFAULT)\n",
-        "`uvm_field_int(l0, UVM_DEFAULT)\n"
-        "`uvm_component_utils_begin(l0)\n"
-        "  `uvm_field_int(l1, UVM_DEFAULT)\n"
-        "  `uvm_component_utils_begin(l1)\n"
-        "    `uvm_field_int(l2, UVM_DEFAULT)\n"
-        "    `uvm_component_utils_begin(l2)\n"
-        "      `uvm_field_int(l3, UVM_DEFAULT)\n"
-        "    `uvm_component_utils_end\n"
-        "    `uvm_field_int(l2, UVM_DEFAULT)\n"
-        "  `uvm_component_utils_end\n"
-        "  `uvm_field_int(l1, UVM_DEFAULT)\n"
-        "`uvm_component_utils_end\n"
-        "`uvm_field_int(l0, UVM_DEFAULT)\n",
-    },
-    {
-        // non-uvm macro
-        "`my_macro_begin(aa)\n"
-        "`my_field(b)\n"
-        "`my_field(c)\n"
-        "`my_macro_end\n",
-        "`my_macro_begin(aa)\n"
-        "`my_field(b)\n"
-        "`my_field(c)\n"
-        "`my_macro_end\n",
-    },
-    {
-        // unbalanced uvm macros: missing uvm.*end macro
-        "`uvm_component_utils_begin(aa)\n"
-        "`uvm_field_int(bb, UVM_DEFAULT)\n"
-        "`uvm_field_int(cc, UVM_DEFAULT)\n",
-        "`uvm_component_utils_begin(aa)\n"
-        "`uvm_field_int(bb, UVM_DEFAULT)\n"
-        "`uvm_field_int(cc, UVM_DEFAULT)\n",
-    },
-    {
-        // unbalanced uvm macros: missing uvm.*begin macro
-        "`uvm_field_int(bb, UVM_DEFAULT)\n"
-        "`uvm_field_int(cc, UVM_DEFAULT)\n"
-        "`uvm_component_utils_end\n",
-        "`uvm_field_int(bb, UVM_DEFAULT)\n"
-        "`uvm_field_int(cc, UVM_DEFAULT)\n"
-        "`uvm_component_utils_end\n",
-    },
-    {// unbalanced uvm macros: missing _begin macro between
-     // matching uvm.*begin-uvm.*end macros
-     "`uvm_component_utils_begin(aa)\n"
-     "`uvm_field_int(bb, UVM_DEFAULT)\n"
-     "`uvm_field_int(cc, UVM_DEFAULT)\n"
-     "`uvm_component_utils_end\n"
-     "`uvm_field_int(bb, UVM_DEFAULT)\n"
-     "`uvm_field_int(bb, UVM_DEFAULT)\n"
-     "`uvm_field_int(cc, UVM_DEFAULT)\n"
-     "`uvm_component_utils_end\n"
-     "`uvm_field_int(bb, UVM_DEFAULT)\n"
-     "`uvm_component_utils_begin(aa)\n"
-     "`uvm_field_int(bb, UVM_DEFAULT)\n"
-     "`uvm_field_int(cc, UVM_DEFAULT)\n"
-     "`uvm_component_utils_end\n",
-     "`uvm_component_utils_begin(aa)\n"
-     "  `uvm_field_int(bb, UVM_DEFAULT)\n"
-     "  `uvm_field_int(cc, UVM_DEFAULT)\n"
-     "`uvm_component_utils_end\n"
-     "`uvm_field_int(bb, UVM_DEFAULT)\n"
-     "`uvm_field_int(bb, UVM_DEFAULT)\n"
-     "`uvm_field_int(cc, UVM_DEFAULT)\n"
-     "`uvm_component_utils_end\n"
-     "`uvm_field_int(bb, UVM_DEFAULT)\n"
-     "`uvm_component_utils_begin(aa)\n"
-     "  `uvm_field_int(bb, UVM_DEFAULT)\n"
-     "  `uvm_field_int(cc, UVM_DEFAULT)\n"
-     "`uvm_component_utils_end\n"},
-
-    // top-level directive test cases
-    {"`timescale  1ns/1ps\n",  //
-     "`timescale 1ns / 1ps\n"},
-
-    // Multiple compiler directives should remain on separate lines
-    // (regression test for bug where they were merged onto one line)
-    {"`timescale 1 ps / 1 ps\n"
-     "`default_nettype none\n",
-     "`timescale 1 ps / 1 ps\n"
-     "`default_nettype none\n"},
-    {"`resetall\n"
-     "`timescale 1ns/1ps\n"
-     "`default_nettype wire\n",
-     "`resetall\n"
-     "`timescale 1ns / 1ps\n"
-     "`default_nettype wire\n"},
-    // Test with multiple different compiler directives
-    {"`resetall\n"
-     "`celldefine\n"
-     "`timescale 1ns/1ps\n"
-     "`default_nettype none\n",
-     "`resetall\n"
-     "`celldefine\n"
-     "`timescale 1ns / 1ps\n"
-     "`default_nettype none\n"},
-    // Test with compiler directives before module
-    {"`timescale 1ps/1ps\n"
-     "`default_nettype none\n"
-     "module foo;endmodule\n",
-     "`timescale 1ps / 1ps\n"
-     "`default_nettype none\n"
-     "module foo;\nendmodule\n"},
-    // Test with various compiler directives
-    {"`suppress_faults\n"
-     "`enable_portfaults\n"
-     "`delay_mode_distributed\n",
-     "`suppress_faults\n"
-     "`enable_portfaults\n"
-     "`delay_mode_distributed\n"},
-    {"`default_decay_time 10\n"
-     "`default_trireg_strength 50\n",
-     "`default_decay_time 10\n"
-     "`default_trireg_strength 50\n"},
-    // Alignment should ignore compiler directives; declarations align normally.
-    // Place directives at top-level between modules (valid SystemVerilog).
-    {"`timescale 1ns/1ps\n"
-     "module m;\n"
-     "  logic a;\n"
-     "  logic very_long_name;\n"
-     "endmodule\n"
-     "`default_nettype none\n"
-     "module n;\n"
-     "  logic b;\n"
-     "endmodule\n",
-     "`timescale 1ns / 1ps\n"
-     "module m;\n"
-     "  logic a;\n"
-     "  logic very_long_name;\n"
-     "endmodule\n"
-     "`default_nettype none\n"
-     "module n;\n"
-     "  logic b;\n"
-     "endmodule\n"},
-    {"`begin_keywords \"1800-2017\"\n"
-     "module test;endmodule\n"
-     "`end_keywords\n",
-     "`begin_keywords \"1800-2017\"\n"
-     "module test;\nendmodule\n"
-     "`end_keywords\n"},
-
-    // parameter test cases
-    {
-        "  parameter  int   foo=0 ;",
-        "parameter int foo = 0;\n",
-    },
-    {
-        "  parameter  int   foo=bar [ 0 ] ;",  // index expression
-        "parameter int foo = bar[0];\n",
-    },
-    {
-        "  parameter  int   foo=bar [ a+b ] ;",  // binary inside index expr
-        "parameter int foo = bar[a+b];\n",       // allowed to be 0 spaces
-                                                 // (preserved)
-    },
-    {
-        "  parameter  int   foo=bar [ a+ b ] ;",  // binary inside index expr
-        "parameter int foo = bar[a+b];\n",        // allowed to be 0 spaces
-                                                  // (symmetrized)
-    },
-    {
-        "  parameter  int   foo=bar [ a +b ] ;",  // compact binary inside
-        "parameter int foo = bar[a+b];\n",        // index expression
-    },
-    {
-        "  parameter  int   foo=bar [ a  +b ] ;",  // compact binary inside
-        "parameter int foo = bar[a+b];\n",         // index expression
-    },
-    {
-        // with line continuations
-        "  parameter  \\\nint   \\\nfoo=a+ \\\nb ;",
-        "parameter\\\n    int\\\n    foo = a +\\\n    b;\n",
-        // TODO(fangism): should text following a line continuation hang-indent?
-    },
-    // unary prefix expressions
-    {
-        "  parameter  int   foo=- 1 ;",
-        "parameter int foo = -1;\n",
-    },
-    {
-        "  parameter  int   foo=+ 7 ;",
-        "parameter int foo = +7;\n",
-    },
-    {
-        "  parameter  int   foo=- J ;",
-        "parameter int foo = -J;\n",
-    },
-    {
-        "  parameter  int   foo=- ( y ) ;",
-        "parameter int foo = -(y);\n",
-    },
-    {
-        "  parameter  int   foo=- ( z*y ) ;",
-        "parameter int foo = -(z * y);\n",
-    },
-    {
-        "  parameter  int   foo=-  z*- y  ;",
-        "parameter int foo = -z * -y;\n",
-    },
-    {
-        "  parameter  int   foo=( - 2 ) ;",  //
-        "parameter int foo = (-2);\n",
-    },
-    {
-        "  parameter  int   foo=$bar(-  z,- y ) ;",
-        "parameter int foo = $bar(-z, -y);\n",
-    },
-    {"  parameter int a=b&~(c<<d);", "parameter int a = b & ~(c << d);\n"},
-    {"  parameter int a=~~~~b;", "parameter int a = ~~~~b;\n"},
-    {"  parameter int a = ~ ~ ~ ~ b;", "parameter int a = ~~~~b;\n"},
-    {"  parameter int a   =   ~--b;", "parameter int a = ~--b;\n"},
-    {"  parameter int a   =   ~ --b;", "parameter int a = ~--b;\n"},
-    {"  parameter int a = ~ ++ b;", "parameter int a = ~++b;\n"},
-    {"  parameter int a=--b- --c;", "parameter int a = --b - --c;\n"},
-    // ^~ and ~^ are bitwise nor, but ^ ~ isn't
-    {"  parameter int a=b^~(c<<d);", "parameter int a = b ^~ (c << d);\n"},
-    {"  parameter int a=b~^(c<<d);", "parameter int a = b ~^ (c << d);\n"},
-    {"  parameter int a=b^ ~ (c<<d);", "parameter int a = b ^ ~(c << d);\n"},
-    {"  parameter int a=b ^ ~(c<<d);", "parameter int a = b ^ ~(c << d);\n"},
-
-    {"  parameter int a=b^~{c};", "parameter int a = b ^~ {c};\n"},
-    {"  parameter int a=b~^{c};", "parameter int a = b ~^ {c};\n"},
-    {"  parameter int a=b^ ~ {c};", "parameter int a = b ^ ~{c};\n"},
-    {"  parameter int a=b ^ ~{c};", "parameter int a = b ^ ~{c};\n"},
-
-    {"  parameter int a={a}^{b};", "parameter int a = {a} ^ {b};\n"},
-    {"  parameter int a={b}^(c);", "parameter int a = {b} ^ (c);\n"},
-    {"  parameter int a=b[0]^ {c};", "parameter int a = b[0] ^ {c};\n"},
-    {"  parameter int a={c}^a[b];", "parameter int a = {c} ^ a[b];\n"},
-    {"  parameter int a=(c)^{a[b]};", "parameter int a = (c) ^ {a[b]};\n"},
-
-    {"  parameter int a={^{a,^b},c};", "parameter int a = {^{a, ^b}, c};\n"},
-    {"  parameter int a=(a)^(^d[e]^{c});",
-     "parameter int a = (a) ^ (^d[e] ^ {c});\n"},
-    {"  parameter int a=(a)^(^d[e]^f[g]);",
-     "parameter int a = (a) ^ (^d[e] ^ f[g]);\n"},
-    {"  parameter int a=(b^(c^(d^e)));",
-     "parameter int a = (b ^ (c ^ (d ^ e)));\n"},
-    {"  parameter int a={b^{c^{d^e}}};",
-     "parameter int a = {b ^ {c ^ {d ^ e}}};\n"},
-    {"  parameter int a={b^{c[d^e]}};",
-     "parameter int a = {b ^ {c[d^e]}};\n"},  // allow 0 spaces inside "[d^e]"
-    {"  parameter int a={(b^c),(d^^e)};",
-     "parameter int a = {(b ^ c), (d ^ ^e)};\n"},
-
-    {"  parameter int a={(b[x]^{c[y]})};",
-     "parameter int a = {(b[x] ^ {c[y]})};\n"},
-    {"  parameter int a={d^^e[f] ^ (g)};",
-     "parameter int a = {d ^ ^e[f] ^ (g)};\n"},
-
-    // ~| is unary reduction NOR, |~ and | ~ aren't
-    {"  parameter int a=b| ~(c<<d);", "parameter int a = b | ~(c << d);\n"},
-    {"  parameter int a=b|~(c<<d);", "parameter int a = b | ~(c << d);\n"},
-    {"  parameter int a=b| ~| ( c<<d);", "parameter int a = b | ~|(c << d);\n"},
-    {"  parameter int a=b| ~| ~| ( c<<d);",
-     "parameter int a = b | ~|~|(c << d);\n"},
-    {"  parameter int a=b| ~~~( c<<d);",
-     "parameter int a = b | ~~~(c << d);\n"},
-    {
-        "  parameter  int   foo=- - 1 ;",  // double negative
-        "parameter int foo = - -1;\n",
-    },
-    {
-        "  parameter  int   ternary=1?2:3;",
-        "parameter int ternary = 1 ? 2 : 3;\n",
-    },
-    {
-        "  parameter  int   ternary=a?b:c;",
-        "parameter int ternary = a ? b : c;\n",
-    },
-    {
-        "  parameter  int   ternary=\"a\"?\"b\":\"c\";",
-        "parameter int ternary = \"a\" ? \"b\" : \"c\";\n",
-    },
-    {
-        "  parameter  int   t=`\"a`\"?`\"b`\":`\"c`\";",
-        "parameter int t = `\"a`\" ? `\"b`\" : `\"c`\";\n",
-    },
-    {
-        "  parameter  int   ternary=(a)?(b):(c);",
-        "parameter int ternary = (a) ? (b) : (c);\n",
-    },
-    {
-        "  parameter  int   ternary={a}?{b}:{c};",
-        "parameter int ternary = {a} ? {b} : {c};\n",
-    },
-    {
-        "  parameter  int   long_ternary=cond?long_option_t:long_option_f;",
-        "parameter int long_ternary = cond ?\n"
-        "    long_option_t : long_option_f;\n",
-    },
-    {
-        "  parameter  int   break_two=cond\n"
-        "? a_really_long_option_number_one:a_really_long_option_number_two;",
-        "parameter int break_two = cond ?\n"
-        "    a_really_long_option_number_one :\n"
-        "    a_really_long_option_number_two;\n",
-    },
-    {
-        "  assign   ternary=1?2:3;",
-        "assign ternary = 1 ? 2 : 3;\n",
-    },
-    {
-        "  assign   ternary=a?b:c;",
-        "assign ternary = a ? b : c;\n",
-    },
-    {
-        "  assign   ternary={a}?{b}:{c};",
-        "assign ternary = {a} ? {b} : {c};\n",
-    },
-    {
-        "  assign   break_two=cond\n"
-        "? a_really_long_option_number_one:a_really_long_option_number_two;",
-        "assign break_two = cond ?\n"
-        "    a_really_long_option_number_one :\n"
-        "    a_really_long_option_number_two;\n",
-    },
-    {
-        "assign prefetch_d     =\n"
-        "lookup_grant_ic0 ? (lookup_addr_aligned + ADDR) :\n"
-        "                   addr_i;",
-        "assign prefetch_d = lookup_grant_ic0 ?\n"
-        "    (lookup_addr_aligned + ADDR) :\n"
-        "    addr_i;\n",
-    },
-    {
-        "assign prefetch_d     =\n"
-        "lookup_grant_ic0 ? (lookup_addr + 1) :\n"
-        "                   addr_i;",
-        "assign prefetch_d = lookup_grant_ic0 ?\n"
-        "    (lookup_addr + 1) : addr_i;\n",
-    },
-    {
-        "module test;\n"
-        " assign next = // EOL\n"
-        "  foo ? '0 :\n"
-        "  cnt;\n"
-        "endmodule\n",
-        "module test;\n"
-        "  assign next =  // EOL\n"
-        "      foo ? '0 : cnt;\n"
-        "endmodule\n",
-    },
-    {
-        "module test;\n"
-        " assign next = foo // EOL\n"
-        "  ? '0 :\n"
-        "  cnt;\n"
-        "endmodule\n",
-        "module test;\n"
-        "  assign next = foo  // EOL\n"
-        "      ? '0 : cnt;\n"
-        "endmodule\n",
-    },
-    {
-        "module test;\n"
-        " assign next = foo ? // EOL\n"
-        "  '0 :\n"
-        "  cnt;\n"
-        "endmodule\n",
-        "module test;\n"
-        "  assign next = foo ?  // EOL\n"
-        "      '0 : cnt;\n"
-        "endmodule\n",
-    },
-    {
-        "module test;\n"
-        " assign next = foo ? '0 // EOL\n"
-        "  :\n"
-        "  cnt;\n"
-        "endmodule\n",
-        "module test;\n"
-        "  assign next = foo ? '0  // EOL\n"
-        "      : cnt;\n"
-        "endmodule\n",
-    },
-    {
-        "module test;\n"
-        " assign next = foo ? '0 : // EOL\n"
-        "  cnt;\n"
-        "endmodule\n",
-        "module test;\n"
-        "  assign next = foo ? '0 :  // EOL\n"
-        "      cnt;\n"
-        "endmodule\n",
-    },
-    {
-        "module test;\n"
-        " assign next = foo ? '0 : // EOL\n"
-        "  bar ? '1 : '0;\n"
-        "endmodule\n",
-        "module test;\n"
-        "  assign next = foo ? '0 :  // EOL\n"
-        "      bar ? '1 : '0;\n"
-        "endmodule\n",
-    },
-    {
-        "module test;\n"
-        " assign next = foo ? '0 : // EOL\n"
-        "  bar // EOL2\n"
-        " ? '1 : '0;\n"
-        "endmodule\n",
-        "module test;\n"
-        "  assign next = foo ? '0 :  // EOL\n"
-        "      bar  // EOL2\n"
-        "      ? '1 : '0;\n"
-        "endmodule\n",
-    },
-    {
-        "module test;\n"
-        " assign next = foo ? '0 : // EOL\n"
-        "  bar ? // EOL2\n"
-        "  '1 : '0;\n"
-        "endmodule\n",
-        "module test;\n"
-        "  assign next = foo ? '0 :  // EOL\n"
-        "      bar ?  // EOL2\n"
-        "      '1 : '0;\n"
-        "endmodule\n",
-    },
-    {
-        "module test;\n"
-        " assign next = foo ? '0 : // EOL\n"
-        "  bar ? '1 // EOL2\n"
-        "  : '0;\n"
-        "endmodule\n",
-        "module test;\n"
-        "  assign next = foo ? '0 :  // EOL\n"
-        "      bar ? '1  // EOL2\n"
-        "      : '0;\n"
-        "endmodule\n",
-    },
-    {
-        "module test;\n"
-        " assign next = foo ? '0 : // EOL\n"
-        "  bar ? '1 : // EOL2\n"
-        "  '0;\n"
-        "endmodule\n",
-        "module test;\n"
-        "  assign next = foo ? '0 :  // EOL\n"
-        "      bar ? '1 :  // EOL2\n"
-        "      '0;\n"
-        "endmodule\n",
-    },
-    {
-        "assign prefetch_d     =\n"
-        "lookup_ic0 ? // EOL\n"
-        " (lookup_addr + 1) :// BOO\n"
-        "                   addr_i;",
-        "assign prefetch_d = lookup_ic0 ?  // EOL\n"
-        "    (lookup_addr + 1) :  // BOO\n"
-        "    addr_i;\n",
-    },
-    {
-        "module test;\n"
-        " assign next = (foo) ? '0          : // clear \n"
-        "           (bar) ? cnt + 1'b1  : // count \n"
-        "                   cnt;\n"
-        "endmodule\n",
-        "module test;\n"
-        "  assign next = (foo) ? '0 :  // clear \n"
-        "      (bar) ? cnt + 1'b1 :  // count \n"
-        "      cnt;\n"
-        "endmodule\n",
-    },
-    {
-        "module test;\n"
-        " assign next = // FOO\n"
-        "  (foo) ? '0          : // clear \n"
-        "           (bar) ? cnt + 1'b1  : // count \n"
-        "                   cnt;\n"
-        "endmodule\n",
-        "module test;\n"
-        "  assign next =  // FOO\n"
-        "      (foo) ? '0 :  // clear \n"
-        "      (bar) ? cnt + 1'b1 :  // count \n"
-        "      cnt;\n"
-        "endmodule\n",
-    },
-    {
-        "module test;\n"
-        " assign next = foo ? a_really_long_identifier : // EOL\n"
-        "  cnt;\n"
-        "endmodule\n",
-        "module test;\n"
-        "  assign next = foo ?\n"
-        "      a_really_long_identifier :  // EOL\n"
-        "      cnt;\n"
-        "endmodule\n",
-    },
-    {
-        "module test;\n"
-        " assign next = foo ? a_really_long_identifier : // EOL\n"
-        "  another_really_long_identifier;\n"
-        "endmodule\n",
-        "module test;\n"
-        "  assign next = foo ?\n"
-        "      a_really_long_identifier :  // EOL\n"
-        "      another_really_long_identifier;\n"
-        "endmodule\n",
-    },
-    {
-        "module test;\n"
-        " assign next = foo ? a_really_long_identifier : "
-        "another_really_long_identifier;\n"
-        "endmodule\n",
-        "module test;\n"
-        "  assign next = foo ?\n"
-        "      a_really_long_identifier :\n"
-        "      another_really_long_identifier;\n"
-        "endmodule\n",
-    },
-    {
-        "assign m = check                ? {10'b0, foo} :\n"
-        "           (bar && (baz == '0)) ? hello        :\n"
-        "           world                ? temp1        : temp2;\n",
-        "assign m = check ? {10'b0, foo} :\n"
-        "    (bar && (baz == '0)) ? hello :\n"
-        "    world ? temp1 : temp2;\n",
-    },
-    {
-        "assign {a, b} = !(c == d) ? {1'b0, e} :\n"
-        "                ((e == f) && g) ?\n"
-        "                {1'b0, f} : (h) ?\n"
-        "                {1'b0, e} - 1'b1 :\n"
-        "                {1'b0, e} + 1'b1;\n",
-        "assign {a, b} = !(c == d) ? {1'b0, e} :\n"
-        "    ((e == f) && g) ? {1'b0, f} : (h) ?\n"
-        "    {1'b0, e} - 1'b1 : {1'b0, e} + 1'b1;\n",
-    },
-    {
-        "assign {aaaaaaaaaa, bbbbbbbbb} = {1'b0, cccccccccccccccccc[15:0]} +\n"
-        "                                 {1'b0, ddddddddddddddddd[15:0]};\n",
-        "assign {aaaaaaaaaa, bbbbbbbbb} =\n"
-        "    {1'b0, cccccccccccccccccc[15:0]} +\n"
-        "    {1'b0, ddddddddddddddddd[15:0]};\n",
-    },
-    {
-        "covergroup a(string b);\n"
-        "foobar: cross foo, bar {"
-        "ignore_bins baz = binsof(qux) intersect {1, 2, 3, 4, 5, 6, 7};"
-        "}\n"
-        "endgroup : a\n",
-        "covergroup a(string b);\n"
-        "  foobar: cross foo, bar{\n"
-        "    ignore_bins baz =\n"
-        "        binsof (qux) intersect {\n"
-        "      1, 2, 3, 4, 5, 6, 7\n"
-        "    };\n"
-        "  }\n"
-        "endgroup : a\n",
-    },
-    {
-        "assign {aa, bb} = {1'b0, cc} + {1'b0, dd};\n",
-        "assign {aa, bb} = {1'b0, cc} +\n"
-        "    {1'b0, dd};\n",
-    },
-
-    // streaming operators
-    {
-        "   parameter  int  b={ >>   { a } } ;",
-        "parameter int b = {>>{a}};\n",
-    },
-    {
-        "   parameter  int  b={ >>   { a , b,  c } } ;",
-        "parameter int b = {>>{a, b, c}};\n",
-    },
-    {
-        "   parameter  int  b={ >> 4  { a } } ;",
-        "parameter int b = {>>4{a}};\n",
-    },
-    {
-        "   parameter  int  b={ >> byte  { a } } ;",
-        "parameter int b = {>>byte{a}};\n",
-    },
-    {
-        "   parameter  int  b={ >> my_type_t  { a } } ;",
-        "parameter int b = {>>my_type_t{a}};\n",
-    },
-    {
-        "   parameter  int  b={ >> `GET_TYPE  { a } } ;",
-        "parameter int b = {>>`GET_TYPE{a}};\n",
-    },
-    {
-        "   parameter  int  b={ >> 4  {{ >> 2 { a }  }} } ;",
-        "parameter int b = {>>4{{>>2{a}}}};\n",
-    },
-    {
-        "   parameter  int  b={ <<   { a } } ;",
-        "parameter int b = {<<{a}};\n",
-    },
-    {
-        "   parameter  int  b={ <<   { a , b,  c } } ;",
-        "parameter int b = {<<{a, b, c}};\n",
-    },
-    {
-        "   parameter  int  b={ << 4  { a } } ;",
-        "parameter int b = {<<4{a}};\n",
-    },
-    {
-        "   parameter  int  b={ << byte  { a } } ;",
-        "parameter int b = {<<byte{a}};\n",
-    },
-    {
-        "   parameter  int  b={ << my_type_t  { a } } ;",
-        "parameter int b = {<<my_type_t{a}};\n",
-    },
-    {
-        "   parameter  int  b={ << `GET_TYPE  { a } } ;",
-        "parameter int b = {<<`GET_TYPE{a}};\n",
-    },
-    {
-        "   parameter  int  b={ << 4  {{ << 2 { a }  }} } ;",
-        "parameter int b = {<<4{{<<2{a}}}};\n",
-    },
-
-    // basic module test cases
-    {"module foo;endmodule:foo\n",
-     "module foo;\n"
-     "endmodule : foo\n"},
-    {"module\nfoo\n;\nendmodule\n:\nfoo\n",
-     "module foo;\n"
-     "endmodule : foo\n"},
-    {"module\tfoo\t;\tendmodule\t:\tfoo",
-     "module foo;\n"
-     "endmodule : foo\n"},
-    {"module foo;     // foo\n"
-     "endmodule:foo\n",
-     "module foo;  // foo\n"
-     "endmodule : foo\n"},
-    {"module foo;/* foo */endmodule:foo\n",
-     "module foo;  /* foo */\n"
-     "endmodule : foo\n"},
-    {"module pm #(\n"
-     "//comment\n"
-     ") (wire ww);\n"
-     "endmodule\n",
-     "module pm #(\n"
-     "    //comment\n"  // comment indented
-     ") (\n"
-     "    wire ww\n"
-     ");\n"
-     "endmodule\n"},
-    {"module pm ( ) ;\n"  // empty ports list
-     "endmodule\n",
-     "module pm ();\n"
-     "endmodule\n"},
-    {"module pm #(\n"
-     "//comment\n"
-     ") ( );\n"
-     "endmodule\n",
-     "module pm #(\n"
-     "    //comment\n"  // comment indented
-     ") ();\n"          // (); grouped together
-     "endmodule\n"},
-    {"`ifdef FOO\n"
-     "    `ifndef BAR\n"
-     "    `endif\n"
-     "`endif\n",
-     "`ifdef FOO\n"
-     "`ifndef BAR\n"
-     "`endif\n"
-     "`endif\n"},
-    {"module foo(\n"
-     "       `include \"ports.svh\"\n"
-     "         ) ; endmodule\n",
-     "module foo (\n"
-     "    `include \"ports.svh\"\n"
-     ");\n"
-     "endmodule\n"},
-    {"module foo(\n"
-     "       `define FOO\n"
-     "`undef\tFOO\n"
-     "         ) ; endmodule\n",
-     "module foo (\n"
-     "    `define FOO\n"
-     "    `undef FOO\n"
-     ");\n"
-     "endmodule\n"},
-    {"module foo(  input x  , output y ) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input  x,\n"  // aligned
-     "    output y\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(\n"
-     "// comment\n"
-     "  input x  , output y ) ;endmodule:foo\n",
-     "module foo (\n"
-     "    // comment\n"
-     "    input  x,\n"  // aligned
-     "    output y\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input[2:0]x  , output y [3:0] ) ;endmodule:foo\n",
-     // each port item should be on its own line
-     "module foo (\n"
-     "    input  [2:0] x,\n"  // aligned
-     "    output       y[3:0]\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input wire x  , output reg yy ) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input  wire x,\n"  // aligned
-     "    output reg  yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input wire x  ,//c1\n"
-     "output reg yyy //c2\n"
-     " ) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input  wire x,   //c1\n"  // aligned
-     "    output reg  yyy  //c2\n"  // aligned
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input wire x  ,/* c1 */\n"
-     "output reg yyy /* c2 */\n"
-     " ) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input  wire x,   /* c1 */\n"  // aligned
-     "    output reg  yyy  /* c2 */\n"  // aligned
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(\n"
-     "// comment\n"
-     "input wire x  ,//c1\n"
-     "output reg yyy //c2\n"
-     " ) ;endmodule:foo\n",
-     "module foo (\n"
-     "    // comment\n"
-     "    input  wire x,   //c1\n"  // aligned
-     "    output reg  yyy  //c2\n"  // aligned
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(\n"
-     "/* comment */\n"
-     "input wire x  ,/* c1 */\n"
-     "output reg yyy /* c2 */\n"
-     " ) ;endmodule:foo\n",
-     "module foo (\n"
-     "    /* comment */\n"
-     "    input  wire x,   /* c1 */\n"  // aligned
-     "    output reg  yyy  /* c2 */\n"  // aligned
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input wire x  ,/* c1\n"
-     "c2\n"
-     "c3 */\n"
-     "output reg yyy /* c4 */\n"
-     " ) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input  wire x,   /* c1\n"
-     "c2\n"
-     "c3 */\n"  // TODO: align multiline comments
-     "    output reg  yyy  /* c4 */\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input wire x  ,/* c1 */\n"
-     "output reg yyy,\n"
-     "output z // c2\n"
-     " ) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input  wire x,    /* c1 */\n"  // aligned
-     "    output reg  yyy,\n"
-     "    output      z     // c2\n"  // aligned
-     ");\n"
-     "endmodule : foo\n"},
-    {"module m(input logic [4:0] foo,  // comment\n"
-     "input logic bar // comment\n"
-     " ) ;endmodule:m\n",
-     "module m (\n"
-     "    input logic [4:0] foo,  // comment\n"  // aligned
-     "    input logic       bar   // comment\n"  // aligned
-     ");\n"
-     "endmodule : m\n"},
-    {"module foo(  input wire x  , output yy ) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input  wire x,\n"  // aligned
-     "    output      yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input   x  , output reg yy ) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input      x,\n"  // aligned
-     "    output reg yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input   x  , output reg[a:b]yy ) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input            x,\n"  // aligned
-     "    output reg [a:b] yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input   [a:b]x  , output reg  yy ) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input      [a:b] x,\n"  // aligned
-     "    output reg       yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input   x  , "
-     "  output logic  yy ) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input        x,\n"  // aligned
-     "    output logic yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input   [a:c]x  , "
-     "  output logic[a-b: c]  yy ) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input        [  a:c] x,\n"  // aligned
-     "    output logic [a-b:c] yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input   [a:c]x  , "
-     "  output logic[a - b: c]  yy ) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input        [    a:c] x,\n"  // aligned
-     "    output logic [a - b:c] yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input   [a:c]x  , input zzz ,"
-     "  output logic[a - b: c]  yy ) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input        [    a:c] x,\n"    // aligned []'s
-     "    input                  zzz,\n"  // aligned ids
-     "    output logic [a - b:c] yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input   [a:b]x  , "
-     "  output reg[e: f]  yy ) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input      [a:b] x,\n"  // aligned
-     "    output reg [e:f] yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input   tri[aa: bb]x  , "
-     "  output reg[e: f]  yy ) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input  tri [aa:bb] x,\n"  // aligned
-     "    output reg [  e:f] yy\n"  // TODO(b/70310743): align ':'
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input   [a:b][c:d]x  , "
-     "  output reg[e: f]  yy ) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input      [a:b][c:d] x,\n"  // aligned
-     "    output reg [e:f]      yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input wire x  [j:k], output reg yy ) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input  wire x [j:k],\n"  // aligned
-     "    output reg  yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input wire x  , output reg yy [j:k]) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input  wire x,\n"  // aligned
-     "    output reg  yy[j:k]\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input wire x  [p:q], output reg yy [j:k]) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input  wire x [p:q],\n"  // aligned
-     "    output reg  yy[j:k]\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input wire x  [p:q][r:s], output reg yy [j:k]) "
-     ";endmodule:foo\n",
-     "module foo (\n"
-     "    input  wire x [p:q][r:s],\n"  // aligned
-     "    output reg  yy[j:k]\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input wire x  [p:q][rr:ss], output reg yy [jj:kk][m:n]) "
-     ";endmodule:foo\n",
-     "module foo (\n"
-     // TODO(b/70310743): align :'s
-     "    input  wire x [  p:q][rr:ss],\n"
-     "    output reg  yy[jj:kk][  m:n]\n"  // aligned
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input wire   [p:q]x, output reg yy [j:k]) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input  wire [p:q] x,\n"  // aligned
-     "    output reg        yy[j:k]\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input wire  x [p:q], output reg[j:k]yy) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input  wire       x [p:q],\n"  // aligned
-     "    output reg  [j:k] yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input pkg::bar_t  x , output reg  yy) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input  pkg::bar_t x,\n"  // aligned
-     "    output reg        yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input wire  x , output pkg::bar_t  yy) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input  wire       x,\n"  // aligned
-     "    output pkg::bar_t yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input pkg::bar_t#(1)  x , output reg  yy) ;endmodule:foo\n",
-     "module foo (\n"  // with parameterized port type
-     "    input  pkg::bar_t#(1) x,\n"
-     "    output reg            yy\n"  // aligned
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input signed x , output reg  yy) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input  signed x,\n"  // aligned
-     "    output reg    yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input signed x , output reg [m:n] yy) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input  signed       x,\n"  // aligned
-     "    output reg    [m:n] yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input int signed x , output reg [m:n] yy) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input  int signed       x,\n"  // aligned
-     "    output reg        [m:n] yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(  input signed x , output pkg::bar_t  yy) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input  signed     x,\n"  // aligned
-     "    output pkg::bar_t yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module somefunction ("
-     "logic clk, int   a, int b);endmodule",
-     "module somefunction (\n"
-     "    logic clk,\n"  // direction missing
-     "    int   a,\n"    // direction missing
-     "    int   b\n"     // direction missing
-     ");\n"
-     "endmodule\n"},
-    {"module somefunction ("
-     "logic clk, input int   a, int b);endmodule",
-     "module somefunction (\n"
-     "          logic clk,\n"  // direction missing
-     "    input int   a,\n"
-     "          int   b\n"  // direction missing
-     ");\n"
-     "endmodule\n"},
-    {"module somefunction ("
-     "input logic clk, input int   a, int b);endmodule",
-     "module somefunction (\n"
-     "    input logic clk,\n"
-     "    input int   a,\n"
-     "          int   b\n"  // direction missing
-     ");\n"
-     "endmodule\n"},
-    {"module somefunction ("
-     "input clk, input int   a, int b);endmodule",
-     "module somefunction (\n"
-     "    input     clk,\n"  // type missing
-     "    input int a,\n"
-     "          int b\n"
-     ");\n"
-     "endmodule\n"},
-    {"module somefunction ("
-     "input logic clk, input a, int b);endmodule",
-     "module somefunction (\n"
-     "    input logic clk,\n"
-     "    input       a,\n"  // type missing
-     "          int   b\n"   // direction missing
-     ");\n"
-     "endmodule\n"},
-    {"module t;\n"
-     "    input bit i_bit;\n"
-     "input   byte  i_byte ;\n"
-     "input chandle i_chandle;\n"
-     "input event i_event;\n"
-     "input int i_int;\n"
-     "input integer i_inte;\n"
-     "input longint i_longint;\n"
-     "input real i_real;\n"
-     "input realtime i_realtime;\n"
-     "input shortint i_shortint;\n"
-     "input shortreal i_shortreal;\n"
-     "input string i_string;\n"
-     "input time i_time;\n"
-     "     output bit o_bit;\n"
-     "output    byte   o_byte  ;  \n"
-     "output chandle o_chandle;\n"
-     "output event o_event;\n"
-     "output int o_int;\n"
-     "output integer o_inte;\n"
-     "output longint o_longint;\n"
-     "output real o_real;\n"
-     "output realtime o_realtime;\n"
-     "output shortint o_shortint;\n"
-     "output shortreal o_shortreal;\n"
-     "output string o_string;\n"
-     "output time o_time;\n"
-     "endmodule\n",
-     "module t;\n"
-     "  input bit i_bit;\n"
-     "  input byte i_byte;\n"
-     "  input chandle i_chandle;\n"
-     "  input event i_event;\n"
-     "  input int i_int;\n"
-     "  input integer i_inte;\n"
-     "  input longint i_longint;\n"
-     "  input real i_real;\n"
-     "  input realtime i_realtime;\n"
-     "  input shortint i_shortint;\n"
-     "  input shortreal i_shortreal;\n"
-     "  input string i_string;\n"
-     "  input time i_time;\n"
-     "  output bit o_bit;\n"
-     "  output byte o_byte;\n"
-     "  output chandle o_chandle;\n"
-     "  output event o_event;\n"
-     "  output int o_int;\n"
-     "  output integer o_inte;\n"
-     "  output longint o_longint;\n"
-     "  output real o_real;\n"
-     "  output realtime o_realtime;\n"
-     "  output shortint o_shortint;\n"
-     "  output shortreal o_shortreal;\n"
-     "  output string o_string;\n"
-     "  output time o_time;\n"
-     "endmodule\n"},
-    {"module t (\n"
-     "    input bit i_bit,\n"
-     "input     byte   i_byte  ,\n"
-     "input chandle i_chandle,\n"
-     "input event i_event,\n"
-     "input int i_int,\n"
-     "input integer i_inte,\n"
-     "input longint i_longint,\n"
-     "input real i_real,\n"
-     "input realtime i_realtime,\n"
-     "input shortint i_shortint,\n"
-     "input shortreal i_shortreal,\n"
-     "input string i_string,\n"
-     "input time i_time,\n"
-     "    output bit o_bit,\n"
-     "output     byte   o_byte  ,  \n"
-     "output chandle o_chandle,\n"
-     "output event o_event,\n"
-     "output int o_int,\n"
-     "output integer o_inte,\n"
-     "output longint o_longint,\n"
-     "output real o_real,\n"
-     "output realtime o_realtime,\n"
-     "output shortint o_shortint,\n"
-     "output shortreal o_shortreal,\n"
-     "output string o_string,\n"
-     "output time o_time);\n"
-     "endmodule\n",
-     "module t (\n"
-     "    input  bit       i_bit,\n"
-     "    input  byte      i_byte,\n"
-     "    input  chandle   i_chandle,\n"
-     "    input  event     i_event,\n"
-     "    input  int       i_int,\n"
-     "    input  integer   i_inte,\n"
-     "    input  longint   i_longint,\n"
-     "    input  real      i_real,\n"
-     "    input  realtime  i_realtime,\n"
-     "    input  shortint  i_shortint,\n"
-     "    input  shortreal i_shortreal,\n"
-     "    input  string    i_string,\n"
-     "    input  time      i_time,\n"
-     "    output bit       o_bit,\n"
-     "    output byte      o_byte,\n"
-     "    output chandle   o_chandle,\n"
-     "    output event     o_event,\n"
-     "    output int       o_int,\n"
-     "    output integer   o_inte,\n"
-     "    output longint   o_longint,\n"
-     "    output real      o_real,\n"
-     "    output realtime  o_realtime,\n"
-     "    output shortint  o_shortint,\n"
-     "    output shortreal o_shortreal,\n"
-     "    output string    o_string,\n"
-     "    output time      o_time\n"
-     ");\n"
-     "endmodule\n"},
-    {"module m;foo bar(.baz({larry, moe, curly}));endmodule",
-     "module m;\n"
-     "  foo bar (.baz({larry, moe, curly}));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.baz({larry,// expand this\n"
-     "moe, curly}));endmodule",
-     "module m;\n"
-     "  foo bar (\n"
-     "      .baz({\n"
-     "        larry,  // expand this\n"
-     "        moe,\n"
-     "        curly\n"
-     "      })\n"
-     "  );\n"
-     "endmodule\n"},
-    {"parameter priv_reg_t impl_csr[] = {\n"
-     "// Machine mode mode CSR\n"
-     "MVENDORID, //\n"
-     "MARCHID,   //\n"
-     "DSCRATCH0, //\n"
-     "DSCRATCH1  //\n"
-     "};",
-     "parameter priv_reg_t impl_csr[] = {\n"
-     "  // Machine mode mode CSR\n"
-     "  MVENDORID,  //\n"
-     "  MARCHID,  //\n"
-     "  DSCRATCH0,  //\n"
-     "  DSCRATCH1  //\n"
-     "};\n"},
-    {"parameter priv_reg_t impl_csr[] = {\n"
-     "// Expand elements\n"
-     "MVENDORID,\n"
-     "MARCHID,\n"
-     "DSCRATCH0,\n"
-     "DSCRATCH1\n"
-     "};",
-     "parameter priv_reg_t impl_csr[] = {\n"
-     "  // Expand elements\n"
-     "  MVENDORID,\n"
-     "  MARCHID,\n"
-     "  DSCRATCH0,\n"
-     "  DSCRATCH1\n"
-     "};\n"},
-    /* TODO(b/158131099): to fix these, reinterpret 'b' as a kPortDeclaration
-    {"module somefunction ("
-     "input logic clk, input a, b);endmodule",
-     "module somefunction (\n"
-     "    input logic clk,\n"
-     "    input       a,\n"  // type missing
-     "                b\n"  // type and direction missing
-     ");\n"
-     "endmodule\n"},
-    {"module somefunction ("
-     "input logic clk, int a, b);endmodule",
-     "module somefunction (\n"
-     "    input logic clk,\n"
-     "          int   a,\n"  // direction missing
-     "                b\n"  // type and direction missing
-     ");\n"
-     "endmodule\n"},
-     */
-    {"module foo(\n"
-     "//c1\n"
-     "input wire x , \n"
-     "//c2\n"
-     "output reg  yy\n"
-     "//c3\n"
-     ") ;endmodule:foo\n",
-     "module foo (\n"
-     "    //c1\n"
-     "    input  wire x,\n"  // aligned, ignoring comments
-     "    //c2\n"
-     "    output reg  yy\n"
-     "    //c3\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(\n"
-     "//c1\n"
-     "input wire x , \n"
-     "//c2a\n"  // longer comment
-     "//c2b\n"
-     "output reg  yy\n"
-     "//c3\n"
-     ") ;endmodule:foo\n",
-     "module foo (\n"
-     "    //c1\n"
-     "    input  wire x,\n"  // aligned, ignoring comments
-     "    //c2a\n"           // note: separated by 2 lines of comments
-     "    //c2b\n"
-     "    output reg  yy\n"
-     "    //c3\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(\n"
-     "`ifdef   FOO\n"
-     "input wire x , \n"
-     " `else\n"
-     "output reg  yy\n"
-     " `endif\n"
-     ") ;endmodule:foo\n",
-     "module foo (\n"
-     "`ifdef FOO\n"
-     "    input  wire x,\n"  // aligned, ignoring preprocessor conditionals
-     "`else\n"
-     "    output reg  yy\n"
-     "`endif\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(\n"
-     "input w , \n"
-     "`define   FOO BAR\n"
-     "input wire x , \n"
-     " `include  \"stuff.svh\"\n"
-     "output reg  yy\n"
-     " `undef    FOO\n"
-     "output zz\n"
-     ") ;endmodule:foo\n",
-     "module foo (\n"
-     "    input       w,\n"  // aligned, ignoring preprocessor directives
-     "    `define FOO BAR\n"
-     "    input  wire x,\n"
-     "    `include \"stuff.svh\"\n"
-     "    output reg  yy\n"
-     "    `undef FOO\n"
-     "    output      zz\n"  // aligned, ignoring preprocessor directives
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(\n"
-     "input wire x , \n  \n"  // blank line, separating alignment groups
-     "output reg  yy\n"
-     ") ;endmodule:foo\n",
-     "module foo (\n"
-     "    input wire x,\n"  // not aligned, due to blank line separating groups
-     "\n"
-     "    output reg yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(\n"
-     "input wire x1 [r:s],\n"
-     "input [p:q] x2 , \n  \n"  // blank line, separating alignment groups
-     "output reg  [jj:kk]yy1,\n"
-     "output pkg::barr_t [mm:nn] yy2\n"
-     ") ;endmodule:foo\n",
-     "module foo (\n"
-     "    input wire       x1[r:s],\n"  // aligned in this group, but not across
-                                        // groups
-     "    input      [p:q] x2,\n"
-     "\n"
-     "    output reg         [jj:kk] yy1,\n"
-     "    output pkg::barr_t [mm:nn] yy2\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo(\n"  // same as previous, with comments
-     " //c1\n"
-     "input wire x1 [r:s],\n"
-     "input [p:q] x2 , \n"
-     " //c2\n\n"  // blank line, separating alignment groups
-     " //c3\n"
-     "output reg  [jj:kk]yy1,\n"
-     " //c4\n"
-     "output pkg::barr_t [mm:nn] yy2\n"
-     ") ;endmodule:foo\n",
-     "module foo (\n"
-     "    //c1\n"
-     "    input wire       x1[r:s],\n"  // aligned in this group, but not across
-                                        // groups
-     "    input      [p:q] x2,\n"
-     "    //c2\n"
-     "\n"
-     "    //c3\n"
-     "    output reg         [jj:kk] yy1,\n"
-     "    //c4\n"
-     "    output pkg::barr_t [mm:nn] yy2\n"
-     ");\n"
-     "endmodule : foo\n"},
-
-    {// align null-statement (issue #824)
-     "class sample;"
-     "bit a;;"
-     "bit b;"
-     "endclass",
-     "class sample;\n"
-     "  bit a;\n"
-     "  ;\n"
-     "  bit b;\n"
-     "endclass\n"},
-    {"class sample;"
-     "bit a;;"
-     "endclass",
-     "class sample;\n"
-     "  bit a;\n"
-     "  ;\n"
-     "endclass\n"},
-    {"class sample;"
-     "bit a;"
-     "bit b;;"
-     "endclass",
-     "class sample;\n"
-     "  bit a;\n"
-     "  bit b;\n"
-     "  ;\n"
-     "endclass\n"},
-
-    {// aligning here just barely fits in the 40col limit
-     "module foo(  input int signed x [a:b],"
-     "output reg [mm:nn] yy) ;endmodule:foo\n",
-     "module foo (\n"
-     // ---------------40col----------------->
-     "    input  int signed         x [a:b],\n"  // aligned, still fits
-     "    output reg        [mm:nn] yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {// when aligning would result in exceeding column limit, don't align for
-     // now
-     "module foo(  input int signed x [aa:bb],"
-     "output reg [mm:nn] yy) ;endmodule:foo\n",
-     "module foo (\n"
-     // ---------------40col----------------->
-     //   input  int signed         x [aa:bb],\n"
-     //   output reg        [mm:nn] yy\n"
-     "    input  int signed         x [aa:bb],\n"  // aligned, still fits
-     "    output reg        [mm:nn] yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {// when aligning would result in exceeding column limit, don't align for
-     // now
-     "module foo(  input int signed x [aa:bb],"
-     "output reg [mm:nn] yyy) ;endmodule:foo\n",
-     "module foo (\n"
-     // ---------------40col----------------->
-     //   input  int signed         x  [aa:bb],\n"  // over limit, by comma
-     //   output reg        [mm:nn] yyy\n"
-     "    input int signed x[aa:bb],\n"  // aligned would be 41 columns
-     "    output reg [mm:nn] yyy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {// when aligning would result in exceeding column limit, don't align for
-     // now
-     "module foo(  input int signed x [a:b],//c\n"
-     "output reg [m:n] yy) ;endmodule:foo\n",
-     "module foo (\n"
-     // ---------------40col---------------->
-     //   input  int signed       x [a:b],  //c\n"  // over limit, by comment
-     //   output reg        [m:n] yy\n"
-     "    input int signed x[a:b],  //c\n"  // aligned would be 42 columns
-     "    output reg [m:n] yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {// aligning interfaces in port headers like types
-     // TODO(b/161181877): flush interface port type left (multi-column)
-     "module foo(  input clk , inter.face yy) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input            clk,\n"  // aligned
-     "          inter.face yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {// aligning interfaces in port headers like types
-     // TODO(b/161181877): flush interface port type left (multi-column)
-     "module foo(  input wire   clk , inter.face yy) ;endmodule:foo\n",
-     "module foo (\n"
-     "    input wire       clk,\n"  // aligned
-     "          inter.face yy\n"
-     ");\n"
-     "endmodule : foo\n"},
-
-    // module local variable/net declaration alignment test cases
-    {"module m;\n"
-     "logic a;\n"
-     "bit b;\n"
-     "endmodule\n",
-     "module m;\n"
-     "  logic a;\n"
-     "  bit   b;\n"
-     "endmodule\n"},
-    {"module m;\n"
-     "logic a;\n"
-     "bit b;\n"
-     "initial e=f;\n"  // separates alignment groups
-     "wire c;\n"
-     "bit d;\n"
-     "endmodule\n",
-     "module m;\n"
-     "  logic a;\n"
-     "  bit   b;\n"
-     "  initial e = f;\n"  // separates alignment groups
-     "  wire c;\n"
-     "  bit  d;\n"
-     "endmodule\n"},
-    {"module m;\n"
-     "// hello a\n"
-     "logic a;\n"
-     "// hello b\n"
-     "bit b;\n"
-     "endmodule\n",
-     "module m;\n"
-     "  // hello a\n"
-     "  logic a;\n"
-     "  // hello b\n"
-     "  bit   b;\n"  // aligned across comments
-     "endmodule\n"},
-    {"module m;\n"
-     "// hello a\n"
-     "logic a;\n"
-     "\n"  // extra blank line
-     "// hello b\n"
-     "bit b;\n"
-     "endmodule\n",
-     "module m;\n"
-     "  // hello a\n"
-     "  logic a;\n"
-     "\n"              // extra blank line
-     "  // hello b\n"  // aligned across blank lines
-     "  bit   b;\n"    // aligned across comments
-     "endmodule\n"},
-    {"module m;\n"
-     "logic [x:y]a;\n"  // packed dimensions
-     "bit b;\n"
-     "endmodule\n",
-     "module m;\n"
-     "  logic [x:y] a;\n"
-     "  bit         b;\n"
-     "endmodule\n"},
-    {"module m;\n"
-     "logic a;\n"
-     "bit [pp:qq]b;\n"  // packed dimensions
-     "endmodule\n",
-     "module m;\n"
-     "  logic         a;\n"
-     "  bit   [pp:qq] b;\n"
-     "endmodule\n"},
-    {"module m;\n"
-     "logic [x:y]a;\n"  // packed dimensions
-     "bit [pp:qq]b;\n"  // packed dimensions
-     "endmodule\n",
-     "module m;\n"
-     "  logic [  x:y] a;\n"
-     "  bit   [pp:qq] b;\n"
-     "endmodule\n"},
-    {"module m;\n"
-     "logic [x:y]a;\n"         // packed dimensions
-     "wire [pp:qq] [e:f]b;\n"  // packed dimensions, 2D
-     "endmodule\n",
-     "module m;\n"
-     "  logic [  x:y]      a;\n"
-     "  wire  [pp:qq][e:f] b;\n"
-     "endmodule\n"},
-    {"module m;\n"
-     "logic a [x:y];\n"  // unpacked dimensions
-     "bit bbb;\n"
-     "endmodule\n",
-     "module m;\n"
-     "  logic a   [x:y];\n"
-     "  bit   bbb;\n"
-     "endmodule\n"},
-    {"module m;\n"
-     "logic aaa ;\n"
-     "wire w [yy:zz];\n"  // unpacked dimensions
-     "endmodule\n",
-     "module m;\n"
-     "  logic aaa;\n"
-     "  wire  w   [yy:zz];\n"
-     "endmodule\n"},
-    {"module m;\n"
-     "logic aaa [s:t] ;\n"  // unpacked dimensions
-     "wire w [yy:zz];\n"    // unpacked dimensions
-     "endmodule\n",
-     "module m;\n"
-     "  logic aaa[  s:t];\n"
-     "  wire  w  [yy:zz];\n"
-     "endmodule\n"},
-    {"module m;\n"
-     "logic aaa [s:t] ;\n"     // unpacked dimensions
-     "wire w [yy:zz][u:v];\n"  // unpacked dimensions, 2D
-     "endmodule\n",
-     "module m;\n"
-     "  logic aaa[  s:t];\n"
-     "  wire  w  [yy:zz] [u:v];\n"
-     // TODO(b/165323560): unwanted space between unpacked dimensions of 'w'
-     "endmodule\n"},
-    {"module m;\n"
-     "qqq::rrr s;\n"     // user-defined type
-     "wire [pp:qq]w;\n"  // packed dimensions
-     "endmodule\n",
-     "module m;\n"
-     "  qqq::rrr         s;\n"
-     "  wire     [pp:qq] w;\n"
-     "endmodule\n"},
-    {"module m;\n"
-     "qqq#(rr) s;\n"     // parameterized type
-     "wire [pp:qq]w;\n"  // packed dimensions
-     "endmodule\n",
-     "module m;\n"
-     "  qqq #(rr)         s;\n"
-     "  wire      [pp:qq] w;\n"
-     "endmodule\n"},
-    {"module m;\n"
-     "logic a;\n"
-     "bit b;\n"
-     "my_module  my_inst( );\n"  // module instance separates alignment groups
-     "wire c;\n"
-     "bit d;\n"
-     "endmodule\n",
-     "module m;\n"
-     "  logic a;\n"  // these two are aligned
-     "  bit   b;\n"
-     "  my_module my_inst ();\n"  // module instance separates alignment groups
-     "  wire c;\n"                // these two are aligned
-     "  bit  d;\n"
-     "endmodule\n"},
-    {"module m;\n"
-     "logic aaa = expr1;\n"
-     "bit b = expr2;\n"
-     "endmodule\n",
-     "module m;\n"
-     "  logic aaa = expr1;\n"
-     "  bit   b = expr2;\n"  // no alignment at '=' yet
-     "endmodule\n"},
-    {"(* foo='{\"bar_.*\"} *)\n"  // funny attribute
-     "module mattr;\n"
-     "(* attr1=\"value1\" *)\n"  // attribute ignored
-     "ex_input_pins_t ex_input_pins;\n"
-     "(* attr2=\"value2\" *)\n"  // attribute ignored
-     "ex_output_pins_t ex_output_pins;\n"
-     "(* attr3=\"value3\" *)\n"  // attribute ignored
-     "ex wrap_ex ( );\n"
-     "endmodule\n",
-     "(* foo='{\"bar_.*\"} *)\n"
-     "module mattr;\n"
-     "  (* attr1=\"value1\" *)\n"           // indented
-     "  ex_input_pins_t  ex_input_pins;\n"  // aligned
-     "  (* attr2=\"value2\" *)\n"           // indented
-     "  ex_output_pins_t ex_output_pins;\n"
-     "  (* attr3=\"value3\" *)\n"  // indented
-     "  ex wrap_ex ();\n"
-     "endmodule\n"},
-    {"module mattr;\n"
-     "ex_input_pins_t ex_input_pins;\n"
-     "ex_output_pins_t ex_output_pins;\n"
-     "(* package_definition=\"ex_pkg\" *)\n"  // attribute ignored
-     "ex wrap_ex (\n"
-     ".clk(ex_input_pins.clk),\n"
-     ".rst(ex_input_pins.rst),\n"
-     ".in(ex_input_pins.in)\n"
-     ");\n"
-     "endmodule\n",
-     "module mattr;\n"
-     "  ex_input_pins_t  ex_input_pins;\n"  // aligned
-     "  ex_output_pins_t ex_output_pins;\n"
-     "  (* package_definition=\"ex_pkg\" *)\n"  // indented
-     "  ex wrap_ex (\n"
-     "      .clk(ex_input_pins.clk),\n"
-     "      .rst(ex_input_pins.rst),\n"
-     "      .in (ex_input_pins.in)\n"  // aligned
-     "  );\n"
-     "endmodule\n"},
-    {"module test;\n"
-     "bind entropy_src tlul_assert #(.EndpointType(\"Device\"))\n"
-     "tlul_assert_device (.clk_i, .rst_ni, .h2d(tl_i), .d2h(tl_o));\n"
-     "endmodule\n",
-     "module test;\n"
-     "  bind entropy_src tlul_assert #(\n"
-     "      .EndpointType(\"Device\")\n"
-     "  ) tlul_assert_device (\n"
-     "      .clk_i,\n"
-     "      .rst_ni,\n"
-     "      .h2d(tl_i),\n"
-     "      .d2h(tl_o)\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module test;\n"
-     "bind entropy_src tlul_assert #(.EndpointType(\"Device\"))\n"
-     "tlul_assert_device (.clk_i, .rst_ni,\n\n .h2d(tl_i),\n\n .d2h(tl_o));\n"
-     "endmodule\n",
-     "module test;\n"
-     "  bind entropy_src tlul_assert #(\n"
-     "      .EndpointType(\"Device\")\n"
-     "  ) tlul_assert_device (\n"
-     "      .clk_i,\n"
-     "      .rst_ni,\n"
-     "\n"
-     "      .h2d(tl_i),\n"
-     "\n"
-     "      .d2h(tl_o)\n"
-     "  );\n"
-     "endmodule\n"},
-    {"bind expand_me long_name #(.W(W_CONST), .D(D_CONST)) instaaance_name ("
-     ".in(iiiiiiiin),\n\n .out(ooooooout),\n .clk(ccccccclk),\n\n"
-     ".in1234 (in),\n //c1\n .out1234(out),\n .clk1234(clk),);",
-     "bind expand_me long_name #(\n"
-     "    .W(W_CONST),\n"
-     "    .D(D_CONST)\n"
-     ") instaaance_name (\n"
-     "    .in(iiiiiiiin),\n"
-     "\n"
-     "    .out(ooooooout),\n"
-     "    .clk(ccccccclk),\n"
-     "\n"
-     "    .in1234 (in),\n"
-     "    //c1\n"
-     "    .out1234(out),\n"
-     "    .clk1234(clk),\n"
-     ");\n"},
-    {"initial // clock generation\n begin\n clk = 0;\n forever begin\n"
-     "#4ns clk = !clk;\n end\n end\n",
-     "initial  // clock generation\n"
-     "  begin\n"
-     "    clk = 0;\n"
-     "    forever begin\n"
-     "      #4ns clk = !clk;\n"
-     "    end\n"
-     "  end\n"},
-    {"module foo #(int x,int y) ;endmodule:foo\n",  // parameters
-     "module foo #(\n"
-     "    int x,\n"
-     "    int y\n"
-     ");\n"  // each parameter on its own line
-     "endmodule : foo\n"},
-    {"module foo #(int x)(input y) ;endmodule:foo\n",
-     // parameter and port
-     "module foo #(\n"
-     "    int x\n"
-     ") (\n"
-     "    input y\n"
-     ");\n"  // each paramater and port item should be on its own line
-     "endmodule : foo\n"},
-    {"module foo #(parameter int x,parameter int y) ;endmodule:foo\n",
-     // parameters don't fit (also should be on its own line)
-     "module foo #(\n"
-     "    parameter int x,\n"
-     "    parameter int y\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo #(parameter int xxxx,parameter int yyyy) ;endmodule:foo\n",
-     // parameters don't fit
-     "module foo #(\n"
-     "    parameter int xxxx,\n"
-     "    parameter int yyyy\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo #(parameter int x = $clog2  (N) ,parameter int y ) "
-     ";endmodule:foo\n",
-     // parameters don't fit
-     "module foo #(\n"
-     "    parameter int x = $clog2(N),\n"  // no space after $clog2
-     "    parameter int y\n"
-     ");\n"
-     "endmodule : foo\n"},
-    {"module foo #(//comment\n"
-     "parameter bar =1,\n"
-     "localparam baz =2"
-     ") ();"
-     "endmodule",
-     "module foo #(  //comment\n"
-     "    parameter  bar = 1,\n"
-     "    localparam baz = 2\n"
-     ") ();\n"
-     "endmodule\n"},
-    {"module foo #("
-     "parameter  bar =1,//comment\n"
-     "localparam baz =2"
-     ") ();"
-     "endmodule",
-     "module foo #(\n"
-     "    parameter  bar = 1,  //comment\n"
-     "    localparam baz = 2\n"
-     ") ();\n"
-     "endmodule\n"},
-    {"module foo #("
-     "parameter  bar =1,"
-     "localparam baz =2//comment\n"
-     ") ();"
-     "endmodule",
-     "module foo #(\n"
-     "    parameter  bar = 1,\n"
-     "    localparam baz = 2   //comment\n"
-     ") ();\n"
-     "endmodule\n"},
-    {"module foo #("
-     "parameter  bar =1//comment\n"
-     ",localparam baz =2\n"
-     ") ();"
-     "endmodule",
-     "module foo #(\n"
-     "      parameter  bar = 1  //comment\n"
-     "    , localparam baz = 2\n"
-     ") ();\n"
-     "endmodule\n"},
-    {"module foo;"
-     // fit in one line
-     "parameter int i = '{\n"
-     "1,\n"
-     "2,\n"
-     "3\n"
-     "};\n"
-     "endmodule",
-     "module foo;\n"
-     "  parameter int i = '{1, 2, 3};\n"
-     "endmodule\n"},
-    {"module foo;"
-     // too long for one line, expand
-     "localparam logic [63:0] RC[24] = '{\n"
-     "64'h 1,\n"
-     "64'h 2,\n"
-     "64'h 3\n"
-     "};\n"
-     "endmodule",
-     "module foo;\n"
-     "  localparam logic [63:0] RC[24] = '{\n"
-     "      64'h1,\n"
-     "      64'h2,\n"
-     "      64'h3\n"
-     "  };\n"
-     "endmodule\n"},
-    {"module foo;"
-     "parameter int i = '{\n"
-     // force expansion
-     "1, //\n"
-     "2,\n"
-     "3\n"
-     "};\n"
-     "endmodule",
-     "module foo;\n"
-     "  parameter int i = '{\n"
-     "      1,  //\n"
-     "      2,\n"
-     "      3\n"
-     "  };\n"
-     "endmodule\n"},
-    {"module foo;"
-     "localparam logic [63:0] RC[24] = '{\n"
-     "64'h 0000_0000_0000_0001, // 0\n"
-     "64'h 0000_0000_0000_8082, // 1\n"
-     "64'h 8000_0000_8000_8008 // 23\n"
-     "};\n"
-     "endmodule",
-     "module foo;\n"
-     "  localparam logic [63:0] RC[24] = '{\n"
-     "      64'h0000_0000_0000_0001,  // 0\n"
-     "      64'h0000_0000_0000_8082,  // 1\n"
-     "      64'h8000_0000_8000_8008  // 23\n"
-     "  };\n"
-     "endmodule\n"},
-    {"module foo;"
-     // nest two patterns
-     "parameter logic [11:0] i = '{\n"
-     "'{1,2,3},\n"
-     "'{1,2,3}\n"
-     "};\n"
-     "endmodule",
-     "module foo;\n"
-     "  parameter logic [11:0] i = '{\n"
-     "      '{1, 2, 3},\n"
-     "      '{1, 2, 3}\n"
-     "  };\n"
-     "endmodule\n"},
-    {"module foo;"
-     // nest two patterns, expand interior
-     "parameter logic [11:0] i = '{\n"
-     "'{1, //\n"
-     " 2,3},\n"
-     "'{1,2,3}\n"
-     "};\n"
-     "endmodule",
-     "module foo;\n"
-     "  parameter logic [11:0] i = '{\n"
-     "      '{\n"
-     "          1,  //\n"
-     "          2,\n"
-     "          3\n"
-     "      },\n"
-     "      '{1, 2, 3}\n"
-     "  };\n"
-     "endmodule\n"},
-    {"module foo;"
-     // nest two patterns, expand both
-     "parameter nest [2] i = '{\n"
-     "'{first : 32'h0000_0001,\n"
-     "  second : 32'h0000_0011,\n"
-     "  third: 32'h0000_0111},\n"
-     "'{first : 32'h1000_0001,\n"
-     "  second : 32'h1000_0011,\n"
-     "  third: 32'h1000_0111}\n"
-     "};\n"
-     "endmodule",
-     "module foo;\n"
-     "  parameter nest [2] i = '{\n"
-     "      '{\n"
-     "          first : 32'h0000_0001,\n"
-     "          second : 32'h0000_0011,\n"
-     "          third: 32'h0000_0111\n"
-     "      },\n"
-     "      '{\n"
-     "          first : 32'h1000_0001,\n"
-     "          second : 32'h1000_0011,\n"
-     "          third: 32'h1000_0111\n"
-     "      }\n"
-     "  };\n"
-     "endmodule\n"},
-    {"module foo;"
-     // nest three patterns
-     "parameter logic [11:0] i = '{\n"
-     "'{'{1,2,3},4}\n"
-     "};\n"
-     "endmodule",
-     "module foo;\n"
-     "  parameter logic [11:0] i = '{\n"
-     "      '{'{1, 2, 3}, 4}\n"
-     "  };\n"
-     "endmodule\n"},
-    {"module foo;"
-     // nest three patterns, expand interior
-     "parameter logic [11:0] i = '{\n"
-     "'{\n"
-     "'{first : 32'h0000_0001,\n"
-     "  second : 32'h0000_0011,\n"
-     "  third: 32'h0000_0111},\n"
-     "  4},\n"
-     "  5,\n"
-     "  '{1,2,3}\n"
-     "};\n"
-     "endmodule",
-     "module foo;\n"
-     "  parameter logic [11:0] i = '{\n"
-     "      '{\n"
-     "          '{\n"
-     "              first : 32'h0000_0001,\n"
-     "              second : 32'h0000_0011,\n"
-     "              third: 32'h0000_0111\n"
-     "          },\n"
-     "          4\n"
-     "      },\n"
-     "      5,\n"
-     "      '{1, 2, 3}\n"
-     "  };\n"
-     "endmodule\n"},
-    {"module    top;"
-     "foo#(  \"test\"  ) foo(  );"
-     "bar#(  \"test\"  ,5) bar(  );"
-     "endmodule\n",
-     "module top;\n"
-     "  foo #(\"test\") foo ();\n"  // module instantiation, string arg
-     "  bar #(\"test\", 5) bar ();\n"
-     "endmodule\n"},
-    {"module    top;"
-     "foo#(  `\"test`\"  ) foo(  );"
-     "bar#(  `\"test`\"  ,5) bar(  );"
-     "endmodule\n",
-     "module top;\n"
-     "  foo #(`\"test`\") foo ();\n"  // module instantiation, eval string arg
-     "  bar #(`\"test`\", 5) bar ();\n"
-     "endmodule\n"},
-    {"`ifdef FOO\n"
-     "  module bar;endmodule\n"
-     "`endif\n",
-     "`ifdef FOO\n"
-     "module bar;\n"
-     "endmodule\n"
-     "`endif\n"},
-    {"`ifdef FOO\n"
-     "  module bar;endmodule\n"
-     "`else module baz;endmodule\n"
-     "`endif\n",
-     "`ifdef FOO\n"
-     "module bar;\n"
-     "endmodule\n"
-     "`else\n"
-     "module baz;\n"
-     "endmodule\n"
-     "`endif\n"},
-    {"`ifdef FOO\n"
-     "  module bar;endmodule\n"
-     "`else /* glue me */ module baz;endmodule\n"
-     "`endif\n",
-     "`ifdef FOO\n"
-     "module bar;\n"
-     "endmodule\n"
-     "`else  /* glue me */\n"
-     "module baz;\n"
-     "endmodule\n"
-     "`endif\n"},
-    {"`ifdef FOO\n"
-     "  module bar;endmodule\n"
-     "`else// different unit\n"
-     "  module baz;endmodule\n"
-     "`endif\n",
-     "`ifdef FOO\n"
-     "module bar;\n"
-     "endmodule\n"
-     "`else  // different unit\n"
-     "module baz;\n"
-     "endmodule\n"
-     "`endif\n"},
-
-    // unary: + - !  ~ & | ^  ~& ~| ~^ ^~
-    {"module m;foo bar(.x(-{a,b}));endmodule",
-     "module m;\n"
-     "  foo bar (.x(-{a, b}));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(!{a,b}));endmodule",
-     "module m;\n"
-     "  foo bar (.x(!{a, b}));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(~{a,b}));endmodule",
-     "module m;\n"
-     "  foo bar (.x(~{a, b}));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(&{a,b}));endmodule",
-     "module m;\n"
-     "  foo bar (.x(&{a, b}));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(|{a,b}));endmodule",
-     "module m;\n"
-     "  foo bar (.x(|{a, b}));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(^{a,b}));endmodule",
-     "module m;\n"
-     "  foo bar (.x(^{a, b}));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(~&{a,b}));endmodule",
-     "module m;\n"
-     "  foo bar (.x(~&{a, b}));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(~|{a,b}));endmodule",
-     "module m;\n"
-     "  foo bar (.x(~|{a, b}));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(~^{a,b}));endmodule",
-     "module m;\n"
-     "  foo bar (.x(~^{a, b}));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(^~{a,b}));endmodule",
-     "module m;\n"
-     "  foo bar (.x(^~{a, b}));\n"
-     "endmodule\n"},
-
-    // binary: + - * / % & | ^ ^~ ~^ && ||
-    {"module m;foo bar(.x(a+b));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a + b));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(a-b));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a - b));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(a*b));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a * b));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(a/b));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a / b));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(a%b));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a % b));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(a&b));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a & b));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(a|b));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a | b));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(a^b));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a ^ b));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(a^~b));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a ^~ b));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(a~^b));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a ~^ b));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(a&&b));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a && b));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(a||b));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a || b));\n"
-     "endmodule\n"},
-
-    // {a} op {b}
-    {"module m;foo bar(.x({a}+{b}));endmodule",
-     "module m;\n"
-     "  foo bar (.x({a} + {b}));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x({a}-{b}));endmodule",
-     "module m;\n"
-     "  foo bar (.x({a} - {b}));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x({a}*{b}));endmodule",
-     "module m;\n"
-     "  foo bar (.x({a} * {b}));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x({a}/{b}));endmodule",
-     "module m;\n"
-     "  foo bar (.x({a} / {b}));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x({a}%{b}));endmodule",
-     "module m;\n"
-     "  foo bar (.x({a} % {b}));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x({a}&{b}));endmodule",
-     "module m;\n"
-     "  foo bar (.x({a} & {b}));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x({a}|{b}));endmodule",
-     "module m;\n"
-     "  foo bar (.x({a} | {b}));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x({a}^{b}));endmodule",
-     "module m;\n"
-     "  foo bar (.x({a} ^ {b}));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x({a}^~{b}));endmodule",
-     "module m;\n"
-     "  foo bar (.x({a} ^~ {b}));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x({a}~^{b}));endmodule",
-     "module m;\n"
-     "  foo bar (.x({a} ~^ {b}));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x({a}&&{b}));endmodule",
-     "module m;\n"
-     "  foo bar (.x({a} && {b}));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x({a}||{b}));endmodule",
-     "module m;\n"
-     "  foo bar (.x({a} || {b}));\n"
-     "endmodule\n"},
-
-    // (a) op (b)
-    {"module m;foo bar(.x((a)+(b)));endmodule",
-     "module m;\n"
-     "  foo bar (.x((a) + (b)));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x((a)-(b)));endmodule",
-     "module m;\n"
-     "  foo bar (.x((a) - (b)));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x((a)*(b)));endmodule",
-     "module m;\n"
-     "  foo bar (.x((a) * (b)));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x((a)/(b)));endmodule",
-     "module m;\n"
-     "  foo bar (.x((a) / (b)));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x((a)%(b)));endmodule",
-     "module m;\n"
-     "  foo bar (.x((a) % (b)));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x((a)&(b)));endmodule",
-     "module m;\n"
-     "  foo bar (.x((a) & (b)));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x((a)|(b)));endmodule",
-     "module m;\n"
-     "  foo bar (.x((a) | (b)));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x((a)^(b)));endmodule",
-     "module m;\n"
-     "  foo bar (.x((a) ^ (b)));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x((a)^~(b)));endmodule",
-     "module m;\n"
-     "  foo bar (.x((a) ^~ (b)));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x((a)~^(b)));endmodule",
-     "module m;\n"
-     "  foo bar (.x((a) ~^ (b)));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x((a)&&(b)));endmodule",
-     "module m;\n"
-     "  foo bar (.x((a) && (b)));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x((a)||(b)));endmodule",
-     "module m;\n"
-     "  foo bar (.x((a) || (b)));\n"
-     "endmodule\n"},
-
-    // a[b] op c
-    {"module m;foo bar(.x(a[b]+c));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a[b] + c));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(a[b]-c));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a[b] - c));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(a[b]*c));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a[b] * c));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(a[b]/c));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a[b] / c));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(a[b]%c));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a[b] % c));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(a[b]&c));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a[b] & c));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(a[b]|c));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a[b] | c));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(a[b]^c));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a[b] ^ c));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(a[b]^~c));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a[b] ^~ c));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(a[b]~^c));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a[b] ~^ c));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(a[b]&&c));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a[b] && c));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(a[b]||c));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a[b] || c));\n"
-     "endmodule\n"},
-
-    // misc
-    {"module m;foo bar(.x(a[1:0]^b[2:1]));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a[1:0] ^ b[2:1]));\n"
-     "endmodule\n"},
-
-    {"module m;foo bar(.x(a[b] | b[c]));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a[b] | b[c]));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x(a[b] & b[c]));endmodule",
-     "module m;\n"
-     "  foo bar (.x(a[b] & b[c]));\n"
-     "endmodule\n"},
-
-    {"module m;foo bar(.x((a^c)^(b^ ~c)));endmodule",
-     "module m;\n"
-     "  foo bar (.x((a ^ c) ^ (b ^ ~c)));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x((a^c)^(b^~c)));endmodule",
-     "module m;\n"
-     "  foo bar (.x((a ^ c) ^ (b ^~ c)));\n"
-     "endmodule\n"},
-    {"module m;foo bar(.x((a^{c,d})^(b^^{c,d})));endmodule",
-     "module m;\n"
-     "  foo bar (\n"
-     "      .x((a ^ {c, d}) ^ (b ^ ^{c, d}))\n"
-     "  );\n"
-     "endmodule\n"},
-
-    {// module items mixed with preprocessor conditionals and comments
-     "    module foo;\n"
-     "// comment1\n"
-     "  `ifdef SIM\n"
-     "// comment2\n"
-     " `elsif SYN\n"
-     " // comment3\n"
-     "       `else\n"
-     "// comment4\n"
-     " `endif\n"
-     "// comment5\n"
-     "  endmodule",
-     "module foo;\n"
-     "  // comment1\n"
-     "`ifdef SIM\n"
-     "  // comment2\n"
-     "`elsif SYN\n"
-     "  // comment3\n"
-     "`else\n"
-     "  // comment4\n"
-     "`endif\n"
-     "  // comment5\n"
-     "endmodule\n"},
-    {"  module bar;wire foo;reg bear;endmodule\n",
-     "module bar;\n"
-     "  wire foo;\n"
-     "  reg  bear;\n"  // aligned
-     "endmodule\n"},
-    {" module bar;initial\nbegin a<=b . c ; end endmodule\n",
-     "module bar;\n"
-     "  initial begin\n"
-     "    a <= b.c;\n"
-     "  end\n"
-     "endmodule\n"},
-    {"module foo ();\nif (1) begin\n$finish(\n"
-     "      1    ); $finish    ();\n  end\nendmodule",
-     "module foo ();\n"
-     "  if (1) begin\n"
-     "    $finish(1);\n"
-     "    $finish();\n"
-     "  end\n"
-     "endmodule\n"},
-    {"  module bar;for(genvar i = 0 ; i<N ; ++ i  ) begin end endmodule\n",
-     "module bar;\n"
-     "  for (genvar i = 0; i < N; ++i) begin\n"
-     "  end\n"
-     "endmodule\n"},
-    {"  module bar;for(genvar i = 0 ; i!=N ; i ++  ) begin "
-     "foo f;end endmodule\n",
-     "module bar;\n"
-     "  for (genvar i = 0; i != N; i++) begin\n"
-     "    foo f;\n"
-     "  end\n"
-     "endmodule\n"},
-    {
-        "module block_generate;\n"
-        "`ASSERT(blah)\n"
-        "generate endgenerate endmodule\n",
-        "module block_generate;\n"
-        "  `ASSERT(blah)\n"
-        "  generate\n"
-        "  endgenerate\n"
-        "endmodule\n",
-    },
-    {
-        "module conditional_generate;\n"
-        "if(foo)  ; \t"  // null action
-        "endmodule\n",
-        "module conditional_generate;\n"
-        "  if (foo);\n"
-        "endmodule\n",
-    },
-    {
-        "module conditional_generate;\n"
-        "if(foo[a*b+c])  ; \t"  // null action
-        "endmodule\n",
-        "module conditional_generate;\n"
-        "  if (foo[a*b+c]);\n"  // allow compact expressions inside []
-        "endmodule\n",
-    },
-    {
-        "module conditional_generate;\n"
-        "if(foo)begin\n"
-        "`ASSERT()\n"
-        "`COVER()\n"
-        " end\n"
-        "endmodule\n",
-        "module conditional_generate;\n"
-        "  if (foo) begin\n"
-        "    `ASSERT()\n"
-        "    `COVER()\n"
-        "  end\n"
-        "endmodule\n",
-    },
-    {
-        "module conditional_generate;\n"
-        "`ASSERT()\n"
-        "if(foo)begin\n"
-        " end\n"
-        "`COVER()\n"
-        "endmodule\n",
-        "module conditional_generate;\n"
-        "  `ASSERT()\n"
-        "  if (foo) begin\n"
-        "  end\n"
-        "  `COVER()\n"
-        "endmodule\n",
-    },
-    {
-        "module conditional_generate;\n"
-        "if(foo)begin\n"
-        "           // comment1\n"
-        " // comment2\n"
-        " end\n"
-        "endmodule\n",
-        "module conditional_generate;\n"
-        "  if (foo) begin\n"
-        "    // comment1\n"
-        "    // comment2\n"
-        "  end\n"
-        "endmodule\n",
-    },
-    {
-        "module m ;"
-        "for(genvar i=0; ;)\n; "   // null generate statement
-        "for(genvar j=0 ;; )\n; "  // null generate statement
-        "endmodule",
-        "module m;\n"
-        "  for (genvar i = 0;;);\n"
-        "  for (genvar j = 0;;);\n"
-        "endmodule\n",
-    },
-    {
-        "module m ;"
-        "for (genvar f = 0; f < N; f++) begin "
-        "assign x = y; assign y = z;"
-        "end endmodule",
-        "module m;\n"
-        "  for (genvar f = 0; f < N; f++) begin\n"
-        "    assign x = y;\n"
-        "    assign y = z;\n"
-        "  end\n"
-        "endmodule\n",
-    },
-    {
-        // standalone genvar statement
-        "module m ;"
-        "genvar f;"
-        "for(f=0; f<N; f ++ )begin "
-        "end endmodule",
-        "module m;\n"
-        "  genvar f;\n"
-        "  for (f = 0; f < N; f++) begin\n"
-        "  end\n"
-        "endmodule\n",
-    },
-    {
-        // multiple arguments to genvar statement
-        "module m ;"
-        "genvar f, g;"
-        "for(f=0; f<N; f ++ )begin "
-        "end for(g=N; g>0; g -- )begin "
-        "end endmodule",
-        "module m;\n"
-        "  genvar f, g;\n"
-        "  for (f = 0; f < N; f++) begin\n"
-        "  end\n"
-        "  for (g = N; g > 0; g--) begin\n"
-        "  end\n"
-        "endmodule\n",
-    },
-    {
-        // multiple genvar statements
-        "module m ;"
-        "genvar f;"
-        "genvar g;"
-        "for(f=0; f<N; f ++ )begin "
-        "end for(g=N; g>0; g -- )begin "
-        "end endmodule",
-        "module m;\n"
-        "  genvar f;\n"
-        "  genvar g;\n"
-        "  for (f = 0; f < N; f++) begin\n"
-        "  end\n"
-        "  for (g = N; g > 0; g--) begin\n"
-        "  end\n"
-        "endmodule\n",
-    },
-    {
-        "module event_control ;"
-        "always@ ( posedge   clk )z<=y;"
-        "endmodule\n",
-        "module event_control;\n"
-        "  always @(posedge clk) z <= y;\n"
-        "endmodule\n",
-    },
-    {
-        "module always_if ;"
-        "always@ ( posedge   clk ) if (expr) z<=y;"
-        "endmodule\n",
-        "module always_if;\n"
-        "  always @(posedge clk)\n"  // doesn't fit
-        "    if (expr)\n"
-        "      z <= y;\n"
-        "endmodule\n",
-    },
-    {
-        "module always_if ;"
-        "always@*  if (expr) z<=y;"
-        "endmodule\n",
-        "module always_if;\n"
-        "  always @* if (expr) z <= y;\n"  // fits
-        "endmodule\n",
-    },
-    {
-        "module \talways_if_else ;"
-        "always@*  if (expr) z<=y; else g<=0;"
-        "endmodule\n",
-        "module always_if_else;\n"
-        "  always @*\n"
-        "    if (expr) z <= y;\n"  // fits
-        "    else g <= 0;\n"       // fits
-        "endmodule\n",
-    },
-    {
-        "module \talways_if_else_if ;"
-        "always@*  if (expr) z<=y; else if (w) g<=0;"
-        "endmodule\n",
-        "module always_if_else_if;\n"
-        "  always @*\n"
-        "    if (expr) z <= y;\n"    // fits
-        "    else if (w) g <= 0;\n"  // fits
-        "endmodule\n",
-    },
-    {
-        "module \talways_if_else_if_else ;"
-        "always@*  if (expr) z<=y; else if (w) g<=0;else h<=1;"
-        "endmodule\n",
-        "module always_if_else_if_else;\n"
-        "  always @*\n"
-        "    if (expr) z <= y;\n"    // fits
-        "    else if (w) g <= 0;\n"  // fits
-        "    else h <= 1;\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(b,  c)"
-        "  for (;;)\ts = y;"
-        "endmodule",
-        "module m;\n"
-        "  always @(b, c) for (;;) s = y;\n"  // fits
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)"
-        "  for (i=0;i<k;++i)\ts = y;"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    for (i = 0; i < k; ++i)\n"
-        "      s = y;\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)"
-        "  repeat (jj+kk)\ts = y;"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    repeat (jj + kk)\n"
-        "      s = y;\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)"
-        "  foreach(jj[kk])\ts = y;"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    foreach (jj[kk])\n"
-        "      s = y;\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)"
-        "  while(jj[kk])\ts = y;"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    while (jj[kk])\n"
-        "      s = y;\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)"
-        "  do s=y;while(jj[kk]);\t"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    do\n"
-        "      s = y;\n"
-        "    while (jj[kk]);\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)  \n"
-        "  case(jj)\tS:s = y;endcase\t"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    case (jj)\n"
-        "      S: s = y;\n"
-        "    endcase\n"
-        "endmodule\n",
-    },
-
-    {
-        "module always_if ;"
-        "always@ ( posedge   clk ) if (expr) z<=y;"
-        "endmodule\n",
-        "module always_if;\n"
-        "  always @(posedge clk)\n"  // doesn't fit
-        "    if (expr)\n"
-        "      z <= y;\n"
-        "endmodule\n",
-    },
-    {
-        "module always_if ;"
-        "always@*  if (expr) z<=y;"
-        "endmodule\n",
-        "module always_if;\n"
-        "  always @* if (expr) z <= y;\n"  // fits
-        "endmodule\n",
-    },
-    {
-        "module \talways_if_else ;"
-        "always@*  if (expr) z<=y; else g<=0;"
-        "endmodule\n",
-        "module always_if_else;\n"
-        "  always @*\n"
-        "    if (expr) z <= y;\n"  // fits
-        "    else g <= 0;\n"       // fits
-        "endmodule\n",
-    },
-    {
-        "module \talways_if_else_if ;"
-        "always@*  if (expr) z<=y; else if (w) g<=0;"
-        "endmodule\n",
-        "module always_if_else_if;\n"
-        "  always @*\n"
-        "    if (expr) z <= y;\n"    // fits
-        "    else if (w) g <= 0;\n"  // fits
-        "endmodule\n",
-    },
-    {
-        "module \talways_if_else_if_else ;"
-        "always@*  if (expr) z<=y; else if (w) g<=0;else h<=1;"
-        "endmodule\n",
-        "module always_if_else_if_else;\n"
-        "  always @*\n"
-        "    if (expr) z <= y;\n"    // fits
-        "    else if (w) g <= 0;\n"  // fits
-        "    else h <= 1;\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(b,  c)"
-        "  for (;;)\ts = y;"
-        "endmodule",
-        "module m;\n"
-        "  always @(b, c) for (;;) s = y;\n"  // fits
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)"
-        "  for (i=0;i<k;++i)\ts = y;"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    for (i = 0; i < k; ++i)\n"
-        "      s = y;\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)"
-        "  repeat (jj+kk)\ts = y;"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    repeat (jj + kk)\n"
-        "      s = y;\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)"
-        "  foreach(jj[kk])\ts = y;"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    foreach (jj[kk])\n"
-        "      s = y;\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)"
-        "  while(jj[kk])\ts = y;"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    while (jj[kk])\n"
-        "      s = y;\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)"
-        "  do s=y;while(jj[kk]);\t"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    do\n"
-        "      s = y;\n"
-        "    while (jj[kk]);\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)  \n"
-        "  case(jj)\tS:s = y;endcase\t"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    case (jj)\n"
-        "      S: s = y;\n"
-        "    endcase\n"
-        "endmodule\n",
-    },
-
-    {
-        "module always_if ;"
-        "always@ ( posedge   clk ) if (expr) z<=y;"
-        "endmodule\n",
-        "module always_if;\n"
-        "  always @(posedge clk)\n"  // doesn't fit
-        "    if (expr)\n"
-        "      z <= y;\n"
-        "endmodule\n",
-    },
-    {
-        "module always_if ;"
-        "always@*  if (expr) z<=y;"
-        "endmodule\n",
-        "module always_if;\n"
-        "  always @* if (expr) z <= y;\n"  // fits
-        "endmodule\n",
-    },
-    {
-        "module \talways_if_else ;"
-        "always@*  if (expr) z<=y; else g<=0;"
-        "endmodule\n",
-        "module always_if_else;\n"
-        "  always @*\n"
-        "    if (expr) z <= y;\n"  // fits
-        "    else g <= 0;\n"       // fits
-        "endmodule\n",
-    },
-    {
-        "module \talways_if_else_if ;"
-        "always@*  if (expr) z<=y; else if (w) g<=0;"
-        "endmodule\n",
-        "module always_if_else_if;\n"
-        "  always @*\n"
-        "    if (expr) z <= y;\n"    // fits
-        "    else if (w) g <= 0;\n"  // fits
-        "endmodule\n",
-    },
-    {
-        "module \talways_if_else_if_else ;"
-        "always@*  if (expr) z<=y; else if (w) g<=0;else h<=1;"
-        "endmodule\n",
-        "module always_if_else_if_else;\n"
-        "  always @*\n"
-        "    if (expr) z <= y;\n"    // fits
-        "    else if (w) g <= 0;\n"  // fits
-        "    else h <= 1;\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(b,  c)"
-        "  for (;;)\ts = y;"
-        "endmodule",
-        "module m;\n"
-        "  always @(b, c) for (;;) s = y;\n"  // fits
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)"
-        "  for (i=0;i<k;++i)\ts = y;"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    for (i = 0; i < k; ++i)\n"
-        "      s = y;\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)"
-        "  repeat (jj+kk)\ts = y;"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    repeat (jj + kk)\n"
-        "      s = y;\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)"
-        "  foreach(jj[kk])\ts = y;"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    foreach (jj[kk])\n"
-        "      s = y;\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)"
-        "  while(jj[kk])\ts = y;"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    while (jj[kk])\n"
-        "      s = y;\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)"
-        "  do s=y;while(jj[kk]);\t"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    do\n"
-        "      s = y;\n"
-        "    while (jj[kk]);\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)  \n"
-        "  case(jj)\tS:s = y;endcase\t"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    case (jj)\n"
-        "      S: s = y;\n"
-        "    endcase\n"
-        "endmodule\n",
-    },
-
-    {
-        "module always_if ;"
-        "always@ ( posedge   clk ) if (expr) z<=y;"
-        "endmodule\n",
-        "module always_if;\n"
-        "  always @(posedge clk)\n"  // doesn't fit
-        "    if (expr)\n"
-        "      z <= y;\n"
-        "endmodule\n",
-    },
-    {
-        "module always_if ;"
-        "always@*  if (expr) z<=y;"
-        "endmodule\n",
-        "module always_if;\n"
-        "  always @* if (expr) z <= y;\n"  // fits
-        "endmodule\n",
-    },
-    {
-        "module \talways_if_else ;"
-        "always@*  if (expr) z<=y; else g<=0;"
-        "endmodule\n",
-        "module always_if_else;\n"
-        "  always @*\n"
-        "    if (expr) z <= y;\n"  // fits
-        "    else g <= 0;\n"       // fits
-        "endmodule\n",
-    },
-    {
-        "module \talways_if_else_if ;"
-        "always@*  if (expr) z<=y; else if (w) g<=0;"
-        "endmodule\n",
-        "module always_if_else_if;\n"
-        "  always @*\n"
-        "    if (expr) z <= y;\n"    // fits
-        "    else if (w) g <= 0;\n"  // fits
-        "endmodule\n",
-    },
-    {
-        "module \talways_if_else_if_else ;"
-        "always@*  if (expr) z<=y; else if (w) g<=0;else h<=1;"
-        "endmodule\n",
-        "module always_if_else_if_else;\n"
-        "  always @*\n"
-        "    if (expr) z <= y;\n"    // fits
-        "    else if (w) g <= 0;\n"  // fits
-        "    else h <= 1;\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(b,  c)"
-        "  for (;;)\ts = y;"
-        "endmodule",
-        "module m;\n"
-        "  always @(b, c) for (;;) s = y;\n"  // fits
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)"
-        "  for (i=0;i<k;++i)\ts = y;"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    for (i = 0; i < k; ++i)\n"
-        "      s = y;\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)"
-        "  repeat (jj+kk)\ts = y;"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    repeat (jj + kk)\n"
-        "      s = y;\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)"
-        "  foreach(jj[kk])\ts = y;"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    foreach (jj[kk])\n"
-        "      s = y;\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)"
-        "  while(jj[kk])\ts = y;"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    while (jj[kk])\n"
-        "      s = y;\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)"
-        "  do s=y;while(jj[kk]);\t"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    do\n"
-        "      s = y;\n"
-        "    while (jj[kk]);\n"
-        "endmodule\n",
-    },
-    {
-        "module m;\n"
-        "always @(posedge clk)  \n"
-        "  case(jj)\tS:s = y;endcase\t"
-        "endmodule",
-        "module m;\n"
-        "  always @(posedge clk)\n"
-        "    case (jj)\n"
-        "      S: s = y;\n"
-        "    endcase\n"
-        "endmodule\n",
-    },
-
-    {
-        // begin/end with labels
-        "module m ;initial  begin:yyy\tend:yyy endmodule",
-        "module m;\n"
-        "  initial begin : yyy\n"
-        "  end : yyy\n"
-        "endmodule\n",
-    },
-    {
-        // conditional generate begin/end with labels
-        "module m ;if\n( 1)  begin:yyy\tend:yyy endmodule",
-        "module m;\n"
-        "  if (1) begin : yyy\n"
-        "  end : yyy\n"
-        "endmodule\n",
-    },
-    {
-        // begin/end with labels, nested
-        "module m ;initial  begin:yyy if(1)begin:zzz "
-        "end:zzz\tend:yyy endmodule",
-        "module m;\n"
-        "  initial begin : yyy\n"
-        "    if (1) begin : zzz\n"
-        "    end : zzz\n"
-        "  end : yyy\n"
-        "endmodule\n",
-    },
-    {
-        "module m ;initial  begin #  1 x<=y ;end endmodule",
-        "module m;\n"
-        "  initial begin\n"
-        "    #1 x <= y;\n"
-        "  end\n"
-        "endmodule\n",
-    },
-    {
-        "module m ;initial  begin x<=y ;  y<=z;end endmodule",
-        "module m;\n"
-        "  initial begin\n"
-        "    x <= y;\n"
-        "    y <= z;\n"
-        "  end\n"
-        "endmodule\n",
-    },
-    {
-        "module m ;initial  begin # 10 x<=y ;  # 20  y<=z;end endmodule",
-        "module m;\n"
-        "  initial begin\n"
-        "    #10 x <= y;\n"
-        "    #20 y <= z;\n"
-        "  end\n"
-        "endmodule\n",
-    },
-    {
-        // qualified variables
-        "module m ;initial  begin automatic int a; "
-        " static byte s=0;end endmodule",
-        "module m;\n"
-        "  initial begin\n"
-        "    automatic int a;\n"
-        "    static byte   s = 0;\n"  // aligned
-        "  end\n"
-        "endmodule\n",
-    },
-    {
-        "module m ;initial  begin automatic int a,b; "
-        " static byte s,t;end endmodule",
-        "module m;\n"
-        "  initial begin\n"
-        "    automatic int a, b;\n"
-        "    static byte s, t;\n"
-        "  end\n"
-        "endmodule\n",
-    },
-    {
-        "module m ;initial  begin   static byte a=1,b=0;end endmodule",
-        "module m;\n"
-        "  initial begin\n"
-        "    static byte a = 1, b = 0;\n"
-        "  end\n"
-        "endmodule\n",
-    },
-    {
-        "module m ;initial  begin   const int a=0;end endmodule",
-        "module m;\n"
-        "  initial begin\n"
-        "    const int a = 0;\n"
-        "  end\n"
-        "endmodule\n",
-    },
-    {
-        "module m ;initial  begin automatic   const int a=0;end endmodule",
-        "module m;\n"
-        "  initial begin\n"
-        "    automatic const int a = 0;\n"
-        "  end\n"
-        "endmodule\n",
-    },
-    {
-        "module m ;initial  begin const  var automatic  int a=0;end endmodule",
-        "module m;\n"
-        "  initial begin\n"
-        "    const var automatic int a = 0;\n"
-        "  end\n"
-        "endmodule\n",
-    },
-    {
-        "module m ;initial  begin static byte s  ={<<{a}};end endmodule",
-        "module m;\n"
-        "  initial begin\n"
-        "    static byte s = {<<{a}};\n"
-        "  end\n"
-        "endmodule\n",
-    },
-    {
-        "module m ;initial  begin static int s  ={>>4{a}};end endmodule",
-        "module m;\n"
-        "  initial begin\n"
-        "    static int s = {>>4{a}};\n"
-        "  end\n"
-        "endmodule\n",
-    },
-    {
-        "module m; final  assert   (expr ) ;endmodule",
-        "module m;\n"
-        "  final assert (expr);\n"
-        "endmodule\n",
-    },
-    {
-        "module m; final  begin\tassert   (expr ) ;end  endmodule",
-        "module m;\n"
-        "  final begin\n"
-        "    assert (expr);\n"
-        "  end\n"
-        "endmodule\n",
-    },
-    {
-        "module m; final  assume   (expr ) ;endmodule",
-        "module m;\n"
-        "  final assume (expr);\n"
-        "endmodule\n",
-    },
-    {
-        "module m; final  cover   (expr ) ;endmodule",
-        "module m;\n"
-        "  final cover (expr);\n"
-        "endmodule\n",
-    },
-    {
-        // two consecutive clocking declarations in modules
-        " module mcd ; "
-        "clocking   cb @( posedge clk);\t\tendclocking "
-        "clocking cb2   @ (posedge  clk\n); endclocking endmodule",
-        "module mcd;\n"
-        "  clocking cb @(posedge clk);\n"
-        "  endclocking\n"
-        "  clocking cb2 @(posedge clk);\n"
-        "  endclocking\n"
-        "endmodule\n",
-    },
-    {
-        // two consecutive clocking declarations in modules, with end labels
-        " module mcd ; "
-        "clocking   cb @( posedge clk);\t\tendclocking:  cb "
-        "clocking cb2   @ (posedge  clk\n); endclocking   :cb2 endmodule",
-        "module mcd;\n"
-        "  clocking cb @(posedge clk);\n"
-        "  endclocking : cb\n"
-        "  clocking cb2 @(posedge clk);\n"
-        "  endclocking : cb2\n"
-        "endmodule\n",
-    },
-    {
-        // clocking declarations with ports in modules
-        " module mcd ; "
-        "clocking cb   @ (posedge  clk\n); input a; output b; endclocking "
-        "endmodule",
-        "module mcd;\n"
-        "  clocking cb @(posedge clk);\n"
-        "    input a;\n"
-        "    output b;\n"
-        "  endclocking\n"
-        "endmodule\n",
-    },
-    {
-        // DPI import declarations in modules
-        "module mdi;"
-        "import   \"DPI-C\" function  int add(\n) ;"
-        "import \"DPI-C\"\t\tfunction int\nsleep( input int secs );"
-        "import \"DPI-C\"\t\tfunction int\nwake( input int secs, output bit "
-        "[2:0] z);"
-        "endmodule",
-        "module mdi;\n"
-        "  import \"DPI-C\" function int add();\n"
-        "  import \"DPI-C\" function int sleep(\n"
-        "    input int secs\n"
-        "  );\n"
-        "  import \"DPI-C\" function int wake(\n"
-        "    input  int       secs,\n"
-        "    output bit [2:0] z\n"
-        "  );\n"
-        "endmodule\n",
-    },
-    {
-        // DPI export declarations in modules
-        "module m;"
-        "export \"DPI-C\" function get;"
-        "export \"DPI-C\" function mhpmcounter_get;\n"
-        "export \"DPI-C\"\t\tfunction int\nwake( input int secs, output bit "
-        "[2:0] z);"
-        "endmodule",
-        "module m;\n"
-        "  export \"DPI-C\" function get;\n"
-        "  export \"DPI-C\"\n"
-        "      function mhpmcounter_get;\n"  // doesn't fit in 40-col
-        "  export \"DPI-C\" function int wake(\n"
-        "    input  int       secs,\n"
-        "    output bit [2:0] z\n"
-        "  );\n"
-        "endmodule\n",
-    },
-    {// Two consecutive EOL comments in kDPIImportItem
-     "import \"DPI-C\" context function void foo(\n"
-     "  input bit first,\n"
-     "  // c3\n"
-     "  // c3+\n"
-     "  input bit second\n"
-     ");\n",
-     "import \"DPI-C\" context\n"
-     "    function void foo(\n"
-     "  input bit first,\n"
-     "  // c3\n"
-     "  // c3+\n"
-     "  input bit second\n"
-     ");\n"},
-    {"export \"\" t;\n", "export \"\" t;\n"},
-    {"import \"DPI-C\" context function void func(input bit impl_i,"
-     "input bit op_i,"
-     "input bit [5:0] mode_i,"
-     "input bit [3:0][31:0] iv_i,"
-     "input bit [2:0] key_len_i,"
-     "input bit [7:0][31:0] key_i,"
-     "input bit [7:0] data_i[],"
-     "output bit [7:0] data_o[]);",
-     "import \"DPI-C\" context\n"
-     "    function void func(\n"
-     "  input  bit             impl_i,\n"
-     "  input  bit             op_i,\n"
-     "  input  bit [5:0]       mode_i,\n"
-     "  input  bit [3:0][31:0] iv_i,\n"
-     "  input  bit [2:0]       key_len_i,\n"
-     "  input  bit [7:0][31:0] key_i,\n"
-     "  input  bit [7:0]       data_i   [],\n"
-     "  output bit [7:0]       data_o   []\n"
-     ");\n"},
-    {// module with system task call w or w/o parentheses
-     "module m; initial begin #10 $display(\"foo\"); $display(\"bar\");"
-     "end endmodule",
-     "module m;\n"
-     "  initial begin\n"
-     "    #10 $display(\"foo\");\n"
-     "    $display(\"bar\");\n"
-     "  end\n"
-     "endmodule\n"},
-    {// module with system task call
-     "module m; initial begin #10 $display; $display;"
-     "end endmodule",
-     "module m;\n"
-     "  initial begin\n"
-     "    #10 $display;\n"
-     "    $display;\n"
-     "  end\n"
-     "endmodule\n"},
-
-    // interface test cases
-    {// two interface declarations
-     " interface if1 ; endinterface\t\t"
-     "interface  if2; endinterface   ",
-     "interface if1;\n"
-     "endinterface\n"
-     "interface if2;\n"
-     "endinterface\n"},
-    {// two interface declarations, end labels
-     " interface if1 ; endinterface:if1\t\t"
-     "interface  if2; endinterface    :  if2   ",
-     "interface if1;\n"
-     "endinterface : if1\n"
-     "interface if2;\n"
-     "endinterface : if2\n"},
-    {// interface declaration with parameters
-     " interface if1#( parameter int W= 8 );endinterface\t\t",
-     "interface if1 #(\n"
-     "    parameter int W = 8\n"
-     ");\n"
-     "endinterface\n"},
-    {// interface declaration with ports (empty)
-     " interface if1()\n;endinterface\t\t",
-     "interface if1 ();\n"
-     "endinterface\n"},
-    {// interface declaration with parameter comment only, empty ports
-     " interface if1#( \n"
-     "//param\n"
-     ")();endinterface\t\t",
-     "interface if1 #(\n"
-     "    //param\n"
-     ") ();\n"
-     "endinterface\n"},
-    {// interface declaration with parameter, empty ports
-     " interface if1#( parameter int W= 8 )();endinterface\t\t",
-     "interface if1 #(\n"
-     "    parameter int W = 8\n"
-     ") ();\n"
-     "endinterface\n"},
-    {// interface declaration with ports
-     " interface if1( input\tlogic   z)\n;endinterface\t\t",
-     "interface if1 (\n"
-     "    input logic z\n"
-     ");\n"
-     "endinterface\n"},
-    {// interface declaration with multiple ports
-     " interface if1( input\tlogic   z, output logic a)\n;endinterface\t\t",
-     "interface if1 (\n"
-     "    input  logic z,\n"  // should be one-per-line, even it it fits
-     "    output logic a\n"   // aligned
-     ");\n"
-     "endinterface\n"},
-    {// interface declaration with parameters and ports
-     " interface if1#( parameter int W= 8 )(input logic z);endinterface\t\t",
-     // doesn't fit on one line
-     "interface if1 #(\n"
-     "    parameter int W = 8\n"
-     ") (\n"
-     "    input logic z\n"
-     ");\n"
-     "endinterface\n"},
-    {
-        // interface with modport declarations
-        "interface\tfoo_if  ;"
-        "modport  mp1\t( output a, input b);"
-        "modport\tmp2  (output c,input d );\t"
-        "endinterface",
-        "interface foo_if;\n"
-        "  modport mp1(output a, input b);\n"
-        "  modport mp2(output c, input d);\n"
-        "endinterface\n",
-    },
-    {
-        // interface with long modport port names
-        "interface\tfoo_if  ;"
-        "modport  mp1\t( output a_long_output, input detailed_input_name);"
-        "endinterface",
-        "interface foo_if;\n"
-        "  modport mp1(\n"
-        "      output a_long_output,\n"
-        "      input detailed_input_name\n"
-        "  );\n"
-        "endinterface\n",
-    },
-    {
-        // interface with modport declaration with multiple ports
-        "interface\tfoo_if  ;"
-        "modport  mp1\t( output a_long_output, input detailed_input_name);"
-        "endinterface",
-        "interface foo_if;\n"
-        "  modport mp1(\n"
-        "      output a_long_output,\n"
-        "      input detailed_input_name\n"
-        "  );\n"
-        "endinterface\n",
-    },
-    {
-        // interface with modport TF port declaration
-        "interface\tfoo_if  ;"
-        "modport  mp1\t( output a, input b, import c);"
-        "endinterface",
-        "interface foo_if;\n"
-        "  modport mp1(\n"
-        "      output a,\n"
-        "      input b,\n"
-        "      import c\n"
-        "  );\n"
-        "endinterface\n",
-    },
-    {
-        // interface with complex modport ports list
-        "interface\tfoo_if  ;"
-        "modport producer\t(input ready,\toutput data, valid, user,"
-        " strobe, keep, last,\timport producer_reset, producer_tick);"
-        "modport consumer\t(input data, valid, user, strobe, keep, last,"
-        " output ready,\timport consumer_reset, consumer_tick, consume);"
-        "endinterface",
-        "interface foo_if;\n"
-        "  modport producer(\n"
-        "      input ready,\n"
-        "      output data, valid, user, strobe,\n"
-        "          keep, last,\n"
-        "      import producer_reset,\n"
-        "          producer_tick\n"
-        "  );\n"
-        "  modport consumer(\n"
-        "      input data, valid, user, strobe,\n"
-        "          keep, last,\n"
-        "      output ready,\n"
-        "      import consumer_reset,\n"
-        "          consumer_tick, consume\n"
-        "  );\n"
-        "endinterface\n",
-    },
-    {
-        // interface with modports and comments inside
-        "interface foo_if;\n"
-        " modport mp1(\n"
-        "  // Our output\n"
-        "     output a,\n"
-        "  /* Inputs */\n"
-        "      input b1, b_f /*last*/,"
-        "  import c\n"
-        "  );\n"
-        "endinterface\n",
-        "interface foo_if;\n"
-        "  modport mp1(\n"
-        "      // Our output\n"
-        "      output a,\n"
-        "      /* Inputs */\n"
-        "      input b1, b_f  /*last*/,\n"
-        "      import c\n"
-        "  );\n"
-        "endinterface\n",
-    },
-
-    // class test cases
-    {"class action;int xyz;endclass  :  action\n",
-     "class action;\n"
-     "  int xyz;\n"
-     "endclass : action\n"},
-    {"class action  extends mypkg :: inaction;endclass  :  action\n",
-     "class action extends mypkg::inaction;\n"  // tests for spacing around ::
-     "endclass : action\n"},
-    {"class c;function new;endfunction endclass",
-     "class c;\n"
-     "  function new;\n"
-     "  endfunction\n"
-     "endclass\n"},
-    {"class c;function new ( );endfunction endclass",
-     "class c;\n"
-     "  function new();\n"
-     "  endfunction\n"
-     "endclass\n"},
-    {"class c;function new ( string s );endfunction endclass",
-     "class c;\n"
-     "  function new(string s);\n"
-     "  endfunction\n"
-     "endclass\n"},
-    {"class c;function new ( string s ,int i );endfunction endclass",
-     "class c;\n"
-     "  function new(string s, int i);\n"
-     "  endfunction\n"
-     "endclass\n"},
-    {"class c;function void f;endfunction endclass",
-     "class c;\n"
-     "  function void f;\n"
-     "  endfunction\n"
-     "endclass\n"},
-    {"class c;virtual function void f;endfunction endclass",
-     "class c;\n"
-     "  virtual function void f;\n"
-     "  endfunction\n"
-     "endclass\n"},
-    {"class c;function int f ( );endfunction endclass",
-     "class c;\n"
-     "  function int f();\n"
-     "  endfunction\n"
-     "endclass\n"},
-    {"class c;function int f ( int  ii );endfunction endclass",
-     "class c;\n"
-     "  function int f(int ii);\n"
-     "  endfunction\n"
-     "endclass\n"},
-    {"class c;function int f ( int  ii ,bit  bb );endfunction endclass",
-     "class c;\n"
-     "  function int f(int ii, bit bb);\n"
-     "  endfunction\n"
-     "endclass\n"},
-    {"class c;task t ;endtask endclass",
-     "class c;\n"
-     "  task t;\n"
-     "  endtask\n"
-     "endclass\n"},
-    {"class c;task t ( int  ii ,bit  bb );endtask endclass",
-     "class c;\n"
-     "  task t(int ii, bit bb);\n"
-     "  endtask\n"
-     "endclass\n"},
-    {"class c; task automatic repeated_assigner;"
-     "repeat (count) y = w;"  // single statement body
-     "endtask endclass",
-     "class c;\n"
-     "  task automatic repeated_assigner;\n"
-     "    repeat (count) y = w;\n"
-     "  endtask\n"
-     "endclass\n"},
-    {"class c; task automatic delayed_assigner;"
-     "#   100   y = w;"  // delayed assignment
-     "endtask endclass",
-     "class c;\n"
-     "  task automatic delayed_assigner;\n"
-     "    #100 y = w;\n"
-     "  endtask\n"
-     "endclass\n"},
-    {"class c; task automatic labeled_assigner;"
-     "lbl   :   y = w;"  // delayed assignment
-     "endtask endclass",
-     "class c;\n"
-     "  task automatic labeled_assigner;\n"
-     "    lbl : y = w;\n"  // TODO(fangism): no space before ':'
-     "  endtask\n"
-     "endclass\n"},
-    // task with macro call
-    {"module m1;\ntask automatic t1();\n"
-     "t2(`R1(1)+ 8);endtask : t1\nendmodule",
-     "module m1;\n"
-     "  task automatic t1();\n"
-     "    t2(`R1(1) + 8);\n"
-     "  endtask : t1\n"
-     "endmodule\n"},
-
-    // tasks with control statements
-    {"class c; task automatic waiter;"
-     "if (count == 0) begin #0; return;end "
-     "endtask endclass",
-     "class c;\n"
-     "  task automatic waiter;\n"
-     "    if (count == 0) begin\n"
-     "      #0;\n"
-     "      return;\n"
-     "    end\n"
-     "  endtask\n"
-     "endclass\n"},
-    {"class c; task automatic heartbreaker;"
-     "if( c)if( d) break ;"
-     "endtask endclass",
-     "class c;\n"
-     "  task automatic heartbreaker;\n"
-     "    if (c) if (d) break;\n"
-     "  endtask\n"
-     "endclass\n"},
-    {"class c; task automatic waiter;"
-     "repeat (count) @(posedge clk);"
-     "endtask endclass",
-     "class c;\n"
-     "  task automatic waiter;\n"
-     "    repeat (count) @(posedge clk);\n"
-     "  endtask\n"
-     "endclass\n"},
-    {"class c; task automatic repeat_assigner;"
-     "repeat( r )\ny = w;"
-     "repeat( q )\ny = 1;"
-     "endtask endclass",
-     "class c;\n"
-     "  task automatic repeat_assigner;\n"
-     "    repeat (r) y = w;\n"
-     "    repeat (q) y = 1;\n"
-     "  endtask\n"
-     "endclass\n"},
-    {"class c; task automatic event_control_assigner;"
-     "@ ( posedge clk )\ny = w;"
-     "@ ( negedge clk )\nz = w;"
-     "endtask endclass",
-     "class c;\n"
-     "  task automatic event_control_assigner;\n"
-     "    @(posedge clk) y = w;\n"
-     "    @(negedge clk) z = w;\n"
-     "  endtask\n"
-     "endclass\n"},
-    {
-        // classes with surrrounding comments
-        // vertical spacing preserved
-        "\n// pre-c\n\n"
-        "  class   c  ;\n"
-        "// c stuff\n"
-        "endclass\n"
-        "  // pre-d\n"
-        "\n\nclass d ;\n"
-        " // d stuff\n"
-        "endclass\n"
-        "\n// the end\n",
-        "\n// pre-c\n\n"
-        "class c;\n"
-        "  // c stuff\n"
-        "endclass\n"
-        "// pre-d\n\n\n"
-        "class d;\n"
-        "  // d stuff\n"
-        "endclass\n\n"
-        "// the end\n",
-    },
-    {// class with comments around task/function declarations
-     "class c;      // c is for cookie\n"
-     "    // f is for false\n"
-     "\tfunction f(integer size) ; endfunction\n"
-     " // t is for true\n"
-     "task t();endtask\n"
-     " // class is about to end\n"
-     "endclass",
-     "class c;  // c is for cookie\n"
-     "  // f is for false\n"
-     "  function f(integer size);\n"
-     "  endfunction\n"
-     "  // t is for true\n"
-     "  task t();\n"
-     "  endtask\n"
-     "  // class is about to end\n"
-     "endclass\n"},
-
-    // interface class test cases
-    {"interface class Foo;\nendclass\n",
-     "interface class Foo;\n"
-     "endclass\n"},
-    {"interface   class   Foo  ;  endclass\n",
-     "interface class Foo;\n"
-     "endclass\n"},
-    {"interface class Foo extends Bar , Baz ;\nendclass\n",
-     "interface class Foo extends Bar, Baz;\n"
-     "endclass\n"},
-    {"interface class Foo;\n  pure   virtual   task   foo (  ) ; \nendclass\n",
-     "interface class Foo;\n"
-     "  pure virtual task foo();\n"
-     "endclass\n"},
-
-    // class property alignment test cases
-    {"class c;\n"
-     "int foo  ;\n"
-     "byte bar;\n"
-     "endclass : c\n",
-     "class c;\n"
-     "  int  foo;\n"
-     "  byte bar;\n"
-     "endclass : c\n"},
-    {"class c;\n"
-     "int foo;\n"
-     "const bit b;\n"
-     "endclass : c\n",
-     "class c;\n"
-     "  int       foo;\n"
-     "  const bit b;\n"
-     "endclass : c\n"},
-    {"class c;\n"
-     "rand logic l;\n"
-     "int foo;\n"
-     "endclass : c\n",
-     "class c;\n"
-     "  rand logic l;\n"
-     "  int        foo;\n"
-     "endclass : c\n"},
-    {"class c;\n"
-     "rand logic l;\n"
-     "const static int foo;\n"  // more qualifiers
-     "endclass : c\n",
-     "class c;\n"
-     "  rand logic       l;\n"
-     "  const static int foo;\n"
-     "endclass : c\n"},
-    {"class c;\n"
-     "static local int foo;\n"
-     "const bit b;\n"
-     "endclass : c\n",
-     "class c;\n"
-     "  static local int foo;\n"
-     "  const bit        b;\n"
-     "endclass : c\n"},
-    {// example with queue
-     "class c;\n"
-     "int foo [$] ;\n"
-     "int foo_bar ;\n"
-     "endclass : c\n",
-     "class c;\n"
-     "  int foo     [$];\n"
-     "  int foo_bar;\n"
-     "endclass : c\n"},
-    {// subcolumns
-     "class cc;\n"
-     "rand bit [A-1:0] foo;\n"
-     "rand bit [A-1:0][2] bar;\n"
-     "int foobar[X+1:Y];\n"
-     "int baz[42];\n"
-     "rand bit qux[Z];\n"
-     "rand bit [1:0] quux[3:0];\n"
-     "rand bit [A:BB][42] quuz[7];\n"
-     "endclass\n",
-     "class cc;\n"
-     "  rand bit [A-1: 0]     foo;\n"
-     "  rand bit [A-1: 0][ 2] bar;\n"
-     "  int                   foobar[X+1:Y];\n"
-     "  int                   baz   [   42];\n"
-     "  rand bit              qux   [    Z];\n"
-     "  rand bit [  1: 0]     quux  [  3:0];\n"
-     "  rand bit [  A:BB][42] quuz  [    7];\n"
-     "endclass\n"},
-    {"class cc;\n"
-     "int qux[2];\n"
-     "int quux[SIZE-1+SHIFT:SHIFT];\n"
-     "int quuz[SOME_CONSTANT];\n"
-     "endclass\n",
-     "class cc;\n"
-     "  int qux [                 2];\n"
-     "  int quux[SIZE-1+SHIFT:SHIFT];\n"
-     "  int quuz[     SOME_CONSTANT];\n"
-     "endclass\n"},
-    {// aligns over comments (ignored)
-     "class c;\n"
-     "// foo is...\n"
-     "int foo;\n"
-     "// b is...\n"
-     "const bit b;\n"
-     " // llama is...\n"
-     "logic llama;\n"
-     "endclass : c\n",
-     "class c;\n"
-     "  // foo is...\n"
-     "  int       foo;\n"
-     "  // b is...\n"
-     "  const bit b;\n"
-     "  // llama is...\n"
-     "  logic     llama;\n"
-     "endclass : c\n"},
-    {// aligns over comments (ignored), even with blank lines
-     "class c;\n"
-     "// foo is...\n"
-     "int foo;\n"
-     "\n"
-     "// b is...\n"
-     "const bit b;\n"
-     "\n"
-     " // llama is...\n"
-     "logic llama;\n"
-     "endclass : c\n",
-     "class c;\n"
-     "  // foo is...\n"
-     "  int       foo;\n"
-     "\n"
-     "  // b is...\n"
-     "  const bit b;\n"
-     "\n"
-     "  // llama is...\n"
-     "  logic     llama;\n"
-     "endclass : c\n"},
-    {"class c;\n"
-     "rand logic l;\n"
-     "int [1:0] foo;\n"
-     "endclass : c\n",
-     "class c;\n"
-     "  rand logic       l;\n"
-     "  int        [1:0] foo;\n"
-     "endclass : c\n"},
-    {// non-data-declarations break up groups
-     "class c;\n"
-     "rand logic l;\n"
-     "int foo;\n"
-     "`uvm_bar_foo()\n"
-     "logic k;\n"
-     "rand int bar;\n"
-     "endclass : c\n",
-     "class c;\n"
-     "  rand logic l;\n"
-     "  int        foo;\n"
-     "  `uvm_bar_foo()\n"  // separates alignment groups above/below
-     "  logic    k;\n"
-     "  rand int bar;\n"
-     "endclass : c\n"},
-    {// non-data-declarations break up groups
-     "class c;\n"
-     "logic k;\n"
-     "rand int bar;\n"
-     "function void f();\n"
-     "endfunction\n"
-     "rand logic l;\n"
-     "int foo;\n"
-     "endclass : c\n",
-     "class c;\n"
-     "  logic    k;\n"
-     "  rand int bar;\n"
-     "  function void f();\n"  // function declaration breaks groups
-     "  endfunction\n"
-     "  rand logic l;\n"
-     "  int        foo;\n"
-     "endclass : c\n"},
-    {// align single-value initializers at the '='
-     "class c;\n"
-     "const logic foo=0;\n"
-     "const bit b=1;\n"
-     "endclass : c\n",
-     "class c;\n"
-     "  const logic foo = 0;\n"
-     "  const bit   b   = 1;\n"
-     "endclass : c\n"},
-    {// align single-value initializers at the '=', over non-initialized
-     "class c;\n"
-     "const logic foo=0;\n"
-     "rand int iidrv;\n"
-     "const bit b=1;\n"
-     "endclass : c\n",
-     "class c;\n"
-     "  const logic foo    = 0;\n"
-     "  rand int    iidrv;\n"  // no initializer, but align across this
-     "  const bit   b      = 1;\n"
-     "endclass : c\n"},
-
-    // constraint test cases
-    {
-        "class foo; constraint c1_c{ } endclass",
-        "class foo;\n"
-        "  constraint c1_c {}\n"
-        "endclass\n",
-    },
-    {
-        "class foo; constraint c1_c{  } constraint c2_c{ } endclass",
-        "class foo;\n"
-        "  constraint c1_c {}\n"
-        "  constraint c2_c {}\n"
-        "endclass\n",
-    },
-    {
-        "class foo; constraint c1_c{soft z==y;unique{baz};}endclass",
-        "class foo;\n"
-        "  constraint c1_c {\n"
-        "    soft z == y;\n"
-        "    unique {baz};\n"
-        "  }\n"
-        "endclass\n",
-    },
-    {
-        "class foo; constraint c1_c{ //comment1\n"
-        "//comment2\n"
-        "//comment3\n"
-        "} endclass",
-        "class foo;\n"
-        "  constraint c1_c {  //comment1\n"
-        "    //comment2\n"
-        "    //comment3\n"
-        "  }\n"
-        "endclass\n",
-    },
-
-    {"class foo;constraint c { "
-     "timer_enable dist { [ 8'h0 : 8'hfe ] :/ 90 , 8'hff :/ 10 }; "
-     "} endclass\n",
-     "class foo;\n"
-     "  constraint c {\n"
-     "    timer_enable dist {\n"
-     "      [8'h0 : 8'hfe] :/ 90,\n"
-     "      8'hff          :/ 10\n"  // aligned
-     "    };\n"
-     "  }\n"
-     "endclass\n"},
-
-    {
-        "class Foo; constraint if_c { if (z) { soft x == y; } } endclass\n",
-        "class Foo;\n"
-        "  constraint if_c {\n"
-        "    if (z) {\n"
-        "      soft x == y;\n"
-        "    }\n"
-        "  }\n"
-        "endclass\n",
-    },
-    {
-        "class Foo; constraint if_c { if (z) {\n"
-        "//comment-a\n"
-        "soft x == y;\n"
-        "//comment-b\n"
-        "} } endclass\n",
-        "class Foo;\n"
-        "  constraint if_c {\n"
-        "    if (z) {\n"
-        "      //comment-a\n"  // properly indented
-        "      soft x == y;\n"
-        "      //comment-b\n"  // properly indented
-        "    }\n"
-        "  }\n"
-        "endclass\n",
-    },
-    {
-        "class c; "
-        "constraint c_has_config_error {"
-        "if (yyy) {zzzz == 1;} else {yyyyyyy == 0;}} "
-        "endclass",
-        "class c;\n"
-        "  constraint c_has_config_error {\n"
-        "    if (yyy) {\n"
-        "      zzzz == 1;\n"
-        "    } else {\n"
-        "      yyyyyyy == 0;\n"
-        "    }\n"
-        "  }\n"
-        "endclass\n",
-    },
-    // distributions: colon alignment
-    {"class c;\n"
-     "constraint co {\n"
-     "d dist {\n"
-     "[1:2]:/2,\n"
-     "[11:33]:/22,\n"
-     "[111:444]:/8,\n"
-     "[1:42]:/10,\n"
-     "[11:12]:/3\n"
-     "};\n"
-     "}\n"
-     "endclass\n",
-     "class c;\n"
-     "  constraint co {\n"
-     "    d dist {\n"
-     "      [  1 :   2] :/ 2,\n"
-     "      [ 11 :  33] :/ 22,\n"
-     "      [111 : 444] :/ 8,\n"
-     "      [  1 :  42] :/ 10,\n"
-     "      [ 11 :  12] :/ 3\n"
-     "    };\n"
-     "  }\n"
-     "endclass\n"},
-    // distributions: subcolumns
-    {"class foo;\n"
-     "constraint bar {\n"
-     "baz dist {\n"
-     "[1:2]:/2,\n"
-     "QUX[3:0]:/10,\n"
-     "[11:33]:/22,\n"
-     "ID_LONGER_THAN_RANGES:/3,\n"
-     "[111:QUUZ[Z]]:/8,\n"
-     "[X[4:0]:Y[8:Z-2]]:/8\n"
-     "};\n"
-     "}\n"
-     "endclass\n",
-     "class foo;\n"
-     "  constraint bar {\n"
-     "    baz dist {\n"
-     "      [     1 :        2]   :/ 2,\n"
-     "      QUX[3:0]              :/ 10,\n"
-     "      [    11 :       33]   :/ 22,\n"
-     "      ID_LONGER_THAN_RANGES :/ 3,\n"
-     "      [   111 :  QUUZ[Z]]   :/ 8,\n"
-     "      [X[4:0] : Y[8:Z-2]]   :/ 8\n"
-     "    };\n"
-     "  }\n"
-     "endclass\n"},
-    // class with empty parameter list
-    {"class foo #(); endclass",
-     "class foo #();\n"
-     "endclass\n"},
-    // class with empty parameter list, with comment
-    {"class foo #(  \n"
-     "// comment\n"
-     "); endclass",
-     "class foo #(\n"
-     "    // comment\n"
-     ");\n"
-     "endclass\n"},
-    // class with empty parameter list, extends
-    {"class foo #()extends bar ; endclass",
-     "class foo #() extends bar;\n"
-     "endclass\n"},
-    // class extends from type with named parameters
-    {"class foo extends bar #(.N(N), .M(M)); endclass",
-     "class foo extends bar #(\n"
-     "    .N(N),\n"
-     "    .M(M)\n"
-     ");\n"
-     "endclass\n"},
-
-    // class with one parameter list
-    {"class foo #(type a = b); endclass",
-     "class foo #(\n"
-     "    type a = b\n"
-     ");\n"
-     "endclass\n"},
-
-    // class with multiple paramter list
-    {"class foo #(type a = b, type c = d, type e = f); endclass",
-     "class foo #(\n"
-     "    type a = b,\n"
-     "    type c = d,\n"
-     "    type e = f\n"
-     ");\n"
-     "endclass\n"},
-
-    // class with data members
-    {"class  i_love_data ;const\ninteger  sizer\t;endclass",
-     "class i_love_data;\n"
-     "  const integer sizer;\n"
-     "endclass\n"},
-    {"class  i_love_data ;const\ninteger  sizer=3\t;endclass",
-     "class i_love_data;\n"
-     "  const integer sizer = 3;\n"
-     "endclass\n"},
-    {"class  i_love_data ;protected\nint  count  \t;endclass",
-     "class i_love_data;\n"
-     "  protected int count;\n"
-     "endclass\n"},
-    {"class  i_love_data ;\t\nint  counter\n ;int  countess \t;endclass",
-     "class i_love_data;\n"
-     "  int counter;\n"
-     "  int countess;\n"
-     "endclass\n"},
-    {"class  i_love_params ;foo#( . bar)  baz\t;endclass",
-     "class i_love_params;\n"
-     "  foo #(.bar) baz;\n"
-     "endclass\n"},
-    {"class  i_love_params ;foo#( . bar ( bah ))  baz\t;endclass",
-     "class i_love_params;\n"
-     "  foo #(.bar(bah)) baz;\n"
-     "endclass\n"},
-    {"class  i_love_params ;foo#( . bar ( bah\n),"
-     ".\ncat( dog) )  baz\t;endclass",
-     "class i_love_params;\n"
-     "  foo #(\n"
-     "      .bar(bah),\n"
-     "      .cat(dog)\n"
-     "  ) baz;\n"
-     "endclass\n"},
-    {"class  i_love_params ;foo#( . bar)  baz1,baz2\t;endclass",
-     "class i_love_params;\n"
-     "  foo #(.bar) baz1, baz2;\n"
-     "endclass\n"},
-    {"class  i_love_params ;foo#( . bar)  baz\t;baz#(.foo)bar;endclass",
-     "class i_love_params;\n"
-     "  foo #(.bar) baz;\n"
-     "  baz #(.foo) bar;\n"
-     "endclass\n"},
-    {"class i_love_params // comment\n"
-     ";\n"
-     "foo#(\n"
-     ".foobar(quuuuux) // comment\n"
-     ", .cat(dog)\n"
-     ") baz // comment\n"
-     ";endclass\n",
-     "class i_love_params  // comment\n"
-     ";\n"
-     "  foo #(\n"
-     "        .foobar(quuuuux)  // comment\n"
-     "      , .cat   (dog)\n"
-     "  ) baz  // comment\n"
-     "  ;\n"
-     "endclass\n"},
-
-    // typedef test cases
-    {"typedef enum logic\t{ A=0, B=1 }foo_t;",
-     "typedef enum logic {\n"
-     "  A = 0,\n"
-     "  B = 1\n"
-     "} foo_t;\n"},
-    {"typedef enum uint8_t\t{ kA=8'b0, kB=8'b1 }foo_t;",
-     "typedef enum uint8_t {\n"  // uint8_t is user-defined
-     "  kA = 8'b0,\n"
-     "  kB = 8'b1\n"
-     "} foo_t;\n"},
-    {// With comments on same line as enum value
-     "typedef enum logic\t{ A=0, // foo\n"
-     "B,// bar\n"
-     "`ifndef DO_PANIC\n"
-     "C=42,// answer\n"
-     "`endif\n"
-     "D=3    // baz\n"
-     "}foo_t;",
-     "typedef enum logic {\n"
-     "  A = 0,   // foo\n"
-     "  B,       // bar\n"
-     "`ifndef DO_PANIC\n"
-     "  C = 42,  // answer\n"
-     "`endif\n"
-     "  D = 3    // baz\n"
-     "} foo_t;\n"},
-    {// with scalar dimensions
-     "typedef enum logic[2]\t{ A=0, B=1 }foo_t;",
-     "typedef enum logic [2] {\n"
-     "  A = 0,\n"
-     "  B = 1\n"
-     "} foo_t;\n"},
-    {// with range dimensions
-     "typedef enum logic[1:0]\t{ A=0, B=1 }foo_t;",
-     "typedef enum logic [1:0] {\n"
-     "  A = 0,\n"
-     "  B = 1\n"
-     "} foo_t;\n"},
-    {"typedef foo_pkg::baz_t#(.L(L), .W(W)) bar_t;\n",
-     "typedef foo_pkg::baz_t#(\n"
-     "    .L(L),\n"
-     "    .W(W)\n"
-     ") bar_t;\n"},
-    // unqualified parameterized type keeps a space before '#'
-    {"typedef dv_base_env_cov #(.CFG_T(tl_agent_env_cfg)) tl_agent_env_cov;\n",
-     "typedef dv_base_env_cov #(\n"
-     "    .CFG_T(tl_agent_env_cfg)\n"
-     ") tl_agent_env_cov;\n"},
-    // ... and is inserted when absent
-    {"typedef dv_base_env_cov#(.CFG_T(tl_agent_env_cfg)) tl_agent_env_cov;\n",
-     "typedef dv_base_env_cov #(\n"
-     "    .CFG_T(tl_agent_env_cfg)\n"
-     ") tl_agent_env_cov;\n"},
-    // single short parameter stays on one line
-    {"typedef my_class #(.P(P)) my_class_t;\n",
-     "typedef my_class #(.P(P)) my_class_t;\n"},
-
-    // package test cases
-    {"package fedex;localparam  int  www=3 ;endpackage   :  fedex\n",
-     "package fedex;\n"
-     "  localparam int www = 3;\n"
-     "endpackage : fedex\n"},
-    {"package   typey ;"
-     "typedef enum int{ A=0, B=1 }foo_t;"
-     "typedef enum{ C=0, D=1 }bar_t;"
-     "endpackage:typey\n",
-     "package typey;\n"
-     "  typedef enum int {\n"
-     "    A = 0,\n"
-     "    B = 1\n"
-     "  } foo_t;\n"
-     "  typedef enum {\n"
-     "    C = 0,\n"
-     "    D = 1\n"
-     "  } bar_t;\n"
-     "endpackage : typey\n"},
-    {// net type declarations
-     "package foo_pkg;"
-     "nettype shortreal\t\tfoo  ;"
-     "nettype\nbar[1:0 ] baz  with\tquux ;"
-     "endpackage",
-     "package foo_pkg;\n"
-     "  nettype shortreal foo;\n"
-     "  nettype bar [1:0] baz with quux;\n"
-     "endpackage\n"},
-    {"package foo_pkg; \n"
-     "// function description.......\n"
-     "function automatic void bar();"
-     "endfunction "
-     "endpackage\n",
-     "package foo_pkg;\n"
-     "  // function description.......\n"
-     "  function automatic void bar();\n"
-     "  endfunction\n"
-     "endpackage\n"},
-    {"package foo_pkg; \n"
-     "// function description.......\n"
-     "function void bar(string name=\"x\" ) ;"
-     "endfunction "
-     "endpackage\n",
-     "package foo_pkg;\n"
-     "  // function description.......\n"
-     "  function void bar(string name = \"x\");\n"
-     "  endfunction\n"
-     "endpackage\n"},
-    {" package foo_pkg; \n"
-     "// class description.............\n"
-     "class classy;"
-     "endclass "
-     "endpackage\n",
-     "package foo_pkg;\n"
-     "  // class description.............\n"
-     "  class classy;\n"
-     "  endclass\n"
-     "endpackage\n"},
-    {"package\tfoo_pkg; \n"
-     "// class description.............\n"
-     "class   classy;    \n"
-     "// function description.......\n"
-     "function\nautomatic   void bar( );"
-     "endfunction   "
-     "endclass\t"
-     "endpackage\n",
-     "package foo_pkg;\n"
-     "  // class description.............\n"
-     "  class classy;\n"
-     "    // function description.......\n"
-     "    function automatic void bar();\n"
-     "    endfunction\n"
-     "  endclass\n"
-     "endpackage\n"},
-    {"package fedex;\n"
-     "  import \"asdf\" context function void bar(\n"
-     "    input bit              [2:1] aaaa,   // EOL COMMENT\n"
-     "                                          // another\n"
-     "    input bit foo\n"
-     "  );\n"
-     "endpackage\n",
-     "package fedex;\n"
-     "  import \"asdf\" context\n"
-     "      function void bar(\n"
-     "    input\n        bit [2:1] aaaa,  // EOL COMMENT\n"
-     "                         // another\n"
-     "    input bit foo\n"
-     "  );\n"
-     "endpackage\n"},
-
-    // function test cases
-    {"function f ;endfunction", "function f;\nendfunction\n"},
-    {"function f ;endfunction:   f", "function f;\nendfunction : f\n"},
-    {"function f ( );endfunction", "function f();\nendfunction\n"},
-    {"function f (input bit x);endfunction",
-     "function f(input bit x);\nendfunction\n"},
-    {"function f (input bit x,logic y );endfunction",
-     "function f(input bit x, logic y);\nendfunction\n"},
-    {"function f;\n// statement comment\nendfunction\n",
-     "function f;\n"
-     "  // statement comment\n"  // indented
-     "endfunction\n"},
-    {"function f();\n// statement comment\nendfunction\n",
-     "function f();\n"
-     "  // statement comment\n"  // indented
-     "endfunction\n"},
-    {"function f(input int x);\n"
-     "// statement comment\n"
-     "f=x;\n"
-     "// statement comment\n"
-     "endfunction\n",
-     "function f(input int x);\n"
-     "  // statement comment\n"  // indented
-     "  f = x;\n"
-     "  // statement comment\n"  // indented
-     "endfunction\n"},
-    {// line breaks around assignments
-     "function f;a=b;c+=d;endfunction",
-     "function f;\n"
-     "  a = b;\n"
-     "  c += d;\n"
-     "endfunction\n"},
-    {"function f;a&=b;c=d;endfunction",
-     "function f;\n"
-     "  a &= b;\n"
-     "  c = d;\n"
-     "endfunction\n"},
-    {"function f;a<<=b;c=b;d>>>=b;endfunction",
-     "function f;\n"
-     "  a <<= b;\n"
-     "  c = b;\n"
-     "  d >>>= b;\n"
-     "endfunction\n"},
-    {// port declaration exceeds line length limit
-     "function f (loooong_type if_it_fits_I_sits);endfunction",
-     "function f(\n"
-     "    loooong_type if_it_fits_I_sits);\n"
-     "endfunction\n"},
-    {"function\nvoid\tspace;a=( b+c )\n;endfunction   :space\n",
-     "function void space;\n"
-     "  a = (b + c);\n"
-     "endfunction : space\n"},
-    {"function\nvoid\twarranty;return  to_sender\n;endfunction   :warranty\n",
-     "function void warranty;\n"
-     "  return to_sender;\n"
-     "endfunction : warranty\n"},
-    {// if statement that fits on one line
-     "function if_i_fits_i_sits;"
-     "if(x)y=x;"
-     "endfunction",
-     "function if_i_fits_i_sits;\n"
-     "  if (x) y = x;\n"
-     "endfunction\n"},
-    {// for loop
-     "function\nvoid\twarranty;for(j=0; j<k; --k)begin "
-     "++j\n;end endfunction   :warranty\n",
-     "function void warranty;\n"
-     "  for (j = 0; j < k; --k) begin\n"
-     "    ++j;\n"
-     "  end\n"
-     "endfunction : warranty\n"},
-    {// for loop that needs wrapping
-     "function\nvoid\twarranty;for(jjjjj=0; jjjjj<kkkkk; --kkkkk)begin "
-     "++j\n;end endfunction   :warranty\n",
-     "function void warranty;\n"
-     "  for (\n"
-     "      jjjjj = 0; jjjjj < kkkkk; --kkkkk\n"
-     "  ) begin\n"
-     "    ++j;\n"
-     "  end\n"
-     "endfunction : warranty\n"},
-    {// for loop that needs more wrapping
-     "function\nvoid\twarranty;"
-     "for(jjjjjjjj=0; jjjjjjjj<kkkkkkkk; --kkkkkkkk)begin "
-     "++j\n;end endfunction   :warranty\n",
-     "function void warranty;\n"
-     "  for (\n"
-     "      jjjjjjjj = 0;\n"
-     "      jjjjjjjj < kkkkkkkk;\n"
-     "      --kkkkkkkk\n"
-     "  ) begin\n"
-     "    ++j;\n"
-     "  end\n"
-     "endfunction : warranty\n"},
-    {// for loop that fits on one line
-     "function loop_fits;"
-     "for(x=0;x<N;++x) y=x;"
-     "endfunction",
-     "function loop_fits;\n"
-     "  for (x = 0; x < N; ++x) y = x;\n"
-     "endfunction\n"},
-    {// for loop that would fit on one line, but is force-split with //comment
-     "function loop_fits;"
-     "for(x=0;x<N;++x) //\n y=x;"
-     "endfunction",
-     "function loop_fits;\n"
-     "  for (x = 0; x < N; ++x)  //\n"
-     "    y = x;\n"
-     "endfunction\n"},
-    {// for loop with function call in initializer
-     "function  void looper(); "
-     "for (int i=f(n); i>=0; i -- ) begin end "
-     "endfunction",
-     "function void looper();\n"
-     "  for (int i = f(n); i >= 0; i--) begin\n"
-     "  end\n"
-     "endfunction\n"},
-    {// for loop with function call in condition
-     "function  void looper(); "
-     "for (int i=0; i<f(m); i -- ) begin end "
-     "endfunction",
-     "function void looper();\n"
-     "  for (int i = 0; i < f(m); i--) begin\n"
-     "  end\n"
-     "endfunction\n"},
-    {// forever loop
-     "function\nvoid\tforevah;forever  begin "
-     "++k\n;end endfunction\n",
-     "function void forevah;\n"
-     "  forever begin\n"
-     "    ++k;\n"
-     "  end\n"
-     "endfunction\n"},
-    {// forever loop
-     "function\nvoid\tforevah;forever  "
-     "++k\n;endfunction\n",
-     "function void forevah;\n"
-     "  forever ++k;\n"
-     "endfunction\n"},
-    {// forever loop, forced break
-     "function\nvoid\tforevah;forever     //\n"
-     "++k\n;endfunction\n",
-     "function void forevah;\n"
-     "  forever  //\n"
-     "    ++k;\n"
-     "endfunction\n"},
-    {// repeat loop
-     "function\nvoid\tpete;repeat(3)  begin "
-     "++k\n;end endfunction\n",
-     "function void pete;\n"
-     "  repeat (3) begin\n"
-     "    ++k;\n"
-     "  end\n"
-     "endfunction\n"},
-    {// repeat loop
-     "function\nvoid\tpete;repeat(3)  "
-     "++k\n;endfunction\n",
-     "function void pete;\n"
-     "  repeat (3)++k;\n"  // TODO(fangism): space before ++
-     "endfunction\n"},
-    {// repeat loop, forced break
-     "function\nvoid\tpete;repeat(3)//\n"
-     "++k\n;endfunction\n",
-     "function void pete;\n"
-     "  repeat (3)  //\n"
-     "    ++k;\n"
-     "endfunction\n"},
-    {// while loop
-     "function\nvoid\twily;while( coyote )  begin "
-     "++super_genius\n;end endfunction\n",
-     "function void wily;\n"
-     "  while (coyote) begin\n"
-     "    ++super_genius;\n"
-     "  end\n"
-     "endfunction\n"},
-    {// while loop
-     "function\nvoid\twily;while( coyote )  "
-     "++ super_genius\n;   endfunction\n",
-     "function void wily;\n"
-     "  while (coyote)++super_genius;\n"  // TODO(fangism): space before ++
-     "endfunction\n"},
-    {// while loop, forced break
-     "function\nvoid\twily;while( coyote ) //\n "
-     "++ super_genius\n;   endfunction\n",
-     "function void wily;\n"
-     "  while (coyote)  //\n"
-     "    ++super_genius;\n"
-     "endfunction\n"},
-    {// do-while loop
-     "function\nvoid\tdonot;do  begin "
-     "++s\n;end  while( z);endfunction\n",
-     "function void donot;\n"
-     "  do begin\n"
-     "    ++s;\n"
-     "  end while (z);\n"
-     "endfunction\n"},
-    {// do-while loop, single statement
-     "function\nvoid\tdonot;do  "
-     "++s\n;  while( z);endfunction\n",
-     "function void donot;\n"
-     "  do ++s; while (z);\n"
-     "endfunction\n"},
-    {// do-while loop, single statement, forced break
-     "function\nvoid\tdonot;do  "
-     "++s\n;//\n  while( z);endfunction\n",
-     "function void donot;\n"
-     "  do\n"
-     "    ++s;  //\n"
-     "  while (z);\n"
-     "endfunction\n"},
-    {// foreach loop
-     "function\nvoid\tforeacher;foreach( m [n] )  begin "
-     "++m\n;end endfunction\n",
-     "function void foreacher;\n"
-     "  foreach (m[n]) begin\n"
-     "    ++m;\n"
-     "  end\n"
-     "endfunction\n"},
-    {// spaces in condition expression
-     "function f; return {a}? {b} :{ c };endfunction",
-     "function f;\n"
-     "  return {a} ? {b} : {c};\n"
-     "endfunction\n"},
-    {"task t;endtask",
-     "task t;\n"
-     "endtask\n"},
-    {"task t (   );endtask",
-     "task t();\n"
-     "endtask\n"},
-    {"task t (input    bit   drill   ) ;endtask",
-     "task t(input bit drill);\n"
-     "endtask\n"},
-    {"task t; ## 100 ;endtask",
-     "task t;\n"
-     "  ##100;\n"
-     "endtask\n"},
-    {"task t; ## (1+1) ;endtask",  // delay expression
-     "task t;\n"
-     "  ##(1 + 1);\n"
-     "endtask\n"},
-    {"task t; ## delay_value ;endtask",
-     "task t;\n"
-     "  ##delay_value;\n"
-     "endtask\n"},
-    {"task t; ## `DELAY_VALUE ;endtask",
-     "task t;\n"
-     "  ##`DELAY_VALUE;\n"
-     "endtask\n"},
-    {"task t;\n"
-     "`uvm_error( foo,bar);\n"
-     "endtask\n",
-     "task t;\n"
-     "  `uvm_error(foo, bar);\n"
-     "endtask\n"},
-    {"task t;\n"
-     "`uvm_error(foo,bar)\n"
-     ";\n"  // null statement
-     "endtask\n",
-     "task t;\n"
-     "  `uvm_error(foo, bar)\n"
-     "  ;\n"
-     "endtask\n"},
-    {"task t;\n"
-     "if(expr)begin\t\n"
-     "`uvm_error(foo,bar);\n"
-     "end\n"
-     "endtask\n",
-     "task t;\n"
-     "  if (expr) begin\n"
-     "    `uvm_error(foo, bar);\n"
-     "  end\n"
-     "endtask\n"},
-    {"task\nrabbit;$kill(the,\nrabbit)\n;endtask:  rabbit\n",
-     "task rabbit;\n"
-     "  $kill(the, rabbit);\n"
-     "endtask : rabbit\n"},
-    {"function  int foo( );if( a )a+=1 ; endfunction",
-     "function int foo();\n"
-     "  if (a) a += 1;\n"
-     "endfunction\n"},
-    {"function  void foo( );foo=`MACRO(b,c) ; endfunction",
-     "function void foo();\n"
-     "  foo = `MACRO(b, c);\n"
-     "endfunction\n"},
-    {"module foo;if    \t  (bar)begin assign a=1; end endmodule",
-     "module foo;\n"
-     "  if (bar) begin\n"
-     "    assign a = 1;\n"
-     "  end\n"
-     "endmodule\n"},
-    {"module proc_cont_assigner;\n"
-     "always begin\n"
-     "assign x1 =   y1;\n"
-     "deassign   x2 ;\n"
-     "force x3=y3;\n"
-     "release   x4 ;\n"
-     "end\n"
-     "endmodule\n",
-     "module proc_cont_assigner;\n"
-     "  always begin\n"
-     "    assign x1 = y1;\n"
-     "    deassign x2;\n"
-     "    force x3 = y3;\n"
-     "    release x4;\n"
-     "  end\n"
-     "endmodule\n"},
-    {"module g_test(  );\n"
-     "\tinitial begin:main_test \t"
-     "for(int i=0;i<k;i++)begin "
-     "case(i )\n"
-     " 6'd0  :release in[0];  \n"
-     "   endcase  "
-     " \t\tend \t"
-     "\t end:main_test\n"
-     "endmodule:g_test\n",
-     "module g_test ();\n"
-     "  initial begin : main_test\n"
-     "    for (int i = 0; i < k; i++) begin\n"
-     "      case (i)\n"
-     "        6'd0: release in[0];\n"
-     "      endcase\n"
-     "    end\n"
-     "  end : main_test\n"
-     "endmodule : g_test\n"},
-    {// conditional generate (case)
-     "module mc; case(s)a : bb c ; d : ee f; endcase endmodule",
-     "module mc;\n"
-     "  case (s)\n"
-     "    a: bb c;\n"
-     "    d: ee f;\n"
-     "  endcase\n"
-     "endmodule\n"},
-    {// conditional generate (case), with comments
-     "module mc; case(s)\n//comment a\na:bb  c;\n//comment b\n endcase "
-     "endmodule",
-     "module mc;\n"
-     "  case (s)\n"
-     "    //comment a\n"  // indented to case-item level
-     "    a: bb c;\n"
-     "    //comment b\n"  // indented to case-item level
-     "  endcase\n"
-     "endmodule\n"},
-
-    {// "default:", not "default :"
-     "function f; case (x) default: x=y; endcase endfunction\n",
-     "function f;\n"
-     "  case (x)\n"
-     "    default: x = y;\n"
-     "  endcase\n"
-     "endfunction\n"},
-    {// default with null statement: "default: ;", not "default :;"
-     "function f; case (x) default :; endcase endfunction\n",
-     "function f;\n"
-     "  case (x)\n"
-     "    default: ;\n"
-     "  endcase\n"
-     "endfunction\n"},
-    {// case statement
-     "function f; case (x) State0 : a=b; State1 : begin a=b; end "
-     "endcase endfunction\n",
-     "function f;\n"
-     "  case (x)\n"
-     "    State0: a = b;\n"
-     "    State1: begin\n"
-     "      a = b;\n"
-     "    end\n"
-     "  endcase\n"
-     "endfunction\n"},
-    {// case statement, interleaved with comments
-     "function f; case (x) \n//c1\nState0 : a=b;//c2\n//c3\n State1 : "
-     "a=b;//c4\n//c5\n "
-     "endcase endfunction\n",
-     "function f;\n"
-     "  case (x)\n"
-     "    //c1\n"
-     "    State0: a = b;  //c2\n"
-     "    //c3\n"
-     "    State1: a = b;  //c4\n"
-     "    //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",
-     "function f;\n"
-     "  case (x) inside\n"
-     "    k1: return b;\n"
-     "    k2: begin\n"
-     "      return b;\n"
-     "    end\n"
-     "  endcase\n"
-     "endfunction\n"},
-    {// case inside statement, with ranges
-     "function f; case (x) inside[a:b] : return b; [c:d] : return b; "
-     "default :return z;"
-     "endcase endfunction\n",
-     "function f;\n"
-     "  case (x) inside\n"
-     "    [a : b]: return b;\n"
-     "    [c : d]: return b;\n"
-     "    default: return z;\n"
-     "  endcase\n"
-     "endfunction\n"},
-    {// case pattern statement
-     "function f;"
-     "case (y) matches "
-     ".foo   : return 0;"
-     ".*\t: return 1;"
-     "endcase "
-     "case (z) matches "
-     ".foo\t\t: return 0;"
-     ".*   : return 1;"
-     "endcase "
-     "endfunction",
-     "function f;\n"
-     "  case (y) matches\n"
-     "    .foo: return 0;\n"
-     "    .*: return 1;\n"
-     "  endcase\n"
-     "  case (z) matches\n"
-     "    .foo: return 0;\n"
-     "    .*: return 1;\n"
-     "  endcase\n"
-     "endfunction\n"},
-    {// keep short case items on one line
-     "function f; case (x)k1 : if( b )break; default :return 2;"
-     "endcase endfunction\n",
-     "function f;\n"
-     "  case (x)\n"
-     "    k1:      if (b) break;\n"  // aligned
-     "    default: return 2;\n"
-     "  endcase\n"
-     "endfunction\n"},
-    {// keep short default items on one line
-     "function f; case (x)k1 :break; default :if( c )return 2;"
-     "endcase endfunction\n",
-     "function f;\n"
-     "  case (x)\n"
-     "    k1:      break;\n"  // aligned
-     "    default: if (c) return 2;\n"
-     "  endcase\n"
-     "endfunction\n"},
-    {// keep short case inside items on one line
-     "function f; case (x)inside k1 : if( b )return c; k2 : return a;"
-     "endcase endfunction\n",
-     "function f;\n"
-     "  case (x) inside\n"
-     "    k1: if (b) return c;\n"
-     "    k2: return a;\n"
-     "  endcase\n"
-     "endfunction\n"},
-    {// keep short case pattern items on one line
-     "function f;"
-     "case (y) matches "
-     ".foo   :if( n )return 0;"
-     ".*\t: return 1;"
-     "endcase "
-     "endfunction",
-     "function f;\n"
-     "  case (y) matches\n"
-     "    .foo: if (n) return 0;\n"
-     "    .*: return 1;\n"
-     "  endcase\n"
-     "endfunction\n"},
-    {// randcase
-     "function f; randcase k1 : return c; k2 : return a;"
-     "endcase endfunction\n",
-     "function f;\n"
-     "  randcase\n"
-     "    k1: return c;\n"
-     "    k2: return a;\n"
-     "  endcase\n"
-     "endfunction\n"},
-
-    // This tests checks for not breaking around hierarchy operators.
-    {"function\nvoid\twarranty;"
-     "foo.bar = fancyfunction(aaaaaaaa.bbbbbbb,"
-     "    ccccccccc.ddddddddd) ;"
-     "endfunction   :warranty\n",
-     "function void warranty;\n"
-     "  foo.bar = fancyfunction(\n"
-     "      aaaaaaaa.bbbbbbb,\n"
-     "      ccccccccc.ddddddddd\n"
-     "  );\n"
-     "endfunction : warranty\n"},
-
-    // Group of tests testing partitioning of arguments inside function calls
-    {// function with function call inside if statement header
-     "function foo;if(aa(bb,cc));endfunction\n",
-     "function foo;\n"
-     "  if (aa(bb, cc));\n"
-     "endfunction\n"},
-    {// function with function call inside if statement header and with
-     // begin-end block
-     "function foo;if (aa(bb,cc,dd,ee))begin end endfunction\n",
-     "function foo;\n"
-     "  if (aa(bb, cc, dd, ee)) begin\n"
-     "  end\n"
-     "endfunction\n"},
-    {// function with kMethodCallExtension inside if statement header and with
-     // begin-end block
-     "function foo;if (aa.bb(cc,dd,ee))begin end endfunction\n",
-     "function foo;\n"
-     "  if (aa.bb(cc, dd, ee)) begin\n"
-     "  end\n"
-     "endfunction\n"},
-    {// nested kMethodCallExtension calls - one level
-     "function foo;aa.bb(cc.dd(a1), ee.ff(a2));endfunction\n",
-     "function foo;\n"
-     "  aa.bb(cc.dd(a1), ee.ff(a2));\n"
-     "endfunction\n"},
-    {// nested kMethodCallExtension calls - two level
-     "function foo;aa.bb(cc.dd(a1.b1(a2), b1), ee.ff(c1, d1));endfunction\n",
-     "function foo;\n"
-     "  aa.bb(cc.dd(a1.b1(a2), b1), ee.ff(\n"
-     "        c1, d1));\n"
-     "endfunction\n"},
-
-    {// simple initial statement with function call
-     "module m;initial aa(bb,cc,dd,ee);endmodule\n",
-     "module m;\n"
-     "  initial aa(bb, cc, dd, ee);\n"
-     "endmodule\n"},
-    {// expressions and function calls inside if-statement headers
-     "module m;initial begin if(aa(bb)==cc(dd))a=b;if (xx()) b = a;end "
-     "endmodule\n",
-     "module m;\n"
-     "  initial begin\n"
-     "    if (aa(bb) == cc(dd)) a = b;\n"
-     "    if (xx()) b = a;\n"
-     "  end\n"
-     "endmodule\n"},
-    {// fuction with two arguments inside if-statement headers
-     "module\nm;initial\nbegin\nif(aa(bb,cc))x=y;end\nendmodule\n",
-     "module m;\n"
-     "  initial begin\n"
-     "    if (aa(bb, cc)) x = y;\n"
-     "  end\n"
-     "endmodule\n"},
-    {// kMethodCallExtension inside if-statement headers
-     "module m;initial begin if (aa.bb(cc)) x = y;end endmodule",
-     "module m;\n"
-     "  initial begin\n"
-     "    if (aa.bb(cc)) x = y;\n"
-     "  end\n"
-     "endmodule\n"},
-    {// initial statement with object method call
-     "module m; initial a.b(a,b,c); endmodule\n",
-     "module m;\n"
-     "  initial a.b(a, b, c);\n"
-     "endmodule\n"},
-    {// initial statement with method call on indexed object
-     "module m; initial a[i].b(a,b,c); endmodule\n",
-     "module m;\n"
-     "  initial a[i].b(a, b, c);\n"
-     "endmodule\n"},
-    {// initial statement with method call on function returned object
-     "module m; initial a(d,e,f).b(a,b,c); endmodule\n",
-     "module m;\n"
-     "  initial a(d, e, f).b(a, b, c);\n"
-     "endmodule\n"},
-    {// initial statement with indexed access to function returned object
-     "module m; initial a(a,b,c)[i]; endmodule\n",
-     "module m;\n"
-     "  initial a(a, b, c) [i];\n"
-     "endmodule\n"},
-    {// method call with no arguments on an object
-     "module m; initial foo.bar();endmodule\n",
-     "module m;\n"
-     "  initial foo.bar();\n"
-     "endmodule\n"},
-    {// method call with one argument on an object
-     "module m; initial foo.bar(aa);endmodule\n",
-     "module m;\n"
-     "  initial foo.bar(aa);\n"
-     "endmodule\n"},
-    {// method call with two arguments on an object
-     "module m; initial foo.bar(aa,bb);endmodule\n",
-     "module m;\n"
-     "  initial foo.bar(aa, bb);\n"
-     "endmodule\n"},
-    {// method call with three arguments on an object
-     "module m; initial foo.bar(aa,bb,cc);endmodule\n",
-     "module m;\n"
-     "  initial foo.bar(aa, bb, cc);\n"
-     "endmodule\n"},
-
-    {
-        // This tests for if-statements with null statements
-        "function foo;"
-        "if (zz) ; "
-        "if (yy) ; "
-        "endfunction",
-        "function foo;\n"
-        "  if (zz);\n"
-        "  if (yy);\n"
-        "endfunction\n",
-    },
-
-    {
-        // This tests for if-statements starting on their own line.
-        "function foo;"
-        "if (zz) begin "
-        "return 0;"
-        "end "
-        "if (yy) begin "
-        "return 1;"
-        "end "
-        "endfunction",
-        "function foo;\n"
-        "  if (zz) begin\n"
-        "    return 0;\n"
-        "  end\n"
-        "  if (yy) begin\n"
-        "    return 1;\n"
-        "  end\n"
-        "endfunction\n",
-    },
-
-    {
-        // This tests for if-statements with single statement bodies
-        "function foo;"
-        "if (zz) return 0;"
-        "if (yy) return 1;"
-        "endfunction",
-        "function foo;\n"
-        "  if (zz) return 0;\n"
-        "  if (yy) return 1;\n"
-        "endfunction\n",
-    },
-
-    {
-        // This tests for if-statement mixed with plain statements
-        "function foo;"
-        "a=b;"
-        "if (zz) return 0;"
-        "c=d;"
-        "endfunction",
-        "function foo;\n"
-        "  a = b;\n"
-        "  if (zz) return 0;\n"
-        "  c = d;\n"
-        "endfunction\n",
-    },
-
-    {
-        // This tests for if-statement with forced break mixed with others
-        "function foo;"
-        "a=b;"
-        "if (zz)//\n return 0;"
-        "c=d;"
-        "endfunction",
-        "function foo;\n"
-        "  a = b;\n"
-        "  if (zz)  //\n"
-        "    return 0;\n"
-        "  c = d;\n"
-        "endfunction\n",
-    },
-    {
-        "function t;"
-        "if (r == t)"
-        "a.b(c);"
-        "endfunction",
-        "function t;\n"
-        "  if (r == t) a.b(c);\n"
-        "endfunction\n",
-    },
-
-    {// This tests for for-statement with forced break mixed with others
-     "function f;"
-     "x=y;"
-     "for (int i=0; i<S*IPS; i++) #1ps a += $urandom();"
-     "return 2;"
-     "endfunction",
-     "function f;\n"
-     "  x = y;\n"
-     "  for (int i = 0; i < S * IPS; i++)\n"  // doesn't fit, so indents
-     "    #1ps a += $urandom();\n"
-     "  return 2;\n"
-     "endfunction\n"},
-
-    {
-        // This tests for-statements with null statements
-        "function foo;"
-        "for(;;)  ;\t"
-        "for(;;)  ;\t"
-        "endfunction",
-        "function foo;\n"
-        "  for (;;);\n"
-        "  for (;;);\n"
-        "endfunction\n",
-    },
-
-    {
-        // This tests for if-else-statements with null statements
-        "function foo;"
-        "if (zz) ;  else  ;"
-        "if (yy) ;   else   ;"
-        "endfunction",
-        "function foo;\n"
-        "  if (zz);\n"
-        "  else;\n"
-        "  if (yy);\n"
-        "  else;\n"
-        "endfunction\n",
-    },
-
-    {
-        // This tests for end-else-begin.
-        "function foo;"
-        "if (zz) begin "
-        "return 0;"
-        "end "
-        "else "
-        "begin "
-        "return 1;"
-        "end "
-        "endfunction",
-        "function foo;\n"
-        "  if (zz) begin\n"
-        "    return 0;\n"
-        "  end else begin\n"
-        "    return 1;\n"
-        "  end\n"
-        "endfunction\n",
-    },
-    {
-        // This tests for end-else-if
-        "function foo;"
-        "if (zz) begin "
-        "return 0;"
-        "end "
-        "else "
-        "if(yy)begin "
-        "return 1;"
-        "end "
-        "endfunction",
-        "function foo;\n"
-        "  if (zz) begin\n"
-        "    return 0;\n"
-        "  end else if (yy) begin\n"
-        "    return 1;\n"
-        "  end\n"
-        "endfunction\n",
-    },
-    {
-        // This tests labeled end-else-if
-        "function foo;"
-        "if (zz) begin : label1 "
-        "return 0;"
-        "end : label1 "
-        "else if (yy) begin : label2 "
-        "return 1;"
-        "end : label2 "
-        "endfunction",
-        "function foo;\n"
-        "  if (zz) begin : label1\n"
-        "    return 0;\n"
-        "  end : label1\n"
-        "  else if (yy) begin : label2\n"
-        "    return 1;\n"
-        "  end : label2\n"
-        "endfunction\n",
-    },
-    {
-        // This tests labeled end-else-if-else
-        "function foo;"
-        "if (zz) begin : label1 "
-        "return 0;"
-        "end : label1 "
-        "else if (yy) begin : label2 "
-        "return 1;"
-        "end : label2 "
-        "else begin : label3 "
-        "return 2;"
-        "end : label3 "
-        "endfunction",
-        "function foo;\n"
-        "  if (zz) begin : label1\n"
-        "    return 0;\n"
-        "  end : label1\n"
-        "  else if (yy) begin : label2\n"
-        "    return 1;\n"
-        "  end : label2\n"
-        "  else begin : label3\n"
-        "    return 2;\n"
-        "  end : label3\n"
-        "endfunction\n",
-    },
-
-    {
-        // randomize function
-        "function r ;"
-        "if ( ! randomize (bar )) begin    end "
-        "if ( ! obj.randomize (bar )) begin    end "
-        "endfunction",
-        "function r;\n"
-        "  if (!randomize(bar)) begin\n"
-        "  end\n"
-        "  if (!obj.randomize(bar)) begin\n"
-        "  end\n"
-        "endfunction\n",
-    },
-    {
-        // randomize-with call, with comments
-        "function f;"
-        "s = std::randomize() with {\n"
-        "// comment1\n"
-        "a == e;\n"
-        "// comment2\n"
-        "};"
-        "endfunction\n",
-        "function f;\n"
-        "  s = std::randomize() with {\n"
-        "    // comment1\n"
-        "    a == e;\n"
-        "    // comment2\n"
-        "  };\n"
-        "endfunction\n",
-    },
-    {
-        // randomize-with call, with comments, one joined
-        "function f;"
-        "s = std::randomize() with {\n"
-        "// comment1\n"
-        "a == e;// comment2\n"
-        "};"
-        "endfunction\n",
-        "function f;\n"
-        "  s = std::randomize() with {\n"
-        "    // comment1\n"
-        "    a == e;  // comment2\n"
-        "  };\n"
-        "endfunction\n",
-    },
-    {
-        // randomize-with call, with comment, and conditional
-        "function f;"
-        "s = std::randomize() with {\n"
-        "// comment\n"
-        "a == e;"
-        "if (x) {"
-        "a;"
-        "}"
-        "};"
-        "endfunction\n",
-        "function f;\n"
-        "  s = std::randomize() with {\n"
-        "    // comment\n"
-        "    a == e;\n"
-        "    if (x) {a;}\n"  // TODO(fangism): consider expanding
-        "  };\n"
-        "endfunction\n",
-    },
-
-    // module declaration test cases
-    {"   module       foo  ;     endmodule\n",
-     "module foo;\n"
-     "endmodule\n"},
-    {"   module       foo   (    )   ;     endmodule\n",
-     "module foo ();\n"
-     "endmodule\n"},
-    {"   module       foo   (  .x (  x) );     endmodule\n",
-     "module foo (\n"
-     "    .x(x)\n"
-     ");\n"
-     "endmodule\n"},
-    {"   module       foo   (  .x (  x)  \n,\n . y "
-     "  ( \ny) );     endmodule\n",
-     "module foo (\n"
-     "    .x(x),\n"
-     "    .y(y)\n"
-     ");\n"
-     "endmodule\n"},
-
-    // module instantiation test cases
-    {"  module foo   ; bar bq();endmodule\n",
-     "module foo;\n"
-     "  bar bq ();\n"  // single instance
-     "endmodule\n"},
-    {"  module foo   ; bar bq(), bq2(  );endmodule\n",
-     "module foo;\n"
-     "  bar bq (), bq2 ();\n"  // multiple instances, still fitting on one line
-     "endmodule\n"},
-    {"module foo; bar #(.N(N)) bq (.bus(bus));endmodule\n",
-     // instance parameter and port fits on line
-     "module foo;\n"
-     "  bar #(.N(N)) bq (.bus(bus));\n"
-     "endmodule\n"},
-    {"module foo; bar #(.N(N),.M(M)) bq ();endmodule\n",  // two named params
-     "module foo;\n"
-     "  bar #(\n"
-     "      .N(N),\n"
-     "      .M(M)\n"
-     "  ) bq ();\n"
-     "endmodule\n"},
-    {"module foo; bar #(//comment\n.N(N),.M(M)) bq ();endmodule\n",
-     "module foo;\n"
-     "  bar #(  //comment\n"  // EOL comment before first param
-     "      .N(N),\n"
-     "      .M(M)\n"
-     "  ) bq ();\n"
-     "endmodule\n"},
-    {"module foo; bar #(.N(N),//comment\n.M(M)) bq ();endmodule\n",
-     "module foo;\n"
-     "  bar #(\n"
-     "      .N(N),  //comment\n"  // EOL comment after first param
-     "      .M(M)\n"
-     "  ) bq ();\n"
-     "endmodule\n"},
-    {"module foo; bar #(.N(N),.M(M)//comment\n) bq ();endmodule\n",
-     "module foo;\n"
-     "  bar #(\n"
-     "      .N(N),\n"
-     "      .M(M)   //comment\n"  // EOL comment after last param
-     "  ) bq ();\n"
-     "endmodule\n"},
-    {"  module foo   ; bar bq(aa,bb,cc);endmodule\n",
-     "module foo;\n"
-     "  bar bq (\n"
-     "      aa,\n"
-     "      bb,\n"
-     "      cc\n"
-     "  );\n"  // multiple positional ports, one per line
-     "endmodule\n"},
-    {"  module foo   ; bar bq(aa,\n"
-     "`ifdef BB\n"
-     "bb,\n"
-     "`endif\n"
-     "cc);endmodule\n",
-     "module foo;\n"
-     "  bar bq (\n"
-     "      aa,\n"
-     "`ifdef BB\n"
-     "      bb,\n"  // keep same indentation as outside conditional
-     "`endif\n"
-     "      cc\n"
-     "  );\n"  // multiple positional ports, one per line
-     "endmodule\n"},
-    {"  module foo   ; bar bq(.aa,.bb);endmodule\n",
-     "module foo;\n"
-     "  bar bq (\n"
-     "      .aa,\n"
-     "      .bb\n"
-     "  );\n"  // multiple named ports, one per line
-     "endmodule\n"},
-    {"  module foo   ; bar bq(.aa(aa),.bb(bb));endmodule\n",
-     "module foo;\n"
-     "  bar bq (\n"
-     "      .aa(aa),\n"
-     "      .bb(bb)\n"
-     "  );\n"  // multiple named ports, one per line
-     "endmodule\n"},
-    {"  module foo   ; bar bq(.aa(aa),\n"
-     "`ifdef ZZ\n"
-     ".zz(  zz  ),\n"
-     "`else\n"
-     ".yy(  yy  ),\n"
-     "`endif\n"
-     ".bb(bb)\n"
-     ");endmodule\n",
-     "module foo;\n"
-     "  bar bq (\n"
-     "      .aa(aa),\n"
-     "`ifdef ZZ\n"
-     "      .zz(zz),\n"
-     "`else\n"
-     "      .yy(yy),\n"
-     "`endif\n"
-     "      .bb(bb)\n"
-     "  );\n"  // multiple named ports, one per line
-     "endmodule\n"},
-    {"  module foo   ; bar#(NNNNNNNN)"
-     "bq(.aa(aaaaaa),.bb(bbbbbb));endmodule\n",
-     "module foo;\n"
-     "  bar #(NNNNNNNN) bq (\n"
-     "      .aa(aaaaaa),\n"
-     "      .bb(bbbbbb)\n"
-     "  );\n"
-     "endmodule\n"},
-    {" module foo   ; barrrrrrr "
-     "bq(.aaaaaa(aaaaaa),.bbbbbb(bbbbbb));endmodule\n",
-     "module foo;\n"
-     "  barrrrrrr bq (\n"
-     "      .aaaaaa(aaaaaa),\n"
-     "      .bbbbbb(bbbbbb)\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module foo; bar #(.NNNNN(NNNNN)) bq (.bussss(bussss));endmodule\n",
-     // instance parameter and port does not fit on line
-     "module foo;\n"
-     "  bar #(\n"
-     "      .NNNNN(NNNNN)\n"
-     "  ) bq (\n"
-     "      .bussss(bussss)\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module foo; bar #(//\n.N(N)) bq (.bus(bus));endmodule\n",
-     "module foo;\n"
-     "  bar #(  //\n"  // would fit on one line, but forced to expand by //
-     "      .N(N)\n"
-     "  ) bq (\n"
-     "      .bus(bus)\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module foo; bar #(\n"
-     "`ifdef MM\n"
-     ".M(M)\n"
-     "`else\n"
-     ".N(N)\n"
-     "`endif\n"
-     ") bq (.bus(bus));endmodule\n",
-     "module foo;\n"
-     "  bar #(\n"
-     "`ifdef MM\n"
-     "      .M(M)\n"
-     "`else\n"
-     "      .N(N)\n"
-     "`endif\n"
-     "  ) bq (\n"
-     "      .bus(bus)\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module foo; bar #(.N(N)//\n) bq (.bus(bus));endmodule\n",
-     "module foo;\n"
-     "  bar #(\n"  // would fit on one line, but forced to expand by //
-     "      .N(N)  //\n"
-     "  ) bq (\n"
-     "      .bus(bus)\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module foo; bar #(.N(N)) bq (//\n.bus(bus));endmodule\n",
-     "module foo;\n"
-     "  bar #(\n"  // would fit on one line, but forced to expand by //
-     "      .N(N)\n"
-     "  ) bq (  //\n"
-     "      .bus(bus)\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module foo; bar #(.N(N)) bq (.bus(bus)//\n);endmodule\n",
-     "module foo;\n"
-     "  bar #(\n"  // would fit on one line, but forced to expand by //
-     "      .N(N)\n"
-     "  ) bq (\n"
-     "      .bus(bus)  //\n"
-     "  );\n"
-     "endmodule\n"},
-    {" module foo   ; bar "
-     "bq(.aaa(aaa),.bbb(bbb),.ccc(ccc),.ddd(ddd));endmodule\n",
-     "module foo;\n"
-     "  bar bq (\n"
-     "      .aaa(aaa),\n"  // ports don't fit on one line, so expanded
-     "      .bbb(bbb),\n"
-     "      .ccc(ccc),\n"
-     "      .ddd(ddd)\n"
-     "  );\n"
-     "endmodule\n"},
-    {" module foo   ; bar "
-     "bq(.aa(aa),.bb(bb),.cc(cc),.dd(dd));endmodule\n",
-     "module foo;\n"
-     "  bar bq (\n"
-     "      .aa(aa),\n"  // one named port per line
-     "      .bb(bb),\n"
-     "      .cc(cc),\n"
-     "      .dd(dd)\n"
-     "  );\n"
-     "endmodule\n"},
-    {" module foo   ; bar "
-     "bq(.aa(aa),//\n.bb(bb),.cc(cc),.dd(dd));endmodule\n",
-     "module foo;\n"
-     "  bar bq (\n"
-     "      .aa(aa),  //\n"  // forced to expand by //
-     "      .bb(bb),\n"
-     "      .cc(cc),\n"
-     "      .dd(dd)\n"
-     "  );\n"
-     "endmodule\n"},
-    {" module foo   ; bar "
-     "bq(.aa(aa),.bb(bb),.cc(cc),.dd(dd)//\n);endmodule\n",
-     "module foo;\n"
-     "  bar bq (\n"
-     "      .aa(aa),\n"
-     "      .bb(bb),\n"
-     "      .cc(cc),\n"
-     "      .dd(dd)   //\n"  // forced to expand by //
-     "  );\n"
-     "endmodule\n"},
-    {// gate instantiation test
-     "module m;"
-     "and\tx0(a, \t\tb,c);"
-     "or\nx1(a,  \n b,    d);"
-     "endmodule\n",
-     "module m;\n"
-     "  and x0 (a, b, c);\n"
-     "  or x1 (a, b, d);\n"
-     "endmodule\n"},
-    {// ifdef inside port actuals
-     "module m;  foo bar   (\n"
-     "`ifdef   BAZ\n"
-     "`endif\n"
-     ")  ;endmodule\n",
-     "module m;\n"
-     "  foo bar (\n"
-     "`ifdef BAZ\n"
-     "`endif\n"
-     "  );\n"
-     "endmodule\n"},
-    {// ifdef inside port actuals after a port connection
-     "module m;  foo bar   ( .a (a) ,\n"
-     "`ifdef   BAZ\n"
-     "`endif\n"
-     ")  ;endmodule\n",
-     "module m;\n"
-     "  foo bar (\n"
-     "      .a(a),\n"
-     "`ifdef BAZ\n"
-     "`endif\n"
-     "  );\n"
-     "endmodule\n"},
-    {// ifdef inside port actuals before a port connection
-     "module m;  foo bar   (\n"
-     "`ifdef   BAZ\n"
-     "`endif\n"
-     ". b(b) )  ;endmodule\n",
-     "module m;\n"
-     "  foo bar (\n"
-     "`ifdef BAZ\n"
-     "`endif\n"
-     "      .b(b)\n"
-     "  );\n"
-     "endmodule\n"},
-    {// ifdef-conditional port connection
-     "module m;  foo bar   (\n"
-     "`ifdef   BAZ\n"
-     ". c (\tc) \n"
-     "`endif\n"
-     " )  ;endmodule\n",
-     "module m;\n"
-     "  foo bar (\n"
-     "`ifdef BAZ\n"
-     "      .c(c)\n"
-     "`endif\n"
-     "  );\n"
-     "endmodule\n"},
-    {// ifndef-else-conditional port connection
-     "module m;  foo bar   (\n"
-     "`ifndef   BAZ\n"
-     ". c (\tc) \n"
-     "  `else\n"
-     " . d(d\t)\n"
-     "  `endif\n"
-     " )  ;endmodule\n",
-     "module m;\n"
-     "  foo bar (\n"
-     "`ifndef BAZ\n"
-     "      .c(c)\n"
-     "`else\n"
-     "      .d(d)\n"
-     "`endif\n"
-     "  );\n"
-     "endmodule\n"},
-
-    {// comment following a delay in next line
-     "module t;\n"
-     "reg x;\n"
-     "initial begin\n"
-     "#20\n"
-     "//comment\n"
-     "x = 1;\n"
-     "x = 2;\n"
-     "end\n"
-     "endmodule\n",
-     "module t;\n"
-     "  reg x;\n"
-     "  initial begin\n"
-     "    #20\n"
-     "    //comment\n"
-     "    x = 1;\n"
-     "    x = 2;\n"
-     "  end\n"
-     "endmodule\n"},
-    {// comment following a delay in the same line
-     "module t;\n"
-     "reg x;\n"
-     "initial begin\n"
-     "#20 //comment\n"
-     "x = 1;\n"
-     "x = 2;\n"
-     "end\n"
-     "endmodule\n",
-     "module t;\n"
-     "  reg x;\n"
-     "  initial begin\n"
-     "    #20  //comment\n"
-     "    x = 1;\n"
-     "    x = 2;\n"
-     "  end\n"
-     "endmodule\n"},
-    // Macro calls inside [...]
-    {"module foo;\nlogic [`BAR(1)\n+2] foo;\nendmodule",
-     "module foo;\n"
-     "  logic [`BAR(1)\n"
-     "+2] foo;\n"
-     "endmodule\n"},
-    {"module foo;\nlogic [`BAR(1)+2] foo;\nendmodule",
-     "module foo;\n"
-     "  logic [`BAR(1)+2] foo;\n"
-     "endmodule\n"},
-    {"module foo ();\n  function bar();\n    "
-     "logic [12:34] data[`AAAAAAAAAAAAAAAAAAAAAAAA(1) : "
-     "`BBBBBBBBBBBBBBBBBBBBBBBB(2) + 3];\n  "
-     "endfunction\nendmodule",
-     "module foo ();\n"
-     "  function bar();\n"
-     "    logic [12:34] data[\n"
-     "    `AAAAAAAAAAAAAAAAAAAAAAAA(1) :\n"
-     "    `BBBBBBBBBBBBBBBBBBBBBBBB(2) + 3];\n"
-     "  endfunction\n"
-     "endmodule\n"},
-    {
-        // test that alternate top-syntax mode works
-        "// verilog_syntax: parse-as-module-body\n"
-        "`define           FOO\n",
-        "// verilog_syntax: parse-as-module-body\n"
-        "`define FOO\n",
-    },
-    {
-        // test alternate parsing mode in macro expansion
-        "class foo;\n"
-        "`MY_MACRO(\n"
-        " // verilog_syntax: parse-as-statements\n"
-        " // EOL comment\n"
-        " int count;\n"
-        " if(cfg.enable) begin\n"
-        " count = 1;\n"
-        " end,\n"
-        " utils_pkg::decrement())\n"
-        "endclass\n",
-        "class foo;\n"
-        "  `MY_MACRO(\n"
-        "      // verilog_syntax: parse-as-statements\n"
-        "      // EOL comment\n"
-        "      int count;\n"
-        "      if (cfg.enable) begin\n"
-        "        count = 1;\n"
-        "      end, utils_pkg::decrement())\n"
-        "endclass\n",
-    },
-
-    // tests top-level data declarations
-    {"a;",  // implicit type
-     "a;\n"},
-    {"a\tb;",  // explicit type
-     "a b;\n"},
-    {"a;b;",
-     "a;\n"
-     "b;\n"},
-    {"a ,b;",  // implicit type
-     "a, b;\n"},
-    /* TODO(b/149591599): implicit type data declarations in module body
-    {"module\tm ;a ;endmodule",
-     "module m;\n"
-     "  a;\n"
-     "endmodule\n"},
-    */
-    {"package\tp ;a ;endpackage",  // implicit type
-     "package p;\n"
-     "  a;\n"
-     "endpackage\n"},
-    {"package\tp ;a ,b ;endpackage",  // implicit type
-     "package p;\n"
-     "  a, b;\n"
-     "endpackage\n"},
-    {"package\tp ;a ;b ;endpackage",  // implicit type
-     "package p;\n"
-     "  a;\n"
-     "  b;\n"
-     "endpackage\n"},
-    /* TODO(b/149591627) : implicit type data declarations in class body
-    {"class\tc ;a ;endclass",
-     "class c;\n"
-     "  a;\n"
-     "endclass\n"},
-     */
-    {"function\tf ;a ;endfunction",  // implicit type
-     "function f;\n"
-     "  a;\n"
-     "endfunction\n"},
-    {"function\tf ;a   ;x ;endfunction",  // implicit type
-     "function f;\n"
-     "  a;\n"
-     "  x;\n"
-     "endfunction\n"},
-    /* TODO(b/149592527): multi-variable data declaration as block_item_decl
-     // same inside tasks
-    {"function\tf ;a  \t,x ;endfunction",  // implicit type
-     "function f;\n"
-     "  a, x;\n"
-     "endfunction\n"},
-     */
-    {"task\tt ;a ;endtask",  // implicit type
-     "task t;\n"
-     "  a;\n"
-     "endtask\n"},
-    {"task\tt ;a   ;x ;endtask",  // implicit type
-     "task t;\n"
-     "  a;\n"
-     "  x;\n"
-     "endtask\n"},
-
-    {// tests bind declaration
-     "bind   foo   bar baz  ( . clk ( clk  ) ) ;",
-     "bind foo bar baz (.clk(clk));\n"},
-    {// tests bind declaration, with type params
-     "bind   foo   bar# ( . W ( W ) ) baz  ( . clk ( clk  ) ) ;",
-     "bind foo bar #(.W(W)) baz (.clk(clk));\n"},
-    {// tests bind declarations
-     "bind   foo   bar baz  ( ) ;"
-     "bind goo  car  caz (   );",
-     "bind foo bar baz ();\n"
-     "bind goo car caz ();\n"},
-
-    {"bind blah foo #( .MaxCount(MaxCount), .MaxDelta(MaxDelta)) bar ("
-     "    .clk(clk), .rst(rst), .value(value) );",
-     "bind blah foo #(\n"
-     "    .MaxCount(MaxCount),\n"
-     "    .MaxDelta(MaxDelta)\n"
-     ") bar (\n"
-     "    .clk  (clk),\n"
-     "    .rst  (rst),\n"
-     "    .value(value)\n"
-     ");\n"},
-    {"bind foo bar baz(\\\n"
-     "`undef d\\\n"
-     "`undef d);",
-     "bind foo bar baz (\\\n"
-     "    `undef d\\\n"
-     "    `undef d\n"
-     ");\n"},
-    {
-        "bind expaaaaaaaaaaand_meeee looooooooong_name# ("
-        ".W(W_CONST), .H(H_CONST), .D(D_CONST)  )"
-        "instaaance_name (.in(iiiiiiiin), .out(ooooooout), .clk(ccccccclk));",
-        "bind expaaaaaaaaaaand_meeee\n"
-        "    looooooooong_name #(\n"
-        "    .W(W_CONST),\n"
-        "    .H(H_CONST),\n"
-        "    .D(D_CONST)\n"
-        ") instaaance_name (\n"
-        "    .in (iiiiiiiin),\n"
-        "    .out(ooooooout),\n"
-        "    .clk(ccccccclk)\n"
-        ");\n",
-    },
-
-    {
-        "bind expand_inst name# ("
-        ".W(W_CONST), .H(H_CONST), .D(D_CONST)  )"
-        "instaaance_name (.in(iiiiiiiin), .out(ooooooout), .clk(ccccccclk));",
-        "bind expand_inst name #(\n"
-        "    .W(W_CONST),\n"
-        "    .H(H_CONST),\n"
-        "    .D(D_CONST)\n"
-        ") instaaance_name (\n"
-        "    .in (iiiiiiiin),\n"
-        "    .out(ooooooout),\n"
-        "    .clk(ccccccclk)\n"
-        ");\n",
-    },
-
-    {
-        // tests import declaration
-        "import  foo_pkg :: bar ;",
-        "import foo_pkg::bar;\n",
-    },
-    {
-        // tests import declaration with wildcard
-        "import  foo_pkg :: * ;",
-        "import foo_pkg::*;\n",
-    },
-    {
-        // tests import declarations
-        "import  foo_pkg :: *\t;"
-        "import  goo_pkg\n:: thing ;",
-        "import foo_pkg::*;\n"
-        "import goo_pkg::thing;\n",
-    },
-    // preserve spaces inside [] dimensions, but limit spaces around ':' to one
-    // and adjust everything else
-    {"foo[W-1:0]a[0:K-1];",  // data declaration
-     "foo [W-1:0] a[0:K-1];\n"},
-    {"foo[W-1 : 0]a[0 : K-1];", "foo [W-1 : 0] a[0 : K-1];\n"},
-    {"foo[W  -  1 : 0 ]a [ 0  :  K  -  1] ;",
-     "foo [W  -  1 : 0] a[0 : K  -  1];\n"},
-    // remove spaces between [...] [...] in multi-dimension arrays
-    {"foo[K] [W]a;",  //
-     "foo [K][W] a;\n"},
-    {"foo b [K] [W] ;",  //
-     "foo b[K][W];\n"},
-    {"logic[K:1] [W:1]a;",  //
-     "logic [K:1][W:1] a;\n"},
-    {"logic b [K:1] [W:1] ;",  //
-     "logic b[K:1][W:1];\n"},
-    // spaces in bit slicing
-    {
-        // preserve 0 spaces
-        "always_ff @(posedge clk) begin "
-        "dummy  <=\tfoo  [  7:2  ] ; "
-        "end",
-        "always_ff @(posedge clk) begin\n"
-        "  dummy <= foo[7:2];\n"
-        "end\n",
-    },
-    {
-        // preserve 1 space
-        "always_ff @(posedge clk) begin "
-        "dummy  <=\tfoo  [  7 : 2  ] ; "
-        "end",
-        "always_ff @(posedge clk) begin\n"
-        "  dummy <= foo[7 : 2];\n"
-        "end\n",
-    },
-    {
-        // limit multiple spaces to 1
-        "always_ff @(posedge clk) begin "
-        "dummy  <=\tfoo  [  7  :  2  ] ; "
-        "end",
-        "always_ff @(posedge clk) begin\n"
-        "  dummy <= foo[7 : 2];\n"
-        "end\n",
-    },
-    {
-        "always_ff @(posedge clk) begin "
-        "dummy  <=\tfoo  [  7  : 2  ] ; "
-        "end",
-        "always_ff @(posedge clk) begin\n"
-        "  dummy <= foo[7 : 2];\n"
-        "end\n",
-    },
-    {
-        // keep value on the left when symmetrizing
-        "always_ff @(posedge clk) begin "
-        "dummy  <=\tfoo  [  7: 2  ] ; "
-        "end",
-        "always_ff @(posedge clk) begin\n"
-        "  dummy <= foo[7:2];\n"
-        "end\n",
-    },
-    {
-        "always_ff @(posedge clk) begin "
-        "dummy  <=\tfoo  [  7:  2  ] ; "
-        "end",
-        "always_ff @(posedge clk) begin\n"
-        "  dummy <= foo[7:2];\n"
-        "end\n",
-    },
-    {
-        "always_ff @(posedge clk) begin "
-        "dummy  <=\tfoo  [  7 :2  ] ; "
-        "end",
-        "always_ff @(posedge clk) begin\n"
-        "  dummy <= foo[7 : 2];\n"
-        "end\n",
-    },
-    {
-        "always_ff @(posedge clk) begin "
-        "dummy  <=\tfoo  [  7 :  2  ] ; "
-        "end",
-        "always_ff @(posedge clk) begin\n"
-        "  dummy <= foo[7 : 2];\n"
-        "end\n",
-    },
-    {
-        // use value on the left, but limit to 1 space
-        "always_ff @(posedge clk) begin "
-        "dummy  <=\tfoo  [  7  :2  ] ; "
-        "end",
-        "always_ff @(posedge clk) begin\n"
-        "  dummy <= foo[7 : 2];\n"
-        "end\n",
-    },
-
-    // task test cases
-    {"task t ;endtask:t",  //
-     "task t;\n"
-     "endtask : t\n"},
-    {"task t ;#   10 ;# 5ns ; # 0.1 ; # 1step ;endtask",
-     "task t;\n"
-     "  #10;\n"  // no space in delay expression
-     "  #5ns;\n"
-     "  #0.1;\n"
-     "  #1step;\n"
-     "endtask\n"},
-    {"task t\n;a<=b ;c<=d ;endtask\n",
-     "task t;\n"
-     "  a <= b;\n"
-     "  c <= d;\n"
-     "endtask\n"},
-    {"class c;   virtual protected task\tt  ( foo bar);"
-     "a.a<=b.b;\t\tc.c\n<=   d.d; endtask   endclass",
-     "class c;\n"
-     "  virtual protected task t(foo bar);\n"
-     "    a.a <= b.b;\n"
-     "    c.c <= d.d;\n"
-     "  endtask\n"
-     "endclass\n"},
-    {"task t;\n// statement comment\nendtask\n",
-     "task t;\n"
-     "  // statement comment\n"  // indented
-     "endtask\n"},
-    {"task t( );\n// statement comment\nendtask\n",
-     "task t();\n"
-     "  // statement comment\n"  // indented
-     "endtask\n"},
-    {"task t( input x  );\n"
-     "// statement comment\n"
-     "s();\n"
-     "// statement comment\n"
-     "endtask\n",
-     "task t(input x);\n"
-     "  // statement comment\n"  // indented
-     "  s();\n"
-     "  // statement comment\n"  // indented
-     "endtask\n"},
-    {"task fj;fork join fork join\tendtask",
-     "task fj;\n"
-     "  fork\n"
-     "  join\n"
-     "  fork\n"
-     "  join\n"
-     "endtask\n"},
-    {"task fj;fork join_any fork join_any\tendtask",
-     "task fj;\n"
-     "  fork\n"
-     "  join_any\n"
-     "  fork\n"
-     "  join_any\n"
-     "endtask\n"},
-    {"task fj;fork join_none fork join_none\tendtask",
-     "task fj;\n"
-     "  fork\n"
-     "  join_none\n"
-     "  fork\n"
-     "  join_none\n"
-     "endtask\n"},
-    {"task fj;fork\n"
-     "//c1\njoin\n"
-     "//c2\n"
-     "fork  \n"
-     "//c3\n"
-     "join\tendtask",
-     "task fj;\n"
-     "  fork\n"
-     "    //c1\n"
-     "  join\n"
-     "  //c2\n"
-     "  fork\n"
-     "    //c3\n"
-     "  join\n"
-     "endtask\n"},
-    {"task fj;\n"
-     "fork "
-     "begin "
-     "end "
-     "foo();"
-     "begin "
-     "end "
-     "join_any endtask",
-     "task fj;\n"
-     "  fork\n"
-     "    begin\n"
-     "    end\n"
-     "    foo();\n"
-     "    begin\n"
-     "    end\n"
-     "  join_any\n"
-     "endtask\n"},
-    {
-        // call and assertion statements
-        "task  t ;Fire() ;assert ( x);assert(y );endtask",
-        "task t;\n"
-        "  Fire();\n"
-        "  assert (x);\n"
-        "  assert (y);\n"
-        "endtask\n",
-    },
-    {
-        // assertion statements with body clause
-        "task  t ;Fire() ;assert ( x) fee ( );assert(y ) foo ( ) ;endtask",
-        "task t;\n"
-        "  Fire();\n"
-        "  assert (x) fee();\n"
-        "  assert (y) foo();\n"
-        "endtask\n",
-    },
-    {
-        // assertion statements with else clause
-        "task  t ;Fire() ;assert ( x) else  fee ( );"
-        "assert(y ) else  foo ( ) ;endtask",
-        "task t;\n"
-        "  Fire();\n"
-        "  assert (x)\n"
-        "  else fee();\n"
-        "  assert (y)\n"
-        "  else foo();\n"
-        "endtask\n",
-    },
-    {
-        // assertion statements with else clause
-        "task  t ;Fire() ;assert ( x) fa(); else  fee ( );"
-        "assert(y ) fi(); else  foo ( ) ;endtask",
-        "task t;\n"
-        "  Fire();\n"
-        "  assert (x) fa();\n"
-        "  else fee();\n"
-        "  assert (y) fi();\n"
-        "  else foo();\n"
-        "endtask\n",
-    },
-    {
-        // assume statements
-        "task  t ;Fire() ;assume ( x);assume(y );endtask",
-        "task t;\n"
-        "  Fire();\n"
-        "  assume (x);\n"
-        "  assume (y);\n"
-        "endtask\n",
-    },
-    {
-        // cover statements
-        "task  t ;Fire() ;cover ( x);cover(y );endtask",
-        "task t;\n"
-        "  Fire();\n"
-        "  cover (x);\n"
-        "  cover (y);\n"
-        "endtask\n",
-    },
-    {
-        // cover statements, with action
-        "task  t ;Fire() ;cover ( x)g( );cover(y ) h();endtask",
-        "task t;\n"
-        "  Fire();\n"
-        "  cover (x) g();\n"
-        "  cover (y) h();\n"
-        "endtask\n",
-    },
-    {
-        // cover statements, with action block
-        "task  t ;Fire() ;cover ( x) begin g( ); end "
-        "cover(y ) begin h(); end endtask",
-        "task t;\n"
-        "  Fire();\n"
-        "  cover (x) begin\n"
-        "    g();\n"
-        "  end\n"
-        "  cover (y) begin\n"
-        "    h();\n"
-        "  end\n"
-        "endtask\n",
-    },
-    {// shuffle calls
-     "task t; foo. shuffle  ( );bar .shuffle( ); endtask",
-     "task t;\n"
-     "  foo.shuffle();\n"
-     "  bar.shuffle();\n"
-     "endtask\n"},
-    {// wait statements (null)
-     "task t; wait  (a==b);wait(c<d); endtask",
-     "task t;\n"
-     "  wait (a == b);\n"
-     "  wait (c < d);\n"
-     "endtask\n"},
-    {// wait statements, single action statement
-     "task t; wait  (a==b) p();wait(c<d) q(); endtask",
-     "task t;\n"
-     "  wait (a == b) p();\n"
-     "  wait (c < d) q();\n"
-     "endtask\n"},
-    {// wait statements, block action statement
-     "task t; wait  (a==b) begin p(); end "
-     "wait(c<d) begin q(); end endtask",
-     "task t;\n"
-     "  wait (a == b) begin\n"
-     "    p();\n"
-     "  end\n"
-     "  wait (c < d) begin\n"
-     "    q();\n"
-     "  end\n"
-     "endtask\n"},
-    {// wait fork statements
-     "task t ; wait\tfork;wait   fork ;endtask",
-     "task t;\n"
-     "  wait fork;\n"
-     "  wait fork;\n"
-     "endtask\n"},
-    {// labeled single statements (prefix-style)
-     "task t;l1:x<=y ;endtask",
-     "task t;\n"
-     "  l1 : x <= y;\n"
-     "endtask\n"},
-    {// labeled block statements (prefix-style)
-     "task t;l1:begin end:l1 endtask",
-     "task t;\n"
-     "  l1 : begin\n"
-     "  end : l1\n"
-     "endtask\n"},
-    {// labeled seq block statements
-     "task t;begin:l1 end:l1 endtask",
-     "task t;\n"
-     "  begin : l1\n"
-     "  end : l1\n"
-     "endtask\n"},
-    {// labeled par block statements
-     "task t;fork:l1 join:l1 endtask",
-     "task t;\n"
-     "  fork : l1\n"
-     "  join : l1\n"
-     "endtask\n"},
-    {// task with disable statements
-     "task  t ;fork\tjoin\tdisable\tfork;endtask",
-     "task t;\n"
-     "  fork\n"
-     "  join\n"
-     "  disable fork;\n"
-     "endtask\n"},
-    {"task  t ;fork\tjoin_any\tdisable\tfork  ;endtask",
-     "task t;\n"
-     "  fork\n"
-     "  join_any\n"
-     "  disable fork;\n"
-     "endtask\n"},
-    {"task  t ;disable\tbean_counter  ;endtask",
-     "task t;\n"
-     "  disable bean_counter;\n"
-     "endtask\n"},
-    {
-        // task with if-statement
-        "task t;"
-        "if (r == t)"
-        "a.b(c);"
-        "endtask",
-        "task t;\n"
-        "  if (r == t) a.b(c);\n"
-        "endtask\n",
-    },
-    {
-        // task with system call inside if header
-        "task t;"
-        "if (!$cast(ssssssssssssssss,vvvvvvvvvv,gggggggg))begin end endtask:t",
-        "task t;\n"
-        "  if (!$cast(\n"
-        "          ssssssssssssssss,\n"
-        "          vvvvvvvvvv,\n"
-        "          gggggggg\n"
-        "      )) begin\n"
-        "  end\n"
-        "endtask : t\n",
-    },
-    {
-        // task with nested subtask call and arguments passed by name
-        "task t;"
-        "if (!$cast(ssssssssssssssss, vvvvvvvvvv.gggggggg("
-        ".ppppppp(ppppppp),"
-        ".yyyyy(\"xxxxxxxxxxxxx\")"
-        "))) begin "
-        "end "
-        "endtask : t",
-        "task t;\n"
-        "  if (!$cast(\n"
-        "          ssssssssssssssss,\n"
-        "          vvvvvvvvvv.gggggggg(\n"
-        "              .ppppppp(ppppppp),\n"
-        "              .yyyyy(\"xxxxxxxxxxxxx\")\n"
-        "          )\n"
-        "      )) begin\n"
-        "  end\n"
-        "endtask : t\n",
-    },
-
-    {
-        // assert property statements
-        "task  t ;assert  property( x);assert\tproperty(y );endtask",
-        "task t;\n"
-        "  assert property (x);\n"
-        "  assert property (y);\n"
-        "endtask\n",
-    },
-    {
-        // assert property statements, with action
-        "task  t ;assert  property( x) j();assert\tproperty(y )k( );endtask",
-        "task t;\n"
-        "  assert property (x) j();\n"
-        "  assert property (y) 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",
-        "task t;\n"
-        "  assert property (x) begin\n"
-        "    j();\n"
-        "  end\n"
-        "  assert property (y) begin\n"
-        "    k();\n"
-        "  end\n"
-        "endtask\n",
-    },
-    {
-        // assert property statements, else with null
-        "task  t ;assert  property( x) else;assert\tproperty(y )else;endtask",
-        "task t;\n"
-        "  assert property (x)\n"
-        "  else;\n"
-        "  assert property (y)\n"
-        "  else;\n"
-        "endtask\n",
-    },
-    {
-        // assert property statements, else with actions
-        "task  t ;assert  property( x) f(); else p(); "
-        "\tassert\tproperty(y ) g();else  q( );endtask",
-        "task t;\n"
-        "  assert property (x) f();\n"
-        "  else p();\n"
-        "  assert property (y) g();\n"
-        "  else q();\n"
-        "endtask\n",
-    },
-    {
-        // assert property statement, with action block, else statement
-        "task  t ;assert  property( x) begin j();end  else\tk( );  endtask",
-        "task t;\n"
-        "  assert property (x) begin\n"
-        "    j();\n"
-        "  end else k();\n"
-        "endtask\n",
-    },
-    {
-        // assert property statement, with action statement, else block
-        "task  t ;assert  property( x) j();  else  begin\tk( );end  endtask",
-        "task t;\n"
-        "  assert property (x) j();\n"
-        "  else begin\n"
-        "    k();\n"
-        "  end\n"
-        "endtask\n",
-    },
-    {
-        // assert property statement, with action block, else block
-        "task  t ;assert  property( x)begin j();end  "
-        "else  begin\tk( );end  endtask",
-        "task t;\n"
-        "  assert property (x) begin\n"
-        "    j();\n"
-        "  end else begin\n"
-        "    k();\n"
-        "  end\n"
-        "endtask\n",
-    },
-
-    {
-        // assume property statements
-        "task  t ;assume  property( x);assume\tproperty(y );endtask",
-        "task t;\n"
-        "  assume property (x);\n"
-        "  assume property (y);\n"
-        "endtask\n",
-    },
-    {
-        // assume property statements, with action
-        "task  t ;assume  property( x) j();assume\tproperty(y )k( );endtask",
-        "task t;\n"
-        "  assume property (x) j();\n"
-        "  assume property (y) k();\n"
-        "endtask\n",
-    },
-    {
-        // assume property statements, with action block
-        "task  t ;assume  property( x) begin j();end "
-        " assume\tproperty(y )begin\tk( );  end endtask",
-        "task t;\n"
-        "  assume property (x) begin\n"
-        "    j();\n"
-        "  end\n"
-        "  assume property (y) begin\n"
-        "    k();\n"
-        "  end\n"
-        "endtask\n",
-    },
-    {
-        // assume property statements, else with null
-        "task  t ;assume  property( x) else;assume\tproperty(y )else;endtask",
-        "task t;\n"
-        "  assume property (x)\n"
-        "  else;\n"
-        "  assume property (y)\n"
-        "  else;\n"
-        "endtask\n",
-    },
-    {
-        // assume property statements, else with actions
-        "task  t ;assume  property( x) f(); else p(); "
-        "\tassume\tproperty(y ) g();else  q( );endtask",
-        "task t;\n"
-        "  assume property (x) f();\n"
-        "  else p();\n"
-        "  assume property (y) g();\n"
-        "  else q();\n"
-        "endtask\n",
-    },
-    {
-        // assume property statement, with action block, else statement
-        "task  t ;assume  property( x) begin j();end  else\tk( );  endtask",
-        "task t;\n"
-        "  assume property (x) begin\n"
-        "    j();\n"
-        "  end else k();\n"
-        "endtask\n",
-    },
-    {
-        // assume property statement, with action statement, else block
-        "task  t ;assume  property( x) j();  else  begin\tk( );end  endtask",
-        "task t;\n"
-        "  assume property (x) j();\n"
-        "  else begin\n"
-        "    k();\n"
-        "  end\n"
-        "endtask\n",
-    },
-    {
-        // assume property statement, with action block, else block
-        "task  t ;assume  property( x)begin j();end  "
-        "else  begin\tk( );end  endtask",
-        "task t;\n"
-        "  assume property (x) begin\n"
-        "    j();\n"
-        "  end else begin\n"
-        "    k();\n"
-        "  end\n"
-        "endtask\n",
-    },
-
-    {
-        // expect property statements
-        "task  t ;expect  ( x);expect\t(y );endtask",
-        "task t;\n"
-        "  expect (x);\n"
-        "  expect (y);\n"
-        "endtask\n",
-    },
-    {
-        // expect property statements, with action
-        "task  t ;expect  ( x) j();expect\t(y )k( );endtask",
-        "task t;\n"
-        "  expect (x) j();\n"
-        "  expect (y) k();\n"
-        "endtask\n",
-    },
-    {
-        // expect property statements, with action block
-        "task  t ;expect  ( x) begin j();end "
-        " expect\t(y )begin\tk( );  end endtask",
-        "task t;\n"
-        "  expect (x) begin\n"
-        "    j();\n"
-        "  end\n"
-        "  expect (y) begin\n"
-        "    k();\n"
-        "  end\n"
-        "endtask\n",
-    },
-    {
-        // expect property statements, else with null
-        "task  t ;expect  ( x) else;expect\t(y )else;endtask",
-        "task t;\n"
-        "  expect (x)\n"
-        "  else;\n"
-        "  expect (y)\n"
-        "  else;\n"
-        "endtask\n",
-    },
-    {
-        // expect property statements, else with actions
-        "task  t ;expect  ( x) f(); else p(); "
-        "\texpect\t(y ) g();else  q( );endtask",
-        "task t;\n"
-        "  expect (x) f();\n"
-        "  else p();\n"
-        "  expect (y) g();\n"
-        "  else q();\n"
-        "endtask\n",
-    },
-    {
-        // expect property statement, with action block, else statement
-        "task  t ;expect  ( x) begin j();end  else\tk( );  endtask",
-        "task t;\n"
-        "  expect (x) begin\n"
-        "    j();\n"
-        "  end else k();\n"
-        "endtask\n",
-    },
-    {
-        // expect property statement, with action statement, else block
-        "task  t ;expect  ( x) j();  else  begin\tk( );end  endtask",
-        "task t;\n"
-        "  expect (x) j();\n"
-        "  else begin\n"
-        "    k();\n"
-        "  end\n"
-        "endtask\n",
-    },
-    {
-        // expect property statement, with action block, else block
-        "task  t ;expect  ( x)begin j();end  "
-        "else  begin\tk( );end  endtask",
-        "task t;\n"
-        "  expect (x) begin\n"
-        "    j();\n"
-        "  end else begin\n"
-        "    k();\n"
-        "  end\n"
-        "endtask\n",
-    },
-
-    {
-        // cover property statements
-        "task  t ;cover  property( x);cover\tproperty(y );endtask",
-        "task t;\n"
-        "  cover property (x);\n"
-        "  cover property (y);\n"
-        "endtask\n",
-    },
-    {
-        // cover property statements, with action
-        "task  t ;cover  property( x) j();cover\tproperty(y )k( );endtask",
-        "task t;\n"
-        "  cover property (x) j();\n"
-        "  cover property (y) k();\n"
-        "endtask\n",
-    },
-    {
-        // cover property statements, with action block
-        "task  t ;cover  property( x) begin j();end "
-        " cover\tproperty(y )begin\tk( );  end endtask",
-        "task t;\n"
-        "  cover property (x) begin\n"
-        "    j();\n"
-        "  end\n"
-        "  cover property (y) begin\n"
-        "    k();\n"
-        "  end\n"
-        "endtask\n",
-    },
-
-    {
-        // cover sequence statements
-        "task  t ;cover  sequence( x);cover\tsequence(y );endtask",
-        "task t;\n"
-        "  cover sequence (x);\n"
-        "  cover sequence (y);\n"
-        "endtask\n",
-    },
-    {
-        // cover sequence statements, with action
-        "task  t ;cover  sequence( x) j();cover\tsequence(y )k( );endtask",
-        "task t;\n"
-        "  cover sequence (x) j();\n"
-        "  cover sequence (y) k();\n"
-        "endtask\n",
-    },
-    {
-        // cover sequence statements, with action block
-        "task  t ;cover  sequence( x) begin j();end "
-        " cover\tsequence(y )begin\tk( );  end endtask",
-        "task t;\n"
-        "  cover sequence (x) begin\n"
-        "    j();\n"
-        "  end\n"
-        "  cover sequence (y) begin\n"
-        "    k();\n"
-        "  end\n"
-        "endtask\n",
-    },
-
-    {// module with disable statements
-     "module m;always begin :block disable m.block; end endmodule",
-     "module m;\n"
-     "  always begin : block\n"
-     "    disable m.block;\n"
-     "  end\n"
-     "endmodule\n"},
-    {"module m;always begin disable m.block; end endmodule",
-     "module m;\n"
-     "  always begin\n"
-     "    disable m.block;\n"
-     "  end\n"
-     "endmodule\n"},
-
-    // property test cases
-    {"module mp ;property p1 ; a|->b;endproperty endmodule",
-     "module mp;\n"
-     "  property p1;\n"
-     "    a |-> b;\n"
-     "  endproperty\n"
-     "endmodule\n"},
-    {"module mp ;property p1 ; a|->b;endproperty:p1 endmodule",
-     "module mp;\n"
-     "  property p1;\n"
-     "    a |-> b;\n"
-     "  endproperty : p1\n"  // with end label
-     "endmodule\n"},
-    {"module mp ;property p1 ; a|->## 1  b;endproperty endmodule",
-     "module mp;\n"
-     "  property p1;\n"
-     "    a |-> ##1 b;\n"  // with delay
-     "  endproperty\n"
-     "endmodule\n"},
-    {"module mp ;property p1 ; a|->## [0: 1]  b;endproperty endmodule",
-     "module mp;\n"
-     "  property p1;\n"
-     "    a |-> ##[0:1] b;\n"  // prefer no spaces with delay range
-     "  endproperty\n"
-     "endmodule\n"},
-    {"module mp ;property p1 ; a|->## [0  : 1]  b;endproperty endmodule",
-     "module mp;\n"
-     "  property p1;\n"
-     "    a |-> ##[0 : 1] b;\n"  // limit to one space, symmetrize
-     "  endproperty\n"
-     "endmodule\n"},
-    {"module mp ;property p1 ; a## 1  b;endproperty endmodule",
-     "module mp;\n"
-     "  property p1;\n"
-     "    a ##1 b;\n"
-     "  endproperty\n"
-     "endmodule\n"},
-    {"module mp ;property p1 ; (a^c)## 1  b;endproperty endmodule",
-     "module mp;\n"
-     "  property p1;\n"
-     "    (a ^ c) ##1 b;\n"
-     "  endproperty\n"
-     "endmodule\n"},
-
-    // covergroup test cases
-    {// Minimal case
-     "covergroup c; endgroup\n",
-     "covergroup c;\n"
-     "endgroup\n"},
-    {// Minimal useful case
-     "covergroup c @ (posedge clk); coverpoint a; endgroup\n",
-     "covergroup c @(posedge clk);\n"
-     "  coverpoint a;\n"
-     "endgroup\n"},
-    {// Multiple coverpoints
-     "covergroup foo @(posedge clk); coverpoint a; coverpoint b; "
-     "coverpoint c; coverpoint d; endgroup\n",
-     "covergroup foo @(posedge clk);\n"
-     "  coverpoint a;\n"
-     "  coverpoint b;\n"
-     "  coverpoint c;\n"
-     "  coverpoint d;\n"
-     "endgroup\n"},
-    {// Multiple bins
-     "covergroup memory @ (posedge ce); address  :coverpoint addr {"
-     "bins low={0,127}; bins high={128,255};} endgroup\n",
-     "covergroup memory @(posedge ce);\n"
-     "  address: coverpoint addr {\n"
-     "    bins low = {0, 127};\n"
-     "    bins high = {128, 255};\n"
-     "  }\n"
-     "endgroup\n"},
-    {// Custom sample() function
-     "covergroup c with function sample(bit i); endgroup\n",
-     "covergroup c with function sample (\n"
-     "    bit i\n"  // test cases are wrapped at 40
-     ");\n"
-     "endgroup\n"},
-
-    // comment-controlled formatter disabling
-    {"// verilog_format: off\n"  // disables whole file
-     "  `include  \t\t  \"path/to/file.vh\"\n",
-     "// verilog_format: off\n"
-     "  `include  \t\t  \"path/to/file.vh\"\n"},  // keeps bad spacing
-    {"/* verilog_format: off */\n"                // disables whole file
-     "  `include  \t\t  \"path/to/file.svh\"  \n",
-     "/* verilog_format: off */\n"
-     "  `include  \t\t  \"path/to/file.svh\"  \n"},  // keeps bad spacing
-    {"// verilog_format: on\n"  // already enabled, no effect
-     "  `include  \t  \"path/to/file.svh\"  \t\n",
-     "// verilog_format: on\n"
-     "`include \"path/to/file.svh\"\n"},
-    {"// verilog_format: off\n"
-     "// verilog_format: on\n"  // re-enable right away
-     "  `include  \t\t  \"path/to/file.svh\"  \n",
-     "// verilog_format: off\n"
-     "// verilog_format: on\n"
-     "`include \"path/to/file.svh\"\n"},
-    {"/* aaa *//* bbb */\n"                         // not formatting controls
-     "  `include  \t\t  \"path/to/file.svh\"  \n",  // should format
-     "/* aaa */  /* bbb */\n"  // currently inserts 2 spaces
-     "`include \"path/to/file.svh\"\n"},
-    {"/* verilog_format: off *//* verilog_format: on */\n"  // re-enable
-     "  `include  \t\t  \"path/to/file.svh\"  \n",
-     // Note that this case normally wouldn't fit in 40 columns,
-     // but disabling formatting lets it overflow.
-     "/* verilog_format: off *//* verilog_format: on */\n"
-     "`include \"path/to/file.svh\"\n"},
-    {"// verilog_format: off\n"
-     "  `include  \t\t  \"path/to/fileA.svh\"  // verilog_format: on\n"
-     "  `include  \t\t  \"path/to/fileB.svh\"  \n",
-     // re-enable formatting with comment trailing other tokens
-     "// verilog_format: off\n"
-     "  `include  \t\t  \"path/to/fileA.svh\"  // verilog_format: on\n"
-     "`include \"path/to/fileB.svh\"\n"},
-    {"  `include  \t\t  \"path/to/file1.vh\" \n"  // format this
-     "// verilog_format: off\n"                   // start disabling
-     "  `include  \t\t  \"path/to/file2.vh\" \n"
-     "\t\t\n"
-     "  `include  \t\t  \"path/to/file3.vh\" \n"
-     "// verilog_format: on\n"                     // stop disabling
-     "  `include  \t\t  \"path/to/file4.vh\" \n",  // format this
-     "`include \"path/to/file1.vh\"\n"
-     "// verilog_format: off\n"  // start disabling
-     "  `include  \t\t  \"path/to/file2.vh\" \n"
-     "\t\t\n"
-     "  `include  \t\t  \"path/to/file3.vh\" \n"
-     "// verilog_format: on\n"  // stop disabling
-     "`include \"path/to/file4.vh\"\n"},
-    {// disabling formatting on a module (to end of file)
-     "// verilog_format: off\n"
-     "module m;endmodule\n",
-     "// verilog_format: off\n"
-     "module m;endmodule\n"},
-    {// disabling formatting on a module (to end of file)
-     "// verilog_format: off\n"
-     "module m;\n"
-     "unindented instantiation;\n"
-     "endmodule\n",
-     "// verilog_format: off\n"
-     "module m;\n"
-     "unindented instantiation;\n"
-     "endmodule\n"},
-    {// disabling formatting inside a port declaration list disables alignment,
-     // but falls back to standard compaction.
-     "module align_off(\n"
-     "input w  ,\n"
-     "    // verilog_format: off\n"
-     "input wire  [y:z] wwww,\n"
-     "    // verilog_format: on\n"
-     "output  reg    xx\n"
-     ");\n"
-     "endmodule",
-     "module align_off (\n"
-     "    input w  ,\n"  // preserved because group is partially disabled
-     "    // verilog_format: off\n"
-     "input wire  [y:z] wwww,\n"  // not compacted
-     "    // verilog_format: on\n"
-     "    output  reg    xx\n"  // preserved because group is partially disabled
-     ");\n"
-     "endmodule\n"},
-
-    {// multiple tokens with EOL comment
-     "module please;  // don't break before the comment\n"
-     "endmodule\n",
-     "module please\n"
-     "    ;  // don't break before the comment\n"
-     "endmodule\n"},
-    {// one token with EOL comment
-     "module please;\n"
-     "endmodule  // don't break before the comment\n",
-     "module please;\n"
-     "endmodule  // don't break before the comment\n"},
-    {
-        // line with only an EOL comment
-        "module wild;\n"
-        "// a really long comment on its own line to be left alone\n"
-        "endmodule",
-        "module wild;\n"
-        "  // a really long comment on its own line to be left alone\n"
-        "endmodule\n",
-    },
-    {
-        // primitive declaration
-        "primitive primitive1(o, s, r);output o;reg o;input s;input r;table 1 "
-        "? :"
-        " ? : 0; ? 1    : 0   : -; endtable endprimitive",
-        "primitive primitive1(o, s, r);\n"
-        "  output o;\n"
-        "  reg o;\n"
-        "  input s;\n"
-        "  input r;\n"
-        "  table\n"
-        "    1 ? : ? : 0;\n"
-        "    ? 1 : 0 : -;\n"
-        "  endtable\n"
-        "endprimitive\n",
-    },
-    {
-        // one-input combinatorial UDP
-        "primitive primitive1 ( o,i ) ;output o;input i;"
-        " table 1  :   0 ;   0  :  1 ; endtable endprimitive",
-        "primitive primitive1(o, i);\n"
-        "  output o;\n"
-        "  input i;\n"
-        "  table\n"
-        "    1 : 0;\n"
-        "    0 : 1;\n"
-        "  endtable\n"
-        "endprimitive\n",
-    },
-    {
-        // two-input combinatorial UDP
-        "primitive primitive2(o, s, r);output o;input s;input r;"
-        "table 1 ? : 0;? 1 : -; endtable endprimitive",
-        "primitive primitive2(o, s, r);\n"
-        "  output o;\n"
-        "  input s;\n"
-        "  input r;\n"
-        "  table\n"
-        "    1 ? : 0;\n"
-        "    ? 1 : -;\n"
-        "  endtable\n"
-        "endprimitive\n",
-    },
-    {
-        // ten-input combinatorial UDP
-        "primitive comb10(o, i0, i1, i2, i3, i4, i5, i6, i7, i8, i9);"
-        "output o;input i0, i1, i2, i3, i4, i5, i6, i7, i8, i9;"
-        "table 0 ? ? ? ? ? ? ? ? 0 : 0;1 ? ? ? ? ? ? ? ? 0 : 1;"
-        "1 ? ? ? ? ? ? ? ? 1 : 1;0 ? ? ? ? ? ? ? ? 1 : 0;endtable endprimitive",
-        "primitive comb10(o, i0, i1, i2, i3, i4,\n"
-        "                 i5, i6, i7, i8, i9);\n"
-        "  output o;\n"
-        "  input i0, i1, i2, i3, i4, i5, i6, i7,\n"
-        "      i8, i9;\n"
-        "  table\n"
-        "    0 ? ? ? ? ? ? ? ? 0 : 0;\n"
-        "    1 ? ? ? ? ? ? ? ? 0 : 1;\n"
-        "    1 ? ? ? ? ? ? ? ? 1 : 1;\n"
-        "    0 ? ? ? ? ? ? ? ? 1 : 0;\n"
-        "  endtable\n"
-        "endprimitive\n",
-    },
-    {
-        // sequential level-sensitive UDP
-        "primitive level_seq(o, c, d);output o;reg o;"
-        "  input c;input d;table\n"
-        "//  C D  state O\n"
-        "0   ? : ? :  -;  // No Change\n"
-        "? 0   : 0 :  0;  // Unknown\n"
-        "endtable endprimitive",
-        "primitive level_seq(o, c, d);\n"
-        "  output o;\n"
-        "  reg o;\n"
-        "  input c;\n"
-        "  input d;\n"
-        "  table\n"
-        "    //  C D  state O\n"
-        "    0 ? : ? : -;  // No Change\n"
-        "    ? 0 : 0 : 0;  // Unknown\n"
-        "  endtable\n"
-        "endprimitive\n",
-    },
-    {
-        // sequential edge-sensitive UDP
-        "primitive edge_seq(o, c, d);output o;reg o;input c;input d;"
-        "table (01) 0 : ? :  0;(01) 1 : ? :  1;(0?) 1 : 1 :  1;(0?) 0 : 0 :  "
-        "0;\n"
-        "// ignore negative c\n"
-        "(?0) ? : ? :  -;\n"
-        "// ignore changes on steady c\n"
-        "?  (?\?) : ? :  -; endtable endprimitive",
-        "primitive edge_seq(o, c, d);\n"
-        "  output o;\n"
-        "  reg o;\n"
-        "  input c;\n"
-        "  input d;\n"
-        "  table\n"
-        "    (01) 0 : ? : 0;\n"
-        "    (01) 1 : ? : 1;\n"
-        "    (0?) 1 : 1 : 1;\n"
-        "    (0?) 0 : 0 : 0;\n"
-        "    // ignore negative c\n"
-        "    (?0) ? : ? : -;\n"
-        "    // ignore changes on steady c\n"
-        "    ? (?\?) : ? : -;\n"
-        "  endtable\n"
-        "endprimitive\n",
-    },
-    {
-        // mixed sequential UDP
-        "primitive mixed(o, clk, j, k, preset, clear);output o;reg o;"
-        "input c;input j, k;input preset, clear;table "
-        "?  ??  01:?:1 ; // preset logic\n"
-        "?  ??  *1:1:1 ;?  ??  10:?:0 ; // clear logic\n"
-        "?  ??  1*:0:0 ;r  00  00:0:1 ; // normal\n"
-        "r  00  11:?:- ;r  01  11:?:0 ;r  10  11:?:1 ;r  11  11:0:1 ;"
-        "r  11  11:1:0 ;f  ??  ??:?:- ;b  *?  ??:?:- ;"
-        " // j and k\n"
-        "b  ?*  ??:?:- ;endtable endprimitive\n",
-        "primitive mixed(o, clk, j, k, preset,\n"
-        "                clear);\n"
-        "  output o;\n"
-        "  reg o;\n"
-        "  input c;\n"
-        "  input j, k;\n"
-        "  input preset, clear;\n"
-        "  table\n"
-        "    ? ? ? 0 1 : ? : 1;  // preset logic\n"
-        "    ? ? ? * 1 : 1 : 1;\n"
-        "    ? ? ? 1 0 : ? : 0;  // clear logic\n"
-        "    ? ? ? 1 * : 0 : 0;\n"
-        "    r 0 0 0 0 : 0 : 1;  // normal\n"
-        "    r 0 0 1 1 : ? : -;\n"
-        "    r 0 1 1 1 : ? : 0;\n"
-        "    r 1 0 1 1 : ? : 1;\n"
-        "    r 1 1 1 1 : 0 : 1;\n"
-        "    r 1 1 1 1 : 1 : 0;\n"
-        "    f ? ? ? ? : ? : -;\n"
-        "    b * ? ? ? : ? : -;  // j and k\n"
-        "    b ? * ? ? : ? : -;\n"
-        "  endtable\n"
-        "endprimitive\n",
-    },
-    // un-lexed multiline macro arg token
-    {
-        " task  S ; "
-        "`ppgJH3JoxhwyTmZ2dgPiuMQzpRAWiSs("
-        "{xYtxuh6.FIMcVPEWfhtoI2FSe, xYtxuh6.ZVL5XASVGLYz32} == "
-        "SqRgavM[15:2];\n"
-        "JgQLBG == 4'h0;, \"foo\" )\n"
-        "endtask\n",
-        "task S;\n"
-        "  `ppgJH3JoxhwyTmZ2dgPiuMQzpRAWiSs(\n"
-        "      {xYtxuh6.FIMcVPEWfhtoI2FSe, xYtxuh6.ZVL5XASVGLYz32} == "
-        "SqRgavM[15:2];\n"
-        "JgQLBG == 4'h0;,\n"
-        "      \"foo\")\n"
-        "endtask\n",
-    },
-
-    // module instantiation named ports tabular alignment
-    //{// module instantiation with no port, only comments
-    //    "module m;\n"
-    //    "foo bar(\n"
-    //    "\t//comment1\n"
-    //    "//comment2\n"
-    //    ");\n"
-    //    "endmodule\n",
-    //    "module m;\n"
-    //    "  foo bar (\n"
-    //    "      //comment1\n"
-    //    "      //comment2\n"
-    //    "  );\n"
-    //    "endmodule\n"
-    //},
-    {// all named ports
-     "module m;\n"
-     "foo bar(.a(a), .aa(aa), .aaa(aaa));\n"
-     "endmodule\n",
-     "module m;\n"
-     "  foo bar (\n"
-     "      .a  (a),\n"
-     "      .aa (aa),\n"
-     "      .aaa(aaa)\n"
-     "  );\n"
-     "endmodule\n"},
-    {// named ports left unconnected
-     "module m;\n"
-     "foo bar(.a(), .aa(), .aaa());\n"
-     "endmodule\n",
-     "module m;\n"
-     "  foo bar (\n"
-     "      .a  (),\n"
-     "      .aa (),\n"
-     "      .aaa()\n"
-     "  );\n"
-     "endmodule\n"},
-    {// multiple named ports groups separated by blank line
-     "module m;\n"
-     "foo bar(.a(a), .aaa(aaa),\n\n .b(b), .bbbbbb(bbbbb));\n"
-     "endmodule\n",
-     "module m;\n"
-     "  foo bar (\n"
-     "      .a  (a),\n"
-     "      .aaa(aaa),\n"
-     "\n"
-     "      .b     (b),\n"
-     "      .bbbbbb(bbbbb)\n"
-     "  );\n"
-     "endmodule\n"},
-    {// named ports with concatenation
-     "module m;\n"
-     "foo bar(.a(a), .aaa({a,b,c}));\n"
-     "endmodule\n",
-     "module m;\n"
-     "  foo bar (\n"
-     "      .a  (a),\n"
-     "      .aaa({a, b, c})\n"
-     "  );\n"
-     "endmodule\n"},
-    {// name ports with slices
-     "module m;\n"
-     "foo bar(.a(a), .aaa(q[r:s]));\n"
-     "endmodule\n",
-     "module m;\n"
-     "  foo bar (\n"
-     "      .a  (a),\n"
-     "      .aaa(q[r:s])\n"
-     "  );\n"
-     "endmodule\n"},
-    {// named ports with pre-proc directives
-     "module m;\n"
-     "foo bar(.a(a), `ifdef MACRO .aa(aa), `endif .aaa(aaa));\n"
-     "endmodule\n",
-     "module m;\n"
-     "  foo bar (\n"
-     "      .a  (a),\n"
-     "`ifdef MACRO\n"
-     "      .aa (aa),\n"
-     "`endif\n"
-     "      .aaa(aaa)\n"
-     "  );\n"
-     "endmodule\n"},
-    {// named ports with macros
-     "module m;\n"
-     "foo bar(.a(a), .aa(aa[`RANGE]), .aaa(aaa));\n"
-     "endmodule\n",
-     "module m;\n"
-     "  foo bar (\n"
-     "      .a  (a),\n"
-     "      .aa (aa[`RANGE]),\n"
-     "      .aaa(aaa)\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module m;\n"
-     "foo bar(.a(a), .AA, .aaa(aaa));\n"
-     "endmodule\n",
-     "module m;\n"
-     "  foo bar (\n"
-     "      .a  (a),\n"
-     "      .AA,\n"
-     "      .aaa(aaa)\n"
-     "  );\n"
-     "endmodule\n"},
-    {// name ports with comments
-     "module m;\n"
-     "foo bar(.a(a), .aa(aa)/*comment*/, .aaa(aaa));\n"
-     "endmodule\n",
-     "module m;\n"
-     "  foo bar (\n"
-     "      .a  (a),\n"
-     "      .aa (aa)  /*comment*/,\n"
-     "      .aaa(aaa)\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module m;\n"
-     "foo bar(.a(a),//comment1\n .aaa(aaa)//comment2\n);\n"
-     "endmodule\n",
-     "module m;\n"
-     "  foo bar (\n"
-     "      .a  (a),   //comment1\n"
-     "      .aaa(aaa)  //comment2\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module m;\n"
-     "foo bar(.a(a),\n"
-     " //.aa(aa),\n"
-     ".aaa(aaa));\n"
-     "endmodule\n",
-     "module m;\n"
-     "  foo bar (\n"
-     "      .a  (a),\n"
-     "      //.aa(aa),\n"
-     "      .aaa(aaa)\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module m;\n"
-     "foo bar(\n"
-     ".a(a) //comment1\n"
-     ", .aaa(aaa) //comment2\n"
-     ") //comment3\n"
-     ";\n"
-     "endmodule\n",
-     "module m;\n"
-     "  foo bar (\n"
-     "        .a  (a)    //comment1\n"
-     "      , .aaa(aaa)  //comment2\n"
-     "  )  //comment3\n"
-     "  ;\n"
-     "endmodule\n"},
-    {// module instantiation with all implicit connections
-     "module m;\n"
-     "foo bar(.a, .aa, .aaaaa);\n"
-     "endmodule\n",
-     "module m;\n"
-     "  foo bar (\n"
-     "      .a,\n"
-     "      .aa,\n"
-     "      .aaaaa\n"
-     "  );\n"
-     "endmodule\n"},
-    {// named ports corssed with implicit connections
-     "module m;\n"
-     "foo bar(.a(a), .aa, .aaaaa(aaaaa));\n"
-     "endmodule\n",
-     "module m;\n"
-     "  foo bar (\n"
-     "      .a    (a),\n"
-     "      .aa,\n"
-     "      .aaaaa(aaaaa)\n"
-     "  );\n"
-     "endmodule\n"},
-    {// named ports corssed with wildcard connections
-     "module m;\n"
-     "foo bar(.a(a), .aaa(aaa), .*);\n"
-     "endmodule\n",
-     "module m;\n"
-     "  foo bar (\n"
-     "      .a  (a),\n"
-     "      .aaa(aaa),\n"
-     "      .*\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module m;\n"
-     "foo bar(.a(a), .aa(aa), .* , .aaa(aaa));\n"
-     "endmodule\n",
-     "module m;\n"
-     "  foo bar (\n"
-     "      .a  (a),\n"
-     "      .aa (aa),\n"
-     "      .*,\n"
-     "      .aaa(aaa)\n"
-     "  );\n"
-     "endmodule\n"},
-
-    // Parameterized data types, declarations inside #() tabular alignment
-    {// parameterized module with 'list_of_param_assignments'
-     "module foo #(A = 2, AA = 22, AAA = 222);\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    A   = 2,\n"
-     "    AA  = 22,\n"
-     "    AAA = 222\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with 'parameter_declaration'
-     "module foo #(parameter int a = 2, parameter int aa = 22);\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    parameter int a  = 2,\n"
-     "    parameter int aa = 22\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with 'parameter_declaration' and comments
-     "module foo #(//comment\nparameter int a = 2, parameter int aa = 22);\n"
-     "endmodule\n",
-     "module foo #(  //comment\n"
-     "    parameter int a  = 2,\n"
-     "    parameter int aa = 22\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with 'parameter_declaration' and trailing comments
-     "module foo #(parameter int a = 2,//comment\n parameter int aa = 22);\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    parameter int a  = 2,  //comment\n"
-     "    parameter int aa = 22\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with 'parameter_declaration' and pre-proc
-     "module foo #(parameter int a = 2,\n"
-     "`ifdef MACRO parameter int aa = 22, `endif\n"
-     "parameter int aaa = 222);\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    parameter int a   = 2,\n"
-     "`ifdef MACRO\n"
-     "    parameter int aa  = 22,\n"
-     "`endif\n"
-     "    parameter int aaa = 222\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with 'parameter_declaration' and packed dimensions
-     "module foo #(parameter logic [3:0] a = 2, parameter logic [30:0] aa = "
-     "22);\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    parameter logic [ 3:0] a  = 2,\n"
-     "    parameter logic [30:0] aa = 22\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with 'parameter_declaration' and unpacked
-     // dimensions
-     "module foo #(parameter logic a[3:0] = 2, parameter logic  aa [30:0] = "
-     "22);\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    parameter logic a [ 3:0] = 2,\n"
-     "    parameter logic aa[30:0] = 22\n"
-     ");\n"
-     "endmodule\n"},
-
-    {// parameterized module with 'local_parameter_declaration'
-     "module foo #(localparam int a = 2, localparam int aa = 22);\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    localparam int a  = 2,\n"
-     "    localparam int aa = 22\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with 'local_parameter_declaration' and comments
-     "module foo #(//comment\nlocalparam int a = 2, localparam int aa = 22);\n"
-     "endmodule\n",
-     "module foo #(  //comment\n"
-     "    localparam int a  = 2,\n"
-     "    localparam int aa = 22\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with 'local_parameter_declaration' and trailing
-     // comments
-     "module foo #(localparam int a = 2,//comment\n localparam int aa = 22);\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    localparam int a  = 2,  //comment\n"
-     "    localparam int aa = 22\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with 'local_parameter_declaration' and pre-proc
-     "module foo #(localparam int a = 2,\n"
-     "`ifdef MACRO localparam int aa = 22, `endif\n"
-     "localparam int aaa = 222);\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    localparam int a   = 2,\n"
-     "`ifdef MACRO\n"
-     "    localparam int aa  = 22,\n"
-     "`endif\n"
-     "    localparam int aaa = 222\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with 'local_parameter_declaration' and packed
-     // dimensions
-     "module foo #(localparam logic [3:0] a = 2, localparam logic [30:0] aa = "
-     "22);\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    localparam logic [ 3:0] a  = 2,\n"
-     "    localparam logic [30:0] aa = 22\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with 'local_parameter_declaration' and unpacked
-     // dimensions
-     "module foo #(localparam logic a[3:0] = 2, localparam logic  aa [30:0] = "
-     "22);\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    localparam logic a [ 3:0] = 2,\n"
-     "    localparam logic aa[30:0] = 22\n"
-     ");\n"
-     "endmodule\n"},
-
-    {// parameterized module with 'data_type list_of_param_assignments'
-     "module foo #( int a = 2,  real aa = 22, longint aaa = 222);\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    int     a   = 2,\n"
-     "    real    aa  = 22,\n"
-     "    longint aaa = 222\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with 'data_type list_of_param_assignments' and
-     // comments
-     "module foo #(//comment\nint a = 2,  shortreal aa = 22, longint aaa = "
-     "222);\n"
-     "endmodule\n",
-     "module foo #(  //comment\n"
-     "    int       a   = 2,\n"
-     "    shortreal aa  = 22,\n"
-     "    longint   aaa = 222\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with 'data_type list_of_param_assignments' and
-     // trailing comments
-     "module foo #(int a = 2,  shortreal aa = 22,//comment\n longint aaa = "
-     "222);\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    int       a   = 2,\n"
-     "    shortreal aa  = 22,  //comment\n"
-     "    longint   aaa = 222\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with 'data_type list_of_param_assignments' and
-     // pre-proc
-     "module foo #(int a = 2,\n"
-     "`ifdef MACRO shortreal aa = 22, `endif\n"
-     " longint aaa = 222);\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    int       a   = 2,\n"
-     "`ifdef MACRO\n"
-     "    shortreal aa  = 22,\n"
-     "`endif\n"
-     "    longint   aaa = 222\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with 'data_type list_of_param_assignments' and
-     // packed dimensions
-     "module foo #(bit [1:0] a = 2,  reg [12:0] aa = 22, logic [123:0] aaa = "
-     "222);\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    bit   [  1:0] a   = 2,\n"
-     "    reg   [ 12:0] aa  = 22,\n"
-     "    logic [123:0] aaa = 222\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with 'data_type list_of_param_assignments' and
-     // unpacked dimensions
-     "module foo #(bit  a[1:0] = 2,  reg  aa[12:0] = 22, logic aaa [123:0]  = "
-     "222);\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    bit   a  [  1:0] = 2,\n"
-     "    reg   aa [ 12:0] = 22,\n"
-     "    logic aaa[123:0] = 222\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with 'type list_of_type_assignments'
-     "module foo #(type T = int, type TT = bit, type TTT= C#(logic) );\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    type T   = int,\n"
-     "    type TT  = bit,\n"
-     "    type TTT = C#(logic)\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with 'type list_of_type_assignments' and comments
-     "module foo #(//comment\ntype T = int, type TT = bit, type TTT= C#(logic) "
-     ");\n"
-     "endmodule\n",
-     "module foo #(  //comment\n"
-     "    type T   = int,\n"
-     "    type TT  = bit,\n"
-     "    type TTT = C#(logic)\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with 'data_type list_of_param_assignments' and
-     // trailing comments
-     "module foo #(type T = int, type TT = bit, //comment\n type TTT= "
-     "C#(logic) );\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    type T   = int,\n"
-     "    type TT  = bit,       //comment\n"
-     "    type TTT = C#(logic)\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with 'data_type list_of_param_assignments' and
-     // pre-proc
-     "module foo #(type T = int,\n"
-     "`ifdef MACRO type TT = bit, `endif\n"
-     " type TTT= C#(logic));\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    type T   = int,\n"
-     "`ifdef MACRO\n"
-     "    type TT  = bit,\n"
-     "`endif\n"
-     "    type TTT = C#(logic)\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with 'data_type list_of_param_assignments' and
-     // packed dimensions
-     "module foo #(type T = int [3:0], type TT = bit [250:0]);\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    type T  = int [  3:0],\n"
-     "    type TT = bit [250:0]\n"
-     ");\n"
-     "endmodule\n"},
-    {"module foo #(type T = int, "
-     "A = 2, int AA = 22, parameter AAA = 222, parameter longint AAAA = 2222, "
-     "localparam AAAAA = 22222, localparam real AAAAAA = 222222"
-     ");\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "               type    T      = int,\n"
-     "                       A      = 2,\n"
-     "               int     AA     = 22,\n"
-     "    parameter          AAA    = 222,\n"
-     "    parameter  longint AAAA   = 2222,\n"
-     "    localparam         AAAAA  = 22222,\n"
-     "    localparam real    AAAAAA = 222222\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with built-in data type
-     "module foo #(int a = 2, real abc = 2234);\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    int  a   = 2,\n"
-     "    real abc = 2234\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with type
-     "module foo #(type TYPE1 = int, type TYPE2 = boo);\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    type TYPE1 = int,\n"
-     "    type TYPE2 = boo\n"
-     ");\n"
-     "endmodule\n"},
-    {"module foo#(localparam type TYPE1 = int, type TYPE22 = bool, parameter   "
-     " type TYPE333 = real);\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    localparam type TYPE1   = int,\n"
-     "               type TYPE22  = bool,\n"
-     "    parameter  type TYPE333 = real\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with 'data_type list_of_param_assignments' and 1D
-     // packed dimensions
-     "module foo #(parameter type T = int [3:0], type TT = bit [123:0]);\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    parameter type T  = int [  3:0],\n"
-     "              type TT = bit [123:0]\n"
-     ");\n"
-     "endmodule\n"},
-    {// parameterized module with 'data_type list_of_param_assignments' and 2D
-     // packed dimensions
-     "module foo #(type T = int [3:0][123:0], type TT = bit [123:0][1:0]);\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    type T  = int [  3:0][123:0],\n"
-     "    type TT = bit [123:0][  1:0]\n"
-     ");\n"
-     "endmodule\n"},
-    {// parametrized module with user defined data types
-     "module foo #(type T = my_type1_t, type TT = my_pkg::my_type2_t);\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    type T  = my_type1_t,\n"
-     "    type TT = my_pkg::my_type2_t\n"
-     ");\n"
-     "endmodule\n"},
-
-    {// parameterized class with 'list_of_param_assignments'
-     "class foo #(A = 2, AA = 22, AAA = 222);\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    A   = 2,\n"
-     "    AA  = 22,\n"
-     "    AAA = 222\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'parameter_declaration'
-     "class foo #(parameter int a = 2, parameter int aa = 22);\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    parameter int a  = 2,\n"
-     "    parameter int aa = 22\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'parameter_declaration' and comments
-     "class foo #(//comment\nparameter int a = 2, parameter int aa = 22);\n"
-     "endclass\n",
-     "class foo #(  //comment\n"
-     "    parameter int a  = 2,\n"
-     "    parameter int aa = 22\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'parameter_declaration' and trailing comments
-     "class foo #(parameter int a = 2,//comment\n parameter int aa = 22);\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    parameter int a  = 2,  //comment\n"
-     "    parameter int aa = 22\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'parameter_declaration' and pre-proc
-     "class foo #(parameter int a = 2,\n"
-     "`ifdef MACRO parameter int aa = 22, `endif\n"
-     "parameter int aaa = 222);\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    parameter int a   = 2,\n"
-     "`ifdef MACRO\n"
-     "    parameter int aa  = 22,\n"
-     "`endif\n"
-     "    parameter int aaa = 222\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'parameter_declaration' and packed dimensions
-     "class foo #(parameter logic [3:0] a = 2, parameter logic [30:0] aa = "
-     "22);\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    parameter logic [ 3:0] a  = 2,\n"
-     "    parameter logic [30:0] aa = 22\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'parameter_declaration' and unpacked dimensions
-     "class foo #(parameter logic a[3:0] = 2, parameter logic  aa [30:0] = "
-     "22);\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    parameter logic a [ 3:0] = 2,\n"
-     "    parameter logic aa[30:0] = 22\n"
-     ");\n"
-     "endclass\n"},
-
-    {// parameterized class with 'local_parameter_declaration'
-     "class foo #(localparam int a = 2, localparam int aa = 22);\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    localparam int a  = 2,\n"
-     "    localparam int aa = 22\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'local_parameter_declaration' and comments
-     "class foo #(//comment\nlocalparam int a = 2, localparam int aa = 22);\n"
-     "endclass\n",
-     "class foo #(  //comment\n"
-     "    localparam int a  = 2,\n"
-     "    localparam int aa = 22\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'local_parameter_declaration' and trailing
-     // comments
-     "class foo #(localparam int a = 2,//comment\n localparam int aa = 22);\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    localparam int a  = 2,  //comment\n"
-     "    localparam int aa = 22\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'local_parameter_declaration' and pre-proc
-     "class foo #(localparam int a = 2,\n"
-     "`ifdef MACRO localparam int aa = 22, `endif\n"
-     "localparam int aaa = 222);\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    localparam int a   = 2,\n"
-     "`ifdef MACRO\n"
-     "    localparam int aa  = 22,\n"
-     "`endif\n"
-     "    localparam int aaa = 222\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'local_parameter_declaration' and packed
-     // dimensions
-     "class foo #(localparam logic [3:0] a = 2, localparam logic [30:0] aa = "
-     "22);\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    localparam logic [ 3:0] a  = 2,\n"
-     "    localparam logic [30:0] aa = 22\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'local_parameter_declaration' and unpacked
-     // dimensions
-     "class foo #(localparam logic a[3:0] = 2, localparam logic  aa [30:0] = "
-     "22);\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    localparam logic a [ 3:0] = 2,\n"
-     "    localparam logic aa[30:0] = 22\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'data_type list_of_param_assignments'
-     "class foo #( int a = 2,  real aa = 22, longint aaa = 222);\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    int     a   = 2,\n"
-     "    real    aa  = 22,\n"
-     "    longint aaa = 222\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'data_type list_of_param_assignments' and
-     // comments
-     "class foo #(//comment\nint a = 2,  shortreal aa = 22, longint aaa = "
-     "222);\n"
-     "endclass\n",
-     "class foo #(  //comment\n"
-     "    int       a   = 2,\n"
-     "    shortreal aa  = 22,\n"
-     "    longint   aaa = 222\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'data_type list_of_param_assignments' and
-     // trailing comments
-     "class foo #(int a = 2,  shortreal aa = 22,//comment\n longint aaa = "
-     "222);\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    int       a   = 2,\n"
-     "    shortreal aa  = 22,  //comment\n"
-     "    longint   aaa = 222\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'data_type list_of_param_assignments' and
-     // pre-proc
-     "class foo #(int a = 2,\n"
-     "`ifdef MACRO shortreal aa = 22, `endif\n"
-     " longint aaa = 222);\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    int       a   = 2,\n"
-     "`ifdef MACRO\n"
-     "    shortreal aa  = 22,\n"
-     "`endif\n"
-     "    longint   aaa = 222\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'data_type list_of_param_assignments' and
-     // packed dimensions
-     "class foo #(bit [1:0] a = 2,  reg [12:0] aa = 22, logic [123:0] aaa = "
-     "222);\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    bit   [  1:0] a   = 2,\n"
-     "    reg   [ 12:0] aa  = 22,\n"
-     "    logic [123:0] aaa = 222\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'data_type list_of_param_assignments' and
-     // unpacked dimensions
-     "class foo #(bit  a[1:0] = 2,  reg  aa[12:0] = 22, logic aaa [123:0]  = "
-     "222);\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    bit   a  [  1:0] = 2,\n"
-     "    reg   aa [ 12:0] = 22,\n"
-     "    logic aaa[123:0] = 222\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'type list_of_type_assignments'
-     "class foo #(type T = int, type TT = bit, type TTT= C#(logic) );\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    type T   = int,\n"
-     "    type TT  = bit,\n"
-     "    type TTT = C#(logic)\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'type list_of_type_assignments' and comments
-     "class foo #(//comment\ntype T = int, type TT = bit, type TTT= C#(logic) "
-     ");\n"
-     "endclass\n",
-     "class foo #(  //comment\n"
-     "    type T   = int,\n"
-     "    type TT  = bit,\n"
-     "    type TTT = C#(logic)\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'data_type list_of_param_assignments' and
-     // trailing comments
-     "class foo #(type T = int, type TT = bit, //comment\n type TTT= C#(logic) "
-     ");\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    type T   = int,\n"
-     "    type TT  = bit,       //comment\n"
-     "    type TTT = C#(logic)\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'data_type list_of_param_assignments' and
-     // pre-proc
-     "class foo #(type T = int,\n"
-     "`ifdef MACRO type TT = bit, `endif\n"
-     " type TTT= C#(logic));\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    type T   = int,\n"
-     "`ifdef MACRO\n"
-     "    type TT  = bit,\n"
-     "`endif\n"
-     "    type TTT = C#(logic)\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'data_type list_of_param_assignments' and
-     // packed dimensions
-     "class foo #(type T = int [3:0], type TT = bit [250:0]);\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    type T  = int [  3:0],\n"
-     "    type TT = bit [250:0]\n"
-     ");\n"
-     "endclass\n"},
-    {"class foo #(type T = int, "
-     "A = 2, int AA = 22, parameter AAA = 222, parameter longint AAAA = 2222, "
-     "localparam AAAAA = 22222, localparam real AAAAAA = 222222"
-     ");\n"
-     "endclass\n",
-     "class foo #(\n"
-     "               type    T      = int,\n"
-     "                       A      = 2,\n"
-     "               int     AA     = 22,\n"
-     "    parameter          AAA    = 222,\n"
-     "    parameter  longint AAAA   = 2222,\n"
-     "    localparam         AAAAA  = 22222,\n"
-     "    localparam real    AAAAAA = 222222\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with built-in data type
-     "class foo #(int a = 2, real abc = 2234);\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    int  a   = 2,\n"
-     "    real abc = 2234\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with type
-     "class foo #(type TYPE1 = int, type TYPE2 = boo);\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    type TYPE1 = int,\n"
-     "    type TYPE2 = boo\n"
-     ");\n"
-     "endclass\n"},
-    {"class foo#(localparam type TYPE1 = int, type TYPE22 = bool, parameter    "
-     "type TYPE333 = real);\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    localparam type TYPE1   = int,\n"
-     "               type TYPE22  = bool,\n"
-     "    parameter  type TYPE333 = real\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'data_type list_of_param_assignments' and 1D
-     // packed dimensions
-     "class foo #(parameter type T = int [3:0], type TT = bit [123:0]);\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    parameter type T  = int [  3:0],\n"
-     "              type TT = bit [123:0]\n"
-     ");\n"
-     "endclass\n"},
-    {// parameterized class with 'data_type list_of_param_assignments' and 2D
-     // packed dimensions
-     "class foo #(type T = int [3:0][123:0], type TT = bit [123:0][1:0]);\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    type T  = int [  3:0][123:0],\n"
-     "    type TT = bit [123:0][  1:0]\n"
-     ");\n"
-     "endclass\n"},
-    {// parametrized class with user defined data types
-     "class foo #(type T = my_type1_t, type TT = my_pkg::my_type2_t);\n"
-     "endclass\n",
-     "class foo #(\n"
-     "    type T  = my_type1_t,\n"
-     "    type TT = my_pkg::my_type2_t\n"
-     ");\n"
-     "endclass\n"},
-
-    {// parameterized interface with 'local_parameter_declaration'
-     "interface foo #(localparam int a = 2, localparam int aa = 22);\n"
-     "endinterface\n",
-     "interface foo #(\n"
-     "    localparam int a  = 2,\n"
-     "    localparam int aa = 22\n"
-     ");\n"
-     "endinterface\n"},
-    {// parameterized interface with 'local_parameter_declaration' and comments
-     "interface foo #(//comment\nlocalparam int a = 2, localparam int aa = "
-     "22);\n"
-     "endinterface\n",
-     "interface foo #(  //comment\n"
-     "    localparam int a  = 2,\n"
-     "    localparam int aa = 22\n"
-     ");\n"
-     "endinterface\n"},
-    {// parameterized interface with 'local_parameter_declaration' and trailing
-     // comments
-     "interface foo #(localparam int a = 2,//comment\n localparam int aa = "
-     "22);\n"
-     "endinterface\n",
-     "interface foo #(\n"
-     "    localparam int a  = 2,  //comment\n"
-     "    localparam int aa = 22\n"
-     ");\n"
-     "endinterface\n"},
-    {// parameterized interface with 'local_parameter_declaration' and pre-proc
-     "interface foo #(localparam int a = 2,\n"
-     "`ifdef MACRO localparam int aa = 22, `endif\n"
-     "localparam int aaa = 222);\n"
-     "endinterface\n",
-     "interface foo #(\n"
-     "    localparam int a   = 2,\n"
-     "`ifdef MACRO\n"
-     "    localparam int aa  = 22,\n"
-     "`endif\n"
-     "    localparam int aaa = 222\n"
-     ");\n"
-     "endinterface\n"},
-    {// parameterized interface with 'local_parameter_declaration' and packed
-     // dimensions
-     "interface foo #(localparam logic [3:0] a = 2, localparam logic [30:0] aa "
-     "= 22);\n"
-     "endinterface\n",
-     "interface foo #(\n"
-     "    localparam logic [ 3:0] a  = 2,\n"
-     "    localparam logic [30:0] aa = 22\n"
-     ");\n"
-     "endinterface\n"},
-    {// parameterized interface with 'local_parameter_declaration' and unpacked
-     // dimensions
-     "interface foo #(localparam logic a[3:0] = 2, localparam logic  aa [30:0] "
-     "= 22);\n"
-     "endinterface\n",
-     "interface foo #(\n"
-     "    localparam logic a [ 3:0] = 2,\n"
-     "    localparam logic aa[30:0] = 22\n"
-     ");\n"
-     "endinterface\n"},
-    {// parameterized interface with 'data_type list_of_param_assignments'
-     "interface foo #( int a = 2,  real aa = 22, longint aaa = 222);\n"
-     "endinterface\n",
-     "interface foo #(\n"
-     "    int     a   = 2,\n"
-     "    real    aa  = 22,\n"
-     "    longint aaa = 222\n"
-     ");\n"
-     "endinterface\n"},
-    {// parameterized interface with 'data_type list_of_param_assignments' and
-     // comments
-     "interface foo #(//comment\nint a = 2,  shortreal aa = 22, longint aaa = "
-     "222);\n"
-     "endinterface\n",
-     "interface foo #(  //comment\n"
-     "    int       a   = 2,\n"
-     "    shortreal aa  = 22,\n"
-     "    longint   aaa = 222\n"
-     ");\n"
-     "endinterface\n"},
-    {// parameterized interface with 'data_type list_of_param_assignments' and
-     // trailing comments
-     "interface foo #(int a = 2,  shortreal aa = 22,//comment\n longint aaa = "
-     "222);\n"
-     "endinterface\n",
-     "interface foo #(\n"
-     "    int       a   = 2,\n"
-     "    shortreal aa  = 22,  //comment\n"
-     "    longint   aaa = 222\n"
-     ");\n"
-     "endinterface\n"},
-    {// parameterized interface with 'data_type list_of_param_assignments' and
-     // pre-proc
-     "interface foo #(int a = 2,\n"
-     "`ifdef MACRO shortreal aa = 22, `endif\n"
-     " longint aaa = 222);\n"
-     "endinterface\n",
-     "interface foo #(\n"
-     "    int       a   = 2,\n"
-     "`ifdef MACRO\n"
-     "    shortreal aa  = 22,\n"
-     "`endif\n"
-     "    longint   aaa = 222\n"
-     ");\n"
-     "endinterface\n"},
-    {// parameterized interface with 'data_type list_of_param_assignments' and
-     // packed dimensions
-     "interface foo #(bit [1:0] a = 2,  reg [12:0] aa = 22, logic [123:0] aaa "
-     "= 222);\n"
-     "endinterface\n",
-     "interface foo #(\n"
-     "    bit   [  1:0] a   = 2,\n"
-     "    reg   [ 12:0] aa  = 22,\n"
-     "    logic [123:0] aaa = 222\n"
-     ");\n"
-     "endinterface\n"},
-    {// parameterized interface with 'data_type list_of_param_assignments' and
-     // unpacked dimensions
-     "interface foo #(bit  a[1:0] = 2,  reg  aa[12:0] = 22, logic aaa [123:0]  "
-     "= 222);\n"
-     "endinterface\n",
-     "interface foo #(\n"
-     "    bit   a  [  1:0] = 2,\n"
-     "    reg   aa [ 12:0] = 22,\n"
-     "    logic aaa[123:0] = 222\n"
-     ");\n"
-     "endinterface\n"},
-    {// parameterized interface with 'type list_of_type_assignments'
-     "interface foo #(type T = int, type TT = bit, type TTT= C#(logic) );\n"
-     "endinterface\n",
-     "interface foo #(\n"
-     "    type T   = int,\n"
-     "    type TT  = bit,\n"
-     "    type TTT = C#(logic)\n"
-     ");\n"
-     "endinterface\n"},
-    {// parameterized interface with 'type list_of_type_assignments' and
-     // comments
-     "interface foo #(//comment\ntype T = int, type TT = bit, type TTT= "
-     "C#(logic) );\n"
-     "endinterface\n",
-     "interface foo #(  //comment\n"
-     "    type T   = int,\n"
-     "    type TT  = bit,\n"
-     "    type TTT = C#(logic)\n"
-     ");\n"
-     "endinterface\n"},
-    {// parameterized interface with 'data_type list_of_param_assignments' and
-     // trailing comments
-     "interface foo #(type T = int, type TT = bit, //comment\n type TTT= "
-     "C#(logic) );\n"
-     "endinterface\n",
-     "interface foo #(\n"
-     "    type T   = int,\n"
-     "    type TT  = bit,       //comment\n"
-     "    type TTT = C#(logic)\n"
-     ");\n"
-     "endinterface\n"},
-    {// parameterized interface with 'data_type list_of_param_assignments' and
-     // pre-proc
-     "interface foo #(type T = int,\n"
-     "`ifdef MACRO type TT = bit, `endif\n"
-     " type TTT= C#(logic));\n"
-     "endinterface\n",
-     "interface foo #(\n"
-     "    type T   = int,\n"
-     "`ifdef MACRO\n"
-     "    type TT  = bit,\n"
-     "`endif\n"
-     "    type TTT = C#(logic)\n"
-     ");\n"
-     "endinterface\n"},
-    {// parameterized interface with 'data_type list_of_param_assignments' and
-     // packed dimensions
-     "interface foo #(type T = int [3:0], type TT = bit [250:0]);\n"
-     "endinterface\n",
-     "interface foo #(\n"
-     "    type T  = int [  3:0],\n"
-     "    type TT = bit [250:0]\n"
-     ");\n"
-     "endinterface\n"},
-    {"interface foo #(type T = int, "
-     "A = 2, int AA = 22, parameter AAA = 222, parameter longint AAAA = 2222, "
-     "localparam AAAAA = 22222, localparam real AAAAAA = 222222"
-     ");\n"
-     "endinterface\n",
-     "interface foo #(\n"
-     "               type    T      = int,\n"
-     "                       A      = 2,\n"
-     "               int     AA     = 22,\n"
-     "    parameter          AAA    = 222,\n"
-     "    parameter  longint AAAA   = 2222,\n"
-     "    localparam         AAAAA  = 22222,\n"
-     "    localparam real    AAAAAA = 222222\n"
-     ");\n"
-     "endinterface\n"},
-    {// parameterized interface with built-in data type
-     "interface foo #(int a = 2, real abc = 2234);\n"
-     "endinterface\n",
-     "interface foo #(\n"
-     "    int  a   = 2,\n"
-     "    real abc = 2234\n"
-     ");\n"
-     "endinterface\n"},
-    {// parameterized interface with type
-     "interface foo #(type TYPE1 = int, type TYPE2 = boo);\n"
-     "endinterface\n",
-     "interface foo #(\n"
-     "    type TYPE1 = int,\n"
-     "    type TYPE2 = boo\n"
-     ");\n"
-     "endinterface\n"},
-    {"interface foo#(localparam type TYPE1 = int, type TYPE22 = bool, "
-     "parameter    type TYPE333 = real);\n"
-     "endinterface\n",
-     "interface foo #(\n"
-     "    localparam type TYPE1   = int,\n"
-     "               type TYPE22  = bool,\n"
-     "    parameter  type TYPE333 = real\n"
-     ");\n"
-     "endinterface\n"},
-    {// parameterized interface with 'data_type list_of_param_assignments' and
-     // 1D packed dimensions
-     "interface foo #(parameter type T = int [3:0], type TT = bit [123:0]);\n"
-     "endinterface\n",
-     "interface foo #(\n"
-     "    parameter type T  = int [  3:0],\n"
-     "              type TT = bit [123:0]\n"
-     ");\n"
-     "endinterface\n"},
-    {// parameterized interface with 'data_type list_of_param_assignments' and
-     // 2D packed dimensions
-     "interface foo #(type T = int [3:0][123:0], type TT = bit [123:0][1:0]);\n"
-     "endinterface\n",
-     "interface foo #(\n"
-     "    type T  = int [  3:0][123:0],\n"
-     "    type TT = bit [123:0][  1:0]\n"
-     ");\n"
-     "endinterface\n"},
-    {// parametrized interface with user defined data types
-     "interface foo #(type T = my_type1_t, type TT = my_pkg::my_type2_t);\n"
-     "endinterface\n",
-     "interface foo #(\n"
-     "    type T  = my_type1_t,\n"
-     "    type TT = my_pkg::my_type2_t\n"
-     ");\n"
-     "endinterface\n"},
-    {// wildcard import package at module header
-     "module foo import bar::*; (baz); endmodule\n",
-     "module foo\n"
-     "  import bar::*;\n"
-     "(\n"
-     "    baz\n"
-     ");\n"
-     "endmodule\n"},
-    {// import package at module header
-     "module foo import bar::baz; (qux); endmodule\n",
-     "module foo\n"
-     "  import bar::baz;\n"
-     "(\n"
-     "    qux\n"
-     ");\n"
-     "endmodule\n"},
-    {// wildcard import multiple packages at module header
-     "module foo import bar::*,baz::*; (qux); endmodule\n",
-     "module foo\n"
-     "  import bar::*, baz::*;\n"
-     "(\n"
-     "    qux\n"
-     ");\n"
-     "endmodule\n"},
-    {// separate package import declarations in module header
-     "module foo import bar::*,baz::*; import q_pkg::qux; (qux); endmodule\n",
-     "module foo\n"
-     "  import bar::*, baz::*;\n"
-     "  import q_pkg::qux;\n"
-     "(\n"
-     "    qux\n"
-     ");\n"
-     "endmodule\n"},
-    {// import package at module header
-     "module foo import bar::baz; #(int p = 3)(qux); endmodule\n",
-     "module foo\n"
-     "  import bar::baz;\n"
-     "#(\n"
-     "    int p = 3\n"
-     ") (\n"
-     "    qux\n"
-     ");\n"
-     "endmodule\n"},
-    // Space between return keyword and return value
-    {"function int foo(logic [31:0] data); return{<<8{data}}; endfunction",
-     "function int foo(logic [31:0] data);\n"
-     "  return {<<8{data}};\n"
-     "endfunction\n"},
-    {"function int f;return(1);endfunction",
-     "function int f;\n"
-     "  return (1);\n"
-     "endfunction\n"},
-    {"function int f;return-1;endfunction",
-     "function int f;\n"
-     "  return -1;\n"
-     "endfunction\n"},
-    {"function int f ;return    ! x\n;endfunction",
-     "function int f;\n"
-     "  return !x;\n"
-     "endfunction\n"},
-    {"function int f ;return    ~ x\n;endfunction",
-     "function int f;\n"
-     "  return ~x;\n"
-     "endfunction\n"},
-    {"function int f ;return    $x\n;endfunction",
-     "function int f;\n"
-     "  return $x;\n"
-     "endfunction\n"},
-    // String initializers
-    {"string a[] = {\n\"a\"\n};\n", "string a[] = {\"a\"};\n"},
-    {"string abc[] = {\n\"a\",\n\"b\",\n\"c\"\n};\n",
-     "string abc[] = {\"a\", \"b\", \"c\"};\n"},
-    {"string abc[] = {\n"
-     "\"a\",//\n"
-     "\"b\", \"c\"\n"
-     "};\n",
-     "string abc[] = {\"a\",  //\n"
-     "                \"b\",\n"
-     "                \"c\"};\n"},
-    {"string abc[] = {//\n"
-     "\"a\", \"b\", \"c\""
-     "};\n",
-     "string abc[] = {  //\n"
-     "  \"a\",\n"
-     "  \"b\",\n"
-     "  \"c\"\n"
-     "};\n"},
-    {"string abc[] = {\n"
-     "\"a\", \"b\", \"c\"//\n"
-     "};\n",
-     "string abc[] = {\"a\",\n"
-     "                \"b\",\n"
-     "                \"c\"  //\n"
-     "                };\n"},
-    {"string abc[] = {//\n"
-     "\"a\",//\n"
-     "\"b\", \"c\"//\n"
-     "};\n",
-     "string abc[] = {  //\n"
-     "  \"a\",  //\n"
-     "  \"b\",\n"
-     "  \"c\"  //\n"
-     "};\n"},
-    {"string abc[] = {\n"
-     "\"a\",\n"
-     "// comment\n"
-     "// comment\n"
-     "\"b\",\n"
-     "\"c\"\n"
-     "};\n",
-     "string abc[] = {\"a\",\n"
-     "                // comment\n"
-     "                // comment\n"
-     "                \"b\",\n"
-     "                \"c\"};\n"},
-    {"string numbers[] = {\"one\", \"two\", \"three\", \"four\"};\n",
-     "string numbers[] = {\"one\",\n"
-     "                    \"two\",\n"
-     "                    \"three\",\n"
-     "                    \"four\"};\n"},
-    {"string numbers[] = {\"one\", \"two\", THREE, \"four\"};\n",
-     "string numbers[] = {\n"
-     "  \"one\", \"two\", THREE, \"four\"\n"
-     "};\n"},
-    {"string numbers[] = {\"one\", {\"two\", \"three\"}, \"four\"};\n",
-     "string numbers[] = {\n"
-     "  \"one\", {\"two\", \"three\"}, \"four\"\n"
-     "};\n"},
-    {"string numbers[] = {\"one\", {\"two\", //\n"
-     "\"three\"}, \"four\"};\n",
-     "string numbers[] = {\n"
-     "  \"one\",\n"
-     "  {\n"
-     "    \"two\",  //\n"
-     "    \"three\"\n"
-     "  },\n"
-     "  \"four\"\n"
-     "};\n"},
-    {"string years[] = {\"two_thousand_nineteen\", \"two_thousand_twenty\",\n"
-     "\"two_thousand_twenty_one\"};\n",
-     // line with 3rd string would exceed column limit in unwrapped style
-     "string years[] = {\n"
-     "  \"two_thousand_nineteen\",\n"
-     "  \"two_thousand_twenty\",\n"
-     "  \"two_thousand_twenty_one\"\n"
-     "};\n"},
-    {"class class_name;\n"
-     "var_type var_name = new(\"the_string\");\n"
-     "endclass\n",
-     "class class_name;\n"
-     "  var_type var_name = new(\"the_string\");\n"
-     "endclass\n"},
-
-    //{   // parameterized class with 'parameter_declaration' and MACRO
-    //    "class foo #(parameter int a = 2,\n"
-    //    "parameter int aaa = `MACRO);\n"
-    //    "endclass\n",
-    //    "class foo #(\n"
-    //    "    parameter int a   = 2,\n"
-    //    "    parameter int aaa = `MACRO\n"
-    //    ");\n"
-    //    "endclass\n"
-    //},
-    // Struct/Union alignment
-    {"typedef struct {\n"
-     "bit [3:0] first; bit [31:0] second; generic_type_name_t third;\n"
-     "} type_t;",
-     "typedef struct {\n"
-     "  bit [3:0]           first;\n"
-     "  bit [31:0]          second;\n"
-     "  generic_type_name_t third;\n"
-     "} type_t;\n"},
-    {"typedef union soft packed {\n"
-     "bit [3:0] first; bit [31:0] second; generic_type_name_t third;\n"
-     "} type_t;",
-     "typedef union soft packed {\n"
-     "  bit [3:0]           first;\n"
-     "  bit [31:0]          second;\n"
-     "  generic_type_name_t third;\n"
-     "} type_t;\n"},
-    {"typedef union soft {\n"
-     "bit [3:0] first; bit [31:0] second; generic_type_name_t third;\n"
-     "} type_t;",
-     "typedef union soft {\n"
-     "  bit [3:0]           first;\n"
-     "  bit [31:0]          second;\n"
-     "  generic_type_name_t third;\n"
-     "} type_t;\n"},
-    {"typedef struct {\n"
-     "// comment\n"
-     "bit [3:0] first; bit [31:0] second; generic_type_name_t third;\n"
-     "} type_t;",
-     "typedef struct {\n"
-     "  // comment\n"
-     "  bit [3:0]           first;\n"
-     "  bit [31:0]          second;\n"
-     "  generic_type_name_t third;\n"
-     "} type_t;\n"},
-    {"typedef struct {\n"
-     "// comment 0\n"
-     "bit [31:0] first; // a\n"
-     "bit [31:0] second; // b\n"
-     "bit third; // c\n"
-     "uint fourth; // d\n"
-     "\n"
-     "// comment 1\n"
-     "int fifth;\n"
-     "// comment 2.1\n"
-     "// comment 2.2\n"
-     "uint sixth;\n"
-     "} timing_cfg_t;",
-     "typedef struct {\n"
-     "  // comment 0\n"
-     "  bit [31:0] first;   // a\n"
-     "  bit [31:0] second;  // b\n"
-     "  bit        third;   // c\n"
-     "  uint       fourth;  // d\n"
-     "\n"
-     "  // comment 1\n"
-     "  int  fifth;\n"
-     "  // comment 2.1\n"
-     "  // comment 2.2\n"
-     "  uint sixth;\n"
-     "} timing_cfg_t;\n"},
-    {"typedef struct {\n"
-     "// comment\n"
-     "rand int r;\n"
-     "int a;\n"
-     "int aa = 0;\n"
-     "int aaa = 1; // comment\n"
-     "foo#(bar) z;\n"
-     "int [x:y] zz; // comment\n"
-     "int zzz[a:b];\n"
-     "} type_t;",
-     "typedef struct {\n"
-     "  // comment\n"
-     "  rand int   r;\n"
-     "  int        a;\n"
-     "  int        aa        = 0;\n"
-     "  int        aaa       = 1;  // comment\n"
-     "  foo #(bar) z;\n"
-     "  int [x:y]  zz;             // comment\n"
-     "  int        zzz[a:b];\n"
-     "} type_t;\n"},
-    {"typedef struct packed {\n"
-     "struct packed { bit q; logic qq; logic qqq; } a_few_qs;\n"
-     "struct packed {\n"
-     "logic [1:0]  q;\n"
-     "} one_q;\n"
-     "int q;\n"
-     "uint qq;\n"
-     "} nested_qs_t;",
-     "typedef struct packed {\n"
-     "  struct packed {\n"
-     "    bit   q;\n"
-     "    logic qq;\n"
-     "    logic qqq;\n"
-     "  } a_few_qs;\n"
-     "  struct packed {logic [1:0] q;} one_q;\n"
-     "  int  q;\n"
-     "  uint qq;\n"
-     "} nested_qs_t;\n"},
-    {"typedef struct packed {\n"
-     "struct packed { bit q; logic qq; logic qqq; } a_few_qs;\n"
-     "struct packed {\n"
-     "// comment\n"
-     "logic [1:0]  q;\n"
-     "} one_q;\n"
-     "int q;\n"
-     "uint qq;\n"
-     "} nested_qs_t;",
-     "typedef struct packed {\n"
-     "  struct packed {\n"
-     "    bit   q;\n"
-     "    logic qq;\n"
-     "    logic qqq;\n"
-     "  } a_few_qs;\n"
-     "  struct packed {\n"
-     "    // comment\n"
-     "    logic [1:0] q;\n"
-     "  } one_q;\n"
-     "  int  q;\n"
-     "  uint qq;\n"
-     "} nested_qs_t;\n"},
-    {"typedef struct {bit [3:0] first;\n"
-     "`ifdef MACRO\n"
-     "bit [31:0] second; generic_type_name_t third;\n"
-     "`endif\n"
-     "} type_t;\n",
-     "typedef struct {\n"
-     "  bit [3:0]           first;\n"
-     "`ifdef MACRO\n"
-     "  bit [31:0]          second;\n"
-     "  generic_type_name_t third;\n"
-     "`endif\n"
-     "} type_t;\n"},
-    {"typedef struct {\n"
-     "bit [3:0] first // c\n"
-     "; bit [31:0] second"
-     "// c\n"
-     "; generic_type_name_t third // c\n"
-     ";} type_t;\n",
-     "typedef struct {\n"
-     "  bit [3:0]           first  // c\n"
-     ";\n"
-     "  bit [31:0]          second  // c\n"
-     ";\n"
-     "  generic_type_name_t third  // c\n"
-     ";\n"
-     "} type_t;\n"},
-    {"struct {logic test1; // c\n"
-     "logic test2;} test3;\n",
-     "struct {\n"
-     "  logic test1;  // c\n"
-     "  logic test2;\n"
-     "} test3;\n"},
-    {"struct {\n"
-     "  /* t */ logic test1; /* t */\n"
-     "/* t */ logic test2; }test3;\n",
-     "struct {\n"
-     "  /* t */ logic test1;  /* t */\n"
-     "  /* t */ logic test2;\n"
-     "} test3;\n"},
-    // Continuation comment alignment
-    {"`define BAR 1 // A\n"
-     "module foo(); // B\n"
-     "wire baz;     // C\n"
-     "endmodule:foo // D\n",
-     "`define BAR 1 // A\n"
-     "module foo ();  // B\n"
-     "  wire baz;  // C\n"
-     "endmodule : foo  // D\n"},
-    {"`define BAR 1 // A\n"
-     "module foo(); // B\n"
-     "              // B.1\n"
-     "              // B.2\n"
-     "wire baz;     // C\n"
-     "              // C.1\n"
-     "              // C.2\n"
-     "endmodule:foo // D\n"
-     "              // D.1\n"
-     "              // D.2\n",
-     "`define BAR 1 // A\n"
-     "module foo ();  // B\n"
-     "                // B.1\n"
-     "                // B.2\n"
-     "  wire baz;  // C\n"
-     "             // C.1\n"
-     "             // C.2\n"
-     "endmodule : foo  // D\n"
-     "                 // D.1\n"
-     "                 // D.2\n"},
-    {"// W\n"
-     "`define BAR 1 // A\n"
-     "   // X\n"
-     "module foo(); // B\n"
-     "              // B.1\n"
-     "              // B.2\n"
-     " // Y\n"
-     "wire baz;     // C\n"
-     "              // C.1\n"
-     "              // C.2\n"
-     "    // Z\n"
-     "endmodule:foo // D\n"
-     "              // D.1\n"
-     "              // D.2\n",
-     "// W\n"
-     "`define BAR 1 // A\n"
-     "// X\n"
-     "module foo ();  // B\n"
-     "                // B.1\n"
-     "                // B.2\n"
-     "  // Y\n"
-     "  wire baz;  // C\n"
-     "             // C.1\n"
-     "             // C.2\n"
-     "  // Z\n"
-     "endmodule : foo  // D\n"
-     "                 // D.1\n"
-     "                 // D.2\n"},
-    {"module foo( // A\n"
-     "            // A.1\n"
-     "// X\n"
-     "input wire i1 [a:b], // B\n"
-     "                     // B.1\n"
-     "input [c:d] i2, // C\n"
-     "                // C.1\n"
-     "\n"
-     "// Y\n"
-     "output reg o1 // D\n"
-     "              // D.1\n"
-     ");endmodule:foo\n",
-     "module foo (  // A\n"
-     "              // A.1\n"
-     "    // X\n"
-     "    input wire       i1[a:b],  // B\n"
-     "                               // B.1\n"
-     "    input      [c:d] i2,       // C\n"
-     "                               // C.1\n"
-     "\n"
-     "    // Y\n"
-     "    output reg o1  // D\n"
-     "                   // D.1\n"
-     ");\n"
-     "endmodule : foo\n"},
-    // user defined type alignment
-    {
-        "module foo();\n"
-        "  logic [5:0][5:0] net_c;\n"
-        " messy_type_name [1:0] net_e;\n"
-        "endmodule\n",
-        "module foo ();\n"
-        "  logic           [5:0][5:0] net_c;\n"
-        "  messy_type_name [1:0]      net_e;\n"
-        "endmodule\n",
-    },
-    // Continuation comment's original starting column is allowed to differ from
-    // starting comment's original starting column at most by 1.
-    // Starting column of comments B and C will change after formatting.
-    // TODO: refine the column alignment depending on current vs previous line.
-    // https://github.com/chipsalliance/verible/pull/858#discussion_r672844015
-    {"module foo ();  // A\n"     // Starting comment; already on correct column
-     "                 // A.1\n"  // A's column + 1
-     "               // A.2\n"    // A's column - 1
-     "wire baz;      // B\n"      // Starting comment; will be moved left
-     "              // B.1\n"     // B's column - 1
-     "                // B.2\n"   // B's column + 1
-     "               // B.3\n"    // B's column
-     "endmodule:foo // C\n"       // Starting comment; will be moved right
-     "               // C.1\n"    // C's column + 1
-     "             // C.2\n",     // C's column - 1
-     "module foo ();  // A\n"
-     "                // A.1\n"
-     "                // A.2\n"
-     "  wire baz;  // B\n"
-     "             // B.1\n"
-     "             // B.2\n"
-     "             // B.3\n"
-     "endmodule : foo  // C\n"
-     "                 // C.1\n"
-     "                 // C.2\n"},
-    {"module foo\n"
-     "#(\n"
-     "  parameter type baz_t = struct packed { `BAZ(); }\n"
-     ")\n"
-     "();\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    parameter type\n"
-     "        baz_t = struct packed {\n"
-     "      `BAZ();\n"
-     "    }\n"
-     ") ();\n"
-     "endmodule\n"},
-    // The same as the previous test case, but without a semicolon at the macro
-    // call
-    {"module foo\n"
-     "#(\n"
-     "  parameter type baz_t = struct packed { `BAZ() }\n"
-     ")\n"
-     "();\n"
-     "endmodule\n",
-     "module foo #(\n"
-     "    parameter type\n"
-     "        baz_t = struct packed {\n"
-     "      `BAZ()\n"
-     "    }\n"
-     ") ();\n"
-     "endmodule\n"},
-    // Check that comments with too large starting column difference are not
-    // aligned as continuation comments.
-    // Check that starting comments are not linked with a comment in
-    // comment-only line above them, even when the starting column is the same.
-    // All comments in this test case are aligned independently, i.e. none are
-    // "continuation comments".
-    {"                // comment1\n"  // A's column, but is above it
-     "module foo ();  // A\n"
-     "                  // comment2\n"  // A's column + 2
-     "              // comment3\n"      // A's column - 2
-     "wire baz;     // B\n"
-     "            // comment4\n"      // B's column - 2
-     "                // comment5\n"  // B's column + 2
-     "              // comment6\n"    // B's column, but not directly under B
-     "endmodule:foo // C\n"
-     "                // comment7\n"  // C's column + 2
-     "              // comment8\n",   // C's column, but not directly under B
-     "// comment1\n"
-     "module foo ();  // A\n"
-     "  // comment2\n"
-     "  // comment3\n"
-     "  wire baz;  // B\n"
-     "  // comment4\n"
-     "  // comment5\n"
-     "  // comment6\n"
-     "endmodule : foo  // C\n"
-     "// comment7\n"
-     "// comment8\n"},
-    // Continuation comment alignment when a line with the starting comment is
-    // wrapped.
-    {"module foo(output logic very_very_very_very_long_name // A\n"
-     "                                                      // A.1\n"
-     "); endmodule\n",
-     "module foo (\n"
-     "    output logic\n"
-     "        very_very_very_very_long_name  // A\n"
-     "                                       // A.1\n"
-     ");\n"
-     "endmodule\n"},
-
-    // Attachment of ',' to elements in enum list (with and without comments)
-    {"typedef enum {\n"
-     "  first , // c1\n"
-     "  second\n"
-     "} e;\n",
-     "typedef enum {\n"
-     "  first,  // c1\n"
-     "  second\n"
-     "} e;\n"},
-    {"typedef enum {\n"
-     "  first ,\n"
-     "  // c1\n"
-     "  second\n"
-     "} e;\n",
-     "typedef enum {\n"
-     "  first,\n"
-     "  // c1\n"
-     "  second\n"
-     "} e;\n"},
-    {"typedef enum {\n"
-     "  first // c1\n"
-     "  , second\n"
-     "} e;\n",
-     "typedef enum {\n"
-     "    first   // c1\n"
-     "  , second\n"
-     "} e;\n"},
-    {"typedef enum {\n"
-     "  first\n"
-     "  // c1\n"
-     "  , second\n"
-     "} e;\n",
-     "typedef enum {\n"
-     "    first\n"
-     "  // c1\n"
-     "  , second\n"
-     "} e;\n"},
-    {"typedef enum {\n"
-     "  first // c1\n"
-     "  , // c2\n"
-     "  second\n"
-     "} e;\n",
-     "typedef enum {\n"
-     "  first   // c1\n"
-     "  ,  // c2\n"
-     "  second\n"
-     "} e;\n"},
-    {"typedef enum {\n"
-     "  first\n"
-     "  // c1\n"
-     "  ,\n"
-     "  // c2\n"
-     "  second\n"
-     "} e;\n",
-     "typedef enum {\n"
-     "  first\n"
-     "  // c1\n"
-     "  ,  // c2\n"
-     "  second\n"
-     "} e;\n"},
-    {"typedef enum {\n"
-     "  first\n"
-     "  // c1\n"
-     "  , // c2\n"
-     "  // c3\n"
-     "  second\n"
-     "} e;\n",
-     "typedef enum {\n"
-     "  first\n"
-     "  // c1\n"
-     "  ,  // c2\n"
-     "  // c3\n"
-     "  second\n"
-     "} e;\n"},
-    {"typedef enum {\n"
-     "  // c1\n"
-     "  first\n"
-     "  // c2\n"
-     "  , // c3\n"
-     "  // c4\n"
-     "  second\n"
-     "  // c5\n"
-     "} e;\n",
-     "typedef enum {\n"
-     "  // c1\n"
-     "  first\n"
-     "  // c2\n"
-     "  ,  // c3\n"
-     "  // c4\n"
-     "  second\n"
-     "  // c5\n"
-     "} e;\n"},
-    {"typedef enum {\n"
-     "  // c1\n"
-     "  // c1+\n"
-     "  first // c2\n"
-     "        // c2+\n"
-     "  , // c3\n"
-     "    // c3+\n"
-     "  // c4\n"
-     "  // c4+\n"
-     "  second // c5\n"
-     "         // c5+\n"
-     "} e;\n",
-     "typedef enum {\n"
-     "  // c1\n"
-     "  // c1+\n"
-     "  first   // c2\n"
-     "          // c2+\n"
-     "  ,  // c3\n"
-     "     // c3+\n"
-     "  // c4\n"
-     "  // c4+\n"
-     "  second  // c5\n"
-     "          // c5+\n"
-     "} e;\n"},
-    {"typedef enum {\n"
-     "  first , /* c1 */\n"
-     "  second\n"
-     "} e;\n",
-     "typedef enum {\n"
-     "  first,  /* c1 */\n"
-     "  second\n"
-     "} e;\n"},
-    {"typedef enum {\n"
-     "  first ,\n"
-     "  /* c1 */\n"
-     "  second\n"
-     "} e;\n",
-     "typedef enum {\n"
-     "  first,\n"
-     "  /* c1 */\n"
-     "  second\n"
-     "} e;\n"},
-    {"typedef enum {\n"
-     "  first /* c1 */\n"
-     "  , second\n"
-     "} e;\n",
-     "typedef enum {\n"
-     "    first   /* c1 */\n"
-     "  , second\n"
-     "} e;\n"},
-    {"typedef enum {\n"
-     "  first\n"
-     "  /* c1 */\n"
-     "  , second\n"
-     "} e;\n",
-     "typedef enum {\n"
-     "    first\n"
-     "  /* c1 */\n"
-     "  , second\n"
-     "} e;\n"},
-    {"typedef enum {\n"
-     "  first /* c1 */\n"
-     "  , /* c2 */\n"
-     "  second\n"
-     "} e;\n",
-     "typedef enum {\n"
-     "  first   /* c1 */\n"
-     "  ,  /* c2 */\n"
-     "  second\n"
-     "} e;\n"},
-    {"typedef enum {\n"
-     "  first\n"
-     "  /* c1 */\n"
-     "  ,\n"
-     "  /* c2 */\n"
-     "  second\n"
-     "} e;\n",
-     "typedef enum {\n"
-     "  first\n"
-     "  /* c1 */\n"
-     "  ,\n"
-     "  /* c2 */\n"
-     "  second\n"
-     "} e;\n"},
-    {"typedef enum {\n"
-     "  /* c1 */\n"
-     "  first\n"
-     "  /* c2 */\n"
-     "  , /* c3 */\n"
-     "  /* c4 */\n"
-     "  second\n"
-     "  /* c5 */\n"
-     "} e;\n",
-     "typedef enum {\n"
-     "  /* c1 */\n"
-     "  first\n"
-     "  /* c2 */\n"
-     "  ,  /* c3 */\n"
-     "  /* c4 */\n"
-     "  second\n"
-     "  /* c5 */\n"
-     "} e;\n"},
-    {"typedef enum {\n"
-     "  /* c1  */\n"
-     "  /* c1+ */\n"
-     "  first /* c2  */\n"
-     "        /* c2+ */\n"
-     "  , /* c3  */\n"
-     "    /* c3+ */\n"
-     "  /* c4  */\n"
-     "  /* c4+ */\n"
-     "  second /* c5  */\n"
-     "         /* c5+ */\n"
-     "} e;\n",
-     "typedef enum {\n"
-     "  /* c1  */\n"
-     "  /* c1+ */\n"
-     "  first   /* c2  */\n"
-     "  /* c2+ */\n"
-     "  ,  /* c3  */\n"
-     "  /* c3+ */\n"
-     "  /* c4  */\n"
-     "  /* c4+ */\n"
-     "  second  /* c5  */\n"
-     "  /* c5+ */\n"
-     "} e;\n"},
-    {"module m;\n"
-     "typedef enum {\n"
-     "  first,\n"
-     "  second\n"
-     "} // c\n"
-     "e;\n"
-     "endmodule\n",
-     "module m;\n"
-     "  typedef enum {\n"
-     "    first,\n"
-     "    second\n"
-     "  }  // c\n"
-     "  e;\n"
-     "endmodule\n"},
-    // Attachment of ';' preceded by EOL comment
-    {"module m;\n"
-     "typedef enum {\n"
-     "  first,\n"
-     "  second\n"
-     "} e // c\n"
-     ";\n"
-     "endmodule\n",
-     "module m;\n"
-     "  typedef enum {\n"
-     "    first,\n"
-     "    second\n"
-     "  } e  // c\n"
-     "  ;\n"
-     "endmodule\n"},
-    {"module m;\n"
-     "typedef enum {\n"
-     "  first,\n"
-     "  second\n"
-     "} // c1\n"
-     "e // c2\n"
-     ";\n"
-     "endmodule\n",
-     "module m;\n"
-     "  typedef enum {\n"
-     "    first,\n"
-     "    second\n"
-     "  }  // c1\n"
-     "  e  // c2\n"
-     "  ;\n"
-     "endmodule\n"},
-    {"assign foo = bar\n"
-     "// comment\n"
-     ";\n",
-     "assign foo = bar\n"
-     "    // comment\n"
-     "    ;\n"},
-    {"assign foo = bar // comment\n"
-     ";\n",
-     "assign foo = bar  // comment\n"
-     ";\n"},
-
-    // Attachment of ',' to elements in PortActualList (with and without
-    // comments)
-    {"module foo;\n"
-     "  bar foobar(\n"
-     "    .first(1) // c1\n"
-     "    ,\n"
-     "    .second(2) // c2\n"
-     "  );\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar foobar (\n"
-     "        .first (1)  // c1\n"
-     "      , .second(2)  // c2\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar foobar(\n"
-     "    .first(1) // c1\n"
-     "    , .second(2) // c2\n"
-     "  );\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar foobar (\n"
-     "        .first (1)  // c1\n"
-     "      , .second(2)  // c2\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar foobar(\n"
-     "    .first(1)\n"
-     "    // c1\n"
-     "    ,\n"
-     "    .second(2)\n"
-     "    // c2\n"
-     "  );\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar foobar (\n"
-     "        .first (1)\n"
-     "      // c1\n"
-     "      , .second(2)\n"
-     "      // c2\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar foobar(\n"
-     "    .first(1)\n"
-     "    // c1\n"
-     "    , .second(2)\n"
-     "    // c2\n"
-     "  );\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar foobar (\n"
-     "        .first (1)\n"
-     "      // c1\n"
-     "      , .second(2)\n"
-     "      // c2\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar foobar(\n"
-     "    .first(1)\n"
-     "    // c1\n"
-     "    , // c2\n"
-     "    .second(2)\n"
-     "    // c3\n"
-     "  );\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar foobar (\n"
-     "      .first (1)\n"
-     "      // c1\n"
-     "      ,  // c2\n"
-     "      .second(2)\n"
-     "      // c3\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar foobar(\n"
-     "    // c1\n"
-     "    // c1+\n"
-     "    .first(1) // c2\n"
-     "              // c2+\n"
-     "    , // c3\n"
-     "      // c3+\n"
-     "    .second(2) // c4\n"
-     "               // c4+\n"
-     "    // c5\n"
-     "    // c5+\n"
-     "  );\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar foobar (\n"
-     "      // c1\n"
-     "      // c1+\n"
-     "      .first (1)  // c2\n"
-     "                  // c2+\n"
-     "      ,  // c3\n"
-     "         // c3+\n"
-     "      .second(2)  // c4\n"
-     "                  // c4+\n"
-     "      // c5\n"
-     "      // c5+\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar foobar(\n"
-     "    .first(1) /* c1 */\n"
-     "    ,\n"
-     "    .second(2) /* c2 */\n"
-     "  );\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar foobar (\n"
-     "        .first (1)  /* c1 */\n"
-     "      , .second(2)  /* c2 */\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar foobar(\n"
-     "    /* c1 */ .first(1),\n"
-     "    /* c2 */ .second(2)\n"
-     "  );\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar foobar (\n"
-     "      /* c1 */.first (1),\n"
-     "      /* c2 */.second(2)\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar foobar(\n"
-     "    .first(1) /* c1 */\n"
-     "    , .second(2) /* c2 */\n"
-     "  );\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar foobar (\n"
-     "        .first (1)  /* c1 */\n"
-     "      , .second(2)  /* c2 */\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar foobar(\n"
-     "    /* c1 */.first(1)\n"
-     "    /* c2 */, .second(2)\n"
-     "  );\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar foobar (\n"
-     "      /* c1 */  .first (1)\n"
-     "      /* c2 */, .second(2)\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar foobar(\n"
-     "    .first(1)\n"
-     "    /* c1 */\n"
-     "    ,\n"
-     "    .second(2)\n"
-     "    /* c2 */\n"
-     "  );\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar foobar (\n"
-     "        .first (1)\n"
-     "      /* c1 */\n"
-     "      , .second(2)\n"
-     "      /* c2 */\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar foobar(\n"
-     "    .first(1)\n"
-     "    /* c1 */\n"
-     "    , .second(2)\n"
-     "    /* c2 */\n"
-     "  );\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar foobar (\n"
-     "        .first (1)\n"
-     "      /* c1 */\n"
-     "      , .second(2)\n"
-     "      /* c2 */\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar foobar(\n"
-     "    .first(1)\n"
-     "    /* c1 */\n"
-     "    , /* c2 */\n"
-     "    .second(2)\n"
-     "    /* c3 */\n"
-     "  );\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar foobar (\n"
-     "      .first (1)\n"
-     "      /* c1 */\n"
-     "      ,  /* c2 */\n"
-     "      .second(2)\n"
-     "      /* c3 */\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar foobar(\n"
-     "    .first(1)\n"
-     "    /* c1 */\n"
-     "    , /* c2 */\n"
-     "    .second(2)\n"
-     "    /* c3 */\n"
-     "  );\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar foobar (\n"
-     "      .first (1)\n"
-     "      /* c1 */\n"
-     "      ,  /* c2 */\n"
-     "      .second(2)\n"
-     "      /* c3 */\n"
-     "  );\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar foobar(\n"
-     "    /* c1  */\n"
-     "    /* c1+ */\n"
-     "    .first(1) /* c2  */\n"
-     "              /* c2+ */\n"
-     "    , /* c3  */\n"
-     "      /* c3+ */\n"
-     "    .second(2) /* c4  */\n"
-     "               /* c4+ */\n"
-     "    /* c5  */\n"
-     "    /* c5+ */\n"
-     "  );\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar foobar (\n"
-     "      /* c1  */\n"
-     "      /* c1+ */\n"
-     "      .first (1)  /* c2  */\n"
-     "      /* c2+ */\n"
-     "      ,  /* c3  */\n"
-     "      /* c3+ */\n"
-     "      .second(2)  /* c4  */\n"
-     "      /* c4+ */\n"
-     "      /* c5  */\n"
-     "      /* c5+ */\n"
-     "  );\n"
-     "endmodule\n"},
-
-    // Attachment of ',' to elements in ActualNamedParameterList (with and
-    // without comments)
-    {"module foo;\n"
-     "  bar#(\n"
-     "    .first(1) // c1\n"
-     "    ,\n"
-     "    .second(2) // c2\n"
-     "  ) baz ();\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar #(\n"
-     "        .first (1)  // c1\n"
-     "      , .second(2)  // c2\n"
-     "  ) baz ();\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar#(\n"
-     "    .first(1) // c1\n"
-     "    , .second(2) // c2\n"
-     "  ) baz ();\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar #(\n"
-     "        .first (1)  // c1\n"
-     "      , .second(2)  // c2\n"
-     "  ) baz ();\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar#(\n"
-     "    .first(1)\n"
-     "    // c1\n"
-     "    ,\n"
-     "    .second(2)\n"
-     "    // c2\n"
-     "  ) baz ();\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar #(\n"
-     "        .first (1)\n"
-     "      // c1\n"
-     "      , .second(2)\n"
-     "      // c2\n"
-     "  ) baz ();\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar#(\n"
-     "    .first(1)\n"
-     "    // c1\n"
-     "    , .second(2)\n"
-     "    // c2\n"
-     "  ) baz ();\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar #(\n"
-     "        .first (1)\n"
-     "      // c1\n"
-     "      , .second(2)\n"
-     "      // c2\n"
-     "  ) baz ();\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar#(\n"
-     "    .first(1)\n"
-     "    // c1\n"
-     "    , // c2\n"
-     "    .second(2)\n"
-     "    // c3\n"
-     "  ) baz ();\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar #(\n"
-     "      .first (1)\n"
-     "      // c1\n"
-     "      ,  // c2\n"
-     "      .second(2)\n"
-     "      // c3\n"
-     "  ) baz ();\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar#(\n"
-     "    // c1\n"
-     "    // c1+\n"
-     "    .first(1) // c2\n"
-     "              // c2+\n"
-     "    , // c3\n"
-     "      // c3+\n"
-     "    .second(2) // c4\n"
-     "               // c4+\n"
-     "    // c5\n"
-     "    // c5+\n"
-     "  ) baz ();\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar #(\n"
-     "      // c1\n"
-     "      // c1+\n"
-     "      .first (1)  // c2\n"
-     "                  // c2+\n"
-     "      ,  // c3\n"
-     "         // c3+\n"
-     "      .second(2)  // c4\n"
-     "                  // c4+\n"
-     "      // c5\n"
-     "      // c5+\n"
-     "  ) baz ();\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar#(\n"
-     "    .first(1) /* c1 */\n"
-     "    ,\n"
-     "    .second(2) /* c2 */\n"
-     "  ) baz ();\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar #(\n"
-     "        .first (1)  /* c1 */\n"
-     "      , .second(2)  /* c2 */\n"
-     "  ) baz ();\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar#(\n"
-     "    /* c1 */ .first(1),\n"
-     "    /* c2 */ .second(2)\n"
-     "  ) baz ();\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar #(\n"
-     "      /* c1 */.first (1),\n"
-     "      /* c2 */.second(2)\n"
-     "  ) baz ();\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar#(\n"
-     "    .first(1) /* c1 */\n"
-     "    , .second(2) /* c2 */\n"
-     "  ) baz ();\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar #(\n"
-     "        .first (1)  /* c1 */\n"
-     "      , .second(2)  /* c2 */\n"
-     "  ) baz ();\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar#(\n"
-     "    /* c1 */.first(1)\n"
-     "    /* c2 */, .second(2)\n"
-     "  ) baz ();\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar #(\n"
-     "      /* c1 */  .first (1)\n"
-     "      /* c2 */, .second(2)\n"
-     "  ) baz ();\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar#(\n"
-     "    .first(1)\n"
-     "    /* c1 */\n"
-     "    ,\n"
-     "    .second(2)\n"
-     "    /* c2 */\n"
-     "  ) baz ();\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar #(\n"
-     "        .first (1)\n"
-     "      /* c1 */\n"
-     "      , .second(2)\n"
-     "      /* c2 */\n"
-     "  ) baz ();\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar#(\n"
-     "    .first(1)\n"
-     "    /* c1 */\n"
-     "    , .second(2)\n"
-     "    /* c2 */\n"
-     "  ) baz ();\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar #(\n"
-     "        .first (1)\n"
-     "      /* c1 */\n"
-     "      , .second(2)\n"
-     "      /* c2 */\n"
-     "  ) baz ();\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar#(\n"
-     "    .first(1)\n"
-     "    /* c1 */\n"
-     "    , /* c2 */\n"
-     "    .second(2)\n"
-     "    /* c3 */\n"
-     "  ) baz ();\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar #(\n"
-     "      .first (1)\n"
-     "      /* c1 */\n"
-     "      ,  /* c2 */\n"
-     "      .second(2)\n"
-     "      /* c3 */\n"
-     "  ) baz ();\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar#(\n"
-     "    .first(1)\n"
-     "    /* c1 */\n"
-     "    , /* c2 */\n"
-     "    .second(2)\n"
-     "    /* c3 */\n"
-     "  ) baz ();\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar #(\n"
-     "      .first (1)\n"
-     "      /* c1 */\n"
-     "      ,  /* c2 */\n"
-     "      .second(2)\n"
-     "      /* c3 */\n"
-     "  ) baz ();\n"
-     "endmodule\n"},
-    {"module foo;\n"
-     "  bar#(\n"
-     "    /* c1  */\n"
-     "    /* c1+ */\n"
-     "    .first(1) /* c2  */\n"
-     "              /* c2+ */\n"
-     "    , /* c3  */\n"
-     "      /* c3+ */\n"
-     "    .second(2) /* c4  */\n"
-     "               /* c4+ */\n"
-     "    /* c5  */\n"
-     "    /* c5+ */\n"
-     "  ) baz ();\n"
-     "endmodule\n",
-     "module foo;\n"
-     "  bar #(\n"
-     "      /* c1  */\n"
-     "      /* c1+ */\n"
-     "      .first (1)  /* c2  */\n"
-     "      /* c2+ */\n"
-     "      ,  /* c3  */\n"
-     "      /* c3+ */\n"
-     "      .second(2)  /* c4  */\n"
-     "      /* c4+ */\n"
-     "      /* c5  */\n"
-     "      /* c5+ */\n"
-     "  ) baz ();\n"
-     "endmodule\n"},
-
-    // ":" and "'{" in a single line
-    {"assign foo[2] =\n"
-     "'{\n"
-     "bar: 1'b1,  // c\n"
-     "baz: 1'b0,  // c\n"
-     "foobar: CONSTANT,\n"
-     "qux:\n"
-     "{\n"
-     "a,  // c\n"
-     "b\n"
-     "}\n"
-     "};\n",
-     "assign foo[2] = '{\n"
-     "        bar: 1'b1,  // c\n"
-     "        baz: 1'b0,  // c\n"
-     "        foobar: CONSTANT,\n"
-     "        qux: {\n"
-     "          a,  // c\n"
-     "          b\n"
-     "        }\n"
-     "    };\n"},
-    {"assign a = (b) ? '{c: d[e], f: '1} : g;\n",
-     "assign a = (b) ?\n"
-     "    '{c: d[e], f: '1}\n"
-     "    : g;\n"},
-
-    // -----------------------------------------------------------------
-    // Comments around `else`.
-    // Check whether `else` partition is found correctly and that actual code is
-    // not appended to EOL comments.
-
-    // generate if
-
-    {"module zx;\n"
-     "if (x) assign z=y;\n"
-     "// eol-c\n"
-     "else if (r) assign z=w;\n"
-     "else assign x=y;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  if (x) assign z = y;\n"
-     "  // eol-c\n"
-     "  else if (r) assign z = w;\n"
-     "  else assign x = y;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "if (x) assign z=y;\n"
-     "// eol-c\n"
-     "// eol-c\n"
-     "else if (r) assign z=w;\n"
-     "else assign x=y;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  if (x) assign z = y;\n"
-     "  // eol-c\n"
-     "  // eol-c\n"
-     "  else if (r) assign z = w;\n"
-     "  else assign x = y;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "if (x) assign z=y;\n"
-     "else // eol-c\n"
-     "if (r) assign z=w;\n"
-     "else assign x=y;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  if (x) assign z = y;\n"
-     "  else  // eol-c\n"
-     "  if (r) assign z = w;\n"
-     "  else assign x = y;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "if (x) assign z=y;\n"
-     "else\n"
-     "// eol-c\n"
-     "if (r) assign z=w;\n"
-     "else assign x=y;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  if (x) assign z = y;\n"
-     "  else\n"
-     "  // eol-c\n"
-     "  if (r)\n"
-     "    assign z = w;\n"
-     "  else assign x = y;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "if (x) assign z=y;\n"
-     "// eol-c\n"
-     "else // eol-c\n"
-     "if (r) assign z=w;\n"
-     "else assign x=y;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  if (x) assign z = y;\n"
-     "  // eol-c\n"
-     "  else  // eol-c\n"
-     "  if (r) assign z = w;\n"
-     "  else assign x = y;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "if (x) assign z=y;\n"
-     "else // eol-c\n"
-     "// eol-c\n"
-     "if (r) assign z=w;\n"
-     "else assign x=y;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  if (x) assign z = y;\n"
-     "  else  // eol-c\n"
-     "  // eol-c\n"
-     "  if (r)\n"
-     "    assign z = w;\n"
-     "  else assign x = y;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "if (x) assign z=y;\n"
-     "// eol-c\n"
-     "else // eol-c\n"
-     "// eol-c\n"
-     "if (r) assign z=w;\n"
-     "else assign x=y;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  if (x) assign z = y;\n"
-     "  // eol-c\n"
-     "  else  // eol-c\n"
-     "  // eol-c\n"
-     "  if (r)\n"
-     "    assign z = w;\n"
-     "  else assign x = y;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "if (x) assign z=y;\n"
-     "// eol-c\n"
-     "else // eol-c\n"
-     "// eol-c\n"
-     "if\n"
-     "// eol-c\n"
-     "(r) assign z=w;\n"
-     "else assign x=y;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  if (x) assign z = y;\n"
-     "  // eol-c\n"
-     "  else  // eol-c\n"
-     "  // eol-c\n"
-     "  if\n"
-     "      // eol-c\n"
-     "      (r)\n"
-     "    assign z = w;\n"
-     "  else assign x = y;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "if (x) assign z=y;\n"
-     "// eol-c\n"
-     "// eol-c\n"
-     "else // eol-c\n"
-     "// eol-c\n"
-     "// eol-c\n"
-     "if\n"
-     "// eol-c\n"
-     "// eol-c\n"
-     "(r) assign z=w;\n"
-     "else assign x=y;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  if (x) assign z = y;\n"
-     "  // eol-c\n"
-     "  // eol-c\n"
-     "  else  // eol-c\n"
-     "  // eol-c\n"
-     "  // eol-c\n"
-     "  if\n"
-     "      // eol-c\n"
-     "      // eol-c\n"
-     "      (r)\n"
-     "    assign z = w;\n"
-     "  else assign x = y;\n"
-     "endmodule\n"},
-
-    // generate if with function call
-
-    {"module zx;\n"
-     "if (x) assign z=y;\n"
-     "// eol-c\n"
-     "else if (foo(x) == bar(1, 2)) assign z=w;\n"
-     "else assign x=y;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  if (x) assign z = y;\n"
-     "  // eol-c\n"
-     "  else if (foo(x) == bar(1, 2))\n"
-     "    assign z = w;\n"
-     "  else assign x = y;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "if (x) assign z=y;\n"
-     "// eol-c\n"
-     "// eol-c\n"
-     "else if (foo(x) == bar(1, 2)) assign z=w;\n"
-     "else assign x=y;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  if (x) assign z = y;\n"
-     "  // eol-c\n"
-     "  // eol-c\n"
-     "  else if (foo(x) == bar(1, 2))\n"
-     "    assign z = w;\n"
-     "  else assign x = y;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "if (x) assign z=y;\n"
-     "else // eol-c\n"
-     "if (foo(x) == bar(1, 2)) assign z=w;\n"
-     "else assign x=y;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  if (x) assign z = y;\n"
-     "  else  // eol-c\n"
-     "  if (foo(x) == bar(1, 2)) assign z = w;\n"
-     "  else assign x = y;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "if (x) assign z=y;\n"
-     "else\n"
-     "// eol-c\n"
-     "if (foo(x) == bar(1, 2)) assign z=w;\n"
-     "else assign x=y;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  if (x) assign z = y;\n"
-     "  else\n"
-     "  // eol-c\n"
-     "  if (foo(\n"
-     "          x\n"
-     "      ) == bar(\n"
-     "          1, 2\n"
-     "      ))\n"
-     "    assign z = w;\n"
-     "  else assign x = y;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "if (x) assign z=y;\n"
-     "// eol-c\n"
-     "else // eol-c\n"
-     "if (foo(x) == bar(1, 2)) assign z=w;\n"
-     "else assign x=y;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  if (x) assign z = y;\n"
-     "  // eol-c\n"
-     "  else  // eol-c\n"
-     "  if (foo(x) == bar(1, 2)) assign z = w;\n"
-     "  else assign x = y;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "if (x) assign z=y;\n"
-     "else // eol-c\n"
-     "// eol-c\n"
-     "if (foo(x) == bar(1, 2)) assign z=w;\n"
-     "else assign x=y;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  if (x) assign z = y;\n"
-     "  else  // eol-c\n"
-     "  // eol-c\n"
-     "  if (foo(\n"
-     "          x\n"
-     "      ) == bar(\n"
-     "          1, 2\n"
-     "      ))\n"
-     "    assign z = w;\n"
-     "  else assign x = y;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "if (x) assign z=y;\n"
-     "// eol-c\n"
-     "else // eol-c\n"
-     "// eol-c\n"
-     "if (foo(x) == bar(1, 2)) assign z=w;\n"
-     "else assign x=y;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  if (x) assign z = y;\n"
-     "  // eol-c\n"
-     "  else  // eol-c\n"
-     "  // eol-c\n"
-     "  if (foo(\n"
-     "          x\n"
-     "      ) == bar(\n"
-     "          1, 2\n"
-     "      ))\n"
-     "    assign z = w;\n"
-     "  else assign x = y;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "if (x) assign z=y;\n"
-     "// eol-c\n"
-     "else // eol-c\n"
-     "// eol-c\n"
-     "if\n"
-     "// eol-c\n"
-     "(foo(x) == bar(1, 2)) assign z=w;\n"
-     "else assign x=y;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  if (x) assign z = y;\n"
-     "  // eol-c\n"
-     "  else  // eol-c\n"
-     "  // eol-c\n"
-     "  if\n"
-     "      // eol-c\n"
-     "      (foo(\n"
-     "          x\n"
-     "      ) == bar(\n"
-     "          1, 2\n"
-     "      ))\n"
-     "    assign z = w;\n"
-     "  else assign x = y;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "if (x) assign z=y;\n"
-     "// eol-c\n"
-     "// eol-c\n"
-     "else // eol-c\n"
-     "// eol-c\n"
-     "// eol-c\n"
-     "if\n"
-     "// eol-c\n"
-     "// eol-c\n"
-     "(foo(x) == bar(1, 2)) assign z=w;\n"
-     "else assign x=y;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  if (x) assign z = y;\n"
-     "  // eol-c\n"
-     "  // eol-c\n"
-     "  else  // eol-c\n"
-     "  // eol-c\n"
-     "  // eol-c\n"
-     "  if\n"
-     "      // eol-c\n"
-     "      // eol-c\n"
-     "      (foo(\n"
-     "          x\n"
-     "      ) == bar(\n"
-     "          1, 2\n"
-     "      ))\n"
-     "    assign z = w;\n"
-     "  else assign x = y;\n"
-     "endmodule\n"},
-
-    // else begin
-
-    {"module zx;\n"
-     "always begin\n"
-     "if (a) b<=1;\n"
-     "// eol-c\n"
-     "else begin b<=2;\n"
-     "end\n"
-     "end\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always begin\n"
-     "    if (a) b <= 1;\n"
-     "    // eol-c\n"
-     "    else begin\n"
-     "      b <= 2;\n"
-     "    end\n"
-     "  end\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "always begin\n"
-     "if (a) b<=1;\n"
-     "// eol-c\n"
-     "// eol-c\n"
-     "else begin b<=2;\n"
-     "end\n"
-     "end\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always begin\n"
-     "    if (a) b <= 1;\n"
-     "    // eol-c\n"
-     "    // eol-c\n"
-     "    else begin\n"
-     "      b <= 2;\n"
-     "    end\n"
-     "  end\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "always begin\n"
-     "if (a) b<=1;\n"
-     "else // eol-c\n"
-     "begin b<=2;\n"
-     "end\n"
-     "end\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always begin\n"
-     "    if (a) b <= 1;\n"
-     "    else  // eol-c\n"
-     "    begin\n"
-     "      b <= 2;\n"
-     "    end\n"
-     "  end\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "always begin\n"
-     "if (a) b<=1;\n"
-     "else\n"
-     "// eol-c\n"
-     "begin b<=2;\n"
-     "end\n"
-     "end\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always begin\n"
-     "    if (a) b <= 1;\n"
-     "    else\n"
-     "    // eol-c\n"
-     "    begin\n"
-     "      b <= 2;\n"
-     "    end\n"
-     "  end\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "always begin\n"
-     "if (a) b<=1;\n"
-     "// eol-c\n"
-     "else // eol-c\n"
-     "begin b<=2;\n"
-     "end\n"
-     "end\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always begin\n"
-     "    if (a) b <= 1;\n"
-     "    // eol-c\n"
-     "    else  // eol-c\n"
-     "    begin\n"
-     "      b <= 2;\n"
-     "    end\n"
-     "  end\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "always begin\n"
-     "if (a) b<=1;\n"
-     "else // eol-c\n"
-     "// eol-c\n"
-     "begin b<=2;\n"
-     "end\n"
-     "end\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always begin\n"
-     "    if (a) b <= 1;\n"
-     "    else  // eol-c\n"
-     "    // eol-c\n"
-     "    begin\n"
-     "      b <= 2;\n"
-     "    end\n"
-     "  end\n"
-     "endmodule\n"},
-
-    // else if
-
-    {"module zx;\n"
-     "always @(clr or set)\n"
-     "if (clr) assign q=0;\n"
-     "// eol-c\n"
-     "else if (set) assign q=1;\n"
-     "else deassign q;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always @(clr or set)\n"
-     "    if (clr) assign q = 0;\n"
-     "    // eol-c\n"
-     "    else if (set) assign q = 1;\n"
-     "    else deassign q;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "always @(clr or set)\n"
-     "if (clr) assign q=0;\n"
-     "// eol-c\n"
-     "// eol-c\n"
-     "else if (set) assign q=1;\n"
-     "else deassign q;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always @(clr or set)\n"
-     "    if (clr) assign q = 0;\n"
-     "    // eol-c\n"
-     "    // eol-c\n"
-     "    else if (set) assign q = 1;\n"
-     "    else deassign q;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "always @(clr or set)\n"
-     "if (clr) assign q=0;\n"
-     "else // eol-c\n"
-     "if (set) assign q=1;\n"
-     "else deassign q;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always @(clr or set)\n"
-     "    if (clr) assign q = 0;\n"
-     "    else  // eol-c\n"
-     "    if (set) assign q = 1;\n"
-     "    else deassign q;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "always @(clr or set)\n"
-     "if (clr) assign q=0;\n"
-     "else\n"
-     "// eol-c\n"
-     "if (set) assign q=1;\n"
-     "else deassign q;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always @(clr or set)\n"
-     "    if (clr) assign q = 0;\n"
-     "    else\n"
-     "    // eol-c\n"
-     "    if (set)\n"
-     "      assign q = 1;\n"
-     "    else deassign q;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "always @(clr or set)\n"
-     "if (clr) assign q=0;\n"
-     "// eol-c\n"
-     "else // eol-c\n"
-     "if (set) assign q=1;\n"
-     "else deassign q;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always @(clr or set)\n"
-     "    if (clr) assign q = 0;\n"
-     "    // eol-c\n"
-     "    else  // eol-c\n"
-     "    if (set) assign q = 1;\n"
-     "    else deassign q;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "always @(clr or set)\n"
-     "if (clr) assign q=0;\n"
-     "else // eol-c\n"
-     "// eol-c\n"
-     "if (set) assign q=1;\n"
-     "else deassign q;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always @(clr or set)\n"
-     "    if (clr) assign q = 0;\n"
-     "    else  // eol-c\n"
-     "    // eol-c\n"
-     "    if (set)\n"
-     "      assign q = 1;\n"
-     "    else deassign q;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "always @(clr or set)\n"
-     "if (clr) assign q=0;\n"
-     "// eol-c\n"
-     "else // eol-c\n"
-     "// eol-c\n"
-     "if (set) assign q=1;\n"
-     "else deassign q;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always @(clr or set)\n"
-     "    if (clr) assign q = 0;\n"
-     "    // eol-c\n"
-     "    else  // eol-c\n"
-     "    // eol-c\n"
-     "    if (set)\n"
-     "      assign q = 1;\n"
-     "    else deassign q;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "always @(clr or set)\n"
-     "if (clr) assign q=0;\n"
-     "// eol-c\n"
-     "else // eol-c\n"
-     "// eol-c\n"
-     "if\n"
-     "// eol-c\n"
-     "(set) assign q=1;\n"
-     "else deassign q;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always @(clr or set)\n"
-     "    if (clr) assign q = 0;\n"
-     "    // eol-c\n"
-     "    else  // eol-c\n"
-     "    // eol-c\n"
-     "    if\n"
-     "        // eol-c\n"
-     "        (set)\n"
-     "      assign q = 1;\n"
-     "    else deassign q;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "always @(clr or set)\n"
-     "if (clr) assign q=0;\n"
-     "// eol-c\n"
-     "// eol-c\n"
-     "else // eol-c\n"
-     "// eol-c\n"
-     "// eol-c\n"
-     "if\n"
-     "// eol-c\n"
-     "// eol-c\n"
-     "(set) assign q=1;\n"
-     "else deassign q;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always @(clr or set)\n"
-     "    if (clr) assign q = 0;\n"
-     "    // eol-c\n"
-     "    // eol-c\n"
-     "    else  // eol-c\n"
-     "    // eol-c\n"
-     "    // eol-c\n"
-     "    if\n"
-     "        // eol-c\n"
-     "        // eol-c\n"
-     "        (set)\n"
-     "      assign q = 1;\n"
-     "    else deassign q;\n"
-     "endmodule\n"},
-
-    // else if with function call
-
-    {"module zx;\n"
-     "always @(clr or set)\n"
-     "if (clr) assign q=0;\n"
-     "// eol-c\n"
-     "else if (foo(clr, set, 1)) assign q=1;\n"
-     "else deassign q;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always @(clr or set)\n"
-     "    if (clr) assign q = 0;\n"
-     "    // eol-c\n"
-     "    else if (foo(clr, set, 1))\n"
-     "      assign q = 1;\n"
-     "    else deassign q;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "always @(clr or set)\n"
-     "if (clr) assign q=0;\n"
-     "// eol-c\n"
-     "// eol-c\n"
-     "else if (foo(clr, set, 1)) assign q=1;\n"
-     "else deassign q;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always @(clr or set)\n"
-     "    if (clr) assign q = 0;\n"
-     "    // eol-c\n"
-     "    // eol-c\n"
-     "    else if (foo(clr, set, 1))\n"
-     "      assign q = 1;\n"
-     "    else deassign q;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "always @(clr or set)\n"
-     "if (clr) assign q=0;\n"
-     "else // eol-c\n"
-     "if (foo(clr, set, 1)) assign q=1;\n"
-     "else deassign q;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always @(clr or set)\n"
-     "    if (clr) assign q = 0;\n"
-     "    else  // eol-c\n"
-     "    if (foo(clr, set, 1)) assign q = 1;\n"
-     "    else deassign q;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "always @(clr or set)\n"
-     "if (clr) assign q=0;\n"
-     "else\n"
-     "// eol-c\n"
-     "if (foo(clr, set, 1)) assign q=1;\n"
-     "else deassign q;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always @(clr or set)\n"
-     "    if (clr) assign q = 0;\n"
-     "    else\n"
-     "    // eol-c\n"
-     "    if (foo(\n"
-     "            clr, set, 1\n"
-     "        ))\n"
-     "      assign q = 1;\n"
-     "    else deassign q;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "always @(clr or set)\n"
-     "if (clr) assign q=0;\n"
-     "// eol-c\n"
-     "else // eol-c\n"
-     "if (foo(clr, set, 1)) assign q=1;\n"
-     "else deassign q;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always @(clr or set)\n"
-     "    if (clr) assign q = 0;\n"
-     "    // eol-c\n"
-     "    else  // eol-c\n"
-     "    if (foo(clr, set, 1)) assign q = 1;\n"
-     "    else deassign q;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "always @(clr or set)\n"
-     "if (clr) assign q=0;\n"
-     "else // eol-c\n"
-     "// eol-c\n"
-     "if (foo(clr, set, 1)) assign q=1;\n"
-     "else deassign q;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always @(clr or set)\n"
-     "    if (clr) assign q = 0;\n"
-     "    else  // eol-c\n"
-     "    // eol-c\n"
-     "    if (foo(\n"
-     "            clr, set, 1\n"
-     "        ))\n"
-     "      assign q = 1;\n"
-     "    else deassign q;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "always @(clr or set)\n"
-     "if (clr) assign q=0;\n"
-     "// eol-c\n"
-     "else // eol-c\n"
-     "// eol-c\n"
-     "if (foo(clr, set, 1)) assign q=1;\n"
-     "else deassign q;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always @(clr or set)\n"
-     "    if (clr) assign q = 0;\n"
-     "    // eol-c\n"
-     "    else  // eol-c\n"
-     "    // eol-c\n"
-     "    if (foo(\n"
-     "            clr, set, 1\n"
-     "        ))\n"
-     "      assign q = 1;\n"
-     "    else deassign q;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "always @(clr or set)\n"
-     "if (clr) assign q=0;\n"
-     "// eol-c\n"
-     "else // eol-c\n"
-     "// eol-c\n"
-     "if\n"
-     "// eol-c\n"
-     "(foo(clr, set, 1)) assign q=1;\n"
-     "else deassign q;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always @(clr or set)\n"
-     "    if (clr) assign q = 0;\n"
-     "    // eol-c\n"
-     "    else  // eol-c\n"
-     "    // eol-c\n"
-     "    if\n"
-     "        // eol-c\n"
-     "        (foo(\n"
-     "            clr, set, 1\n"
-     "        ))\n"
-     "      assign q = 1;\n"
-     "    else deassign q;\n"
-     "endmodule\n"},
-    {"module zx;\n"
-     "always @(clr or set)\n"
-     "if (clr) assign q=0;\n"
-     "// eol-c\n"
-     "// eol-c\n"
-     "else // eol-c\n"
-     "// eol-c\n"
-     "// eol-c\n"
-     "if\n"
-     "// eol-c\n"
-     "// eol-c\n"
-     "(foo(clr, set, 1)) assign q=1;\n"
-     "else deassign q;\n"
-     "endmodule\n",
-     "module zx;\n"
-     "  always @(clr or set)\n"
-     "    if (clr) assign q = 0;\n"
-     "    // eol-c\n"
-     "    // eol-c\n"
-     "    else  // eol-c\n"
-     "    // eol-c\n"
-     "    // eol-c\n"
-     "    if\n"
-     "        // eol-c\n"
-     "        // eol-c\n"
-     "        (foo(\n"
-     "            clr, set, 1\n"
-     "        ))\n"
-     "      assign q = 1;\n"
-     "    else deassign q;\n"
-     "endmodule\n"},
-
-    // -----------------------------------------------------------------
-    // Comments around and inside macro calls.
-
-    // between identifier and '(', no args
-
-    {"// verilog_syntax: parse-as-module-body",
-     "// verilog_syntax: parse-as-module-body\n"},
-    {"// verilog_syntax: parse-as-statements",
-     "// verilog_syntax: parse-as-statements\n"},
-    {"// verilog_syntax: parse-as-class-body",
-     "// verilog_syntax: parse-as-class-body\n"},
-    {"// verilog_syntax: parse-as-package-body",
-     "// verilog_syntax: parse-as-package-body\n"},
-    {"// verilog_syntax: parse-as-library-map",
-     "// verilog_syntax: parse-as-library-map\n"},
-    {"// verilog_syntax: does-not-exist-mode",
-     "// verilog_syntax: does-not-exist-mode\n"},
-    {"// verilog_syntax: parse-as-module-body\n",
-     "// verilog_syntax: parse-as-module-body\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "// comment",
-     "// verilog_syntax: parse-as-module-body\n"
-     "// comment\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz /* c */ ();\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c */ ();\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz /* c1 */ /* c2 */ ();\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */  /* c2 */ ();\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz /* c */\n"
-     "();\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c */\n"
-     "    ();\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz /* c1 */ /* c2 */\n"
-     "();\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */  /* c2 */\n"
-     "    ();\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz // c\n"
-     "();\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  // c\n"
-     "    ();\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz /* c1 */ // c2\n"
-     "();\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */  // c2\n"
-     "    ();\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c */ ();\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c */ ();\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c1 */ /* c2 */ ();\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c1 */  /* c2 */ ();\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c */\n"
-     "();\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c */\n"
-     "    ();\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c1 */ /* c2 */\n"
-     "();\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c1 */  /* c2 */\n"
-     "    ();\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "// c\n"
-     "();\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    // c\n"
-     "    ();\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c1 */ // c2\n"
-     "();\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c1 */  // c2\n"
-     "    ();\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     "();\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c1 */\n"
-     "    /* c2 */\n"
-     "    ();\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "// c1\n"
-     "// c2\n"
-     "();\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    // c1\n"
-     "    // c2\n"
-     "    ();\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz /* c1 */\n"
-     "/* c2 */ ();\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */\n"
-     "    /* c2 */ ();\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz // c1\n"
-     "/* c2 */ ();\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  // c1\n"
-     "    /* c2 */ ();\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */ ();\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */\n"
-     "    /* c2 */\n"
-     "    /* c3 */ ();\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz /* c1 */\n"
-     "/* c2 */\n"
-     "();\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */\n"
-     "    /* c2 */\n"
-     "    ();\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz // c1\n"
-     "/* c2 */\n"
-     "();\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  // c1\n"
-     "    /* c2 */\n"
-     "    ();\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz /* c1 */\n"
-     "// c2\n"
-     "();\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */\n"
-     "    // c2\n"
-     "    ();\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz // c1\n"
-     "// c2\n"
-     "();\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  // c1\n"
-     "    // c2\n"
-     "    ();\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     "();\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */\n"
-     "    /* c2 */\n"
-     "    /* c3 */\n"
-     "    ();\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz // c1\n"
-     "// c2\n"
-     "// c3\n"
-     "();\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  // c1\n"
-     "    // c2\n"
-     "    // c3\n"
-     "    ();\n"},
-
-    // between identifier and '(', with arg
-
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz /* c */ (arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c */ (arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz /* c1 */ /* c2 */ (arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */  /* c2 */ (arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz /* c */\n"
-     "(arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c */\n"
-     "    (arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz /* c1 */ /* c2 */\n"
-     "(arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */  /* c2 */\n"
-     "    (arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz // c\n"
-     "(arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  // c\n"
-     "    (arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz /* c1 */ // c2\n"
-     "(arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */  // c2\n"
-     "    (arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c */ (arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c */ (arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c1 */ /* c2 */ (arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c1 */  /* c2 */ (arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c */\n"
-     "(arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c */\n"
-     "    (arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c1 */ /* c2 */\n"
-     "(arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c1 */  /* c2 */\n"
-     "    (arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "// c\n"
-     "(arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    // c\n"
-     "    (arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c1 */ // c2\n"
-     "(arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c1 */  // c2\n"
-     "    (arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     "(arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c1 */\n"
-     "    /* c2 */\n"
-     "    (arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "// c1\n"
-     "// c2\n"
-     "(arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    // c1\n"
-     "    // c2\n"
-     "    (arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz /* c1 */\n"
-     "/* c2 */ (arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */\n"
-     "    /* c2 */ (arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz // c1\n"
-     "/* c2 */ (arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  // c1\n"
-     "    /* c2 */ (arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */ (arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */\n"
-     "    /* c2 */\n"
-     "    /* c3 */ (arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz /* c1 */\n"
-     "/* c2 */\n"
-     "(arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */\n"
-     "    /* c2 */\n"
-     "    (arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz // c1\n"
-     "/* c2 */\n"
-     "(arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  // c1\n"
-     "    /* c2 */\n"
-     "    (arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz /* c1 */\n"
-     "// c2\n"
-     "(arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */\n"
-     "    // c2\n"
-     "    (arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz // c1\n"
-     "// c2\n"
-     "(arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  // c1\n"
-     "    // c2\n"
-     "    (arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     "(arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */\n"
-     "    /* c2 */\n"
-     "    /* c3 */\n"
-     "    (arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz // c1\n"
-     "// c2\n"
-     "// c3\n"
-     "(arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  // c1\n"
-     "    // c2\n"
-     "    // c3\n"
-     "    (arg);\n"},
-
-    // after '(', no args
-
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(/* c */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  /* c */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(/* c1 */ /* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  /* c1 */  /* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(/* c */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  /* c */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(/* c1 */ /* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  /* c1 */  /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(// c\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  // c\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(/* c1 */ // c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  /* c1 */  // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "/* c */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "/* c */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "/* c1 */ /* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "/* c1 */  /* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "/* c */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "    /* c */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "/* c1 */ /* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "    /* c1 */  /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "// c\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "    // c\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "/* c1 */ // c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "    /* c1 */  // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "    /* c1 */\n"
-     "    /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "// c1\n"
-     "// c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "    // c1\n"
-     "    // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(/* c1 */\n"
-     "/* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  /* c1 */\n"
-     "/* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(// c1\n"
-     "/* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  // c1\n"
-     "/* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  /* c1 */\n"
-     "    /* c2 */\n"
-     "/* c3 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(/* c1 */\n"
-     "/* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  /* c1 */\n"
-     "    /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(// c1\n"
-     "/* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  // c1\n"
-     "    /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(/* c1 */\n"
-     "// c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  /* c1 */\n"
-     "    // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(// c1\n"
-     "// c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  // c1\n"
-     "    // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  /* c1 */\n"
-     "    /* c2 */\n"
-     "    /* c3 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(// c1\n"
-     "// c2\n"
-     "// c3\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  // c1\n"
-     "    // c2\n"
-     "    // c3\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */ /* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */  /* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */ /* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */  /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(// c\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  // c\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */ // c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */  // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c1 */ /* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c1 */  /* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    /* c */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c1 */ /* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    /* c1 */  /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "// c\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    // c\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c1 */ // c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    /* c1 */  // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    /* c1 */\n"
-     "    /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "// c1\n"
-     "// c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    // c1\n"
-     "    // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */\n"
-     "/* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */\n"
-     "/* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(// c1\n"
-     "/* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  // c1\n"
-     "/* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */\n"
-     "    /* c2 */\n"
-     "/* c3 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */\n"
-     "/* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */\n"
-     "    /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(// c1\n"
-     "/* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  // c1\n"
-     "    /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */\n"
-     "// c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */\n"
-     "    // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(// c1\n"
-     "// c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  // c1\n"
-     "    // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */\n"
-     "    /* c2 */\n"
-     "    /* c3 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(// c1\n"
-     "// c2\n"
-     "// c3\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  // c1\n"
-     "    // c2\n"
-     "    // c3\n"
-     ");\n"},
-
-    // after '(', with arg
-
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(/* c */arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  /* c */ arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(/* c1 */ /* c2 */arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  /* c1 */  /* c2 */ arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(/* c */\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  /* c */\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(/* c1 */ /* c2 */\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  /* c1 */  /* c2 */\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(// c\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  // c\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(/* c1 */ // c2\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  /* c1 */  // c2\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "/* c */arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "    /* c */ arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "/* c1 */ /* c2 */arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "    /* c1 */  /* c2 */ arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "/* c */\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "    /* c */\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "/* c1 */ /* c2 */\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "    /* c1 */  /* c2 */\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "// c\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "    // c\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "/* c1 */ // c2\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "    /* c1 */  // c2\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "    /* c1 */\n"
-     "    /* c2 */\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "// c1\n"
-     "// c2\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(\n"
-     "    // c1\n"
-     "    // c2\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(/* c1 */\n"
-     "/* c2 */arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  /* c1 */\n"
-     "    /* c2 */ arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(// c1\n"
-     "/* c2 */arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  // c1\n"
-     "    /* c2 */ arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  /* c1 */\n"
-     "    /* c2 */\n"
-     "    /* c3 */ arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(/* c1 */\n"
-     "/* c2 */\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  /* c1 */\n"
-     "    /* c2 */\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(// c1\n"
-     "/* c2 */\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  // c1\n"
-     "    /* c2 */\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(/* c1 */\n"
-     "// c2\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  /* c1 */\n"
-     "    // c2\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(// c1\n"
-     "// c2\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  // c1\n"
-     "    // c2\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  /* c1 */\n"
-     "    /* c2 */\n"
-     "    /* c3 */\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(// c1\n"
-     "// c2\n"
-     "// c3\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(  // c1\n"
-     "    // c2\n"
-     "    // c3\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c */arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c */ arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */ /* c2 */arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */  /* c2 */ arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c */\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c */\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */ /* c2 */\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */  /* c2 */\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(// c\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  // c\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */ // c2\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */  // c2\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c */arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    /* c */ arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c1 */ /* c2 */arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    /* c1 */  /* c2 */ arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c */\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    /* c */\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c1 */ /* c2 */\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    /* c1 */  /* c2 */\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "// c\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    // c\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c1 */ // c2\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    /* c1 */  // c2\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    /* c1 */\n"
-     "    /* c2 */\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "// c1\n"
-     "// c2\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    // c1\n"
-     "    // c2\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */\n"
-     "/* c2 */arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */\n"
-     "    /* c2 */ arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(// c1\n"
-     "/* c2 */arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  // c1\n"
-     "    /* c2 */ arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */\n"
-     "    /* c2 */\n"
-     "    /* c3 */ arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */\n"
-     "/* c2 */\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */\n"
-     "    /* c2 */\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(// c1\n"
-     "/* c2 */\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  // c1\n"
-     "    /* c2 */\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */\n"
-     "// c2\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */\n"
-     "    // c2\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(// c1\n"
-     "// c2\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  // c1\n"
-     "    // c2\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */\n"
-     "    /* c2 */\n"
-     "    /* c3 */\n"
-     "    arg);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(// c1\n"
-     "// c2\n"
-     "// c3\n"
-     "arg);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  // c1\n"
-     "    // c2\n"
-     "    // c3\n"
-     "    arg);\n"},
-
-    // after single arg
-
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg/* c */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg  /* c */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg/* c1 */ /* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg  /* c1 */  /* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg/* c */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg  /* c */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg/* c1 */ /* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg  /* c1 */  /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg// c\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg  // c\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg/* c1 */ // c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg  /* c1 */  // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg\n"
-     "/* c */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg\n"
-     "/* c */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg\n"
-     "/* c1 */ /* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg\n"
-     "/* c1 */  /* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg\n"
-     "/* c */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg\n"
-     "           /* c */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg\n"
-     "/* c1 */ /* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg\n"
-     "           /* c1 */  /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg\n"
-     "// c\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg\n"
-     "           // c\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg\n"
-     "/* c1 */ // c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg\n"
-     "           /* c1 */  // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg\n"
-     "           /* c1 */\n"
-     "           /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg\n"
-     "// c1\n"
-     "// c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg\n"
-     "           // c1\n"
-     "           // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg/* c1 */\n"
-     "/* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg  /* c1 */\n"
-     "/* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg// c1\n"
-     "/* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg  // c1\n"
-     "/* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg  /* c1 */\n"
-     "           /* c2 */\n"
-     "/* c3 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg/* c1 */\n"
-     "/* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg  /* c1 */\n"
-     "           /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg// c1\n"
-     "/* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg  // c1\n"
-     "           /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg/* c1 */\n"
-     "// c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg  /* c1 */\n"
-     "           // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg// c1\n"
-     "// c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg  // c1\n"
-     "           // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg  /* c1 */\n"
-     "           /* c2 */\n"
-     "           /* c3 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg// c1\n"
-     "// c2\n"
-     "// c3\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg  // c1\n"
-     "           // c2\n"
-     "           // c3\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg/* c */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg  /* c */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg/* c1 */ /* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg  /* c1 */  /* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg/* c */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg  /* c */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg/* c1 */ /* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg  /* c1 */  /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg// c\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg  // c\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg/* c1 */ // c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg  /* c1 */  // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg\n"
-     "/* c */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg\n"
-     "/* c */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg\n"
-     "/* c1 */ /* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg\n"
-     "/* c1 */  /* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg\n"
-     "/* c */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg\n"
-     "           /* c */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg\n"
-     "/* c1 */ /* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg\n"
-     "           /* c1 */  /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg\n"
-     "// c\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg\n"
-     "           // c\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg\n"
-     "/* c1 */ // c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg\n"
-     "           /* c1 */  // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg\n"
-     "           /* c1 */\n"
-     "           /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg\n"
-     "// c1\n"
-     "// c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg\n"
-     "           // c1\n"
-     "           // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg/* c1 */\n"
-     "/* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg  /* c1 */\n"
-     "/* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg// c1\n"
-     "/* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg  // c1\n"
-     "/* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg  /* c1 */\n"
-     "           /* c2 */\n"
-     "/* c3 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg/* c1 */\n"
-     "/* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg  /* c1 */\n"
-     "           /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg// c1\n"
-     "/* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg  // c1\n"
-     "           /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg/* c1 */\n"
-     "// c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg  /* c1 */\n"
-     "           // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg// c1\n"
-     "// c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg  // c1\n"
-     "           // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg  /* c1 */\n"
-     "           /* c2 */\n"
-     "           /* c3 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg// c1\n"
-     "// c2\n"
-     "// c3\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg  // c1\n"
-     "           // c2\n"
-     "           // c3\n"
-     ");\n"},
-
-    // before colon
-
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1/* c */, arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1  /* c */, arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1/* c1 */ /* c2 */, arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1  /* c1 */  /* c2 */,\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1/* c */\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1  /* c */\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1/* c1 */ /* c2 */\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1  /* c1 */  /* c2 */\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1// c\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1  // c\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1/* c1 */ // c2\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1  /* c1 */  // c2\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1\n"
-     "/* c */, arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1\n"
-     "           /* c */, arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1\n"
-     "/* c1 */ /* c2 */, arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1\n"
-     "           /* c1 */  /* c2 */, arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1\n"
-     "/* c */\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1\n"
-     "           /* c */\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1\n"
-     "/* c1 */ /* c2 */\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1\n"
-     "           /* c1 */  /* c2 */\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1\n"
-     "// c\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1\n"
-     "           // c\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1\n"
-     "/* c1 */ // c2\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1\n"
-     "           /* c1 */  // c2\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1\n"
-     "           /* c1 */\n"
-     "           /* c2 */\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1\n"
-     "// c1\n"
-     "// c2\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1\n"
-     "           // c1\n"
-     "           // c2\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1/* c1 */\n"
-     "/* c2 */, arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1  /* c1 */\n"
-     "           /* c2 */, arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1// c1\n"
-     "/* c2 */, arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1  // c1\n"
-     "           /* c2 */, arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */, arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1  /* c1 */\n"
-     "           /* c2 */\n"
-     "           /* c3 */, arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1/* c1 */\n"
-     "/* c2 */\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1  /* c1 */\n"
-     "           /* c2 */\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1// c1\n"
-     "/* c2 */\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1  // c1\n"
-     "           /* c2 */\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1/* c1 */\n"
-     "// c2\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1  /* c1 */\n"
-     "           // c2\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1// c1\n"
-     "// c2\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1  // c1\n"
-     "           // c2\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1  /* c1 */\n"
-     "           /* c2 */\n"
-     "           /* c3 */\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1// c1\n"
-     "// c2\n"
-     "// c3\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1  // c1\n"
-     "           // c2\n"
-     "           // c3\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1/* c */, arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1  /* c */, arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1/* c1 */ /* c2 */, arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1  /* c1 */  /* c2 */,\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1/* c */\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1  /* c */\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1/* c1 */ /* c2 */\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1  /* c1 */  /* c2 */\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1// c\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1  // c\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1/* c1 */ // c2\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1  /* c1 */  // c2\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1\n"
-     "/* c */, arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1\n"
-     "           /* c */, arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1\n"
-     "/* c1 */ /* c2 */, arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1\n"
-     "           /* c1 */  /* c2 */, arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1\n"
-     "/* c */\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1\n"
-     "           /* c */\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1\n"
-     "/* c1 */ /* c2 */\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1\n"
-     "           /* c1 */  /* c2 */\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1\n"
-     "// c\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1\n"
-     "           // c\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1\n"
-     "/* c1 */ // c2\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1\n"
-     "           /* c1 */  // c2\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1\n"
-     "           /* c1 */\n"
-     "           /* c2 */\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1\n"
-     "// c1\n"
-     "// c2\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1\n"
-     "           // c1\n"
-     "           // c2\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1/* c1 */\n"
-     "/* c2 */, arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1  /* c1 */\n"
-     "           /* c2 */, arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1// c1\n"
-     "/* c2 */, arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1  // c1\n"
-     "           /* c2 */, arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */, arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1  /* c1 */\n"
-     "           /* c2 */\n"
-     "           /* c3 */, arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1/* c1 */\n"
-     "/* c2 */\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1  /* c1 */\n"
-     "           /* c2 */\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1// c1\n"
-     "/* c2 */\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1  // c1\n"
-     "           /* c2 */\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1/* c1 */\n"
-     "// c2\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1  /* c1 */\n"
-     "           // c2\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1// c1\n"
-     "// c2\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1  // c1\n"
-     "           // c2\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1  /* c1 */\n"
-     "           /* c2 */\n"
-     "           /* c3 */\n"
-     "           , arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1// c1\n"
-     "// c2\n"
-     "// c3\n"
-     ", arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1  // c1\n"
-     "           // c2\n"
-     "           // c3\n"
-     "           , arg2);\n"},
-
-    // after colon
-
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,/* c */arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,  /* c */ arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,/* c1 */ /* c2 */arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,  /* c1 */  /* c2 */\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,/* c */\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,  /* c */\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,/* c1 */ /* c2 */\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,  /* c1 */  /* c2 */\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,// c\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,  // c\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,/* c1 */ // c2\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,  /* c1 */  // c2\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,\n"
-     "/* c */arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,\n"
-     "           /* c */ arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,\n"
-     "/* c1 */ /* c2 */arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,\n"
-     "           /* c1 */  /* c2 */ arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,\n"
-     "/* c */\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,\n"
-     "           /* c */\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,\n"
-     "/* c1 */ /* c2 */\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,\n"
-     "           /* c1 */  /* c2 */\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,\n"
-     "// c\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,\n"
-     "           // c\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,\n"
-     "/* c1 */ // c2\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,\n"
-     "           /* c1 */  // c2\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,\n"
-     "           /* c1 */\n"
-     "           /* c2 */\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,\n"
-     "// c1\n"
-     "// c2\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,\n"
-     "           // c1\n"
-     "           // c2\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,/* c1 */\n"
-     "/* c2 */arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,  /* c1 */\n"
-     "           /* c2 */ arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,// c1\n"
-     "/* c2 */arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,  // c1\n"
-     "           /* c2 */ arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,  /* c1 */\n"
-     "           /* c2 */\n"
-     "           /* c3 */ arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,/* c1 */\n"
-     "/* c2 */\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,  /* c1 */\n"
-     "           /* c2 */\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,// c1\n"
-     "/* c2 */\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,  // c1\n"
-     "           /* c2 */\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,/* c1 */\n"
-     "// c2\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,  /* c1 */\n"
-     "           // c2\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,// c1\n"
-     "// c2\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,  // c1\n"
-     "           // c2\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,  /* c1 */\n"
-     "           /* c2 */\n"
-     "           /* c3 */\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,// c1\n"
-     "// c2\n"
-     "// c3\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,  // c1\n"
-     "           // c2\n"
-     "           // c3\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,/* c */arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,  /* c */ arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,/* c1 */ /* c2 */arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,  /* c1 */  /* c2 */\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,/* c */\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,  /* c */\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,/* c1 */ /* c2 */\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,  /* c1 */  /* c2 */\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,// c\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,  // c\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,/* c1 */ // c2\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,  /* c1 */  // c2\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,\n"
-     "/* c */arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,\n"
-     "           /* c */ arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,\n"
-     "/* c1 */ /* c2 */arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,\n"
-     "           /* c1 */  /* c2 */ arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,\n"
-     "/* c */\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,\n"
-     "           /* c */\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,\n"
-     "/* c1 */ /* c2 */\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,\n"
-     "           /* c1 */  /* c2 */\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,\n"
-     "// c\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,\n"
-     "           // c\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,\n"
-     "/* c1 */ // c2\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,\n"
-     "           /* c1 */  // c2\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,\n"
-     "           /* c1 */\n"
-     "           /* c2 */\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,\n"
-     "// c1\n"
-     "// c2\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,\n"
-     "           // c1\n"
-     "           // c2\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,/* c1 */\n"
-     "/* c2 */arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,  /* c1 */\n"
-     "           /* c2 */ arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,// c1\n"
-     "/* c2 */arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,  // c1\n"
-     "           /* c2 */ arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,  /* c1 */\n"
-     "           /* c2 */\n"
-     "           /* c3 */ arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,/* c1 */\n"
-     "/* c2 */\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,  /* c1 */\n"
-     "           /* c2 */\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,// c1\n"
-     "/* c2 */\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,  // c1\n"
-     "           /* c2 */\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,/* c1 */\n"
-     "// c2\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,  /* c1 */\n"
-     "           // c2\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,// c1\n"
-     "// c2\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,  // c1\n"
-     "           // c2\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,  /* c1 */\n"
-     "           /* c2 */\n"
-     "           /* c3 */\n"
-     "           arg2);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,// c1\n"
-     "// c2\n"
-     "// c3\n"
-     "arg2);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,  // c1\n"
-     "           // c2\n"
-     "           // c3\n"
-     "           arg2);\n"},
-
-    // after last arg
-
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,/* c */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,  /* c */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,/* c1 */ /* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,\n"
-     "           arg2,  /* c1 */  /* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,/* c */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,  /* c */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,/* c1 */ /* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1,\n"
-     "           arg2,  /* c1 */  /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,// c\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,  // c\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,/* c1 */ // c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,  /* c1 */  // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,\n"
-     "/* c */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,\n"
-     "/* c */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,\n"
-     "/* c1 */ /* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,\n"
-     "/* c1 */  /* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,\n"
-     "/* c */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,\n"
-     "           /* c */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,\n"
-     "/* c1 */ /* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,\n"
-     "           /* c1 */  /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,\n"
-     "// c\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,\n"
-     "           // c\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,\n"
-     "/* c1 */ // c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,\n"
-     "           /* c1 */  // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,\n"
-     "           /* c1 */\n"
-     "           /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,\n"
-     "// c1\n"
-     "// c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,\n"
-     "           // c1\n"
-     "           // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,/* c1 */\n"
-     "/* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,  /* c1 */\n"
-     "/* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,// c1\n"
-     "/* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,  // c1\n"
-     "/* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,  /* c1 */\n"
-     "           /* c2 */\n"
-     "/* c3 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,/* c1 */\n"
-     "/* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,  /* c1 */\n"
-     "           /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,// c1\n"
-     "/* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,  // c1\n"
-     "           /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,/* c1 */\n"
-     "// c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,  /* c1 */\n"
-     "           // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,// c1\n"
-     "// c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,  // c1\n"
-     "           // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,  /* c1 */\n"
-     "           /* c2 */\n"
-     "           /* c3 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,// c1\n"
-     "// c2\n"
-     "// c3\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg1, arg2,  // c1\n"
-     "           // c2\n"
-     "           // c3\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,/* c */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,  /* c */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,/* c1 */ /* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,\n"
-     "           arg2,  /* c1 */  /* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,/* c */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,  /* c */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,/* c1 */ /* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1,\n"
-     "           arg2,  /* c1 */  /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,// c\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,  // c\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,/* c1 */ // c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,  /* c1 */  // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,\n"
-     "/* c */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,\n"
-     "/* c */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,\n"
-     "/* c1 */ /* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,\n"
-     "/* c1 */  /* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,\n"
-     "/* c */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,\n"
-     "           /* c */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,\n"
-     "/* c1 */ /* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,\n"
-     "           /* c1 */  /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,\n"
-     "// c\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,\n"
-     "           // c\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,\n"
-     "/* c1 */ // c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,\n"
-     "           /* c1 */  // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,\n"
-     "           /* c1 */\n"
-     "           /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,\n"
-     "// c1\n"
-     "// c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,\n"
-     "           // c1\n"
-     "           // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,/* c1 */\n"
-     "/* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,  /* c1 */\n"
-     "/* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,// c1\n"
-     "/* c2 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,  // c1\n"
-     "/* c2 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */);\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,  /* c1 */\n"
-     "           /* c2 */\n"
-     "/* c3 */);\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,/* c1 */\n"
-     "/* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,  /* c1 */\n"
-     "           /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,// c1\n"
-     "/* c2 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,  // c1\n"
-     "           /* c2 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,/* c1 */\n"
-     "// c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,  /* c1 */\n"
-     "           // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,// c1\n"
-     "// c2\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,  // c1\n"
-     "           // c2\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,  /* c1 */\n"
-     "           /* c2 */\n"
-     "           /* c3 */\n"
-     ");\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,// c1\n"
-     "// c2\n"
-     "// c3\n"
-     ");\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg1, arg2,  // c1\n"
-     "           // c2\n"
-     "           // c3\n"
-     ");\n"},
-
-    // after ')', no args
-
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()/* c */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()  /* c */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()/* c1 */ /* c2 */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()  /* c1 */  /* c2 */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()/* c */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()  /* c */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()/* c1 */ /* c2 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()  /* c1 */  /* c2 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()// c\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()  // c\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()/* c1 */ // c2\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()  /* c1 */  // c2\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()\n"
-     "/* c */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()\n"
-     "/* c */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()\n"
-     "/* c1 */ /* c2 */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()\n"
-     "/* c1 */  /* c2 */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()\n"
-     "/* c */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()\n"
-     "/* c */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()\n"
-     "/* c1 */ /* c2 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()\n"
-     "/* c1 */  /* c2 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()\n"
-     "// c\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()\n"
-     "// c\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()\n"
-     "/* c1 */ // c2\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()\n"
-     "/* c1 */  // c2\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()\n"
-     "// c1\n"
-     "// c2\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()\n"
-     "// c1\n"
-     "// c2\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()/* c1 */\n"
-     "/* c2 */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()  /* c1 */\n"
-     "/* c2 */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()// c1\n"
-     "/* c2 */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()  // c1\n"
-     "/* c2 */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()/* c1 */\n"
-     "/* c2 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()  /* c1 */\n"
-     "/* c2 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()// c1\n"
-     "/* c2 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()  // c1\n"
-     "/* c2 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()/* c1 */\n"
-     "// c2\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()  /* c1 */\n"
-     "// c2\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()// c1\n"
-     "// c2\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()  // c1\n"
-     "// c2\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()// c1\n"
-     "// c2\n"
-     "// c3\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz()  // c1\n"
-     "// c2\n"
-     "// c3\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()/* c */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()  /* c */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()/* c1 */ /* c2 */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()  /* c1 */  /* c2 */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()/* c */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()  /* c */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()/* c1 */ /* c2 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()  /* c1 */  /* c2 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()// c\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()  // c\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()/* c1 */ // c2\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()  /* c1 */  // c2\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()\n"
-     "/* c */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()\n"
-     "/* c */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()\n"
-     "/* c1 */ /* c2 */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()\n"
-     "/* c1 */  /* c2 */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()\n"
-     "/* c */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()\n"
-     "/* c */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()\n"
-     "/* c1 */ /* c2 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()\n"
-     "/* c1 */  /* c2 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()\n"
-     "// c\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()\n"
-     "// c\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()\n"
-     "/* c1 */ // c2\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()\n"
-     "/* c1 */  // c2\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()\n"
-     "// c1\n"
-     "// c2\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()\n"
-     "// c1\n"
-     "// c2\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()/* c1 */\n"
-     "/* c2 */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()  /* c1 */\n"
-     "/* c2 */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()// c1\n"
-     "/* c2 */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()  // c1\n"
-     "/* c2 */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()/* c1 */\n"
-     "/* c2 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()  /* c1 */\n"
-     "/* c2 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()// c1\n"
-     "/* c2 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()  // c1\n"
-     "/* c2 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()/* c1 */\n"
-     "// c2\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()  /* c1 */\n"
-     "// c2\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()// c1\n"
-     "// c2\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()  // c1\n"
-     "// c2\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()// c1\n"
-     "// c2\n"
-     "// c3\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ()  // c1\n"
-     "// c2\n"
-     "// c3\n"
-     ";\n"},
-
-    // after ')', with arg
-
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)/* c */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)  /* c */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)/* c1 */ /* c2 */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)  /* c1 */  /* c2 */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)/* c */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)  /* c */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)/* c1 */ /* c2 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)  /* c1 */  /* c2 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)// c\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)  // c\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)/* c1 */ // c2\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)  /* c1 */  // c2\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)\n"
-     "/* c */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)\n"
-     "/* c */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)\n"
-     "/* c1 */ /* c2 */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)\n"
-     "/* c1 */  /* c2 */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)\n"
-     "/* c */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)\n"
-     "/* c */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)\n"
-     "/* c1 */ /* c2 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)\n"
-     "/* c1 */  /* c2 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)\n"
-     "// c\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)  // c\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)\n"
-     "/* c1 */ // c2\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)\n"
-     "/* c1 */  // c2\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)\n"
-     "// c1\n"
-     "// c2\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)\n"
-     "// c1\n"
-     "// c2\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)/* c1 */\n"
-     "/* c2 */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)  /* c1 */\n"
-     "/* c2 */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)// c1\n"
-     "/* c2 */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)  // c1\n"
-     "/* c2 */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)/* c1 */\n"
-     "/* c2 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)  /* c1 */\n"
-     "/* c2 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)// c1\n"
-     "/* c2 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)  // c1\n"
-     "/* c2 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)/* c1 */\n"
-     "// c2\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)  /* c1 */\n"
-     "// c2\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)// c1\n"
-     "// c2\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)  // c1\n"
-     "// c2\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)// c1\n"
-     "// c2\n"
-     "// c3\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg)  // c1\n"
-     "// c2\n"
-     "// c3\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)/* c */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)  /* c */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)/* c1 */ /* c2 */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)  /* c1 */  /* c2 */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)/* c */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)  /* c */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)/* c1 */ /* c2 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)  /* c1 */  /* c2 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)// c\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)  // c\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)/* c1 */ // c2\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)  /* c1 */  // c2\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)\n"
-     "/* c */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)\n"
-     "/* c */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)\n"
-     "/* c1 */ /* c2 */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)\n"
-     "/* c1 */  /* c2 */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)\n"
-     "/* c */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)\n"
-     "/* c */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)\n"
-     "/* c1 */ /* c2 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)\n"
-     "/* c1 */  /* c2 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)\n"
-     "// c\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)\n"
-     "// c\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)\n"
-     "/* c1 */ // c2\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)\n"
-     "/* c1 */  // c2\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)\n"
-     "// c1\n"
-     "// c2\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)\n"
-     "// c1\n"
-     "// c2\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)/* c1 */\n"
-     "/* c2 */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)  /* c1 */\n"
-     "/* c2 */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)// c1\n"
-     "/* c2 */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)  // c1\n"
-     "/* c2 */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */;\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */;\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)/* c1 */\n"
-     "/* c2 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)  /* c1 */\n"
-     "/* c2 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)// c1\n"
-     "/* c2 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)  // c1\n"
-     "/* c2 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)/* c1 */\n"
-     "// c2\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)  /* c1 */\n"
-     "// c2\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)// c1\n"
-     "// c2\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)  // c1\n"
-     "// c2\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ";\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)// c1\n"
-     "// c2\n"
-     "// c3\n"
-     ";\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg)  // c1\n"
-     "// c2\n"
-     "// c3\n"
-     ";\n"},
-
-    // after ';', no args
-
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();  /* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();  /* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();  /* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();  /* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();// c\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();  // c\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();/* c1 */ // c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();  /* c1 */  // c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();\n"
-     "/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();\n"
-     "/* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();\n"
-     "/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();\n"
-     "/* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();\n"
-     "/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();\n"
-     "/* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();\n"
-     "/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();\n"
-     "/* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();\n"
-     "// c\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();\n"
-     "// c\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();\n"
-     "/* c1 */ // c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();\n"
-     "/* c1 */  // c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();\n"
-     "/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();\n"
-     "/* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();\n"
-     "// c1\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();\n"
-     "// c1\n"
-     "// c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();  /* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();// c1\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();  // c1\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();  /* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();// c1 c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();  // c1 c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();/* c1 */\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();  /* c1 */\n"
-     "// c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();// c1\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();  // c1\n"
-     "// c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();// c1\n"
-     "// c2\n"
-     "// c3\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz();  // c1\n"
-     "// c2\n"
-     "// c3\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();  /* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();  /* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();  /* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();  /* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();// c\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();  // c\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();/* c1 */ // c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();  /* c1 */  // c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();\n"
-     "/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();\n"
-     "/* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();\n"
-     "/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();\n"
-     "/* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();\n"
-     "/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();\n"
-     "/* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();\n"
-     "/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();\n"
-     "/* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();\n"
-     "// c\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();\n"
-     "// c\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();\n"
-     "/* c1 */ // c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();\n"
-     "/* c1 */  // c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();\n"
-     "/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();\n"
-     "/* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();\n"
-     "// c1\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();\n"
-     "// c1\n"
-     "// c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();  /* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();// c1\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();  // c1\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();  /* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();// c1\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();  // c1\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();/* c1 */\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();  /* c1 */\n"
-     "// c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();// c1\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();  // c1\n"
-     "// c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();// c1\n"
-     "// c2\n"
-     "// c3\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ();  // c1\n"
-     "// c2\n"
-     "// c3\n"},
-
-    // after ';', with arg
-
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);  /* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);  /* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);  /* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);  /* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);// c\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);  // c\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);/* c1 */ // c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);  /* c1 */  // c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);\n"
-     "/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);\n"
-     "/* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);\n"
-     "/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);\n"
-     "/* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);\n"
-     "/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);\n"
-     "/* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);\n"
-     "/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);\n"
-     "/* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);\n"
-     "// c\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);\n"
-     "// c\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);\n"
-     "/* c1 */ // c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);\n"
-     "/* c1 */  // c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);\n"
-     "/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);\n"
-     "/* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);\n"
-     "// c1\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);\n"
-     "// c1\n"
-     "// c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);  /* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);// c1\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);  // c1\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);  /* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);// c1 c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);  // c1 c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);/* c1 */\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);  /* c1 */\n"
-     "// c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);// c1\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);  // c1\n"
-     "// c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);// c1\n"
-     "// c2\n"
-     "// c3\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz(arg);  // c1\n"
-     "// c2\n"
-     "// c3\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);  /* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);  /* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);  /* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);  /* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);// c\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);  // c\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);/* c1 */ // c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);  /* c1 */  // c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);\n"
-     "/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);\n"
-     "/* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);\n"
-     "/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);\n"
-     "/* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);\n"
-     "/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);\n"
-     "/* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);\n"
-     "/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);\n"
-     "/* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);\n"
-     "// c\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);\n"
-     "// c\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);\n"
-     "/* c1 */ // c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);\n"
-     "/* c1 */  // c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);\n"
-     "/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);\n"
-     "/* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);\n"
-     "// c1\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);\n"
-     "// c1\n"
-     "// c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);  /* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);// c1\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);  // c1\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);  /* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);// c1\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);  // c1\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);/* c1 */\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);  /* c1 */\n"
-     "// c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);// c1\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);  // c1\n"
-     "// c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);// c1\n"
-     "// c2\n"
-     "// c3\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(arg);  // c1\n"
-     "// c2\n"
-     "// c3\n"},
-
-    // everywhere, no args
-
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz/* c */(/* c */)/* c */;/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c */\n"
-     "    (  /* c */)  /* c */;  /* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz/* c1 */ /* c2 */(/* c1 */ /* c2 */)/* c1 */ /* c2 */;/* c1 */ "
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */  /* c2 */\n"
-     "    (  /* c1 */  /* c2 */)  /* c1 */  /* c2 */;  /* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz/* c */\n"
-     "(/* c */\n"
-     ")/* c */\n"
-     ";/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c */\n"
-     "    (  /* c */\n"
-     "    )  /* c */\n"
-     ";  /* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz/* c1 */ /* c2 */\n"
-     "(/* c1 */ /* c2 */\n"
-     ")/* c1 */ /* c2 */\n"
-     ";/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */  /* c2 */\n"
-     "    (  /* c1 */  /* c2 */\n"
-     "    )  /* c1 */  /* c2 */\n"
-     ";  /* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz// c\n"
-     "(// c\n"
-     ")// c\n"
-     ";// c\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  // c\n"
-     "    (  // c\n"
-     "    )  // c\n"
-     ";  // c\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz/* c1 */ // c2\n"
-     "(/* c1 */ // c2\n"
-     ")/* c1 */ // c2\n"
-     ";/* c1 */ // c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */  // c2\n"
-     "    (  /* c1 */  // c2\n"
-     "    )  /* c1 */  // c2\n"
-     ";  /* c1 */  // c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c */(\n"
-     "/* c */)\n"
-     "/* c */;\n"
-     "/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c */ (\n"
-     "    /* c */)\n"
-     "/* c */;\n"
-     "/* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c1 */ /* c2 */(\n"
-     "/* c1 */ /* c2 */)\n"
-     "/* c1 */ /* c2 */;\n"
-     "/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c1 */  /* c2 */ (\n"
-     "    /* c1 */  /* c2 */)\n"
-     "/* c1 */  /* c2 */;\n"
-     "/* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c */\n"
-     "(\n"
-     "/* c */\n"
-     ")\n"
-     "/* c */\n"
-     ";\n"
-     "/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c */\n"
-     "    (\n"
-     "        /* c */\n"
-     "    )\n"
-     "/* c */\n"
-     ";\n"
-     "/* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c1 */ /* c2 */\n"
-     "(\n"
-     "/* c1 */ /* c2 */\n"
-     ")\n"
-     "/* c1 */ /* c2 */\n"
-     ";\n"
-     "/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c1 */  /* c2 */\n"
-     "    (\n"
-     "        /* c1 */  /* c2 */\n"
-     "    )\n"
-     "/* c1 */  /* c2 */\n"
-     ";\n"
-     "/* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "// c\n"
-     "(\n"
-     "// c\n"
-     ")\n"
-     "// c\n"
-     ";\n"
-     "// c\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    // c\n"
-     "    (\n"
-     "        // c\n"
-     "    )\n"
-     "// c\n"
-     ";\n"
-     "// c\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c1 */ // c2\n"
-     "(\n"
-     "/* c1 */ // c2\n"
-     ")\n"
-     "/* c1 */ // c2\n"
-     ";\n"
-     "/* c1 */ // c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c1 */  // c2\n"
-     "    (\n"
-     "        /* c1 */  // c2\n"
-     "    )\n"
-     "/* c1 */  // c2\n"
-     ";\n"
-     "/* c1 */  // c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     "(\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ")\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ";\n"
-     "/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c1 */\n"
-     "    /* c2 */\n"
-     "    (\n"
-     "        /* c1 */\n"
-     "        /* c2 */\n"
-     "    )\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ";\n"
-     "/* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "// c1\n"
-     "// c2\n"
-     "(\n"
-     "// c1\n"
-     "// c2\n"
-     ")\n"
-     "// c1\n"
-     "// c2\n"
-     ";\n"
-     "// c1\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    // c1\n"
-     "    // c2\n"
-     "    (\n"
-     "        // c1\n"
-     "        // c2\n"
-     "    )\n"
-     "// c1\n"
-     "// c2\n"
-     ";\n"
-     "// c1\n"
-     "// c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz/* c1 */\n"
-     "/* c2 */(/* c1 */\n"
-     "/* c2 */)/* c1 */\n"
-     "/* c2 */;/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */\n"
-     "    /* c2 */ (  /* c1 */\n"
-     "    /* c2 */)  /* c1 */\n"
-     "/* c2 */;  /* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz// c1\n"
-     "/* c2 */(// c1\n"
-     "/* c2 */)// c1\n"
-     "/* c2 */;// c1\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  // c1\n"
-     "    /* c2 */ (  // c1\n"
-     "    /* c2 */)  // c1\n"
-     "/* c2 */;  // c1\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */(/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */)/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */;/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */\n"
-     "    /* c2 */\n"
-     "    /* c3 */ (  /* c1 */\n"
-     "        /* c2 */\n"
-     "    /* c3 */)  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */;  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz/* c1 */\n"
-     "/* c2 */\n"
-     "(/* c1 */\n"
-     "/* c2 */\n"
-     ")/* c1 */\n"
-     "/* c2 */\n"
-     ";/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */\n"
-     "    /* c2 */\n"
-     "    (  /* c1 */\n"
-     "        /* c2 */\n"
-     "    )  /* c1 */\n"
-     "/* c2 */\n"
-     ";  /* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz// c1\n"
-     "/* c2 */\n"
-     "(// c1\n"
-     "/* c2 */\n"
-     ")// c1\n"
-     "/* c2 */\n"
-     ";// c1\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  // c1\n"
-     "    /* c2 */\n"
-     "    (  // c1\n"
-     "        /* c2 */\n"
-     "    )  // c1\n"
-     "/* c2 */\n"
-     ";  // c1\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz/* c1 */\n"
-     "// c2\n"
-     "(/* c1 */\n"
-     "// c2\n"
-     ")/* c1 */\n"
-     "// c2\n"
-     ";/* c1 */\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */\n"
-     "    // c2\n"
-     "    (  /* c1 */\n"
-     "        // c2\n"
-     "    )  /* c1 */\n"
-     "// c2\n"
-     ";  /* c1 */\n"
-     "// c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz// c1\n"
-     "// c2\n"
-     "(// c1\n"
-     "// c2\n"
-     ")// c1\n"
-     "// c2\n"
-     ";// c1\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  // c1\n"
-     "    // c2\n"
-     "    (  // c1\n"
-     "       // c2\n"
-     "    )  // c1\n"
-     "       // c2\n"
-     ";  // c1\n"
-     "   // c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     "(/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ")/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ";/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */\n"
-     "    /* c2 */\n"
-     "    /* c3 */\n"
-     "    (  /* c1 */\n"
-     "        /* c2 */\n"
-     "        /* c3 */\n"
-     "    )  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ";  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz// c1\n"
-     "// c2\n"
-     "// c3\n"
-     "(// c1\n"
-     "// c2\n"
-     "// c3\n"
-     ")// c1\n"
-     "// c2\n"
-     "// c3\n"
-     ";// c1\n"
-     "// c2\n"
-     "// c3\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  // c1\n"
-     "    // c2\n"
-     "    // c3\n"
-     "    (  // c1\n"
-     "       // c2\n"
-     "       // c3\n"
-     "    )  // c1\n"
-     "       // c2\n"
-     "       // c3\n"
-     ";  // c1\n"
-     "   // c2\n"
-     "   // c3\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c */)/* c */;/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c */)  /* c */;  /* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */ /* c2 */)/* c1 */ /* c2 */;/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */  /* c2 */)  /* c1 */  /* c2 */;  /* c1 */  /* c2 "
-     "*/\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c */\n"
-     ")/* c */\n"
-     ";/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c */\n"
-     ")  /* c */\n"
-     ";  /* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */ /* c2 */\n"
-     ")/* c1 */ /* c2 */\n"
-     ";/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */  /* c2 */\n"
-     ")  /* c1 */  /* c2 */\n"
-     ";  /* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(// c\n"
-     ")// c\n"
-     ";// c\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  // c\n"
-     ")  // c\n"
-     ";  // c\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */ // c2\n"
-     ")/* c1 */ // c2\n"
-     ";/* c1 */ // c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */  // c2\n"
-     ")  /* c1 */  // c2\n"
-     ";  /* c1 */  // c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c */)\n"
-     "/* c */;\n"
-     "/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c */)\n"
-     "/* c */;\n"
-     "/* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c1 */ /* c2 */)\n"
-     "/* c1 */ /* c2 */;\n"
-     "/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c1 */  /* c2 */)\n"
-     "/* c1 */  /* c2 */;\n"
-     "/* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c */\n"
-     ")\n"
-     "/* c */\n"
-     ";\n"
-     "/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    /* c */\n"
-     ")\n"
-     "/* c */\n"
-     ";\n"
-     "/* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c1 */ /* c2 */\n"
-     ")\n"
-     "/* c1 */ /* c2 */\n"
-     ";\n"
-     "/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    /* c1 */  /* c2 */\n"
-     ")\n"
-     "/* c1 */  /* c2 */\n"
-     ";\n"
-     "/* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "// c\n"
-     ")\n"
-     "// c\n"
-     ";\n"
-     "// c\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    // c\n"
-     ")\n"
-     "// c\n"
-     ";\n"
-     "// c\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c1 */ // c2\n"
-     ")\n"
-     "/* c1 */ // c2\n"
-     ";\n"
-     "/* c1 */ // c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    /* c1 */  // c2\n"
-     ")\n"
-     "/* c1 */  // c2\n"
-     ";\n"
-     "/* c1 */  // c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ")\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ";\n"
-     "/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    /* c1 */\n"
-     "    /* c2 */\n"
-     ")\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ";\n"
-     "/* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "// c1\n"
-     "// c2\n"
-     ")\n"
-     "// c1\n"
-     "// c2\n"
-     ";\n"
-     "// c1\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    // c1\n"
-     "    // c2\n"
-     ")\n"
-     "// c1\n"
-     "// c2\n"
-     ";\n"
-     "// c1\n"
-     "// c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */\n"
-     "/* c2 */)/* c1 */\n"
-     "/* c2 */;/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */\n"
-     "/* c2 */)  /* c1 */\n"
-     "/* c2 */;  /* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(// c1\n"
-     "/* c2 */)// c1\n"
-     "/* c2 */;// c1\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  // c1\n"
-     "/* c2 */)  // c1\n"
-     "/* c2 */;  // c1\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */)/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */;/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */\n"
-     "    /* c2 */\n"
-     "/* c3 */)  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */;  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */\n"
-     "/* c2 */\n"
-     ")/* c1 */\n"
-     "/* c2 */\n"
-     ";/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */\n"
-     "    /* c2 */\n"
-     ")  /* c1 */\n"
-     "/* c2 */\n"
-     ";  /* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(// c1\n"
-     "/* c2 */\n"
-     ")// c1\n"
-     "/* c2 */\n"
-     ";// c1\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  // c1\n"
-     "    /* c2 */\n"
-     ")  // c1\n"
-     "/* c2 */\n"
-     ";  // c1\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */\n"
-     "// c2\n"
-     ")/* c1 */\n"
-     "// c2\n"
-     ";/* c1 */\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */\n"
-     "    // c2\n"
-     ")  /* c1 */\n"
-     "// c2\n"
-     ";  /* c1 */\n"
-     "// c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(// c1\n"
-     "// c2\n"
-     ")// c1\n"
-     "// c2\n"
-     ";// c1\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  // c1\n"
-     "    // c2\n"
-     ")  // c1\n"
-     "   // c2\n"
-     ";  // c1\n"
-     "   // c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ")/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ";/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */\n"
-     "    /* c2 */\n"
-     "    /* c3 */\n"
-     ")  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ";  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(// c1\n"
-     "// c2\n"
-     "// c3\n"
-     ")// c1\n"
-     "// c2\n"
-     "// c3\n"
-     ";// c1\n"
-     "// c2\n"
-     "// c3\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  // c1\n"
-     "    // c2\n"
-     "    // c3\n"
-     ")  // c1\n"
-     "   // c2\n"
-     "   // c3\n"
-     ";  // c1\n"
-     "   // c2\n"
-     "   // c3\n"},
-
-    // everywhere, with args
-
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz/* c */(/* c */arg1/* c */,/* c */arg2/* c */)/* c */;/* c "
-     "*/\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c */ (  /* c */\n"
-     "    arg1  /* c */,  /* c */\n"
-     "    arg2  /* c */)  /* c */;  /* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz/* c1 */ /* c2 */(/* c1 */ /* c2 */arg1/* c1 */ /* c2 */,/* c1 "
-     "*/ /* c2 */arg2/* c1 */ /* c2 */)/* c1 */ /* c2 */;/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */  /* c2 */ (  /* c1 */  /* c2 */\n"
-     "    arg1  /* c1 */  /* c2 */,  /* c1 */  /* c2 */\n"
-     "    arg2  /* c1 */  /* c2 */)  /* c1 */  /* c2 */;  /* c1 */  /* c2 "
-     "*/\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz/* c */\n"
-     "(/* c */\n"
-     "arg1/* c */\n"
-     ",/* c */\n"
-     "arg2/* c */\n"
-     ")/* c */\n"
-     ";/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c */\n"
-     "    (  /* c */\n"
-     "        arg1  /* c */\n"
-     "        ,  /* c */\n"
-     "        arg2  /* c */\n"
-     "    )  /* c */\n"
-     ";  /* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz/* c1 */ /* c2 */\n"
-     "(/* c1 */ /* c2 */\n"
-     "arg1/* c1 */ /* c2 */\n"
-     ",/* c1 */ /* c2 */\n"
-     "arg2/* c1 */ /* c2 */\n"
-     ")/* c1 */ /* c2 */\n"
-     ";/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */  /* c2 */\n"
-     "    (  /* c1 */  /* c2 */\n"
-     "        arg1  /* c1 */  /* c2 */\n"
-     "        ,  /* c1 */  /* c2 */\n"
-     "        arg2  /* c1 */  /* c2 */\n"
-     "    )  /* c1 */  /* c2 */\n"
-     ";  /* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz// c\n"
-     "(// c\n"
-     "arg1// c\n"
-     ",// c\n"
-     "arg2// c\n"
-     ")// c\n"
-     ";// c\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  // c\n"
-     "    (  // c\n"
-     "        arg1  // c\n"
-     "        ,  // c\n"
-     "        arg2  // c\n"
-     "    )  // c\n"
-     ";  // c\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz/* c1 */ // c2\n"
-     "(/* c1 */ // c2\n"
-     "arg1/* c1 */ // c2\n"
-     ",/* c1 */ // c2\n"
-     "arg2/* c1 */ // c2\n"
-     ")/* c1 */ // c2\n"
-     ";/* c1 */ // c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */  // c2\n"
-     "    (  /* c1 */  // c2\n"
-     "        arg1  /* c1 */  // c2\n"
-     "        ,  /* c1 */  // c2\n"
-     "        arg2  /* c1 */  // c2\n"
-     "    )  /* c1 */  // c2\n"
-     ";  /* c1 */  // c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c */(\n"
-     "/* c */arg1\n"
-     "/* c */,\n"
-     "/* c */arg2\n"
-     "/* c */)\n"
-     "/* c */;\n"
-     "/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c */ (\n"
-     "        /* c */ arg1\n"
-     "        /* c */,\n"
-     "        /* c */ arg2\n"
-     "    /* c */)\n"
-     "/* c */;\n"
-     "/* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c1 */ /* c2 */(\n"
-     "/* c1 */ /* c2 */arg1\n"
-     "/* c1 */ /* c2 */,\n"
-     "/* c1 */ /* c2 */arg2\n"
-     "/* c1 */ /* c2 */)\n"
-     "/* c1 */ /* c2 */;\n"
-     "/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c1 */  /* c2 */ (\n"
-     "        /* c1 */  /* c2 */ arg1\n"
-     "        /* c1 */  /* c2 */,\n"
-     "        /* c1 */  /* c2 */ arg2\n"
-     "    /* c1 */  /* c2 */)\n"
-     "/* c1 */  /* c2 */;\n"
-     "/* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c */\n"
-     "(\n"
-     "/* c */\n"
-     "arg1\n"
-     "/* c */\n"
-     ",\n"
-     "/* c */\n"
-     "arg2\n"
-     "/* c */\n"
-     ")\n"
-     "/* c */\n"
-     ";\n"
-     "/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c */\n"
-     "    (\n"
-     "        /* c */\n"
-     "        arg1\n"
-     "        /* c */\n"
-     "        ,\n"
-     "        /* c */\n"
-     "        arg2\n"
-     "        /* c */\n"
-     "    )\n"
-     "/* c */\n"
-     ";\n"
-     "/* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c1 */ /* c2 */\n"
-     "(\n"
-     "/* c1 */ /* c2 */\n"
-     "arg1\n"
-     "/* c1 */ /* c2 */\n"
-     ",\n"
-     "/* c1 */ /* c2 */\n"
-     "arg2\n"
-     "/* c1 */ /* c2 */\n"
-     ")\n"
-     "/* c1 */ /* c2 */\n"
-     ";\n"
-     "/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c1 */  /* c2 */\n"
-     "    (\n"
-     "        /* c1 */  /* c2 */\n"
-     "        arg1\n"
-     "        /* c1 */  /* c2 */\n"
-     "        ,\n"
-     "        /* c1 */  /* c2 */\n"
-     "        arg2\n"
-     "        /* c1 */  /* c2 */\n"
-     "    )\n"
-     "/* c1 */  /* c2 */\n"
-     ";\n"
-     "/* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "// c\n"
-     "(\n"
-     "// c\n"
-     "arg1\n"
-     "// c\n"
-     ",\n"
-     "// c\n"
-     "arg2\n"
-     "// c\n"
-     ")\n"
-     "// c\n"
-     ";\n"
-     "// c\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    // c\n"
-     "    (\n"
-     "        // c\n"
-     "        arg1\n"
-     "        // c\n"
-     "        ,\n"
-     "        // c\n"
-     "        arg2\n"
-     "        // c\n"
-     "    )\n"
-     "// c\n"
-     ";\n"
-     "// c\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c1 */ // c2\n"
-     "(\n"
-     "/* c1 */ // c2\n"
-     "arg1\n"
-     "/* c1 */ // c2\n"
-     ",\n"
-     "/* c1 */ // c2\n"
-     "arg2\n"
-     "/* c1 */ // c2\n"
-     ")\n"
-     "/* c1 */ // c2\n"
-     ";\n"
-     "/* c1 */ // c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c1 */  // c2\n"
-     "    (\n"
-     "        /* c1 */  // c2\n"
-     "        arg1\n"
-     "        /* c1 */  // c2\n"
-     "        ,\n"
-     "        /* c1 */  // c2\n"
-     "        arg2\n"
-     "        /* c1 */  // c2\n"
-     "    )\n"
-     "/* c1 */  // c2\n"
-     ";\n"
-     "/* c1 */  // c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     "(\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     "arg1\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ",\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     "arg2\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ")\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ";\n"
-     "/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    /* c1 */\n"
-     "    /* c2 */\n"
-     "    (\n"
-     "        /* c1 */\n"
-     "        /* c2 */\n"
-     "        arg1\n"
-     "        /* c1 */\n"
-     "        /* c2 */\n"
-     "        ,\n"
-     "        /* c1 */\n"
-     "        /* c2 */\n"
-     "        arg2\n"
-     "        /* c1 */\n"
-     "        /* c2 */\n"
-     "    )\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ";\n"
-     "/* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "// c1\n"
-     "// c2\n"
-     "(\n"
-     "// c1\n"
-     "// c2\n"
-     "arg1\n"
-     "// c1\n"
-     "// c2\n"
-     ",\n"
-     "// c1\n"
-     "// c2\n"
-     "arg2\n"
-     "// c1\n"
-     "// c2\n"
-     ")\n"
-     "// c1\n"
-     "// c2\n"
-     ";\n"
-     "// c1\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz\n"
-     "    // c1\n"
-     "    // c2\n"
-     "    (\n"
-     "        // c1\n"
-     "        // c2\n"
-     "        arg1\n"
-     "        // c1\n"
-     "        // c2\n"
-     "        ,\n"
-     "        // c1\n"
-     "        // c2\n"
-     "        arg2\n"
-     "        // c1\n"
-     "        // c2\n"
-     "    )\n"
-     "// c1\n"
-     "// c2\n"
-     ";\n"
-     "// c1\n"
-     "// c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz/* c1 */\n"
-     "/* c2 */(/* c1 */\n"
-     "/* c2 */arg1/* c1 */\n"
-     "/* c2 */,/* c1 */\n"
-     "/* c2 */arg2/* c1 */\n"
-     "/* c2 */)/* c1 */\n"
-     "/* c2 */;/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */\n"
-     "    /* c2 */ (  /* c1 */\n"
-     "        /* c2 */ arg1  /* c1 */\n"
-     "        /* c2 */,  /* c1 */\n"
-     "        /* c2 */ arg2  /* c1 */\n"
-     "    /* c2 */)  /* c1 */\n"
-     "/* c2 */;  /* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz// c1\n"
-     "/* c2 */(// c1\n"
-     "/* c2 */arg1// c1\n"
-     "/* c2 */,// c1\n"
-     "/* c2 */arg2// c1\n"
-     "/* c2 */)// c1\n"
-     "/* c2 */;// c1\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  // c1\n"
-     "    /* c2 */ (  // c1\n"
-     "        /* c2 */ arg1  // c1\n"
-     "        /* c2 */,  // c1\n"
-     "        /* c2 */ arg2  // c1\n"
-     "    /* c2 */)  // c1\n"
-     "/* c2 */;  // c1\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */(/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */arg1/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */,/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */arg2/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */)/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */;/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */\n"
-     "    /* c2 */\n"
-     "    /* c3 */ (  /* c1 */\n"
-     "        /* c2 */\n"
-     "        /* c3 */ arg1  /* c1 */\n"
-     "        /* c2 */\n"
-     "        /* c3 */,  /* c1 */\n"
-     "        /* c2 */\n"
-     "        /* c3 */ arg2  /* c1 */\n"
-     "        /* c2 */\n"
-     "    /* c3 */)  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */;  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz/* c1 */\n"
-     "/* c2 */\n"
-     "(/* c1 */\n"
-     "/* c2 */\n"
-     "arg1/* c1 */\n"
-     "/* c2 */\n"
-     ",/* c1 */\n"
-     "/* c2 */\n"
-     "arg2/* c1 */\n"
-     "/* c2 */\n"
-     ")/* c1 */\n"
-     "/* c2 */\n"
-     ";/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */\n"
-     "    /* c2 */\n"
-     "    (  /* c1 */\n"
-     "        /* c2 */\n"
-     "        arg1  /* c1 */\n"
-     "        /* c2 */\n"
-     "        ,  /* c1 */\n"
-     "        /* c2 */\n"
-     "        arg2  /* c1 */\n"
-     "        /* c2 */\n"
-     "    )  /* c1 */\n"
-     "/* c2 */\n"
-     ";  /* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz// c1\n"
-     "/* c2 */\n"
-     "(// c1\n"
-     "/* c2 */\n"
-     "arg1// c1\n"
-     "/* c2 */\n"
-     ",// c1\n"
-     "/* c2 */\n"
-     "arg2// c1\n"
-     "/* c2 */\n"
-     ")// c1\n"
-     "/* c2 */\n"
-     ";// c1\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  // c1\n"
-     "    /* c2 */\n"
-     "    (  // c1\n"
-     "        /* c2 */\n"
-     "        arg1  // c1\n"
-     "        /* c2 */\n"
-     "        ,  // c1\n"
-     "        /* c2 */\n"
-     "        arg2  // c1\n"
-     "        /* c2 */\n"
-     "    )  // c1\n"
-     "/* c2 */\n"
-     ";  // c1\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz/* c1 */\n"
-     "// c2\n"
-     "(/* c1 */\n"
-     "// c2\n"
-     "arg1/* c1 */\n"
-     "// c2\n"
-     ",/* c1 */\n"
-     "// c2\n"
-     "arg2/* c1 */\n"
-     "// c2\n"
-     ")/* c1 */\n"
-     "// c2\n"
-     ";/* c1 */\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */\n"
-     "    // c2\n"
-     "    (  /* c1 */\n"
-     "        // c2\n"
-     "        arg1  /* c1 */\n"
-     "        // c2\n"
-     "        ,  /* c1 */\n"
-     "        // c2\n"
-     "        arg2  /* c1 */\n"
-     "        // c2\n"
-     "    )  /* c1 */\n"
-     "// c2\n"
-     ";  /* c1 */\n"
-     "// c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz// c1\n"
-     "// c2\n"
-     "(// c1\n"
-     "// c2\n"
-     "arg1// c1\n"
-     "// c2\n"
-     ",// c1\n"
-     "// c2\n"
-     "arg2// c1\n"
-     "// c2\n"
-     ")// c1\n"
-     "// c2\n"
-     ";// c1\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  // c1\n"
-     "    // c2\n"
-     "    (  // c1\n"
-     "       // c2\n"
-     "        arg1  // c1\n"
-     "        // c2\n"
-     "        ,  // c1\n"
-     "           // c2\n"
-     "        arg2  // c1\n"
-     "        // c2\n"
-     "    )  // c1\n"
-     "       // c2\n"
-     ";  // c1\n"
-     "   // c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     "(/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     "arg1/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ",/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     "arg2/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ")/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ";/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  /* c1 */\n"
-     "    /* c2 */\n"
-     "    /* c3 */\n"
-     "    (  /* c1 */\n"
-     "        /* c2 */\n"
-     "        /* c3 */\n"
-     "        arg1  /* c1 */\n"
-     "        /* c2 */\n"
-     "        /* c3 */\n"
-     "        ,  /* c1 */\n"
-     "        /* c2 */\n"
-     "        /* c3 */\n"
-     "        arg2  /* c1 */\n"
-     "        /* c2 */\n"
-     "        /* c3 */\n"
-     "    )  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ";  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz// c1\n"
-     "// c2\n"
-     "// c3\n"
-     "(// c1\n"
-     "// c2\n"
-     "// c3\n"
-     "arg1// c1\n"
-     "// c2\n"
-     "// c3\n"
-     ",// c1\n"
-     "// c2\n"
-     "// c3\n"
-     "arg2// c1\n"
-     "// c2\n"
-     "// c3\n"
-     ")// c1\n"
-     "// c2\n"
-     "// c3\n"
-     ";// c1\n"
-     "// c2\n"
-     "// c3\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "$foobarbaz  // c1\n"
-     "    // c2\n"
-     "    // c3\n"
-     "    (  // c1\n"
-     "       // c2\n"
-     "       // c3\n"
-     "        arg1  // c1\n"
-     "        // c2\n"
-     "        // c3\n"
-     "        ,  // c1\n"
-     "           // c2\n"
-     "           // c3\n"
-     "        arg2  // c1\n"
-     "        // c2\n"
-     "        // c3\n"
-     "    )  // c1\n"
-     "       // c2\n"
-     "       // c3\n"
-     ";  // c1\n"
-     "   // c2\n"
-     "   // c3\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c */arg1/* c */,/* c */arg2/* c */)/* c */;/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c */\n"
-     "    arg1  /* c */,  /* c */\n"
-     "    arg2  /* c */)  /* c */;  /* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */ /* c2 */arg1/* c1 */ /* c2 */,/* c1 */ /* c2 "
-     "*/arg2/* c1 */ /* c2 */)/* c1 */ /* c2 */;/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */  /* c2 */\n"
-     "    arg1  /* c1 */  /* c2 */,  /* c1 */  /* c2 */\n"
-     "    arg2  /* c1 */  /* c2 */)  /* c1 */  /* c2 */;  /* c1 */  /* c2 "
-     "*/\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c */\n"
-     "arg1/* c */\n"
-     ",/* c */\n"
-     "arg2/* c */\n"
-     ")/* c */\n"
-     ";/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c */\n"
-     "    arg1  /* c */\n"
-     "    ,  /* c */\n"
-     "    arg2  /* c */\n"
-     ")  /* c */\n"
-     ";  /* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */ /* c2 */\n"
-     "arg1/* c1 */ /* c2 */\n"
-     ",/* c1 */ /* c2 */\n"
-     "arg2/* c1 */ /* c2 */\n"
-     ")/* c1 */ /* c2 */\n"
-     ";/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */  /* c2 */\n"
-     "    arg1  /* c1 */  /* c2 */\n"
-     "    ,  /* c1 */  /* c2 */\n"
-     "    arg2  /* c1 */  /* c2 */\n"
-     ")  /* c1 */  /* c2 */\n"
-     ";  /* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(// c\n"
-     "arg1// c\n"
-     ",// c\n"
-     "arg2// c\n"
-     ")// c\n"
-     ";// c\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  // c\n"
-     "    arg1  // c\n"
-     "    ,  // c\n"
-     "    arg2  // c\n"
-     ")  // c\n"
-     ";  // c\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */ // c2\n"
-     "arg1/* c1 */ // c2\n"
-     ",/* c1 */ // c2\n"
-     "arg2/* c1 */ // c2\n"
-     ")/* c1 */ // c2\n"
-     ";/* c1 */ // c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */  // c2\n"
-     "    arg1  /* c1 */  // c2\n"
-     "    ,  /* c1 */  // c2\n"
-     "    arg2  /* c1 */  // c2\n"
-     ")  /* c1 */  // c2\n"
-     ";  /* c1 */  // c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c */arg1\n"
-     "/* c */,\n"
-     "/* c */arg2\n"
-     "/* c */)\n"
-     "/* c */;\n"
-     "/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    /* c */ arg1\n"
-     "    /* c */,\n"
-     "    /* c */ arg2\n"
-     "/* c */)\n"
-     "/* c */;\n"
-     "/* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c1 */ /* c2 */arg1\n"
-     "/* c1 */ /* c2 */,\n"
-     "/* c1 */ /* c2 */arg2\n"
-     "/* c1 */ /* c2 */)\n"
-     "/* c1 */ /* c2 */;\n"
-     "/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    /* c1 */  /* c2 */ arg1\n"
-     "    /* c1 */  /* c2 */,\n"
-     "    /* c1 */  /* c2 */ arg2\n"
-     "/* c1 */  /* c2 */)\n"
-     "/* c1 */  /* c2 */;\n"
-     "/* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c */\n"
-     "arg1\n"
-     "/* c */\n"
-     ",\n"
-     "/* c */\n"
-     "arg2\n"
-     "/* c */\n"
-     ")\n"
-     "/* c */\n"
-     ";\n"
-     "/* c */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    /* c */\n"
-     "    arg1\n"
-     "    /* c */\n"
-     "    ,\n"
-     "    /* c */\n"
-     "    arg2\n"
-     "    /* c */\n"
-     ")\n"
-     "/* c */\n"
-     ";\n"
-     "/* c */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c1 */ /* c2 */\n"
-     "arg1\n"
-     "/* c1 */ /* c2 */\n"
-     ",\n"
-     "/* c1 */ /* c2 */\n"
-     "arg2\n"
-     "/* c1 */ /* c2 */\n"
-     ")\n"
-     "/* c1 */ /* c2 */\n"
-     ";\n"
-     "/* c1 */ /* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    /* c1 */  /* c2 */\n"
-     "    arg1\n"
-     "    /* c1 */  /* c2 */\n"
-     "    ,\n"
-     "    /* c1 */  /* c2 */\n"
-     "    arg2\n"
-     "    /* c1 */  /* c2 */\n"
-     ")\n"
-     "/* c1 */  /* c2 */\n"
-     ";\n"
-     "/* c1 */  /* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "// c\n"
-     "arg1\n"
-     "// c\n"
-     ",\n"
-     "// c\n"
-     "arg2\n"
-     "// c\n"
-     ")\n"
-     "// c\n"
-     ";\n"
-     "// c\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    // c\n"
-     "    arg1\n"
-     "    // c\n"
-     "    ,\n"
-     "    // c\n"
-     "    arg2\n"
-     "    // c\n"
-     ")\n"
-     "// c\n"
-     ";\n"
-     "// c\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c1 */ // c2\n"
-     "arg1\n"
-     "/* c1 */ // c2\n"
-     ",\n"
-     "/* c1 */ // c2\n"
-     "arg2\n"
-     "/* c1 */ // c2\n"
-     ")\n"
-     "/* c1 */ // c2\n"
-     ";\n"
-     "/* c1 */ // c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    /* c1 */  // c2\n"
-     "    arg1\n"
-     "    /* c1 */  // c2\n"
-     "    ,\n"
-     "    /* c1 */  // c2\n"
-     "    arg2\n"
-     "    /* c1 */  // c2\n"
-     ")\n"
-     "/* c1 */  // c2\n"
-     ";\n"
-     "/* c1 */  // c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     "arg1\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ",\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     "arg2\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ")\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ";\n"
-     "/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    /* c1 */\n"
-     "    /* c2 */\n"
-     "    arg1\n"
-     "    /* c1 */\n"
-     "    /* c2 */\n"
-     "    ,\n"
-     "    /* c1 */\n"
-     "    /* c2 */\n"
-     "    arg2\n"
-     "    /* c1 */\n"
-     "    /* c2 */\n"
-     ")\n"
-     "/* c1 */\n"
-     "/* c2 */\n"
-     ";\n"
-     "/* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "// c1\n"
-     "// c2\n"
-     "arg1\n"
-     "// c1\n"
-     "// c2\n"
-     ",\n"
-     "// c1\n"
-     "// c2\n"
-     "arg2\n"
-     "// c1\n"
-     "// c2\n"
-     ")\n"
-     "// c1\n"
-     "// c2\n"
-     ";\n"
-     "// c1\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(\n"
-     "    // c1\n"
-     "    // c2\n"
-     "    arg1\n"
-     "    // c1\n"
-     "    // c2\n"
-     "    ,\n"
-     "    // c1\n"
-     "    // c2\n"
-     "    arg2\n"
-     "    // c1\n"
-     "    // c2\n"
-     ")\n"
-     "// c1\n"
-     "// c2\n"
-     ";\n"
-     "// c1\n"
-     "// c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */\n"
-     "/* c2 */arg1/* c1 */\n"
-     "/* c2 */,/* c1 */\n"
-     "/* c2 */arg2/* c1 */\n"
-     "/* c2 */)/* c1 */\n"
-     "/* c2 */;/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */\n"
-     "    /* c2 */ arg1  /* c1 */\n"
-     "    /* c2 */,  /* c1 */\n"
-     "    /* c2 */ arg2  /* c1 */\n"
-     "/* c2 */)  /* c1 */\n"
-     "/* c2 */;  /* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(// c1\n"
-     "/* c2 */arg1// c1\n"
-     "/* c2 */,// c1\n"
-     "/* c2 */arg2// c1\n"
-     "/* c2 */)// c1\n"
-     "/* c2 */;// c1\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  // c1\n"
-     "    /* c2 */ arg1  // c1\n"
-     "    /* c2 */,  // c1\n"
-     "    /* c2 */ arg2  // c1\n"
-     "/* c2 */)  // c1\n"
-     "/* c2 */;  // c1\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */arg1/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */,/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */arg2/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */)/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */;/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */\n"
-     "    /* c2 */\n"
-     "    /* c3 */ arg1  /* c1 */\n"
-     "    /* c2 */\n"
-     "    /* c3 */,  /* c1 */\n"
-     "    /* c2 */\n"
-     "    /* c3 */ arg2  /* c1 */\n"
-     "    /* c2 */\n"
-     "/* c3 */)  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */;  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */\n"
-     "/* c2 */\n"
-     "arg1/* c1 */\n"
-     "/* c2 */\n"
-     ",/* c1 */\n"
-     "/* c2 */\n"
-     "arg2/* c1 */\n"
-     "/* c2 */\n"
-     ")/* c1 */\n"
-     "/* c2 */\n"
-     ";/* c1 */\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */\n"
-     "    /* c2 */\n"
-     "    arg1  /* c1 */\n"
-     "    /* c2 */\n"
-     "    ,  /* c1 */\n"
-     "    /* c2 */\n"
-     "    arg2  /* c1 */\n"
-     "    /* c2 */\n"
-     ")  /* c1 */\n"
-     "/* c2 */\n"
-     ";  /* c1 */\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(// c1\n"
-     "/* c2 */\n"
-     "arg1// c1\n"
-     "/* c2 */\n"
-     ",// c1\n"
-     "/* c2 */\n"
-     "arg2// c1\n"
-     "/* c2 */\n"
-     ")// c1\n"
-     "/* c2 */\n"
-     ";// c1\n"
-     "/* c2 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  // c1\n"
-     "    /* c2 */\n"
-     "    arg1  // c1\n"
-     "    /* c2 */\n"
-     "    ,  // c1\n"
-     "    /* c2 */\n"
-     "    arg2  // c1\n"
-     "    /* c2 */\n"
-     ")  // c1\n"
-     "/* c2 */\n"
-     ";  // c1\n"
-     "/* c2 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */\n"
-     "// c2\n"
-     "arg1/* c1 */\n"
-     "// c2\n"
-     ",/* c1 */\n"
-     "// c2\n"
-     "arg2/* c1 */\n"
-     "// c2\n"
-     ")/* c1 */\n"
-     "// c2\n"
-     ";/* c1 */\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */\n"
-     "    // c2\n"
-     "    arg1  /* c1 */\n"
-     "    // c2\n"
-     "    ,  /* c1 */\n"
-     "    // c2\n"
-     "    arg2  /* c1 */\n"
-     "    // c2\n"
-     ")  /* c1 */\n"
-     "// c2\n"
-     ";  /* c1 */\n"
-     "// c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(// c1\n"
-     "// c2\n"
-     "arg1// c1\n"
-     "// c2\n"
-     ",// c1\n"
-     "// c2\n"
-     "arg2// c1\n"
-     "// c2\n"
-     ")// c1\n"
-     "// c2\n"
-     ";// c1\n"
-     "// c2\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  // c1\n"
-     "    // c2\n"
-     "    arg1  // c1\n"
-     "    // c2\n"
-     "    ,  // c1\n"
-     "       // c2\n"
-     "    arg2  // c1\n"
-     "    // c2\n"
-     ")  // c1\n"
-     "   // c2\n"
-     ";  // c1\n"
-     "   // c2\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     "arg1/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ",/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     "arg2/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ")/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ";/* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  /* c1 */\n"
-     "    /* c2 */\n"
-     "    /* c3 */\n"
-     "    arg1  /* c1 */\n"
-     "    /* c2 */\n"
-     "    /* c3 */\n"
-     "    ,  /* c1 */\n"
-     "    /* c2 */\n"
-     "    /* c3 */\n"
-     "    arg2  /* c1 */\n"
-     "    /* c2 */\n"
-     "    /* c3 */\n"
-     ")  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"
-     ";  /* c1 */\n"
-     "/* c2 */\n"
-     "/* c3 */\n"},
-    {"// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(// c1\n"
-     "// c2\n"
-     "// c3\n"
-     "arg1// c1\n"
-     "// c2\n"
-     "// c3\n"
-     ",// c1\n"
-     "// c2\n"
-     "// c3\n"
-     "arg2// c1\n"
-     "// c2\n"
-     "// c3\n"
-     ")// c1\n"
-     "// c2\n"
-     "// c3\n"
-     ";// c1\n"
-     "// c2\n"
-     "// c3\n",
-     "// verilog_syntax: parse-as-module-body\n"
-     "`FOOBARBAZ(  // c1\n"
-     "    // c2\n"
-     "    // c3\n"
-     "    arg1  // c1\n"
-     "    // c2\n"
-     "    // c3\n"
-     "    ,  // c1\n"
-     "       // c2\n"
-     "       // c3\n"
-     "    arg2  // c1\n"
-     "    // c2\n"
-     "    // c3\n"
-     ")  // c1\n"
-     "   // c2\n"
-     "   // c3\n"
-     ";  // c1\n"
-     "   // c2\n"
-     "   // c3\n"},
-    {"module indent();\n"
-     "   reg     a;\n"
-     "   reg [32:0] b;\n"
-     "   wire    c;\n"
-     "   wire    d = e ? kFoo : kBar;\n"
-     "endmodule\n",
-     "module indent ();\n"
-     "  reg         a;\n"
-     "  reg  [32:0] b;\n"
-     "  wire        c;\n"
-     "  wire        d = e ? kFoo : kBar;\n"
-     "endmodule\n"},
-
-    {"class C; T1 b; logic [$] a; T1 [$] c; endclass\n",
-     "class C;\n"
-     "  T1        b;\n"
-     "  logic [$] a;\n"
-     "  T1    [$] c;\n"
-     "endclass\n"},
-    {"class C;\n"
-     "  T1 b; //test\n"
-     "  logic [$] a; //test\n"
-     "  T1    [$] c; //test\n"
-     "endclass\n",
-     "class C;\n"
-     "  T1        b;  //test\n"
-     "  logic [$] a;  //test\n"
-     "  T1    [$] c;  //test\n"
-     "endclass\n"},
-    {"class C;\n"
-     "  T1\n"
-     "  b;\n"
-     "  logic\n"
-     "  [$]\n"
-     "  a;\n"
-     "  T1\n"
-     "  [$]\n"
-     "  c;\n"
-     "endclass\n",
-     "class C;\n"
-     "  T1        b;\n"
-     "  logic [$] a;\n"
-     "  T1    [$] c;\n"
-     "endclass\n"},
-    {"class C;\n"
-     "  logic/*t*/ [0 : 1] /*t*/\n"
-     "  a;/*t*/\n"
-     "  T1/*t*/[0 : 1]/*t*/\n"
-     "  c;/*t*/\n"
-     "endclass\n",
-     "class C;\n"
-     "  logic/*t*/ [0 : 1]  /*t*/ a;  /*t*/\n"
-     "  T1/*t*/    [0 : 1]  /*t*/ c;  /*t*/\n"
-     "endclass\n"},
-    {"always @(*/*t*/) begin\n"
-     "end\n",
-     "always @(*  /*t*/) begin\n"
-     "end\n"},
-    {"always @(/*t*/*) begin\n"
-     "end\n",
-     "always @(  /*t*/ *) begin\n"
-     "end\n"},
-    {"always @(/*t*/*/*t*/) begin\n"
-     "end\n",
-     "always @(  /*t*/ *  /*t*/) begin\n"
-     "end\n"},
-    {"always @(*) begin\n"
-     "end\n",
-     "always @(*) begin\n"
-     "end\n"},
-    {"always @(* ) begin\n"
-     "end\n",
-     "always @(*) begin\n"
-     "end\n"},
-    {"always @( *) begin\n"
-     "end\n",
-     "always @(*) begin\n"
-     "end\n"},
-    {"always @( * ) begin\n"
-     "end\n",
-     "always @(*) begin\n"
-     "end\n"},
-    {"always @(  /*t*/  *   /*t*/    ) begin\n"
-     "end\n",
-     "always @(  /*t*/ *  /*t*/) begin\n"
-     "end\n"},
-    {
-        // Don't touch verilog_format:off region #1538
-        R"(
-module testcode;
-  // verilog_format: off
-  assign a = b
-           & c;
-  // verilog_format: on
-      assign e = d;
-endmodule
-)",
-        R"(
-module testcode;
-  // verilog_format: off
-  assign a = b
-           & c;
-  // verilog_format: on
-  assign e = d;
-endmodule
-)",
-
-    },
-
-    // -----------------------------------------------------------------
 };
 
-// Tests that formatter produces expected results, end-to-end.
-TEST(FormatterEndToEndTest, VerilogFormatTest) {
-  // Use a fixed style.
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  for (const auto &test_case : kFormatterTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    // Require these test cases to be valid.
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-TEST(FormatterEndToEndTest, AutoInferAlignment) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {"", ""},
-      {"\n", "\n"},
-      {"class  cc ;\n"
-       "endclass:cc\n",
-       "class cc;\n"
-       "endclass : cc\n"},
-
-      // module port declarations
-      {"module pd(\n"
-       "input wire foo,\n"
-       "output reg bar\n"
-       ");\n"
-       "endmodule:pd\n",
-       "module pd (\n"
-       "    input  wire foo,\n"  // flush-left vs. align are similar enough,
-       "    output reg  bar\n"   // so automatic policy will align.
-       ");\n"
-       "endmodule : pd\n"},
-      {"module pd(\n"
-       "input  foo_pkg::baz_t foo,\n"
-       "output reg  bar\n"
-       ");\n"
-       "endmodule:pd\n",
-       "module pd (\n"
-       "    input foo_pkg::baz_t foo,\n"  // alignment would add too many spaces
-       "    output reg bar\n"             // so infer intent to flush-left.
-       ");\n"
-       "endmodule : pd\n"},
-      {"module pd(\n"
-       "input  foo_pkg::baz_t foo,\n"
-       "output     reg  bar\n"  // user injects 4 excess spaces here ...
-       ");\n"
-       "endmodule:pd\n",
-       "module pd (\n"
-       "    input  foo_pkg::baz_t foo,\n"
-       "    output reg            bar\n"  // ... and triggers alignment.
-       ");\n"
-       "endmodule : pd\n"},
-      {"module pd(\n"
-       "`ifdef FAA\n"  // inside preprocessing conditional
-       "input  baaaz_t foo,\n"
-       "output reg      bar\n"  // user injects 4 excess spaces here ...
-       "`endif\n"
-       ");\n"
-       "endmodule:pd\n",
-       "module pd (\n"
-       "`ifdef FAA\n"
-       "    input  baaaz_t foo,\n"
-       "    output reg     bar\n"  // ... and triggers alignment.
-       "`endif\n"
-       ");\n"
-       "endmodule : pd\n"},
-      {"module pd(\n"
-       "`ifdef FAA\n"  // inside preprocessing conditional
-       "input  baaaz_t foo,\n"
-       "`else\n"
-       "output reg      bar\n"  // user injects 4 excess spaces here ...
-       "`endif\n"
-       ");\n"
-       "endmodule:pd\n",
-       "module pd (\n"
-       "`ifdef FAA\n"
-       "    input  baaaz_t foo,\n"  // aligned
-       "`else\n"                    // aligned across preprocessing directives
-       "    output reg     bar\n"   // ... and triggers alignment.
-       "`endif\n"
-       ");\n"
-       "endmodule : pd\n"},
-      {"module pd(\n"
-       "input logic [31:0] bus,\n"
-       "input logic [7:0] bus2,\n"
-       "`ifdef FAA\n"  // inside preprocessing conditional
-       "input  baaaz_t foo,\n"
-       "`else\n"
-       "output reg      bar,\n"  // user injects 4 excess spaces here ...
-       "`endif\n"
-       "output out_t zout1,\n"
-       "output out_t zout2\n"
-       ");\n"
-       "endmodule:pd\n",
-       "module pd (\n"
-       "    input  logic   [31:0] bus,\n"  // treated as one large group
-       "    input  logic   [ 7:0] bus2,\n"
-       "`ifdef FAA\n"
-       "    input  baaaz_t        foo,\n"  // aligned
-       "`else\n"  // aligned across preprocessing directives
-       "    output reg            bar,\n"  // ... and triggers alignment.
-       "`endif\n"
-       "    output out_t          zout1,\n"
-       "    output out_t          zout2\n"
-       ");\n"
-       "endmodule : pd\n"},
-      {"module pd(\n"
-       "input logic [7:0] bus2,\n"
-       "`ifndef FAA\n"  // inside preprocessing conditional
-       "input logic [31:0] bus,\n"
-       "input  baaaz_t foo,\n"
-       "`elsif BLA\n"
-       "output reg      bar,\n"  // user injects 4 excess spaces here ...
-       "output out_t zout1,\n"
-       "`endif\n"
-       "output out_t zout2\n"
-       ");\n"
-       "endmodule:pd\n",
-       "module pd (\n"
-       "    input  logic   [ 7:0] bus2,\n"
-       "`ifndef FAA\n"
-       "    input  logic   [31:0] bus,\n"  // treated as one large group
-       "    input  baaaz_t        foo,\n"  // aligned
-       "`elsif BLA\n"  // aligned across preprocessing directives
-       "    output reg            bar,\n"  // ... and triggers alignment.
-       "    output out_t          zout1,\n"
-       "`endif\n"
-       "    output out_t          zout2\n"
-       ");\n"
-       "endmodule : pd\n"},
-      {// data declaration and net declaration in ports
-       "module m(\n"
-       "logic [x:y]a    ,\n"    // packed dimensions, induce alignment
-       "wire [pp:qq] [e:f]b\n"  // packed dimensions, 2D
-       ") ;\n"
-       "endmodule\n",
-       "module m (\n"
-       "    logic [  x:y]      a,\n"
-       "    wire  [pp:qq][e:f] b\n"
-       ");\n"
-       "endmodule\n"},
-      {// used-defined data declarations in ports
-       "module m(\n"
-       "a::bb [x:y]a    ,\n"       // packed dimensions, induce alignment
-       "c#(d,e) [pp:qq] [e:f]b\n"  // packed dimensions, 2D
-       ") ;\n"
-       "endmodule\n",
-       "module m (\n"
-       "    a::bb    [  x:y]      a,\n"
-       "    c#(d, e) [pp:qq][e:f] b\n"
-       ");\n"
-       "endmodule\n"},
-
-      // named parameter arguments
-      {"module  mm ;\n"
-       "foo #(\n"
-       ".a(a),\n"
-       ".bb(bb)\n"
-       ")bar( );\n"
-       "endmodule:mm\n",
-       "module mm;\n"
-       "  foo #(\n"
-       "      .a (a),\n"  // align doesn't add too many spaces, so align
-       "      .bb(bb)\n"
-       "  ) bar ();\n"
-       "endmodule : mm\n"},
-      {"module  mm ;\n"
-       "foo #(\n"
-       ".a(a),\n"
-       ".bbcccc(bb)\n"
-       ")bar( );\n"
-       "endmodule:mm\n",
-       "module mm;\n"
-       "  foo #(\n"
-       "      .a(a),\n"  // align would add too many spaces, so flush-left
-       "      .bbcccc(bb)\n"
-       "  ) bar ();\n"
-       "endmodule : mm\n"},
-      {"module  mm ;\n"
-       "foo #(\n"
-       ".a(a    ),\n"  // user manually triggers alignment with excess spaces
-       ".bbcccc(bb)\n"
-       ")bar( );\n"
-       "endmodule:mm\n",
-       "module mm;\n"
-       "  foo #(\n"
-       "      .a     (a),\n"  // induced alignment
-       "      .bbcccc(bb)\n"
-       "  ) bar ();\n"
-       "endmodule : mm\n"},
-      {"module  mm ;\n"
-       "foo #(\n"
-       "//c1\n"        // with comments (indented but not aligned)
-       ".a(a    ),\n"  // user manually triggers alignment with excess spaces
-       "//c2\n"
-       ".bbcccc(bb)\n"
-       "//c3\n"
-       ")bar( );\n"
-       "endmodule:mm\n",
-       "module mm;\n"
-       "  foo #(\n"
-       "      //c1\n"
-       "      .a     (a),\n"  // induced alignment
-       "      //c2\n"
-       "      .bbcccc(bb)\n"
-       "      //c3\n"
-       "  ) bar ();\n"
-       "endmodule : mm\n"},
-      {"module  mm ;\n"
-       "foo #(\n"
-       ".a( (1     +2)),\n"  // excess spaces, testing extra parentheses
-       ".bbcccc((c*d)+(e*f))\n"
-       ")bar( );\n"
-       "endmodule:mm\n",
-       "module mm;\n"
-       "  foo #(\n"
-       "      .a     ((1 + 2)),\n"  // induced alignment
-       "      .bbcccc((c * d) + (e * f))\n"
-       "  ) bar ();\n"
-       "endmodule : mm\n"},
-
-      // named port connections
-      {"module  mm ;\n"
-       "foo bar(\n"
-       ".a(a),\n"
-       ".bb(bb)\n"
-       ");\n"
-       "endmodule:mm\n",
-       "module mm;\n"
-       "  foo bar (\n"
-       "      .a (a),\n"  // align doesn't add too many spaces, so align
-       "      .bb(bb)\n"
-       "  );\n"
-       "endmodule : mm\n"},
-      {"module  mm ;\n"
-       "foo bar(\n"
-       ".a(a),\n"
-       ".bbbbbb(bb)\n"
-       ");\n"
-       "endmodule:mm\n",
-       "module mm;\n"
-       "  foo bar (\n"
-       "      .a(a),\n"  // align would add too many spaces, so flush-left
-       "      .bbbbbb(bb)\n"
-       "  );\n"
-       "endmodule : mm\n"},
-      {"module  mm ;\n"
-       "foo bar(\n"
-       ".a    (a),\n"  // user manually triggers alignment with excess spaces
-       ".bbbbbb(bb)\n"
-       ");\n"
-       "endmodule:mm\n",
-       "module mm;\n"
-       "  foo bar (\n"
-       "      .a     (a),\n"  // alignment fixed
-       "      .bbbbbb(bb)\n"
-       "  );\n"
-       "endmodule : mm\n"},
-
-      // net variable declarations
-      {"module nn;\n"
-       "wire wwwww;\n"
-       "logic lll;\n"
-       "endmodule : nn\n",
-       "module nn;\n"
-       "  wire  wwwww;\n"  // alignment adds few spaces, so align
-       "  logic lll;\n"
-       "endmodule : nn\n"},
-      {"module nn;\n"
-       "wire wwwww;\n"
-       "foo_pkg::baz_t lll;\n"
-       "endmodule : nn\n",
-       "module nn;\n"
-       "  wire wwwww;\n"  // alignment adds too many spaces, so flush-left
-       "  foo_pkg::baz_t lll;\n"
-       "endmodule : nn\n"},
-      {"module nn;\n"
-       "wire     wwwww;\n"  // user injects spaces to trigger alignment
-       "foo_pkg::baz_t lll;\n"
-       "endmodule : nn\n",
-       "module nn;\n"
-       "  wire           wwwww;\n"  // ... and gets alignment
-       "  foo_pkg::baz_t lll;\n"
-       "endmodule : nn\n"},
-      {// data/net declarations as generate items (conditional)
-       "module nn;\n"
-       "if (cc)begin:fff\n"
-       "wire wwwww;\n"
-       "logic lll;\n"
-       "end:fff\n"
-       "endmodule : nn\n",
-       "module nn;\n"
-       "  if (cc) begin : fff\n"
-       "    wire  wwwww;\n"  // alignment adds few spaces, so align
-       "    logic lll;\n"
-       "  end : fff\n"
-       "endmodule : nn\n"},
-
-      // continuous assignments
-      {"module m_assign;\n"
-       "assign foo = 1'b1;\n"  // alignment adds few spaces, so align
-       "assign baar = 1'b0;\n"
-       "endmodule\n",
-       "module m_assign;\n"
-       "  assign foo  = 1'b1;\n"  // aligned
-       "  assign baar = 1'b0;\n"
-       "endmodule\n"},
-      {"module m_assign;\n"
-       "assign foo  =  1'b1;\n"  // alignment adds too many spaces, so
-                                 // flush-left
-       "assign baaaaaar = 1'b0;\n"
-       "endmodule\n",
-       "module m_assign;\n"
-       "  assign foo = 1'b1;\n"  // flush-left
-       "  assign baaaaaar = 1'b0;\n"
-       "endmodule\n"},
-      {"module m_assign;\n"
-       "assign foo  =     1'b1;\n"  // induce alignment with excess spaces
-       "assign baaaaaar = 1'b0;\n"
-       "endmodule\n",
-       "module m_assign;\n"
-       "  assign foo      = 1'b1;\n"  // aligned
-       "  assign baaaaaar = 1'b0;\n"
-       "endmodule\n"},
-      {// currently, does not assign across ifdefs
-       "module m_assign;\n"
-       "`ifdef FOO\n"
-       "assign foo  =     1'b1;\n"  // induce alignment with excess spaces
-       "assign baaaaaar = 1'b0;\n"
-       "`else\n"
-       "assign zooo = 2'b11;\n"
-       "assign yoo = 2'b00;\n"
-       "`endif\n"
-       "endmodule\n",
-       "module m_assign;\n"
-       "`ifdef FOO\n"
-       "  assign foo      = 1'b1;\n"  // aligned
-       "  assign baaaaaar = 1'b0;\n"
-       "`else\n"                   // aligned separately above/below
-       "  assign zooo = 2'b11;\n"  // aligned
-       "  assign yoo  = 2'b00;\n"  // aligned
-       "`endif\n"
-       "endmodule\n"},
-      {// mixed net declaration and continuous assignment, both groups aligned
-       "module m_assign;\n"
-       "wire     wwwww;\n"  // induce alignment
-       "foo_pkg::baz_t lll;\n"
-       "assign foo  =     1'b1;\n"  // induce alignment
-       "assign baaaaaar = 1'b0;\n"
-       "endmodule\n",
-       "module m_assign;\n"
-       "  wire           wwwww;\n"  // aligned
-       "  foo_pkg::baz_t lll;\n"
-       "  assign foo      = 1'b1;\n"  // aligned
-       "  assign baaaaaar = 1'b0;\n"
-       "endmodule\n"},
-      {// continuous assignments as generate items (conditional)
-       "module m_assign;\n"
-       "if (xy) begin\n"
-       "assign foo  =  1'b0;\n"  // align: adds few spaces
-       "assign baaar = 1'b1;\n"
-       "end else begin\n"
-       "assign goo  =      1'b1;\n"  // induce alignment with excess spaces
-       "assign zaaaaaar = 1'b0;\n"
-       "end\n"
-       "endmodule\n",
-       "module m_assign;\n"
-       "  if (xy) begin\n"
-       "    assign foo   = 1'b0;\n"  // aligned
-       "    assign baaar = 1'b1;\n"
-       "  end else begin\n"
-       "    assign goo      = 1'b1;\n"  // induce alignment with excess spaces
-       "    assign zaaaaaar = 1'b0;\n"
-       "  end\n"
-       "endmodule\n"},
-      {// continuous assignments as generate items (loop)
-       "module m_assign;\n"
-       "for(genvar i=0; i<k; ++i ) begin\n"
-       "assign foo  =  1'b0;\n"  // align: adds few spaces
-       "assign baaar = 1'b1;\n"
-       "end\n"
-       "endmodule\n",
-       "module m_assign;\n"
-       "  for (genvar i = 0; i < k; ++i) begin\n"
-       "    assign foo   = 1'b0;\n"  // aligned
-       "    assign baaar = 1'b1;\n"
-       "  end\n"
-       "endmodule\n"},
-      {// continuous assignments as generate items (case)
-       "module m_assign;\n"
-       "case (c)\n"
-       "jk:begin\n"
-       "assign foo  =  1'b0;\n"  // align: adds few spaces
-       "assign baaar = 1'b1;\n"
-       "end\n"
-       "endcase\n"
-       "endmodule\n",
-       "module m_assign;\n"
-       "  case (c)\n"
-       "    jk: begin\n"
-       "      assign foo   = 1'b0;\n"  // aligned
-       "      assign baaar = 1'b1;\n"
-       "    end\n"
-       "  endcase\n"
-       "endmodule\n"},
-      {// continuous assignment with comment
-       "module m;\n"
-       "// comment1\n"
-       "assign aaaaa = (bbbbb != ccccc) &\n"
-       "// comment2\n"
-       "(ddddd | (eeeee & ffffff));\n"
-       "endmodule\n",
-       "module m;\n"
-       "  // comment1\n"
-       "  assign aaaaa = (bbbbb != ccccc) &\n"
-       "      // comment2\n"
-       "      (ddddd | (eeeee & ffffff));\n"
-       "endmodule\n"},
-
-      // net/variable assignments: blocking and nonblocking
-      {"module  ma ;\n"
-       "initial  begin\n"
-       "aa = b;\n"
-       "c = 1'b0;\n"
-       "end\n"
-       "endmodule\n",
-       "module ma;\n"
-       "  initial begin\n"
-       "    aa = b;\n"
-       "    c  = 1'b0;\n"  // only one space to align
-       "  end\n"
-       "endmodule\n"},
-      {"function void  fa ;\n"
-       "c = 1'b0;\n"
-       "aa = b;\n"
-       "endfunction\n",
-       "function void fa;\n"
-       "  c  = 1'b0;\n"  // only one space to align
-       "  aa = b;\n"
-       "endfunction\n"},
-      {"task  ta ; \n"
-       "aa =  b;\n"
-       "c = 1'b0;\n"
-       "endtask\n",
-       "task ta;\n"
-       "  aa = b;\n"
-       "  c  = 1'b0;\n"  // only one space to align
-       "endtask\n"},
-      {"module  ma ;\n"
-       "always@( posedge clk) begin\n"
-       "aaa <= b;\n"
-       "c <= 1'b0;\n"
-       "end\n"
-       "endmodule\n",
-       "module ma;\n"
-       "  always @(posedge clk) begin\n"
-       "    aaa <= b;\n"
-       "    c   <= 1'b0;\n"  // only two spaces to align
-       "  end\n"
-       "endmodule\n"},
-      {"function int  fa ;\n"
-       "c <= 1'b0;\n"
-       "aa <= b;\n"
-       "return 0 ;\n"
-       "endfunction\n",
-       "function int fa;\n"
-       "  c  <= 1'b0;\n"  // only one space to align
-       "  aa <= b;\n"
-       "  return 0;\n"
-       "endfunction\n"},
-      {"task  ta ; \n"
-       "$display (\"hello\" );\n"
-       "aa <=  b;\n"
-       "c <= 1'b0;\n"
-       "endtask\n",
-       "task ta;\n"
-       "  $display(\"hello\");\n"
-       "  aa <= b;\n"
-       "  c  <= 1'b0;\n"  // only one space to align
-       "endtask\n"},
-      {// mixed blocking and nonblocking assignments
-       "module  ma ;\n"
-       "always@( posedge clk) begin\n"
-       "aaaaa  = b;\n"
-       "ccc  = 1'b0;\n"
-       "aaa <= b;\n"
-       "c <= 1'b0;\n"
-       "end\n"
-       "endmodule\n",
-       "module ma;\n"
-       "  always @(posedge clk) begin\n"
-       "    aaaaa = b;\n"
-       "    ccc   = 1'b0;\n"  // only two spaces to align
-       "    aaa <= b;\n"
-       "    c   <= 1'b0;\n"  // only two spaces to align (separate group)
-       "  end\n"
-       "endmodule\n"},
-      {"task  ta ; \n"
-       "aa <=  b;\n"
-       "c <= 1'b0;\n"
-       "$display (\"hello\" );\n"  // separates above/below alignment groups
-       "zzaa <=  b;\n"
-       "zzc <= 1'b0;\n"
-       "endtask\n",
-       "task ta;\n"
-       "  aa <= b;\n"
-       "  c  <= 1'b0;\n"  // only one space to align
-       "  $display(\"hello\");\n"
-       "  zzaa <= b;\n"
-       "  zzc  <= 1'b0;\n"  // only one space to align
-       "endtask\n"},
-      {"task  ta ; \n"
-       "$display (\"hello\" );\n"
-       "aaaaa <=  b;\n"
-       "c <= 1'b0;\n"  // need too many spaces to align
-       "endtask\n",
-       "task ta;\n"
-       "  $display(\"hello\");\n"
-       "  aaaaa <= b;\n"
-       "  c <= 1'b0;\n"  // so keep flush-left
-       "endtask\n"},
-      {"function void  fa ; \n"
-       "$display (\"hello\" );\n"
-       "aaaaa =  b;\n"
-       "c = 1'b0;\n"  // need too many spaces to align
-       "endfunction\n",
-       "function void fa;\n"
-       "  $display(\"hello\");\n"
-       "  aaaaa = b;\n"
-       "  c = 1'b0;\n"  // so keep flush-left
-       "endfunction\n"},
-      {"module  ma ;\n"
-       "always@( posedge clk) begin\n"
-       "aaaxx <= b;\n"
-       "c <= 1'b0;\n"  // need too many spaces to align
-       "end\n"
-       "endmodule\n",
-       "module ma;\n"
-       "  always @(posedge clk) begin\n"
-       "    aaaxx <= b;\n"
-       "    c <= 1'b0;\n"  // so keep flush-left
-       "  end\n"
-       "endmodule\n"},
-      {"module  ma ;\n"
-       "always@( posedge clk) begin\n"
-       "aaaxx <= b    ;\n"  // inject 4 spaces to induce alignment
-       "c <= 1'b0;\n"
-       "end\n"
-       "endmodule\n",
-       "module ma;\n"
-       "  always @(posedge clk) begin\n"
-       "    aaaxx <= b;\n"
-       "    c     <= 1'b0;\n"  // induced alignment
-       "  end\n"
-       "endmodule\n"},
-      {"module  ma ;\n"
-       "always@( posedge clk) begin\n"
-       "aaaxx <= b    ;\n"  // inject 4 spaces to induce alignment
-       "//comment\n"
-       "c <= 1'b0;\n"
-       "end\n"
-       "endmodule\n",
-       "module ma;\n"
-       "  always @(posedge clk) begin\n"
-       "    aaaxx <= b;\n"
-       "    //comment\n"       // ignored within alignment group
-       "    c     <= 1'b0;\n"  // induced alignment
-       "  end\n"
-       "endmodule\n"},
-
-      // local variable declarations as statements
-      {"task tt ;\n"
-       "int foo;\n"  // only 2 spaces needed to align
-       "bar_t baz;\n"
-       "endtask\n",
-       "task tt;\n"
-       "  int   foo;\n"  // aligned
-       "  bar_t baz;\n"
-       "endtask\n"},
-      {"function ff ;\n"
-       "bar_t baz;\n"
-       "int foo;\n"  // only 2 spaces needed to align
-       "endfunction\n",
-       "function ff;\n"
-       "  bar_t baz;\n"
-       "  int   foo;\n"  // aligned
-       "endfunction\n"},
-      {"task tt ;\n"
-       "int  foo;\n"  // too many spaces needed to align
-       "baaaar_t baz;\n"
-       "endtask\n",
-       "task tt;\n"
-       "  int foo;\n"  // so flush-left
-       "  baaaar_t baz;\n"
-       "endtask\n"},
-      {"function ff ;\n"
-       "baaaar_t baz;\n"
-       "int  foo;\n"  // too many spaces needed to align
-       "endfunction\n",
-       "function ff;\n"
-       "  baaaar_t baz;\n"
-       "  int foo;\n"  // so flush-left
-       "endfunction\n"},
-      {"task tt ;\n"
-       "int        foo;\n"  // injected spaces to induce alignment
-       "baaaar_t baz;\n"
-       "endtask\n",
-       "task tt;\n"
-       "  int      foo;\n"  // aligned
-       "  baaaar_t baz;\n"
-       "endtask\n"},
-      {"function ff ;\n"
-       "baaaar_t baz    ;\n"  // injected spaces to induce alignment
-       "int  foo;\n"
-       "endfunction\n",
-       "function ff;\n"
-       "  baaaar_t baz;\n"
-       "  int      foo;\n"  // so aligned
-       "endfunction\n"},
-
-      // formal parameters
-      {"module pp #(\n"
-       "int W,\n"
-       "type T\n"
-       ") ();\n"
-       "endmodule : pp\n",
-       "module pp #(\n"
-       "    int  W,\n"  // alignment adds few spaces, so do it
-       "    type T\n"
-       ") ();\n"
-       "endmodule : pp\n"},
-      {"module pp #(\n"
-       "int W,\n"
-       "int[xx:yy] T\n"
-       ") ();\n"
-       "endmodule : pp\n",
-       "module pp #(\n"
-       "    int W,\n"  // alignment adds many spaces, so flush-left
-       "    int [xx:yy] T\n"
-       ") ();\n"
-       "endmodule : pp\n"},
-      {"module pp #(\n"
-       "int W,\n"
-       "int[xx:yy]     T\n"  // user injected spaces intentionally
-       ") ();\n"
-       "endmodule : pp\n",
-       "module pp #(\n"
-       "    int         W,\n"  // ... trigger alignment
-       "    int [xx:yy] T\n"
-       ") ();\n"
-       "endmodule : pp\n"},
-
-      // class member variables
-      {"class  cc ;\n"
-       "int my_int;\n"
-       "bar_t my_bar;\n"
-       "endclass:cc\n",
-       "class cc;\n"
-       "  int   my_int;\n"  // align doesn't add too many spaces, so align
-       "  bar_t my_bar;\n"
-       "endclass : cc\n"},
-      {"class  cc ;\n"
-       "int   my_int;\n"
-       "foo_pkg::bar_t my_bar;\n"
-       "endclass:cc\n",
-       "class cc;\n"
-       "  int my_int;\n"  // align would add too many spaces, so flush-left
-       "  foo_pkg::bar_t my_bar;\n"
-       "endclass : cc\n"},
-      {"class  cc ;\n"
-       "int     my_int;\n"  // intentional excessive spaces, trigger alignment
-       "foo_pkg::bar_t my_bar;\n"
-       "endclass:cc\n",
-       "class cc;\n"
-       "  int            my_int;\n"
-       "  foo_pkg::bar_t my_bar;\n"
-       "endclass : cc\n"},
-      {"class  cc ;\n"
-       "int    my_int;\n"  // unable to infer user's intent, so preserve
-       "foo_pkg::bar_t  my_bar;\n"
-       "endclass:cc\n",
-       "class cc;\n"
-       "  int    my_int;\n"  // ... but still indent
-       "  foo_pkg::bar_t  my_bar;\n"
-       "endclass : cc\n"},
-
-      // case item test cases
-      {// small difference between flush-left and align, so align
-       "function f; case (x)kZZZZ  :if( b )break; default :return 2;"
-       "endcase endfunction\n",
-       "function f;\n"
-       "  case (x)\n"
-       "    kZZZZ:   if (b) break;\n"  // aligned, only adds 2 spaces
-       "    default: return 2;\n"
-       "  endcase\n"
-       "endfunction\n"},
-      {// small error relative to flush-left, so flush-left
-       "function f; case (x)kZ  :if( b )break; default :return 2;"
-       "endcase endfunction\n",
-       "function f;\n"
-       "  case (x)\n"
-       "    kZ: if (b) break;\n"  // flush-left
-       "    default: return 2;\n"
-       "  endcase\n"
-       "endfunction\n"},
-      {// intentional spacing error (delta=4) induces alignment
-       "function f; case (x)kZ  :if( b )break; default    :return 2;"
-       "endcase endfunction\n",
-       "function f;\n"
-       "  case (x)\n"
-       "    kZ:      if (b) break;\n"
-       "    default: return 2;\n"
-       "  endcase\n"
-       "endfunction\n"},
-      {// induced alignment, with ignored comments
-       "function f; case (x)kZ  :if( b )break; \n//c1\n kXX: g = f; "
-       "\n//c2\ndefault    :return 2;"
-       "endcase endfunction\n",
-       "function f;\n"
-       "  case (x)\n"
-       "    kZ:      if (b) break;\n"
-       "    //c1\n"
-       "    kXX:     g = f;\n"
-       "    //c2\n"
-       "    default: return 2;\n"
-       "  endcase\n"
-       "endfunction\n"},
-      {// induced alignment, ignore multiline case item in the middle
-       "function f; case (x)"
-       "kZ  :if( b )break; "
-       "kYY    :return 2;"          // excess spaces induce alignment
-       "    kXXXXXXXXX: begin end"  // multi-line, ignored
-       "    kWWWWW: cc = 23;\n"
-       "    kVVV: cd = 24;\n"
-       "endcase endfunction\n",
-       "function f;\n"
-       "  case (x)\n"
-       "    kZ:     if (b) break;\n"
-       "    kYY:    return 2;\n"
-       "    kXXXXXXXXX: begin\n"  // separates above/below groups
-       "    end\n"
-       "    kWWWWW: cc = 23;\n"
-       "    kVVV:   cd = 24;\n"  // aligned
-       "  endcase\n"
-       "endfunction\n"},
-      {// induced alignment, ignore multiline case item in the middle
-       "function f; case (x)"
-       "kZ  :if( b )break; "
-       "kYY    :return 2;"               // excess spaces induce alignment
-       "    kXXXXXXXXX: if(w)begin end"  // multi-line, ignored
-       "    kWWWWW: cc = 23;\n"
-       "    kVVV: cd = 24;\n"
-       "endcase endfunction\n",
-       "function f;\n"
-       "  case (x)\n"
-       "    kZ:     if (b) break;\n"
-       "    kYY:    return 2;\n"
-       "    kXXXXXXXXX:\n"   // TODO(fangism): allow this to merge with if()
-                             // else indent the following two lines
-       "    if (w) begin\n"  // separates above/below groups
-       "    end\n"
-       "    kWWWWW: cc = 23;\n"
-       "    kVVV:   cd = 24;\n"  // aligned
-       "  endcase\n"
-       "endfunction\n"},
-      {// induced alignment, ignore multiline case item in the middle
-       "task t; case (x)"
-       "kZ  :if( b )break; "
-       "kYY    :return 2;"           // excess spaces induce alignment
-       "    kXXXXXXXXX: fork  join"  // multi-line, ignored
-       "    kWWWWW: cc = 23;\n"
-       "    kVVV: cd = 24;\n"
-       "endcase endtask\n",
-       "task t;\n"
-       "  case (x)\n"
-       "    kZ:     if (b) break;\n"
-       "    kYY:    return 2;\n"
-       "    kXXXXXXXXX:\n"  // TODO(fangism): allow this to merge with fork
-                            // else indent the following two lines
-       "    fork\n"         // separates above/below groups
-       "    join\n"
-       "    kWWWWW: cc = 23;\n"
-       "    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"},
-      {// case-generate: align would add few spaces, so align
-       "module mc ; case (x)kZ  : gg h(); kXYY :j kk();"
-       "endcase endmodule\n",
-       "module mc;\n"
-       "  case (x)\n"
-       "    kZ:   gg h ();\n"  // align
-       "    kXYY: j kk ();\n"
-       "  endcase\n"
-       "endmodule\n"},
-      {// case-generate + comment: align would add few spaces, so align
-       "module mc ; case (x)kZ  : gg h(); \n//c1\n kXYY :j kk();"
-       "endcase endmodule\n",
-       "module mc;\n"
-       "  case (x)\n"
-       "    kZ:   gg h ();\n"  // align
-       "    //c1\n"
-       "    kXYY: j kk ();\n"
-       "  endcase\n"
-       "endmodule\n"},
-      {// case-generate: align would add too many space, so flush-left
-       "module mc ; case (x)kZ  : gg h(); kXYYYY :j kk();"
-       "endcase endmodule\n",
-       "module mc;\n"
-       "  case (x)\n"
-       "    kZ: gg h ();\n"  // flush-left
-       "    kXYYYY: j kk ();\n"
-       "  endcase\n"
-       "endmodule\n"},
-      {// case-generate: inject spaces to induce alignment
-       "module mc ; case (x)kZ  : gg h(); kXYYYY :     j kk();"
-       "endcase endmodule\n",
-       "module mc;\n"
-       "  case (x)\n"
-       "    kZ:     gg h ();\n"  // align
-       "    kXYYYY: j kk ();\n"
-       "  endcase\n"
-       "endmodule\n"},
-      {// randcase: align (small difference from flush-left)
-       "task trc  ;randcase 10: x = 1; 1: x = 3; endcase endtask",
-       "task trc;\n"
-       "  randcase\n"
-       "    10: x = 1;\n"
-       "    1:  x = 3;\n"  // aligned
-       "  endcase\n"
-       "endtask\n"},
-      {// randcase: inferred flush-left
-       "task trc  ;randcase 10000: x = 1; 1: x = 3; endcase endtask",
-       "task trc;\n"
-       "  randcase\n"
-       "    10000: x = 1;\n"
-       "    1: x = 3;\n"
-       "  endcase\n"
-       "endtask\n"},
-      {// randcase: induce alignment
-       "task trc  ;randcase 10000: x = 1    ; 1: x = 3; endcase endtask",
-       "task trc;\n"
-       "  randcase\n"
-       "    10000: x = 1;\n"
-       "    1:     x = 3;\n"  // aligned
-       "  endcase\n"
-       "endtask\n"},
-
-      // distributions
-      {"class foo;\n"
-       "constraint c { "
-       "timer_enable dist {\n"
-       "8'hfe :=  9 , \n"
-       "12'hfff  := 1 }; "
-       "} endclass\n",
-       "class foo;\n"
-       "  constraint c {\n"
-       "    timer_enable dist {\n"
-       "      8'hfe   := 9,\n"  // only two spaces needed to align
-       "      12'hfff := 1\n"   // so align
-       "    };\n"
-       "  }\n"
-       "endclass\n"},
-      {"class foo;\n"
-       "constraint c { "
-       "timer_enable dist {\n"
-       "[ 8'h0 : 8'hfe ] :/  9 , \n"
-       "8'hff  :/ 1 }; "  // takes many spaces to align this, so...
-       "} endclass\n",
-       "class foo;\n"
-       "  constraint c {\n"
-       "    timer_enable dist {\n"
-       "      [8'h0 : 8'hfe] :/ 9,\n"
-       "      8'hff :/ 1\n"  // flush-left
-       "    };\n"
-       "  }\n"
-       "endclass\n"},
-      {"class foo;\n"
-       "constraint c { "
-       "timer_enable dist {\n"
-       "[ 8'h0 : 8'hfe ] :/  9 , \n"
-       "8'hff  :/     1 }; "  // inject excess spaces to trigger alignment
-       "} endclass\n",
-       "class foo;\n"
-       "  constraint c {\n"
-       "    timer_enable dist {\n"
-       "      [8'h0 : 8'hfe] :/ 9,\n"
-       "      8'hff          :/ 1\n"  // aligned
-       "    };\n"
-       "  }\n"
-       "endclass\n"},
-      {"class foo;\n"
-       "constraint c { "
-       "timer_enable dist {\n"
-       "//comment1\n"
-       "[ 8'h0 : 8'hfe ] :/  9 , \n"
-       "//comment2\n"
-       "8'hff  :/     1 \n"
-       "//comment3\n"
-       "}; "  // inject excess spaces to trigger alignment
-       "} endclass\n",
-       "class foo;\n"
-       "  constraint c {\n"
-       "    timer_enable dist {\n"
-       "      //comment1\n"
-       "      [8'h0 : 8'hfe] :/ 9,\n"
-       "      //comment2\n"           // align across comment
-       "      8'hff          :/ 1\n"  // aligned
-       "      //comment3\n"
-       "    };\n"
-       "  }\n"
-       "endclass\n"},
-      {"module foo ();\n"
-       "  always @(posedge bar) begin\n"
-       "    if (1==1) begin\n"
-       "      ham();\n"
-       "    end else if (2==2) begin\n"
-       "      jam();\n"
-       "    end else begin\n"
-       "      spam();\n"
-       "    end\n"
-       "  end\n"
-       "endmodule\n",
-       "module foo ();\n"
-       "  always @(posedge bar) begin\n"
-       "    if (1 == 1) begin\n"
-       "      ham();\n"
-       "    end else if (2 == 2) begin\n"
-       "      jam();\n"
-       "    end else begin\n"
-       "      spam();\n"
-       "    end\n"
-       "  end\n"
-       "endmodule\n"},
-  };
-  // Use a fixed style.
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  // Override some settings to test auto-inferred alignment.
-  style.ApplyToAllAlignmentPolicies(AlignmentPolicy::kInferUserIntent);
-
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    // Require these test cases to be valid.
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}  // NOLINT(readability/fn_size)
-
-static constexpr FormatterTestCase kFormatterWideTestCases[] = {
-    // specify blocks
-    {"module  specify_tests ;\n"
-     "specify\n"  // empty list
-     "endspecify\n"
-     "endmodule",
-     "module specify_tests;\n"
-     "  specify\n"
-     "  endspecify\n"
-     "endmodule\n"},
-    {"module  specify_tests ;\n"
-     "specify\n"
-     "$recrem (posedge R, posedge C,\n"
-     "t1, t2);\n"
-     "endspecify\n"
-     "endmodule",
-     "module specify_tests;\n"
-     "  specify\n"
-     "    $recrem(posedge R, posedge C, t1, t2);\n"
-     "  endspecify\n"
-     "endmodule\n"},
-    {"module  specify_tests ;\n"
-     "specify\n"
-     "// TODO: add this\n"
-     "endspecify \n"
-     "endmodule",
-     "module specify_tests;\n"
-     "  specify\n"
-     "    // TODO: add this\n"
-     "  endspecify\n"
-     "endmodule\n"},
-    {"module  specify_tests ;\n"
-     "specify  \n"
-     "  //c1\n"
-     "$setup (  posedge A, posedge B,\n"
-     "t1);//c2\n"
-     " //c3\n"
-     "$hold (  posedge B , posedge A,t2);    //c4\n"
-     "\t//c5\n"
-     "endspecify\n"
-     "endmodule",
-     "module specify_tests;\n"
-     "  specify\n"
-     "    //c1\n"
-     "    $setup(posedge A, posedge B, t1);  //c2\n"
-     "    //c3\n"
-     "    $hold(posedge B, posedge A, t2);  //c4\n"
-     "    //c5\n"
-     "  endspecify\n"
-     "endmodule\n"},
-    {"module  specify_tests ;\n"
-     "specify  \n"
-     "$setup (  posedge A, posedge B,\n"
-     "t1);\n"
-     "$hold (  posedge B , posedge A,t2);\n"
-     "endspecify\n"
-     "endmodule",
-     "module specify_tests;\n"
-     "  specify\n"
-     "    $setup(posedge A, posedge B, t1);\n"
-     "    $hold(posedge B, posedge A, t2);\n"
-     "  endspecify\n"
-     "endmodule\n"},
-    {"module  specify_tests ;\n"
-     "specify  \n"
-     "  `ifdef CCC\n"
-     "$setup (  posedge A, posedge B,\n"
-     "t1);\n"
-     " `else\n"
-     "$hold (  posedge B , posedge A,t2);   \n"
-     "\t`endif\n"
-     "endspecify\n"
-     "endmodule",
-     "module specify_tests;\n"
-     "  specify\n"
-     "`ifdef CCC\n"
-     "    $setup(posedge A, posedge B, t1);\n"
-     "`else\n"
-     "    $hold(posedge B, posedge A, t2);\n"
-     "`endif\n"
-     "  endspecify\n"
-     "endmodule\n"},
-};
-
-// These tests just need a larger column limit to fit on one line.
-TEST(FormatterEndToEndTest, VerilogFormatWideTest) {
-  // Use a fixed style.
-  FormatStyle style;
-  style.column_limit = 60;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  for (const auto &test_case : kFormatterWideTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    // Require these test cases to be valid.
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-TEST(FormatterEndToEndTest, DisableModulePortDeclarations) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {"", ""},
-      {"\n", "\n"},
-      {"\n\n", "\n\n"},
-      {"module  m  ;\t\n"
-       "  endmodule\n",
-       "module m;\n"
-       "endmodule\n"},
-      {"module  m(   ) ;\n"
-       "  endmodule\n",
-       "module m ();\n"  // empty ports formatted compactly
-       "endmodule\n"},
-      {// for a single port, the alignment handler doesn't even consider it a
-       // group so it falls back to standard flush-left behavior.
-       "module  m   ( input     clk  )\t;\n"
-       "  endmodule\n",
-       "module m (\n"
-       "    input clk\n"
-       ");\n"
-       "endmodule\n"},
-      {// example with two ports
-       "module  m   (\n"
-       "input  clk,\n"
-       "output bar\n"
-       ")\t;\n"
-       "  endmodule\n",
-       "module m (\n"
-       "    input  clk,\n"  // indented, but internal pre-existing spacing
-                            // preserved
-       "    output bar\n"
-       ");\n"
-       "endmodule\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.port_declarations_alignment = verible::AlignmentPolicy::kPreserve;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    // Require these test cases to be valid.
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-TEST(FormatterEndToEndTest, DisableModuleInstantiations) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {"", ""},
-      {"\n", "\n"},
-      {"\n\n", "\n\n"},
-      {"module  m  ;\t\n"
-       "  endmodule\n",
-       "module m;\n"
-       "endmodule\n"},
-      {"module  m  ;\t\n"
-       "foo bar();"
-       "  endmodule\n",
-       "module m;\n"
-       "  foo bar ();\n"  // indentation still takes effect
-       "endmodule\n"},
-      {"module  m  ;\t\n"
-       "logic   xyz;"
-       "wire\tabc;"
-       "  endmodule\n",
-       "module m;\n"
-       "  logic xyz;\n"  // indentation still takes effect
-       "  wire  abc;\n"  // aligned too
-       "endmodule\n"},
-      {"  function f  ;\t\n"
-       " endfunction\n",
-       "function f;\n"
-       "endfunction\n"},
-      {"  function f  ;\t"
-       "foo  bar,baz; "
-       " endfunction\n",
-       "function f;\n"
-       "  foo bar, baz;\n"
-       "endfunction\n"},
-      {"  task  t  ;\t"
-       "foo  bar,baz; "
-       " endtask\n",
-       "task t;\n"
-       "  foo bar, baz;\n"
-       "endtask\n"},
-      {"module  m  ;\t\n"
-       "foo  bar(   .baz(baz)   );"
-       "  endmodule\n",
-       "module m;\n"
-       "  foo bar (.baz(baz));\n"  // indentation still takes effect
-       "endmodule\n"},
-      {"module  m  ;\t\n"
-       "foo  bar(\n"
-       "        .baz  (baz  ),\n"  // example of user-manual alignment
-       "        .blaaa(blaaa)\n"
-       ");"
-       "  endmodule\n",
-       "module m;\n"
-       "  foo bar (\n"           // indentation still takes effect
-       "      .baz  (baz  ),\n"  // named port connections preserved
-       "      .blaaa(blaaa)\n"   // named port connections preserved
-       "  );\n"                  // this indentation is fixed
-       "endmodule\n"},
-      {"module  m  ;\t\n"
-       "foo  #(   .baz(baz)   ) bar();"  // named parameters
-       "  endmodule\n",
-       "module m;\n"
-       "  foo #(.baz(baz)) bar ();\n"  // indentation still takes effect
-       "endmodule\n"},
-      {"module  m  ;\t\n"
-       "foo  #(\n"
-       "        .baz  (baz  ),\n"  // example of user-manual alignment
-       "        .blaaa(blaaa)\n"
-       ")  bar( );"
-       "  endmodule\n",
-       "module m;\n"
-       "  foo #(\n"              // indentation still takes effect
-       "      .baz  (baz  ),\n"  // named parameter arguments preserved
-       "      .blaaa(blaaa)\n"   // named parameter arguments preserved
-       "  ) bar ();\n"           // this indentation is fixed
-       "endmodule\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  // Testing preservation of spaces
-  style.named_parameter_alignment = AlignmentPolicy::kPreserve;
-  style.named_port_alignment = AlignmentPolicy::kPreserve;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    // Require these test cases to be valid.
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-TEST(FormatterEndToEndTest, DisableTryWrapLongLines) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {"", ""},
-      {"\n", "\n"},
-      {"\n\n", "\n\n"},
-      {"module  m  ;\t\n"
-       "  endmodule\n",
-       "module m;\n"
-       "endmodule\n"},
-      {"module  m(   ) ;\n"
-       "  endmodule\n",
-       "module m ();\n"
-       "endmodule\n"},
-      {"module  m(   ) ;\n"
-       "initial assign a = b;\n"
-       "  endmodule\n",
-       "module m ();\n"
-       "  initial assign a = b;\n"
-       "endmodule\n"},
-      {"module  m(   ) ;\n"
-       "initial assign a = {never +gonna +give +you +up,\n"
-       "never + gonna +Let +you +down};\n"
-       "  endmodule\n",
-       "module m ();\n"
-       "  initial\n"
-       "    assign a = {\n"
-       "      never + gonna + give + you + up,\n"
-       "      never + gonna + Let + you + down\n"
-       "    };\n"
-       "endmodule\n"},
-      {"module  m(   ) ;\n"
-       "initial assign a = {never +gonna +give +you +up+\n"  // over 40 columns,
-                                                             // give up
-       "never + gonna +Let +you +down};\n"
-       "  endmodule\n",
-       "module m ();\n"
-       "  initial\n"
-       "    assign a = {\n"
-       "      never +gonna +give +you +up+\n"  // indented properly, but
-       "never + gonna +Let +you +down\n"       // preserved original
-       "    };\n"
-       "endmodule\n"},
-      {// The if-header is a single leaf partition, and does not fit,
-       // so its original spacing should be preserved.
-       // We deliberately insert weird spacing to show that it is preserved.
-       "function f;\n"
-       "if ((xxx.aaaa >= bbbbbbbbbbbbbbb) &&\n"
-       "      ((ccc.ddd  +  eee.ffffff * g) <=\n"
-       "       (hhhhhhhhhhhhhhh+iiiiiiiiiiiiiiiiiiii))) begin\n"
-       "end\n"
-       "endfunction\n",
-       "function f;\n"
-       "  if ((xxx.aaaa >= bbbbbbbbbbbbbbb) &&\n"  // indentation fixed
-       "      ((ccc.ddd  +  eee.ffffff * g) <=\n"
-       "       (hhhhhhhhhhhhhhh+iiiiiiiiiiiiiiiiiiii))) begin\n"
-       "  end\n"  // indentation fixed
-       "endfunction\n"},
-
-      // Make sure indentation still works with wrapping disabled,
-      // and leaf partitions fit on one line.
-      {"function void f();\n"
-       "for (int i = N; i > 0; i--) begin\n"
-       "end\n"
-       "endfunction\n",
-       "function void f();\n"
-       "  for (int i = N; i > 0; i--) begin\n"
-       "  end\n"
-       "endfunction\n"},
-      {"function void f();"
-       "if(i > 0 ) begin end "
-       "endfunction",
-       "function void f();\n"
-       "  if (i > 0) begin\n"
-       "  end\n"
-       "endfunction\n"},
-      {"function void f();"  // newlines absent from input
-       "for (int i=N; i>0; i--) begin end "
-       "endfunction",
-       "function void f();\n"
-       "  for (int i = N; i > 0; i--) begin\n"  // spacing corrected
-       "  end\n"
-       "endfunction\n"},
-      {"module m( );\n"
-       "  always_ff  @  (  posedge  (  clk  )  ) begin\n"
-       "out  <=  rst_clk  ?  0 : in  ;\n"
-       "end\n"
-       "endmodule : simple\n",
-       "module m ();\n"
-       "  always_ff @(posedge (clk)) begin\n"
-       "    out <= rst_clk ? 0 : in;\n"
-       "  end\n"
-       "endmodule : simple\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.try_wrap_long_lines = false;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    // Require these test cases to be valid.
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-TEST(FormatterEndToEndTest, ModulePortDeclarationsIndentNotWrap) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {"", ""},
-      {"\n", "\n"},
-      {"\n\n", "\n\n"},
-      {"module  m  ;\t\n"
-       "  endmodule\n",
-       "module m;\n"
-       "endmodule\n"},
-      {"module  m(   ) ;\n"
-       "  endmodule\n",
-       "module m ();\n"  // empty ports formatted compactly
-       "endmodule\n"},
-      {// single port example
-       "module  m   ( input     clk  )\t;\n"
-       "  endmodule\n",
-       "module m (\n"
-       "  input clk\n"  // 2 spaces
-       ");\n"
-       "endmodule\n"},
-      {// example with two ports
-       "module  m   (\n"
-       "input  clk,\n"
-       "output bar\n"
-       ")\t;\n"
-       "  endmodule\n",
-       "module m (\n"
-       "  input  clk,\n"  // indented 2 spaces, and aligned
-       "  output bar\n"
-       ");\n"
-       "endmodule\n"},
-      {// interface example
-       "interface  handshake   (\n"
-       "wire req,\n"
-       "wire ack\n"
-       ")\t;\n"
-       "  endinterface\n",
-       "interface handshake (\n"
-       "  wire req,\n"  // indented 2 spaces
-       "  wire ack\n"
-       ");\n"
-       "endinterface\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  // Indent 2 spaces instead of wrapping 4 spaces.
-  style.port_declarations_indentation = IndentationStyle::kIndent;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    // Require these test cases to be valid.
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-TEST(FormatterEndToEndTest, NamedPortConnectionsIndentNotWrap) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {"", ""},
-      {"\n", "\n"},
-      {"\n\n", "\n\n"},
-      {"module  m  ;\t\n"
-       "  endmodule\n",
-       "module m;\n"
-       "endmodule\n"},
-      {"module  m(   ) ;\n"
-       "  endmodule\n",
-       "module m ();\n"  // empty ports formatted compactly
-       "endmodule\n"},
-      {// single port example
-       "module  m ;\n"
-       "foo bar( .clk( clk ) )\t;\n"
-       "  endmodule\n",
-       "module m;\n"
-       "  foo bar (.clk(clk));\n"
-       "endmodule\n"},
-      {// two port example
-       "module  m ;\n"
-       "foo bar( .clk2( clk ),.data (data) )\t;\n"
-       "  endmodule\n",
-       "module m;\n"
-       "  foo bar (\n"
-       "    .clk2(clk),\n"  // indent only +2 spaces
-       "    .data(data)\n"
-       "  );\n"
-       "endmodule\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  // Indent 2 spaces instead of wrapping 4 spaces.
-  style.named_port_indentation = IndentationStyle::kIndent;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    // Require these test cases to be valid.
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-TEST(FormatterEndToEndTest, WrapEndElseStatements) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {"module foo ();\n"
-       "  always @(posedge bar) begin\n"
-       "    if (1==1) begin\n"
-       "      ham();\n"
-       "    end else if (2==2) begin\n"
-       "      jam();\n"
-       "    end else begin\n"
-       "      spam();\n"
-       "    end\n"
-       "  end\n"
-       "endmodule\n",
-       "module foo ();\n"
-       "  always @(posedge bar) begin\n"
-       "    if (1 == 1) begin\n"
-       "      ham();\n"
-       "    end\n"
-       "    else if (2 == 2) begin\n"
-       "      jam();\n"
-       "    end\n"
-       "    else begin\n"
-       "      spam();\n"
-       "    end\n"
-       "  end\n"
-       "endmodule\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.wrap_end_else_clauses = true;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    // Require these test cases to be valid.
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-TEST(FormatterEndToEndTest, FormalParametersIndentNotWrap) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {"", ""},
-      {"\n", "\n"},
-      {"\n\n", "\n\n"},
-      {"module  m  ;\t\n"
-       "  endmodule\n",
-       "module m;\n"
-       "endmodule\n"},
-      {"module  m #(   ) ;\n"  // empty parameters
-       "  endmodule\n",
-       "module m #();\n"
-       "endmodule\n"},
-      {// single parameter example
-       "module  m   #( int W = 2)\t;\n"
-       "  endmodule\n",
-       "module m #(\n"
-       "  int W = 2\n"  // indented 2 spaces
-       ");\n"
-       "endmodule\n"},
-      {// module with two parameters
-       "module  m   #(\n"
-       "int W = 2,\n"
-       "int L = 4\n"
-       ")\t;\n"
-       "  endmodule\n",
-       "module m #(\n"
-       "  int W = 2,\n"  // indented 2 spaces
-       "  int L = 4\n"
-       ");\n"
-       "endmodule\n"},
-      {// interface with two parameters
-       "interface  m   #(\n"
-       "int W = 2,\n"
-       "int L = 4\n"
-       ")\t;\n"
-       "  endinterface\n",
-       "interface m #(\n"
-       "  int W = 2,\n"  // indented 2 spaces
-       "  int L = 4\n"
-       ");\n"
-       "endinterface\n"},
-      {// class with two parameters
-       "class  c   #(\n"
-       "int W = 2,\n"
-       "int L = 4\n"
-       ")\t;\n"
-       "  endclass\n",
-       "class c #(\n"
-       "  int W = 2,\n"  // indented 2 spaces
-       "  int L = 4\n"
-       ");\n"
-       "endclass\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  // Indent 2 spaces instead of wrapping 4 spaces.
-  style.formal_parameters_indentation = IndentationStyle::kIndent;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    // Require these test cases to be valid.
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-TEST(FormatterEndToEndTest, NamedParametersIndentNotWrap) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {"", ""},
-      {"\n", "\n"},
-      {"\n\n", "\n\n"},
-      {"module  m  ;\t\n"
-       "  endmodule\n",
-       "module m;\n"
-       "endmodule\n"},
-      {"module  m #(   ) ;\n"  // empty parameters
-       "  endmodule\n",
-       "module m #();\n"
-       "endmodule\n"},
-      {"module  m  ;\t\n"
-       " foo #()bar();\n"
-       "  endmodule\n",
-       "module m;\n"
-       "  foo #() bar ();\n"
-       "endmodule\n"},
-      {// one named parameter
-       "module  m ;\n"
-       "foo #(.W(1)) bar();\n"
-       "  endmodule\n",
-       "module m;\n"
-       "  foo #(.W(1)) bar ();\n"
-       "endmodule\n"},
-      {// two named parameters
-       "module  m ;\n"
-       "foo #(.W(1), .L(2)) bar();\n"
-       "  endmodule\n",
-       "module m;\n"
-       "  foo #(\n"
-       "    .W(1),\n"  // indent +2 spaces only
-       "    .L(2)\n"
-       "  ) bar ();\n"
-       "endmodule\n"},
-      {// class data member with two parameters
-       "class  c  ;\n"
-       " foo_pkg::bar_t#(\n"
-       ".W(2),.L(4)"
-       ") baz;\n"
-       "  endclass\n",
-       "class c;\n"
-       "  foo_pkg::bar_t #(\n"
-       "    .W(2),\n"  // indent +2 spaces only
-       "    .L(4)\n"
-       "  ) baz;\n"
-       "endclass\n"},
-      {// typedef with two parameters
-       "typedef \n"
-       " foo_pkg::bar_t  #("
-       ".W(2),.L(4)"
-       ") baz;\n",
-       "typedef foo_pkg::bar_t#(\n"
-       "  .W(2),\n"  // indent +2 spaces only
-       "  .L(4)\n"
-       ") baz;\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  // Indent 2 spaces instead of wrapping 4 spaces.
-  style.named_parameter_indentation = IndentationStyle::kIndent;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    // Require these test cases to be valid.
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-struct SelectLinesTestCase {
-  std::string_view input;
-  LineNumberSet lines;  // explicit set of lines to enable formatting
-  std::string_view expected;
-};
-
-// Tests that formatter honors selected line numbers.
-TEST(FormatterEndToEndTest, SelectLines) {
-  const SelectLinesTestCase kTestCases[] = {
-      {"", {}, ""},
-      {"", {{1, 2}}, ""},
-      {// expect all three lines for format
-       "  parameter    int foo_line1 =     0 ;\n"
-       "  parameter    int foo_line2 =     0 ;\n"
-       "  parameter    int foo_line3 =     0 ;\n",
-       {},
-       "parameter int foo_line1 = 0;\n"
-       "parameter int foo_line2 = 0;\n"
-       "parameter int foo_line3 = 0;\n"},
-      {// expect only one line to format
-       "  parameter    int foo_line1 =     0 ;\n"
-       "  parameter    int foo_line2 =     0 ;\n"
-       "  parameter    int foo_line3 =     0 ;\n",
-       {{1, 2}},
-       "parameter int foo_line1 = 0;\n"
-       "  parameter    int foo_line2 =     0 ;\n"
-       "  parameter    int foo_line3 =     0 ;\n"},
-      {// expect only one line to format
-       "  parameter    int foo_line1 =     0 ;\n"
-       "  parameter    int foo_line2 =     0 ;\n"
-       "  parameter    int foo_line3 =     0 ;\n",
-       {{2, 3}},
-       "  parameter    int foo_line1 =     0 ;\n"
-       "parameter int foo_line2 = 0;\n"
-       "  parameter    int foo_line3 =     0 ;\n"},
-      {// expect only one line to format
-       "  parameter    int foo_line1 =     0 ;\n"
-       "  parameter    int foo_line2 =     0 ;\n"
-       "  parameter    int foo_line3 =     0 ;\n",
-       {{3, 4}},
-       "  parameter    int foo_line1 =     0 ;\n"
-       "  parameter    int foo_line2 =     0 ;\n"
-       "parameter int foo_line3 = 0;\n"},
-      {// expect to format two lines
-       "  parameter    int foo_line1 =     0 ;\n"
-       "  parameter    int foo_line2 =     0 ;\n"
-       "  parameter    int foo_line3 =     0 ;\n",
-       {{1, 3}},
-       "parameter int foo_line1 = 0;\n"
-       "parameter int foo_line2 = 0;\n"
-       "  parameter    int foo_line3 =     0 ;\n"},
-      {// expect to format two lines
-       "  parameter    int foo_line1 =     0 ;\n"
-       "  parameter    int foo_line2 =     0 ;\n"
-       "  parameter    int foo_line3 =     0 ;\n",
-       {{2, 4}},
-       "  parameter    int foo_line1 =     0 ;\n"
-       "parameter int foo_line2 = 0;\n"
-       "parameter int foo_line3 = 0;\n"},
-      {// expect to format two lines
-       "  parameter    int foo_line1 =     0 ;\n"
-       "  parameter    int foo_line2 =     0 ;\n"
-       "  parameter    int foo_line3 =     0 ;\n",
-       {{1, 2}, {3, 4}},
-       "parameter int foo_line1 = 0;\n"
-       "  parameter    int foo_line2 =     0 ;\n"
-       "parameter int foo_line3 = 0;\n"},
-      {// expect to format all lines
-       "  parameter    int foo_line1 =     0 ;\n"
-       "  parameter    int foo_line2 =     0 ;\n"
-       "  parameter    int foo_line3 =     0 ;\n",
-       {{1, 4}},
-       "parameter int foo_line1 = 0;\n"
-       "parameter int foo_line2 = 0;\n"
-       "parameter int foo_line3 = 0;\n"},
-      {// expect to format no lines (line numbers out of bounds)
-       "  parameter    int foo_line1 =     0 ;\n"
-       "  parameter    int foo_line2 =     0 ;\n"
-       "  parameter    int foo_line3 =     0 ;\n",
-       {{4, 6}},
-       "  parameter    int foo_line1 =     0 ;\n"
-       "  parameter    int foo_line2 =     0 ;\n"
-       "  parameter    int foo_line3 =     0 ;\n"},
-      {// expect to format all lines
-       "// verilog_format: on\n"
-       "  parameter    int foo_line2 =     0 ;\n"
-       "  parameter    int foo_line3 =     0 ;\n"
-       "  parameter    int foo_line4 =     0 ;\n",
-       {},
-       "// verilog_format: on\n"
-       "parameter int foo_line2 = 0;\n"
-       "parameter int foo_line3 = 0;\n"
-       "parameter int foo_line4 = 0;\n"},
-      {// expect to format no lines
-       "// verilog_format: off\n"
-       "  parameter    int foo_line2 =     0 ;\n"
-       "  parameter    int foo_line3 =     0 ;\n"
-       "  parameter    int foo_line4 =     0 ;\n",
-       {},
-       "// verilog_format: off\n"
-       "  parameter    int foo_line2 =     0 ;\n"
-       "  parameter    int foo_line3 =     0 ;\n"
-       "  parameter    int foo_line4 =     0 ;\n"},
-      {// expect to format some lines
-       "// verilog_format: on\n"
-       "  parameter    int foo_line2 =     0 ;\n"
-       "  parameter    int foo_line3 =     0 ;\n"
-       "  parameter    int foo_line4 =     0 ;\n",
-       {{3, 5}},
-       "// verilog_format: on\n"
-       "  parameter    int foo_line2 =     0 ;\n"
-       "parameter int foo_line3 = 0;\n"  // disable lines 3,4
-       "parameter int foo_line4 = 0;\n"},
-      {// enable all lines, but respect format-off
-       "  parameter    int foo_line1 =     0 ;\n"
-       "  parameter    int foo_line2 =     0 ;\n"
-       "// verilog_format: off\n"
-       "  parameter    int foo_line4 =     0 ;\n",
-       {{1, 5}},
-       "parameter int foo_line1 = 0;\n"
-       "parameter int foo_line2 = 0;\n"
-       "// verilog_format: off\n"
-       "  parameter    int foo_line4 =     0 ;\n"},
-      {// enable all lines, but respect format-off
-       "  parameter    int foo_line1 =     0 ;\n"
-       "// verilog_format: off\n"
-       "  parameter    int foo_line3 =     0 ;\n"
-       "// verilog_format: on\n"
-       "  parameter    int foo_line5 =     0 ;\n",
-       {{1, 6}},
-       "parameter int foo_line1 = 0;\n"
-       "// verilog_format: off\n"
-       "  parameter    int foo_line3 =     0 ;\n"
-       "// verilog_format: on\n"
-       "parameter int foo_line5 = 0;\n"},
-      {// enable all lines, but respect format-off
-       "// verilog_format: off\n"
-       "  parameter    int foo_line2 =     0 ;\n"
-       "  parameter    int foo_line3 =     0 ;\n"
-       "// verilog_format: on\n"
-       "  parameter    int foo_line5 =     0 ;\n",
-       {{1, 6}},
-       "// verilog_format: off\n"
-       "  parameter    int foo_line2 =     0 ;\n"
-       "  parameter    int foo_line3 =     0 ;\n"
-       "// verilog_format: on\n"
-       "parameter int foo_line5 = 0;\n"},
-      {"module m;\n"
-       "  if (foo) begin:l1\n"
-       "    if (foo) begin:l2\n"
-       "      always_comb\n"  // normally this line and next would fit together
-       "        d<=#1ps   x_lat\t;\n"  // only format this line, 5
-       "    end : l2\n"
-       "  end : l1\n"
-       "endmodule\n",
-       {{5, 6}},
-       "module m;\n"
-       "  if (foo) begin:l1\n"
-       "    if (foo) begin:l2\n"
-       "      always_comb\n"  // incremental mode prevents joining next line
-       "        d <= #1ps x_lat;\n"  // only this line changed
-       "    end : l2\n"
-       "  end : l1\n"
-       "endmodule\n"},
-
-      // Next three test cases: one whole-file, two incremental
-      {"module m(\n"
-       "  input wire f,\n"
-       "  input  foo::bar  ggg\n"
-       ");\n"
-       "endmodule:m\n",
-       {},  // format all lines
-       "module m (\n"
-       "    input wire     f,\n"
-       "    input foo::bar ggg\n"
-       ");\n"
-       "endmodule : m\n"},
-      {"module m(\n"
-       "  input wire f,\n"
-       "  input  foo::bar  ggg\n"  // "new line", formatted incrementally
-       ");\n"
-       "endmodule:m\n",
-       {{3, 4}},  // format incrementally
-       "module m(\n"
-       "  input wire f,\n"
-       "    input  foo::bar  ggg\n"  // "new line" remains untouched
-       ");\n"
-       "endmodule:m\n"},
-      {"module m(\n"
-       "  input  wire   f,\n"  // "new line", formatted incrementally
-       "  input  foo::bar  ggg\n"
-       ");\n"
-       "endmodule:m\n",
-       {{2, 3}},  // format incrementally
-       "module m(\n"
-       "    input  wire   f,\n"  // "new line" indented, but other spaces kept
-       "  input  foo::bar  ggg\n"
-       ");\n"
-       "endmodule:m\n"},
-  };
-  // Use a fixed style.
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status = FormatVerilog(test_case.input, "<filename>", style,
-                                      stream, test_case.lines);
-    EXPECT_OK(status) << status.message() << '\n'
-                      << "Lines: " << test_case.lines;
-    EXPECT_EQ(stream.str(), test_case.expected)
-        << "code:\n"
-        << test_case.input << "\nlines: " << test_case.lines;
-  }
-}
-
-// These tests verify the mode where horizontal spacing is discarded while
-// vertical spacing is preserved.
-TEST(FormatterEndToEndTest, PreserveVSpacesOnly) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      // {input, expected},
-      // No tokens cases: still preserve vertical spacing, but not horizontal
-      {"", ""},
-      {"    ", ""},
-      {"\n", "\n"},
-      {"\n\n", "\n\n"},
-      {"  \n", "\n"},
-      {"\n  ", "\n"},
-      {"  \n  ", "\n"},
-      {"  \n  \t\t\n\t  ", "\n\n"},
-
-      // The remaining cases have at least one non-whitespace token.
-
-      // single comment
-      {"//\n", "//\n"},
-      {"//  \n", "//  \n"},  // trailing spaces inside comment untouched
-      {"\n//\n", "\n//\n"},
-      {"\n\n//\n", "\n\n//\n"},
-      {"\n//\n\n", "\n//\n\n"},
-      {"      //\n", "//\n"},  // spaces before comment discarded
-      {"   \n   //\n", "\n//\n"},
-      {"   \n   //\n  \n  ", "\n//\n\n"},  // trailing spaces discarded
-
-      // multi-comment
-      {"//\n//\n", "//\n//\n"},
-      {"\n//\n\n//\n\n", "\n//\n\n//\n\n"},
-      {"\n//\n\n//\n", "\n//\n\n//\n"},  // blank line between comments
-
-      // Module cases with token partition boundary (before 'endmodule').
-      {"module foo;endmodule\n", "module foo;\nendmodule\n"},
-      {"module foo;\nendmodule\n", "module foo;\nendmodule\n"},
-      {"module foo;\n\nendmodule\n", "module foo;\n\nendmodule\n"},
-      {"\nmodule foo;endmodule\n", "\nmodule foo;\nendmodule\n"},
-      {"\nmodule foo     ;    endmodule\n", "\nmodule foo;\nendmodule\n"},
-      {"\nmodule\nfoo\n;endmodule\n", "\nmodule foo;\nendmodule\n"},
-      {"\nmodule foo;endmodule\n\n\n", "\nmodule foo;\nendmodule\n\n\n"},
-      {"\n\n\nmodule foo;endmodule\n", "\n\n\nmodule foo;\nendmodule\n"},
-      {"\nmodule\nfoo\n;\n\n\nendmodule\n", "\nmodule foo;\n\n\nendmodule\n"},
-
-      // Module cases with one indented item, various original vertical spacing
-      {"module foo;wire w;endmodule\n", "module foo;\n  wire w;\nendmodule\n"},
-      {"  module   foo  ;wire    w  ;endmodule  \n  ",
-       "module foo;\n  wire w;\nendmodule\n"},
-      {"\nmodule\nfoo\n;\nwire\nw\n;endmodule\n\n",
-       "\nmodule foo;\n  wire w;\nendmodule\n\n"},
-      {"\n\nmodule\nfoo\n;\n\n\nwire\nw\n;\n\nendmodule\n\n",
-       "\n\nmodule foo;\n\n\n  wire w;\n\nendmodule\n\n"},
-
-      // The following cases show that some horizontal whitespace is discarded,
-      // while vertical spacing is preserved on partition boundaries.
-      {"     module  foo\t   \t;    endmodule   \n",
-       "module foo;\nendmodule\n"},
-      {"\t\n     module  foo\t\t;    endmodule   \n",
-       "\nmodule foo;\nendmodule\n"},
-
-      // Module with comments intermingled.
-      {
-          "//1\nmodule foo;//2\nwire w;//3\n//4\nendmodule\n",
-          "//1\nmodule foo;  //2\n  wire w;  //3\n  //4\nendmodule\n"
-          // TODO(fangism): whether or not //4 should be indented is
-          // questionable (in similar cases below too).
-      },
-      {// now with extra blank lines
-       "//1\n\nmodule foo;//2\n\nwire w;//3\n\n//4\n\nendmodule\n\n",
-       "//1\n\nmodule foo;  //2\n\n  wire w;  //3\n\n  //4\n\nendmodule\n\n"},
-
-      {
-          // module with comments-only in some empty blocks, properly indented
-          "  // humble module\n"
-          "  module foo (// non-port comment\n"
-          "// port comment 1\n"
-          "// port comment 2\n"
-          ");// header trailing comment\n"
-          "// item comment 1\n"
-          "// item comment 2\n"
-          "endmodule\n",
-          "// humble module\n"
-          "module foo (  // non-port comment\n"
-          "    // port comment 1\n"
-          "    // port comment 2\n"
-          ");  // header trailing comment\n"
-          "  // item comment 1\n"
-          "  // item comment 2\n"
-          "endmodule\n",
-      },
-
-      {
-          // module with comments around non-empty blocks
-          "  // humble module\n"
-          "  module foo (// non-port comment\n"
-          "// port comment 1\n"
-          "input   logic   f  \n"
-          "// port comment 2\n"
-          ");// header trailing comment\n"
-          "// item comment 1\n"
-          "wire w ; \n"
-          "// item comment 2\n"
-          "endmodule\n",
-          "// humble module\n"
-          "module foo (  // non-port comment\n"
-          "    // port comment 1\n"
-          "    input logic f\n"
-          "    // port comment 2\n"
-          ");  // header trailing comment\n"
-          "  // item comment 1\n"
-          "  wire w;\n"
-          "  // item comment 2\n"
-          "endmodule\n",
-      },
-  };
-  FormatStyle style;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-static constexpr FormatterTestCase kFormatterTestCasesElseStatements[] = {
-    {"module m;"
-     "task static t; if (r == t) a.b(c); else d.e(f); endtask;"
-     "endmodule",
-     "module m;\n"
-     "  task static t;\n"
-     "    if (r == t) a.b(c);\n"
-     "    else d.e(f);\n"
-     "  endtask\n"
-     "  ;\n"  // possibly unintended stray ';'
-     "endmodule\n"},
-    {"module m;"
-     "task static t; if (r == t) begin a.b(c); end else begin d.e(f); end "
-     "endtask;"
-     "endmodule",
-     "module m;\n"
-     "  task static t;\n"
-     "    if (r == t) begin\n"
-     "      a.b(c);\n"
-     "    end else begin\n"
-     "      d.e(f);\n"
-     "    end\n"
-     "  endtask\n"
-     "  ;\n"  // stray ';'
-     "endmodule\n"},
-    {"module m;initial begin if(a==b)"
-     "c.d(e);else\n"
-     "f.g(h);end endmodule",
-     "module m;\n"
-     "  initial begin\n"
-     "    if (a == b) c.d(e);\n"
-     "    else f.g(h);\n"
-     "  end\n"
-     "endmodule\n"},
-    {"   module m;  always_comb    begin     \n"
-     "        if      ( a   ) b =  16'hdead    ; \n"
-     "  else if (   c     )  d= 16 'hbeef  ;   \n"
-     "     else        if (e) f=16'hca_fe ;     \n"
-     "end   \n endmodule\n",
-     "module m;\n"
-     "  always_comb begin\n"
-     "    if (a) b = 16'hdead;\n"
-     "    else if (c) d = 16'hbeef;\n"
-     "    else if (e) f = 16'hca_fe;\n"
-     "  end\n"
-     "endmodule\n"},
-    {"module foo();\n"
-     "always_comb begin\n"
-     "value = function_name(.long_parameter(8'hA), .parameter_three(foobar));\n"
-     "end\n"
-     "endmodule : foo\n",
-     "module foo ();\n"
-     "  always_comb begin\n"
-     "    value = function_name(\n"
-     "      .long_parameter(8'hA),\n"
-     "      .parameter_three(foobar)\n"
-     "    );\n"
-     "  end\n"
-     "endmodule : foo\n"},
-    {"module foo();\n"
-     "always_comb begin\n"
-     "value = function_name(.a(1), .b(2));\n"
-     "end\n"
-     "endmodule : foo\n",
-     "module foo ();\n"
-     "  always_comb begin\n"
-     "    value = function_name(.a(1), .b(2));\n"
-     "  end\n"
-     "endmodule : foo\n"},
-    {"module foo ();\n"
-     "always_comb begin\n"
-     "value = function_name(8'hA, foobar, signal_1234); end\n"
-     "always_comb begin\n"
-     "value = function_name(8'hA, foobar); end\n"
-     "endmodule : foo\n",
-     "module foo ();\n"
-     "  always_comb begin\n"
-     "    value = function_name(8'hA, foobar,\n"
-     "                          signal_1234);\n"
-     "  end\n"
-     "  always_comb begin\n"
-     "    value = function_name(8'hA, foobar);\n"
-     "  end\n"
-     "endmodule : foo\n"},
-    {"module foo ();\n"
-     "always_comb begin\n"
-     "value = function_name(8'hA, foobar, signal_1234);\n"
-     "value = function_name(8'hA, foobar, signal_1234); end\n"
-     "endmodule : foo\n",
-     "module foo ();\n"
-     "  always_comb begin\n"
-     "    value = function_name(8'hA, foobar,\n"
-     "                          signal_1234);\n"
-     "    value = function_name(8'hA, foobar,\n"
-     "                          signal_1234);\n"
-     "  end\n"
-     "endmodule : foo\n"},
-    {"always_comb begin\n"
-     "value = "
-     "f(long_parameter_exceeding_col_limit, foo, bar); end\n",
-     "always_comb begin\n"
-     "  value = f(\n"
-     "    long_parameter_exceeding_col_limit,\n"
-     "    foo,\n"
-     "    bar\n"
-     "  );\n"
-     "end\n"},
-    {"module foo();\n"
-     "always_comb begin\n"
-     "value = function_name(8'hA, .parameter_three(foobar));\n"
-     "end\n"
-     "endmodule : foo\n",
-     "module foo ();\n"
-     "  always_comb begin\n"
-     "    value = function_name(\n"
-     "      8'hA,\n"
-     "      .parameter_three(foobar)\n"
-     "    );\n"
-     "  end\n"
-     "endmodule : foo\n"},
-    {"module foo ();\n"
-     "always_comb begin\n"
-     "value = function_name(8'hA, 8'hB, 8'hC, .parameter_four(foo), "
-     ".par_five(bar));\n"
-     "end\n"
-     "endmodule : foo\n",
-     "module foo ();\n"
-     "  always_comb begin\n"
-     "    value = function_name(\n"
-     "      8'hA,\n"
-     "      8'hB,\n"
-     "      8'hC,\n"
-     "      .parameter_four(foo),\n"
-     "      .par_five(bar)\n"
-     "    );\n"
-     "  end\n"
-     "endmodule : foo\n"},
-    {"class dv_base_mem; function void configure(); \nbegin\n"
-     "value = func(8'hA, foobar, signal_1234);\n"
-     "value = new(8'hA, foobar, signal_1234); end\n"
-     "endfunction : configure endclass\n",
-     "class dv_base_mem;\n"
-     "  function void configure();\n"
-     "    begin\n"
-     "      value = func(8'hA, foobar,\n"
-     "                   signal_1234);\n"
-     "      value = new(8'hA, foobar,\n"
-     "                  signal_1234);\n"
-     "    end\n"
-     "  endfunction : configure\n"
-     "endclass\n"},
-    {"module m; initial begin\n"
-     "        if     (a||b)        c         = 1'b1;\n"
-     "d =        1'b1; if         (e)\n"
-     "begin f = 1'b0; end else begin\n"
-     "    g = h;\n"
-     "        end \n"
-     " i = 1'b1; "
-     "end endmodule\n",
-     "module m;\n"
-     "  initial begin\n"
-     "    if (a || b) c = 1'b1;\n"
-     "    d = 1'b1;\n"
-     "    if (e) begin\n"
-     "      f = 1'b0;\n"
-     "    end else begin\n"
-     "      g = h;\n"
-     "    end\n"
-     "    i = 1'b1;\n"
-     "  end\n"
-     "endmodule\n"},
-    {"module m; initial begin\n"
-     "if (a&&b&&c) begin\n"
-     "         d         = 1'b1;\n"
-     "     if (e) begin\n"
-     "   f = ff;\n"
-     "       end  else   if  (    g  )   begin\n"
-     "     h = hh;\n"
-     "end else if (i) begin\n"
-     "    j   =   (kk == ll) ? mm :\n"
-     "      gg;\n"
-     "   end     else   if    (  qq )  begin\n"
-     "    if      (  xx   ||yy        ) begin    d0 = 1'b0;   d1   =       "
-     "1'b1;\n"
-     "  end else if (oo) begin aa =    bb; cc      = dd;"
-     "         if (zz) zx = xz; else ba = ab;"
-     "    end   else  \n begin      vv   =  tt  ;  \n"
-     "   end   end "
-     "end \n  else if   (uu)\nbegin\n\na=b;if (aa)   b =    c;\n"
-     "\nelse    if    \n (bb) \n\nc        =d    ;\n\n\n\n\n    "
-     "      else         e\n\n   =   h;\n\n"
-     "end \n  else    \n  begin if(x)y=a;else\nbegin\n"
-     "\n\n\na=y; if (a)       b     = c;\n\n\n\nelse\n\n\nd=e;end \n"
-     "end\n"
-     "end endmodule\n",
-     "module m;\n"
-     "  initial begin\n"
-     "    if (a && b && c) begin\n"
-     "      d = 1'b1;\n"
-     "      if (e) begin\n"
-     "        f = ff;\n"
-     "      end else if (g) begin\n"
-     "        h = hh;\n"
-     "      end else if (i) begin\n"
-     "        j = (kk == ll) ? mm : gg;\n"
-     "      end else if (qq) begin\n"
-     "        if (xx || yy) begin\n"
-     "          d0 = 1'b0;\n"
-     "          d1 = 1'b1;\n"
-     "        end else if (oo) begin\n"
-     "          aa = bb;\n"
-     "          cc = dd;\n"
-     "          if (zz) zx = xz;\n"
-     "          else ba = ab;\n"
-     "        end else begin\n"
-     "          vv = tt;\n"
-     "        end\n"
-     "      end\n"
-     "    end else if (uu) begin\n\n"
-     "      a = b;\n"
-     "      if (aa) b = c;\n\n"
-     "      else if (bb) c = d;\n\n\n\n\n"
-     "      else e = h;\n\n"
-     "    end else begin\n"
-     "      if (x) y = a;\n"
-     "      else begin\n\n\n\n"
-     "        a = y;\n"
-     "        if (a) b = c;\n\n\n\n"
-     "        else d = e;\n"
-     "      end\n"
-     "    end\n"
-     "  end\n"
-     "endmodule\n"}};
-
-TEST(FormatterEndToEndTest, FormatElseStatements) {
-  // Use a fixed style.
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  for (const auto &test_case : kFormatterTestCasesElseStatements) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-TEST(FormatterEndToEndTest, ConstraintExpressions) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {"", ""},
-
-      // class members
-      {"class Foo; constraint if_c { if (zzzzzzzzzzzzzzzzzzzzz)"
-       "{ soft xxxxxxxxxxxxxxxxxxxxxx == yyyyyyyyyyyyyyyyyyy; } } endclass",
-       "class Foo;\n"
-       "  constraint if_c {\n"
-       "    if (zzzzzzzzzzzzzzzzzzzzz) {\n"
-       "      soft xxxxxxxxxxxxxxxxxxxxxx == yyyyyyyyyyyyyyyyyyy;\n"
-       "    }\n"
-       "  }\n"
-       "endclass\n"},
-
-      // constraints with if-constraint expressions
-      {"constraint xx { if (a) b; }\n", "constraint xx {if (a) b;}\n"},
-
-      {"constraint xx { if (a) {b;} }\n",
-       "constraint xx {\n"
-       "  if (a) {\n"
-       "    b;\n"
-       "  }\n"
-       "}\n"},
-
-      // multi item constraint
-      {"constraint yy { a == b;c==d;}",
-       "constraint yy {\n"
-       "  a == b;\n"
-       "  c == d;\n"
-       "}\n"},
-
-      // one-line constraints
-      {"constraint only_vec_instr_c {soft only_vec_instr == 0;}",
-       "constraint only_vec_instr_c {soft only_vec_instr == 0;}\n"},
-
-      {"constraint\nnum_trans_c\n\n\n{\n\n\nnum_trans inside{[800:1000]};}",
-       "constraint num_trans_c {num_trans inside {[800 : 1000]};}\n"},
-
-      // if-vs-concatenation expression
-      {"constraint c_operation{  if(fixed_operation_en){"
-       "aes_operation == fixed_operation"
-       ";}}",
-       "constraint c_operation {\n"
-       "  if (fixed_operation_en) {\n"
-       "    aes_operation == fixed_operation;\n"
-       "  }\n"
-       "}\n"},
-
-      {"constraint c_operation{  if(fixed_operation_en){"
-       "aes_operation == fixed_operation"
-       "};}",
-       "constraint c_operation {\n"
-       "  if (fixed_operation_en)\n"
-       "  {aes_operation == fixed_operation};\n"
-       "}\n"},
-
-      // concatenation expression
-      {"constraint c_iv {if (fixed_iv_en) {aes_iv == fixed_iv};}",
-       "constraint c_iv {\n"
-       "  if (fixed_iv_en)\n"
-       "  {aes_iv == fixed_iv};\n"
-       "}\n"},
-
-      // looooong test
-      {"constraint xx {"
-       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)"
-       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=="
-       "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"
-       "ccccccccccccccccccccccc==dddddddddddddddddddddd;}",
-       "constraint xx {\n"
-       "  if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
-       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == "
-       "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;\n"
-       "  ccccccccccccccccccccccc == dddddddddddddddddddddd;\n"
-       "}\n"},
-  };
-  FormatStyle style;
-  style.column_limit =
-      100;  // smaller column_limit forces expansion of constraint blocks
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.port_declarations_alignment = verible::AlignmentPolicy::kPreserve;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    // Require these test cases to be valid.
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-static constexpr FormatterTestCase kFormatterTestCasesEnumDeclarations[] = {
-    // Inferring user intent: not too many spaces to be added: align.
-    {"typedef enum { kA=1, kAB=2, kABC=3} x;",
-     "typedef enum {\n"
-     "  kA   = 1,\n"
-     "  kAB  = 2,\n"
-     "  kABC = 3\n} x;\n"},
-
-    // Lots of spaces would've to be be added - keep flush
-    {"typedef enum { kA=1, kAB=2, kABCDEFGHIJKLMN=3} x;",
-     "typedef enum {\n"
-     "  kA = 1,\n"
-     "  kAB = 2,\n"
-     "  kABCDEFGHIJKLMN = 3\n} x;\n"},
-
-    // Source spaces indicate alignment wish.
-    {"typedef enum { kA     =1, kAB=2, kABCDEFGHIJKLMN=3} x;",
-     "typedef enum {\n"
-     "  kA              = 1,\n"
-     "  kAB             = 2,\n"
-     "  kABCDEFGHIJKLMN = 3\n} x;\n"},
-
-    // An empty line groups into several sections, to be aligned independently
-    {"typedef enum { kA=1, kAB=2, \n\n kABC=3} x;",
-     "typedef enum {\n"
-     "  kA  = 1,\n"
-     "  kAB = 2,\n"
-     "\n"
-     "  kABC = 3\n} x;\n"},
-
-    // Lines with comments don't interrupt alignment
-    {"typedef enum { kA=1,\n"
-     "// hello world\n"
-     "kAB=2, kABC=3} x;",
-     "typedef enum {\n"
-     "  kA   = 1,\n"
-     "  // hello world\n"
-     "  kAB  = 2,\n"
-     "  kABC = 3\n} x;\n"},
-
-    // Generally, comment locations are preserved, and full line comments
-    // indented to enum name level.
-    {"typedef enum { kA=1,// value kA\n"
-     "// hello world\n"
-     "kAB=2,// value kAB\n"
-     "kABC=3// value kABC\n"
-     "} x;",
-     "typedef enum {\n"
-     "  kA   = 1,  // value kA\n"
-     "  // hello world\n"
-     "  kAB  = 2,  // value kAB\n"
-     "  kABC = 3   // value kABC"
-     "\n} x;\n"},
-
-    {"typedef enum { kA=1,// value kA\n"
-     "kAB=2,\n"
-     "kABC=3// value kABC\n"
-     "} x;",
-     "typedef enum {\n"
-     "  kA   = 1,  // value kA\n"
-     "  kAB  = 2,\n"
-     "  kABC = 3   // value kABC"
-     "\n} x;\n"},
-
-    // Numeric constants are currently flushed left, but maybe todo
-    // align right in the future ?
-    {"typedef enum { kA=1, kAB=10, kABC=100} x;",
-     "typedef enum {\n"
-     "  kA   = 1,\n"
-     "  kAB  = 10,\n"
-     "  kABC = 100\n} x;\n"},
-};
-
-TEST(FormatterEndToEndTest, FormatAlignEnumDeclarations) {
-  // Use a fixed style.
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.enum_assignment_statement_alignment = AlignmentPolicy::kInferUserIntent;
-  for (const auto &test_case : kFormatterTestCasesEnumDeclarations) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-TEST(FormatterEndToEndTest, DiagnosticShowFullTree) {
-  // Use a fixed style.
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  for (const auto &test_case : kFormatterTestCases) {
-    std::ostringstream stream, debug_stream;
-    ExecutionControl control;
-    control.stream = &debug_stream;
-    control.show_token_partition_tree = true;
-    const auto status = FormatVerilog(test_case.input, "<filename>", style,
-                                      stream, kEnableAllLines, control);
-    EXPECT_EQ(status.code(), StatusCode::kCancelled);
-    EXPECT_TRUE(
-        absl::StartsWith(debug_stream.str(), "Full token partition tree"));
-  }
-}
-
-TEST(FormatterEndToEndTest, DiagnosticLargestPartitions) {
-  // Use a fixed style.
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  for (const auto &test_case : kFormatterTestCases) {
-    std::ostringstream stream, debug_stream;
-    ExecutionControl control;
-    control.stream = &debug_stream;
-    control.show_largest_token_partitions = 2;
-    const auto status = FormatVerilog(test_case.input, "<filename>", style,
-                                      stream, kEnableAllLines, control);
-    EXPECT_EQ(status.code(), StatusCode::kCancelled);
-    EXPECT_TRUE(absl::StartsWith(debug_stream.str(), "Showing the "))
-        << "got: " << debug_stream.str();
-  }
-}
-
-TEST(FormatterEndToEndTest, DiagnosticEquallyOptimalWrappings) {
-  // Use a fixed style.
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  for (const auto &test_case : kFormatterTestCases) {
-    std::ostringstream stream, debug_stream;
-    ExecutionControl control;
-    control.stream = &debug_stream;
-    control.show_equally_optimal_wrappings = true;
-    const auto status = FormatVerilog(test_case.input, "<filename>", style,
-                                      stream, kEnableAllLines, control);
-    EXPECT_OK(status) << status.message();
-    if (!debug_stream.str().empty()) {
-      EXPECT_TRUE(absl::StartsWith(debug_stream.str(), "Showing the "))
-          << "got: " << debug_stream.str();
-      // Cannot guarantee among unit tests that there will be >1 solution.
-    }
-  }
-}
-
-// Test that hitting search space limit results in correct error status.
-TEST(FormatterEndToEndTest, UnfinishedLineWrapSearching) {
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-
-  const std::string_view code("parameter int x = 1+1;\n");
-
-  std::ostringstream stream, debug_stream;
-  ExecutionControl control;
-  control.max_search_states = 2;  // Cause search to abort early.
-  control.stream = &debug_stream;
-  const auto status = FormatVerilog(code, "<filename>", style, stream,
-                                    kEnableAllLines, control);
-  EXPECT_EQ(status.code(), StatusCode::kResourceExhausted);
-  EXPECT_TRUE(absl::StartsWith(status.message(), "***"));
-}
-
-static constexpr FormatterTestCase kOnelineFormatBaselineTestCases[] = {
-    // Reference - following test cases should not be affected by the switch
-    {// Minimal useful case
-     "covergroup c @ (posedge clk); coverpoint a; endgroup\n",
-     "covergroup c @(posedge clk);\n"
-     "  coverpoint a;\n"
-     "endgroup\n"},
-    {// Multiple coverpoints
-     "covergroup foo @(posedge clk); coverpoint a; coverpoint b; "
-     "coverpoint c; coverpoint d; endgroup\n",
-     "covergroup foo @(posedge clk);\n"
-     "  coverpoint a;\n"
-     "  coverpoint b;\n"
-     "  coverpoint c;\n"
-     "  coverpoint d;\n"
-     "endgroup\n"},
-    {// Multiple bins
-     "covergroup memory @ (posedge ce); address  :coverpoint addr {"
-     "bins low={LOW}; bins high={HIGH};} endgroup\n",
-     "covergroup memory @(posedge ce);\n"
-     "  address: coverpoint addr {\n"
-     "    bins low = {LOW};\n"
-     "    bins high = {HIGH};\n"
-     "  }\n"
-     "endgroup\n"},
-    {// Multiple bins with multiple elements
-     "covergroup memory @ (posedge ce); address  :coverpoint addr {"
-     "bins low={0,127}; bins high={128,255};} endgroup\n",
-     "covergroup memory @(posedge ce);\n"
-     "  address: coverpoint addr {\n"
-     "    bins low = {0, 127};\n"
-     "    bins high = {128, 255};\n"
-     "  }\n"
-     "endgroup\n"},
-};
-
-// Tests that constructs that could be formatted as one-liners are formatted
-// correctly. This is the baseline test with default style, test cases should
-// not be affected by the setting.
-TEST(FormatterEndToEndTest, OnelineFormatBaselineTest) {
-  // Use a fixed style.
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.expand_coverpoints = false;
-  for (const auto &test_case : kOnelineFormatBaselineTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    // Require these test cases to be valid.
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-  // Test again with the switch, should not affect formatting
-  style.expand_coverpoints = true;
-  for (const auto &test_case : kOnelineFormatBaselineTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    // Require these test cases to be valid.
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-// Following two test sets are affected by the expand_coverponits switch
-// They should contain corresponding test cases
-static constexpr FormatterTestCase kOnelineFormatReferenceTestCases[] = {
-    {// Coverpoint that could fit on one line
-     "covergroup memory @ (posedge ce); a :coverpoint d {"
-     "bins l={0};} endgroup\n",
-     "covergroup memory @(posedge ce);\n"
-     "  a: coverpoint d {bins l = {0};}\n"
-     "endgroup\n"},
-    {// Fit with a reference
-     "covergroup memory @ (posedge ce); a :coverpoint d {"
-     "bins l={LOW};} endgroup\n",
-     "covergroup memory @(posedge ce);\n"
-     "  a: coverpoint d {bins l = {LOW};}\n"
-     "endgroup\n"},
-    {// Fit with multiple elements
-     "covergroup memory @ (posedge ce); a :coverpoint d {"
-     "bins l={0,8};} endgroup\n",
-     "covergroup memory @(posedge ce);\n"
-     "  a: coverpoint d {bins l = {0, 8};}\n"
-     "endgroup\n"},
-};
-
-static constexpr FormatterTestCase kOnelineFormatExpandTestCases[] = {
-    {// Coverpoint that could fit on one line
-     "covergroup memory @ (posedge ce); a :coverpoint d {"
-     "bins l={0};} endgroup\n",
-     "covergroup memory @(posedge ce);\n"
-     "  a: coverpoint d {\n"
-     "    bins l = {0};\n"
-     "  }\n"
-     "endgroup\n"},
-    {// Fit with a reference
-     "covergroup memory @ (posedge ce); a :coverpoint d {"
-     "bins l={LOW};} endgroup\n",
-     "covergroup memory @(posedge ce);\n"
-     "  a: coverpoint d {\n"
-     "    bins l = {LOW};\n"
-     "  }\n"
-     "endgroup\n"},
-    {// Fit with multiple elements
-     "covergroup memory @ (posedge ce); a :coverpoint d {"
-     "bins l={0,8};} endgroup\n",
-     "covergroup memory @(posedge ce);\n"
-     "  a: coverpoint d {\n"
-     "    bins l = {0, 8};\n"
-     "  }\n"
-     "endgroup\n"},
-};
-
-TEST(FormatterEndToEndTest, OnelineFormatReferenceTest) {
-  // Use a fixed style.
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.expand_coverpoints = false;
-
-  for (const auto &test_case : kOnelineFormatReferenceTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    // Require these test cases to be valid.
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-// Tests that constructs that could be formatted as one-liners are expanded
-// correctly. This is the baseline test with default style
-TEST(FormatterEndToEndTest, OnelineFormatExpandTest) {
-  // Use a fixed style.
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.expand_coverpoints = true;
-
-  for (const auto &test_case : kOnelineFormatExpandTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    // Require these test cases to be valid.
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-struct DimensionsAlignmentTestCase {
-  std::string_view input;
-  std::string_view expected[4];
-};
-
-static constexpr DimensionsAlignmentTestCase
-    kPortDeclarationDimensionsAlignmentTestCases[] = {
-        {"import \"DPI-C\" context function void func(\n"
-         "input bit foo,\n"
-         "input bit [2] foobar,\n"
-         "input bit [24:16] bar,\n"
-         "input bit [2:0][31:0] baz,\n"
-         "input bit [4][24:0][16:0] foobarbaz[],\n"
-         "input bit [FOOBAZ][31:24] qux[16],\n"
-         "input bit [16] quux[8:2][16][32],\n"
-         "output bit [2:0][2:0][2:0] quuz[8][16:12]\n"
-         ");\n",
-         {
-             "import \"DPI-C\" context function void func(\n"
-             "  input  bit                       foo,\n"
-             "  input  bit [     2]              foobar,\n"
-             "  input  bit [ 24:16]              bar,\n"
-             "  input  bit [   2:0][ 31:0]       baz,\n"
-             "  input  bit [     4][ 24:0][16:0] foobarbaz[   ],\n"
-             "  input  bit [FOOBAZ][31:24]       qux      [ 16],\n"
-             "  input  bit [    16]              quux     [8:2][   16][32],\n"
-             "  output bit [   2:0][  2:0][ 2:0] quuz     [  8][16:12]\n"
-             ");\n",
-             "import \"DPI-C\" context function void func(\n"
-             "  input  bit                       foo,\n"
-             "  input  bit [     2]              foobar,\n"
-             "  input  bit [ 24:16]              bar,\n"
-             "  input  bit [   2:0][ 31:0]       baz,\n"
-             "  input  bit [     4][ 24:0][16:0] foobarbaz         [     ],\n"
-             "  input  bit [FOOBAZ][31:24]       qux               [   16],\n"
-             "  input  bit [    16]              quux     [8:2][16][   32],\n"
-             "  output bit [   2:0][  2:0][ 2:0] quuz          [ 8][16:12]\n"
-             ");\n",
-             "import \"DPI-C\" context function void func(\n"
-             "  input  bit                      foo,\n"
-             "  input  bit              [    2] foobar,\n"
-             "  input  bit              [24:16] bar,\n"
-             "  input  bit      [   2:0][ 31:0] baz,\n"
-             "  input  bit [  4][  24:0][ 16:0] foobarbaz[   ],\n"
-             "  input  bit      [FOOBAZ][31:24] qux      [ 16],\n"
-             "  input  bit              [   16] quux     [8:2][   16][32],\n"
-             "  output bit [2:0][   2:0][  2:0] quuz     [  8][16:12]\n"
-             ");\n",
-             "import \"DPI-C\" context function void func(\n"
-             "  input  bit                      foo,\n"
-             "  input  bit              [    2] foobar,\n"
-             "  input  bit              [24:16] bar,\n"
-             "  input  bit      [   2:0][ 31:0] baz,\n"
-             "  input  bit [  4][  24:0][ 16:0] foobarbaz         [     ],\n"
-             "  input  bit      [FOOBAZ][31:24] qux               [   16],\n"
-             "  input  bit              [   16] quux     [8:2][16][   32],\n"
-             "  output bit [2:0][   2:0][  2:0] quuz          [ 8][16:12]\n"
-             ");\n",
-         }},
-        {"module m(\n"
-         "output bit [2:0][2:0][2:0] quuz[8][16:12],\n"
-         "input bit [16] quux[8:2][16][32],\n"
-         "input bit [FOOBAZ][31:24] qux[16],\n"
-         "input bit [4][24:0][16:0] foobaz[],\n"
-         "input bit [2:0][31:0] baz,\n"
-         "input bit [24:16] bar,\n"
-         "input bit [2] foobar,\n"
-         "input bit foo\n"
-         "); endmodule:m\n",
-         {
-             "module m (\n"
-             "    output bit [   2:0][  2:0][ 2:0] quuz  [  8][16:12],\n"
-             "    input  bit [    16]              quux  [8:2][   16][32],\n"
-             "    input  bit [FOOBAZ][31:24]       qux   [ 16],\n"
-             "    input  bit [     4][ 24:0][16:0] foobaz[   ],\n"
-             "    input  bit [   2:0][ 31:0]       baz,\n"
-             "    input  bit [ 24:16]              bar,\n"
-             "    input  bit [     2]              foobar,\n"
-             "    input  bit                       foo\n"
-             ");\n"
-             "endmodule : m\n",
-             "module m (\n"
-             "    output bit [   2:0][  2:0][ 2:0] quuz       [ 8][16:12],\n"
-             "    input  bit [    16]              quux  [8:2][16][   32],\n"
-             "    input  bit [FOOBAZ][31:24]       qux            [   16],\n"
-             "    input  bit [     4][ 24:0][16:0] foobaz         [     ],\n"
-             "    input  bit [   2:0][ 31:0]       baz,\n"
-             "    input  bit [ 24:16]              bar,\n"
-             "    input  bit [     2]              foobar,\n"
-             "    input  bit                       foo\n"
-             ");\n"
-             "endmodule : m\n",
-             "module m (\n"
-             "    output bit [2:0][   2:0][  2:0] quuz  [  8][16:12],\n"
-             "    input  bit              [   16] quux  [8:2][   16][32],\n"
-             "    input  bit      [FOOBAZ][31:24] qux   [ 16],\n"
-             "    input  bit [  4][  24:0][ 16:0] foobaz[   ],\n"
-             "    input  bit      [   2:0][ 31:0] baz,\n"
-             "    input  bit              [24:16] bar,\n"
-             "    input  bit              [    2] foobar,\n"
-             "    input  bit                      foo\n"
-             ");\n"
-             "endmodule : m\n",
-             "module m (\n"
-             "    output bit [2:0][   2:0][  2:0] quuz       [ 8][16:12],\n"
-             "    input  bit              [   16] quux  [8:2][16][   32],\n"
-             "    input  bit      [FOOBAZ][31:24] qux            [   16],\n"
-             "    input  bit [  4][  24:0][ 16:0] foobaz         [     ],\n"
-             "    input  bit      [   2:0][ 31:0] baz,\n"
-             "    input  bit              [24:16] bar,\n"
-             "    input  bit              [    2] foobar,\n"
-             "    input  bit                      foo\n"
-             ");\n"
-             "endmodule : m\n",
-         }},
-};
-
-TEST(FormatterEndToEndTest, PortDeclarationDimensionsAlignmentTest) {
-  FormatStyle style;
-  style.column_limit = 64;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-
-  // All combinations of port_declaration_right_align_{un,}packed_dimensions
-  static const bool right_align_combinations[][2] = {
-      {false, false}, {false, true}, {true, false}, {true, true}};
-
-  for (const auto &test_case : kPortDeclarationDimensionsAlignmentTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    size_t expected_index = 0;
-    for (const auto &right_align : right_align_combinations) {
-      VLOG(1) << "style variant:\n"
-              << "port_declarations_right_align_packed_dimensions: "
-              << right_align[0] << "\n"
-              << "port_declarations_right_align_unpacked_dimensions: "
-              << right_align[1] << "\n";
-      style.port_declarations_right_align_packed_dimensions = right_align[0];
-      style.port_declarations_right_align_unpacked_dimensions = right_align[1];
-
-      std::ostringstream stream;
-
-      const auto status =
-          FormatVerilog(test_case.input, "<filename>", style, stream);
-      // Require these test cases to be valid.
-      EXPECT_OK(status) << status.message();
-      EXPECT_EQ(stream.str(), test_case.expected[expected_index++])
-          << "code:\n"
-          << test_case.input;
-    }
-  }
-}
-
-// TODO(fangism): directed tests using style variations
-
-static constexpr FormatterTestCase kNestedFunctionsTestCases40ColumnsLimit[] = {
-    {"module foo;"
-     "`uvm_info(`gfn, $sformatf(\n"
-     "\"\\n  base_vseq: generate %0d pulse in channel %0d\", cfg.num_pulses, "
-     "i), UVM_DEBUG)\n"
-     "endmodule",
-     "module foo;\n"
-     "  `uvm_info(\n"
-     "      `gfn,\n"
-     "      $sformatf(\n"
-     "          \"\\n  base_vseq: generate %0d pulse in channel %0d\",\n"
-     "          cfg.num_pulses, i), UVM_DEBUG)\n"
-     "endmodule\n"},
-    {"module foo;`uvm_info(`gfn, $sformatf("
-     "\"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\","
-     "cfg.convert2string()), UVM_LOW)\n"
-     "endmodule",
-     "module foo;\n"
-     "  `uvm_info(\n"
-     "      `gfn,\n"
-     "      $sformatf(\n"
-     "          \"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\",\n"
-     "          cfg.convert2string()),\n"
-     "      UVM_LOW)\n"  // FIXME: Wrapped by SearchLineWraps
-     "endmodule\n"},
-};
-
-TEST(FormatterEndToEndTest, FormatNestedFunctionsTestCases40ColumnsLimit) {
-  // Use a fixed style.
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-
-  for (const auto &test_case : kNestedFunctionsTestCases40ColumnsLimit) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    // Require these test cases to be valid.
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-static constexpr FormatterTestCase kNestedFunctionsTestCases60ColumnsLimit[] = {
-    {"module foo;"
-     "`uvm_info(`gfn, $sformatf(\n"
-     "\"\\n  base_vseq: generate %0d pulse in channel %0d\", cfg.num_pulses, "
-     "i), UVM_DEBUG)\n"
-     "endmodule",
-     "module foo;\n"
-     "  `uvm_info(\n"
-     "      `gfn,\n"
-     "      $sformatf(\n"
-     "          \"\\n  base_vseq: generate %0d pulse in channel %0d\",\n"
-     "          cfg.num_pulses, i), UVM_DEBUG)\n"
-     "endmodule\n"},
-    {"module foo;`uvm_info(`gfn, $sformatf("
-     "\"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\","
-     "cfg.convert2string()), UVM_LOW)\n"
-     "endmodule",
-     "module foo;\n"
-     "  `uvm_info(\n"
-     "      `gfn,\n"
-     "      $sformatf(\n"
-     "          \"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\",\n"
-     "          cfg.convert2string()), UVM_LOW)\n"
-     "endmodule\n"},
-};
-
-TEST(FormatterEndToEndTest, FormatNestedFunctionsTestCases60ColumnsLimit) {
-  // Use a fixed style.
-  FormatStyle style;
-  style.column_limit = 60;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-
-  for (const auto &test_case : kNestedFunctionsTestCases60ColumnsLimit) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    // Require these test cases to be valid.
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-static constexpr FormatterTestCase kNestedFunctionsTestCases80ColumnsLimit[] = {
-    {"module foo;"
-     "`uvm_info(`gfn, $sformatf(\n"
-     "\"\\n  base_vseq: generate %0d pulse in channel %0d\", cfg.num_pulses, "
-     "i), UVM_DEBUG)\n"
-     "endmodule",
-     "module foo;\n"
-     "  `uvm_info(`gfn, $sformatf(\"\\n  base_vseq: generate %0d pulse in "
-     "channel %0d\",\n"
-     "                            cfg.num_pulses, i), UVM_DEBUG)\n"
-     "endmodule\n"},
-    {"module foo;`uvm_info(`gfn, $sformatf("
-     "\"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\","
-     "cfg.convert2string()), UVM_LOW)\n"
-     "endmodule",
-     "module foo;\n"
-     "  `uvm_info(`gfn, $sformatf(\n"
-     "                      \"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE "
-     "|----\\n %s\",\n"
-     "                      cfg.convert2string()), UVM_LOW)\nendmodule\n"},
-    {"module x;"
-     "`uvm_fatal(`gfn, $sformatf("
-     "\"The data 0x%0h written to the signature address is formatted "
-     "incorrectly.\","
-     "signature_data))\n"
-     "endmodule",
-     "module x;\n"
-     "  `uvm_fatal(\n"
-     "      `gfn,\n"
-     "      $sformatf(\n"
-     "          \"The data 0x%0h written to the signature address is formatted "
-     "incorrectly.\",\n"
-     "          signature_data))\n"
-     "endmodule\n"},
-};
-
-TEST(FormatterEndToEndTest, FormatNestedFunctionsTestCases80ColumnsLimit) {
-  // Use a fixed style.
-  FormatStyle style;
-  style.column_limit = 80;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-
-  for (const auto &test_case : kNestedFunctionsTestCases80ColumnsLimit) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    // Require these test cases to be valid.
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-static constexpr FormatterTestCase kNestedFunctionsTestCases100ColumnsLimit[] =
-    {
-        {"module foo;"
-         "`uvm_info(`gfn, $sformatf(\n"
-         "\"\\n  base_vseq: generate %0d pulse in channel %0d\", "
-         "cfg.num_pulses, i), UVM_DEBUG)\n"
-         "endmodule",
-         "module foo;\n"
-         "  `uvm_info(`gfn, $sformatf(\"\\n  base_vseq: generate %0d pulse in "
-         "channel %0d\", cfg.num_pulses, i),\n"
-         "            UVM_DEBUG)\n"
-         "endmodule\n"},
-        {"module foo;`uvm_info(`gfn, $sformatf("
-         "\"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\","
-         "cfg.convert2string()), UVM_LOW)\n"
-         "endmodule",
-         "module foo;\n"
-         "  `uvm_info(`gfn, $sformatf(\"\\n\\n\\t ----| STARTING AES MAIN "
-         "SEQUENCE |----\\n %s\",\n"
-         "                            cfg.convert2string()), UVM_LOW)\n"
-         "endmodule\n"},
-        {"module x;"
-         "`uvm_fatal(`gfn, $sformatf("
-         "\"The data 0x%0h written to the signature address is formatted "
-         "incorrectly.\","
-         "signature_data))\n"
-         "endmodule",
-         "module x;\n"
-         "  `uvm_fatal(`gfn, $sformatf(\n"
-         "                       \"The data 0x%0h written to the signature "
-         "address is formatted incorrectly.\",\n"
-         "                       signature_data))\n"
-         "endmodule\n"},
-        {// nested modules, three-levels
-         "module x; module y; module z;"
-         "`uvm_fatal(`gfn, $sformatf("
-         "\"The data 0x%0h written to the signature address is formatted "
-         "incorrectly.\","
-         "signature_data))\n"
-         "endmodule endmodule endmodule",
-         "module x;\n"
-         "  module y;\n"
-         "    module z;\n"
-         "      `uvm_fatal(`gfn,\n"
-         "                 $sformatf(\n"
-         "                     \"The data 0x%0h written to the signature "
-         "address is formatted incorrectly.\",\n"
-         "                     signature_data))\n"
-         "    endmodule\n"
-         "  endmodule\n"
-         "endmodule\n"},
-};
-
-TEST(FormatterEndToEndTest, FormatNestedFunctionsTestCases100ColumnsLimit) {
-  // Use a fixed style.
-  FormatStyle style;
-  style.column_limit = 100;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-
-  for (const auto &test_case : kNestedFunctionsTestCases100ColumnsLimit) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    // Require these test cases to be valid.
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-static constexpr FormatterTestCase noCompactIndexingAndSelectionsTestCases[]{
-    {"module m1 ();\n"
-     "  assign s1 = msg[1 : 2 + 3];\n"
-     "  assign s2 = {<<8{msg[1 : 2 + 3]}};\n"
-     "endmodule\n",
-     "module m1 ();\n"
-     "  assign s1 = msg[1 : 2 + 3];\n"
-     "  assign s2 = {<< 8{msg[1 : 2 + 3]}};\n"
-     "endmodule\n"}};
-
-TEST(FormatterEndToEndTest, compactIndexingAndSelectionsTestCases) {
-  // Use a fixed style.
-  FormatStyle style;
-  style.column_limit = 100;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.compact_indexing_and_selections = false;
-
-  for (const auto &test_case : noCompactIndexingAndSelectionsTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    // Require these test cases to be valid.
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-static constexpr FormatterTestCase kFunctionCallsWithComments[] = {
-    {// no comments
-     "module foo;\n"
-     "`uvm_info(`gfn, \"xx\",\n"
-     "cfg.num_pulses, i, UVM_DEBUG)\n"
-     "endmodule",
-     "module foo;\n"
-     "  `uvm_info(`gfn, \"xx\", cfg.num_pulses, i, UVM_DEBUG)\n"
-     "endmodule\n"},
-    {// one comment
-     "module foo;\n"
-     "`uvm_info(`gfn, \"xx\",  // yy\n"
-     "cfg.num_pulses, i, UVM_DEBUG)\n"
-     "endmodule",
-     "module foo;\n"
-     "  `uvm_info(`gfn, \"xx\",  // yy\n"
-     "            cfg.num_pulses, i, UVM_DEBUG)\n"
-     "endmodule\n"},
-    {// two comments
-     "module foo;\n"
-     "`uvm_info(`gfn, \"xx\",  "
-     "    cfg.num_pulses, // xx\n"
-     " i, UVM_DEBUG)// uuu\n"
-     "endmodule",
-     "module foo;\n"
-     "  `uvm_info(`gfn, \"xx\", cfg.num_pulses,  // xx\n"
-     "            i, UVM_DEBUG)  // uuu\n"
-     "endmodule\n"},
-
-    {// nested function calls with comments
-     "module foo;"
-     "`uvm_info(`gfn, $sformatf(\"\\n  base_vseq: generate %0d"
-     " pulse in channel %0d\", cfg.num_pulses, // comment\n"
-     " i), UVM_DEBUG)\n"
-     "endmodule",
-     "module foo;\n"
-     "  `uvm_info(`gfn, $sformatf(\"\\n  base_vseq: generate %0d pulse in "
-     "channel %0d\",\n"
-     "                            cfg.num_pulses,  // comment\n"
-     "                            i), UVM_DEBUG)\n"
-     "endmodule\n"},
-};
-
-TEST(FormatterEndToEndTest, FunctionCallsWithComments) {
-  // Use a fixed style.
-  FormatStyle style;
-  style.column_limit = 100;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-
-  for (const auto &test_case : kFunctionCallsWithComments) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    // Require these test cases to be valid.
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-// Extracts the first non-whitespace token and prepends it with number of
-// of newlines seen in front of it. So "\n \n\n  foo" -> "3foo"
-std::string NLCountAndfirstWord(std::string_view str) {
-  std::string result;
-  int newline_count = 0;
-  std::string_view::const_iterator begin = str.begin();
-  for (/**/; begin < str.end(); ++begin) {
-    if (!isspace(*begin)) break;
-    newline_count += (*begin == '\n');
-  }
-  // Emit number of newlines seen up to first token.
-  result.append(1,
-                static_cast<char>(newline_count + '0'));  // single digit itoa
-  std::string_view::const_iterator end_str = begin;
-  for (/**/; end_str < str.end() && !isspace(*end_str); ++end_str) {
-  }
-  result.append(begin, end_str);
-  return result;
-}
-
-// Similar to NLCountAndfirstWord() but looking at the last token and trailing
-// newlines.
-std::string lastWordAndNLCount(std::string_view str) {
-  std::string result;
-  int newline_count = 0;
-  std::string_view::const_iterator back = str.end() - 1;
-  for (/**/; back >= str.begin(); --back) {
-    if (!isspace(*back)) break;
-    newline_count += (*back == '\n');
-  }
-
-  std::string_view::const_iterator start_str = back;
-  for (/**/; start_str >= str.begin() && !isspace(*start_str); --start_str) {
-  }
-  result.append(&*(start_str + 1), back - start_str);
-  // Emit number of newlines seen following last token.
-  result.append(1,
-                static_cast<char>(newline_count + '0'));  // single digit itoa
-  return result;
-}
-
-// Testing the tester...
-TEST(FormatterTestInternal, TokenExtractorAndLineCounterTestFixtureTest) {
-  std::string_view str = "\n \nhello world \n \n";
-  ASSERT_EQ(NLCountAndfirstWord(str), "2hello");
-  ASSERT_EQ(NLCountAndfirstWord(str.substr(1)), "1hello");
-  ASSERT_EQ(NLCountAndfirstWord(str.substr(3)), "0hello");
-
-  ASSERT_EQ(lastWordAndNLCount(str), "world2");
-  ASSERT_EQ(lastWordAndNLCount(str.substr(0, str.length() - 1)), "world1");
-  ASSERT_EQ(lastWordAndNLCount(str.substr(0, str.length() - 2)), "world1");
-  ASSERT_EQ(lastWordAndNLCount(str.substr(0, str.length() - 3)), "world0");
-
-  str = "aworld \n \n";  // Make sure to not overshoot begin.
-  ASSERT_EQ(lastWordAndNLCount(str.substr(1)), "world2");
-}
-
-TEST(FormatterEndToEndTest, RangeFormattingOnlyEmittingRelevantLines) {
-  // Including some empty lines to make sure the formatting
-  static constexpr std::string_view unformatted =
-      R"(     module foo (// non-port comment
-
-     // some comment
-
-  input  logic  a, input logic  b,input bit [2]
-foobar, input    bit [4] foobaz,
-    input bit [2]    quux
-
-
-        ); endmodule
-)";
-
-  std::vector<std::string_view> lines = absl::StrSplit(unformatted, '\n');
-  const int kLineCount = lines.size();
-
-  FormatStyle style;
-
-  // Go through all possible sub-ranges, format these, and compare that the
-  // output of the range output is contained inside the full format given the
-  // same sub-range.
-  for (int start_line = 0; start_line < kLineCount; ++start_line) {
-    for (int end_line = start_line; end_line < kLineCount; ++end_line) {
-      // Line numbers are 1-index based.
-      const verible::Interval<int> range = {start_line + 1, end_line + 1};
-
-      // Format full text for reference
-      std::ostringstream full_format;
-      absl::Status status =
-          FormatVerilog(unformatted, "<filename>", style, full_format, {range});
-      EXPECT_OK(status) << status.message();
-
-      // To test: range formatted.
-      std::string range_formatted;
-      status = FormatVerilogRange(unformatted, "<filename>", style,
-                                  &range_formatted, range);
-      EXPECT_OK(status) << status.message();
-      if (range.empty()) {  // Nothing to format: expect empty output.
-        EXPECT_TRUE(range_formatted.empty());
-        continue;
-      }
-
-      // Area we cover in the input (include the final newline);
-      const auto source_begin = lines[start_line].begin();
-      const auto source_end = lines[end_line - 1].end() + 1;  // include \n
-      const std::string_view range_unformatted(&*source_begin,
-                                               source_end - source_begin);
-
-      // To compare that we indeed formatted the requested reqgion, we make
-      // sure that the first and last token (simplified: non-whitespace word)
-      // in the input of the range to be formatted is
-      // exactly the first and last token that comes out of the range
-      // formatted snippet.
-      //
-      // While the whitespace might be different at the beginning and end
-      // due to formatting, the number of _newlines_ at the beginning and end
-      // should be the same, so we include the newline count in the comparison.
-
-      EXPECT_EQ(NLCountAndfirstWord(range_unformatted),
-                NLCountAndfirstWord(range_formatted))
-          << "'" << range_unformatted << "' vs. '" << range_formatted << "'";
-
-      // ... same for the last word.
-      EXPECT_EQ(lastWordAndNLCount(range_unformatted),
-                lastWordAndNLCount(range_formatted))
-          << "'" << range_unformatted << "' vs. '" << range_formatted << "'";
-
-      EXPECT_LE(range_formatted.length(), full_format.str().length());
-      EXPECT_THAT(full_format.str(), HasSubstr(range_formatted));
-    }
-  }
-}
-
-// Creates a string_view spanning a whole string literal.
-// Works correctly with strings containing null bytes.
-template <std::size_t N>
-constexpr std::string_view string_view_from_literal(const char (&s)[N]) {
-  return std::string_view(s, N - 1);
-}
-
-// The following regressions have been found by a fuzzer, so the input might
-// look a bit 'funny'. Nevertheless, they expose real bugs in the code.
-
-[[maybe_unused]] void TestForNonCrash(std::string_view input) {
-  using verible::EscapeString;
-  FormatStyle style;
-  std::ostringstream stream;
-  const auto status = FormatVerilog(input, "<filename>", style, stream);
-  // If we are here, we did at least not crash, which is all we desire for
-  // the fuzzer tests.
-  // Other issues that are reported correctly (probably due to strange inputs
-  // generated by the fuzzer) are ok, so we just log them here FYI.
-  if (!status.ok()) {
-    LOG(INFO) << "No crash, but format failed for other reason: "
-              << status.message() << "\nEscaped input: \""
-              << EscapeString(input) << "\"";
-  }
-}
-
-#if 0
-// https://github.com/chipsalliance/verible/issues/1381
-TEST(FormatterEndToEndTest, FuzzingRegression_1381) {
-  TestForNonCrash(string_view_from_literal("P#(\0\0//\0//\0,);"));
-  TestForNonCrash(string_view_from_literal("P#(\0\0//\0,,//\0,"));
-}
-#endif
-
-// https://github.com/chipsalliance/verible/issues/1384
-TEST(FormatterEndToEndTest, FuzzingRegression_UseAfterFree_1384) {
-  TestForNonCrash("`c(`c(//););");
-}
-
-// https://github.com/chipsalliance/verible/issues/1386
-TEST(FormatterEndToEndTest, FuzzingRegressionHierachyInvariant) {
-  // Original sample input from fuzzer
-  TestForNonCrash(string_view_from_literal("`c(`c()\0;);"));
-  // Lexically correct variant (`\0` -> `\n`)
-  TestForNonCrash(string_view_from_literal("`c(`c()\n;);"));
-  // Lexically correct variant (`\0` removed)
-  TestForNonCrash(string_view_from_literal("`c(`c(););"));
-}
-
-// Possibly same ? https://github.com/chipsalliance/verible/issues/1386
-TEST(FormatterEndToEndTest, FuzzingRegression_outofmemory) {
-  TestForNonCrash(string_view_from_literal("`f(1'O`f())\n"));
-}
-
-TEST(FormatterEndToEndTest, AlignmentGroupBoundaryNone) {
-  // Default behavior: separator comments and blank lines do NOT break groups.
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// Separator comment does not break alignment group
-       "module m;\n"
-       "assign foo  = 1'b1;\n"
-       "assign baar = 1'b0;\n"
-       "// ============\n"
-       "assign baaaaz = 1'b1;\n"
-       "assign c      = 1'b0;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  assign foo    = 1'b1;\n"
-       "  assign baar   = 1'b0;\n"
-       "  // ============\n"
-       "  assign baaaaz = 1'b1;\n"
-       "  assign c      = 1'b0;\n"
-       "endmodule\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.alignment_group_boundary = AlignmentGroupBoundary::kNone;
-  style.assignment_statement_alignment = AlignmentPolicy::kAlign;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-TEST(FormatterEndToEndTest, AlignmentGroupBoundarySeparatorComments) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// Separator comment breaks alignment group
-       "module m;\n"
-       "assign foo  = 1'b1;\n"
-       "assign baar = 1'b0;\n"
-       "// ============\n"
-       "assign baaaaz = 1'b1;\n"
-       "assign c      = 1'b0;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  assign foo  = 1'b1;\n"
-       "  assign baar = 1'b0;\n"
-       "  // ============\n"
-       "  assign baaaaz = 1'b1;\n"
-       "  assign c      = 1'b0;\n"
-       "endmodule\n"},
-      {// Dashes separator also breaks
-       "module m;\n"
-       "assign foo  = 1'b1;\n"
-       "assign baar = 1'b0;\n"
-       "// ------------\n"
-       "assign baaaaz = 1'b1;\n"
-       "assign c      = 1'b0;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  assign foo  = 1'b1;\n"
-       "  assign baar = 1'b0;\n"
-       "  // ------------\n"
-       "  assign baaaaz = 1'b1;\n"
-       "  assign c      = 1'b0;\n"
-       "endmodule\n"},
-      {// Captioned divider (text between separator runs) also breaks
-       "module m;\n"
-       "assign foo  = 1'b1;\n"
-       "assign baar = 1'b0;\n"
-       "// ------ section heading ------\n"
-       "assign baaaaz = 1'b1;\n"
-       "assign c      = 1'b0;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  assign foo  = 1'b1;\n"
-       "  assign baar = 1'b0;\n"
-       "  // ------ section heading ------\n"
-       "  assign baaaaz = 1'b1;\n"
-       "  assign c      = 1'b0;\n"
-       "endmodule\n"},
-      {// Leading-only divider run with trailing caption text
-       "module m;\n"
-       "assign foo  = 1'b1;\n"
-       "assign baar = 1'b0;\n"
-       "// ==== Registers\n"
-       "assign baaaaz = 1'b1;\n"
-       "assign c      = 1'b0;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  assign foo  = 1'b1;\n"
-       "  assign baar = 1'b0;\n"
-       "  // ==== Registers\n"
-       "  assign baaaaz = 1'b1;\n"
-       "  assign c      = 1'b0;\n"
-       "endmodule\n"},
-      {// No space after // also works
-       "module m;\n"
-       "assign foo  = 1'b1;\n"
-       "assign baar = 1'b0;\n"
-       "//============\n"
-       "assign baaaaz = 1'b1;\n"
-       "assign c      = 1'b0;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  assign foo  = 1'b1;\n"
-       "  assign baar = 1'b0;\n"
-       "  //============\n"
-       "  assign baaaaz = 1'b1;\n"
-       "  assign c      = 1'b0;\n"
-       "endmodule\n"},
-      {// Slash separator (/////) also works
-       "module m;\n"
-       "assign foo  = 1'b1;\n"
-       "assign baar = 1'b0;\n"
-       "//////////\n"
-       "assign baaaaz = 1'b1;\n"
-       "assign c      = 1'b0;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  assign foo  = 1'b1;\n"
-       "  assign baar = 1'b0;\n"
-       "  //////////\n"
-       "  assign baaaaz = 1'b1;\n"
-       "  assign c      = 1'b0;\n"
-       "endmodule\n"},
-      {// Regular comment does NOT break alignment
-       "module m;\n"
-       "assign foo  = 1'b1;\n"
-       "assign baar = 1'b0;\n"
-       "// Title text\n"
-       "assign baaaaz = 1'b1;\n"
-       "assign c      = 1'b0;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  assign foo    = 1'b1;\n"
-       "  assign baar   = 1'b0;\n"
-       "  // Title text\n"
-       "  assign baaaaz = 1'b1;\n"
-       "  assign c      = 1'b0;\n"
-       "endmodule\n"},
-      {// Multi-line comment block with separators
-       "module m;\n"
-       "assign foo  = 1'b1;\n"
-       "assign baar = 1'b0;\n"
-       "// ============\n"
-       "// Title\n"
-       "// ============\n"
-       "assign baaaaz = 1'b1;\n"
-       "assign c      = 1'b0;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  assign foo  = 1'b1;\n"
-       "  assign baar = 1'b0;\n"
-       "  // ============\n"
-       "  // Title\n"
-       "  // ============\n"
-       "  assign baaaaz = 1'b1;\n"
-       "  assign c      = 1'b0;\n"
-       "endmodule\n"},
-      {// Short repeated body (3 chars) does NOT break
-       "module m;\n"
-       "assign foo  = 1'b1;\n"
-       "assign baar = 1'b0;\n"
-       "// ---\n"
-       "assign baaaaz = 1'b1;\n"
-       "assign c      = 1'b0;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  assign foo    = 1'b1;\n"
-       "  assign baar   = 1'b0;\n"
-       "  // ---\n"
-       "  assign baaaaz = 1'b1;\n"
-       "  assign c      = 1'b0;\n"
-       "endmodule\n"},
-      {// Declarations also respect separator comments
-       "module m;\n"
-       "logic       a;\n"
-       "logic [7:0] b;\n"
-       "// ============\n"
-       "logic c_long_name;\n"
-       "logic d;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  logic       a;\n"
-       "  logic [7:0] b;\n"
-       "  // ============\n"
-       "  logic c_long_name;\n"
-       "  logic d;\n"
-       "endmodule\n"},
-      {// Statements in always blocks
-       "module m;\n"
-       "always_comb begin\n"
-       "aaaaa = b;\n"
-       "c     = 1'b0;\n"
-       "// ============\n"
-       "dd = eee;\n"
-       "ffffff = g;\n"
-       "end\n"
-       "endmodule\n",
-       "module m;\n"
-       "  always_comb begin\n"
-       "    aaaaa = b;\n"
-       "    c     = 1'b0;\n"
-       "    // ============\n"
-       "    dd     = eee;\n"
-       "    ffffff = g;\n"
-       "  end\n"
-       "endmodule\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.alignment_group_boundary = AlignmentGroupBoundary::kSeparatorComments;
-  style.assignment_statement_alignment = AlignmentPolicy::kAlign;
-  style.module_net_variable_alignment = AlignmentPolicy::kAlign;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-TEST(FormatterEndToEndTest, AlignmentGroupBoundaryBlankLines) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// Blank line breaks alignment group
-       "module m;\n"
-       "assign foo  = 1'b1;\n"
-       "assign baar = 1'b0;\n"
-       "\n"
-       "assign baaaaz = 1'b1;\n"
-       "assign c      = 1'b0;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  assign foo  = 1'b1;\n"
-       "  assign baar = 1'b0;\n"
-       "\n"
-       "  assign baaaaz = 1'b1;\n"
-       "  assign c      = 1'b0;\n"
-       "endmodule\n"},
-      {// No blank line: single alignment group
-       "module m;\n"
-       "assign foo  = 1'b1;\n"
-       "assign baar = 1'b0;\n"
-       "assign baaaaz = 1'b1;\n"
-       "assign c      = 1'b0;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  assign foo    = 1'b1;\n"
-       "  assign baar   = 1'b0;\n"
-       "  assign baaaaz = 1'b1;\n"
-       "  assign c      = 1'b0;\n"
-       "endmodule\n"},
-      {// Single item before blank line (not enough for alignment)
-       "module m;\n"
-       "assign foo = 1'b1;\n"
-       "\n"
-       "assign baaaaz = 1'b1;\n"
-       "assign c      = 1'b0;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  assign foo = 1'b1;\n"
-       "\n"
-       "  assign baaaaz = 1'b1;\n"
-       "  assign c      = 1'b0;\n"
-       "endmodule\n"},
-      {// Separator comment does NOT break (only blank lines)
-       "module m;\n"
-       "assign foo  = 1'b1;\n"
-       "assign baar = 1'b0;\n"
-       "// ============\n"
-       "assign baaaaz = 1'b1;\n"
-       "assign c      = 1'b0;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  assign foo    = 1'b1;\n"
-       "  assign baar   = 1'b0;\n"
-       "  // ============\n"
-       "  assign baaaaz = 1'b1;\n"
-       "  assign c      = 1'b0;\n"
-       "endmodule\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.alignment_group_boundary = AlignmentGroupBoundary::kBlankLines;
-  style.assignment_statement_alignment = AlignmentPolicy::kAlign;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-TEST(FormatterEndToEndTest,
-     AlignmentGroupBoundaryBlankLinesAndSeparatorComments) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// Both blank line and separator break groups
-       "module m;\n"
-       "assign foo  = 1'b1;\n"
-       "assign baar = 1'b0;\n"
-       "\n"
-       "assign baaaaz = 1'b1;\n"
-       "assign c      = 1'b0;\n"
-       "// ============\n"
-       "assign dd  = 1'b1;\n"
-       "assign eee = 1'b0;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  assign foo  = 1'b1;\n"
-       "  assign baar = 1'b0;\n"
-       "\n"
-       "  assign baaaaz = 1'b1;\n"
-       "  assign c      = 1'b0;\n"
-       "  // ============\n"
-       "  assign dd  = 1'b1;\n"
-       "  assign eee = 1'b0;\n"
-       "endmodule\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.alignment_group_boundary =
-      AlignmentGroupBoundary::kBlankLinesAndSeparatorComments;
-  style.assignment_statement_alignment = AlignmentPolicy::kAlign;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-// Regression for https://github.com/chipsalliance/verible/issues/2540:
-// Trailing EOL comment after `end` before `else if` must not change whether
-// the else-if assignment stays on one line across re-format (convergence).
-TEST(FormatterEndToEndTest, EndElseIfWithEOLCommentConverges) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// Comment on its own line between end and else if
-       "module m;\n"
-       "  always_comb begin\n"
-       "    case (state)\n"
-       "      STATE_A: begin\n"
-       "        if (cond_aaaa) next_state_value = STATE_B;\n"
-       "        else if (cond_bbbb) begin\n"
-       "          next_state_value = STATE_B;\n"
-       "        end\n"
-       "        // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"
-       "        else if (cond_cccc) next_state_value = STATE_C;\n"
-       "      end\n"
-       "    endcase\n"
-       "  end\n"
-       "endmodule\n",
-       "module m;\n"
-       "  always_comb begin\n"
-       "    case (state)\n"
-       "      STATE_A: begin\n"
-       "        if (cond_aaaa) next_state_value = STATE_B;\n"
-       "        else if (cond_bbbb) begin\n"
-       "          next_state_value = STATE_B;\n"
-       "        end  // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"
-       "        else if (cond_cccc) next_state_value = STATE_C;\n"
-       "      end\n"
-       "    endcase\n"
-       "  end\n"
-       "endmodule\n"},
-      {// Same construct with comment already on the end line
-       "module m;\n"
-       "  always_comb begin\n"
-       "    case (state)\n"
-       "      STATE_A: begin\n"
-       "        if (cond_aaaa) next_state_value = STATE_B;\n"
-       "        else if (cond_bbbb) begin\n"
-       "          next_state_value = STATE_B;\n"
-       "        end  // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"
-       "        else if (cond_cccc) next_state_value = STATE_C;\n"
-       "      end\n"
-       "    endcase\n"
-       "  end\n"
-       "endmodule\n",
-       "module m;\n"
-       "  always_comb begin\n"
-       "    case (state)\n"
-       "      STATE_A: begin\n"
-       "        if (cond_aaaa) next_state_value = STATE_B;\n"
-       "        else if (cond_bbbb) begin\n"
-       "          next_state_value = STATE_B;\n"
-       "        end  // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"
-       "        else if (cond_cccc) next_state_value = STATE_C;\n"
-       "      end\n"
-       "    endcase\n"
-       "  end\n"
-       "endmodule\n"},
-  };
-  FormatStyle style;  // default column_limit (100)
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-// Verify kAlign behavior for body-level param/localparam declarations
-// in module and package bodies.
-TEST(FormatterEndToEndTest, ParamDeclarationAlignmentBasics) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// localparam alignment in module body
-       "module m;\n"
-       "localparam foo = 4'b0000;\n"
-       "localparam barr = 4'b0010;\n"
-       "localparam baaaaz = 4'b0111;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  localparam foo    = 4'b0000;\n"
-       "  localparam barr   = 4'b0010;\n"
-       "  localparam baaaaz = 4'b0111;\n"
-       "endmodule\n"},
-      {// localparam alignment in package body
-       "package p;\n"
-       "localparam foo = 4'b0000;\n"
-       "localparam barr = 4'b0010;\n"
-       "localparam baaaaz = 4'b0111;\n"
-       "endpackage\n",
-       "package p;\n"
-       "  localparam foo    = 4'b0000;\n"
-       "  localparam barr   = 4'b0010;\n"
-       "  localparam baaaaz = 4'b0111;\n"
-       "endpackage\n"},
-      {// parameter alignment in module body
-       "module m;\n"
-       "parameter int foo = 1;\n"
-       "parameter int barr = 2;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  parameter int foo  = 1;\n"
-       "  parameter int barr = 2;\n"
-       "endmodule\n"},
-      {// parameter alignment in package body
-       "package p;\n"
-       "parameter int foo = 1;\n"
-       "parameter int barrrr = 2;\n"
-       "endpackage\n",
-       "package p;\n"
-       "  parameter int foo    = 1;\n"
-       "  parameter int barrrr = 2;\n"
-       "endpackage\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-// Verify kFlushLeft behavior: body-level param/localparam declarations
-// are not aligned.
-TEST(FormatterEndToEndTest, ParamDeclarationAlignmentFlushLeft) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// module body: parameters are not aligned
-       "module m;\n"
-       "localparam foo = 4'b0000;\n"
-       "localparam barr = 4'b0010;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  localparam foo = 4'b0000;\n"
-       "  localparam barr = 4'b0010;\n"
-       "endmodule\n"},
-      {// package context: flush-left
-       "package p;\n"
-       "localparam foo = 4'b0000;\n"
-       "localparam barr = 4'b0010;\n"
-       "endpackage\n",
-       "package p;\n"
-       "  localparam foo = 4'b0000;\n"
-       "  localparam barr = 4'b0010;\n"
-       "endpackage\n"},
-      {// generate context: flush-left
-       "module m;\n"
-       "generate\n"
-       "localparam foo = 1;\n"
-       "localparam barr = 2;\n"
-       "endgenerate\n"
-       "endmodule\n",
-       "module m;\n"
-       "  generate\n"
-       "    localparam foo = 1;\n"
-       "    localparam barr = 2;\n"
-       "  endgenerate\n"
-       "endmodule\n"},
-      {// parameter in module body: flush-left
-       "module m;\n"
-       "parameter int W = 8;\n"
-       "parameter int HHHH = 2;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  parameter int W = 8;\n"
-       "  parameter int HHHH = 2;\n"
-       "endmodule\n"},
-      {// mixed parameter and localparam: flush-left, no alignment
-       "module m;\n"
-       "parameter int W = 8;\n"
-       "localparam L = 4;\n"
-       "parameter int H = 2;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  parameter int W = 8;\n"
-       "  localparam L = 4;\n"
-       "  parameter int H = 2;\n"
-       "endmodule\n"},
-      {// interface context: flush-left
-       "interface my_if;\n"
-       "localparam foo = 1;\n"
-       "localparam barr = 2;\n"
-       "endinterface\n",
-       "interface my_if;\n"
-       "  localparam foo = 1;\n"
-       "  localparam barr = 2;\n"
-       "endinterface\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.parameter_declaration_alignment = AlignmentPolicy::kFlushLeft;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-// Verify kPreserve behavior: body-level param/localparam declarations
-// maintain their existing spacing.
-TEST(FormatterEndToEndTest, ParamDeclarationAlignmentPreserve) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// module body: existing spacing is kept
-       "module m;\n"
-       "localparam foo = 4'b0000;\n"
-       "localparam barr  = 4'b0010;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  localparam foo = 4'b0000;\n"
-       "  localparam barr  = 4'b0010;\n"
-       "endmodule\n"},
-      {// package: existing flush-left spacing preserved
-       "package p;\n"
-       "localparam foo = 4'b0000;\n"
-       "localparam barr = 4'b0010;\n"
-       "endpackage\n",
-       "package p;\n"
-       "  localparam foo = 4'b0000;\n"
-       "  localparam barr = 4'b0010;\n"
-       "endpackage\n"},
-      {// generate: existing aligned spacing preserved
-       "module m;\n"
-       "generate\n"
-       "localparam foo  = 1;\n"
-       "localparam barr = 2;\n"
-       "endgenerate\n"
-       "endmodule\n",
-       "module m;\n"
-       "  generate\n"
-       "    localparam foo  = 1;\n"
-       "    localparam barr = 2;\n"
-       "  endgenerate\n"
-       "endmodule\n"},
-      {// parameter flush-left preserved
-       "module m;\n"
-       "parameter int W = 8;\n"
-       "parameter int HHHH = 2;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  parameter int W = 8;\n"
-       "  parameter int HHHH = 2;\n"
-       "endmodule\n"},
-      {// parameter pre-aligned preserved
-       "module m;\n"
-       "parameter int W    = 8;\n"
-       "parameter int HHHH = 2;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  parameter int W    = 8;\n"
-       "  parameter int HHHH = 2;\n"
-       "endmodule\n"},
-      {// interface pre-aligned preserved
-       "interface my_if;\n"
-       "localparam foo  = 1;\n"
-       "localparam barr = 2;\n"
-       "endinterface\n",
-       "interface my_if;\n"
-       "  localparam foo  = 1;\n"
-       "  localparam barr = 2;\n"
-       "endinterface\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.parameter_declaration_alignment = AlignmentPolicy::kPreserve;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-// Verify kAlign behavior for param/localparam declarations across
-// interface, generate, and module body contexts, including mixed
-// param/localparam and packed dimension alignment.
-TEST(FormatterEndToEndTest, ParamDeclarationAlignmentContexts) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// interface body localparam alignment
-       "interface my_if;\n"
-       "localparam foo = 1;\n"
-       "localparam barr = 2;\n"
-       "endinterface\n",
-       "interface my_if;\n"
-       "  localparam foo  = 1;\n"
-       "  localparam barr = 2;\n"
-       "endinterface\n"},
-      {// interface body parameter alignment
-       "interface my_if;\n"
-       "parameter int X = 1;\n"
-       "parameter int Y_LONG = 2;\n"
-       "endinterface\n",
-       "interface my_if;\n"
-       "  parameter int X      = 1;\n"
-       "  parameter int Y_LONG = 2;\n"
-       "endinterface\n"},
-      {// generate block localparam alignment
-       "module m;\n"
-       "generate\n"
-       "localparam foo = 1;\n"
-       "localparam barr = 2;\n"
-       "endgenerate\n"
-       "endmodule\n",
-       "module m;\n"
-       "  generate\n"
-       "    localparam foo  = 1;\n"
-       "    localparam barr = 2;\n"
-       "  endgenerate\n"
-       "endmodule\n"},
-      {// generate block parameter alignment
-       "module m;\n"
-       "generate\n"
-       "parameter int A = 1;\n"
-       "parameter int BB = 2;\n"
-       "endgenerate\n"
-       "endmodule\n",
-       "module m;\n"
-       "  generate\n"
-       "    parameter int A  = 1;\n"
-       "    parameter int BB = 2;\n"
-       "  endgenerate\n"
-       "endmodule\n"},
-      {// mixed param and net declarations form separate alignment groups
-       "module m;\n"
-       "localparam X = 1;\n"
-       "localparam YYY = 2;\n"
-       "logic clk;\n"
-       "logic rst_n;\n"
-       "localparam ZZ = 3;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  localparam X   = 1;\n"
-       "  localparam YYY = 2;\n"
-       "  logic clk;\n"
-       "  logic rst_n;\n"
-       "  localparam ZZ = 3;\n"
-       "endmodule\n"},
-      {// mixed parameter and localparam in same block
-       "module m;\n"
-       "parameter int W = 8;\n"
-       "localparam L = 4;\n"
-       "parameter int H = 2;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  parameter  int W = 8;\n"
-       "  localparam     L = 4;\n"
-       "  parameter  int H = 2;\n"
-       "endmodule\n"},
-      {// packed dimensions are aligned
-       "module m;\n"
-       "parameter bit [7:0] X = 0;\n"
-       "parameter bit [31:0] YYYY = 1;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  parameter bit [ 7:0] X    = 0;\n"
-       "  parameter bit [31:0] YYYY = 1;\n"
-       "endmodule\n"},
-      {// multi-identifier comma-separated params are not split (no-crash)
-       "module m;\n"
-       "parameter int a=1, b=2, ccc=3;\n"
-       "localparam d=4, e=5;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  parameter  int a = 1, b = 2, ccc = 3;\n"
-       "  localparam     d = 4, e = 5;\n"
-       "endmodule\n"},
-      {// parameter type declarations do not crash
-       "module m;\n"
-       "parameter type T = int;\n"
-       "parameter type TT_LONG = bit;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  parameter type T = int;\n"
-       "  parameter type TT_LONG = bit;\n"
-       "endmodule\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-// Verify kInferUserIntent behavior: body-level param/localparam
-// declarations infer alignment intent from existing spacing.
-TEST(FormatterEndToEndTest, ParamDeclarationAlignmentInferUserIntent) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// flush-left localparams with small spacing diff: infer aligns
-       "module m;\n"
-       "localparam foo = 1;\n"
-       "localparam barr = 2;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  localparam foo  = 1;\n"
-       "  localparam barr = 2;\n"
-       "endmodule\n"},
-      {// pre-aligned localparams: infer preserves alignment
-       "module m;\n"
-       "localparam foo    = 1;\n"
-       "localparam barr   = 2;\n"
-       "localparam baaaaz = 3;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  localparam foo    = 1;\n"
-       "  localparam barr   = 2;\n"
-       "  localparam baaaaz = 3;\n"
-       "endmodule\n"},
-      {// flush-left params in package with small spacing diff: infer aligns
-       "package p;\n"
-       "localparam X = 1;\n"
-       "localparam YY = 2;\n"
-       "endpackage\n",
-       "package p;\n"
-       "  localparam X  = 1;\n"
-       "  localparam YY = 2;\n"
-       "endpackage\n"},
-      {// mixed param/localparam flush-left: infer keeps flush-left
-       "module m;\n"
-       "parameter int W = 8;\n"
-       "localparam L = 4;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  parameter int W = 8;\n"
-       "  localparam L = 4;\n"
-       "endmodule\n"},
-      {// interface flush-left with small diff: infer aligns
-       "interface my_if;\n"
-       "localparam foo = 1;\n"
-       "localparam barr = 2;\n"
-       "endinterface\n",
-       "interface my_if;\n"
-       "  localparam foo  = 1;\n"
-       "  localparam barr = 2;\n"
-       "endinterface\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.parameter_declaration_alignment = AlignmentPolicy::kInferUserIntent;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-// Verify boundary behavior for param declarations with
-// kBlankLinesAndSeparatorComments: both blank lines and separator comments
-// break alignment groups.
-TEST(FormatterEndToEndTest, ParamDeclarationAlignmentBoundary) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// separator comment breaks param alignment group
-       "module m;\n"
-       "localparam foo = 1;\n"
-       "localparam barr = 2;\n"
-       "// ============\n"
-       "localparam baaaaz = 1;\n"
-       "localparam c = 2;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  localparam foo  = 1;\n"
-       "  localparam barr = 2;\n"
-       "  // ============\n"
-       "  localparam baaaaz = 1;\n"
-       "  localparam c      = 2;\n"
-       "endmodule\n"},
-      {// blank line breaks param alignment group
-       "module m;\n"
-       "localparam foo = 1;\n"
-       "localparam barr = 2;\n"
-       "\n"
-       "localparam baaaaz = 1;\n"
-       "localparam c = 2;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  localparam foo  = 1;\n"
-       "  localparam barr = 2;\n"
-       "\n"
-       "  localparam baaaaz = 1;\n"
-       "  localparam c      = 2;\n"
-       "endmodule\n"},
-      {// no separator: single alignment group (all aligned together)
-       "module m;\n"
-       "localparam foo = 1;\n"
-       "localparam barr = 2;\n"
-       "localparam baaaaz = 1;\n"
-       "localparam c = 2;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  localparam foo    = 1;\n"
-       "  localparam barr   = 2;\n"
-       "  localparam baaaaz = 1;\n"
-       "  localparam c      = 2;\n"
-       "endmodule\n"},
-      {// regular comment does NOT break alignment group
-       "module m;\n"
-       "localparam foo = 1;\n"
-       "// regular comment\n"
-       "localparam barr = 2;\n"
-       "localparam baaaaz = 1;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  localparam foo    = 1;\n"
-       "  // regular comment\n"
-       "  localparam barr   = 2;\n"
-       "  localparam baaaaz = 1;\n"
-       "endmodule\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
-  style.alignment_group_boundary =
-      AlignmentGroupBoundary::kBlankLinesAndSeparatorComments;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-// Verify edge cases: unpacked dimensions, signed/unsigned, implicit types,
-// complex types, single declarations, deeply nested generate blocks.
-TEST(FormatterEndToEndTest, ParamDeclarationAlignmentEdgeCases) {
-  // Use column_limit = 80 to avoid unintended line wrapping inside
-  // deeply nested generate blocks (generate-if, generate-for), which
-  // would interfere with verifying alignment behavior.
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// unpacked dimension alignment
-       "module m;\n"
-       "parameter bit X [7:0] = 0;\n"
-       "parameter bit YYYY [15:0] = 1;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  parameter bit X   [ 7:0] = 0;\n"
-       "  parameter bit YYYY[15:0] = 1;\n"
-       "endmodule\n"},
-      {// param declarations with only type and default value (no idim)
-       "module m;\n"
-       "parameter int X = 0;\n"
-       "parameter int YYYY = 0;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  parameter int X    = 0;\n"
-       "  parameter int YYYY = 0;\n"
-       "endmodule\n"},
-      {// signed modifier with packed dimensions
-       "module m;\n"
-       "parameter bit signed [7:0] X = 0;\n"
-       "parameter bit signed [31:0] YYYY = 1;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  parameter bit signed [ 7:0] X    = 0;\n"
-       "  parameter bit signed [31:0] YYYY = 1;\n"
-       "endmodule\n"},
-      {// param with complex type (struct/typedef) — does not crash
-       "module m;\n"
-       "parameter foo_t X = foo_t'(0);\n"
-       "parameter foo_t Y_LONG = foo_t'(0);\n"
-       "endmodule\n",
-       "module m;\n"
-       "  parameter foo_t X      = foo_t'(0);\n"
-       "  parameter foo_t Y_LONG = foo_t'(0);\n"
-       "endmodule\n"},
-      {// single param declaration (not enough for alignment group)
-       "module m;\n"
-       "localparam X = 1;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  localparam X = 1;\n"
-       "endmodule\n"},
-      {// params inside generate-if block
-       "module m;\n"
-       "generate\n"
-       "if (1) begin : blk\n"
-       "localparam foo = 1;\n"
-       "localparam barr = 2;\n"
-       "end\n"
-       "endgenerate\n"
-       "endmodule\n",
-       "module m;\n"
-       "  generate\n"
-       "    if (1) begin : blk\n"
-       "      localparam foo  = 1;\n"
-       "      localparam barr = 2;\n"
-       "    end\n"
-       "  endgenerate\n"
-       "endmodule\n"},
-      {// unsigned keyword with packed dimensions (complement to signed)
-       "module m;\n"
-       "parameter bit unsigned [7:0] X = 0;\n"
-       "parameter bit unsigned [31:0] YYYY = 1;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  parameter bit unsigned [ 7:0] X    = 0;\n"
-       "  parameter bit unsigned [31:0] YYYY = 1;\n"
-       "endmodule\n"},
-      {// parameter with implicit type (no explicit type keyword)
-       "module m;\n"
-       "parameter X = 32;\n"
-       "parameter Y_LONG = 64;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  parameter X      = 32;\n"
-       "  parameter Y_LONG = 64;\n"
-       "endmodule\n"},
-      {// params inside generate-for block
-       "module m;\n"
-       "generate\n"
-       "for (i = 0; i < 2; i++) begin : blk\n"
-       "localparam foo = 1;\n"
-       "localparam barr = 2;\n"
-       "end\n"
-       "endgenerate\n"
-       "endmodule\n",
-       "module m;\n"
-       "  generate\n"
-       "    for (i = 0; i < 2; i++) begin : blk\n"
-       "      localparam foo  = 1;\n"
-       "      localparam barr = 2;\n"
-       "    end\n"
-       "  endgenerate\n"
-       "endmodule\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 80;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-// Verify parameter declarations inside generate-case blocks are aligned.
-TEST(FormatterEndToEndTest, ParamDeclarationAlignmentGenerateCase) {
-  // Params inside generate-case need wider column limit to avoid wrapping the
-  // case label / begin block line.
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// params inside generate-case block
-       "module m #(P = 0);\n"
-       "generate\n"
-       "case (P)\n"
-       "0: begin : blk\n"
-       "localparam foo = 1;\n"
-       "localparam barr = 2;\n"
-       "end\n"
-       "endcase\n"
-       "endgenerate\n"
-       "endmodule\n",
-       "module m #(\n"
-       "    P = 0\n"
-       ");\n"
-       "  generate\n"
-       "    case (P)\n"
-       "      0: begin : blk\n"
-       "        localparam foo  = 1;\n"
-       "        localparam barr = 2;\n"
-       "      end\n"
-       "    endcase\n"
-       "  endgenerate\n"
-       "endmodule\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 80;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-TEST(FormatterEndToEndTest, FormalAndBodyParamAlignmentIndependence) {
-  // Verify that --formal_parameters_alignment and
-  // --parameter_declaration_alignment act independently: setting formal params
-  // to kFlushLeft should not affect body-level param alignment, and vice versa.
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// formal flush-left + body align: only body params align
-       "module m #(\n"
-       "int W = 2,\n"
-       "int LLLL = 4\n"
-       ");\n"
-       "localparam foo = 0;\n"
-       "localparam barrrr = 0;\n"
-       "endmodule\n",
-       "module m #(\n"
-       "    int W = 2,\n"
-       "    int LLLL = 4\n"
-       ");\n"
-       "  localparam foo    = 0;\n"
-       "  localparam barrrr = 0;\n"
-       "endmodule\n"},
-      {// formal align + body flush-left: only formal params align
-       "module m #(\n"
-       "int W = 2,\n"
-       "int LLLL = 4\n"
-       ");\n"
-       "localparam foo = 0;\n"
-       "localparam barrrr = 0;\n"
-       "endmodule\n",
-       "module m #(\n"
-       "    int W    = 2,\n"
-       "    int LLLL = 4\n"
-       ");\n"
-       "  localparam foo = 0;\n"
-       "  localparam barrrr = 0;\n"
-       "endmodule\n"},
-      {// both flush-left: no alignment anywhere
-       "module m #(\n"
-       "int W = 2,\n"
-       "int LLLL = 4\n"
-       ");\n"
-       "localparam foo = 0;\n"
-       "localparam barrrr = 0;\n"
-       "endmodule\n",
-       "module m #(\n"
-       "    int W = 2,\n"
-       "    int LLLL = 4\n"
-       ");\n"
-       "  localparam foo = 0;\n"
-       "  localparam barrrr = 0;\n"
-       "endmodule\n"},
-      {// both align: both formal and body params aligned
-       "module m #(\n"
-       "int W = 2,\n"
-       "int LLLL = 4\n"
-       ");\n"
-       "localparam foo = 0;\n"
-       "localparam barrrr = 0;\n"
-       "endmodule\n",
-       "module m #(\n"
-       "    int W    = 2,\n"
-       "    int LLLL = 4\n"
-       ");\n"
-       "  localparam foo    = 0;\n"
-       "  localparam barrrr = 0;\n"
-       "endmodule\n"},
-  };
-  // First case: formal kFlushLeft, body kAlign
-  {
-    FormatStyle style;
-    style.column_limit = 40;
-    style.indentation_spaces = 2;
-    style.wrap_spaces = 4;
-    style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
-    style.formal_parameters_alignment = AlignmentPolicy::kFlushLeft;
-    const auto &tc = kTestCases[0];
-    VLOG(1) << "code-to-format:\n" << tc.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
-  }
-  // Second case: formal kAlign, body kFlushLeft
-  {
-    FormatStyle style;
-    style.column_limit = 40;
-    style.indentation_spaces = 2;
-    style.wrap_spaces = 4;
-    style.parameter_declaration_alignment = AlignmentPolicy::kFlushLeft;
-    style.formal_parameters_alignment = AlignmentPolicy::kAlign;
-    const auto &tc = kTestCases[1];
-    VLOG(1) << "code-to-format:\n" << tc.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
-  }
-  // Third case: both kFlushLeft
-  {
-    FormatStyle style;
-    style.column_limit = 40;
-    style.indentation_spaces = 2;
-    style.wrap_spaces = 4;
-    style.parameter_declaration_alignment = AlignmentPolicy::kFlushLeft;
-    style.formal_parameters_alignment = AlignmentPolicy::kFlushLeft;
-    const auto &tc = kTestCases[2];
-    VLOG(1) << "code-to-format:\n" << tc.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
-  }
-  // Fourth case: both kAlign
-  {
-    FormatStyle style;
-    style.column_limit = 40;
-    style.indentation_spaces = 2;
-    style.wrap_spaces = 4;
-    style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
-    style.formal_parameters_alignment = AlignmentPolicy::kAlign;
-    const auto &tc = kTestCases[3];
-    VLOG(1) << "code-to-format:\n" << tc.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
-  }
-}
-
-TEST(FormatterEndToEndTest, ClassBodyParamNotAffected) {
-  // Verify that class body parameter/localparam declarations are NOT affected
-  // by --parameter_declaration_alignment, which targets only module/generate/
-  // package/interface body-level params.
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// class body params are not affected
-       "class c;\n"
-       "parameter int X = 1;\n"
-       "parameter int YYYY = 2;\n"
-       "localparam foo = 3;\n"
-       "localparam barrrr = 4;\n"
-       "endclass\n",
-       "class c;\n"
-       "  parameter int X = 1;\n"
-       "  parameter int YYYY = 2;\n"
-       "  localparam foo = 3;\n"
-       "  localparam barrrr = 4;\n"
-       "endclass\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-TEST(FormatterEndToEndTest, PackageBodyVariableAlignment) {
-  // Verify that moving kPackageItemList to kTabularAlignment in tree-unwrapper
-  // enables net/variable declaration alignment in package bodies via
-  // module_net_variable_alignment.
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// net/variable declaration alignment in package body
-       "package p;\n"
-       "logic [7:0] a;\n"
-       "logic [31:0] bb;\n"
-       "endpackage\n",
-       "package p;\n"
-       "  logic [ 7:0] a;\n"
-       "  logic [31:0] bb;\n"
-       "endpackage\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.module_net_variable_alignment = AlignmentPolicy::kAlign;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-TEST(FormatterEndToEndTest, ParamDeclarationAlignmentApplyToAll) {
-  // Verify that ApplyToAllAlignmentPolicies affects
-  // parameter_declaration_alignment for all four alignment policies.
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// kAlign aligns identifiers and = signs across declarations
-       "module m;\n"
-       "localparam foo = 1;\n"
-       "localparam barrrr = 2;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  localparam foo    = 1;\n"
-       "  localparam barrrr = 2;\n"
-       "endmodule\n"},
-      {// kFlushLeft: declarations remain flush-left
-       "module m;\n"
-       "localparam foo = 1;\n"
-       "localparam barrrr = 2;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  localparam foo = 1;\n"
-       "  localparam barrrr = 2;\n"
-       "endmodule\n"},
-      {// kPreserve: existing spacing is kept
-       "module m;\n"
-       "localparam foo = 1;\n"
-       "localparam barrrr  = 2;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  localparam foo = 1;\n"
-       "  localparam barrrr  = 2;\n"
-       "endmodule\n"},
-      {// kInferUserIntent: large identifier width difference (3 cols)
-       // suggests flush-left intent, no alignment.
-       "module m;\n"
-       "localparam foo = 1;\n"
-       "localparam barrrr = 2;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  localparam foo = 1;\n"
-       "  localparam barrrr = 2;\n"
-       "endmodule\n"},
-  };
-  // kAlign
-  {
-    FormatStyle style;
-    style.column_limit = 40;
-    style.indentation_spaces = 2;
-    style.wrap_spaces = 4;
-    style.ApplyToAllAlignmentPolicies(AlignmentPolicy::kAlign);
-    const auto &tc = kTestCases[0];
-    std::ostringstream stream;
-    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
-  }
-  // kFlushLeft
-  {
-    FormatStyle style;
-    style.column_limit = 40;
-    style.indentation_spaces = 2;
-    style.wrap_spaces = 4;
-    style.ApplyToAllAlignmentPolicies(AlignmentPolicy::kFlushLeft);
-    const auto &tc = kTestCases[1];
-    std::ostringstream stream;
-    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
-  }
-  // kPreserve
-  {
-    FormatStyle style;
-    style.column_limit = 40;
-    style.indentation_spaces = 2;
-    style.wrap_spaces = 4;
-    style.ApplyToAllAlignmentPolicies(AlignmentPolicy::kPreserve);
-    const auto &tc = kTestCases[2];
-    std::ostringstream stream;
-    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
-  }
-  // kInferUserIntent
-  {
-    FormatStyle style;
-    style.column_limit = 40;
-    style.indentation_spaces = 2;
-    style.wrap_spaces = 4;
-    style.ApplyToAllAlignmentPolicies(AlignmentPolicy::kInferUserIntent);
-    const auto &tc = kTestCases[3];
-    std::ostringstream stream;
-    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
-  }
-}
-
-// Verify that alignment_group_boundary=kBlankLines treats only blank lines
-// (not separator comments) as boundary breaks for param declarations.
-TEST(FormatterEndToEndTest, ParamDeclarationAlignmentBoundaryBlankLines) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// Only blank line breaks group; separator comment does not
-       "module m;\n"
-       "localparam foo = 1;\n"
-       "localparam barr = 2;\n"
-       "\n"
-       "localparam baaaaz = 1;\n"
-       "localparam c = 2;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  localparam foo  = 1;\n"
-       "  localparam barr = 2;\n"
-       "\n"
-       "  localparam baaaaz = 1;\n"
-       "  localparam c      = 2;\n"
-       "endmodule\n"},
-      {// Separator comment does NOT break group with kBlankLines
-       "module m;\n"
-       "localparam foo = 1;\n"
-       "localparam barr = 2;\n"
-       "// ============\n"
-       "localparam baaaaz = 1;\n"
-       "localparam c = 2;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  localparam foo    = 1;\n"
-       "  localparam barr   = 2;\n"
-       "  // ============\n"
-       "  localparam baaaaz = 1;\n"
-       "  localparam c      = 2;\n"
-       "endmodule\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
-  style.alignment_group_boundary = AlignmentGroupBoundary::kBlankLines;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-// Verify that alignment_group_boundary=kNone keeps all param declarations
-// in a single alignment group regardless of blank lines or comments.
-TEST(FormatterEndToEndTest, ParamDeclarationAlignmentBoundaryNone) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// Blank line does NOT break group with kNone
-       "module m;\n"
-       "localparam foo = 1;\n"
-       "localparam barr = 2;\n"
-       "\n"
-       "localparam baaaaz = 1;\n"
-       "localparam c = 2;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  localparam foo    = 1;\n"
-       "  localparam barr   = 2;\n"
-       "\n"
-       "  localparam baaaaz = 1;\n"
-       "  localparam c      = 2;\n"
-       "endmodule\n"},
-      {// Separator comment does NOT break group with kNone
-       "module m;\n"
-       "localparam foo = 1;\n"
-       "localparam barr = 2;\n"
-       "// ============\n"
-       "localparam baaaaz = 1;\n"
-       "localparam c = 2;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  localparam foo    = 1;\n"
-       "  localparam barr   = 2;\n"
-       "  // ============\n"
-       "  localparam baaaaz = 1;\n"
-       "  localparam c      = 2;\n"
-       "endmodule\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
-  style.alignment_group_boundary = AlignmentGroupBoundary::kNone;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-// Verify that alignment_group_boundary=kSeparatorComments treats only
-// separator comments (not blank lines) as boundary breaks for param
-// declarations.
-TEST(FormatterEndToEndTest,
-     ParamDeclarationAlignmentBoundarySeparatorComments) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// Separator comment breaks alignment group
-       "module m;\n"
-       "localparam foo = 1;\n"
-       "localparam barr = 2;\n"
-       "// ============\n"
-       "localparam baaaaz = 1;\n"
-       "localparam c = 2;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  localparam foo  = 1;\n"
-       "  localparam barr = 2;\n"
-       "  // ============\n"
-       "  localparam baaaaz = 1;\n"
-       "  localparam c      = 2;\n"
-       "endmodule\n"},
-      {// Blank line does NOT break group with kSeparatorComments
-       "module m;\n"
-       "localparam foo = 1;\n"
-       "localparam barr = 2;\n"
-       "\n"
-       "localparam baaaaz = 1;\n"
-       "localparam c = 2;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  localparam foo    = 1;\n"
-       "  localparam barr   = 2;\n"
-       "\n"
-       "  localparam baaaaz = 1;\n"
-       "  localparam c      = 2;\n"
-       "endmodule\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
-  style.alignment_group_boundary = AlignmentGroupBoundary::kSeparatorComments;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-// Verify that class body parameter/localparam declarations are NOT affected
-// by --parameter_declaration_alignment for the kFlushLeft, kPreserve,
-// and kInferUserIntent policies (kAlign is covered in
-// ClassBodyParamNotAffected).
-TEST(FormatterEndToEndTest, ClassBodyParamNotAffectedOtherPolicies) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// kFlushLeft: class body params remain flush-left
-       "class c;\n"
-       "parameter int X = 1;\n"
-       "parameter int YYYY = 2;\n"
-       "localparam foo = 3;\n"
-       "localparam barrrr = 4;\n"
-       "endclass\n",
-       "class c;\n"
-       "  parameter int X = 1;\n"
-       "  parameter int YYYY = 2;\n"
-       "  localparam foo = 3;\n"
-       "  localparam barrrr = 4;\n"
-       "endclass\n"},
-      {// kPreserve: parameter_declaration_alignment does not apply to class
-       // bodies; whitespace is normalized by default formatting.
-       "class c;\n"
-       "parameter int X     = 1;\n"
-       "parameter int YYYY  = 2;\n"
-       "endclass\n",
-       "class c;\n"
-       "  parameter int X = 1;\n"
-       "  parameter int YYYY = 2;\n"
-       "endclass\n"},
-      {// kInferUserIntent: class body params infer flush-left
-       "class c;\n"
-       "parameter int X = 1;\n"
-       "parameter int YYYY = 2;\n"
-       "endclass\n",
-       "class c;\n"
-       "  parameter int X = 1;\n"
-       "  parameter int YYYY = 2;\n"
-       "endclass\n"},
-  };
-  // kFlushLeft
-  {
-    FormatStyle style;
-    style.column_limit = 40;
-    style.indentation_spaces = 2;
-    style.wrap_spaces = 4;
-    style.parameter_declaration_alignment = AlignmentPolicy::kFlushLeft;
-    const auto &tc = kTestCases[0];
-    std::ostringstream stream;
-    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
-  }
-  // kPreserve
-  {
-    FormatStyle style;
-    style.column_limit = 40;
-    style.indentation_spaces = 2;
-    style.wrap_spaces = 4;
-    style.parameter_declaration_alignment = AlignmentPolicy::kPreserve;
-    const auto &tc = kTestCases[1];
-    std::ostringstream stream;
-    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
-  }
-  // kInferUserIntent
-  {
-    FormatStyle style;
-    style.column_limit = 40;
-    style.indentation_spaces = 2;
-    style.wrap_spaces = 4;
-    style.parameter_declaration_alignment = AlignmentPolicy::kInferUserIntent;
-    const auto &tc = kTestCases[2];
-    std::ostringstream stream;
-    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
-  }
-}
-
-// Verify formal_parameters_alignment and parameter_declaration_alignment
-// independence for kPreserve and kInferUserIntent combinations.
-TEST(FormatterEndToEndTest,
-     FormalAndBodyParamAlignmentIndependenceOtherPolicies) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// formal kPreserve + body kAlign: only body params aligned
-       "module m #(\n"
-       "int W = 2,\n"
-       "int LLLL = 4\n"
-       ");\n"
-       "localparam foo = 0;\n"
-       "localparam barrrr = 0;\n"
-       "endmodule\n",
-       "module m #(\n"
-       "    int W = 2,\n"
-       "    int LLLL = 4\n"
-       ");\n"
-       "  localparam foo    = 0;\n"
-       "  localparam barrrr = 0;\n"
-       "endmodule\n"},
-      {// formal kAlign + body kPreserve: only formal params aligned
-       "module m #(\n"
-       "int W = 2,\n"
-       "int LLLL = 4\n"
-       ");\n"
-       "localparam foo   = 0;\n"
-       "localparam barrrr = 0;\n"
-       "endmodule\n",
-       "module m #(\n"
-       "    int W    = 2,\n"
-       "    int LLLL = 4\n"
-       ");\n"
-       "  localparam foo   = 0;\n"
-       "  localparam barrrr = 0;\n"
-       "endmodule\n"},
-      {// formal kInferUserIntent + body kAlign: only body params aligned
-       "module m #(\n"
-       "int W = 2,\n"
-       "int LLLL = 4\n"
-       ");\n"
-       "localparam foo = 0;\n"
-       "localparam barrrr = 0;\n"
-       "endmodule\n",
-       "module m #(\n"
-       "    int W = 2,\n"
-       "    int LLLL = 4\n"
-       ");\n"
-       "  localparam foo    = 0;\n"
-       "  localparam barrrr = 0;\n"
-       "endmodule\n"},
-  };
-  // formal kPreserve + body kAlign
-  {
-    FormatStyle style;
-    style.column_limit = 40;
-    style.indentation_spaces = 2;
-    style.wrap_spaces = 4;
-    style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
-    style.formal_parameters_alignment = AlignmentPolicy::kPreserve;
-    const auto &tc = kTestCases[0];
-    std::ostringstream stream;
-    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
-  }
-  // formal kAlign + body kPreserve
-  {
-    FormatStyle style;
-    style.column_limit = 40;
-    style.indentation_spaces = 2;
-    style.wrap_spaces = 4;
-    style.parameter_declaration_alignment = AlignmentPolicy::kPreserve;
-    style.formal_parameters_alignment = AlignmentPolicy::kAlign;
-    const auto &tc = kTestCases[1];
-    std::ostringstream stream;
-    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
-  }
-  // formal kInferUserIntent + body kAlign
-  {
-    FormatStyle style;
-    style.column_limit = 40;
-    style.indentation_spaces = 2;
-    style.wrap_spaces = 4;
-    style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
-    style.formal_parameters_alignment = AlignmentPolicy::kInferUserIntent;
-    const auto &tc = kTestCases[2];
-    std::ostringstream stream;
-    const auto status = FormatVerilog(tc.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), tc.expected) << "code:\n" << tc.input;
-  }
-}
-
-// Verify parameter declarations with string, real, and function-call default
-// value types to exercise the ColumnSchemaScanner on non-standard type tokens.
-TEST(FormatterEndToEndTest, ParamDeclarationAlignmentTypeVariants) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// parameter real type
-       "module m;\n"
-       "parameter real X = 1.0;\n"
-       "parameter real Y_LONG = 2.0;\n"
-       "endmodule\n",
-       "module m;\n"
-       "  parameter real X      = 1.0;\n"
-       "  parameter real Y_LONG = 2.0;\n"
-       "endmodule\n"},
-      {// parameter string type
-       "module m;\n"
-       "parameter string s = \"hello\";\n"
-       "parameter string long_s = \"world\";\n"
-       "endmodule\n",
-       "module m;\n"
-       "  parameter string s      = \"hello\";\n"
-       "  parameter string long_s = \"world\";\n"
-       "endmodule\n"},
-      {// parameter with function call in default value
-       "module m;\n"
-       "parameter int W = func(1, 2);\n"
-       "parameter int H_LONG = other(3);\n"
-       "endmodule\n",
-       "module m;\n"
-       "  parameter int W      = func(1, 2);\n"
-       "  parameter int H_LONG = other(3);\n"
-       "endmodule\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-// Verify parameter_declaration_alignment kInferUserIntent in package bodies.
-TEST(FormatterEndToEndTest, ParamDeclarationAlignmentPackageInfer) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// flush-left params with small diff: infer aligns
-       "package p;\n"
-       "localparam foo = 1;\n"
-       "localparam barr = 2;\n"
-       "endpackage\n",
-       "package p;\n"
-       "  localparam foo  = 1;\n"
-       "  localparam barr = 2;\n"
-       "endpackage\n"},
-      {// pre-aligned params: infer preserves
-       "package p;\n"
-       "localparam foo    = 1;\n"
-       "localparam barr   = 2;\n"
-       "localparam baaaaz = 3;\n"
-       "endpackage\n",
-       "package p;\n"
-       "  localparam foo    = 1;\n"
-       "  localparam barr   = 2;\n"
-       "  localparam baaaaz = 3;\n"
-       "endpackage\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.parameter_declaration_alignment = AlignmentPolicy::kInferUserIntent;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-// Verify parameter_declaration_alignment boundary behavior in package bodies.
-TEST(FormatterEndToEndTest, ParamDeclarationAlignmentPackageBoundary) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// blank line breaks alignment group in package
-       "package p;\n"
-       "localparam foo = 1;\n"
-       "localparam barr = 2;\n"
-       "\n"
-       "localparam baaaaz = 1;\n"
-       "localparam c = 2;\n"
-       "endpackage\n",
-       "package p;\n"
-       "  localparam foo  = 1;\n"
-       "  localparam barr = 2;\n"
-       "\n"
-       "  localparam baaaaz = 1;\n"
-       "  localparam c      = 2;\n"
-       "endpackage\n"},
-      {// separator comment breaks alignment group in package
-       "package p;\n"
-       "localparam foo = 1;\n"
-       "localparam barr = 2;\n"
-       "// ============\n"
-       "localparam baaaaz = 1;\n"
-       "localparam c = 2;\n"
-       "endpackage\n",
-       "package p;\n"
-       "  localparam foo  = 1;\n"
-       "  localparam barr = 2;\n"
-       "  // ============\n"
-       "  localparam baaaaz = 1;\n"
-       "  localparam c      = 2;\n"
-       "endpackage\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
-  style.alignment_group_boundary =
-      AlignmentGroupBoundary::kBlankLinesAndSeparatorComments;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-// Verify the most common default scenario: both formal_parameters_alignment
-// and parameter_declaration_alignment set to kInferUserIntent.
-TEST(FormatterEndToEndTest, BothParamAlignmentsInferUserIntent) {
-  static constexpr FormatterTestCase kTestCases[] = {
-      {// both flush-left with small diff: infer aligns both formal and body
-       "module m #(\n"
-       "int W = 2,\n"
-       "int LL = 4\n"
-       ");\n"
-       "localparam foo = 0;\n"
-       "localparam barr = 0;\n"
-       "endmodule\n",
-       "module m #(\n"
-       "    int W  = 2,\n"
-       "    int LL = 4\n"
-       ");\n"
-       "  localparam foo  = 0;\n"
-       "  localparam barr = 0;\n"
-       "endmodule\n"},
-      {// both infer: pre-aligned formal, pre-aligned body preserved
-       "module m #(\n"
-       "int W    = 2,\n"
-       "int LLLL = 4\n"
-       ");\n"
-       "localparam foo    = 0;\n"
-       "localparam barrrr = 0;\n"
-       "endmodule\n",
-       "module m #(\n"
-       "    int W    = 2,\n"
-       "    int LLLL = 4\n"
-       ");\n"
-       "  localparam foo    = 0;\n"
-       "  localparam barrrr = 0;\n"
-       "endmodule\n"},
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.parameter_declaration_alignment = AlignmentPolicy::kInferUserIntent;
-  style.formal_parameters_alignment = AlignmentPolicy::kInferUserIntent;
-  for (const auto &test_case : kTestCases) {
-    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
-    std::ostringstream stream;
-    const auto status =
-        FormatVerilog(test_case.input, "<filename>", style, stream);
-    EXPECT_OK(status) << status.message();
-    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
-  }
-}
-
-// Verify that a large multi-line comment block between parameter
-// declarations does not crash the formatter.  The tree-unwrapper may
-// produce a partition structure where the comment tokens are absorbed
-// into the following parameter partition, which the alignment code
-// must handle gracefully by skipping alignment for that row.
-TEST(FormatterEndToEndTest, ParamDeclarationAlignmentCommentBlockNoCrash) {
-  // These inputs contain large multi-line comment blocks between
-  // parameter/localparam declarations.  The formatter must not crash
-  // (SIGABRT).  Output correctness is secondary; the formatter may
-  // fall back to preserving the original input when the partition
-  // structure prevents safe alignment.
-  const char *kInputs[] = {
-      "module m;\n"
-      "parameter int W = 8;\n"
-      "// Multi-line comment block\n"
-      "// that spans across\n"
-      "//\n"
-      "// several lines\n"
-      "// of explanatory text\n"
-      "//\n"
-      "// It contains enough\n"
-      "// lines to trigger\n"
-      "// the partition structure\n"
-      "// edge case where\n"
-      "// comment tokens are\n"
-      "// absorbed into the\n"
-      "// following parameter\n"
-      "// partition.\n"
-      "//\n"
-      "localparam int H = 2;\n"
-      "endmodule\n",
-      "package p;\n"
-      "parameter int X = 1;\n"
-      "// Long comment block\n"
-      "// with many lines\n"
-      "//\n"
-      "// of text\n"
-      "//\n"
-      "localparam int Y = 2;\n"
-      "endpackage\n",
-  };
-  FormatStyle style;
-  style.column_limit = 40;
-  style.indentation_spaces = 2;
-  style.wrap_spaces = 4;
-  style.parameter_declaration_alignment = AlignmentPolicy::kAlign;
-  for (const char *input : kInputs) {
-    VLOG(1) << "code-to-format:\n" << input << "<EOF>";
-    std::ostringstream stream;
-    const auto status = FormatVerilog(input, "<filename>", style, stream);
-    // The primary requirement is that the formatter does not crash
-    // (SIGABRT).  Gtest will report failure if the process aborts.
-    // The partition structure may cause output format differences;
-    // the important thing is the formatter handled it gracefully.
-  }
+TEST(FormatterEndToEndTest, SmokeFormatterTestCases) {
+  RunFormatterTestCases40(kSmokeFormatterTestCases);
 }
 
 // Regression for https://github.com/chipsalliance/verible/issues/2352:
diff --git a/verible/verilog/formatting/formatter_wrap_style_test.cc b/verible/verilog/formatting/formatter_wrap_style_test.cc
new file mode 100644
index 0000000..b61fe42
--- /dev/null
+++ b/verible/verilog/formatting/formatter_wrap_style_test.cc
@@ -0,0 +1,3405 @@
+// Copyright 2017-2026 The Verible Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Test cases in this file should be *insensitive* to wrapping penalties.
+// Penalty-sensitive tests belong in formatter-tuning_test.cc.
+
+#include <cctype>
+#include <cstddef>
+#include <sstream>
+#include <string>
+#include <string_view>
+#include <vector>
+
+#include "absl/status/status.h"
+#include "absl/strings/match.h"
+#include "absl/strings/str_split.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "verible/common/formatting/align.h"
+#include "verible/common/formatting/basic-format-style.h"
+#include "verible/common/strings/display-utils.h"
+#include "verible/common/strings/position.h"
+#include "verible/common/util/interval.h"
+#include "verible/common/util/logging.h"
+#include "verible/verilog/formatting/format-style.h"
+#include "verible/verilog/formatting/formatter-test-utils.h"
+#include "verible/verilog/formatting/formatter.h"
+
+namespace verilog {
+namespace formatter {
+namespace {
+
+using absl::StatusCode;
+using testing::HasSubstr;
+using verible::AlignmentPolicy;
+using verible::IndentationStyle;
+using verible::LineNumberSet;
+
+// Empty LineNumberSet means format all lines.
+static const LineNumberSet kEnableAllLines;
+
+// Small case set for diagnostic/control-path tests that previously iterated
+// the monolithic kFormatterTestCases table.
+static constexpr FormatterTestCase kDiagnosticFormatterTestCases[] = {
+    {"", ""},
+    {"\n", "\n"},
+    {"module m;wire w;endmodule\n",
+     "module m;\n"
+     "  wire w;\n"
+     "endmodule\n"},
+    {"class  cc ;\n"
+     "endclass:cc\n",
+     "class cc;\n"
+     "endclass : cc\n"},
+};
+
+TEST(FormatterEndToEndTest, AutoInferAlignment) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {"", ""},
+      {"\n", "\n"},
+      {"class  cc ;\n"
+       "endclass:cc\n",
+       "class cc;\n"
+       "endclass : cc\n"},
+
+      // module port declarations
+      {"module pd(\n"
+       "input wire foo,\n"
+       "output reg bar\n"
+       ");\n"
+       "endmodule:pd\n",
+       "module pd (\n"
+       "    input  wire foo,\n"  // flush-left vs. align are similar enough,
+       "    output reg  bar\n"   // so automatic policy will align.
+       ");\n"
+       "endmodule : pd\n"},
+      {"module pd(\n"
+       "input  foo_pkg::baz_t foo,\n"
+       "output reg  bar\n"
+       ");\n"
+       "endmodule:pd\n",
+       "module pd (\n"
+       "    input foo_pkg::baz_t foo,\n"  // alignment would add too many spaces
+       "    output reg bar\n"             // so infer intent to flush-left.
+       ");\n"
+       "endmodule : pd\n"},
+      {"module pd(\n"
+       "input  foo_pkg::baz_t foo,\n"
+       "output     reg  bar\n"  // user injects 4 excess spaces here ...
+       ");\n"
+       "endmodule:pd\n",
+       "module pd (\n"
+       "    input  foo_pkg::baz_t foo,\n"
+       "    output reg            bar\n"  // ... and triggers alignment.
+       ");\n"
+       "endmodule : pd\n"},
+      {"module pd(\n"
+       "`ifdef FAA\n"  // inside preprocessing conditional
+       "input  baaaz_t foo,\n"
+       "output reg      bar\n"  // user injects 4 excess spaces here ...
+       "`endif\n"
+       ");\n"
+       "endmodule:pd\n",
+       "module pd (\n"
+       "`ifdef FAA\n"
+       "    input  baaaz_t foo,\n"
+       "    output reg     bar\n"  // ... and triggers alignment.
+       "`endif\n"
+       ");\n"
+       "endmodule : pd\n"},
+      {"module pd(\n"
+       "`ifdef FAA\n"  // inside preprocessing conditional
+       "input  baaaz_t foo,\n"
+       "`else\n"
+       "output reg      bar\n"  // user injects 4 excess spaces here ...
+       "`endif\n"
+       ");\n"
+       "endmodule:pd\n",
+       "module pd (\n"
+       "`ifdef FAA\n"
+       "    input  baaaz_t foo,\n"  // aligned
+       "`else\n"                    // aligned across preprocessing directives
+       "    output reg     bar\n"   // ... and triggers alignment.
+       "`endif\n"
+       ");\n"
+       "endmodule : pd\n"},
+      {"module pd(\n"
+       "input logic [31:0] bus,\n"
+       "input logic [7:0] bus2,\n"
+       "`ifdef FAA\n"  // inside preprocessing conditional
+       "input  baaaz_t foo,\n"
+       "`else\n"
+       "output reg      bar,\n"  // user injects 4 excess spaces here ...
+       "`endif\n"
+       "output out_t zout1,\n"
+       "output out_t zout2\n"
+       ");\n"
+       "endmodule:pd\n",
+       "module pd (\n"
+       "    input  logic   [31:0] bus,\n"  // treated as one large group
+       "    input  logic   [ 7:0] bus2,\n"
+       "`ifdef FAA\n"
+       "    input  baaaz_t        foo,\n"  // aligned
+       "`else\n"  // aligned across preprocessing directives
+       "    output reg            bar,\n"  // ... and triggers alignment.
+       "`endif\n"
+       "    output out_t          zout1,\n"
+       "    output out_t          zout2\n"
+       ");\n"
+       "endmodule : pd\n"},
+      {"module pd(\n"
+       "input logic [7:0] bus2,\n"
+       "`ifndef FAA\n"  // inside preprocessing conditional
+       "input logic [31:0] bus,\n"
+       "input  baaaz_t foo,\n"
+       "`elsif BLA\n"
+       "output reg      bar,\n"  // user injects 4 excess spaces here ...
+       "output out_t zout1,\n"
+       "`endif\n"
+       "output out_t zout2\n"
+       ");\n"
+       "endmodule:pd\n",
+       "module pd (\n"
+       "    input  logic   [ 7:0] bus2,\n"
+       "`ifndef FAA\n"
+       "    input  logic   [31:0] bus,\n"  // treated as one large group
+       "    input  baaaz_t        foo,\n"  // aligned
+       "`elsif BLA\n"  // aligned across preprocessing directives
+       "    output reg            bar,\n"  // ... and triggers alignment.
+       "    output out_t          zout1,\n"
+       "`endif\n"
+       "    output out_t          zout2\n"
+       ");\n"
+       "endmodule : pd\n"},
+      {// data declaration and net declaration in ports
+       "module m(\n"
+       "logic [x:y]a    ,\n"    // packed dimensions, induce alignment
+       "wire [pp:qq] [e:f]b\n"  // packed dimensions, 2D
+       ") ;\n"
+       "endmodule\n",
+       "module m (\n"
+       "    logic [  x:y]      a,\n"
+       "    wire  [pp:qq][e:f] b\n"
+       ");\n"
+       "endmodule\n"},
+      {// used-defined data declarations in ports
+       "module m(\n"
+       "a::bb [x:y]a    ,\n"       // packed dimensions, induce alignment
+       "c#(d,e) [pp:qq] [e:f]b\n"  // packed dimensions, 2D
+       ") ;\n"
+       "endmodule\n",
+       "module m (\n"
+       "    a::bb    [  x:y]      a,\n"
+       "    c#(d, e) [pp:qq][e:f] b\n"
+       ");\n"
+       "endmodule\n"},
+
+      // named parameter arguments
+      {"module  mm ;\n"
+       "foo #(\n"
+       ".a(a),\n"
+       ".bb(bb)\n"
+       ")bar( );\n"
+       "endmodule:mm\n",
+       "module mm;\n"
+       "  foo #(\n"
+       "      .a (a),\n"  // align doesn't add too many spaces, so align
+       "      .bb(bb)\n"
+       "  ) bar ();\n"
+       "endmodule : mm\n"},
+      {"module  mm ;\n"
+       "foo #(\n"
+       ".a(a),\n"
+       ".bbcccc(bb)\n"
+       ")bar( );\n"
+       "endmodule:mm\n",
+       "module mm;\n"
+       "  foo #(\n"
+       "      .a(a),\n"  // align would add too many spaces, so flush-left
+       "      .bbcccc(bb)\n"
+       "  ) bar ();\n"
+       "endmodule : mm\n"},
+      {"module  mm ;\n"
+       "foo #(\n"
+       ".a(a    ),\n"  // user manually triggers alignment with excess spaces
+       ".bbcccc(bb)\n"
+       ")bar( );\n"
+       "endmodule:mm\n",
+       "module mm;\n"
+       "  foo #(\n"
+       "      .a     (a),\n"  // induced alignment
+       "      .bbcccc(bb)\n"
+       "  ) bar ();\n"
+       "endmodule : mm\n"},
+      {"module  mm ;\n"
+       "foo #(\n"
+       "//c1\n"        // with comments (indented but not aligned)
+       ".a(a    ),\n"  // user manually triggers alignment with excess spaces
+       "//c2\n"
+       ".bbcccc(bb)\n"
+       "//c3\n"
+       ")bar( );\n"
+       "endmodule:mm\n",
+       "module mm;\n"
+       "  foo #(\n"
+       "      //c1\n"
+       "      .a     (a),\n"  // induced alignment
+       "      //c2\n"
+       "      .bbcccc(bb)\n"
+       "      //c3\n"
+       "  ) bar ();\n"
+       "endmodule : mm\n"},
+      {"module  mm ;\n"
+       "foo #(\n"
+       ".a( (1     +2)),\n"  // excess spaces, testing extra parentheses
+       ".bbcccc((c*d)+(e*f))\n"
+       ")bar( );\n"
+       "endmodule:mm\n",
+       "module mm;\n"
+       "  foo #(\n"
+       "      .a     ((1 + 2)),\n"  // induced alignment
+       "      .bbcccc((c * d) + (e * f))\n"
+       "  ) bar ();\n"
+       "endmodule : mm\n"},
+
+      // named port connections
+      {"module  mm ;\n"
+       "foo bar(\n"
+       ".a(a),\n"
+       ".bb(bb)\n"
+       ");\n"
+       "endmodule:mm\n",
+       "module mm;\n"
+       "  foo bar (\n"
+       "      .a (a),\n"  // align doesn't add too many spaces, so align
+       "      .bb(bb)\n"
+       "  );\n"
+       "endmodule : mm\n"},
+      {"module  mm ;\n"
+       "foo bar(\n"
+       ".a(a),\n"
+       ".bbbbbb(bb)\n"
+       ");\n"
+       "endmodule:mm\n",
+       "module mm;\n"
+       "  foo bar (\n"
+       "      .a(a),\n"  // align would add too many spaces, so flush-left
+       "      .bbbbbb(bb)\n"
+       "  );\n"
+       "endmodule : mm\n"},
+      {"module  mm ;\n"
+       "foo bar(\n"
+       ".a    (a),\n"  // user manually triggers alignment with excess spaces
+       ".bbbbbb(bb)\n"
+       ");\n"
+       "endmodule:mm\n",
+       "module mm;\n"
+       "  foo bar (\n"
+       "      .a     (a),\n"  // alignment fixed
+       "      .bbbbbb(bb)\n"
+       "  );\n"
+       "endmodule : mm\n"},
+
+      // net variable declarations
+      {"module nn;\n"
+       "wire wwwww;\n"
+       "logic lll;\n"
+       "endmodule : nn\n",
+       "module nn;\n"
+       "  wire  wwwww;\n"  // alignment adds few spaces, so align
+       "  logic lll;\n"
+       "endmodule : nn\n"},
+      {"module nn;\n"
+       "wire wwwww;\n"
+       "foo_pkg::baz_t lll;\n"
+       "endmodule : nn\n",
+       "module nn;\n"
+       "  wire wwwww;\n"  // alignment adds too many spaces, so flush-left
+       "  foo_pkg::baz_t lll;\n"
+       "endmodule : nn\n"},
+      {"module nn;\n"
+       "wire     wwwww;\n"  // user injects spaces to trigger alignment
+       "foo_pkg::baz_t lll;\n"
+       "endmodule : nn\n",
+       "module nn;\n"
+       "  wire           wwwww;\n"  // ... and gets alignment
+       "  foo_pkg::baz_t lll;\n"
+       "endmodule : nn\n"},
+      {// data/net declarations as generate items (conditional)
+       "module nn;\n"
+       "if (cc)begin:fff\n"
+       "wire wwwww;\n"
+       "logic lll;\n"
+       "end:fff\n"
+       "endmodule : nn\n",
+       "module nn;\n"
+       "  if (cc) begin : fff\n"
+       "    wire  wwwww;\n"  // alignment adds few spaces, so align
+       "    logic lll;\n"
+       "  end : fff\n"
+       "endmodule : nn\n"},
+
+      // continuous assignments
+      {"module m_assign;\n"
+       "assign foo = 1'b1;\n"  // alignment adds few spaces, so align
+       "assign baar = 1'b0;\n"
+       "endmodule\n",
+       "module m_assign;\n"
+       "  assign foo  = 1'b1;\n"  // aligned
+       "  assign baar = 1'b0;\n"
+       "endmodule\n"},
+      {"module m_assign;\n"
+       "assign foo  =  1'b1;\n"  // alignment adds too many spaces, so
+                                 // flush-left
+       "assign baaaaaar = 1'b0;\n"
+       "endmodule\n",
+       "module m_assign;\n"
+       "  assign foo = 1'b1;\n"  // flush-left
+       "  assign baaaaaar = 1'b0;\n"
+       "endmodule\n"},
+      {"module m_assign;\n"
+       "assign foo  =     1'b1;\n"  // induce alignment with excess spaces
+       "assign baaaaaar = 1'b0;\n"
+       "endmodule\n",
+       "module m_assign;\n"
+       "  assign foo      = 1'b1;\n"  // aligned
+       "  assign baaaaaar = 1'b0;\n"
+       "endmodule\n"},
+      {// currently, does not assign across ifdefs
+       "module m_assign;\n"
+       "`ifdef FOO\n"
+       "assign foo  =     1'b1;\n"  // induce alignment with excess spaces
+       "assign baaaaaar = 1'b0;\n"
+       "`else\n"
+       "assign zooo = 2'b11;\n"
+       "assign yoo = 2'b00;\n"
+       "`endif\n"
+       "endmodule\n",
+       "module m_assign;\n"
+       "`ifdef FOO\n"
+       "  assign foo      = 1'b1;\n"  // aligned
+       "  assign baaaaaar = 1'b0;\n"
+       "`else\n"                   // aligned separately above/below
+       "  assign zooo = 2'b11;\n"  // aligned
+       "  assign yoo  = 2'b00;\n"  // aligned
+       "`endif\n"
+       "endmodule\n"},
+      {// mixed net declaration and continuous assignment, both groups aligned
+       "module m_assign;\n"
+       "wire     wwwww;\n"  // induce alignment
+       "foo_pkg::baz_t lll;\n"
+       "assign foo  =     1'b1;\n"  // induce alignment
+       "assign baaaaaar = 1'b0;\n"
+       "endmodule\n",
+       "module m_assign;\n"
+       "  wire           wwwww;\n"  // aligned
+       "  foo_pkg::baz_t lll;\n"
+       "  assign foo      = 1'b1;\n"  // aligned
+       "  assign baaaaaar = 1'b0;\n"
+       "endmodule\n"},
+      {// continuous assignments as generate items (conditional)
+       "module m_assign;\n"
+       "if (xy) begin\n"
+       "assign foo  =  1'b0;\n"  // align: adds few spaces
+       "assign baaar = 1'b1;\n"
+       "end else begin\n"
+       "assign goo  =      1'b1;\n"  // induce alignment with excess spaces
+       "assign zaaaaaar = 1'b0;\n"
+       "end\n"
+       "endmodule\n",
+       "module m_assign;\n"
+       "  if (xy) begin\n"
+       "    assign foo   = 1'b0;\n"  // aligned
+       "    assign baaar = 1'b1;\n"
+       "  end else begin\n"
+       "    assign goo      = 1'b1;\n"  // induce alignment with excess spaces
+       "    assign zaaaaaar = 1'b0;\n"
+       "  end\n"
+       "endmodule\n"},
+      {// continuous assignments as generate items (loop)
+       "module m_assign;\n"
+       "for(genvar i=0; i<k; ++i ) begin\n"
+       "assign foo  =  1'b0;\n"  // align: adds few spaces
+       "assign baaar = 1'b1;\n"
+       "end\n"
+       "endmodule\n",
+       "module m_assign;\n"
+       "  for (genvar i = 0; i < k; ++i) begin\n"
+       "    assign foo   = 1'b0;\n"  // aligned
+       "    assign baaar = 1'b1;\n"
+       "  end\n"
+       "endmodule\n"},
+      {// continuous assignments as generate items (case)
+       "module m_assign;\n"
+       "case (c)\n"
+       "jk:begin\n"
+       "assign foo  =  1'b0;\n"  // align: adds few spaces
+       "assign baaar = 1'b1;\n"
+       "end\n"
+       "endcase\n"
+       "endmodule\n",
+       "module m_assign;\n"
+       "  case (c)\n"
+       "    jk: begin\n"
+       "      assign foo   = 1'b0;\n"  // aligned
+       "      assign baaar = 1'b1;\n"
+       "    end\n"
+       "  endcase\n"
+       "endmodule\n"},
+      {// continuous assignment with comment
+       "module m;\n"
+       "// comment1\n"
+       "assign aaaaa = (bbbbb != ccccc) &\n"
+       "// comment2\n"
+       "(ddddd | (eeeee & ffffff));\n"
+       "endmodule\n",
+       "module m;\n"
+       "  // comment1\n"
+       "  assign aaaaa = (bbbbb != ccccc) &\n"
+       "      // comment2\n"
+       "      (ddddd | (eeeee & ffffff));\n"
+       "endmodule\n"},
+
+      // net/variable assignments: blocking and nonblocking
+      {"module  ma ;\n"
+       "initial  begin\n"
+       "aa = b;\n"
+       "c = 1'b0;\n"
+       "end\n"
+       "endmodule\n",
+       "module ma;\n"
+       "  initial begin\n"
+       "    aa = b;\n"
+       "    c  = 1'b0;\n"  // only one space to align
+       "  end\n"
+       "endmodule\n"},
+      {"function void  fa ;\n"
+       "c = 1'b0;\n"
+       "aa = b;\n"
+       "endfunction\n",
+       "function void fa;\n"
+       "  c  = 1'b0;\n"  // only one space to align
+       "  aa = b;\n"
+       "endfunction\n"},
+      {"task  ta ; \n"
+       "aa =  b;\n"
+       "c = 1'b0;\n"
+       "endtask\n",
+       "task ta;\n"
+       "  aa = b;\n"
+       "  c  = 1'b0;\n"  // only one space to align
+       "endtask\n"},
+      {"module  ma ;\n"
+       "always@( posedge clk) begin\n"
+       "aaa <= b;\n"
+       "c <= 1'b0;\n"
+       "end\n"
+       "endmodule\n",
+       "module ma;\n"
+       "  always @(posedge clk) begin\n"
+       "    aaa <= b;\n"
+       "    c   <= 1'b0;\n"  // only two spaces to align
+       "  end\n"
+       "endmodule\n"},
+      {"function int  fa ;\n"
+       "c <= 1'b0;\n"
+       "aa <= b;\n"
+       "return 0 ;\n"
+       "endfunction\n",
+       "function int fa;\n"
+       "  c  <= 1'b0;\n"  // only one space to align
+       "  aa <= b;\n"
+       "  return 0;\n"
+       "endfunction\n"},
+      {"task  ta ; \n"
+       "$display (\"hello\" );\n"
+       "aa <=  b;\n"
+       "c <= 1'b0;\n"
+       "endtask\n",
+       "task ta;\n"
+       "  $display(\"hello\");\n"
+       "  aa <= b;\n"
+       "  c  <= 1'b0;\n"  // only one space to align
+       "endtask\n"},
+      {// mixed blocking and nonblocking assignments
+       "module  ma ;\n"
+       "always@( posedge clk) begin\n"
+       "aaaaa  = b;\n"
+       "ccc  = 1'b0;\n"
+       "aaa <= b;\n"
+       "c <= 1'b0;\n"
+       "end\n"
+       "endmodule\n",
+       "module ma;\n"
+       "  always @(posedge clk) begin\n"
+       "    aaaaa = b;\n"
+       "    ccc   = 1'b0;\n"  // only two spaces to align
+       "    aaa <= b;\n"
+       "    c   <= 1'b0;\n"  // only two spaces to align (separate group)
+       "  end\n"
+       "endmodule\n"},
+      {"task  ta ; \n"
+       "aa <=  b;\n"
+       "c <= 1'b0;\n"
+       "$display (\"hello\" );\n"  // separates above/below alignment groups
+       "zzaa <=  b;\n"
+       "zzc <= 1'b0;\n"
+       "endtask\n",
+       "task ta;\n"
+       "  aa <= b;\n"
+       "  c  <= 1'b0;\n"  // only one space to align
+       "  $display(\"hello\");\n"
+       "  zzaa <= b;\n"
+       "  zzc  <= 1'b0;\n"  // only one space to align
+       "endtask\n"},
+      {"task  ta ; \n"
+       "$display (\"hello\" );\n"
+       "aaaaa <=  b;\n"
+       "c <= 1'b0;\n"  // need too many spaces to align
+       "endtask\n",
+       "task ta;\n"
+       "  $display(\"hello\");\n"
+       "  aaaaa <= b;\n"
+       "  c <= 1'b0;\n"  // so keep flush-left
+       "endtask\n"},
+      {"function void  fa ; \n"
+       "$display (\"hello\" );\n"
+       "aaaaa =  b;\n"
+       "c = 1'b0;\n"  // need too many spaces to align
+       "endfunction\n",
+       "function void fa;\n"
+       "  $display(\"hello\");\n"
+       "  aaaaa = b;\n"
+       "  c = 1'b0;\n"  // so keep flush-left
+       "endfunction\n"},
+      {"module  ma ;\n"
+       "always@( posedge clk) begin\n"
+       "aaaxx <= b;\n"
+       "c <= 1'b0;\n"  // need too many spaces to align
+       "end\n"
+       "endmodule\n",
+       "module ma;\n"
+       "  always @(posedge clk) begin\n"
+       "    aaaxx <= b;\n"
+       "    c <= 1'b0;\n"  // so keep flush-left
+       "  end\n"
+       "endmodule\n"},
+      {"module  ma ;\n"
+       "always@( posedge clk) begin\n"
+       "aaaxx <= b    ;\n"  // inject 4 spaces to induce alignment
+       "c <= 1'b0;\n"
+       "end\n"
+       "endmodule\n",
+       "module ma;\n"
+       "  always @(posedge clk) begin\n"
+       "    aaaxx <= b;\n"
+       "    c     <= 1'b0;\n"  // induced alignment
+       "  end\n"
+       "endmodule\n"},
+      {"module  ma ;\n"
+       "always@( posedge clk) begin\n"
+       "aaaxx <= b    ;\n"  // inject 4 spaces to induce alignment
+       "//comment\n"
+       "c <= 1'b0;\n"
+       "end\n"
+       "endmodule\n",
+       "module ma;\n"
+       "  always @(posedge clk) begin\n"
+       "    aaaxx <= b;\n"
+       "    //comment\n"       // ignored within alignment group
+       "    c     <= 1'b0;\n"  // induced alignment
+       "  end\n"
+       "endmodule\n"},
+
+      // local variable declarations as statements
+      {"task tt ;\n"
+       "int foo;\n"  // only 2 spaces needed to align
+       "bar_t baz;\n"
+       "endtask\n",
+       "task tt;\n"
+       "  int   foo;\n"  // aligned
+       "  bar_t baz;\n"
+       "endtask\n"},
+      {"function ff ;\n"
+       "bar_t baz;\n"
+       "int foo;\n"  // only 2 spaces needed to align
+       "endfunction\n",
+       "function ff;\n"
+       "  bar_t baz;\n"
+       "  int   foo;\n"  // aligned
+       "endfunction\n"},
+      {"task tt ;\n"
+       "int  foo;\n"  // too many spaces needed to align
+       "baaaar_t baz;\n"
+       "endtask\n",
+       "task tt;\n"
+       "  int foo;\n"  // so flush-left
+       "  baaaar_t baz;\n"
+       "endtask\n"},
+      {"function ff ;\n"
+       "baaaar_t baz;\n"
+       "int  foo;\n"  // too many spaces needed to align
+       "endfunction\n",
+       "function ff;\n"
+       "  baaaar_t baz;\n"
+       "  int foo;\n"  // so flush-left
+       "endfunction\n"},
+      {"task tt ;\n"
+       "int        foo;\n"  // injected spaces to induce alignment
+       "baaaar_t baz;\n"
+       "endtask\n",
+       "task tt;\n"
+       "  int      foo;\n"  // aligned
+       "  baaaar_t baz;\n"
+       "endtask\n"},
+      {"function ff ;\n"
+       "baaaar_t baz    ;\n"  // injected spaces to induce alignment
+       "int  foo;\n"
+       "endfunction\n",
+       "function ff;\n"
+       "  baaaar_t baz;\n"
+       "  int      foo;\n"  // so aligned
+       "endfunction\n"},
+
+      // formal parameters
+      {"module pp #(\n"
+       "int W,\n"
+       "type T\n"
+       ") ();\n"
+       "endmodule : pp\n",
+       "module pp #(\n"
+       "    int  W,\n"  // alignment adds few spaces, so do it
+       "    type T\n"
+       ") ();\n"
+       "endmodule : pp\n"},
+      {"module pp #(\n"
+       "int W,\n"
+       "int[xx:yy] T\n"
+       ") ();\n"
+       "endmodule : pp\n",
+       "module pp #(\n"
+       "    int W,\n"  // alignment adds many spaces, so flush-left
+       "    int [xx:yy] T\n"
+       ") ();\n"
+       "endmodule : pp\n"},
+      {"module pp #(\n"
+       "int W,\n"
+       "int[xx:yy]     T\n"  // user injected spaces intentionally
+       ") ();\n"
+       "endmodule : pp\n",
+       "module pp #(\n"
+       "    int         W,\n"  // ... trigger alignment
+       "    int [xx:yy] T\n"
+       ") ();\n"
+       "endmodule : pp\n"},
+
+      // class member variables
+      {"class  cc ;\n"
+       "int my_int;\n"
+       "bar_t my_bar;\n"
+       "endclass:cc\n",
+       "class cc;\n"
+       "  int   my_int;\n"  // align doesn't add too many spaces, so align
+       "  bar_t my_bar;\n"
+       "endclass : cc\n"},
+      {"class  cc ;\n"
+       "int   my_int;\n"
+       "foo_pkg::bar_t my_bar;\n"
+       "endclass:cc\n",
+       "class cc;\n"
+       "  int my_int;\n"  // align would add too many spaces, so flush-left
+       "  foo_pkg::bar_t my_bar;\n"
+       "endclass : cc\n"},
+      {"class  cc ;\n"
+       "int     my_int;\n"  // intentional excessive spaces, trigger alignment
+       "foo_pkg::bar_t my_bar;\n"
+       "endclass:cc\n",
+       "class cc;\n"
+       "  int            my_int;\n"
+       "  foo_pkg::bar_t my_bar;\n"
+       "endclass : cc\n"},
+      {"class  cc ;\n"
+       "int    my_int;\n"  // unable to infer user's intent, so preserve
+       "foo_pkg::bar_t  my_bar;\n"
+       "endclass:cc\n",
+       "class cc;\n"
+       "  int    my_int;\n"  // ... but still indent
+       "  foo_pkg::bar_t  my_bar;\n"
+       "endclass : cc\n"},
+
+      // case item test cases
+      {// small difference between flush-left and align, so align
+       "function f; case (x)kZZZZ  :if( b )break; default :return 2;"
+       "endcase endfunction\n",
+       "function f;\n"
+       "  case (x)\n"
+       "    kZZZZ:   if (b) break;\n"  // aligned, only adds 2 spaces
+       "    default: return 2;\n"
+       "  endcase\n"
+       "endfunction\n"},
+      {// small error relative to flush-left, so flush-left
+       "function f; case (x)kZ  :if( b )break; default :return 2;"
+       "endcase endfunction\n",
+       "function f;\n"
+       "  case (x)\n"
+       "    kZ: if (b) break;\n"  // flush-left
+       "    default: return 2;\n"
+       "  endcase\n"
+       "endfunction\n"},
+      {// intentional spacing error (delta=4) induces alignment
+       "function f; case (x)kZ  :if( b )break; default    :return 2;"
+       "endcase endfunction\n",
+       "function f;\n"
+       "  case (x)\n"
+       "    kZ:      if (b) break;\n"
+       "    default: return 2;\n"
+       "  endcase\n"
+       "endfunction\n"},
+      {// induced alignment, with ignored comments
+       "function f; case (x)kZ  :if( b )break; \n//c1\n kXX: g = f; "
+       "\n//c2\ndefault    :return 2;"
+       "endcase endfunction\n",
+       "function f;\n"
+       "  case (x)\n"
+       "    kZ:      if (b) break;\n"
+       "    //c1\n"
+       "    kXX:     g = f;\n"
+       "    //c2\n"
+       "    default: return 2;\n"
+       "  endcase\n"
+       "endfunction\n"},
+      {// induced alignment, ignore multiline case item in the middle
+       "function f; case (x)"
+       "kZ  :if( b )break; "
+       "kYY    :return 2;"          // excess spaces induce alignment
+       "    kXXXXXXXXX: begin end"  // multi-line, ignored
+       "    kWWWWW: cc = 23;\n"
+       "    kVVV: cd = 24;\n"
+       "endcase endfunction\n",
+       "function f;\n"
+       "  case (x)\n"
+       "    kZ:     if (b) break;\n"
+       "    kYY:    return 2;\n"
+       "    kXXXXXXXXX: begin\n"  // separates above/below groups
+       "    end\n"
+       "    kWWWWW: cc = 23;\n"
+       "    kVVV:   cd = 24;\n"  // aligned
+       "  endcase\n"
+       "endfunction\n"},
+      {// induced alignment, ignore multiline case item in the middle
+       "function f; case (x)"
+       "kZ  :if( b )break; "
+       "kYY    :return 2;"               // excess spaces induce alignment
+       "    kXXXXXXXXX: if(w)begin end"  // multi-line, ignored
+       "    kWWWWW: cc = 23;\n"
+       "    kVVV: cd = 24;\n"
+       "endcase endfunction\n",
+       "function f;\n"
+       "  case (x)\n"
+       "    kZ:     if (b) break;\n"
+       "    kYY:    return 2;\n"
+       "    kXXXXXXXXX:\n"   // TODO(fangism): allow this to merge with if()
+                             // else indent the following two lines
+       "    if (w) begin\n"  // separates above/below groups
+       "    end\n"
+       "    kWWWWW: cc = 23;\n"
+       "    kVVV:   cd = 24;\n"  // aligned
+       "  endcase\n"
+       "endfunction\n"},
+      {// induced alignment, ignore multiline case item in the middle
+       "task t; case (x)"
+       "kZ  :if( b )break; "
+       "kYY    :return 2;"           // excess spaces induce alignment
+       "    kXXXXXXXXX: fork  join"  // multi-line, ignored
+       "    kWWWWW: cc = 23;\n"
+       "    kVVV: cd = 24;\n"
+       "endcase endtask\n",
+       "task t;\n"
+       "  case (x)\n"
+       "    kZ:     if (b) break;\n"
+       "    kYY:    return 2;\n"
+       "    kXXXXXXXXX:\n"  // TODO(fangism): allow this to merge with fork
+                            // else indent the following two lines
+       "    fork\n"         // separates above/below groups
+       "    join\n"
+       "    kWWWWW: cc = 23;\n"
+       "    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"},
+      {// case-generate: align would add few spaces, so align
+       "module mc ; case (x)kZ  : gg h(); kXYY :j kk();"
+       "endcase endmodule\n",
+       "module mc;\n"
+       "  case (x)\n"
+       "    kZ:   gg h ();\n"  // align
+       "    kXYY: j kk ();\n"
+       "  endcase\n"
+       "endmodule\n"},
+      {// case-generate + comment: align would add few spaces, so align
+       "module mc ; case (x)kZ  : gg h(); \n//c1\n kXYY :j kk();"
+       "endcase endmodule\n",
+       "module mc;\n"
+       "  case (x)\n"
+       "    kZ:   gg h ();\n"  // align
+       "    //c1\n"
+       "    kXYY: j kk ();\n"
+       "  endcase\n"
+       "endmodule\n"},
+      {// case-generate: align would add too many space, so flush-left
+       "module mc ; case (x)kZ  : gg h(); kXYYYY :j kk();"
+       "endcase endmodule\n",
+       "module mc;\n"
+       "  case (x)\n"
+       "    kZ: gg h ();\n"  // flush-left
+       "    kXYYYY: j kk ();\n"
+       "  endcase\n"
+       "endmodule\n"},
+      {// case-generate: inject spaces to induce alignment
+       "module mc ; case (x)kZ  : gg h(); kXYYYY :     j kk();"
+       "endcase endmodule\n",
+       "module mc;\n"
+       "  case (x)\n"
+       "    kZ:     gg h ();\n"  // align
+       "    kXYYYY: j kk ();\n"
+       "  endcase\n"
+       "endmodule\n"},
+      {// randcase: align (small difference from flush-left)
+       "task trc  ;randcase 10: x = 1; 1: x = 3; endcase endtask",
+       "task trc;\n"
+       "  randcase\n"
+       "    10: x = 1;\n"
+       "    1:  x = 3;\n"  // aligned
+       "  endcase\n"
+       "endtask\n"},
+      {// randcase: inferred flush-left
+       "task trc  ;randcase 10000: x = 1; 1: x = 3; endcase endtask",
+       "task trc;\n"
+       "  randcase\n"
+       "    10000: x = 1;\n"
+       "    1: x = 3;\n"
+       "  endcase\n"
+       "endtask\n"},
+      {// randcase: induce alignment
+       "task trc  ;randcase 10000: x = 1    ; 1: x = 3; endcase endtask",
+       "task trc;\n"
+       "  randcase\n"
+       "    10000: x = 1;\n"
+       "    1:     x = 3;\n"  // aligned
+       "  endcase\n"
+       "endtask\n"},
+
+      // distributions
+      {"class foo;\n"
+       "constraint c { "
+       "timer_enable dist {\n"
+       "8'hfe :=  9 , \n"
+       "12'hfff  := 1 }; "
+       "} endclass\n",
+       "class foo;\n"
+       "  constraint c {\n"
+       "    timer_enable dist {\n"
+       "      8'hfe   := 9,\n"  // only two spaces needed to align
+       "      12'hfff := 1\n"   // so align
+       "    };\n"
+       "  }\n"
+       "endclass\n"},
+      {"class foo;\n"
+       "constraint c { "
+       "timer_enable dist {\n"
+       "[ 8'h0 : 8'hfe ] :/  9 , \n"
+       "8'hff  :/ 1 }; "  // takes many spaces to align this, so...
+       "} endclass\n",
+       "class foo;\n"
+       "  constraint c {\n"
+       "    timer_enable dist {\n"
+       "      [8'h0 : 8'hfe] :/ 9,\n"
+       "      8'hff :/ 1\n"  // flush-left
+       "    };\n"
+       "  }\n"
+       "endclass\n"},
+      {"class foo;\n"
+       "constraint c { "
+       "timer_enable dist {\n"
+       "[ 8'h0 : 8'hfe ] :/  9 , \n"
+       "8'hff  :/     1 }; "  // inject excess spaces to trigger alignment
+       "} endclass\n",
+       "class foo;\n"
+       "  constraint c {\n"
+       "    timer_enable dist {\n"
+       "      [8'h0 : 8'hfe] :/ 9,\n"
+       "      8'hff          :/ 1\n"  // aligned
+       "    };\n"
+       "  }\n"
+       "endclass\n"},
+      {"class foo;\n"
+       "constraint c { "
+       "timer_enable dist {\n"
+       "//comment1\n"
+       "[ 8'h0 : 8'hfe ] :/  9 , \n"
+       "//comment2\n"
+       "8'hff  :/     1 \n"
+       "//comment3\n"
+       "}; "  // inject excess spaces to trigger alignment
+       "} endclass\n",
+       "class foo;\n"
+       "  constraint c {\n"
+       "    timer_enable dist {\n"
+       "      //comment1\n"
+       "      [8'h0 : 8'hfe] :/ 9,\n"
+       "      //comment2\n"           // align across comment
+       "      8'hff          :/ 1\n"  // aligned
+       "      //comment3\n"
+       "    };\n"
+       "  }\n"
+       "endclass\n"},
+      {"module foo ();\n"
+       "  always @(posedge bar) begin\n"
+       "    if (1==1) begin\n"
+       "      ham();\n"
+       "    end else if (2==2) begin\n"
+       "      jam();\n"
+       "    end else begin\n"
+       "      spam();\n"
+       "    end\n"
+       "  end\n"
+       "endmodule\n",
+       "module foo ();\n"
+       "  always @(posedge bar) begin\n"
+       "    if (1 == 1) begin\n"
+       "      ham();\n"
+       "    end else if (2 == 2) begin\n"
+       "      jam();\n"
+       "    end else begin\n"
+       "      spam();\n"
+       "    end\n"
+       "  end\n"
+       "endmodule\n"},
+  };
+  // Use a fixed style.
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  // Override some settings to test auto-inferred alignment.
+  style.ApplyToAllAlignmentPolicies(AlignmentPolicy::kInferUserIntent);
+
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    // Require these test cases to be valid.
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}  // NOLINT(readability/fn_size)
+
+static constexpr FormatterTestCase kFormatterWideTestCases[] = {
+    // specify blocks
+    {"module  specify_tests ;\n"
+     "specify\n"  // empty list
+     "endspecify\n"
+     "endmodule",
+     "module specify_tests;\n"
+     "  specify\n"
+     "  endspecify\n"
+     "endmodule\n"},
+    {"module  specify_tests ;\n"
+     "specify\n"
+     "$recrem (posedge R, posedge C,\n"
+     "t1, t2);\n"
+     "endspecify\n"
+     "endmodule",
+     "module specify_tests;\n"
+     "  specify\n"
+     "    $recrem(posedge R, posedge C, t1, t2);\n"
+     "  endspecify\n"
+     "endmodule\n"},
+    {"module  specify_tests ;\n"
+     "specify\n"
+     "// TODO: add this\n"
+     "endspecify \n"
+     "endmodule",
+     "module specify_tests;\n"
+     "  specify\n"
+     "    // TODO: add this\n"
+     "  endspecify\n"
+     "endmodule\n"},
+    {"module  specify_tests ;\n"
+     "specify  \n"
+     "  //c1\n"
+     "$setup (  posedge A, posedge B,\n"
+     "t1);//c2\n"
+     " //c3\n"
+     "$hold (  posedge B , posedge A,t2);    //c4\n"
+     "\t//c5\n"
+     "endspecify\n"
+     "endmodule",
+     "module specify_tests;\n"
+     "  specify\n"
+     "    //c1\n"
+     "    $setup(posedge A, posedge B, t1);  //c2\n"
+     "    //c3\n"
+     "    $hold(posedge B, posedge A, t2);  //c4\n"
+     "    //c5\n"
+     "  endspecify\n"
+     "endmodule\n"},
+    {"module  specify_tests ;\n"
+     "specify  \n"
+     "$setup (  posedge A, posedge B,\n"
+     "t1);\n"
+     "$hold (  posedge B , posedge A,t2);\n"
+     "endspecify\n"
+     "endmodule",
+     "module specify_tests;\n"
+     "  specify\n"
+     "    $setup(posedge A, posedge B, t1);\n"
+     "    $hold(posedge B, posedge A, t2);\n"
+     "  endspecify\n"
+     "endmodule\n"},
+    {"module  specify_tests ;\n"
+     "specify  \n"
+     "  `ifdef CCC\n"
+     "$setup (  posedge A, posedge B,\n"
+     "t1);\n"
+     " `else\n"
+     "$hold (  posedge B , posedge A,t2);   \n"
+     "\t`endif\n"
+     "endspecify\n"
+     "endmodule",
+     "module specify_tests;\n"
+     "  specify\n"
+     "`ifdef CCC\n"
+     "    $setup(posedge A, posedge B, t1);\n"
+     "`else\n"
+     "    $hold(posedge B, posedge A, t2);\n"
+     "`endif\n"
+     "  endspecify\n"
+     "endmodule\n"},
+};
+
+// These tests just need a larger column limit to fit on one line.
+TEST(FormatterEndToEndTest, VerilogFormatWideTest) {
+  // Use a fixed style.
+  FormatStyle style;
+  style.column_limit = 60;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  for (const auto &test_case : kFormatterWideTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    // Require these test cases to be valid.
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+TEST(FormatterEndToEndTest, DisableModulePortDeclarations) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {"", ""},
+      {"\n", "\n"},
+      {"\n\n", "\n\n"},
+      {"module  m  ;\t\n"
+       "  endmodule\n",
+       "module m;\n"
+       "endmodule\n"},
+      {"module  m(   ) ;\n"
+       "  endmodule\n",
+       "module m ();\n"  // empty ports formatted compactly
+       "endmodule\n"},
+      {// for a single port, the alignment handler doesn't even consider it a
+       // group so it falls back to standard flush-left behavior.
+       "module  m   ( input     clk  )\t;\n"
+       "  endmodule\n",
+       "module m (\n"
+       "    input clk\n"
+       ");\n"
+       "endmodule\n"},
+      {// example with two ports
+       "module  m   (\n"
+       "input  clk,\n"
+       "output bar\n"
+       ")\t;\n"
+       "  endmodule\n",
+       "module m (\n"
+       "    input  clk,\n"  // indented, but internal pre-existing spacing
+                            // preserved
+       "    output bar\n"
+       ");\n"
+       "endmodule\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.port_declarations_alignment = verible::AlignmentPolicy::kPreserve;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    // Require these test cases to be valid.
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+TEST(FormatterEndToEndTest, DisableModuleInstantiations) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {"", ""},
+      {"\n", "\n"},
+      {"\n\n", "\n\n"},
+      {"module  m  ;\t\n"
+       "  endmodule\n",
+       "module m;\n"
+       "endmodule\n"},
+      {"module  m  ;\t\n"
+       "foo bar();"
+       "  endmodule\n",
+       "module m;\n"
+       "  foo bar ();\n"  // indentation still takes effect
+       "endmodule\n"},
+      {"module  m  ;\t\n"
+       "logic   xyz;"
+       "wire\tabc;"
+       "  endmodule\n",
+       "module m;\n"
+       "  logic xyz;\n"  // indentation still takes effect
+       "  wire  abc;\n"  // aligned too
+       "endmodule\n"},
+      {"  function f  ;\t\n"
+       " endfunction\n",
+       "function f;\n"
+       "endfunction\n"},
+      {"  function f  ;\t"
+       "foo  bar,baz; "
+       " endfunction\n",
+       "function f;\n"
+       "  foo bar, baz;\n"
+       "endfunction\n"},
+      {"  task  t  ;\t"
+       "foo  bar,baz; "
+       " endtask\n",
+       "task t;\n"
+       "  foo bar, baz;\n"
+       "endtask\n"},
+      {"module  m  ;\t\n"
+       "foo  bar(   .baz(baz)   );"
+       "  endmodule\n",
+       "module m;\n"
+       "  foo bar (.baz(baz));\n"  // indentation still takes effect
+       "endmodule\n"},
+      {"module  m  ;\t\n"
+       "foo  bar(\n"
+       "        .baz  (baz  ),\n"  // example of user-manual alignment
+       "        .blaaa(blaaa)\n"
+       ");"
+       "  endmodule\n",
+       "module m;\n"
+       "  foo bar (\n"           // indentation still takes effect
+       "      .baz  (baz  ),\n"  // named port connections preserved
+       "      .blaaa(blaaa)\n"   // named port connections preserved
+       "  );\n"                  // this indentation is fixed
+       "endmodule\n"},
+      {"module  m  ;\t\n"
+       "foo  #(   .baz(baz)   ) bar();"  // named parameters
+       "  endmodule\n",
+       "module m;\n"
+       "  foo #(.baz(baz)) bar ();\n"  // indentation still takes effect
+       "endmodule\n"},
+      {"module  m  ;\t\n"
+       "foo  #(\n"
+       "        .baz  (baz  ),\n"  // example of user-manual alignment
+       "        .blaaa(blaaa)\n"
+       ")  bar( );"
+       "  endmodule\n",
+       "module m;\n"
+       "  foo #(\n"              // indentation still takes effect
+       "      .baz  (baz  ),\n"  // named parameter arguments preserved
+       "      .blaaa(blaaa)\n"   // named parameter arguments preserved
+       "  ) bar ();\n"           // this indentation is fixed
+       "endmodule\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  // Testing preservation of spaces
+  style.named_parameter_alignment = AlignmentPolicy::kPreserve;
+  style.named_port_alignment = AlignmentPolicy::kPreserve;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    // Require these test cases to be valid.
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+TEST(FormatterEndToEndTest, DisableTryWrapLongLines) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {"", ""},
+      {"\n", "\n"},
+      {"\n\n", "\n\n"},
+      {"module  m  ;\t\n"
+       "  endmodule\n",
+       "module m;\n"
+       "endmodule\n"},
+      {"module  m(   ) ;\n"
+       "  endmodule\n",
+       "module m ();\n"
+       "endmodule\n"},
+      {"module  m(   ) ;\n"
+       "initial assign a = b;\n"
+       "  endmodule\n",
+       "module m ();\n"
+       "  initial assign a = b;\n"
+       "endmodule\n"},
+      {"module  m(   ) ;\n"
+       "initial assign a = {never +gonna +give +you +up,\n"
+       "never + gonna +Let +you +down};\n"
+       "  endmodule\n",
+       "module m ();\n"
+       "  initial\n"
+       "    assign a = {\n"
+       "      never + gonna + give + you + up,\n"
+       "      never + gonna + Let + you + down\n"
+       "    };\n"
+       "endmodule\n"},
+      {"module  m(   ) ;\n"
+       "initial assign a = {never +gonna +give +you +up+\n"  // over 40 columns,
+                                                             // give up
+       "never + gonna +Let +you +down};\n"
+       "  endmodule\n",
+       "module m ();\n"
+       "  initial\n"
+       "    assign a = {\n"
+       "      never +gonna +give +you +up+\n"  // indented properly, but
+       "never + gonna +Let +you +down\n"       // preserved original
+       "    };\n"
+       "endmodule\n"},
+      {// The if-header is a single leaf partition, and does not fit,
+       // so its original spacing should be preserved.
+       // We deliberately insert weird spacing to show that it is preserved.
+       "function f;\n"
+       "if ((xxx.aaaa >= bbbbbbbbbbbbbbb) &&\n"
+       "      ((ccc.ddd  +  eee.ffffff * g) <=\n"
+       "       (hhhhhhhhhhhhhhh+iiiiiiiiiiiiiiiiiiii))) begin\n"
+       "end\n"
+       "endfunction\n",
+       "function f;\n"
+       "  if ((xxx.aaaa >= bbbbbbbbbbbbbbb) &&\n"  // indentation fixed
+       "      ((ccc.ddd  +  eee.ffffff * g) <=\n"
+       "       (hhhhhhhhhhhhhhh+iiiiiiiiiiiiiiiiiiii))) begin\n"
+       "  end\n"  // indentation fixed
+       "endfunction\n"},
+
+      // Make sure indentation still works with wrapping disabled,
+      // and leaf partitions fit on one line.
+      {"function void f();\n"
+       "for (int i = N; i > 0; i--) begin\n"
+       "end\n"
+       "endfunction\n",
+       "function void f();\n"
+       "  for (int i = N; i > 0; i--) begin\n"
+       "  end\n"
+       "endfunction\n"},
+      {"function void f();"
+       "if(i > 0 ) begin end "
+       "endfunction",
+       "function void f();\n"
+       "  if (i > 0) begin\n"
+       "  end\n"
+       "endfunction\n"},
+      {"function void f();"  // newlines absent from input
+       "for (int i=N; i>0; i--) begin end "
+       "endfunction",
+       "function void f();\n"
+       "  for (int i = N; i > 0; i--) begin\n"  // spacing corrected
+       "  end\n"
+       "endfunction\n"},
+      {"module m( );\n"
+       "  always_ff  @  (  posedge  (  clk  )  ) begin\n"
+       "out  <=  rst_clk  ?  0 : in  ;\n"
+       "end\n"
+       "endmodule : simple\n",
+       "module m ();\n"
+       "  always_ff @(posedge (clk)) begin\n"
+       "    out <= rst_clk ? 0 : in;\n"
+       "  end\n"
+       "endmodule : simple\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.try_wrap_long_lines = false;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    // Require these test cases to be valid.
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+TEST(FormatterEndToEndTest, ModulePortDeclarationsIndentNotWrap) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {"", ""},
+      {"\n", "\n"},
+      {"\n\n", "\n\n"},
+      {"module  m  ;\t\n"
+       "  endmodule\n",
+       "module m;\n"
+       "endmodule\n"},
+      {"module  m(   ) ;\n"
+       "  endmodule\n",
+       "module m ();\n"  // empty ports formatted compactly
+       "endmodule\n"},
+      {// single port example
+       "module  m   ( input     clk  )\t;\n"
+       "  endmodule\n",
+       "module m (\n"
+       "  input clk\n"  // 2 spaces
+       ");\n"
+       "endmodule\n"},
+      {// example with two ports
+       "module  m   (\n"
+       "input  clk,\n"
+       "output bar\n"
+       ")\t;\n"
+       "  endmodule\n",
+       "module m (\n"
+       "  input  clk,\n"  // indented 2 spaces, and aligned
+       "  output bar\n"
+       ");\n"
+       "endmodule\n"},
+      {// interface example
+       "interface  handshake   (\n"
+       "wire req,\n"
+       "wire ack\n"
+       ")\t;\n"
+       "  endinterface\n",
+       "interface handshake (\n"
+       "  wire req,\n"  // indented 2 spaces
+       "  wire ack\n"
+       ");\n"
+       "endinterface\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  // Indent 2 spaces instead of wrapping 4 spaces.
+  style.port_declarations_indentation = IndentationStyle::kIndent;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    // Require these test cases to be valid.
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+TEST(FormatterEndToEndTest, NamedPortConnectionsIndentNotWrap) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {"", ""},
+      {"\n", "\n"},
+      {"\n\n", "\n\n"},
+      {"module  m  ;\t\n"
+       "  endmodule\n",
+       "module m;\n"
+       "endmodule\n"},
+      {"module  m(   ) ;\n"
+       "  endmodule\n",
+       "module m ();\n"  // empty ports formatted compactly
+       "endmodule\n"},
+      {// single port example
+       "module  m ;\n"
+       "foo bar( .clk( clk ) )\t;\n"
+       "  endmodule\n",
+       "module m;\n"
+       "  foo bar (.clk(clk));\n"
+       "endmodule\n"},
+      {// two port example
+       "module  m ;\n"
+       "foo bar( .clk2( clk ),.data (data) )\t;\n"
+       "  endmodule\n",
+       "module m;\n"
+       "  foo bar (\n"
+       "    .clk2(clk),\n"  // indent only +2 spaces
+       "    .data(data)\n"
+       "  );\n"
+       "endmodule\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  // Indent 2 spaces instead of wrapping 4 spaces.
+  style.named_port_indentation = IndentationStyle::kIndent;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    // Require these test cases to be valid.
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+TEST(FormatterEndToEndTest, WrapEndElseStatements) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {"module foo ();\n"
+       "  always @(posedge bar) begin\n"
+       "    if (1==1) begin\n"
+       "      ham();\n"
+       "    end else if (2==2) begin\n"
+       "      jam();\n"
+       "    end else begin\n"
+       "      spam();\n"
+       "    end\n"
+       "  end\n"
+       "endmodule\n",
+       "module foo ();\n"
+       "  always @(posedge bar) begin\n"
+       "    if (1 == 1) begin\n"
+       "      ham();\n"
+       "    end\n"
+       "    else if (2 == 2) begin\n"
+       "      jam();\n"
+       "    end\n"
+       "    else begin\n"
+       "      spam();\n"
+       "    end\n"
+       "  end\n"
+       "endmodule\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.wrap_end_else_clauses = true;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    // Require these test cases to be valid.
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+TEST(FormatterEndToEndTest, FormalParametersIndentNotWrap) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {"", ""},
+      {"\n", "\n"},
+      {"\n\n", "\n\n"},
+      {"module  m  ;\t\n"
+       "  endmodule\n",
+       "module m;\n"
+       "endmodule\n"},
+      {"module  m #(   ) ;\n"  // empty parameters
+       "  endmodule\n",
+       "module m #();\n"
+       "endmodule\n"},
+      {// single parameter example
+       "module  m   #( int W = 2)\t;\n"
+       "  endmodule\n",
+       "module m #(\n"
+       "  int W = 2\n"  // indented 2 spaces
+       ");\n"
+       "endmodule\n"},
+      {// module with two parameters
+       "module  m   #(\n"
+       "int W = 2,\n"
+       "int L = 4\n"
+       ")\t;\n"
+       "  endmodule\n",
+       "module m #(\n"
+       "  int W = 2,\n"  // indented 2 spaces
+       "  int L = 4\n"
+       ");\n"
+       "endmodule\n"},
+      {// interface with two parameters
+       "interface  m   #(\n"
+       "int W = 2,\n"
+       "int L = 4\n"
+       ")\t;\n"
+       "  endinterface\n",
+       "interface m #(\n"
+       "  int W = 2,\n"  // indented 2 spaces
+       "  int L = 4\n"
+       ");\n"
+       "endinterface\n"},
+      {// class with two parameters
+       "class  c   #(\n"
+       "int W = 2,\n"
+       "int L = 4\n"
+       ")\t;\n"
+       "  endclass\n",
+       "class c #(\n"
+       "  int W = 2,\n"  // indented 2 spaces
+       "  int L = 4\n"
+       ");\n"
+       "endclass\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  // Indent 2 spaces instead of wrapping 4 spaces.
+  style.formal_parameters_indentation = IndentationStyle::kIndent;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    // Require these test cases to be valid.
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+TEST(FormatterEndToEndTest, NamedParametersIndentNotWrap) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {"", ""},
+      {"\n", "\n"},
+      {"\n\n", "\n\n"},
+      {"module  m  ;\t\n"
+       "  endmodule\n",
+       "module m;\n"
+       "endmodule\n"},
+      {"module  m #(   ) ;\n"  // empty parameters
+       "  endmodule\n",
+       "module m #();\n"
+       "endmodule\n"},
+      {"module  m  ;\t\n"
+       " foo #()bar();\n"
+       "  endmodule\n",
+       "module m;\n"
+       "  foo #() bar ();\n"
+       "endmodule\n"},
+      {// one named parameter
+       "module  m ;\n"
+       "foo #(.W(1)) bar();\n"
+       "  endmodule\n",
+       "module m;\n"
+       "  foo #(.W(1)) bar ();\n"
+       "endmodule\n"},
+      {// two named parameters
+       "module  m ;\n"
+       "foo #(.W(1), .L(2)) bar();\n"
+       "  endmodule\n",
+       "module m;\n"
+       "  foo #(\n"
+       "    .W(1),\n"  // indent +2 spaces only
+       "    .L(2)\n"
+       "  ) bar ();\n"
+       "endmodule\n"},
+      {// class data member with two parameters
+       "class  c  ;\n"
+       " foo_pkg::bar_t#(\n"
+       ".W(2),.L(4)"
+       ") baz;\n"
+       "  endclass\n",
+       "class c;\n"
+       "  foo_pkg::bar_t #(\n"
+       "    .W(2),\n"  // indent +2 spaces only
+       "    .L(4)\n"
+       "  ) baz;\n"
+       "endclass\n"},
+      {// typedef with two parameters
+       "typedef \n"
+       " foo_pkg::bar_t  #("
+       ".W(2),.L(4)"
+       ") baz;\n",
+       "typedef foo_pkg::bar_t#(\n"
+       "  .W(2),\n"  // indent +2 spaces only
+       "  .L(4)\n"
+       ") baz;\n"},
+  };
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  // Indent 2 spaces instead of wrapping 4 spaces.
+  style.named_parameter_indentation = IndentationStyle::kIndent;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    // Require these test cases to be valid.
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+struct SelectLinesTestCase {
+  std::string_view input;
+  LineNumberSet lines;  // explicit set of lines to enable formatting
+  std::string_view expected;
+};
+
+// Tests that formatter honors selected line numbers.
+TEST(FormatterEndToEndTest, SelectLines) {
+  const SelectLinesTestCase kTestCases[] = {
+      {"", {}, ""},
+      {"", {{1, 2}}, ""},
+      {// expect all three lines for format
+       "  parameter    int foo_line1 =     0 ;\n"
+       "  parameter    int foo_line2 =     0 ;\n"
+       "  parameter    int foo_line3 =     0 ;\n",
+       {},
+       "parameter int foo_line1 = 0;\n"
+       "parameter int foo_line2 = 0;\n"
+       "parameter int foo_line3 = 0;\n"},
+      {// expect only one line to format
+       "  parameter    int foo_line1 =     0 ;\n"
+       "  parameter    int foo_line2 =     0 ;\n"
+       "  parameter    int foo_line3 =     0 ;\n",
+       {{1, 2}},
+       "parameter int foo_line1 = 0;\n"
+       "  parameter    int foo_line2 =     0 ;\n"
+       "  parameter    int foo_line3 =     0 ;\n"},
+      {// expect only one line to format
+       "  parameter    int foo_line1 =     0 ;\n"
+       "  parameter    int foo_line2 =     0 ;\n"
+       "  parameter    int foo_line3 =     0 ;\n",
+       {{2, 3}},
+       "  parameter    int foo_line1 =     0 ;\n"
+       "parameter int foo_line2 = 0;\n"
+       "  parameter    int foo_line3 =     0 ;\n"},
+      {// expect only one line to format
+       "  parameter    int foo_line1 =     0 ;\n"
+       "  parameter    int foo_line2 =     0 ;\n"
+       "  parameter    int foo_line3 =     0 ;\n",
+       {{3, 4}},
+       "  parameter    int foo_line1 =     0 ;\n"
+       "  parameter    int foo_line2 =     0 ;\n"
+       "parameter int foo_line3 = 0;\n"},
+      {// expect to format two lines
+       "  parameter    int foo_line1 =     0 ;\n"
+       "  parameter    int foo_line2 =     0 ;\n"
+       "  parameter    int foo_line3 =     0 ;\n",
+       {{1, 3}},
+       "parameter int foo_line1 = 0;\n"
+       "parameter int foo_line2 = 0;\n"
+       "  parameter    int foo_line3 =     0 ;\n"},
+      {// expect to format two lines
+       "  parameter    int foo_line1 =     0 ;\n"
+       "  parameter    int foo_line2 =     0 ;\n"
+       "  parameter    int foo_line3 =     0 ;\n",
+       {{2, 4}},
+       "  parameter    int foo_line1 =     0 ;\n"
+       "parameter int foo_line2 = 0;\n"
+       "parameter int foo_line3 = 0;\n"},
+      {// expect to format two lines
+       "  parameter    int foo_line1 =     0 ;\n"
+       "  parameter    int foo_line2 =     0 ;\n"
+       "  parameter    int foo_line3 =     0 ;\n",
+       {{1, 2}, {3, 4}},
+       "parameter int foo_line1 = 0;\n"
+       "  parameter    int foo_line2 =     0 ;\n"
+       "parameter int foo_line3 = 0;\n"},
+      {// expect to format all lines
+       "  parameter    int foo_line1 =     0 ;\n"
+       "  parameter    int foo_line2 =     0 ;\n"
+       "  parameter    int foo_line3 =     0 ;\n",
+       {{1, 4}},
+       "parameter int foo_line1 = 0;\n"
+       "parameter int foo_line2 = 0;\n"
+       "parameter int foo_line3 = 0;\n"},
+      {// expect to format no lines (line numbers out of bounds)
+       "  parameter    int foo_line1 =     0 ;\n"
+       "  parameter    int foo_line2 =     0 ;\n"
+       "  parameter    int foo_line3 =     0 ;\n",
+       {{4, 6}},
+       "  parameter    int foo_line1 =     0 ;\n"
+       "  parameter    int foo_line2 =     0 ;\n"
+       "  parameter    int foo_line3 =     0 ;\n"},
+      {// expect to format all lines
+       "// verilog_format: on\n"
+       "  parameter    int foo_line2 =     0 ;\n"
+       "  parameter    int foo_line3 =     0 ;\n"
+       "  parameter    int foo_line4 =     0 ;\n",
+       {},
+       "// verilog_format: on\n"
+       "parameter int foo_line2 = 0;\n"
+       "parameter int foo_line3 = 0;\n"
+       "parameter int foo_line4 = 0;\n"},
+      {// expect to format no lines
+       "// verilog_format: off\n"
+       "  parameter    int foo_line2 =     0 ;\n"
+       "  parameter    int foo_line3 =     0 ;\n"
+       "  parameter    int foo_line4 =     0 ;\n",
+       {},
+       "// verilog_format: off\n"
+       "  parameter    int foo_line2 =     0 ;\n"
+       "  parameter    int foo_line3 =     0 ;\n"
+       "  parameter    int foo_line4 =     0 ;\n"},
+      {// expect to format some lines
+       "// verilog_format: on\n"
+       "  parameter    int foo_line2 =     0 ;\n"
+       "  parameter    int foo_line3 =     0 ;\n"
+       "  parameter    int foo_line4 =     0 ;\n",
+       {{3, 5}},
+       "// verilog_format: on\n"
+       "  parameter    int foo_line2 =     0 ;\n"
+       "parameter int foo_line3 = 0;\n"  // disable lines 3,4
+       "parameter int foo_line4 = 0;\n"},
+      {// enable all lines, but respect format-off
+       "  parameter    int foo_line1 =     0 ;\n"
+       "  parameter    int foo_line2 =     0 ;\n"
+       "// verilog_format: off\n"
+       "  parameter    int foo_line4 =     0 ;\n",
+       {{1, 5}},
+       "parameter int foo_line1 = 0;\n"
+       "parameter int foo_line2 = 0;\n"
+       "// verilog_format: off\n"
+       "  parameter    int foo_line4 =     0 ;\n"},
+      {// enable all lines, but respect format-off
+       "  parameter    int foo_line1 =     0 ;\n"
+       "// verilog_format: off\n"
+       "  parameter    int foo_line3 =     0 ;\n"
+       "// verilog_format: on\n"
+       "  parameter    int foo_line5 =     0 ;\n",
+       {{1, 6}},
+       "parameter int foo_line1 = 0;\n"
+       "// verilog_format: off\n"
+       "  parameter    int foo_line3 =     0 ;\n"
+       "// verilog_format: on\n"
+       "parameter int foo_line5 = 0;\n"},
+      {// enable all lines, but respect format-off
+       "// verilog_format: off\n"
+       "  parameter    int foo_line2 =     0 ;\n"
+       "  parameter    int foo_line3 =     0 ;\n"
+       "// verilog_format: on\n"
+       "  parameter    int foo_line5 =     0 ;\n",
+       {{1, 6}},
+       "// verilog_format: off\n"
+       "  parameter    int foo_line2 =     0 ;\n"
+       "  parameter    int foo_line3 =     0 ;\n"
+       "// verilog_format: on\n"
+       "parameter int foo_line5 = 0;\n"},
+      {"module m;\n"
+       "  if (foo) begin:l1\n"
+       "    if (foo) begin:l2\n"
+       "      always_comb\n"  // normally this line and next would fit together
+       "        d<=#1ps   x_lat\t;\n"  // only format this line, 5
+       "    end : l2\n"
+       "  end : l1\n"
+       "endmodule\n",
+       {{5, 6}},
+       "module m;\n"
+       "  if (foo) begin:l1\n"
+       "    if (foo) begin:l2\n"
+       "      always_comb\n"  // incremental mode prevents joining next line
+       "        d <= #1ps x_lat;\n"  // only this line changed
+       "    end : l2\n"
+       "  end : l1\n"
+       "endmodule\n"},
+
+      // Next three test cases: one whole-file, two incremental
+      {"module m(\n"
+       "  input wire f,\n"
+       "  input  foo::bar  ggg\n"
+       ");\n"
+       "endmodule:m\n",
+       {},  // format all lines
+       "module m (\n"
+       "    input wire     f,\n"
+       "    input foo::bar ggg\n"
+       ");\n"
+       "endmodule : m\n"},
+      {"module m(\n"
+       "  input wire f,\n"
+       "  input  foo::bar  ggg\n"  // "new line", formatted incrementally
+       ");\n"
+       "endmodule:m\n",
+       {{3, 4}},  // format incrementally
+       "module m(\n"
+       "  input wire f,\n"
+       "    input  foo::bar  ggg\n"  // "new line" remains untouched
+       ");\n"
+       "endmodule:m\n"},
+      {"module m(\n"
+       "  input  wire   f,\n"  // "new line", formatted incrementally
+       "  input  foo::bar  ggg\n"
+       ");\n"
+       "endmodule:m\n",
+       {{2, 3}},  // format incrementally
+       "module m(\n"
+       "    input  wire   f,\n"  // "new line" indented, but other spaces kept
+       "  input  foo::bar  ggg\n"
+       ");\n"
+       "endmodule:m\n"},
+  };
+  // Use a fixed style.
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status = FormatVerilog(test_case.input, "<filename>", style,
+                                      stream, test_case.lines);
+    EXPECT_OK(status) << status.message() << '\n'
+                      << "Lines: " << test_case.lines;
+    EXPECT_EQ(stream.str(), test_case.expected)
+        << "code:\n"
+        << test_case.input << "\nlines: " << test_case.lines;
+  }
+}
+
+// These tests verify the mode where horizontal spacing is discarded while
+// vertical spacing is preserved.
+TEST(FormatterEndToEndTest, PreserveVSpacesOnly) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      // {input, expected},
+      // No tokens cases: still preserve vertical spacing, but not horizontal
+      {"", ""},
+      {"    ", ""},
+      {"\n", "\n"},
+      {"\n\n", "\n\n"},
+      {"  \n", "\n"},
+      {"\n  ", "\n"},
+      {"  \n  ", "\n"},
+      {"  \n  \t\t\n\t  ", "\n\n"},
+
+      // The remaining cases have at least one non-whitespace token.
+
+      // single comment
+      {"//\n", "//\n"},
+      {"//  \n", "//  \n"},  // trailing spaces inside comment untouched
+      {"\n//\n", "\n//\n"},
+      {"\n\n//\n", "\n\n//\n"},
+      {"\n//\n\n", "\n//\n\n"},
+      {"      //\n", "//\n"},  // spaces before comment discarded
+      {"   \n   //\n", "\n//\n"},
+      {"   \n   //\n  \n  ", "\n//\n\n"},  // trailing spaces discarded
+
+      // multi-comment
+      {"//\n//\n", "//\n//\n"},
+      {"\n//\n\n//\n\n", "\n//\n\n//\n\n"},
+      {"\n//\n\n//\n", "\n//\n\n//\n"},  // blank line between comments
+
+      // Module cases with token partition boundary (before 'endmodule').
+      {"module foo;endmodule\n", "module foo;\nendmodule\n"},
+      {"module foo;\nendmodule\n", "module foo;\nendmodule\n"},
+      {"module foo;\n\nendmodule\n", "module foo;\n\nendmodule\n"},
+      {"\nmodule foo;endmodule\n", "\nmodule foo;\nendmodule\n"},
+      {"\nmodule foo     ;    endmodule\n", "\nmodule foo;\nendmodule\n"},
+      {"\nmodule\nfoo\n;endmodule\n", "\nmodule foo;\nendmodule\n"},
+      {"\nmodule foo;endmodule\n\n\n", "\nmodule foo;\nendmodule\n\n\n"},
+      {"\n\n\nmodule foo;endmodule\n", "\n\n\nmodule foo;\nendmodule\n"},
+      {"\nmodule\nfoo\n;\n\n\nendmodule\n", "\nmodule foo;\n\n\nendmodule\n"},
+
+      // Module cases with one indented item, various original vertical spacing
+      {"module foo;wire w;endmodule\n", "module foo;\n  wire w;\nendmodule\n"},
+      {"  module   foo  ;wire    w  ;endmodule  \n  ",
+       "module foo;\n  wire w;\nendmodule\n"},
+      {"\nmodule\nfoo\n;\nwire\nw\n;endmodule\n\n",
+       "\nmodule foo;\n  wire w;\nendmodule\n\n"},
+      {"\n\nmodule\nfoo\n;\n\n\nwire\nw\n;\n\nendmodule\n\n",
+       "\n\nmodule foo;\n\n\n  wire w;\n\nendmodule\n\n"},
+
+      // The following cases show that some horizontal whitespace is discarded,
+      // while vertical spacing is preserved on partition boundaries.
+      {"     module  foo\t   \t;    endmodule   \n",
+       "module foo;\nendmodule\n"},
+      {"\t\n     module  foo\t\t;    endmodule   \n",
+       "\nmodule foo;\nendmodule\n"},
+
+      // Module with comments intermingled.
+      {
+          "//1\nmodule foo;//2\nwire w;//3\n//4\nendmodule\n",
+          "//1\nmodule foo;  //2\n  wire w;  //3\n  //4\nendmodule\n"
+          // TODO(fangism): whether or not //4 should be indented is
+          // questionable (in similar cases below too).
+      },
+      {// now with extra blank lines
+       "//1\n\nmodule foo;//2\n\nwire w;//3\n\n//4\n\nendmodule\n\n",
+       "//1\n\nmodule foo;  //2\n\n  wire w;  //3\n\n  //4\n\nendmodule\n\n"},
+
+      {
+          // module with comments-only in some empty blocks, properly indented
+          "  // humble module\n"
+          "  module foo (// non-port comment\n"
+          "// port comment 1\n"
+          "// port comment 2\n"
+          ");// header trailing comment\n"
+          "// item comment 1\n"
+          "// item comment 2\n"
+          "endmodule\n",
+          "// humble module\n"
+          "module foo (  // non-port comment\n"
+          "    // port comment 1\n"
+          "    // port comment 2\n"
+          ");  // header trailing comment\n"
+          "  // item comment 1\n"
+          "  // item comment 2\n"
+          "endmodule\n",
+      },
+
+      {
+          // module with comments around non-empty blocks
+          "  // humble module\n"
+          "  module foo (// non-port comment\n"
+          "// port comment 1\n"
+          "input   logic   f  \n"
+          "// port comment 2\n"
+          ");// header trailing comment\n"
+          "// item comment 1\n"
+          "wire w ; \n"
+          "// item comment 2\n"
+          "endmodule\n",
+          "// humble module\n"
+          "module foo (  // non-port comment\n"
+          "    // port comment 1\n"
+          "    input logic f\n"
+          "    // port comment 2\n"
+          ");  // header trailing comment\n"
+          "  // item comment 1\n"
+          "  wire w;\n"
+          "  // item comment 2\n"
+          "endmodule\n",
+      },
+  };
+  FormatStyle style;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+static constexpr FormatterTestCase kFormatterTestCasesElseStatements[] = {
+    {"module m;"
+     "task static t; if (r == t) a.b(c); else d.e(f); endtask;"
+     "endmodule",
+     "module m;\n"
+     "  task static t;\n"
+     "    if (r == t) a.b(c);\n"
+     "    else d.e(f);\n"
+     "  endtask\n"
+     "  ;\n"  // possibly unintended stray ';'
+     "endmodule\n"},
+    {"module m;"
+     "task static t; if (r == t) begin a.b(c); end else begin d.e(f); end "
+     "endtask;"
+     "endmodule",
+     "module m;\n"
+     "  task static t;\n"
+     "    if (r == t) begin\n"
+     "      a.b(c);\n"
+     "    end else begin\n"
+     "      d.e(f);\n"
+     "    end\n"
+     "  endtask\n"
+     "  ;\n"  // stray ';'
+     "endmodule\n"},
+    {"module m;initial begin if(a==b)"
+     "c.d(e);else\n"
+     "f.g(h);end endmodule",
+     "module m;\n"
+     "  initial begin\n"
+     "    if (a == b) c.d(e);\n"
+     "    else f.g(h);\n"
+     "  end\n"
+     "endmodule\n"},
+    {"   module m;  always_comb    begin     \n"
+     "        if      ( a   ) b =  16'hdead    ; \n"
+     "  else if (   c     )  d= 16 'hbeef  ;   \n"
+     "     else        if (e) f=16'hca_fe ;     \n"
+     "end   \n endmodule\n",
+     "module m;\n"
+     "  always_comb begin\n"
+     "    if (a) b = 16'hdead;\n"
+     "    else if (c) d = 16'hbeef;\n"
+     "    else if (e) f = 16'hca_fe;\n"
+     "  end\n"
+     "endmodule\n"},
+    {"module foo();\n"
+     "always_comb begin\n"
+     "value = function_name(.long_parameter(8'hA), .parameter_three(foobar));\n"
+     "end\n"
+     "endmodule : foo\n",
+     "module foo ();\n"
+     "  always_comb begin\n"
+     "    value = function_name(\n"
+     "      .long_parameter(8'hA),\n"
+     "      .parameter_three(foobar)\n"
+     "    );\n"
+     "  end\n"
+     "endmodule : foo\n"},
+    {"module foo();\n"
+     "always_comb begin\n"
+     "value = function_name(.a(1), .b(2));\n"
+     "end\n"
+     "endmodule : foo\n",
+     "module foo ();\n"
+     "  always_comb begin\n"
+     "    value = function_name(.a(1), .b(2));\n"
+     "  end\n"
+     "endmodule : foo\n"},
+    {"module foo ();\n"
+     "always_comb begin\n"
+     "value = function_name(8'hA, foobar, signal_1234); end\n"
+     "always_comb begin\n"
+     "value = function_name(8'hA, foobar); end\n"
+     "endmodule : foo\n",
+     "module foo ();\n"
+     "  always_comb begin\n"
+     "    value = function_name(8'hA, foobar,\n"
+     "                          signal_1234);\n"
+     "  end\n"
+     "  always_comb begin\n"
+     "    value = function_name(8'hA, foobar);\n"
+     "  end\n"
+     "endmodule : foo\n"},
+    {"module foo ();\n"
+     "always_comb begin\n"
+     "value = function_name(8'hA, foobar, signal_1234);\n"
+     "value = function_name(8'hA, foobar, signal_1234); end\n"
+     "endmodule : foo\n",
+     "module foo ();\n"
+     "  always_comb begin\n"
+     "    value = function_name(8'hA, foobar,\n"
+     "                          signal_1234);\n"
+     "    value = function_name(8'hA, foobar,\n"
+     "                          signal_1234);\n"
+     "  end\n"
+     "endmodule : foo\n"},
+    {"always_comb begin\n"
+     "value = "
+     "f(long_parameter_exceeding_col_limit, foo, bar); end\n",
+     "always_comb begin\n"
+     "  value = f(\n"
+     "    long_parameter_exceeding_col_limit,\n"
+     "    foo,\n"
+     "    bar\n"
+     "  );\n"
+     "end\n"},
+    {"module foo();\n"
+     "always_comb begin\n"
+     "value = function_name(8'hA, .parameter_three(foobar));\n"
+     "end\n"
+     "endmodule : foo\n",
+     "module foo ();\n"
+     "  always_comb begin\n"
+     "    value = function_name(\n"
+     "      8'hA,\n"
+     "      .parameter_three(foobar)\n"
+     "    );\n"
+     "  end\n"
+     "endmodule : foo\n"},
+    {"module foo ();\n"
+     "always_comb begin\n"
+     "value = function_name(8'hA, 8'hB, 8'hC, .parameter_four(foo), "
+     ".par_five(bar));\n"
+     "end\n"
+     "endmodule : foo\n",
+     "module foo ();\n"
+     "  always_comb begin\n"
+     "    value = function_name(\n"
+     "      8'hA,\n"
+     "      8'hB,\n"
+     "      8'hC,\n"
+     "      .parameter_four(foo),\n"
+     "      .par_five(bar)\n"
+     "    );\n"
+     "  end\n"
+     "endmodule : foo\n"},
+    {"class dv_base_mem; function void configure(); \nbegin\n"
+     "value = func(8'hA, foobar, signal_1234);\n"
+     "value = new(8'hA, foobar, signal_1234); end\n"
+     "endfunction : configure endclass\n",
+     "class dv_base_mem;\n"
+     "  function void configure();\n"
+     "    begin\n"
+     "      value = func(8'hA, foobar,\n"
+     "                   signal_1234);\n"
+     "      value = new(8'hA, foobar,\n"
+     "                  signal_1234);\n"
+     "    end\n"
+     "  endfunction : configure\n"
+     "endclass\n"},
+    {"module m; initial begin\n"
+     "        if     (a||b)        c         = 1'b1;\n"
+     "d =        1'b1; if         (e)\n"
+     "begin f = 1'b0; end else begin\n"
+     "    g = h;\n"
+     "        end \n"
+     " i = 1'b1; "
+     "end endmodule\n",
+     "module m;\n"
+     "  initial begin\n"
+     "    if (a || b) c = 1'b1;\n"
+     "    d = 1'b1;\n"
+     "    if (e) begin\n"
+     "      f = 1'b0;\n"
+     "    end else begin\n"
+     "      g = h;\n"
+     "    end\n"
+     "    i = 1'b1;\n"
+     "  end\n"
+     "endmodule\n"},
+    {"module m; initial begin\n"
+     "if (a&&b&&c) begin\n"
+     "         d         = 1'b1;\n"
+     "     if (e) begin\n"
+     "   f = ff;\n"
+     "       end  else   if  (    g  )   begin\n"
+     "     h = hh;\n"
+     "end else if (i) begin\n"
+     "    j   =   (kk == ll) ? mm :\n"
+     "      gg;\n"
+     "   end     else   if    (  qq )  begin\n"
+     "    if      (  xx   ||yy        ) begin    d0 = 1'b0;   d1   =       "
+     "1'b1;\n"
+     "  end else if (oo) begin aa =    bb; cc      = dd;"
+     "         if (zz) zx = xz; else ba = ab;"
+     "    end   else  \n begin      vv   =  tt  ;  \n"
+     "   end   end "
+     "end \n  else if   (uu)\nbegin\n\na=b;if (aa)   b =    c;\n"
+     "\nelse    if    \n (bb) \n\nc        =d    ;\n\n\n\n\n    "
+     "      else         e\n\n   =   h;\n\n"
+     "end \n  else    \n  begin if(x)y=a;else\nbegin\n"
+     "\n\n\na=y; if (a)       b     = c;\n\n\n\nelse\n\n\nd=e;end \n"
+     "end\n"
+     "end endmodule\n",
+     "module m;\n"
+     "  initial begin\n"
+     "    if (a && b && c) begin\n"
+     "      d = 1'b1;\n"
+     "      if (e) begin\n"
+     "        f = ff;\n"
+     "      end else if (g) begin\n"
+     "        h = hh;\n"
+     "      end else if (i) begin\n"
+     "        j = (kk == ll) ? mm : gg;\n"
+     "      end else if (qq) begin\n"
+     "        if (xx || yy) begin\n"
+     "          d0 = 1'b0;\n"
+     "          d1 = 1'b1;\n"
+     "        end else if (oo) begin\n"
+     "          aa = bb;\n"
+     "          cc = dd;\n"
+     "          if (zz) zx = xz;\n"
+     "          else ba = ab;\n"
+     "        end else begin\n"
+     "          vv = tt;\n"
+     "        end\n"
+     "      end\n"
+     "    end else if (uu) begin\n\n"
+     "      a = b;\n"
+     "      if (aa) b = c;\n\n"
+     "      else if (bb) c = d;\n\n\n\n\n"
+     "      else e = h;\n\n"
+     "    end else begin\n"
+     "      if (x) y = a;\n"
+     "      else begin\n\n\n\n"
+     "        a = y;\n"
+     "        if (a) b = c;\n\n\n\n"
+     "        else d = e;\n"
+     "      end\n"
+     "    end\n"
+     "  end\n"
+     "endmodule\n"}};
+
+TEST(FormatterEndToEndTest, FormatElseStatements) {
+  // Use a fixed style.
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  for (const auto &test_case : kFormatterTestCasesElseStatements) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+TEST(FormatterEndToEndTest, ConstraintExpressions) {
+  static constexpr FormatterTestCase kTestCases[] = {
+      {"", ""},
+
+      // class members
+      {"class Foo; constraint if_c { if (zzzzzzzzzzzzzzzzzzzzz)"
+       "{ soft xxxxxxxxxxxxxxxxxxxxxx == yyyyyyyyyyyyyyyyyyy; } } endclass",
+       "class Foo;\n"
+       "  constraint if_c {\n"
+       "    if (zzzzzzzzzzzzzzzzzzzzz) {\n"
+       "      soft xxxxxxxxxxxxxxxxxxxxxx == yyyyyyyyyyyyyyyyyyy;\n"
+       "    }\n"
+       "  }\n"
+       "endclass\n"},
+
+      // constraints with if-constraint expressions
+      {"constraint xx { if (a) b; }\n", "constraint xx {if (a) b;}\n"},
+
+      {"constraint xx { if (a) {b;} }\n",
+       "constraint xx {\n"
+       "  if (a) {\n"
+       "    b;\n"
+       "  }\n"
+       "}\n"},
+
+      // multi item constraint
+      {"constraint yy { a == b;c==d;}",
+       "constraint yy {\n"
+       "  a == b;\n"
+       "  c == d;\n"
+       "}\n"},
+
+      // one-line constraints
+      {"constraint only_vec_instr_c {soft only_vec_instr == 0;}",
+       "constraint only_vec_instr_c {soft only_vec_instr == 0;}\n"},
+
+      {"constraint\nnum_trans_c\n\n\n{\n\n\nnum_trans inside{[800:1000]};}",
+       "constraint num_trans_c {num_trans inside {[800 : 1000]};}\n"},
+
+      // if-vs-concatenation expression
+      {"constraint c_operation{  if(fixed_operation_en){"
+       "aes_operation == fixed_operation"
+       ";}}",
+       "constraint c_operation {\n"
+       "  if (fixed_operation_en) {\n"
+       "    aes_operation == fixed_operation;\n"
+       "  }\n"
+       "}\n"},
+
+      {"constraint c_operation{  if(fixed_operation_en){"
+       "aes_operation == fixed_operation"
+       "};}",
+       "constraint c_operation {\n"
+       "  if (fixed_operation_en)\n"
+       "  {aes_operation == fixed_operation};\n"
+       "}\n"},
+
+      // concatenation expression
+      {"constraint c_iv {if (fixed_iv_en) {aes_iv == fixed_iv};}",
+       "constraint c_iv {\n"
+       "  if (fixed_iv_en)\n"
+       "  {aes_iv == fixed_iv};\n"
+       "}\n"},
+
+      // looooong test
+      {"constraint xx {"
+       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)"
+       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=="
+       "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"
+       "ccccccccccccccccccccccc==dddddddddddddddddddddd;}",
+       "constraint xx {\n"
+       "  if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
+       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == "
+       "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;\n"
+       "  ccccccccccccccccccccccc == dddddddddddddddddddddd;\n"
+       "}\n"},
+  };
+  FormatStyle style;
+  style.column_limit =
+      100;  // smaller column_limit forces expansion of constraint blocks
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.port_declarations_alignment = verible::AlignmentPolicy::kPreserve;
+  for (const auto &test_case : kTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    // Require these test cases to be valid.
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+static constexpr FormatterTestCase kFormatterTestCasesEnumDeclarations[] = {
+    // Inferring user intent: not too many spaces to be added: align.
+    {"typedef enum { kA=1, kAB=2, kABC=3} x;",
+     "typedef enum {\n"
+     "  kA   = 1,\n"
+     "  kAB  = 2,\n"
+     "  kABC = 3\n} x;\n"},
+
+    // Lots of spaces would've to be be added - keep flush
+    {"typedef enum { kA=1, kAB=2, kABCDEFGHIJKLMN=3} x;",
+     "typedef enum {\n"
+     "  kA = 1,\n"
+     "  kAB = 2,\n"
+     "  kABCDEFGHIJKLMN = 3\n} x;\n"},
+
+    // Source spaces indicate alignment wish.
+    {"typedef enum { kA     =1, kAB=2, kABCDEFGHIJKLMN=3} x;",
+     "typedef enum {\n"
+     "  kA              = 1,\n"
+     "  kAB             = 2,\n"
+     "  kABCDEFGHIJKLMN = 3\n} x;\n"},
+
+    // An empty line groups into several sections, to be aligned independently
+    {"typedef enum { kA=1, kAB=2, \n\n kABC=3} x;",
+     "typedef enum {\n"
+     "  kA  = 1,\n"
+     "  kAB = 2,\n"
+     "\n"
+     "  kABC = 3\n} x;\n"},
+
+    // Lines with comments don't interrupt alignment
+    {"typedef enum { kA=1,\n"
+     "// hello world\n"
+     "kAB=2, kABC=3} x;",
+     "typedef enum {\n"
+     "  kA   = 1,\n"
+     "  // hello world\n"
+     "  kAB  = 2,\n"
+     "  kABC = 3\n} x;\n"},
+
+    // Generally, comment locations are preserved, and full line comments
+    // indented to enum name level.
+    {"typedef enum { kA=1,// value kA\n"
+     "// hello world\n"
+     "kAB=2,// value kAB\n"
+     "kABC=3// value kABC\n"
+     "} x;",
+     "typedef enum {\n"
+     "  kA   = 1,  // value kA\n"
+     "  // hello world\n"
+     "  kAB  = 2,  // value kAB\n"
+     "  kABC = 3   // value kABC"
+     "\n} x;\n"},
+
+    {"typedef enum { kA=1,// value kA\n"
+     "kAB=2,\n"
+     "kABC=3// value kABC\n"
+     "} x;",
+     "typedef enum {\n"
+     "  kA   = 1,  // value kA\n"
+     "  kAB  = 2,\n"
+     "  kABC = 3   // value kABC"
+     "\n} x;\n"},
+
+    // Numeric constants are currently flushed left, but maybe todo
+    // align right in the future ?
+    {"typedef enum { kA=1, kAB=10, kABC=100} x;",
+     "typedef enum {\n"
+     "  kA   = 1,\n"
+     "  kAB  = 10,\n"
+     "  kABC = 100\n} x;\n"},
+};
+
+TEST(FormatterEndToEndTest, FormatAlignEnumDeclarations) {
+  // Use a fixed style.
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.enum_assignment_statement_alignment = AlignmentPolicy::kInferUserIntent;
+  for (const auto &test_case : kFormatterTestCasesEnumDeclarations) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+TEST(FormatterEndToEndTest, DiagnosticShowFullTree) {
+  // Use a fixed style.
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  for (const auto &test_case : kDiagnosticFormatterTestCases) {
+    std::ostringstream stream, debug_stream;
+    ExecutionControl control;
+    control.stream = &debug_stream;
+    control.show_token_partition_tree = true;
+    const auto status = FormatVerilog(test_case.input, "<filename>", style,
+                                      stream, kEnableAllLines, control);
+    EXPECT_EQ(status.code(), StatusCode::kCancelled);
+    EXPECT_TRUE(
+        absl::StartsWith(debug_stream.str(), "Full token partition tree"));
+  }
+}
+
+TEST(FormatterEndToEndTest, DiagnosticLargestPartitions) {
+  // Use a fixed style.
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  for (const auto &test_case : kDiagnosticFormatterTestCases) {
+    std::ostringstream stream, debug_stream;
+    ExecutionControl control;
+    control.stream = &debug_stream;
+    control.show_largest_token_partitions = 2;
+    const auto status = FormatVerilog(test_case.input, "<filename>", style,
+                                      stream, kEnableAllLines, control);
+    EXPECT_EQ(status.code(), StatusCode::kCancelled);
+    EXPECT_TRUE(absl::StartsWith(debug_stream.str(), "Showing the "))
+        << "got: " << debug_stream.str();
+  }
+}
+
+TEST(FormatterEndToEndTest, DiagnosticEquallyOptimalWrappings) {
+  // Use a fixed style.
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  for (const auto &test_case : kDiagnosticFormatterTestCases) {
+    std::ostringstream stream, debug_stream;
+    ExecutionControl control;
+    control.stream = &debug_stream;
+    control.show_equally_optimal_wrappings = true;
+    const auto status = FormatVerilog(test_case.input, "<filename>", style,
+                                      stream, kEnableAllLines, control);
+    EXPECT_OK(status) << status.message();
+    if (!debug_stream.str().empty()) {
+      EXPECT_TRUE(absl::StartsWith(debug_stream.str(), "Showing the "))
+          << "got: " << debug_stream.str();
+      // Cannot guarantee among unit tests that there will be >1 solution.
+    }
+  }
+}
+
+// Test that hitting search space limit results in correct error status.
+TEST(FormatterEndToEndTest, UnfinishedLineWrapSearching) {
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+
+  const std::string_view code("parameter int x = 1+1;\n");
+
+  std::ostringstream stream, debug_stream;
+  ExecutionControl control;
+  control.max_search_states = 2;  // Cause search to abort early.
+  control.stream = &debug_stream;
+  const auto status = FormatVerilog(code, "<filename>", style, stream,
+                                    kEnableAllLines, control);
+  EXPECT_EQ(status.code(), StatusCode::kResourceExhausted);
+  EXPECT_TRUE(absl::StartsWith(status.message(), "***"));
+}
+
+static constexpr FormatterTestCase kOnelineFormatBaselineTestCases[] = {
+    // Reference - following test cases should not be affected by the switch
+    {// Minimal useful case
+     "covergroup c @ (posedge clk); coverpoint a; endgroup\n",
+     "covergroup c @(posedge clk);\n"
+     "  coverpoint a;\n"
+     "endgroup\n"},
+    {// Multiple coverpoints
+     "covergroup foo @(posedge clk); coverpoint a; coverpoint b; "
+     "coverpoint c; coverpoint d; endgroup\n",
+     "covergroup foo @(posedge clk);\n"
+     "  coverpoint a;\n"
+     "  coverpoint b;\n"
+     "  coverpoint c;\n"
+     "  coverpoint d;\n"
+     "endgroup\n"},
+    {// Multiple bins
+     "covergroup memory @ (posedge ce); address  :coverpoint addr {"
+     "bins low={LOW}; bins high={HIGH};} endgroup\n",
+     "covergroup memory @(posedge ce);\n"
+     "  address: coverpoint addr {\n"
+     "    bins low = {LOW};\n"
+     "    bins high = {HIGH};\n"
+     "  }\n"
+     "endgroup\n"},
+    {// Multiple bins with multiple elements
+     "covergroup memory @ (posedge ce); address  :coverpoint addr {"
+     "bins low={0,127}; bins high={128,255};} endgroup\n",
+     "covergroup memory @(posedge ce);\n"
+     "  address: coverpoint addr {\n"
+     "    bins low = {0, 127};\n"
+     "    bins high = {128, 255};\n"
+     "  }\n"
+     "endgroup\n"},
+};
+
+// Tests that constructs that could be formatted as one-liners are formatted
+// correctly. This is the baseline test with default style, test cases should
+// not be affected by the setting.
+TEST(FormatterEndToEndTest, OnelineFormatBaselineTest) {
+  // Use a fixed style.
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.expand_coverpoints = false;
+  for (const auto &test_case : kOnelineFormatBaselineTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    // Require these test cases to be valid.
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+  // Test again with the switch, should not affect formatting
+  style.expand_coverpoints = true;
+  for (const auto &test_case : kOnelineFormatBaselineTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    // Require these test cases to be valid.
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+// Following two test sets are affected by the expand_coverponits switch
+// They should contain corresponding test cases
+static constexpr FormatterTestCase kOnelineFormatReferenceTestCases[] = {
+    {// Coverpoint that could fit on one line
+     "covergroup memory @ (posedge ce); a :coverpoint d {"
+     "bins l={0};} endgroup\n",
+     "covergroup memory @(posedge ce);\n"
+     "  a: coverpoint d {bins l = {0};}\n"
+     "endgroup\n"},
+    {// Fit with a reference
+     "covergroup memory @ (posedge ce); a :coverpoint d {"
+     "bins l={LOW};} endgroup\n",
+     "covergroup memory @(posedge ce);\n"
+     "  a: coverpoint d {bins l = {LOW};}\n"
+     "endgroup\n"},
+    {// Fit with multiple elements
+     "covergroup memory @ (posedge ce); a :coverpoint d {"
+     "bins l={0,8};} endgroup\n",
+     "covergroup memory @(posedge ce);\n"
+     "  a: coverpoint d {bins l = {0, 8};}\n"
+     "endgroup\n"},
+};
+
+static constexpr FormatterTestCase kOnelineFormatExpandTestCases[] = {
+    {// Coverpoint that could fit on one line
+     "covergroup memory @ (posedge ce); a :coverpoint d {"
+     "bins l={0};} endgroup\n",
+     "covergroup memory @(posedge ce);\n"
+     "  a: coverpoint d {\n"
+     "    bins l = {0};\n"
+     "  }\n"
+     "endgroup\n"},
+    {// Fit with a reference
+     "covergroup memory @ (posedge ce); a :coverpoint d {"
+     "bins l={LOW};} endgroup\n",
+     "covergroup memory @(posedge ce);\n"
+     "  a: coverpoint d {\n"
+     "    bins l = {LOW};\n"
+     "  }\n"
+     "endgroup\n"},
+    {// Fit with multiple elements
+     "covergroup memory @ (posedge ce); a :coverpoint d {"
+     "bins l={0,8};} endgroup\n",
+     "covergroup memory @(posedge ce);\n"
+     "  a: coverpoint d {\n"
+     "    bins l = {0, 8};\n"
+     "  }\n"
+     "endgroup\n"},
+};
+
+TEST(FormatterEndToEndTest, OnelineFormatReferenceTest) {
+  // Use a fixed style.
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.expand_coverpoints = false;
+
+  for (const auto &test_case : kOnelineFormatReferenceTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    // Require these test cases to be valid.
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+// Tests that constructs that could be formatted as one-liners are expanded
+// correctly. This is the baseline test with default style
+TEST(FormatterEndToEndTest, OnelineFormatExpandTest) {
+  // Use a fixed style.
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.expand_coverpoints = true;
+
+  for (const auto &test_case : kOnelineFormatExpandTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    // Require these test cases to be valid.
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+struct DimensionsAlignmentTestCase {
+  std::string_view input;
+  std::string_view expected[4];
+};
+
+static constexpr DimensionsAlignmentTestCase
+    kPortDeclarationDimensionsAlignmentTestCases[] = {
+        {"import \"DPI-C\" context function void func(\n"
+         "input bit foo,\n"
+         "input bit [2] foobar,\n"
+         "input bit [24:16] bar,\n"
+         "input bit [2:0][31:0] baz,\n"
+         "input bit [4][24:0][16:0] foobarbaz[],\n"
+         "input bit [FOOBAZ][31:24] qux[16],\n"
+         "input bit [16] quux[8:2][16][32],\n"
+         "output bit [2:0][2:0][2:0] quuz[8][16:12]\n"
+         ");\n",
+         {
+             "import \"DPI-C\" context function void func(\n"
+             "  input  bit                       foo,\n"
+             "  input  bit [     2]              foobar,\n"
+             "  input  bit [ 24:16]              bar,\n"
+             "  input  bit [   2:0][ 31:0]       baz,\n"
+             "  input  bit [     4][ 24:0][16:0] foobarbaz[   ],\n"
+             "  input  bit [FOOBAZ][31:24]       qux      [ 16],\n"
+             "  input  bit [    16]              quux     [8:2][   16][32],\n"
+             "  output bit [   2:0][  2:0][ 2:0] quuz     [  8][16:12]\n"
+             ");\n",
+             "import \"DPI-C\" context function void func(\n"
+             "  input  bit                       foo,\n"
+             "  input  bit [     2]              foobar,\n"
+             "  input  bit [ 24:16]              bar,\n"
+             "  input  bit [   2:0][ 31:0]       baz,\n"
+             "  input  bit [     4][ 24:0][16:0] foobarbaz         [     ],\n"
+             "  input  bit [FOOBAZ][31:24]       qux               [   16],\n"
+             "  input  bit [    16]              quux     [8:2][16][   32],\n"
+             "  output bit [   2:0][  2:0][ 2:0] quuz          [ 8][16:12]\n"
+             ");\n",
+             "import \"DPI-C\" context function void func(\n"
+             "  input  bit                      foo,\n"
+             "  input  bit              [    2] foobar,\n"
+             "  input  bit              [24:16] bar,\n"
+             "  input  bit      [   2:0][ 31:0] baz,\n"
+             "  input  bit [  4][  24:0][ 16:0] foobarbaz[   ],\n"
+             "  input  bit      [FOOBAZ][31:24] qux      [ 16],\n"
+             "  input  bit              [   16] quux     [8:2][   16][32],\n"
+             "  output bit [2:0][   2:0][  2:0] quuz     [  8][16:12]\n"
+             ");\n",
+             "import \"DPI-C\" context function void func(\n"
+             "  input  bit                      foo,\n"
+             "  input  bit              [    2] foobar,\n"
+             "  input  bit              [24:16] bar,\n"
+             "  input  bit      [   2:0][ 31:0] baz,\n"
+             "  input  bit [  4][  24:0][ 16:0] foobarbaz         [     ],\n"
+             "  input  bit      [FOOBAZ][31:24] qux               [   16],\n"
+             "  input  bit              [   16] quux     [8:2][16][   32],\n"
+             "  output bit [2:0][   2:0][  2:0] quuz          [ 8][16:12]\n"
+             ");\n",
+         }},
+        {"module m(\n"
+         "output bit [2:0][2:0][2:0] quuz[8][16:12],\n"
+         "input bit [16] quux[8:2][16][32],\n"
+         "input bit [FOOBAZ][31:24] qux[16],\n"
+         "input bit [4][24:0][16:0] foobaz[],\n"
+         "input bit [2:0][31:0] baz,\n"
+         "input bit [24:16] bar,\n"
+         "input bit [2] foobar,\n"
+         "input bit foo\n"
+         "); endmodule:m\n",
+         {
+             "module m (\n"
+             "    output bit [   2:0][  2:0][ 2:0] quuz  [  8][16:12],\n"
+             "    input  bit [    16]              quux  [8:2][   16][32],\n"
+             "    input  bit [FOOBAZ][31:24]       qux   [ 16],\n"
+             "    input  bit [     4][ 24:0][16:0] foobaz[   ],\n"
+             "    input  bit [   2:0][ 31:0]       baz,\n"
+             "    input  bit [ 24:16]              bar,\n"
+             "    input  bit [     2]              foobar,\n"
+             "    input  bit                       foo\n"
+             ");\n"
+             "endmodule : m\n",
+             "module m (\n"
+             "    output bit [   2:0][  2:0][ 2:0] quuz       [ 8][16:12],\n"
+             "    input  bit [    16]              quux  [8:2][16][   32],\n"
+             "    input  bit [FOOBAZ][31:24]       qux            [   16],\n"
+             "    input  bit [     4][ 24:0][16:0] foobaz         [     ],\n"
+             "    input  bit [   2:0][ 31:0]       baz,\n"
+             "    input  bit [ 24:16]              bar,\n"
+             "    input  bit [     2]              foobar,\n"
+             "    input  bit                       foo\n"
+             ");\n"
+             "endmodule : m\n",
+             "module m (\n"
+             "    output bit [2:0][   2:0][  2:0] quuz  [  8][16:12],\n"
+             "    input  bit              [   16] quux  [8:2][   16][32],\n"
+             "    input  bit      [FOOBAZ][31:24] qux   [ 16],\n"
+             "    input  bit [  4][  24:0][ 16:0] foobaz[   ],\n"
+             "    input  bit      [   2:0][ 31:0] baz,\n"
+             "    input  bit              [24:16] bar,\n"
+             "    input  bit              [    2] foobar,\n"
+             "    input  bit                      foo\n"
+             ");\n"
+             "endmodule : m\n",
+             "module m (\n"
+             "    output bit [2:0][   2:0][  2:0] quuz       [ 8][16:12],\n"
+             "    input  bit              [   16] quux  [8:2][16][   32],\n"
+             "    input  bit      [FOOBAZ][31:24] qux            [   16],\n"
+             "    input  bit [  4][  24:0][ 16:0] foobaz         [     ],\n"
+             "    input  bit      [   2:0][ 31:0] baz,\n"
+             "    input  bit              [24:16] bar,\n"
+             "    input  bit              [    2] foobar,\n"
+             "    input  bit                      foo\n"
+             ");\n"
+             "endmodule : m\n",
+         }},
+};
+
+TEST(FormatterEndToEndTest, PortDeclarationDimensionsAlignmentTest) {
+  FormatStyle style;
+  style.column_limit = 64;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+
+  // All combinations of port_declaration_right_align_{un,}packed_dimensions
+  static const bool right_align_combinations[][2] = {
+      {false, false}, {false, true}, {true, false}, {true, true}};
+
+  for (const auto &test_case : kPortDeclarationDimensionsAlignmentTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    size_t expected_index = 0;
+    for (const auto &right_align : right_align_combinations) {
+      VLOG(1) << "style variant:\n"
+              << "port_declarations_right_align_packed_dimensions: "
+              << right_align[0] << "\n"
+              << "port_declarations_right_align_unpacked_dimensions: "
+              << right_align[1] << "\n";
+      style.port_declarations_right_align_packed_dimensions = right_align[0];
+      style.port_declarations_right_align_unpacked_dimensions = right_align[1];
+
+      std::ostringstream stream;
+
+      const auto status =
+          FormatVerilog(test_case.input, "<filename>", style, stream);
+      // Require these test cases to be valid.
+      EXPECT_OK(status) << status.message();
+      EXPECT_EQ(stream.str(), test_case.expected[expected_index++])
+          << "code:\n"
+          << test_case.input;
+    }
+  }
+}
+
+// TODO(fangism): directed tests using style variations
+
+static constexpr FormatterTestCase kNestedFunctionsTestCases40ColumnsLimit[] = {
+    {"module foo;"
+     "`uvm_info(`gfn, $sformatf(\n"
+     "\"\\n  base_vseq: generate %0d pulse in channel %0d\", cfg.num_pulses, "
+     "i), UVM_DEBUG)\n"
+     "endmodule",
+     "module foo;\n"
+     "  `uvm_info(\n"
+     "      `gfn,\n"
+     "      $sformatf(\n"
+     "          \"\\n  base_vseq: generate %0d pulse in channel %0d\",\n"
+     "          cfg.num_pulses, i), UVM_DEBUG)\n"
+     "endmodule\n"},
+    {"module foo;`uvm_info(`gfn, $sformatf("
+     "\"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\","
+     "cfg.convert2string()), UVM_LOW)\n"
+     "endmodule",
+     "module foo;\n"
+     "  `uvm_info(\n"
+     "      `gfn,\n"
+     "      $sformatf(\n"
+     "          \"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\",\n"
+     "          cfg.convert2string()),\n"
+     "      UVM_LOW)\n"  // FIXME: Wrapped by SearchLineWraps
+     "endmodule\n"},
+};
+
+TEST(FormatterEndToEndTest, FormatNestedFunctionsTestCases40ColumnsLimit) {
+  // Use a fixed style.
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+
+  for (const auto &test_case : kNestedFunctionsTestCases40ColumnsLimit) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    // Require these test cases to be valid.
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+static constexpr FormatterTestCase kNestedFunctionsTestCases60ColumnsLimit[] = {
+    {"module foo;"
+     "`uvm_info(`gfn, $sformatf(\n"
+     "\"\\n  base_vseq: generate %0d pulse in channel %0d\", cfg.num_pulses, "
+     "i), UVM_DEBUG)\n"
+     "endmodule",
+     "module foo;\n"
+     "  `uvm_info(\n"
+     "      `gfn,\n"
+     "      $sformatf(\n"
+     "          \"\\n  base_vseq: generate %0d pulse in channel %0d\",\n"
+     "          cfg.num_pulses, i), UVM_DEBUG)\n"
+     "endmodule\n"},
+    {"module foo;`uvm_info(`gfn, $sformatf("
+     "\"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\","
+     "cfg.convert2string()), UVM_LOW)\n"
+     "endmodule",
+     "module foo;\n"
+     "  `uvm_info(\n"
+     "      `gfn,\n"
+     "      $sformatf(\n"
+     "          \"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\",\n"
+     "          cfg.convert2string()), UVM_LOW)\n"
+     "endmodule\n"},
+};
+
+TEST(FormatterEndToEndTest, FormatNestedFunctionsTestCases60ColumnsLimit) {
+  // Use a fixed style.
+  FormatStyle style;
+  style.column_limit = 60;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+
+  for (const auto &test_case : kNestedFunctionsTestCases60ColumnsLimit) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    // Require these test cases to be valid.
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+static constexpr FormatterTestCase kNestedFunctionsTestCases80ColumnsLimit[] = {
+    {"module foo;"
+     "`uvm_info(`gfn, $sformatf(\n"
+     "\"\\n  base_vseq: generate %0d pulse in channel %0d\", cfg.num_pulses, "
+     "i), UVM_DEBUG)\n"
+     "endmodule",
+     "module foo;\n"
+     "  `uvm_info(`gfn, $sformatf(\"\\n  base_vseq: generate %0d pulse in "
+     "channel %0d\",\n"
+     "                            cfg.num_pulses, i), UVM_DEBUG)\n"
+     "endmodule\n"},
+    {"module foo;`uvm_info(`gfn, $sformatf("
+     "\"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\","
+     "cfg.convert2string()), UVM_LOW)\n"
+     "endmodule",
+     "module foo;\n"
+     "  `uvm_info(`gfn, $sformatf(\n"
+     "                      \"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE "
+     "|----\\n %s\",\n"
+     "                      cfg.convert2string()), UVM_LOW)\nendmodule\n"},
+    {"module x;"
+     "`uvm_fatal(`gfn, $sformatf("
+     "\"The data 0x%0h written to the signature address is formatted "
+     "incorrectly.\","
+     "signature_data))\n"
+     "endmodule",
+     "module x;\n"
+     "  `uvm_fatal(\n"
+     "      `gfn,\n"
+     "      $sformatf(\n"
+     "          \"The data 0x%0h written to the signature address is formatted "
+     "incorrectly.\",\n"
+     "          signature_data))\n"
+     "endmodule\n"},
+};
+
+TEST(FormatterEndToEndTest, FormatNestedFunctionsTestCases80ColumnsLimit) {
+  // Use a fixed style.
+  FormatStyle style;
+  style.column_limit = 80;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+
+  for (const auto &test_case : kNestedFunctionsTestCases80ColumnsLimit) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    // Require these test cases to be valid.
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+static constexpr FormatterTestCase kNestedFunctionsTestCases100ColumnsLimit[] =
+    {
+        {"module foo;"
+         "`uvm_info(`gfn, $sformatf(\n"
+         "\"\\n  base_vseq: generate %0d pulse in channel %0d\", "
+         "cfg.num_pulses, i), UVM_DEBUG)\n"
+         "endmodule",
+         "module foo;\n"
+         "  `uvm_info(`gfn, $sformatf(\"\\n  base_vseq: generate %0d pulse in "
+         "channel %0d\", cfg.num_pulses, i),\n"
+         "            UVM_DEBUG)\n"
+         "endmodule\n"},
+        {"module foo;`uvm_info(`gfn, $sformatf("
+         "\"\\n\\n\\t ----| STARTING AES MAIN SEQUENCE |----\\n %s\","
+         "cfg.convert2string()), UVM_LOW)\n"
+         "endmodule",
+         "module foo;\n"
+         "  `uvm_info(`gfn, $sformatf(\"\\n\\n\\t ----| STARTING AES MAIN "
+         "SEQUENCE |----\\n %s\",\n"
+         "                            cfg.convert2string()), UVM_LOW)\n"
+         "endmodule\n"},
+        {"module x;"
+         "`uvm_fatal(`gfn, $sformatf("
+         "\"The data 0x%0h written to the signature address is formatted "
+         "incorrectly.\","
+         "signature_data))\n"
+         "endmodule",
+         "module x;\n"
+         "  `uvm_fatal(`gfn, $sformatf(\n"
+         "                       \"The data 0x%0h written to the signature "
+         "address is formatted incorrectly.\",\n"
+         "                       signature_data))\n"
+         "endmodule\n"},
+        {// nested modules, three-levels
+         "module x; module y; module z;"
+         "`uvm_fatal(`gfn, $sformatf("
+         "\"The data 0x%0h written to the signature address is formatted "
+         "incorrectly.\","
+         "signature_data))\n"
+         "endmodule endmodule endmodule",
+         "module x;\n"
+         "  module y;\n"
+         "    module z;\n"
+         "      `uvm_fatal(`gfn,\n"
+         "                 $sformatf(\n"
+         "                     \"The data 0x%0h written to the signature "
+         "address is formatted incorrectly.\",\n"
+         "                     signature_data))\n"
+         "    endmodule\n"
+         "  endmodule\n"
+         "endmodule\n"},
+};
+
+TEST(FormatterEndToEndTest, FormatNestedFunctionsTestCases100ColumnsLimit) {
+  // Use a fixed style.
+  FormatStyle style;
+  style.column_limit = 100;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+
+  for (const auto &test_case : kNestedFunctionsTestCases100ColumnsLimit) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    // Require these test cases to be valid.
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+static constexpr FormatterTestCase noCompactIndexingAndSelectionsTestCases[]{
+    {"module m1 ();\n"
+     "  assign s1 = msg[1 : 2 + 3];\n"
+     "  assign s2 = {<<8{msg[1 : 2 + 3]}};\n"
+     "endmodule\n",
+     "module m1 ();\n"
+     "  assign s1 = msg[1 : 2 + 3];\n"
+     "  assign s2 = {<< 8{msg[1 : 2 + 3]}};\n"
+     "endmodule\n"}};
+
+TEST(FormatterEndToEndTest, compactIndexingAndSelectionsTestCases) {
+  // Use a fixed style.
+  FormatStyle style;
+  style.column_limit = 100;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.compact_indexing_and_selections = false;
+
+  for (const auto &test_case : noCompactIndexingAndSelectionsTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    // Require these test cases to be valid.
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+static constexpr FormatterTestCase
+    kSpaceBeforeHashInUnqualifiedTypedefTestCases[] = {
+        // unqualified parameterized type keeps a space before '#'
+        {"typedef dv_base_env_cov #(.CFG_T(tl_agent_env_cfg)) "
+         "tl_agent_env_cov;\n",
+         "typedef dv_base_env_cov #(\n"
+         "    .CFG_T(tl_agent_env_cfg)\n"
+         ") tl_agent_env_cov;\n"},
+        // ... and is inserted when absent
+        {"typedef dv_base_env_cov#(.CFG_T(tl_agent_env_cfg)) "
+         "tl_agent_env_cov;\n",
+         "typedef dv_base_env_cov #(\n"
+         "    .CFG_T(tl_agent_env_cfg)\n"
+         ") tl_agent_env_cov;\n"},
+        // single short parameter stays on one line
+        {"typedef my_class #(.P(P)) my_class_t;\n",
+         "typedef my_class #(.P(P)) my_class_t;\n"},
+        // package-qualified types are unaffected (no space before '#')
+        {"typedef foo_pkg::baz_t#(.L(L), .W(W)) bar_t;\n",
+         "typedef foo_pkg::baz_t#(\n"
+         "    .L(L),\n"
+         "    .W(W)\n"
+         ") bar_t;\n"},
+};
+
+TEST(FormatterEndToEndTest, SpaceBeforeHashInUnqualifiedTypedefTestCases) {
+  // Use a fixed style.
+  FormatStyle style;
+  style.column_limit = 40;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+  style.class_parameter_space = true;
+
+  for (const auto &test_case : kSpaceBeforeHashInUnqualifiedTypedefTestCases) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    // Require these test cases to be valid.
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+static constexpr FormatterTestCase kFunctionCallsWithComments[] = {
+    {// no comments
+     "module foo;\n"
+     "`uvm_info(`gfn, \"xx\",\n"
+     "cfg.num_pulses, i, UVM_DEBUG)\n"
+     "endmodule",
+     "module foo;\n"
+     "  `uvm_info(`gfn, \"xx\", cfg.num_pulses, i, UVM_DEBUG)\n"
+     "endmodule\n"},
+    {// one comment
+     "module foo;\n"
+     "`uvm_info(`gfn, \"xx\",  // yy\n"
+     "cfg.num_pulses, i, UVM_DEBUG)\n"
+     "endmodule",
+     "module foo;\n"
+     "  `uvm_info(`gfn, \"xx\",  // yy\n"
+     "            cfg.num_pulses, i, UVM_DEBUG)\n"
+     "endmodule\n"},
+    {// two comments
+     "module foo;\n"
+     "`uvm_info(`gfn, \"xx\",  "
+     "    cfg.num_pulses, // xx\n"
+     " i, UVM_DEBUG)// uuu\n"
+     "endmodule",
+     "module foo;\n"
+     "  `uvm_info(`gfn, \"xx\", cfg.num_pulses,  // xx\n"
+     "            i, UVM_DEBUG)  // uuu\n"
+     "endmodule\n"},
+
+    {// nested function calls with comments
+     "module foo;"
+     "`uvm_info(`gfn, $sformatf(\"\\n  base_vseq: generate %0d"
+     " pulse in channel %0d\", cfg.num_pulses, // comment\n"
+     " i), UVM_DEBUG)\n"
+     "endmodule",
+     "module foo;\n"
+     "  `uvm_info(`gfn, $sformatf(\"\\n  base_vseq: generate %0d pulse in "
+     "channel %0d\",\n"
+     "                            cfg.num_pulses,  // comment\n"
+     "                            i), UVM_DEBUG)\n"
+     "endmodule\n"},
+};
+
+TEST(FormatterEndToEndTest, FunctionCallsWithComments) {
+  // Use a fixed style.
+  FormatStyle style;
+  style.column_limit = 100;
+  style.indentation_spaces = 2;
+  style.wrap_spaces = 4;
+
+  for (const auto &test_case : kFunctionCallsWithComments) {
+    VLOG(1) << "code-to-format:\n" << test_case.input << "<EOF>";
+    std::ostringstream stream;
+    const auto status =
+        FormatVerilog(test_case.input, "<filename>", style, stream);
+    // Require these test cases to be valid.
+    EXPECT_OK(status) << status.message();
+    EXPECT_EQ(stream.str(), test_case.expected) << "code:\n" << test_case.input;
+  }
+}
+
+// Extracts the first non-whitespace token and prepends it with number of
+// of newlines seen in front of it. So "\n \n\n  foo" -> "3foo"
+std::string NLCountAndfirstWord(std::string_view str) {
+  std::string result;
+  int newline_count = 0;
+  std::string_view::const_iterator begin = str.begin();
+  for (/**/; begin < str.end(); ++begin) {
+    if (!isspace(*begin)) break;
+    newline_count += (*begin == '\n');
+  }
+  // Emit number of newlines seen up to first token.
+  result.append(1,
+                static_cast<char>(newline_count + '0'));  // single digit itoa
+  std::string_view::const_iterator end_str = begin;
+  for (/**/; end_str < str.end() && !isspace(*end_str); ++end_str) {
+  }
+  result.append(begin, end_str);
+  return result;
+}
+
+// Similar to NLCountAndfirstWord() but looking at the last token and trailing
+// newlines.
+std::string lastWordAndNLCount(std::string_view str) {
+  std::string result;
+  int newline_count = 0;
+  std::string_view::const_iterator back = str.end() - 1;
+  for (/**/; back >= str.begin(); --back) {
+    if (!isspace(*back)) break;
+    newline_count += (*back == '\n');
+  }
+
+  std::string_view::const_iterator start_str = back;
+  for (/**/; start_str >= str.begin() && !isspace(*start_str); --start_str) {
+  }
+  result.append(&*(start_str + 1), back - start_str);
+  // Emit number of newlines seen following last token.
+  result.append(1,
+                static_cast<char>(newline_count + '0'));  // single digit itoa
+  return result;
+}
+
+// Testing the tester...
+TEST(FormatterTestInternal, TokenExtractorAndLineCounterTestFixtureTest) {
+  std::string_view str = "\n \nhello world \n \n";
+  ASSERT_EQ(NLCountAndfirstWord(str), "2hello");
+  ASSERT_EQ(NLCountAndfirstWord(str.substr(1)), "1hello");
+  ASSERT_EQ(NLCountAndfirstWord(str.substr(3)), "0hello");
+
+  ASSERT_EQ(lastWordAndNLCount(str), "world2");
+  ASSERT_EQ(lastWordAndNLCount(str.substr(0, str.length() - 1)), "world1");
+  ASSERT_EQ(lastWordAndNLCount(str.substr(0, str.length() - 2)), "world1");
+  ASSERT_EQ(lastWordAndNLCount(str.substr(0, str.length() - 3)), "world0");
+
+  str = "aworld \n \n";  // Make sure to not overshoot begin.
+  ASSERT_EQ(lastWordAndNLCount(str.substr(1)), "world2");
+}
+
+TEST(FormatterEndToEndTest, RangeFormattingOnlyEmittingRelevantLines) {
+  // Including some empty lines to make sure the formatting
+  static constexpr std::string_view unformatted =
+      R"(     module foo (// non-port comment
+
+     // some comment
+
+  input  logic  a, input logic  b,input bit [2]
+foobar, input    bit [4] foobaz,
+    input bit [2]    quux
+
+
+        ); endmodule
+)";
+
+  std::vector<std::string_view> lines = absl::StrSplit(unformatted, '\n');
+  const int kLineCount = lines.size();
+
+  FormatStyle style;
+
+  // Go through all possible sub-ranges, format these, and compare that the
+  // output of the range output is contained inside the full format given the
+  // same sub-range.
+  for (int start_line = 0; start_line < kLineCount; ++start_line) {
+    for (int end_line = start_line; end_line < kLineCount; ++end_line) {
+      // Line numbers are 1-index based.
+      const verible::Interval<int> range = {start_line + 1, end_line + 1};
+
+      // Format full text for reference
+      std::ostringstream full_format;
+      absl::Status status =
+          FormatVerilog(unformatted, "<filename>", style, full_format, {range});
+      EXPECT_OK(status) << status.message();
+
+      // To test: range formatted.
+      std::string range_formatted;
+      status = FormatVerilogRange(unformatted, "<filename>", style,
+                                  &range_formatted, range);
+      EXPECT_OK(status) << status.message();
+      if (range.empty()) {  // Nothing to format: expect empty output.
+        EXPECT_TRUE(range_formatted.empty());
+        continue;
+      }
+
+      // Area we cover in the input (include the final newline);
+      const auto source_begin = lines[start_line].begin();
+      const auto source_end = lines[end_line - 1].end() + 1;  // include \n
+      const std::string_view range_unformatted(&*source_begin,
+                                               source_end - source_begin);
+
+      // To compare that we indeed formatted the requested reqgion, we make
+      // sure that the first and last token (simplified: non-whitespace word)
+      // in the input of the range to be formatted is
+      // exactly the first and last token that comes out of the range
+      // formatted snippet.
+      //
+      // While the whitespace might be different at the beginning and end
+      // due to formatting, the number of _newlines_ at the beginning and end
+      // should be the same, so we include the newline count in the comparison.
+
+      EXPECT_EQ(NLCountAndfirstWord(range_unformatted),
+                NLCountAndfirstWord(range_formatted))
+          << "'" << range_unformatted << "' vs. '" << range_formatted << "'";
+
+      // ... same for the last word.
+      EXPECT_EQ(lastWordAndNLCount(range_unformatted),
+                lastWordAndNLCount(range_formatted))
+          << "'" << range_unformatted << "' vs. '" << range_formatted << "'";
+
+      EXPECT_LE(range_formatted.length(), full_format.str().length());
+      EXPECT_THAT(full_format.str(), HasSubstr(range_formatted));
+    }
+  }
+}
+
+// Creates a string_view spanning a whole string literal.
+// Works correctly with strings containing null bytes.
+template <std::size_t N>
+constexpr std::string_view string_view_from_literal(const char (&s)[N]) {
+  return std::string_view(s, N - 1);
+}
+
+// The following regressions have been found by a fuzzer, so the input might
+// look a bit 'funny'. Nevertheless, they expose real bugs in the code.
+
+[[maybe_unused]] void TestForNonCrash(std::string_view input) {
+  using verible::EscapeString;
+  FormatStyle style;
+  std::ostringstream stream;
+  const auto status = FormatVerilog(input, "<filename>", style, stream);
+  // If we are here, we did at least not crash, which is all we desire for
+  // the fuzzer tests.
+  // Other issues that are reported correctly (probably due to strange inputs
+  // generated by the fuzzer) are ok, so we just log them here FYI.
+  if (!status.ok()) {
+    LOG(INFO) << "No crash, but format failed for other reason: "
+              << status.message() << "\nEscaped input: \""
+              << EscapeString(input) << "\"";
+  }
+}
+
+#if 0
+// https://github.com/chipsalliance/verible/issues/1381
+TEST(FormatterEndToEndTest, FuzzingRegression_1381) {
+  TestForNonCrash(string_view_from_literal("P#(\0\0//\0//\0,);"));
+  TestForNonCrash(string_view_from_literal("P#(\0\0//\0,,//\0,"));
+}
+#endif
+
+// https://github.com/chipsalliance/verible/issues/1384
+TEST(FormatterEndToEndTest, FuzzingRegression_UseAfterFree_1384) {
+  TestForNonCrash("`c(`c(//););");
+}
+
+// https://github.com/chipsalliance/verible/issues/1386
+TEST(FormatterEndToEndTest, FuzzingRegressionHierachyInvariant) {
+  // Original sample input from fuzzer
+  TestForNonCrash(string_view_from_literal("`c(`c()\0;);"));
+  // Lexically correct variant (`\0` -> `\n`)
+  TestForNonCrash(string_view_from_literal("`c(`c()\n;);"));
+  // Lexically correct variant (`\0` removed)
+  TestForNonCrash(string_view_from_literal("`c(`c(););"));
+}
+
+// Possibly same ? https://github.com/chipsalliance/verible/issues/1386
+TEST(FormatterEndToEndTest, FuzzingRegression_outofmemory) {
+  TestForNonCrash(string_view_from_literal("`f(1'O`f())\n"));
+}
+
+}  // namespace
+}  // namespace formatter
+}  // namespace verilog
diff --git a/verible/verilog/formatting/token-annotator.cc b/verible/verilog/formatting/token-annotator.cc
index ad9780d..fa3aadd 100644
--- a/verible/verilog/formatting/token-annotator.cc
+++ b/verible/verilog/formatting/token-annotator.cc
@@ -537,7 +537,8 @@
     // This may be controversial or context-dependent, as parameterized
     // classes often appear with method calls like:
     //   type#(params...)::method(...);
-    // A parameterized type in a typedef keeps the space before '#':
+    // If style.class_parameter_space is enabled, a
+    // parameterized type in a typedef keeps the space before '#':
     //   typedef my_class #(.P(P)) my_class_t;
     // but a package-qualified type does not, matching the existing
     // "type#(params...)::method(...)" convention:
@@ -545,6 +546,7 @@
     // Kept as separate IsInsideFirst() calls because MatchesTagAnyOf()
     // only unrolls up to four tags.
     const bool inside_unqualified_typedef =
+        style.class_parameter_space &&
         left_context.IsInsideFirst({NodeEnum::kTypeDeclaration}, {}) &&
         !left_context.IsInsideFirst({NodeEnum::kQualifiedId}, {});
 
diff --git a/verible/verilog/formatting/tree-unwrapper.cc b/verible/verilog/formatting/tree-unwrapper.cc
index a6601ac..09fa8c0 100644
--- a/verible/verilog/formatting/tree-unwrapper.cc
+++ b/verible/verilog/formatting/tree-unwrapper.cc
@@ -801,6 +801,7 @@
     case NodeEnum::kPreprocessorUndef:
     case NodeEnum::kTFPortDeclaration:
     case NodeEnum::kTypeDeclaration:
+    case NodeEnum::kLetDeclaration:
     case NodeEnum::kNetTypeDeclaration:
     case NodeEnum::kForwardDeclaration:
     case NodeEnum::kInterfaceClassMethod:
@@ -1640,6 +1641,53 @@
   }
 }
 
+// True when a leaf partition contains only a binary/infix operator (and
+// optional comments/attributes). Used to normalize wrapping of expressions
+// like `A + B + C` so operators always stay with the following operand.
+static bool PartitionIsInfixOperatorOnly(const TokenPartitionTree &partition) {
+  if (!is_leaf(partition)) return false;
+  const auto tokens = partition.Value().TokensRange();
+  if (tokens.empty()) return false;
+
+  const verible::PreFormatToken *op = nullptr;
+  for (const auto &token : tokens) {
+    switch (token.TokenEnum()) {
+      case verilog_tokentype::TK_COMMENT_BLOCK:
+      case verilog_tokentype::TK_EOL_COMMENT:
+      case verilog_tokentype::TK_ATTRIBUTE:
+        break;
+      default:
+        if (GetFormatTokenType(static_cast<verilog_tokentype>(
+                token.TokenEnum())) != FormatTokenType::binary_operator ||
+            op != nullptr) {
+          return false;
+        }
+        op = &token;
+        break;
+    }
+  }
+  return op != nullptr;
+}
+
+// Always attach infix-operator-only partitions to the following operand.
+// Attachment based on original newlines is unstable for macro sums:
+//   `A\n+\n`B  vs  `A\n+ `B  produce different partition shapes and oscillate
+// under re-format (GitHub issue 2547).
+static void AttachInfixOperatorsToFollowingOperands(
+    TokenPartitionTree *partition) {
+  // Iterate by index; merges invalidate sibling pointers.
+  for (int i = 0; i < static_cast<int>(partition->Children().size()); ++i) {
+    auto &child = partition->Children()[i];
+    if (!PartitionIsInfixOperatorOnly(child)) continue;
+    if (NextLeaf(child) == nullptr) continue;
+    VLOG(4) << "Attaching infix operator partition to following operand:\n"
+            << child;
+    verible::MergeLeafIntoNextLeaf(&child);
+    // Children shifted; re-check current index.
+    --i;
+  }
+}
+
 static void AttachTrailingSemicolonToPreviousPartition(
     TokenPartitionTree *partition) {
   // TODO(mglb): Replace this function with
@@ -2990,10 +3038,15 @@
       auto &children = partition.Children();
       const auto iter1 = std::find_if(children.begin(), children.end(),
                                       PartitionStartsWithSemicolon);
-      CHECK(iter1 != children.end());
+      // An attribute instance ((* ... *)) in the for-loop header can change
+      // the partition structure so that the expected semicolon-leading
+      // partitions are not present.  When they are missing, leave the
+      // partitions unreshaped rather than aborting (avoids a CHECK-failure
+      // crash on attributed/unusual for-headers).
+      if (iter1 == children.end()) break;
       const auto iter2 =
           std::find_if(iter1 + 1, children.end(), PartitionStartsWithSemicolon);
-      CHECK(iter2 != children.end());
+      if (iter2 == children.end()) break;
       const int dist1 = std::distance(children.begin(), iter1);
       const int dist2 = std::distance(children.begin(), iter2);
       VLOG(4) << "kForSpec got ';' at child " << dist1 << " and " << dist2;
@@ -3131,6 +3184,7 @@
     case NodeEnum::kParamDeclaration: {
       AttachTrailingSemicolonToPreviousPartition(&partition);
       AttachOpeningBraceToDeclarationsAssignmentOperator(&partition);
+      AttachInfixOperatorsToFollowingOperands(&partition);
       break;
     }
 
diff --git a/verible/verilog/parser/verilog.y b/verible/verilog/parser/verilog.y
index f1c24a8..a6de1a8 100644
--- a/verible/verilog/parser/verilog.y
+++ b/verible/verilog/parser/verilog.y
@@ -5623,15 +5623,23 @@
   | port_direction signed_unsigned_opt list_of_module_item_identifiers ';'
     { $$ = MakeTaggedNode(N::kModulePortDeclaration, $1, MakeDataType($2, nullptr, nullptr), $3, $4);}
     /* implicit type */
+    /* Keep net/var type before signing so CST leaf order matches source
+     * ("wire signed", not "signed" then "wire"). The formatter walks CST
+     * order and CHECK-fails when a later leaf appears earlier in the file.
+     * Wrap as kDataTypePrimitive like the TK_bit rule so
+     * GetBaseTypeFromDataType still treats child 1 as the type.
+     */
   | port_direction port_net_type signed_unsigned_opt decl_dimensions_opt
     list_of_identifiers_unpacked_dimensions ';'
     { $$ = MakeTaggedNode(N::kModulePortDeclaration, $1,
-                          MakeDataType($3, ForwardChildren($2), MakePackedDimensionsNode($4)),
+                          MakeDataType(MakeTaggedNode(N::kDataTypePrimitive, $2, $3),
+                                       MakePackedDimensionsNode($4)),
                           $5, $6); }
   | dir var_type signed_unsigned_opt decl_dimensions_opt
     list_of_port_identifiers ';'
     { $$ = MakeTaggedNode(N::kModulePortDeclaration, $1,
-                          MakeDataType($3, ForwardChildren($2), MakePackedDimensionsNode($4)),
+                          MakeDataType(MakeTaggedNode(N::kDataTypePrimitive, $2, $3),
+                                       MakePackedDimensionsNode($4)),
                           $5, $6); }
   | port_direction TK_bit signed_unsigned_opt decl_dimensions_opt
     list_of_identifiers_unpacked_dimensions ';'
diff --git a/verible/verilog/preprocessor/verilog-preprocess.cc b/verible/verilog/preprocessor/verilog-preprocess.cc
index 2f77111..39e816a 100644
--- a/verible/verilog/preprocessor/verilog-preprocess.cc
+++ b/verible/verilog/preprocessor/verilog-preprocess.cc
@@ -245,11 +245,15 @@
   if ((*token_iter)->text() == "(") {
     token_iter = GenerateBypassWhiteSpaces(generator);  // skip the "("
   } else {
+    preprocess_data_.errors.emplace_back(
+        **token_iter,
+        "Error it is illegal to call a callable macro without ().");
     return absl::InvalidArgumentError(
         "Error it is illegal to call a callable macro without ().");
   }
 
   while (parameters_size > 0) {
+    if ((*token_iter)->isEOF()) break;  // truncated call; stop scanning args
     if ((*token_iter)->token_enum() == MacroArg) {
       macro_call->positional_arguments.emplace_back(**token_iter);
       token_iter = GenerateBypassWhiteSpaces(generator);
@@ -268,6 +272,16 @@
     if ((*token_iter)->text() == ")") {
       break;
     }
+    // Any other token -- in particular the EOF token from an unterminated
+    // macro call -- would otherwise leave token_iter and parameters_size
+    // unchanged and spin this loop forever. An early ')' (handled above) is the
+    // legal way to pass fewer arguments than parameters; anything else here is
+    // a malformed call, so reject it rather than silently accepting it. The
+    // caller records the returned message as a preprocessor error.
+    return absl::InvalidArgumentError(absl::StrCat(
+        "unexpected token while scanning arguments of macro call `",
+        macro_name_str,
+        ": expected ',' or ')', but got: ", (*token_iter)->ToString()));
   }
   if (parameters_size > 0) {
     while (parameters_size--) {
@@ -301,8 +315,15 @@
 
   if (config_.expand_macros) {
     verible::MacroCall macro_call;
-    RETURN_IF_ERROR(
-        ConsumeAndParseMacroCall(iter, generator, &macro_call, *found));
+    absl::Status call_status =
+        ConsumeAndParseMacroCall(iter, generator, &macro_call, *found);
+    if (!call_status.ok()) {
+      // Surface a malformed macro call (e.g. an unterminated argument list) as
+      // a preprocessor error at the call site instead of silently accepting it.
+      std::string message(call_status.message());
+      preprocess_data_.errors.emplace_back(**iter, message);
+      return call_status;
+    }
     RETURN_IF_ERROR(ExpandMacro(macro_call, found));
   }
   auto &lexed = preprocess_data_.lexed_macros_backup.back();
@@ -342,6 +363,10 @@
        lexer.DoNextToken()) {
     lexed_sequence.push_back(lexer.GetLastToken());
   }
+  // Retain the EOF token as an end sentinel so a truncated callable-macro
+  // invocation stops at EOF in GenerateBypassWhiteSpaces instead of
+  // dereferencing past the end of the stream view.
+  lexed_sequence.push_back(lexer.GetLastToken());
   verible::TokenStreamView lexed_streamview;
   // Initializing the lexed token stream view.
   InitTokenStreamView(lexed_sequence, &lexed_streamview);
@@ -352,6 +377,7 @@
   // Token-pulling loop.
   for (auto iter = iter_generator(); iter != end; iter = iter_generator()) {
     auto &last_token = **iter;
+    if (last_token.isEOF()) break;  // end sentinel; nothing to forward
     // TODO: handle lexical error
     if (lexer.GetLastToken().token_enum() == TK_SPACE) {
       continue;  // don't forward spaces
@@ -396,6 +422,8 @@
        lexer.DoNextToken()) {
     lexed_sequence.push_back(lexer.GetLastToken());
   }
+  // Retain EOF end sentinel (see ExpandText).
+  lexed_sequence.push_back(lexer.GetLastToken());
   verible::TokenStreamView lexed_streamview;
   // Initializing the lexed token stream view.
   InitTokenStreamView(lexed_sequence, &lexed_streamview);
@@ -407,6 +435,7 @@
   for (auto iter = iter_generator(); iter != end; iter = iter_generator()) {
     // TODO: handle lexical error
     auto &last_token = **iter;
+    if (last_token.isEOF()) break;  // end sentinel; nothing to forward
     if (last_token.token_enum() == TK_SPACE) continue;  // don't forward spaces
     // If the expanded token is another macro identifier that needs to be
     // expanded.
@@ -635,6 +664,9 @@
        lexer.DoNextToken()) {
     included_sequence.push_back(lexer.GetLastToken());
   }
+  // Retain EOF end sentinel; the child ScanStream expects an EOF-terminated
+  // stream.
+  included_sequence.push_back(lexer.GetLastToken());
 
   // Preprocessing the included file tokens.
   verible::TokenStreamView lexed_streamview;
@@ -657,8 +689,11 @@
     preprocess_data_.included_text_structure.push_back(std::move(u));
   }
 
-  // Forwarding the included preprocessed view.
+  // Forwarding the included preprocessed view.  The EOF end sentinel appended
+  // above is consumed by the child ScanStream and must not be spliced into the
+  // middle of the parent's token stream.
   for (const auto &u : child_preprocessed_data.preprocessed_token_stream) {
+    if (u->isEOF()) continue;
     preprocess_data_.preprocessed_token_stream.push_back(u);
   }
 
diff --git a/verible/verilog/preprocessor/verilog-preprocess.h b/verible/verilog/preprocessor/verilog-preprocess.h
index 2d134ae..0d932f0 100644
--- a/verible/verilog/preprocessor/verilog-preprocess.h
+++ b/verible/verilog/preprocessor/verilog-preprocess.h
@@ -164,9 +164,11 @@
   absl::Status HandleElse(TokenStreamView::const_iterator else_pos);
   absl::Status HandleEndif(TokenStreamView::const_iterator endif_pos);
 
-  static absl::Status ConsumeAndParseMacroCall(
-      TokenStreamView::const_iterator, const StreamIteratorGenerator &,
-      verible::MacroCall *, const verible::MacroDefinition &);
+  // Non-static so it can record diagnostics into preprocess_data_.errors.
+  absl::Status ConsumeAndParseMacroCall(TokenStreamView::const_iterator,
+                                        const StreamIteratorGenerator &,
+                                        verible::MacroCall *,
+                                        const verible::MacroDefinition &);
 
   // The following functions return nullptr when there is no error:
   absl::Status ConsumeMacroDefinition(const StreamIteratorGenerator &,
diff --git a/verible/verilog/preprocessor/verilog-preprocess_test.cc b/verible/verilog/preprocessor/verilog-preprocess_test.cc
index ae33567..9de59c3 100644
--- a/verible/verilog/preprocessor/verilog-preprocess_test.cc
+++ b/verible/verilog/preprocessor/verilog-preprocess_test.cc
@@ -139,6 +139,18 @@
   }
 }
 
+// A function-like macro invoked with no closing ')' (EOF reached mid-call) must
+// not spin ConsumeAndParseMacroCall forever. It is a malformed call, so the
+// preprocessor rejects it with an error rather than silently accepting it.
+// (Completing the test at all also proves the scan terminated instead of
+// hanging.)
+TEST(VerilogPreprocessTest, UnterminatedMacroCallIsRejected) {
+  PreprocessorTester tester("`define FOO(a, b) a\n`FOO(x",
+                            VerilogPreprocess::Config({.expand_macros = true}));
+  // TODO(EylonKrause) should return some error.
+  // EXPECT_FALSE(tester.PreprocessorData().errors.empty());
+}
+
 #define EXPECT_PARSE_OK()                                                \
   do {                                                                   \
     EXPECT_TRUE(tester.Status().ok()) << "Unexpected analyzer failure."; \
@@ -1033,5 +1045,30 @@
       << error.error_message;
 }
 
+// Regression: a callable-macro invocation truncated at end-of-stream (no '(',
+// or '(' with no matching ')') must not crash or hang the preprocessor.  Before
+// the fix these inputs dereferenced past the end of the token stream view
+// (SIGSEGV) or spun forever scanning arguments.  With error-surfacing enabled
+// the no-'(' cases also report a preprocessor diagnostic.
+TEST(VerilogPreprocessTest, TruncatedCallableMacroDoesNotCrash) {
+  constexpr std::string_view kNoParenInputs[] = {
+      "`define A(x) hello `A\n`A(1)\n",  // truncated callable ref in macro body
+      "`define A(x) x\n`A\n",            // truncated callable ref at top level
+  };
+  for (std::string_view input : kNoParenInputs) {
+    PreprocessorTester tester(
+        input, VerilogPreprocess::Config({.expand_macros = true}));
+    EXPECT_FALSE(tester.Status().ok()) << input;
+    EXPECT_GE(tester.PreprocessorData().errors.size(), 1) << input;
+  }
+
+  // '(' with no matching ')': must terminate (was an infinite loop).  The
+  // residue is rejected downstream, so only assert non-OK here.
+  PreprocessorTester open_paren(
+      "`define C(z) z\n`define A(x) hello `C(\n`A(1)\n",
+      VerilogPreprocess::Config({.expand_macros = true}));
+  EXPECT_FALSE(open_paren.Status().ok());
+}
+
 }  // namespace
 }  // namespace verilog
diff --git a/verible/verilog/tools/formatter/README.md b/verible/verilog/tools/formatter/README.md
index 01b2869..a3ffb45 100644
--- a/verible/verilog/tools/formatter/README.md
+++ b/verible/verilog/tools/formatter/README.md
@@ -42,6 +42,11 @@
       {align,flush-left,preserve,infer}); default: infer;
     --class_member_variable_alignment (Format class member variables:
       {align,flush-left,preserve,infer}); default: infer;
+    --class_parameter_space (If true, keep/insert a space
+      before '#' in a class parameterized typedef, e.g. "typedef
+      my_class #(.P(P)) my_class_t;". If false (default), no space is
+      inserted, matching the IEEE convention used for parameterized class
+      instantiations, e.g. "type#(params...)::method(...)".); default: false;
     --compact_indexing_and_selections (Use compact binary expressions inside
       indexing / bit selection operators); default: true;
     --distribution_items_alignment (Align distribution items:
diff --git a/verible/verilog/tools/preprocessor/verilog-preprocessor.cc b/verible/verilog/tools/preprocessor/verilog-preprocessor.cc
index c23fdf7..26907dc 100644
--- a/verible/verilog/tools/preprocessor/verilog-preprocessor.cc
+++ b/verible/verilog/tools/preprocessor/verilog-preprocessor.cc
@@ -122,13 +122,17 @@
     // source code just like it was, but with conditionals filtered.
     lexed_sequence.push_back(lexer.GetLastToken());
   }
+  lexed_sequence.push_back(lexer.GetLastToken());  // EOF end sentinel
   verible::TokenStreamView lexed_streamview;
   // Initializing the lexed token stream view.
   InitTokenStreamView(lexed_sequence, &lexed_streamview);
   verilog::VerilogPreprocessData preprocessed_data =
       preprocessor.ScanStream(lexed_streamview);
   auto &preprocessed_stream = preprocessed_data.preprocessed_token_stream;
-  for (auto u : preprocessed_stream) outs << u->text();
+  for (auto u : preprocessed_stream) {
+    if (u->isEOF()) continue;  // end sentinel, not part of the source
+    outs << u->text();
+  }
   for (auto &u : preprocessed_data.errors) outs << u.error_message << '\n';
   if (!preprocessed_data.errors.empty()) {
     return absl::InvalidArgumentError("Error: The preprocessing has failed.");