mirror of
https://github.com/vim/vim.git
synced 2025-09-23 03:43:49 -04:00
patch 8.2.2264: Vim9: no error for mismatched :endfunc or :enddef
Problem: Vim9: no error for mismatched :endfunc or :enddef. Solution: Check for the mismatch. (issue #7582)
This commit is contained in:
@@ -3404,35 +3404,51 @@ define_function(exarg_T *eap, char_u *name_arg)
|
||||
|
||||
// Check for "endfunction" or "enddef".
|
||||
if (checkforcmd(&p, nesting_def[nesting]
|
||||
? "enddef" : "endfunction", 4) && nesting-- == 0)
|
||||
? "enddef" : "endfunction", 4))
|
||||
{
|
||||
char_u *nextcmd = NULL;
|
||||
|
||||
if (*p == '|')
|
||||
nextcmd = p + 1;
|
||||
else if (line_arg != NULL && *skipwhite(line_arg) != NUL)
|
||||
nextcmd = line_arg;
|
||||
else if (*p != NUL && *p != '"' && p_verbose > 0)
|
||||
give_warning2(eap->cmdidx == CMD_def
|
||||
? (char_u *)_("W1001: Text found after :enddef: %s")
|
||||
: (char_u *)_("W22: Text found after :endfunction: %s"),
|
||||
p, TRUE);
|
||||
if (nextcmd != NULL)
|
||||
if (nesting-- == 0)
|
||||
{
|
||||
// Another command follows. If the line came from "eap" we
|
||||
// can simply point into it, otherwise we need to change
|
||||
// "eap->cmdlinep".
|
||||
eap->nextcmd = nextcmd;
|
||||
if (line_to_free != NULL)
|
||||
char_u *nextcmd = NULL;
|
||||
|
||||
if (*p == '|')
|
||||
nextcmd = p + 1;
|
||||
else if (line_arg != NULL && *skipwhite(line_arg) != NUL)
|
||||
nextcmd = line_arg;
|
||||
else if (*p != NUL && *p != '"' && p_verbose > 0)
|
||||
give_warning2(eap->cmdidx == CMD_def
|
||||
? (char_u *)_("W1001: Text found after :enddef: %s")
|
||||
: (char_u *)_("W22: Text found after :endfunction: %s"),
|
||||
p, TRUE);
|
||||
if (nextcmd != NULL)
|
||||
{
|
||||
vim_free(*eap->cmdlinep);
|
||||
*eap->cmdlinep = line_to_free;
|
||||
line_to_free = NULL;
|
||||
// Another command follows. If the line came from "eap"
|
||||
// we can simply point into it, otherwise we need to
|
||||
// change "eap->cmdlinep".
|
||||
eap->nextcmd = nextcmd;
|
||||
if (line_to_free != NULL)
|
||||
{
|
||||
vim_free(*eap->cmdlinep);
|
||||
*eap->cmdlinep = line_to_free;
|
||||
line_to_free = NULL;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// Check for mismatched "endfunc" or "enddef".
|
||||
// We don't check for "def" inside "func" thus we also can't check
|
||||
// for "enddef".
|
||||
// We continue to find the end of the function, although we might
|
||||
// not find it.
|
||||
else if (nesting_def[nesting])
|
||||
{
|
||||
if (checkforcmd(&p, "endfunction", 4))
|
||||
emsg(_(e_mismatched_endfunction));
|
||||
}
|
||||
else if (eap->cmdidx == CMD_def && checkforcmd(&p, "enddef", 4))
|
||||
emsg(_(e_mismatched_enddef));
|
||||
|
||||
// Increase indent inside "if", "while", "for" and "try", decrease
|
||||
// at "end".
|
||||
if (indent > 2 && (*p == '}' || STRNCMP(p, "end", 3) == 0))
|
||||
|
Reference in New Issue
Block a user