blob: 4cac1d6346441630b0711dad059397486345870b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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();
}
|