summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--autoload/ale/pattern_options.vim20
-rw-r--r--test/test_pattern_options.vader16
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 <devw0rp@gmail.com>
" 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