First pass at optimizing ale to autoload (#80)
* First pass at optimizing ale to autoload
First off, the structure/function names should be revised a bit,
but I will wait for @w0rp's input before unifying the naming style.
Second off, the docs probably need some more work, I just did some
simple find-and-replace work.
With that said, this pull brings major performance gains for ale. On my
slowest system, fully loading ale and all its code takes around 150ms.
I have moved all of ale's autoload-able code to autoload/, and in
addition, implemented lazy-loading of linters. This brings load time on
that same system down to 5ms.
The only downside of lazy loading is that `g:ale_linters` cannot be
changed at runtime; however, it also speeds up performance at runtime by
simplfying the logic greatly.
Please let me know what you think!
Closes #59
* Address Travis/Vint errors
For some reason, ale isn't running vint for me...
* Incorporate feedback, make fixes
Lazy-loading logic is much improved.
* Add header comments; remove incorrect workaround
* Remove unneeded plugin guards
* Fix lazy-loading linter logic
Set the wrong variable....
* Fix capitialization
2016-10-10 14:51:29 -04:00
|
|
|
" Author: w0rp <devw0rp@gmail.com>
|
|
|
|
" Description: Linter registration and lazy-loading
|
|
|
|
" Retrieves linters as requested by the engine, loading them if needed.
|
|
|
|
|
|
|
|
let s:linters = {}
|
|
|
|
|
2016-10-11 18:11:45 -04:00
|
|
|
" Default filetype aliaes.
|
|
|
|
" The user defined aliases will be merged with this Dictionary.
|
|
|
|
let s:default_ale_linter_aliases = {
|
|
|
|
\ 'zsh': 'sh',
|
|
|
|
\ 'csh': 'sh',
|
2016-12-04 18:13:57 -05:00
|
|
|
\ 'plaintex': 'tex',
|
|
|
|
\ 'systemverilog': 'verilog',
|
2016-10-11 18:11:45 -04:00
|
|
|
\}
|
|
|
|
|
|
|
|
" Default linters to run for particular filetypes.
|
|
|
|
" The user defined linter selections will be merged with this Dictionary.
|
|
|
|
let s:default_ale_linters = {
|
|
|
|
\ 'zsh': ['shell'],
|
|
|
|
\ 'csh': ['shell'],
|
|
|
|
\}
|
|
|
|
|
2016-10-21 22:02:20 -04:00
|
|
|
" Testing/debugging helper to unload all linters.
|
|
|
|
function! ale#linter#Reset() abort
|
|
|
|
let s:linters = {}
|
|
|
|
endfunction
|
|
|
|
|
2016-10-25 15:25:23 -04:00
|
|
|
function! s:IsCallback(value) abort
|
|
|
|
return type(a:value) == type('') || type(a:value) == type(function('type'))
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
function! ale#linter#PreProcess(linter) abort
|
|
|
|
if type(a:linter) != type({})
|
|
|
|
throw 'The linter object must be a Dictionary'
|
First pass at optimizing ale to autoload (#80)
* First pass at optimizing ale to autoload
First off, the structure/function names should be revised a bit,
but I will wait for @w0rp's input before unifying the naming style.
Second off, the docs probably need some more work, I just did some
simple find-and-replace work.
With that said, this pull brings major performance gains for ale. On my
slowest system, fully loading ale and all its code takes around 150ms.
I have moved all of ale's autoload-able code to autoload/, and in
addition, implemented lazy-loading of linters. This brings load time on
that same system down to 5ms.
The only downside of lazy loading is that `g:ale_linters` cannot be
changed at runtime; however, it also speeds up performance at runtime by
simplfying the logic greatly.
Please let me know what you think!
Closes #59
* Address Travis/Vint errors
For some reason, ale isn't running vint for me...
* Incorporate feedback, make fixes
Lazy-loading logic is much improved.
* Add header comments; remove incorrect workaround
* Remove unneeded plugin guards
* Fix lazy-loading linter logic
Set the wrong variable....
* Fix capitialization
2016-10-10 14:51:29 -04:00
|
|
|
endif
|
|
|
|
|
2016-10-25 15:25:23 -04:00
|
|
|
let l:obj = {
|
|
|
|
\ 'name': get(a:linter, 'name'),
|
|
|
|
\ 'callback': get(a:linter, 'callback'),
|
First pass at optimizing ale to autoload (#80)
* First pass at optimizing ale to autoload
First off, the structure/function names should be revised a bit,
but I will wait for @w0rp's input before unifying the naming style.
Second off, the docs probably need some more work, I just did some
simple find-and-replace work.
With that said, this pull brings major performance gains for ale. On my
slowest system, fully loading ale and all its code takes around 150ms.
I have moved all of ale's autoload-able code to autoload/, and in
addition, implemented lazy-loading of linters. This brings load time on
that same system down to 5ms.
The only downside of lazy loading is that `g:ale_linters` cannot be
changed at runtime; however, it also speeds up performance at runtime by
simplfying the logic greatly.
Please let me know what you think!
Closes #59
* Address Travis/Vint errors
For some reason, ale isn't running vint for me...
* Incorporate feedback, make fixes
Lazy-loading logic is much improved.
* Add header comments; remove incorrect workaround
* Remove unneeded plugin guards
* Fix lazy-loading linter logic
Set the wrong variable....
* Fix capitialization
2016-10-10 14:51:29 -04:00
|
|
|
\}
|
|
|
|
|
2016-10-25 15:25:23 -04:00
|
|
|
if type(l:obj.name) != type('')
|
|
|
|
throw '`name` must be defined to name the linter'
|
|
|
|
endif
|
|
|
|
|
|
|
|
if !s:IsCallback(l:obj.callback)
|
|
|
|
throw '`callback` must be defined with a callback to accept output'
|
|
|
|
endif
|
|
|
|
|
First pass at optimizing ale to autoload (#80)
* First pass at optimizing ale to autoload
First off, the structure/function names should be revised a bit,
but I will wait for @w0rp's input before unifying the naming style.
Second off, the docs probably need some more work, I just did some
simple find-and-replace work.
With that said, this pull brings major performance gains for ale. On my
slowest system, fully loading ale and all its code takes around 150ms.
I have moved all of ale's autoload-able code to autoload/, and in
addition, implemented lazy-loading of linters. This brings load time on
that same system down to 5ms.
The only downside of lazy loading is that `g:ale_linters` cannot be
changed at runtime; however, it also speeds up performance at runtime by
simplfying the logic greatly.
Please let me know what you think!
Closes #59
* Address Travis/Vint errors
For some reason, ale isn't running vint for me...
* Incorporate feedback, make fixes
Lazy-loading logic is much improved.
* Add header comments; remove incorrect workaround
* Remove unneeded plugin guards
* Fix lazy-loading linter logic
Set the wrong variable....
* Fix capitialization
2016-10-10 14:51:29 -04:00
|
|
|
if has_key(a:linter, 'executable_callback')
|
2016-10-25 15:25:23 -04:00
|
|
|
let l:obj.executable_callback = a:linter.executable_callback
|
|
|
|
|
|
|
|
if !s:IsCallback(l:obj.executable_callback)
|
|
|
|
throw '`executable_callback` must be a callback if defined'
|
|
|
|
endif
|
|
|
|
elseif has_key(a:linter, 'executable')
|
|
|
|
let l:obj.executable = a:linter.executable
|
|
|
|
|
|
|
|
if type(l:obj.executable) != type('')
|
|
|
|
throw '`executable` must be a string if defined'
|
|
|
|
endif
|
First pass at optimizing ale to autoload (#80)
* First pass at optimizing ale to autoload
First off, the structure/function names should be revised a bit,
but I will wait for @w0rp's input before unifying the naming style.
Second off, the docs probably need some more work, I just did some
simple find-and-replace work.
With that said, this pull brings major performance gains for ale. On my
slowest system, fully loading ale and all its code takes around 150ms.
I have moved all of ale's autoload-able code to autoload/, and in
addition, implemented lazy-loading of linters. This brings load time on
that same system down to 5ms.
The only downside of lazy loading is that `g:ale_linters` cannot be
changed at runtime; however, it also speeds up performance at runtime by
simplfying the logic greatly.
Please let me know what you think!
Closes #59
* Address Travis/Vint errors
For some reason, ale isn't running vint for me...
* Incorporate feedback, make fixes
Lazy-loading logic is much improved.
* Add header comments; remove incorrect workaround
* Remove unneeded plugin guards
* Fix lazy-loading linter logic
Set the wrong variable....
* Fix capitialization
2016-10-10 14:51:29 -04:00
|
|
|
else
|
2016-10-25 15:25:23 -04:00
|
|
|
throw 'Either `executable` or `executable_callback` must be defined'
|
First pass at optimizing ale to autoload (#80)
* First pass at optimizing ale to autoload
First off, the structure/function names should be revised a bit,
but I will wait for @w0rp's input before unifying the naming style.
Second off, the docs probably need some more work, I just did some
simple find-and-replace work.
With that said, this pull brings major performance gains for ale. On my
slowest system, fully loading ale and all its code takes around 150ms.
I have moved all of ale's autoload-able code to autoload/, and in
addition, implemented lazy-loading of linters. This brings load time on
that same system down to 5ms.
The only downside of lazy loading is that `g:ale_linters` cannot be
changed at runtime; however, it also speeds up performance at runtime by
simplfying the logic greatly.
Please let me know what you think!
Closes #59
* Address Travis/Vint errors
For some reason, ale isn't running vint for me...
* Incorporate feedback, make fixes
Lazy-loading logic is much improved.
* Add header comments; remove incorrect workaround
* Remove unneeded plugin guards
* Fix lazy-loading linter logic
Set the wrong variable....
* Fix capitialization
2016-10-10 14:51:29 -04:00
|
|
|
endif
|
|
|
|
|
|
|
|
if has_key(a:linter, 'command_callback')
|
2016-10-25 15:25:23 -04:00
|
|
|
let l:obj.command_callback = a:linter.command_callback
|
|
|
|
|
|
|
|
if !s:IsCallback(l:obj.command_callback)
|
|
|
|
throw '`command_callback` must be a callback if defined'
|
|
|
|
endif
|
|
|
|
elseif has_key(a:linter, 'command')
|
|
|
|
let l:obj.command = a:linter.command
|
|
|
|
|
|
|
|
if type(l:obj.command) != type('')
|
|
|
|
throw '`command` must be a string if defined'
|
|
|
|
endif
|
First pass at optimizing ale to autoload (#80)
* First pass at optimizing ale to autoload
First off, the structure/function names should be revised a bit,
but I will wait for @w0rp's input before unifying the naming style.
Second off, the docs probably need some more work, I just did some
simple find-and-replace work.
With that said, this pull brings major performance gains for ale. On my
slowest system, fully loading ale and all its code takes around 150ms.
I have moved all of ale's autoload-able code to autoload/, and in
addition, implemented lazy-loading of linters. This brings load time on
that same system down to 5ms.
The only downside of lazy loading is that `g:ale_linters` cannot be
changed at runtime; however, it also speeds up performance at runtime by
simplfying the logic greatly.
Please let me know what you think!
Closes #59
* Address Travis/Vint errors
For some reason, ale isn't running vint for me...
* Incorporate feedback, make fixes
Lazy-loading logic is much improved.
* Add header comments; remove incorrect workaround
* Remove unneeded plugin guards
* Fix lazy-loading linter logic
Set the wrong variable....
* Fix capitialization
2016-10-10 14:51:29 -04:00
|
|
|
else
|
2016-10-25 15:25:23 -04:00
|
|
|
throw 'Either `command`, `executable_callback`, `command_chain` '
|
|
|
|
\ . 'must be defined'
|
First pass at optimizing ale to autoload (#80)
* First pass at optimizing ale to autoload
First off, the structure/function names should be revised a bit,
but I will wait for @w0rp's input before unifying the naming style.
Second off, the docs probably need some more work, I just did some
simple find-and-replace work.
With that said, this pull brings major performance gains for ale. On my
slowest system, fully loading ale and all its code takes around 150ms.
I have moved all of ale's autoload-able code to autoload/, and in
addition, implemented lazy-loading of linters. This brings load time on
that same system down to 5ms.
The only downside of lazy loading is that `g:ale_linters` cannot be
changed at runtime; however, it also speeds up performance at runtime by
simplfying the logic greatly.
Please let me know what you think!
Closes #59
* Address Travis/Vint errors
For some reason, ale isn't running vint for me...
* Incorporate feedback, make fixes
Lazy-loading logic is much improved.
* Add header comments; remove incorrect workaround
* Remove unneeded plugin guards
* Fix lazy-loading linter logic
Set the wrong variable....
* Fix capitialization
2016-10-10 14:51:29 -04:00
|
|
|
endif
|
|
|
|
|
2016-10-25 15:25:23 -04:00
|
|
|
let l:obj.output_stream = get(a:linter, 'output_stream', 'stdout')
|
|
|
|
|
|
|
|
if type(l:obj.output_stream) != type('')
|
|
|
|
\|| index(['stdout', 'stderr', 'both'], l:obj.output_stream) < 0
|
|
|
|
throw "`output_stream` must be 'stdout', 'stderr', or 'both'"
|
|
|
|
endif
|
|
|
|
|
|
|
|
return l:obj
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
function! ale#linter#Define(filetype, linter) abort
|
|
|
|
if !has_key(s:linters, a:filetype)
|
|
|
|
let s:linters[a:filetype] = []
|
First pass at optimizing ale to autoload (#80)
* First pass at optimizing ale to autoload
First off, the structure/function names should be revised a bit,
but I will wait for @w0rp's input before unifying the naming style.
Second off, the docs probably need some more work, I just did some
simple find-and-replace work.
With that said, this pull brings major performance gains for ale. On my
slowest system, fully loading ale and all its code takes around 150ms.
I have moved all of ale's autoload-able code to autoload/, and in
addition, implemented lazy-loading of linters. This brings load time on
that same system down to 5ms.
The only downside of lazy loading is that `g:ale_linters` cannot be
changed at runtime; however, it also speeds up performance at runtime by
simplfying the logic greatly.
Please let me know what you think!
Closes #59
* Address Travis/Vint errors
For some reason, ale isn't running vint for me...
* Incorporate feedback, make fixes
Lazy-loading logic is much improved.
* Add header comments; remove incorrect workaround
* Remove unneeded plugin guards
* Fix lazy-loading linter logic
Set the wrong variable....
* Fix capitialization
2016-10-10 14:51:29 -04:00
|
|
|
endif
|
|
|
|
|
2016-10-25 15:25:23 -04:00
|
|
|
let l:new_linter = ale#linter#PreProcess(a:linter)
|
First pass at optimizing ale to autoload (#80)
* First pass at optimizing ale to autoload
First off, the structure/function names should be revised a bit,
but I will wait for @w0rp's input before unifying the naming style.
Second off, the docs probably need some more work, I just did some
simple find-and-replace work.
With that said, this pull brings major performance gains for ale. On my
slowest system, fully loading ale and all its code takes around 150ms.
I have moved all of ale's autoload-able code to autoload/, and in
addition, implemented lazy-loading of linters. This brings load time on
that same system down to 5ms.
The only downside of lazy loading is that `g:ale_linters` cannot be
changed at runtime; however, it also speeds up performance at runtime by
simplfying the logic greatly.
Please let me know what you think!
Closes #59
* Address Travis/Vint errors
For some reason, ale isn't running vint for me...
* Incorporate feedback, make fixes
Lazy-loading logic is much improved.
* Add header comments; remove incorrect workaround
* Remove unneeded plugin guards
* Fix lazy-loading linter logic
Set the wrong variable....
* Fix capitialization
2016-10-10 14:51:29 -04:00
|
|
|
|
2016-10-10 19:00:09 -04:00
|
|
|
call add(s:linters[a:filetype], l:new_linter)
|
First pass at optimizing ale to autoload (#80)
* First pass at optimizing ale to autoload
First off, the structure/function names should be revised a bit,
but I will wait for @w0rp's input before unifying the naming style.
Second off, the docs probably need some more work, I just did some
simple find-and-replace work.
With that said, this pull brings major performance gains for ale. On my
slowest system, fully loading ale and all its code takes around 150ms.
I have moved all of ale's autoload-able code to autoload/, and in
addition, implemented lazy-loading of linters. This brings load time on
that same system down to 5ms.
The only downside of lazy loading is that `g:ale_linters` cannot be
changed at runtime; however, it also speeds up performance at runtime by
simplfying the logic greatly.
Please let me know what you think!
Closes #59
* Address Travis/Vint errors
For some reason, ale isn't running vint for me...
* Incorporate feedback, make fixes
Lazy-loading logic is much improved.
* Add header comments; remove incorrect workaround
* Remove unneeded plugin guards
* Fix lazy-loading linter logic
Set the wrong variable....
* Fix capitialization
2016-10-10 14:51:29 -04:00
|
|
|
endfunction
|
|
|
|
|
2016-10-11 18:11:45 -04:00
|
|
|
function! s:LoadLinters(filetype) abort
|
First pass at optimizing ale to autoload (#80)
* First pass at optimizing ale to autoload
First off, the structure/function names should be revised a bit,
but I will wait for @w0rp's input before unifying the naming style.
Second off, the docs probably need some more work, I just did some
simple find-and-replace work.
With that said, this pull brings major performance gains for ale. On my
slowest system, fully loading ale and all its code takes around 150ms.
I have moved all of ale's autoload-able code to autoload/, and in
addition, implemented lazy-loading of linters. This brings load time on
that same system down to 5ms.
The only downside of lazy loading is that `g:ale_linters` cannot be
changed at runtime; however, it also speeds up performance at runtime by
simplfying the logic greatly.
Please let me know what you think!
Closes #59
* Address Travis/Vint errors
For some reason, ale isn't running vint for me...
* Incorporate feedback, make fixes
Lazy-loading logic is much improved.
* Add header comments; remove incorrect workaround
* Remove unneeded plugin guards
* Fix lazy-loading linter logic
Set the wrong variable....
* Fix capitialization
2016-10-10 14:51:29 -04:00
|
|
|
if a:filetype ==# ''
|
|
|
|
" Empty filetype? Nothing to be done about that.
|
|
|
|
return []
|
|
|
|
endif
|
|
|
|
|
|
|
|
if has_key(s:linters, a:filetype)
|
2016-10-11 18:11:45 -04:00
|
|
|
" We already loaded the linter files for this filetype, so stop here.
|
First pass at optimizing ale to autoload (#80)
* First pass at optimizing ale to autoload
First off, the structure/function names should be revised a bit,
but I will wait for @w0rp's input before unifying the naming style.
Second off, the docs probably need some more work, I just did some
simple find-and-replace work.
With that said, this pull brings major performance gains for ale. On my
slowest system, fully loading ale and all its code takes around 150ms.
I have moved all of ale's autoload-able code to autoload/, and in
addition, implemented lazy-loading of linters. This brings load time on
that same system down to 5ms.
The only downside of lazy loading is that `g:ale_linters` cannot be
changed at runtime; however, it also speeds up performance at runtime by
simplfying the logic greatly.
Please let me know what you think!
Closes #59
* Address Travis/Vint errors
For some reason, ale isn't running vint for me...
* Incorporate feedback, make fixes
Lazy-loading logic is much improved.
* Add header comments; remove incorrect workaround
* Remove unneeded plugin guards
* Fix lazy-loading linter logic
Set the wrong variable....
* Fix capitialization
2016-10-10 14:51:29 -04:00
|
|
|
return s:linters[a:filetype]
|
|
|
|
endif
|
|
|
|
|
2016-10-11 18:11:45 -04:00
|
|
|
" Load all linters for a given filetype.
|
2016-10-17 06:26:14 -04:00
|
|
|
execute 'silent! runtime! ale_linters/' . a:filetype . '/*.vim'
|
First pass at optimizing ale to autoload (#80)
* First pass at optimizing ale to autoload
First off, the structure/function names should be revised a bit,
but I will wait for @w0rp's input before unifying the naming style.
Second off, the docs probably need some more work, I just did some
simple find-and-replace work.
With that said, this pull brings major performance gains for ale. On my
slowest system, fully loading ale and all its code takes around 150ms.
I have moved all of ale's autoload-able code to autoload/, and in
addition, implemented lazy-loading of linters. This brings load time on
that same system down to 5ms.
The only downside of lazy loading is that `g:ale_linters` cannot be
changed at runtime; however, it also speeds up performance at runtime by
simplfying the logic greatly.
Please let me know what you think!
Closes #59
* Address Travis/Vint errors
For some reason, ale isn't running vint for me...
* Incorporate feedback, make fixes
Lazy-loading logic is much improved.
* Add header comments; remove incorrect workaround
* Remove unneeded plugin guards
* Fix lazy-loading linter logic
Set the wrong variable....
* Fix capitialization
2016-10-10 14:51:29 -04:00
|
|
|
|
|
|
|
if !has_key(s:linters, a:filetype)
|
|
|
|
" If we couldn't load any linters, let everyone know.
|
|
|
|
let s:linters[a:filetype] = []
|
|
|
|
endif
|
|
|
|
|
|
|
|
return s:linters[a:filetype]
|
|
|
|
endfunction
|
2016-10-11 18:11:45 -04:00
|
|
|
|
2016-10-21 22:02:20 -04:00
|
|
|
function! ale#linter#Get(original_filetypes) abort
|
2016-10-11 18:11:45 -04:00
|
|
|
let l:combined_linters = []
|
|
|
|
|
2016-10-21 22:02:20 -04:00
|
|
|
" Handle dot-seperated filetypes.
|
|
|
|
for l:original_filetype in split(a:original_filetypes, '\.')
|
|
|
|
" Try and get an aliased file type either from the user's Dictionary, or
|
|
|
|
" our default Dictionary, otherwise use the filetype as-is.
|
|
|
|
let l:filetype = get(
|
|
|
|
\ g:ale_linter_aliases,
|
|
|
|
\ l:original_filetype,
|
|
|
|
\ get(
|
|
|
|
\ s:default_ale_linter_aliases,
|
|
|
|
\ l:original_filetype,
|
|
|
|
\ l:original_filetype
|
|
|
|
\ )
|
|
|
|
\)
|
|
|
|
|
|
|
|
" Try and get a list of linters to run, using the original file type,
|
|
|
|
" not the aliased filetype. We have some linters to limit by default,
|
|
|
|
" and users may define their own list of linters to run.
|
|
|
|
let l:linter_names = get(
|
|
|
|
\ g:ale_linters,
|
|
|
|
\ l:original_filetype,
|
|
|
|
\ get(
|
|
|
|
\ s:default_ale_linters,
|
|
|
|
\ l:original_filetype,
|
|
|
|
\ 'all'
|
|
|
|
\ )
|
|
|
|
\)
|
|
|
|
|
|
|
|
let l:all_linters = s:LoadLinters(l:filetype)
|
|
|
|
let l:filetype_linters = []
|
|
|
|
|
|
|
|
if type(l:linter_names) == type('') && l:linter_names ==# 'all'
|
|
|
|
let l:filetype_linters = l:all_linters
|
|
|
|
elseif type(l:linter_names) == type([])
|
|
|
|
" Select only the linters we or the user has specified.
|
|
|
|
for l:linter in l:all_linters
|
|
|
|
if index(l:linter_names, l:linter.name) >= 0
|
|
|
|
call add(l:filetype_linters, l:linter)
|
|
|
|
endif
|
|
|
|
endfor
|
|
|
|
endif
|
|
|
|
|
|
|
|
call extend(l:combined_linters, l:filetype_linters)
|
|
|
|
endfor
|
2016-10-11 18:11:45 -04:00
|
|
|
|
|
|
|
return l:combined_linters
|
|
|
|
endfunction
|