From 475dd2e76a0fe84d6c804ee00ea5b04a1fbdcdd2 Mon Sep 17 00:00:00 2001 From: valtermro Date: Tue, 11 Apr 2017 17:10:08 -0300 Subject: [PATCH] Add support for multiple filetypes in filetype aliasing --- autoload/ale/linter.vim | 35 +++++++++++++++++--------------- doc/ale.txt | 8 ++++++++ test/test_linter_retrieval.vader | 14 +++++++++++++ 3 files changed, 41 insertions(+), 16 deletions(-) diff --git a/autoload/ale/linter.vim b/autoload/ale/linter.vim index 9a838ff..eec9cf1 100644 --- a/autoload/ale/linter.vim +++ b/autoload/ale/linter.vim @@ -174,26 +174,25 @@ function! ale#linter#Define(filetype, linter) abort call add(s:linters[a:filetype], l:new_linter) endfunction -function! ale#linter#GetAll(filetype) abort - if a:filetype ==# '' - " Empty filetype? Nothing to be done about that. - return [] - endif +function! ale#linter#GetAll(filetypes) abort + let l:combined_linters = [] - if has_key(s:linters, a:filetype) - " We already loaded the linter files for this filetype, so stop here. - return s:linters[a:filetype] - endif + for l:filetype in a:filetypes + " Haven't we loaded the linter files for this filetype yet? + if !has_key(s:linters, l:filetype) + " So load it + execute 'silent! runtime! ale_linters/' . l:filetype . '/*.vim' - " Load all linters for a given filetype. - execute 'silent! runtime! ale_linters/' . a:filetype . '/*.vim' + " Still don't have the linter files? There must be occured an error + if !has_key(s:linters, l:filetype) + let s:linters[l:filetype] = [] + endif + endif - if !has_key(s:linters, a:filetype) - " If we couldn't load any linters, let everyone know. - let s:linters[a:filetype] = [] - endif + call extend(l:combined_linters, get(s:linters, l:filetype, [])) + endfor - return s:linters[a:filetype] + return l:combined_linters endfunction function! ale#linter#ResolveFiletype(original_filetype) abort @@ -209,6 +208,10 @@ function! ale#linter#ResolveFiletype(original_filetype) abort \ ) \) + if type(l:filetype) != type([]) + return [l:filetype] + endif + return l:filetype endfunction diff --git a/doc/ale.txt b/doc/ale.txt index 04d5c34..85409fc 100644 --- a/doc/ale.txt +++ b/doc/ale.txt @@ -380,6 +380,14 @@ g:ale_linter_aliases *g:ale_linter_aliases* not the aliased type (`'php'`). This allows an aliased type to run a different set of linters from the type it is being mapped to. + Passing a list of filetypes is also supported. Say you want to lint + javascript and css embedded in HTML (using linters that support that). + You could alias `html` like so: + + `let g:ale_linter_aliases = {'html': ['html', 'javascript', 'css']}` + + Note that `html` itself was included as an alias. That is because aliases + will override the original linters for the aliased filetepe. g:ale_linters *g:ale_linters* diff --git a/test/test_linter_retrieval.vader b/test/test_linter_retrieval.vader index e0d6c28..3f405a5 100644 --- a/test/test_linter_retrieval.vader +++ b/test/test_linter_retrieval.vader @@ -39,5 +39,19 @@ Execute (Define multiple linters for different filetypes): Then (Linters for dot-seperated filetypes should be properly handled): AssertEqual [g:testlinter1, g:testlinter2], ale#linter#Get('testft1.testft2') +Execute (Define multiple aliases for a filetype): + call ale#linter#Define('testft1', g:testlinter1) + call ale#linter#Define('testft2', g:testlinter2) + let ale_linter_aliases = {'testft3': ['testft1', 'testft2']} +Then (Linters should be transparently aliased): + AssertEqual [g:testlinter1, g:testlinter2], ale#linter#Get('testft3') + +Execute (Alias a filetype to itself plus another one): + call ale#linter#Define('testft1', g:testlinter1) + call ale#linter#Define('testft2', g:testlinter2) + let ale_linter_aliases = {'testft1': ['testft1', 'testft2']} +Then (The original linters should still be there): + AssertEqual [g:testlinter1, g:testlinter2], ale#linter#Get('testft1') + Execute (Try to load a linter from disk): AssertEqual [{'name': 'testlinter', 'output_stream': 'stdout', 'executable': 'testlinter', 'command': 'testlinter', 'callback': 'testCB', 'read_buffer': 1, 'lint_file': 0}], ale#linter#Get('testft')