0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

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)
This commit is contained in:
Bram Moolenaar 2022-03-16 13:09:15 +00:00
parent 9323ca51c2
commit fe8e9f6740
3 changed files with 41 additions and 5 deletions

View File

@ -695,6 +695,7 @@ call_vim_function(
char_u *arg; char_u *arg;
char_u *name; char_u *name;
char_u *tofree = NULL; char_u *tofree = NULL;
int ignore_errors;
rettv->v_type = VAR_UNKNOWN; // clear_tv() uses this rettv->v_type = VAR_UNKNOWN; // clear_tv() uses this
CLEAR_FIELD(funcexe); CLEAR_FIELD(funcexe);
@ -702,11 +703,18 @@ call_vim_function(
funcexe.fe_lastline = curwin->w_cursor.lnum; funcexe.fe_lastline = curwin->w_cursor.lnum;
funcexe.fe_evaluate = TRUE; 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; arg = func;
++emsg_off; if (ignore_errors)
++emsg_off;
name = deref_function_name(&arg, &tofree, &EVALARG_EVALUATE, FALSE); name = deref_function_name(&arg, &tofree, &EVALARG_EVALUATE, FALSE);
--emsg_off; if (ignore_errors)
--emsg_off;
if (name == NULL) if (name == NULL)
name = func; name = func;

View File

@ -4,6 +4,7 @@ source check.vim
source screendump.vim source screendump.vim
source view_util.vim source view_util.vim
source shared.vim source shared.vim
import './vim9.vim' as v9
func SetUp() func SetUp()
func SaveLastScreenLine() func SaveLastScreenLine()
@ -543,6 +544,32 @@ func Test_getcompletion()
call assert_fails('call getcompletion("abc", [])', 'E475:') call assert_fails('call getcompletion("abc", [])', 'E475:')
endfunc 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("\<Tab>")
feedkeys(":Cmd \<Tab>", 'xt')
END
call v9.CheckScriptFailure(lines, 'E121: Undefined variable: this')
let &rtp = save_rtp
call delete('Xdir', 'rf')
endfunc
func Test_fullcommand() func Test_fullcommand()
let tests = { let tests = {
\ '': '', \ '': '',
@ -2671,8 +2698,7 @@ func Test_fuzzy_completion_userdefined_snr_func()
endfunc endfunc
set wildoptions=fuzzy set wildoptions=fuzzy
call feedkeys(":call sendmail\<C-A>\<C-B>\"\<CR>", 'tx') call feedkeys(":call sendmail\<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"call SendSomemail() S1e2n3dmail() ' call assert_match('"call SendSomemail() S1e2n3dmail() <SNR>\d\+_Sendmail()', @:)
\ .. expand("<SID>") .. 'Sendmail()', @:)
set wildoptions& set wildoptions&
delfunc s:Sendmail delfunc s:Sendmail
delfunc SendSomemail delfunc SendSomemail

View File

@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
4578,
/**/ /**/
4577, 4577,
/**/ /**/