From 6ab0098cedd35bc3edee69da8d57e14d98355104 Mon Sep 17 00:00:00 2001 From: Christian Brabandt Date: Tue, 27 Jun 2017 13:52:48 +0200 Subject: [PATCH] Ale: Cache Warning and Errors should provide some better performance --- autoload/airline/extensions/ale.vim | 41 ++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/autoload/airline/extensions/ale.vim b/autoload/airline/extensions/ale.vim index 062ef1d..a18d164 100644 --- a/autoload/airline/extensions/ale.vim +++ b/autoload/airline/extensions/ale.vim @@ -4,29 +4,46 @@ let s:error_symbol = get(g:, 'airline#extensions#ale#error_symbol', 'E:') let s:warning_symbol = get(g:, 'airline#extensions#ale#warning_symbol', 'W:') +function! s:airline_ale_count(cnt, symbol) + return a:cnt ? a:symbol. a:cnt : '' +endfunction + function! airline#extensions#ale#get(type) if !exists(':ALELint') return '' endif - let l:is_err = a:type ==# 'error' - let l:counts = ale#statusline#Count(bufnr('')) - let l:symbol = l:is_err ? s:error_symbol : s:warning_symbol + let is_err = a:type ==# 'error' + let symbol = is_err ? s:error_symbol : s:warning_symbol - if type(l:counts) == type({}) && has_key(l:counts, 'error') + if !exists('b:airline_extensions_ale_dict') + let b:airline_extensions_ale_dict = {} + let b:airline_extensions_ale_dict.error = 0 + let b:airline_extensions_ale_dict.warning = 0 + let b:airline_extensions_ale_dict.change = 0 + endif + + if b:airline_extensions_ale_dict.change == b:changedtick + return s:airline_ale_count(b:airline_extensions_ale_dict[a:type], symbol) + endif + + let is_err = a:type ==# 'error' + let counts = ale#statusline#Count(bufnr('')) + let symbol = is_err ? s:error_symbol : s:warning_symbol + + if type(counts) == type({}) && has_key(counts, 'error') " Use the current Dictionary format. - let l:errors = l:counts.error + l:counts.style_error - let l:num = l:is_err ? l:errors : l:counts.total - l:errors + let errors = counts.error + counts.style_error + let num = is_err ? errors : counts.total - errors else " Use the old List format. - let l:num = l:is_err ? l:counts[0] : l:counts[1] + let num = is_err ? counts[0] : counts[1] endif - if l:num == 0 - return '' - else - return l:symbol . l:num - endif + let b:airline_extensions_ale_dict[a:type] = num + let b:airline_extensions_ale_dict['change'] = b:changedtick + + return s:airline_ale_count(num, symbol) endfunction function! airline#extensions#ale#get_warning()