changeset 26356:0884f2be6c2a v8.2.3709

patch 8.2.3709: Vim9: backtick expression expanded when not desired Commit: https://github.com/vim/vim/commit/fad2742d538123abb9b384a053fd581f2acf6bb0 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Nov 30 21:58:19 2021 +0000 patch 8.2.3709: Vim9: backtick expression expanded when not desired Problem: Vim9: backtick expression expanded when not desired. Solution: Only expand a backtick expression for commands that expand their argument. Remove a few outdated TODO comments.
author Bram Moolenaar <Bram@vim.org>
date Tue, 30 Nov 2021 23:00:04 +0100
parents 106547a11f1c
children 058ce5b5b367
files src/testdir/test_vim9_cmd.vim src/version.c src/vim9compile.c
diffstat 3 files changed, 27 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_cmd.vim
+++ b/src/testdir/test_vim9_cmd.vim
@@ -206,6 +206,15 @@ def Test_folddo_backtick_expansion()
   folddoclose edit `=name`
   assert_equal('xxx', bufname())
   bwipe!
+
+  var lines =<< trim END
+      g:val = 'value'
+      def Test()
+        folddoopen echo `=g:val`
+      enddef
+      call Test()
+  END
+  CheckScriptFailure(lines, 'E15: Invalid expression: "`=g:val`"')
 enddef
 
 def Test_hardcopy_wildcards()
--- a/src/version.c
+++ b/src/version.c
@@ -754,6 +754,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    3709,
+/**/
     3708,
 /**/
     3707,
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -7898,8 +7898,7 @@ compile_elseif(char_u *arg, cctx_T *cctx
 	int error = FALSE;
 	int v;
 
-	// The expression results in a constant.
-	// TODO: how about nesting?
+	// The expression result is a constant.
 	v = tv_get_bool_chk(&ppconst.pp_tv[0], &error);
 	if (error)
 	    return NULL;
@@ -8171,7 +8170,6 @@ compile_for(char_u *arg_start, cctx_T *c
 		item_type = vartype->tt_member;
 	    else if (vartype->tt_member->tt_type == VAR_LIST
 			  && vartype->tt_member->tt_member->tt_type != VAR_ANY)
-		// TODO: should get the type for each lhs
 		item_type = vartype->tt_member->tt_member;
 	}
 
@@ -8224,7 +8222,7 @@ compile_for(char_u *arg_start, cctx_T *c
 		lhs_type = parse_type(&p, cctx->ctx_type_list, TRUE);
 	    }
 
-	    // TODO: script var not supported?
+	    // Script var is not supported.
 	    if (get_var_dest(name, &dest, CMD_for, &opt_flags,
 					      &vimvaridx, &type, cctx) == FAIL)
 		goto failed;
@@ -8771,21 +8769,21 @@ compile_finally(char_u *arg, cctx_T *cct
 #ifdef FEAT_PROFILE
 	if (cctx->ctx_compile_type == CT_PROFILE
 		&& ((isn_T *)instr->ga_data)[this_instr - 1]
-						       .isn_type == ISN_PROF_START)
+						   .isn_type == ISN_PROF_START)
 	{
 	    // jump to the profile start of the "finally"
 	    --this_instr;
 
 	    // jump to the profile end above it
 	    if (this_instr > 0 && ((isn_T *)instr->ga_data)[this_instr - 1]
-							 .isn_type == ISN_PROF_END)
+						     .isn_type == ISN_PROF_END)
 		--this_instr;
 	}
 #endif
 
 	// Fill in the "end" label in jumps at the end of the blocks.
 	compile_fill_jump_to_end(&scope->se_u.se_try.ts_end_label,
-								this_instr, cctx);
+							     this_instr, cctx);
 
 	// If there is no :catch then an exception jumps to :finally.
 	if (isn->isn_arg.try.try_ref->try_catch == 0)
@@ -8800,8 +8798,6 @@ compile_finally(char_u *arg, cctx_T *cct
 	}
 	if (generate_instr(cctx, ISN_FINALLY) == NULL)
 	    return NULL;
-
-	// TODO: set index in ts_finally_label jumps
     }
 
     return arg;
@@ -9184,9 +9180,17 @@ compile_exec(char_u *line_arg, exarg_T *
 
     if (eap->cmdidx == CMD_folddoopen || eap->cmdidx == CMD_folddoclosed)
     {
-	// TODO: should only expand when appropriate for the command
-	eap->arg = skiptowhite(eap->arg);
-	has_expr = TRUE;
+	exarg_T nea;
+
+	CLEAR_FIELD(nea);
+	nea.cmd = eap->arg;
+	p = find_ex_command(&nea, NULL, lookup_scriptitem, NULL);
+	if (nea.cmdidx <= CMD_SIZE)
+	{
+	    has_expr = excmd_get_argt(nea.cmdidx) & (EX_XFILE | EX_EXPAND);
+	    if (has_expr)
+		eap->arg = skiptowhite(eap->arg);
+	}
     }
 
     if (has_expr && (p = (char_u *)strstr((char *)eap->arg, "`=")) != NULL)