//===----------------------------------------------------------------------===// // // 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::GetClientFrom(llvm::StringRef str) { return llvm::StringSwitch>(str.lower()) .Case("vscode", ClientLauncher::VSCode) .Case("vscode-url", ClientLauncher::VSCodeURL) .Default(std::nullopt); } std::unique_ptr ClientLauncher::GetLauncher(ClientLauncher::Client client) { switch (client) { case ClientLauncher::VSCode: return std::make_unique(); case ClientLauncher::VSCodeURL: return std::make_unique(); } 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 args) const { assert(!args.empty() && "empty launch args"); std::vector 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 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 args) { llvm::outs() << GetLaunchURL(args) << '\n'; return llvm::Error::success(); }