brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 4cac1d6 Raw
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