From e7a041ce068609c6c4ec8fc1d0b275b12905c28e Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Wed, 9 Oct 2019 14:59:15 +0200 Subject: [PATCH 1/2] automake: use dictwatcher (nvim) to invalidate cache --- autoload/neomake/configure.vim | 39 ++++++++++++++++++++++ tests/automake.vader | 60 ++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) diff --git a/autoload/neomake/configure.vim b/autoload/neomake/configure.vim index 9f9d5add7e..3c55ad4191 100644 --- a/autoload/neomake/configure.vim +++ b/autoload/neomake/configure.vim @@ -22,6 +22,9 @@ let s:registered_events = [] " issue #2742). let s:need_to_skip_first_textchanged = !has('nvim-0.3.2') && has('patch-8.0.1494') && !has('patch-8.0.1633') +" For debugging/tests. +let g:neomake#configure#_s = s: + " TODO: allow for namespaces, and prefer 'automake' here. " TODO: handle bufnr! (getbufvar) @@ -548,6 +551,9 @@ function! s:configure_buffer(bufnr, ...) abort augroup neomake_automake_clean autocmd BufWipeout call s:neomake_automake_clean(expand('')) augroup END + if exists('*dictwatcheradd') + call dictwatcheradd(b:, 'neomake_*', function('s:dictwatcher_b')) + endif endif if implicit_config.ignore @@ -795,6 +801,39 @@ function! neomake#configure#automake(...) abort endif endfunction +function! s:maybe_clear_buffer_cache(bufnr) abort + if has_key(s:configured_buffers, a:bufnr) && !s:configured_buffers[a:bufnr].custom + unlet s:configured_buffers[a:bufnr] + return 1 + endif + return 0 +endfunction + +if exists('*dictwatcheradd') + function! s:dictwatcher(d, k, update) abort + if a:k =~# '_enabled_makers$' + let cleared = 0 + for [bufnr, v] in items(s:configured_buffers) + if s:maybe_clear_buffer_cache(bufnr) + let cleared += 1 + endif + endfor + if cleared + call s:debug_log(printf('cleared cached config for %d buffers', cleared)) + endif + endif + endfunction + function! s:dictwatcher_b(d, k, update) abort + if a:k =~# '_enabled_makers$' + let bufnr = bufnr('%') + if s:maybe_clear_buffer_cache(bufnr) + call s:debug_log('cleared cached config for buffer', {'bufnr': bufnr}) + endif + endif + endfunction + call dictwatcheradd(g:, 'neomake_*', function('s:dictwatcher')) +endif + augroup neomake_automake_base au! autocmd FileType * call s:maybe_reconfigure_buffer(expand('')) diff --git a/tests/automake.vader b/tests/automake.vader index eb234a463f..ed977277fe 100644 --- a/tests/automake.vader +++ b/tests/automake.vader @@ -1629,3 +1629,63 @@ Execute (automake: abort automake with manual run): AssertEqualQf getloclist(0), expected_loclist bwipe! endif + +Execute (Reconfigures buffers with dictwatcher): + new + let bufnr = bufnr('%') + set filetype=neomake_tests + Save g:neomake_test_enabledmakers + let g:neomake_test_enabledmakers = [g:entry_maker] + call g:NeomakeSetupAutocmdWrappers() + + call neomake#configure#automake('w') + + exe 'w' tempname() + AssertNeomakeMessage 'Running makers: entry_maker (auto).', 3 + AssertEqual len(g:neomake_test_finished), 1 + + AssertEqual g:neomake#configure#_s.configured_buffers[bufnr].custom, 0 + + let g:neomake_neomake_tests_enabled_makers = [] + if exists('*dictwatcheradd') + AssertNeomakeMessage 'automake: cleared cached config for 1 buffers.', 3 + endif + + w + if exists('*dictwatcheradd') + AssertNeomakeMessage 'automake: configured buffer for ft=neomake_tests (no enabled makers).', 3 + AssertNeomakeMessage 'automake: setting tick for new buffer.', 3 + AssertNeomakeMessage 'automake: handling event BufWritePost.', 3 + AssertNeomakeMessage 'automake: no enabled makers.', 3 + else + AssertNeomakeMessage 'automake: handling event BufWritePost.', 3 + AssertNeomakeMessage 'automake: automake for event BufWritePost.', 3 + AssertNeomakeMessage 'automake: neomake_do_automake: BufWritePost.', 3 + AssertNeomakeMessage 'automake: tick is unchanged.', 3 + AssertNeomakeMessage 'automake: buffer was not changed.', 3 + endif + AssertEqual len(g:neomake_test_finished), 1 + + Log '===' + let b:neomake_neomake_tests_enabled_makers = [g:entry_maker] + if exists('*dictwatcheradd') + AssertNeomakeMessage 'automake: cleared cached config for buffer.', 3 + endif + + w + if exists('*dictwatcheradd') + AssertNeomakeMessage 'automake: configured buffer for ft=neomake_tests (entry_maker (default)).', 3 + AssertNeomakeMessage 'automake: setting tick for new buffer.', 3 + AssertNeomakeMessage 'automake: handling event BufWritePost.', 3 + AssertNeomakeMessage 'automake: enabled makers: entry_maker.', 3 + AssertEqual len(g:neomake_test_finished), 2 + else + AssertNeomakeMessage 'automake: handling event BufWritePost.', 3 + AssertNeomakeMessage 'automake: automake for event BufWritePost.', 3 + AssertNeomakeMessage 'automake: neomake_do_automake: BufWritePost.', 3 + AssertNeomakeMessage 'automake: tick is unchanged.', 3 + AssertNeomakeMessage 'automake: buffer was not changed.', 3 + AssertEqual len(g:neomake_test_finished), 1 + endif + + bwipe From 76e18bcf56f8563b42a8d7a9aa71d6c394f0d7cf Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Wed, 9 Oct 2019 16:53:07 +0200 Subject: [PATCH 2/2] fixup! automake: use dictwatcher (nvim) to invalidate cache --- tests/automake.vader | 42 +++++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/tests/automake.vader b/tests/automake.vader index ed977277fe..70f43b95aa 100644 --- a/tests/automake.vader +++ b/tests/automake.vader @@ -297,6 +297,7 @@ Execute (Automake): AssertEqual len(g:neomake_test_jobfinished), 4 new + let bufnr = bufnr('%') exe 'doautocmd' event AssertNeomakeMessage 'automake: configured buffer for ft= (no enabled makers).' if event ==# 'TextChanged' @@ -304,17 +305,44 @@ Execute (Automake): endif AssertNeomakeMessage 'automake: no enabled makers.' + " Test behavior with regard to cache when changing settings. let b:neomake_automake_enabled_makers = ['foo'] - doautocmd FileType - AssertNeomakeMessage 'automake: configured buffer for ft= (no enabled makers).' + if exists('*dictwatcheradd') + AssertNeomakeMessage 'automake: cleared cached config for buffer.' + exe 'doautocmd' event + AssertNeomakeMessage 'automake: configured buffer for ft= (no enabled makers).' + else + doautocmd FileType + AssertNeomakeMessage 'automake: configured buffer for ft= (no enabled makers).' + endif + let b:neomake = {'automake': {'enabled_makers': ['configured_maker']}} + if exists('*dictwatcheradd') + AssertNeomakeMessage 'automake: cleared cached config for buffer.' + endif + let n = len(g:neomake_test_messages) exe 'doautocmd' event let m = len(g:neomake_test_messages) - AssertEqual g:neomake_test_messages[n : m], [ - \ [3, 'automake: handling event '.event.'.', {'bufnr': bufnr('%'), 'winnr': winnr()}], - \ [3, 'automake: no enabled makers.', {'bufnr': bufnr('%'), 'winnr': winnr()}], - \ ] + let winnr = winnr() + if exists('*dictwatcheradd') + AssertEqual g:neomake_test_messages[n : m], [ + \ [3, 'Using setting automake.events={''InsertLeave'': {}, ''TextChanged'': {}} from ''global''.', {'bufnr': bufnr, 'winnr': winnr}], + \ [3, 'Using setting automake.enabled_makers=[''configured_maker''] from ''buffer''.', {'bufnr': bufnr, 'winnr': winnr}], + \ [0, 'Maker not found (for empty filetype): configured_maker.', {'winnr': winnr}], + \ [3, 'automake: configured buffer for ft= (no enabled makers).', {'bufnr': bufnr, 'winnr': winnr}], + \ [3, 'automake: setting tick for new buffer.', {'bufnr': bufnr, 'winnr': winnr}], + \ [3, 'automake: handling event TextChanged.', {'bufnr': bufnr, 'winnr': winnr}], + \ [3, 'automake: no enabled makers.', {'bufnr': bufnr, 'winnr': winnr}] + \ ] + " ACK error message. + AssertNeomakeMessage 'Maker not found (for empty filetype): configured_maker.', 0 + else + AssertEqual g:neomake_test_messages[n : m], [ + \ [3, 'automake: handling event '.event.'.', {'bufnr': bufnr('%'), 'winnr': winnr()}], + \ [3, 'automake: no enabled makers.', {'bufnr': bufnr('%'), 'winnr': winnr()}], + \ ] + endif call neomake#configure#automake('nw') normal! ifoo @@ -1646,6 +1674,7 @@ Execute (Reconfigures buffers with dictwatcher): AssertEqual g:neomake#configure#_s.configured_buffers[bufnr].custom, 0 + Save g:neomake_neomake_tests_enabled_makers let g:neomake_neomake_tests_enabled_makers = [] if exists('*dictwatcheradd') AssertNeomakeMessage 'automake: cleared cached config for 1 buffers.', 3 @@ -1666,7 +1695,6 @@ Execute (Reconfigures buffers with dictwatcher): endif AssertEqual len(g:neomake_test_finished), 1 - Log '===' let b:neomake_neomake_tests_enabled_makers = [g:entry_maker] if exists('*dictwatcheradd') AssertNeomakeMessage 'automake: cleared cached config for buffer.', 3