[Lldb-commits] [PATCH] D142034: [lldb][Language] List supported languages in expr error text

Michael Buch via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Wed Jan 18 08:57:45 PST 2023


Michael137 created this revision.
Michael137 added reviewers: jingham, aprantl.
Herald added a project: All.
Michael137 requested review of this revision.
Herald added a project: LLDB.
Herald added a subscriber: lldb-commits.

Before:

  (lldb) expr --language abc -- 1 + 1
  error: unknown language type: 'abc' for expression

After:

  (lldb) expr --language abc -- 1 + 1
  error: unknown language type: 'abc' for expression. List of supported languages:
    c++
    objective-c
    objective-c++

We choose to only list the languages which `expr` will actually
accept instead of all the language constants defined in `Language.cpp`
since that's what the user will most likely need.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D142034

Files:
  lldb/include/lldb/Target/Language.h
  lldb/source/Commands/CommandObjectExpression.cpp
  lldb/source/Target/Language.cpp
  lldb/test/API/commands/expression/invalid-args/TestInvalidArgsExpression.py


Index: lldb/test/API/commands/expression/invalid-args/TestInvalidArgsExpression.py
===================================================================
--- lldb/test/API/commands/expression/invalid-args/TestInvalidArgsExpression.py
+++ lldb/test/API/commands/expression/invalid-args/TestInvalidArgsExpression.py
@@ -7,7 +7,9 @@
     @no_debug_info_test
     def test_invalid_lang(self):
         self.expect("expression -l foo --", error=True,
-                    substrs=["error: unknown language type: 'foo' for expression"])
+                    substrs=["error: unknown language type: 'foo' for expression",
+                             "List of supported languages:",
+                             "c++"])
 
     @no_debug_info_test
     def test_invalid_all_thread(self):
Index: lldb/source/Target/Language.cpp
===================================================================
--- lldb/source/Target/Language.cpp
+++ lldb/source/Target/Language.cpp
@@ -221,6 +221,16 @@
     return language_names[eLanguageTypeUnknown].name;
 }
 
+void Language::PrintSupportedLanguages(Stream &s, llvm::StringRef prefix,
+                                       llvm::StringRef suffix) {
+  auto supported = Language::GetSupportedLanguages();
+  for (auto const &lang : supported) {
+    s << prefix;
+    s << Language::GetNameForLanguageType(lang);
+    s << suffix;
+  }
+}
+
 void Language::PrintAllLanguages(Stream &s, const char *prefix,
                                  const char *suffix) {
   for (uint32_t i = 1; i < num_languages; i++) {
Index: lldb/source/Commands/CommandObjectExpression.cpp
===================================================================
--- lldb/source/Commands/CommandObjectExpression.cpp
+++ lldb/source/Commands/CommandObjectExpression.cpp
@@ -42,10 +42,15 @@
   switch (short_option) {
   case 'l':
     language = Language::GetLanguageTypeFromString(option_arg);
-    if (language == eLanguageTypeUnknown)
-      error.SetErrorStringWithFormat(
-          "unknown language type: '%s' for expression",
-          option_arg.str().c_str());
+    if (language == eLanguageTypeUnknown) {
+      StreamString sstr;
+      sstr.Printf("unknown language type: '%s' for expression. "
+                  "List of supported languages:\n",
+                  option_arg.str().c_str());
+
+      Language::PrintSupportedLanguages(sstr, "  ", "\n");
+      error.SetErrorString(sstr.GetString());
+    }
     break;
 
   case 'a': {
Index: lldb/include/lldb/Target/Language.h
===================================================================
--- lldb/include/lldb/Target/Language.h
+++ lldb/include/lldb/Target/Language.h
@@ -279,6 +279,15 @@
   static void PrintAllLanguages(Stream &s, const char *prefix,
                                 const char *suffix);
 
+  /// Prints each language type that the current target supports
+  /// to the specified stream 's'.
+  ///
+  /// \param[out] s      Stream to which the language types are written.
+  /// \param[in]  prefix String that is prepended to the language type.
+  /// \param[in]  suffix String that is appended to the language type.
+  static void PrintSupportedLanguages(Stream &s, llvm::StringRef prefix,
+                                      llvm::StringRef suffix);
+
   // return false from callback to stop iterating
   static void ForAllLanguages(std::function<bool(lldb::LanguageType)> callback);
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D142034.490194.patch
Type: text/x-patch
Size: 3390 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20230118/7c8bae2d/attachment.bin>


More information about the lldb-commits mailing list