From 246a32797a17e7cdebcde64ac98c09501d1da10d Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Mon, 12 Oct 2020 12:14:01 +1100 Subject: [PATCH] Fix region regexes incorrectly matching ^$ at end of line Because no flags were set for regex matching, the regex engine was assuming that the subject string past-the-end matched a end-of-line. As the subject string already ended with a \n character, the regex engine processing of the "past-the-end" position would match '^$' as ^ matched past the existing \n and $ matched the assumed end-of-line. Fixes #3799 --- src/highlighters.cc | 3 ++- test/regression/3799-incorrect-region-match/cmd | 1 + test/regression/3799-incorrect-region-match/in | 4 ++++ test/regression/3799-incorrect-region-match/rc | 2 ++ test/regression/3799-incorrect-region-match/script | 2 ++ 5 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 test/regression/3799-incorrect-region-match/cmd create mode 100644 test/regression/3799-incorrect-region-match/in create mode 100644 test/regression/3799-incorrect-region-match/rc create mode 100644 test/regression/3799-incorrect-region-match/script diff --git a/src/highlighters.cc b/src/highlighters.cc index 78099b08..309ade94 100644 --- a/src/highlighters.cc +++ b/src/highlighters.cc @@ -1744,7 +1744,8 @@ void insert_matches(const Buffer& buffer, RegexMatchList& matches, const Regex& for (auto line = range.begin; line < range.end; ++line) { const StringView l = buffer[line]; - for (auto&& m : RegexIterator{l.begin(), l.end(), vm}) + const auto flags = RegexExecFlags::NotEndOfLine; // buffer line already ends with \n + for (auto&& m : RegexIterator{l.begin(), l.end(), vm, flags}) { const bool with_capture = capture and m[1].matched and m[0].second - m[0].first < std::numeric_limits::max(); diff --git a/test/regression/3799-incorrect-region-match/cmd b/test/regression/3799-incorrect-region-match/cmd new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/test/regression/3799-incorrect-region-match/cmd @@ -0,0 +1 @@ + diff --git a/test/regression/3799-incorrect-region-match/in b/test/regression/3799-incorrect-region-match/in new file mode 100644 index 00000000..0956e089 --- /dev/null +++ b/test/regression/3799-incorrect-region-match/in @@ -0,0 +1,4 @@ +print << ""; +part of heredoc + +not part of heredoc diff --git a/test/regression/3799-incorrect-region-match/rc b/test/regression/3799-incorrect-region-match/rc new file mode 100644 index 00000000..3e1998b7 --- /dev/null +++ b/test/regression/3799-incorrect-region-match/rc @@ -0,0 +1,2 @@ +add-highlighter global/regions regions +add-highlighter global/regions/heredoc region -match-capture <<\h*"(\w*)" ^(\w*)$ fill red diff --git a/test/regression/3799-incorrect-region-match/script b/test/regression/3799-incorrect-region-match/script new file mode 100644 index 00000000..ec4075b4 --- /dev/null +++ b/test/regression/3799-incorrect-region-match/script @@ -0,0 +1,2 @@ +ui_out '{ "jsonrpc": "2.0", "method": "set_ui_options", "params": [{}] }' +ui_out '{ "jsonrpc": "2.0", "method": "draw", "params": [[[{ "face": { "fg": "black", "bg": "white", "attributes": [] }, "contents": "p" }, { "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "rint " }, { "face": { "fg": "red", "bg": "default", "attributes": [] }, "contents": "<< \"\";\u000a" }], [{ "face": { "fg": "red", "bg": "default", "attributes": [] }, "contents": "part of heredoc\u000a" }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "\u000a" }], [{ "face": { "fg": "default", "bg": "default", "attributes": [] }, "contents": "not part of heredoc\u000a" }]], { "fg": "default", "bg": "default", "attributes": [] }, { "fg": "blue", "bg": "default", "attributes": [] }] }'