Browse Source

Terminal: added clickable links for Rust, Node.js and Python warnings/errors

merge-requests/389/head
eidheim 7 years ago
parent
commit
3e7485e94c
  1. 24
      src/terminal.cc

24
src/terminal.cc

@ -164,16 +164,19 @@ bool Terminal::on_motion_notify_event(GdkEventMotion *event) {
} }
std::tuple<size_t, size_t, std::string, std::string, std::string> Terminal::find_link(const std::string &line) { std::tuple<size_t, size_t, std::string, std::string, std::string> Terminal::find_link(const std::string &line) {
const static std::regex link_regex("^([A-Z]:)?([^:]+):([0-9]+):([0-9]+): .*$|" //compile warning/error/rename usages const static std::regex link_regex("^([A-Z]:)?([^:]+):([0-9]+):([0-9]+): .*$|" // C/C++ compile warning/error/rename usages
"^Assertion failed: .*file ([A-Z]:)?([^:]+), line ([0-9]+)\\.$|" //clang assert() "^ --> ([A-Z]:)?([^:]+):([0-9]+):([0-9]+)$|" // Rust
"^[^:]*: ([A-Z]:)?([^:]+):([0-9]+): .* Assertion .* failed\\.$|" //gcc assert() "^Assertion failed: .*file ([A-Z]:)?([^:]+), line ([0-9]+)\\.$|" // clang assert()
"^ERROR:([A-Z]:)?([^:]+):([0-9]+):.*$"); //g_assert (glib.h) "^[^:]*: ([A-Z]:)?([^:]+):([0-9]+): .* Assertion .* failed\\.$|" // gcc assert()
"^ERROR:([A-Z]:)?([^:]+):([0-9]+):.*$|" // g_assert (glib.h)
"^([A-Z]:)?([\\/][^:]+):([0-9]+)$|" // Node.js
"^ File \"([A-Z]:)?([^\"]+)\", line ([0-9]+), in .*$"); // Python
size_t start_position = -1, end_position = -1; size_t start_position = -1, end_position = -1;
std::string path, line_number, line_offset; std::string path, line_number, line_offset;
std::smatch sm; std::smatch sm;
if(std::regex_match(line, sm, link_regex)) { if(std::regex_match(line, sm, link_regex)) {
for(size_t sub = 1; sub < link_regex.mark_count();) { for(size_t sub = 1; sub < link_regex.mark_count();) {
size_t subs = sub == 1 ? 4 : 3; size_t subs = sub == 1 || sub == 5 ? 4 : 3;
if(sm.length(sub + 1)) { if(sm.length(sub + 1)) {
start_position = sm.position(sub + 1) - sm.length(sub); start_position = sm.position(sub + 1) - sm.length(sub);
end_position = sm.position(sub + subs - 1) + sm.length(sub + subs - 1); end_position = sm.position(sub + subs - 1) + sm.length(sub + subs - 1);
@ -369,11 +372,14 @@ bool Terminal::on_button_press_event(GdkEventButton *button_event) {
if(path.is_relative()) { if(path.is_relative()) {
if(Project::current) { if(Project::current) {
auto absolute_path = Project::current->build->get_default_path() / path; if(boost::filesystem::exists(Project::current->build->get_default_path() / path))
if(boost::filesystem::exists(absolute_path)) path = Project::current->build->get_default_path() / path;
path = absolute_path; else if(boost::filesystem::exists(Project::current->build->get_debug_path() / path))
else
path = Project::current->build->get_debug_path() / path; path = Project::current->build->get_debug_path() / path;
else if(boost::filesystem::exists(Project::current->build->project_path / path))
path = Project::current->build->project_path / path;
else
return Gtk::TextView::on_button_press_event(button_event);
} }
else else
return Gtk::TextView::on_button_press_event(button_event); return Gtk::TextView::on_button_press_event(button_event);

Loading…
Cancel
Save