0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 9.1.0994: Vim9: not able to use comment after opening curly brace

Problem:  Vim9: not able to use comment after opening curly brace
          (lifepillar)
Solution: allow to use comments after curly braces of an inner-block,
          modify the logic to search for comment in a line, update Vim9
          tests to use specific class type instead of any
          (Yegappan Lakshmanan)

fixes: #16363
closes: #16405

Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Yegappan Lakshmanan
2025-01-07 20:22:32 +01:00
committed by Christian Brabandt
parent c97e869535
commit 0072ceedc6
5 changed files with 149 additions and 16 deletions

View File

@@ -859,6 +859,92 @@ function_using_block_scopes(ufunc_T *fp, cstack_T *cstack)
cstack->cs_flags[i] |= CSF_FUNC_DEF;
}
/*
* Skip over all the characters in a single quoted string starting at "p" and
* return a pointer to the character following the ending single quote.
* If the ending single quote is missing, then return a pointer to the NUL
* character.
*/
static char_u *
skip_single_quote_string(char_u *p)
{
p++; // skip the beginning single quote
while (*p != NUL)
{
// Within the string, a single quote can be escaped by using
// two single quotes.
if (*p == '\'' && *(p + 1) == '\'')
p += 2;
else if (*p == '\'')
{
p++; // skip the ending single quote
break;
}
else
MB_PTR_ADV(p);
}
return p;
}
/*
* Skip over all the characters in a double quoted string starting at "p" and
* return a pointer to the character following the ending double quote.
* If the ending double quote is missing, then return a pointer to the NUL
* character.
*/
static char_u *
skip_double_quote_string(char_u *p)
{
p++; // skip the beginning double quote
while (*p != NUL)
{
// Within the string, a double quote can be escaped by
// preceding it with a backslash.
if (*p == '\\' && *(p + 1) == '"')
p += 2;
else if (*p == '"')
{
p++; // skip the ending double quote
break;
}
else
MB_PTR_ADV(p);
}
return p;
}
/*
* Return the start of a Vim9 comment (#) in the line starting at "line".
* If a comment is not found, then returns a pointer to the end of the
* string (NUL).
*/
static char_u *
find_start_of_vim9_comment(char_u *line)
{
char_u *p = line;
while (*p != NUL)
{
if (*p == '\'')
// Skip a single quoted string.
p = skip_single_quote_string(p);
else if (*p == '"')
// Skip a double quoted string.
p = skip_double_quote_string(p);
else
{
if (*p == '#')
// Found the start of a Vim9 comment
break;
MB_PTR_ADV(p);
}
}
return p;
}
/*
* Read the body of a function, put every line in "newlines".
* This stops at "}", "endfunction" or "enddef".
@@ -1123,7 +1209,17 @@ get_function_body(
if (nesting_def[nesting] ? *p != '#' : *p != '"')
{
// Not a comment line: check for nested inline function.
end = p + STRLEN(p) - 1;
if (nesting_inline[nesting])
{
// A comment (#) can follow the opening curly brace of a
// block statement. Need to ignore the comment and look
// for the opening curly brace before the comment.
end = find_start_of_vim9_comment(p) - 1;
}
else
end = p + STRLEN(p) - 1;
while (end > p && VIM_ISWHITE(*end))
--end;
if (end > p + 1 && *end == '{' && VIM_ISWHITE(end[-1]))