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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
#include "DapLocator.hpp"
#include "Platform.hpp"
#include "asyncprocess.h"
#include "file_logger.h"
#include "globals.h"
#include "processreaderthread.h"
#include "procutils.h"
#include <wx/filefn.h>
DapLocator::DapLocator() {}
DapLocator::~DapLocator() {}
size_t DapLocator::Locate(std::vector<DapEntry>* entries)
{
find_lldb_vscode(entries);
find_debugpy(entries);
return entries->size();
}
namespace
{
wxString wrap_string(const wxString& str)
{
wxString s = str;
if(s.Contains(" ")) {
s.Prepend("\"").Append("\"");
}
return s;
}
wxString get_exe_name(const wxString& base, size_t counter = wxString::npos)
{
wxString exename = base;
if(counter != wxString::npos) {
exename << "-" << counter;
}
#ifdef __WXMSW__
exename << ".exe";
#endif
return exename;
}
DapEntry create_entry(const wxString& name, int port, const std::vector<wxString>& cmd, DapLaunchType launch_type)
{
DapEntry entry;
entry.SetName(name);
#ifdef __WXMSW__
entry.SetUseForwardSlash(true);
entry.SetUseVolume(false);
entry.SetUseRelativePath(false);
#else
entry.SetUseNativePath();
#endif
wxString connection_string;
connection_string << "tcp://127.0.0.1:" << port;
entry.SetConnectionString(connection_string);
wxString command;
for(const wxString& c : cmd) {
command << wrap_string(c) << " ";
}
command.RemoveLast();
entry.SetCommand(command);
entry.SetLaunchType(launch_type);
entry.SetEnvFormat(dap::EnvFormat::DICTIONARY);
return entry;
}
} // namespace
void DapLocator::find_lldb_vscode(std::vector<DapEntry>* entries)
{
wxArrayString paths;
wxString lldb_vscode;
if(!ThePlatform->Which("lldb-vscode", &lldb_vscode)) {
return;
}
auto entry = create_entry("lldb-vscode", 12345, { lldb_vscode, "--port", "12345" }, DapLaunchType::LAUNCH);
entry.SetEnvFormat(dap::EnvFormat::LIST);
entries->push_back(entry);
}
void DapLocator::find_debugpy(std::vector<DapEntry>* entries)
{
// locate pip first
wxArrayString paths;
wxString python;
// locate python3
if(!ThePlatform->Which("python", &python) && !ThePlatform->Which("python3", &python)) {
return;
}
// we got pip
wxString line = ProcUtils::GrepCommandOutput({ python, "-m", "pip", "list" }, "debugpy");
if(line.empty())
return;
// we have a match
auto entry =
create_entry("debugpy", 12345,
{ python, "-m", "debugpy", "--listen", "12345", "--wait-for-client", "$(CurrentFileFullPath)" },
DapLaunchType::ATTACH);
entry.SetUseNativePath();
entries->push_back(entry);
}
|