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 " - " to launch.">; + def process_attach_waitfor : Option<"waitfor", "w">, + Group<2>, + Desc<"${W}ait for the process with " + " to launch.">; } let Command = "process continue" in { diff --git a/lldb/utils/TableGen/LLDBOptionDefEmitter.cpp b/lldb/utils/TableGen/LLDBOptionDefEmitter.cpp index 2507910d8a97a..e6d5b7bb52a20 100644 --- a/lldb/utils/TableGen/LLDBOptionDefEmitter.cpp +++ b/lldb/utils/TableGen/LLDBOptionDefEmitter.cpp @@ -23,6 +23,33 @@ using namespace llvm; using namespace lldb_private; namespace { +/// Parses curly braces and replaces them with ANSI underline formatting. +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) + break; + + assert(!OpeningTail.empty()); + + // 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 GroupsArg; bool Required = false; @@ -68,7 +95,7 @@ struct CommandOption { Completions = Option->getValueAsListOfStrings("Completions"); if (auto D = Option->getValue("Description")) - Description = D->getValue()->getAsUnquotedString(); + Description = underline(D->getValue()->getAsUnquotedString()); } }; } // namespace