75 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "ClientLauncher.h"10#include "llvm/ADT/StringExtras.h"11#include "llvm/ADT/StringSwitch.h"12#include "llvm/Support/FormatVariadic.h"13 14using namespace lldb_dap;15 16std::optional<ClientLauncher::Client>17ClientLauncher::GetClientFrom(llvm::StringRef str) {18 return llvm::StringSwitch<std::optional<ClientLauncher::Client>>(str.lower())19 .Case("vscode", ClientLauncher::VSCode)20 .Case("vscode-url", ClientLauncher::VSCodeURL)21 .Default(std::nullopt);22}23 24std::unique_ptr<ClientLauncher>25ClientLauncher::GetLauncher(ClientLauncher::Client client) {26 switch (client) {27 case ClientLauncher::VSCode:28 return std::make_unique<VSCodeLauncher>();29 case ClientLauncher::VSCodeURL:30 return std::make_unique<VSCodeURLPrinter>();31 }32 return nullptr;33}34 35std::string VSCodeLauncher::URLEncode(llvm::StringRef str) {36 std::string out;37 llvm::raw_string_ostream os(out);38 for (char c : str) {39 if (std::isalnum(c) || llvm::StringRef("-_.~").contains(c))40 os << c;41 else42 os << '%' << llvm::utohexstr(c, false, 2);43 }44 return os.str();45}46 47std::string48VSCodeLauncher::GetLaunchURL(const std::vector<llvm::StringRef> args) const {49 assert(!args.empty() && "empty launch args");50 51 std::vector<std::string> encoded_launch_args;52 for (llvm::StringRef arg : args)53 encoded_launch_args.push_back(URLEncode(arg));54 55 const std::string args_str = llvm::join(encoded_launch_args, "&args=");56 return llvm::formatv(57 "vscode://llvm-vs-code-extensions.lldb-dap/start?program={0}",58 args_str)59 .str();60}61 62llvm::Error VSCodeLauncher::Launch(const std::vector<llvm::StringRef> args) {63 const std::string launch_url = GetLaunchURL(args);64 const std::string command =65 llvm::formatv("code --open-url {0}", launch_url).str();66 67 std::system(command.c_str());68 return llvm::Error::success();69}70 71llvm::Error VSCodeURLPrinter::Launch(const std::vector<llvm::StringRef> args) {72 llvm::outs() << GetLaunchURL(args) << '\n';73 return llvm::Error::success();74}75