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);
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);
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits