Patch 8.2.4462
Problem: Not enough testing for quickfix code.
Solution: Add more tests. Fix uncovered problem. (Yegappan Lakshmanan,
closes #9839)
Files: src/quickfix.c, src/window.c, src/testdir/test_makeencoding.vim,
src/testdir/test_quickfix.vim
*** ../vim-8.2.4461/src/quickfix.c 2022-02-23 12:05:54.486835944 +0000
--- src/quickfix.c 2022-02-24 12:21:24.010874123 +0000
***************
*** 2086,2092 ****
/*
* Add an entry to the end of the list of errors.
! * Returns QF_OK or QF_FAIL.
*/
static int
qf_add_entry(
--- 2086,2092 ----
/*
* Add an entry to the end of the list of errors.
! * Returns QF_OK on success or QF_FAIL on a memory allocation failure.
*/
static int
qf_add_entry(
***************
*** 4051,4059 ****
{
qf_info_T *qi = &ql_info;
- if (!bt_quickfix(curbuf))
- return;
-
if (IS_LL_WINDOW(curwin))
qi = GET_LOC_LIST(curwin);
--- 4051,4056 ----
***************
*** 4525,4532 ****
--- 4522,4533 ----
win = curwin;
else
{
+ // Find the file window (non-quickfix) with this location list
win = qf_find_win_with_loclist(qi);
if (win == NULL)
+ // File window is not found. Find the location list window.
+ win = qf_find_win(qi);
+ if (win == NULL)
return;
}
qf_winid = win->w_id;
***************
*** 8343,8349 ****
if (new_qi)
ll_free_all(&qi);
}
! else if (curwin->w_llist == NULL)
curwin->w_llist = qi;
}
}
--- 8344,8352 ----
if (new_qi)
ll_free_all(&qi);
}
! else if (curwin->w_llist == NULL && new_qi)
! // current window didn't have a location list associated with it
! // before. Associate the new location list now.
curwin->w_llist = qi;
}
}
*** ../vim-8.2.4461/src/window.c 2022-02-23 12:23:04.501304722 +0000
--- src/window.c 2022-02-24 12:21:24.010874123 +0000
***************
*** 4959,4965 ****
/*
* Jump to the first open window in any tab page that contains buffer "buf",
! * if one exists.
* Returns a pointer to the window found, otherwise NULL.
*/
win_T *
--- 4959,4965 ----
/*
* Jump to the first open window in any tab page that contains buffer "buf",
! * if one exists. First search in the windows present in the current tab page.
* Returns a pointer to the window found, otherwise NULL.
*/
win_T *
*** ../vim-8.2.4461/src/testdir/test_makeencoding.vim 2020-08-12
17:50:31.879655802 +0100
--- src/testdir/test_makeencoding.vim 2022-02-24 12:21:24.010874123 +0000
***************
*** 103,106 ****
--- 103,120 ----
endfor
endfunc
+ " Test for an error file with a long line that needs an encoding conversion
+ func Test_longline_conversion()
+ new
+ call setline(1, ['Xfile:10:' .. repeat("\xe0", 2000)])
+ write ++enc=latin1 Xerr.out
+ bw!
+ set errorformat&
+ set makeencoding=latin1
+ cfile Xerr.out
+ call assert_equal(repeat("\u00e0", 2000), getqflist()[0].text)
+ call delete('Xerr.out')
+ set makeencoding&
+ endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
*** ../vim-8.2.4461/src/testdir/test_quickfix.vim 2022-02-23
12:05:54.486835944 +0000
--- src/testdir/test_quickfix.vim 2022-02-24 12:21:24.010874123 +0000
***************
*** 254,259 ****
--- 254,260 ----
" Opening the location list window without any errors should fail
if a:cchar == 'l'
call assert_fails('lopen', 'E776:')
+ call assert_fails('lwindow', 'E776:')
endif
" Create a list with no valid entries
***************
*** 739,750 ****
silent helpgrep grail
assert_equal('aABceFs', &cpo)
! delete(dir, 'rf')
&rtp = rtp_save
cclose
helpclose
enddef
func Test_helpgrep_restore_cpo_aucmd()
let save_cpo = &cpo
augroup QF_Test
--- 740,753 ----
silent helpgrep grail
assert_equal('aABceFs', &cpo)
! delete('Xruntime', 'rf')
&rtp = rtp_save
cclose
helpclose
enddef
+ " When running the :helpgrep command, if an autocmd modifies the 'cpoptions'
+ " value, then Vim crashes. (issue fixed by 7.2b-004 and 8.2.4453)
func Test_helpgrep_restore_cpo_aucmd()
let save_cpo = &cpo
augroup QF_Test
***************
*** 1281,1288 ****
--- 1284,1297 ----
set efm=
call assert_fails('Xexpr "abc.txt:1:Hello world"', 'E378:')
+ " Empty directory name. When there is an error in parsing new entries, make
+ " sure the previous quickfix list is made the current list.
+ set efm&
+ cexpr ["one", "two"]
+ let qf_id = getqflist(#{id: 0}).id
set efm=%DEntering\ dir\ abc,%f:%l:%m
call assert_fails('Xexpr ["Entering dir abc", "abc.txt:1:Hello world"]',
'E379:')
+ call assert_equal(qf_id, getqflist(#{id: 0}).id)
let &efm = save_efm
endfunc
***************
*** 1535,1541 ****
endfunc
endif
! augroup testgroup
au!
autocmd BufReadCmd test_changed.txt call ReadFunc()
augroup END
--- 1544,1550 ----
endfunc
endif
! augroup QF_Test
au!
autocmd BufReadCmd test_changed.txt call ReadFunc()
augroup END
***************
*** 1549,1555 ****
endfor
call assert_fails('Xrewind', ErrorNr . ':')
! augroup! testgroup
endfunc
func Test_quickfix_was_changed_by_autocmd()
--- 1558,1581 ----
endfor
call assert_fails('Xrewind', ErrorNr . ':')
! augroup QF_Test
! au!
! augroup END
!
! if a:cchar == 'c'
! cexpr ["Xtest1:1:Line"]
! cwindow
! only
! augroup QF_Test
! au!
! autocmd WinEnter * call setqflist([], 'f')
! augroup END
! call assert_fails('exe "normal \<CR>"', 'E925:')
! augroup QF_Test
! au!
! augroup END
! endif
! %bw!
endfunc
func Test_quickfix_was_changed_by_autocmd()
***************
*** 1688,1693 ****
--- 1714,1721 ----
call g:Xsetlist([[1, 2,3]])
call assert_equal(0, len(g:Xgetlist()))
call assert_fails('call g:Xsetlist([], [])', 'E928:')
+ call g:Xsetlist([test_null_dict()])
+ call assert_equal([], g:Xgetlist())
endfunc
func Test_setqflist()
***************
*** 2967,2972 ****
--- 2995,3013 ----
call assert_equal(0, getbufinfo('Xtestfile1')[0].loaded)
call assert_equal([], getbufinfo('Xtestfile2'))
+ " Test for opening the dummy buffer used by vimgrep in a window. The new
+ " window should be closed
+ %bw!
+ augroup QF_Test
+ au!
+ autocmd BufReadPre * exe "sb " .. expand("<abuf>")
+ augroup END
+ call assert_fails("Xvimgrep /sublime/ Xtestfile1", 'E480:')
+ call assert_equal(1, winnr('$'))
+ augroup QF_Test
+ au!
+ augroup END
+
call delete('Xtestfile1')
call delete('Xtestfile2')
endfunc
***************
*** 4133,4146 ****
" The following test used to crash Vim
func Test_lhelpgrep_autocmd()
lhelpgrep quickfix
! autocmd QuickFixCmdPost * call setloclist(0, [], 'f')
lhelpgrep buffer
call assert_equal('help', &filetype)
call assert_equal(0, getloclist(0, {'nr' : '$'}).nr)
lhelpgrep tabpage
call assert_equal('help', &filetype)
call assert_equal(1, getloclist(0, {'nr' : '$'}).nr)
! au! QuickFixCmdPost
new | only
augroup QF_Test
--- 4174,4192 ----
" The following test used to crash Vim
func Test_lhelpgrep_autocmd()
lhelpgrep quickfix
! augroup QF_Test
! au!
! autocmd QuickFixCmdPost * call setloclist(0, [], 'f')
! augroup END
lhelpgrep buffer
call assert_equal('help', &filetype)
call assert_equal(0, getloclist(0, {'nr' : '$'}).nr)
lhelpgrep tabpage
call assert_equal('help', &filetype)
call assert_equal(1, getloclist(0, {'nr' : '$'}).nr)
! augroup QF_Test
! au!
! augroup END
new | only
augroup QF_Test
***************
*** 4153,4159 ****
wincmd w
call assert_fails('helpgrep quickfix', 'E925:')
augroup QF_Test
! au! BufEnter
augroup END
new | only
--- 4199,4205 ----
wincmd w
call assert_fails('helpgrep quickfix', 'E925:')
augroup QF_Test
! au!
augroup END
new | only
***************
*** 4163,4169 ****
augroup END
call assert_fails('helpgrep quickfix', 'E925:')
augroup QF_Test
! au! BufEnter
augroup END
new | only
--- 4209,4215 ----
augroup END
call assert_fails('helpgrep quickfix', 'E925:')
augroup QF_Test
! au!
augroup END
new | only
***************
*** 4173,4182 ****
augroup END
call assert_fails('lhelpgrep quickfix', 'E926:')
augroup QF_Test
! au! BufEnter
augroup END
new | only
endfunc
" Test for shortening/simplifying the file name when opening the
--- 4219,4261 ----
augroup END
call assert_fails('lhelpgrep quickfix', 'E926:')
augroup QF_Test
! au!
augroup END
+ " Replace the contents of a help window location list when it is still in
+ " use.
new | only
+ lhelpgrep quickfix
+ wincmd w
+ augroup QF_Test
+ au!
+ autocmd WinEnter * call setloclist(0, [], 'r')
+ augroup END
+ call assert_fails('lhelpgrep win_getid', 'E926:')
+ augroup QF_Test
+ au!
+ augroup END
+
+ %bw!
+ endfunc
+
+ " The following test used to crash Vim
+ func Test_lhelpgrep_autocmd_free_loclist()
+ %bw!
+ lhelpgrep quickfix
+ wincmd w
+ augroup QF_Test
+ au!
+ autocmd WinEnter * call setloclist(0, [], 'f')
+ augroup END
+ lhelpgrep win_getid
+ wincmd w
+ wincmd w
+ wincmd w
+ augroup QF_Test
+ au!
+ augroup END
+ %bw!
endfunc
" Test for shortening/simplifying the file name when opening the
***************
*** 5160,5165 ****
--- 5239,5245 ----
call assert_equal('L20', l[0].text)
call assert_equal([], g:Xgetlist({'idx' : -1, 'items' : 0}).items)
call assert_equal([], g:Xgetlist({'idx' : 3, 'items' : 0}).items)
+ call assert_equal({}, g:Xgetlist(#{idx: "abc"}))
%bwipe!
endfunc
***************
*** 5217,5222 ****
--- 5297,5315 ----
call assert_equal('F1|10 col 2-7| green', getline(1))
call assert_equal('F1|20-25 col 4-8| blue', getline(2))
Xclose
+
+ set efm=%f:%l:%c:%m
+ set quickfixtextfunc=Tqfexpr
+ " Update the list with only the cwindow
+ Xwindow
+ only
+ call g:Xsetlist([
+ \ { 'filename': 'F2', 'lnum': 20, 'col': 2,
+ \ 'end_col': 7, 'text': 'red'}
+ \ ])
+ call assert_equal(['F2-L20C2-red'], getline(1, '$'))
+ new
+ Xclose
set efm&
set quickfixtextfunc&
***************
*** 5926,5930 ****
--- 6019,6080 ----
call delete('Xresult')
endfunc
+ " Test for calling setqflist() function recursively
+ func Test_recursive_setqflist()
+ augroup QF_Test
+ au!
+ autocmd BufWinEnter quickfix call setqflist([], 'r')
+ augroup END
+
+ copen
+ call assert_fails("call setqflist([], 'a')", 'E952:')
+
+ augroup QF_Test
+ au!
+ augroup END
+ %bw!
+ endfunc
+
+ " Test for failure to create a new window when selecting a file from the
+ " quickfix window
+ func Test_cwindow_newwin_fails()
+ cgetexpr ["Xfile1:10:L10", "Xfile1:20:L20"]
+ cwindow
+ only
+ let qf_wid = win_getid()
+ " create the maximum number of scratch windows
+ let hor_win_count = (&lines - 1)/2
+ let hor_split_count = hor_win_count - 1
+ for s in range(1, hor_split_count) | new | set buftype=nofile | endfor
+ call win_gotoid(qf_wid)
+ call assert_fails('exe "normal \<CR>"', 'E36:')
+ %bw!
+ endfunc
+
+ " Test for updating the location list when only the location list window is
+ " present and the corresponding file window is closed.
+ func Test_loclist_update_with_llwin_only()
+ %bw!
+ new
+ wincmd w
+ lexpr ["Xfile1:1:Line1"]
+ lopen
+ wincmd p
+ close
+ call setloclist(2, [], 'r', {'lines': ["Xtest2:2:Line2"]})
+ call assert_equal(['Xtest2|2| Line2'], getbufline(winbufnr(2), 1, '$'))
+ %bw!
+ endfunc
+
+ " Test for getting the quickfix list after a buffer with an error is wiped out
+ func Test_getqflist_wiped_out_buffer()
+ %bw!
+ cexpr ["Xtest1:34:Wiped out"]
+ let bnum = bufnr('Xtest1')
+ call assert_equal(bnum, getqflist()[0].bufnr)
+ bw Xtest1
+ call assert_equal(0, getqflist()[0].bufnr)
+ %bw!
+ endfunc
" vim: shiftwidth=2 sts=2 expandtab
*** ../vim-8.2.4461/src/version.c 2022-02-24 11:39:35.964798140 +0000
--- src/version.c 2022-02-24 12:28:22.335188597 +0000
***************
*** 756,757 ****
--- 756,759 ----
{ /* Add new patch number below this line */
+ /**/
+ 4462,
/**/
--
I AM THANKFUL...
...for the piles of laundry and ironing because it means I
have plenty of clothes to wear.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// \\\
\\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/vim_dev/20220224123443.1FA201C04AB%40moolenaar.net.