changeset 24909:09d222e89a84 v8.2.2992

patch 8.2.2992: Vim9: completion for :disassemble is incomplete Commit: https://github.com/vim/vim/commit/4ee9d8e04daa97a3d0a19d7d2eed76b7721301e6 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jun 13 18:38:48 2021 +0200 patch 8.2.2992: Vim9: completion for :disassemble is incomplete Problem: Vim9: completion for :disassemble is incomplete. Solution: Recognize the "debug" and "profile" arguments.
author Bram Moolenaar <Bram@vim.org>
date Sun, 13 Jun 2021 18:45:03 +0200
parents f2d35a98ae9c
children 77de4ae3e013
files src/cmdexpand.c src/proto/vim9execute.pro src/testdir/test_cmdline.vim src/version.c src/vim.h src/vim9execute.c
diffstat 6 files changed, 53 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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
--- a/src/proto/vim9execute.pro
+++ b/src/proto/vim9execute.pro
@@ -7,6 +7,8 @@ int fill_partial_and_closure(partial_T *
 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);
--- 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\<C-A>\<C-B>\"\<CR>", 'xt')
   call assert_equal("\"legac call strlen(", @:)
 
+  " completion for the :disassemble command
+  call feedkeys(":disas deb\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"disas debug", @:)
+  call feedkeys(":disas pro\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"disas profile", @:)
+  call feedkeys(":disas debug Test_cmdline_complete_var\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"disas debug Test_cmdline_complete_various", @:)
+  call feedkeys(":disas profile Test_cmdline_complete_var\<C-A>\<C-B>\"\<CR>", 'xt')
+  call assert_equal("\"disas profile Test_cmdline_complete_various", @:)
+
   " completion for the :match command
   call feedkeys(":match Search /pat/\<C-A>\<C-B>\"\<CR>", 'xt')
   call assert_equal("\"match Search /pat/\<C-A>", @:)
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2992,
+/**/
     2991,
 /**/
     2990,
--- a/src/vim.h
+++ b/src/vim.h
@@ -777,6 +777,7 @@ extern int (*dyn_libintl_wputenv)(const 
 #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
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -5371,6 +5371,40 @@ list_instructions(char *pfx, isn_T *inst
 }
 
 /*
+ * 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,
  * so always include this.