From 0a2218f965ac8cd7967d33b8c52e5b06fb284aac Mon Sep 17 00:00:00 2001 From: Evgeni Chasnovski Date: Thu, 23 May 2024 23:30:53 +0300 Subject: fix(comment): fall back to using trimmed comment markers (#28938) Problem: Currently comment detection, addition, and removal are done by matching 'commentstring' exactly. This has the downside when users want to add comment markers with space (like with `-- %s` commentstring) but also be able to uncomment lines that do not contain space (like `--aaa`). Solution: Use the following approach: - Line is commented if it matches 'commentstring' with trimmed parts. - Adding comment is 100% relying on 'commentstring' parts (as is now). - Removing comment is first trying exact 'commentstring' parts with fallback on trying its trimmed parts. --- test/functional/lua/comment_spec.lua | 39 +++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 16 deletions(-) (limited to 'test/functional/lua') diff --git a/test/functional/lua/comment_spec.lua b/test/functional/lua/comment_spec.lua index 9b1d9613cb..bbf061a2ab 100644 --- a/test/functional/lua/comment_spec.lua +++ b/test/functional/lua/comment_spec.lua @@ -301,27 +301,34 @@ describe('commenting', function() eq(get_lines(), { 'aa', '', ' ', '\t', 'aa' }) end) - it('matches comment parts strictly when detecting comment/uncomment', function() + it('correctly matches comment parts during checking and uncommenting', function() local validate = function(from, to, ref_lines) - set_lines({ '#aa', '# aa', '# aa' }) + set_lines({ '/*aa*/', '/* aa */', '/* aa */' }) toggle_lines(from, to) eq(get_lines(), ref_lines) end - set_commentstring('#%s') - validate(1, 3, { 'aa', ' aa', ' aa' }) - validate(2, 3, { '#aa', ' aa', ' aa' }) - validate(3, 3, { '#aa', '# aa', ' aa' }) - - set_commentstring('# %s') - validate(1, 3, { '# #aa', '# # aa', '# # aa' }) - validate(2, 3, { '#aa', 'aa', ' aa' }) - validate(3, 3, { '#aa', '# aa', ' aa' }) - - set_commentstring('# %s') - validate(1, 3, { '# #aa', '# # aa', '# # aa' }) - validate(2, 3, { '#aa', '# # aa', '# # aa' }) - validate(3, 3, { '#aa', '# aa', 'aa' }) + -- Should first try to match 'commentstring' parts exactly with their + -- whitespace, with fallback on trimmed parts + set_commentstring('/*%s*/') + validate(1, 3, { 'aa', ' aa ', ' aa ' }) + validate(2, 3, { '/*aa*/', ' aa ', ' aa ' }) + validate(3, 3, { '/*aa*/', '/* aa */', ' aa ' }) + + set_commentstring('/* %s */') + validate(1, 3, { 'aa', 'aa', ' aa ' }) + validate(2, 3, { '/*aa*/', 'aa', ' aa ' }) + validate(3, 3, { '/*aa*/', '/* aa */', ' aa ' }) + + set_commentstring('/* %s */') + validate(1, 3, { 'aa', ' aa ', 'aa' }) + validate(2, 3, { '/*aa*/', ' aa ', 'aa' }) + validate(3, 3, { '/*aa*/', '/* aa */', 'aa' }) + + set_commentstring(' /*%s*/ ') + validate(1, 3, { 'aa', ' aa ', ' aa ' }) + validate(2, 3, { '/*aa*/', ' aa ', ' aa ' }) + validate(3, 3, { '/*aa*/', '/* aa */', ' aa ' }) end) it('uncomments on inconsistent indent levels', function() -- cgit