From: Bram Moolenaar Date: Wed, 16 Mar 2022 13:09:15 +0000 (+0000) Subject: patch 8.2.4578: no warning when autoload script for completion has an error X-Git-Tag: v8.2.4578 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fe8e9f674036f3206b0080f4a931c991cf142f8b;p=vim patch 8.2.4578: no warning when autoload script for completion has an error Problem: No warning when an autoload script for completion function has an error. Solution: Do not ignore errors when a function name is given with a dot or '#' character. (closes #9958) --- diff --git a/src/eval.c b/src/eval.c index b55ae1a20..62266f884 100644 --- a/src/eval.c +++ b/src/eval.c @@ -695,6 +695,7 @@ call_vim_function( char_u *arg; char_u *name; char_u *tofree = NULL; + int ignore_errors; rettv->v_type = VAR_UNKNOWN; // clear_tv() uses this CLEAR_FIELD(funcexe); @@ -702,11 +703,18 @@ call_vim_function( funcexe.fe_lastline = curwin->w_cursor.lnum; funcexe.fe_evaluate = TRUE; - // The name might be "import.Func" or "Funcref". + // The name might be "import.Func" or "Funcref". We don't know, we need to + // ignore errors for an undefined name. But we do want errors when an + // autoload script has errors. Guess that when there is a dot or '#' in + // the name showing errors is the right choice. + ignore_errors = vim_strchr(func, '.') == NULL + && vim_strchr(func, AUTOLOAD_CHAR) == NULL; arg = func; - ++emsg_off; + if (ignore_errors) + ++emsg_off; name = deref_function_name(&arg, &tofree, &EVALARG_EVALUATE, FALSE); - --emsg_off; + if (ignore_errors) + --emsg_off; if (name == NULL) name = func; diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim index bdcecbfa2..20f932b30 100644 --- a/src/testdir/test_cmdline.vim +++ b/src/testdir/test_cmdline.vim @@ -4,6 +4,7 @@ source check.vim source screendump.vim source view_util.vim source shared.vim +import './vim9.vim' as v9 func SetUp() func SaveLastScreenLine() @@ -543,6 +544,32 @@ func Test_getcompletion() call assert_fails('call getcompletion("abc", [])', 'E475:') endfunc +func Test_complete_autoload_error() + let save_rtp = &rtp + let lines =<< trim END + vim9script + export def Complete(..._): string + return 'match' + enddef + echo this will cause an error + END + call mkdir('Xdir/autoload', 'p') + call writefile(lines, 'Xdir/autoload/script.vim') + exe 'set rtp+=' .. getcwd() .. '/Xdir' + + let lines =<< trim END + vim9script + import autoload 'script.vim' + command -nargs=* -complete=custom,script.Complete Cmd eval 0 + 0 + &wildcharm = char2nr("\") + feedkeys(":Cmd \", 'xt') + END + call v9.CheckScriptFailure(lines, 'E121: Undefined variable: this') + + let &rtp = save_rtp + call delete('Xdir', 'rf') +endfunc + func Test_fullcommand() let tests = { \ '': '', @@ -2671,8 +2698,7 @@ func Test_fuzzy_completion_userdefined_snr_func() endfunc set wildoptions=fuzzy call feedkeys(":call sendmail\\\"\", 'tx') - call assert_equal('"call SendSomemail() S1e2n3dmail() ' - \ .. expand("") .. 'Sendmail()', @:) + call assert_match('"call SendSomemail() S1e2n3dmail() \d\+_Sendmail()', @:) set wildoptions& delfunc s:Sendmail delfunc SendSomemail diff --git a/src/version.c b/src/version.c index ba0058b67..4c6920fbf 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 */ +/**/ + 4578, /**/ 4577, /**/