From 6340689582bba14187a331b304dde9d91df828c1 Mon Sep 17 00:00:00 2001 From: Lech Lorens Date: Mon, 30 Oct 2017 22:17:15 +0100 Subject: [PATCH 1/2] quickfix: fix location list updates (test). --- test/functional/core/quickfix_spec.lua | 31 ++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 test/functional/core/quickfix_spec.lua diff --git a/test/functional/core/quickfix_spec.lua b/test/functional/core/quickfix_spec.lua new file mode 100644 index 0000000000..00afebbb35 --- /dev/null +++ b/test/functional/core/quickfix_spec.lua @@ -0,0 +1,31 @@ +local helpers = require('test.functional.helpers')(after_each) + +describe('quickfix functionality', function() + before_each(function() + helpers.clear() + end) + it('Location list correctly updated when buffer modified', function() + helpers.source([[ + new + setl bt=nofile + let lines = ['Line 1', 'Line 2', 'Line 3', 'Line 4', 'Line 5'] + call append(0, lines) + new + setl bt=nofile + call append(0, lines) + let qf_item = { + \ 'lnum': 4, + \ 'text': "This is the error line.", + \ } + let qf_item['bufnr'] = bufnr('%') + call setloclist(0, [qf_item]) + wincmd p + let qf_item['bufnr'] = bufnr('%') + call setloclist(0, [qf_item]) + 1del _ + call append(0, ['New line 1', 'New line 2', 'New line 3']) + silent ll + ]]) + helpers.eq({0, 6, 1, 0, 1}, helpers.funcs.getcurpos()) + end) +end) From ff819d8ad72b6a7404d28707f1f9ef460c35c472 Mon Sep 17 00:00:00 2001 From: Lech Lorens Date: Sun, 1 Oct 2017 15:37:27 +0200 Subject: [PATCH 2/2] quickfix: fix location list updates. Fix quickfix performance optimization which prevented quickfix items from being updated when there were multiple windows with location lists but the buffer with errors only in one of the lists. --- src/nvim/mark.c | 14 ++++++++++---- src/nvim/quickfix.c | 14 +++++++------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/nvim/mark.c b/src/nvim/mark.c index 7889fabd45..1ba400972c 100644 --- a/src/nvim/mark.c +++ b/src/nvim/mark.c @@ -951,11 +951,17 @@ static void mark_adjust_internal(linenr_T line1, linenr_T line2, one_adjust_nodel(&(curbuf->b_visual.vi_start.lnum)); one_adjust_nodel(&(curbuf->b_visual.vi_end.lnum)); - /* quickfix marks */ - qf_mark_adjust(NULL, line1, line2, amount, amount_after); - /* location lists */ + // quickfix marks + if (!qf_mark_adjust(NULL, line1, line2, amount, amount_after)) { + curbuf->b_has_qf_entry &= ~BUF_HAS_QF_ENTRY; + } + // location lists + bool found_one = false; FOR_ALL_TAB_WINDOWS(tab, win) { - qf_mark_adjust(win, line1, line2, amount, amount_after); + found_one |= qf_mark_adjust(win, line1, line2, amount, amount_after); + } + if (!found_one) { + curbuf->b_has_qf_entry &= ~BUF_HAS_LL_ENTRY; } sign_mark_adjust(line1, line2, amount, amount_after); diff --git a/src/nvim/quickfix.c b/src/nvim/quickfix.c index e6b1e7b95a..b9228e15b9 100644 --- a/src/nvim/quickfix.c +++ b/src/nvim/quickfix.c @@ -2379,7 +2379,8 @@ static void qf_free(qf_info_T *qi, int idx) /* * qf_mark_adjust: adjust marks */ -void qf_mark_adjust(win_T *wp, linenr_T line1, linenr_T line2, long amount, long amount_after) +bool qf_mark_adjust(win_T *wp, linenr_T line1, linenr_T line2, long amount, + long amount_after) { int i; qfline_T *qfp; @@ -2389,11 +2390,12 @@ void qf_mark_adjust(win_T *wp, linenr_T line1, linenr_T line2, long amount, long int buf_has_flag = wp == NULL ? BUF_HAS_QF_ENTRY : BUF_HAS_LL_ENTRY; if (!(curbuf->b_has_qf_entry & buf_has_flag)) { - return; + return false; } if (wp != NULL) { - if (wp->w_llist == NULL) - return; + if (wp->w_llist == NULL) { + return false; + } qi = wp->w_llist; } @@ -2414,9 +2416,7 @@ void qf_mark_adjust(win_T *wp, linenr_T line1, linenr_T line2, long amount, long } } - if (!found_one) { - curbuf->b_has_qf_entry &= ~buf_has_flag; - } + return found_one; } /*