From 0a5a0efda64ccc789cda25b90fa907f277006cd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maria=20Jos=C3=A9=20Solano?= Date: Sun, 2 Mar 2025 13:44:13 -0800 Subject: [PATCH] feat(lua): don't complete private (_) fields after dot (.) #32690 --- runtime/lua/vim/_editor.lua | 2 ++ .../lua/command_line_completion_spec.lua | 24 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/runtime/lua/vim/_editor.lua b/runtime/lua/vim/_editor.lua index 94168bea5d..975f3fea4a 100644 --- a/runtime/lua/vim/_editor.lua +++ b/runtime/lua/vim/_editor.lua @@ -913,6 +913,7 @@ function vim._expand_pat(pat, env) local match_part = string.sub(last_part, search_index, #last_part) local prefix_match_pat = string.sub(pat, 1, #pat - #match_part) or '' + local last_char = string.sub(last_part, #last_part) local final_env = env @@ -971,6 +972,7 @@ function vim._expand_pat(pat, env) type(k) == 'string' and string.sub(k, 1, string.len(match_part)) == match_part and k:match('^[_%w]+$') ~= nil -- filter out invalid identifiers for field, e.g. 'foo#bar' + and (last_char ~= '.' or string.sub(k, 1, 1) ~= '_') -- don't include private fields after '.' then keys[k] = true end diff --git a/test/functional/lua/command_line_completion_spec.lua b/test/functional/lua/command_line_completion_spec.lua index f8786a45bb..ae0ab19d6b 100644 --- a/test/functional/lua/command_line_completion_spec.lua +++ b/test/functional/lua/command_line_completion_spec.lua @@ -107,6 +107,30 @@ describe('nlua_expand_pat', function() eq({ { 'set' }, 11 }, get_completions('vim.keymap.se')) end) + it('should exclude private fields after "."', function() + eq( + { { 'bar' }, 4 }, + get_completions('foo.', { + foo = { + _bar = true, + bar = true, + }, + }) + ) + end) + + it('should include private fields after "._"', function() + eq( + { { '_bar' }, 4 }, + get_completions('foo._', { + foo = { + _bar = true, + bar = true, + }, + }) + ) + end) + it('should be able to interpolate globals', function() eq( { {