From 4ee9d8e04daa97a3d0a19d7d2eed76b7721301e6 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 13 Jun 2021 18:38:48 +0200 Subject: [PATCH] patch 8.2.2992: Vim9: completion for :disassemble is incomplete Problem: Vim9: completion for :disassemble is incomplete. Solution: Recognize the "debug" and "profile" arguments. --- src/cmdexpand.c | 5 ++++- src/proto/vim9execute.pro | 2 ++ src/testdir/test_cmdline.vim | 10 ++++++++++ src/version.c | 2 ++ src/vim.h | 1 + src/vim9execute.c | 34 ++++++++++++++++++++++++++++++++++ 6 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/cmdexpand.c b/src/cmdexpand.c index ba31e928c..9b6d9aa81 100644 --- a/src/cmdexpand.c +++ b/src/cmdexpand.c @@ -1557,10 +1557,12 @@ set_one_cmd_context( case CMD_function: case CMD_delfunction: - case CMD_disassemble: xp->xp_context = EXPAND_USER_FUNC; xp->xp_pattern = arg; break; + case CMD_disassemble: + set_context_in_disassemble_cmd(xp, arg); + break; case CMD_echohl: set_context_in_echohl_cmd(xp, arg); @@ -2120,6 +2122,7 @@ ExpandFromContext( {EXPAND_USER_VARS, get_user_var_name, FALSE, TRUE}, {EXPAND_FUNCTIONS, get_function_name, FALSE, TRUE}, {EXPAND_USER_FUNC, get_user_func_name, FALSE, TRUE}, + {EXPAND_DISASSEMBLE, get_disassemble_argument, FALSE, TRUE}, {EXPAND_EXPRESSION, get_expr_name, FALSE, TRUE}, # endif # ifdef FEAT_MENU diff --git a/src/proto/vim9execute.pro b/src/proto/vim9execute.pro index 4b6444a34..5712fcf76 100644 --- a/src/proto/vim9execute.pro +++ b/src/proto/vim9execute.pro @@ -7,6 +7,8 @@ int fill_partial_and_closure(partial_T *pt, ufunc_T *ufunc, ectx_T *ectx); int exe_typval_instr(typval_T *tv, typval_T *rettv); char_u *exe_substitute_instr(void); int call_def_function(ufunc_T *ufunc, int argc_arg, typval_T *argv, partial_T *partial, typval_T *rettv); +void set_context_in_disassemble_cmd(expand_T *xp, char_u *arg); +char_u *get_disassemble_argument(expand_T *xp, int idx); void ex_disassemble(exarg_T *eap); int tv2bool(typval_T *tv); void emsg_using_string_as(typval_T *tv, int as_number); diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim index a05d010d4..90afe4516 100644 --- a/src/testdir/test_cmdline.vim +++ b/src/testdir/test_cmdline.vim @@ -810,6 +810,16 @@ func Test_cmdline_complete_various() call feedkeys(":legac call strle\\\"\", 'xt') call assert_equal("\"legac call strlen(", @:) + " completion for the :disassemble command + call feedkeys(":disas deb\\\"\", 'xt') + call assert_equal("\"disas debug", @:) + call feedkeys(":disas pro\\\"\", 'xt') + call assert_equal("\"disas profile", @:) + call feedkeys(":disas debug Test_cmdline_complete_var\\\"\", 'xt') + call assert_equal("\"disas debug Test_cmdline_complete_various", @:) + call feedkeys(":disas profile Test_cmdline_complete_var\\\"\", 'xt') + call assert_equal("\"disas profile Test_cmdline_complete_various", @:) + " completion for the :match command call feedkeys(":match Search /pat/\\\"\", 'xt') call assert_equal("\"match Search /pat/\", @:) diff --git a/src/version.c b/src/version.c index 07c775b41..441826b95 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2992, /**/ 2991, /**/ diff --git a/src/vim.h b/src/vim.h index 05af5a188..22fe8d5fe 100644 --- a/src/vim.h +++ b/src/vim.h @@ -777,6 +777,7 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring); #define EXPAND_MAPCLEAR 47 #define EXPAND_ARGLIST 48 #define EXPAND_DIFF_BUFFERS 49 +#define EXPAND_DISASSEMBLE 50 // Values for exmode_active (0 is no exmode) #define EXMODE_NORMAL 1 diff --git a/src/vim9execute.c b/src/vim9execute.c index 04c1ee2f2..d55fa0c9d 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -5370,6 +5370,40 @@ list_instructions(char *pfx, isn_T *instr, int instr_count, ufunc_T *ufunc) } } +/* + * Handle command line completion for the :disassemble command. + */ + void +set_context_in_disassemble_cmd(expand_T *xp, char_u *arg) +{ + char_u *p; + + // Default: expand user functions, "debug" and "profile" + xp->xp_context = EXPAND_DISASSEMBLE; + xp->xp_pattern = arg; + + // first argument already typed: only user function names + if (*arg != NUL && *(p = skiptowhite(arg)) != NUL) + { + xp->xp_context = EXPAND_USER_FUNC; + xp->xp_pattern = skipwhite(p); + } +} + +/* + * Function given to ExpandGeneric() to obtain the list of :disassemble + * arguments. + */ + char_u * +get_disassemble_argument(expand_T *xp, int idx) +{ + if (idx == 0) + return (char_u *)"debug"; + if (idx == 1) + return (char_u *)"profile"; + return get_user_func_name(xp, idx - 2); +} + /* * ":disassemble". * We don't really need this at runtime, but we do have tests that require it, -- 2.50.1