75 lines
2.3 KiB
C++
75 lines
2.3 KiB
C++
//===----------------------------------------------------------------------===//
|
|
//
|
|
// 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();
|
|
}
|