From b9f4b0373a62266ea5eadd3c90a47e82df995391 Mon Sep 17 00:00:00 2001 From: w0rp Date: Tue, 30 May 2017 22:15:24 +0100 Subject: [PATCH] #591 Store buffer variables when fixing filess, and read them back in ale#Var --- autoload/ale.vim | 11 ++++++++++- autoload/ale/fix.vim | 1 + test/test_ale_fix.vader | 24 ++++++++++++++++++++++++ test/test_ale_var.vader | 20 ++++++++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/autoload/ale.vim b/autoload/ale.vim index 4286e4a..9751225 100644 --- a/autoload/ale.vim +++ b/autoload/ale.vim @@ -128,9 +128,18 @@ endfunction " " Every variable name will be prefixed with 'ale_'. function! ale#Var(buffer, variable_name) abort + let l:nr = str2nr(a:buffer) let l:full_name = 'ale_' . a:variable_name - return getbufvar(str2nr(a:buffer), l:full_name, g:[l:full_name]) + if bufexists(l:nr) + let l:vars = getbufvar(l:nr, '') + elseif has_key(g:, 'ale_fix_buffer_data') + let l:vars = get(g:ale_fix_buffer_data, l:nr, {'vars': {}}).vars + else + let l:vars = {} + endif + + return get(l:vars, l:full_name, g:[l:full_name]) endfunction " Initialize a variable with a default value, if it isn't already set. diff --git a/autoload/ale/fix.vim b/autoload/ale/fix.vim index 33f97ce..d8a50a2 100644 --- a/autoload/ale/fix.vim +++ b/autoload/ale/fix.vim @@ -305,6 +305,7 @@ function! ale#fix#InitBufferData(buffer, fixing_flag) abort " The 'done' flag tells the function for applying changes when fixing " is complete. let g:ale_fix_buffer_data[a:buffer] = { + \ 'vars': getbufvar(a:buffer, ''), \ 'lines_before': getbufline(a:buffer, 1, '$'), \ 'filename': expand('#' . a:buffer . ':p'), \ 'done': 0, diff --git a/test/test_ale_fix.vader b/test/test_ale_fix.vader index b4ffc06..5421dcf 100644 --- a/test/test_ale_fix.vader +++ b/test/test_ale_fix.vader @@ -11,6 +11,7 @@ Before: let g:ale_enabled = 0 let g:ale_echo_cursor = 0 let g:ale_run_synchronously = 1 + let g:ale_fix_buffer_data = {} let g:ale_fixers = { \ 'testft': [], \} @@ -75,6 +76,8 @@ After: call delete('fix_test_file') endif + let g:ale_fix_buffer_data = {} + Given testft (A file with three lines): a b @@ -291,3 +294,24 @@ Expect(The buffer should be the same): a b c + +Given testft (A file with three lines): + a + b + c + +Execute(ale#fix#InitBufferData() should set up the correct data): + noautocmd silent file fix_test_file + + call ale#fix#InitBufferData(bufnr(''), 'save_file') + + AssertEqual { + \ bufnr(''): { + \ 'temporary_directory_list': [], + \ 'vars': b:, + \ 'filename': simplify(getcwd() . '/fix_test_file'), + \ 'done': 0, + \ 'lines_before': ['a', 'b', 'c'], + \ 'should_save': 1, + \ }, + \}, g:ale_fix_buffer_data diff --git a/test/test_ale_var.vader b/test/test_ale_var.vader index 576b403..fb674d9 100644 --- a/test/test_ale_var.vader +++ b/test/test_ale_var.vader @@ -3,6 +3,9 @@ Before: After: unlet! g:ale_some_variable + unlet! b:undefined_variable_name + + let g:ale_fix_buffer_data = {} Execute(ale#Var should return global variables): AssertEqual 'abc', ale#Var(bufnr(''), 'some_variable') @@ -18,4 +21,21 @@ Execute(ale#Var should return buffer overrides for buffer numbers as strings): AssertEqual 'def', ale#Var(string(bufnr('')), 'some_variable') Execute(ale#Var should throw exceptions for undefined variables): + let b:undefined_variable_name = 'def' + AssertThrows call ale#Var(bufnr(''), 'undefined_variable_name') + +Execute(ale#Var return variables from deleted buffers, saved for fixing things): + let g:ale_fix_buffer_data[1347347] = {'vars': {'ale_some_variable': 'def'}} + + AssertEqual 'def', ale#Var(1347347, 'some_variable') + +Execute(ale#Var should return the global variable for unknown variables): + let g:ale_fix_buffer_data = {} + + AssertEqual 'abc', ale#Var(1347347, 'some_variable') + +Execute(ale#Var should return the global variables when the ALE fix variable is undefined): + unlet! g:ale_fix_buffer_data + + AssertEqual 'abc', ale#Var(1347347, 'some_variable')