aboutsummaryrefslogtreecommitdiff
path: root/lldb/tools/lldb-dap/ClientLauncher.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/tools/lldb-dap/ClientLauncher.cpp')
-rw-r--r--lldb/tools/lldb-dap/ClientLauncher.cpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/lldb/tools/lldb-dap/ClientLauncher.cpp b/lldb/tools/lldb-dap/ClientLauncher.cpp
new file mode 100644
index 0000000..4cac1d6
--- /dev/null
+++ b/lldb/tools/lldb-dap/ClientLauncher.cpp
@@ -0,0 +1,74 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "ClientLauncher.h"
+#include "llvm/ADT/StringExtras.h"
+#include "llvm/ADT/StringSwitch.h"
+#include "llvm/Support/FormatVariadic.h"
+
+using namespace lldb_dap;
+
+std::optional<ClientLauncher::Client>
+ClientLauncher::GetClientFrom(llvm::StringRef str) {
+ return llvm::StringSwitch<std::optional<ClientLauncher::Client>>(str.lower())
+ .Case("vscode", ClientLauncher::VSCode)
+ .Case("vscode-url", ClientLauncher::VSCodeURL)
+ .Default(std::nullopt);
+}
+
+std::unique_ptr<ClientLauncher>
+ClientLauncher::GetLauncher(ClientLauncher::Client client) {
+ switch (client) {
+ case ClientLauncher::VSCode:
+ return std::make_unique<VSCodeLauncher>();
+ case ClientLauncher::VSCodeURL:
+ return std::make_unique<VSCodeURLPrinter>();
+ }
+ return nullptr;
+}
+
+std::string VSCodeLauncher::URLEncode(llvm::StringRef str) {
+ std::string out;
+ llvm::raw_string_ostream os(out);
+ for (char c : str) {
+ if (std::isalnum(c) || llvm::StringRef("-_.~").contains(c))
+ os << c;
+ else
+ os << '%' << llvm::utohexstr(c, false, 2);
+ }
+ return os.str();
+}
+
+std::string
+VSCodeLauncher::GetLaunchURL(const std::vector<llvm::StringRef> args) const {
+ assert(!args.empty() && "empty launch args");
+
+ std::vector<std::string> encoded_launch_args;
+ for (llvm::StringRef arg : args)
+ encoded_launch_args.push_back(URLEncode(arg));
+
+ const std::string args_str = llvm::join(encoded_launch_args, "&args=");
+ return llvm::formatv(
+ "vscode://llvm-vs-code-extensions.lldb-dap/start?program={0}",
+ args_str)
+ .str();
+}
+
+llvm::Error VSCodeLauncher::Launch(const std::vector<llvm::StringRef> args) {
+ const std::string launch_url = GetLaunchURL(args);
+ const std::string command =
+ llvm::formatv("code --open-url {0}", launch_url).str();
+
+ std::system(command.c_str());
+ return llvm::Error::success();
+}
+
+llvm::Error VSCodeURLPrinter::Launch(const std::vector<llvm::StringRef> args) {
+ llvm::outs() << GetLaunchURL(args) << '\n';
+ return llvm::Error::success();
+}