Skip to content

Commit

Permalink
patch 9.0.0837: append() reports failure when not appending anything
Browse files Browse the repository at this point in the history
Problem:    append() reports failure when not appending anything.
Solution:   Only report failure when appending something. (closes #11498)
  • Loading branch information
brammool committed Nov 5, 2022
1 parent 91c75d1 commit cd9c8d4
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 22 deletions.
22 changes: 14 additions & 8 deletions runtime/doc/builtin.txt
Expand Up @@ -806,8 +806,10 @@ append({lnum}, {text}) *append()*
{lnum} can be zero to insert a line before the first one.
{lnum} is used like with |getline()|.
Returns 1 for failure ({lnum} out of range or out of memory),
0 for success. In |Vim9| script an invalid argument or
negative number results in an error. Example: >
0 for success. When {text} is an empty list zero is returned,
no matter the value of {lnum}.
In |Vim9| script an invalid argument or negative number
results in an error. Example: >
:let failed = append(line('$'), "# THE END")
:let failed = append(0, ["Chapter 1", "the beginning"])
Expand Down Expand Up @@ -835,7 +837,9 @@ appendbufline({buf}, {lnum}, {text}) *appendbufline()*
If {buf} is not a valid buffer or {lnum} is not valid, an
error message is given. Example: >
:let failed = appendbufline(13, 0, "# THE START")
<
< However, when {text} is an empty list then no error is given
for an invalid {lnum}, since {lnum} isn't actually used.

Can also be used as a |method| after a List, the base is
passed as the second argument: >
mylist->appendbufline(buf, lnum)
Expand Down Expand Up @@ -981,7 +985,7 @@ autocmd_add({acmds}) *autocmd_add()*
let acmd.bufnr = 5
let acmd.cmd = 'call BufEnterFunc()'
call autocmd_add([acmd])
<
Can also be used as a |method|: >
GetAutocmdList()->autocmd_add()
<
Expand Down Expand Up @@ -7873,9 +7877,10 @@ setbufline({buf}, {lnum}, {text}) *setbufline()*
To insert lines use |appendbufline()|.
Any text properties in {lnum} are cleared.

{text} can be a string to set one line, or a list of strings
to set multiple lines. If the list extends below the last
line then those lines are added.
{text} can be a string to set one line, or a List of strings
to set multiple lines. If the List extends below the last
line then those lines are added. If the List is empty then
nothing is changed and zero is returned.

For the use of {buf}, see |bufname()| above.

Expand Down Expand Up @@ -8060,7 +8065,8 @@ setline({lnum}, {text}) *setline()*
When {lnum} is just below the last line the {text} will be
added below the last line.
{text} can be any type or a List of any type, each item is
converted to a String.
converted to a String. When {text} is an empty List then
nothing is changed and FALSE is returned.

If this succeeds, FALSE is returned. If this fails (most likely
because {lnum} is invalid) TRUE is returned.
Expand Down
4 changes: 1 addition & 3 deletions src/evalbuffer.c
Expand Up @@ -175,9 +175,7 @@ set_buffer_lines(
l = lines->vval.v_list;
if (l == NULL || list_len(l) == 0)
{
// set proper return code
if (lnum > curbuf->b_ml.ml_line_count)
rettv->vval.v_number = 1; // FAIL
// not appending anything always succeeds
goto done;
}
CHECK_LIST_MATERIALIZE(l);
Expand Down
17 changes: 11 additions & 6 deletions src/testdir/test_bufline.vim
Expand Up @@ -23,8 +23,8 @@ func Test_setbufline_getbufline()

call assert_equal(1, setbufline(b, 5, 'x'))
call assert_equal(1, setbufline(b, 5, ['x']))
call assert_equal(1, setbufline(b, 5, []))
call assert_equal(1, setbufline(b, 5, test_null_list()))
call assert_equal(0, setbufline(b, 5, []))
call assert_equal(0, setbufline(b, 5, test_null_list()))

call assert_equal(1, 'x'->setbufline(bufnr('$') + 1, 1))
call assert_equal(1, ['x']->setbufline(bufnr('$') + 1, 1))
Expand Down Expand Up @@ -86,6 +86,11 @@ func Test_setline_startup()
sleep 50m
call assert_equal(['Hello'], readfile('Xtest'))

call assert_equal(0, setline(1, []))
call assert_equal(0, setline(1, test_null_list()))
call assert_equal(0, setline(5, []))
call assert_equal(0, setline(6, test_null_list()))

call delete('Xtest')
endfunc

Expand All @@ -112,8 +117,8 @@ func Test_appendbufline()

call assert_equal(1, appendbufline(b, 4, 'x'))
call assert_equal(1, appendbufline(b, 4, ['x']))
call assert_equal(1, appendbufline(b, 4, []))
call assert_equal(1, appendbufline(b, 4, test_null_list()))
call assert_equal(0, appendbufline(b, 4, []))
call assert_equal(0, appendbufline(b, 4, test_null_list()))

call assert_equal(1, appendbufline(1234, 1, 'x'))
call assert_equal(1, appendbufline(1234, 1, ['x']))
Expand All @@ -122,8 +127,8 @@ func Test_appendbufline()

call assert_equal(0, appendbufline(b, 1, []))
call assert_equal(0, appendbufline(b, 1, test_null_list()))
call assert_equal(1, appendbufline(b, 3, []))
call assert_equal(1, appendbufline(b, 3, test_null_list()))
call assert_equal(0, appendbufline(b, 3, []))
call assert_equal(0, appendbufline(b, 3, test_null_list()))

call assert_equal(['a', 'b', 'c'], getbufline(b, 1, '$'))

Expand Down
10 changes: 7 additions & 3 deletions src/testdir/test_functions.vim
Expand Up @@ -939,9 +939,13 @@ endfunc
func Test_append()
enew!
split
call append(0, ["foo"])
call append(1, [])
call append(1, test_null_list())
call assert_equal(0, append(1, []))
call assert_equal(0, append(1, test_null_list()))
call assert_equal(0, append(0, ["foo"]))
call assert_equal(0, append(1, []))
call assert_equal(0, append(1, test_null_list()))
call assert_equal(0, append(8, []))
call assert_equal(0, append(9, test_null_list()))
call assert_equal(['foo', ''], getline(1, '$'))
split
only
Expand Down
4 changes: 2 additions & 2 deletions src/testdir/test_vim9_builtin.vim
Expand Up @@ -3721,8 +3721,8 @@ def Test_set_get_bufline()

assert_equal(1, setbufline(b, 5, 'x'))
assert_equal(1, setbufline(b, 5, ['x']))
assert_equal(1, setbufline(b, 5, []))
assert_equal(1, setbufline(b, 5, test_null_list()))
assert_equal(0, setbufline(b, 5, []))
assert_equal(0, setbufline(b, 5, test_null_list()))

assert_equal(1, 'x'->setbufline(bufnr('$') + 1, 1))
assert_equal(1, ['x']->setbufline(bufnr('$') + 1, 1))
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -695,6 +695,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
837,
/**/
836,
/**/
Expand Down

0 comments on commit cd9c8d4

Please sign in to comment.