From bac02c9d81356f1cc1f38b598c30c9b46fe21b7b Mon Sep 17 00:00:00 2001 From: w0rp Date: Sat, 11 Nov 2017 14:26:54 +0000 Subject: [PATCH] #1095 Cache the sorting of patterns for g:ale_pattern_options --- autoload/ale/pattern_options.vim | 20 +++++++++++++++----- test/test_pattern_options.vader | 16 ++++++++++++++++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/autoload/ale/pattern_options.vim b/autoload/ale/pattern_options.vim index a55a27f6..e58b8cf2 100644 --- a/autoload/ale/pattern_options.vim +++ b/autoload/ale/pattern_options.vim @@ -1,6 +1,10 @@ " Author: w0rp " Description: Set options in files based on regex patterns. +" These variables are used to cache the sorting of patterns below. +let s:last_pattern_options = {} +let s:sorted_items = [] + function! s:CmpPatterns(left_item, right_item) abort if a:left_item[0] < a:right_item[0] return -1 @@ -18,13 +22,19 @@ function! ale#pattern_options#SetOptions(buffer) abort return endif + " The items will only be sorted whenever the patterns change. + if g:ale_pattern_options != s:last_pattern_options + let s:last_pattern_options = deepcopy(g:ale_pattern_options) + " The patterns are sorted, so they are applied consistently. + let s:sorted_items = sort( + \ items(g:ale_pattern_options), + \ function('s:CmpPatterns') + \) + endif + let l:filename = expand('#' . a:buffer . ':p') - " The patterns are sorted, so they are applied consistently. - for [l:pattern, l:options] in sort( - \ items(g:ale_pattern_options), - \ function('s:CmpPatterns') - \) + for [l:pattern, l:options] in s:sorted_items if match(l:filename, l:pattern) >= 0 for [l:key, l:value] in items(l:options) call setbufvar(a:buffer, l:key, l:value) diff --git a/test/test_pattern_options.vader b/test/test_pattern_options.vader index 0ad4415f..0e26eaaa 100644 --- a/test/test_pattern_options.vader +++ b/test/test_pattern_options.vader @@ -74,3 +74,19 @@ Execute(Patterns should not be applied when the setting is disabled): call ale#pattern_options#SetOptions(bufnr('')) AssertEqual 0, b:some_option + +" This test is important for making sure we update the sorted items. +Execute(Patterns should be applied after the Dictionary changes): + call ale#test#SetFilename('foobar.js') + + let g:ale_pattern_options = {} + + call ale#pattern_options#SetOptions(bufnr('')) + + AssertEqual 0, b:some_option + + let g:ale_pattern_options['foo'] = {'some_option': 666} + + call ale#pattern_options#SetOptions(bufnr('')) + + AssertEqual 666, b:some_option