https://github.com/JDevlieghere created 
https://github.com/llvm/llvm-project/pull/155694

This PR updates the tablegen emitter for command options to support a 
simplified syntax to underline the mnemonic. Previously, you had to write 
`${ansi.underline}<L>${ansi.normal}`, where `<L>` is the mnemonic. This really 
hurt the readability of the description. With this PR, you can write `${<L>}` 
instead.

>From 2a337e37d28a1ce2d02d8605b148213125e0fa01 Mon Sep 17 00:00:00 2001
From: Jonas Devlieghere <jo...@devlieghere.com>
Date: Wed, 27 Aug 2025 13:49:07 -0700
Subject: [PATCH] [lldb] Add a simplified syntax for underlying command options
 (NFC)

This PR updates the tablegen emitter for command options to support a
simplified syntax to underline the mnemonic. Previously, you had to
write `${ansi.underline}<L>${ansi.normal}`, where `<L>` is the mnemonic.
This really hurt the readability of the description. With this PR, you
can write `${<L>}` instead.
---
 lldb/source/Commands/Options.td              | 31 +++++++++-----------
 lldb/utils/TableGen/LLDBOptionDefEmitter.cpp | 27 ++++++++++++++++-
 2 files changed, 40 insertions(+), 18 deletions(-)

diff --git a/lldb/source/Commands/Options.td b/lldb/source/Commands/Options.td
index 2aa0b10ac34e5..e61df1342ce9f 100644
--- a/lldb/source/Commands/Options.td
+++ b/lldb/source/Commands/Options.td
@@ -741,35 +741,32 @@ let Command = "process launch" in {
 }
 
 let Command = "process attach" in {
-  def process_attach_continue
-      : Option<"continue", "c">,
-        Desc<"Immediately ${ansi.underline}c${ansi.normal}ontinue the process "
-             "once attached.">;
-  def process_attach_plugin
-      : Option<"plugin", "P">,
-        Arg<"Plugin">,
-        Desc<"Name of the process ${ansi.underline}p${ansi.normal}lugin you "
-             "want to use.">;
+  def process_attach_continue : Option<"continue", "c">,
+                                Desc<"Immediately ${c}ontinue the process "
+                                     "once attached.">;
+  def process_attach_plugin : Option<"plugin", "P">,
+                              Arg<"Plugin">,
+                              Desc<"Name of the process ${p}lugin you "
+                                   "want to use.">;
   def process_attach_pid : Option<"pid", "p">,
                            Group<1>,
                            Arg<"Pid">,
-                           Desc<"The ${ansi.underline}p${ansi.normal}rocess ID 
"
+                           Desc<"The ${p}rocess ID "
                                 "of an existing process to attach to.">;
   def process_attach_name : Option<"name", "n">,
                             Group<2>,
                             Arg<"ProcessName">,
-                            Desc<"The ${ansi.underline}n${ansi.normal}ame of "
+                            Desc<"The ${n}ame of "
                                  "the process to attach to.">;
   def process_attach_include_existing
       : Option<"include-existing", "i">,
         Group<2>,
-        Desc<"${ansi.underline}I${ansi.normal}nclude existing processes when "
+        Desc<"${I}nclude existing processes when "
              "doing attach -w.">;
-  def process_attach_waitfor
-      : Option<"waitfor", "w">,
-        Group<2>,
-        Desc<"${ansi.underline}W${ansi.normal}ait for the process with "
-             "<process-name> to launch.">;
+  def process_attach_waitfor : Option<"waitfor", "w">,
+                               Group<2>,
+                               Desc<"${W}ait for the process with "
+                                    "<process-name> to launch.">;
 }
 
 let Command = "process continue" in {
diff --git a/lldb/utils/TableGen/LLDBOptionDefEmitter.cpp 
b/lldb/utils/TableGen/LLDBOptionDefEmitter.cpp
index 2507910d8a97a..b39622240693f 100644
--- a/lldb/utils/TableGen/LLDBOptionDefEmitter.cpp
+++ b/lldb/utils/TableGen/LLDBOptionDefEmitter.cpp
@@ -23,6 +23,31 @@ using namespace llvm;
 using namespace lldb_private;
 
 namespace {
+/// Parses curly braces and replaces them with ANSI underline formatting.
+inline std::string underline(llvm::StringRef Str) {
+  llvm::StringRef OpeningHead, OpeningTail, ClosingHead, ClosingTail;
+  std::string Result;
+  llvm::raw_string_ostream Stream(Result);
+  while (!Str.empty()) {
+    // Find the opening brace.
+    std::tie(OpeningHead, OpeningTail) = Str.split("${");
+    Stream << OpeningHead;
+
+    // No opening brace: we're done.
+    if (OpeningHead == Str && OpeningTail.empty())
+      break;
+
+    // Find the closing brace.
+    std::tie(ClosingHead, ClosingTail) = OpeningTail.split('}');
+    assert(!ClosingTail.empty() &&
+           "unmatched curly braces in command option description");
+
+    Stream << "${ansi.underline}" << ClosingHead << "${ansi.normal}";
+    Str = ClosingTail;
+  }
+  return Result;
+}
+
 struct CommandOption {
   std::vector<std::string> GroupsArg;
   bool Required = false;
@@ -68,7 +93,7 @@ struct CommandOption {
       Completions = Option->getValueAsListOfStrings("Completions");
 
     if (auto D = Option->getValue("Description"))
-      Description = D->getValue()->getAsUnquotedString();
+      Description = underline(D->getValue()->getAsUnquotedString());
   }
 };
 } // namespace

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to