From f4f0f5b22a2e52bd0391ee7f6cd4b99c98028fe9 Mon Sep 17 00:00:00 2001 From: Silas Date: Fri, 27 Nov 2020 22:07:58 -0300 Subject: Heredocs with "-" can have spaces before closing If a here-doc start delimiter begins with "-", then spaces are allowed to come before the closing delimiter. This patch fixes what would otherwise be parsed incorrectly: <<-EOF .... EOF --- lua/lexers/bash.lua | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'lua/lexers/bash.lua') diff --git a/lua/lexers/bash.lua b/lua/lexers/bash.lua index 207cb22..4dc4cf6 100644 --- a/lua/lexers/bash.lua +++ b/lua/lexers/bash.lua @@ -18,10 +18,18 @@ local sq_str = l.delimited_range("'", false, true) local dq_str = l.delimited_range('"') local ex_str = l.delimited_range('`') local heredoc = '<<' * P(function(input, index) - local s, e, _, delimiter = - input:find('%-?(["\']?)([%a_][%w_]*)%1[\n\r\f;]+', index) + local s, e, minus, _, delimiter = + input:find('(-?)(["\']?)([%a_][%w_]*)%2[\n\r\f;]+', index) + -- If the starting delimiter of a here-doc begins with "-", then + -- spaces are allowed to come before the closing delimiter. + local close_pattern + if minus == '-' then + close_pattern = '[\n\r\f%s]+'..delimiter..'\n' + else + close_pattern = '[\n\r\f]+'..delimiter..'\n' + end if s == index and delimiter then - local _, e = input:find('[\n\r\f]+'..delimiter..'\n', e) + local _, e = input:find(close_pattern, e) return e and e + 1 or #input + 1 end end) -- cgit v1.2.3