summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ale_linters/python/mypy.vim1
-rw-r--r--autoload/ale/c.vim131
-rw-r--r--autoload/ale/completion.vim28
-rw-r--r--autoload/ale/debugging.vim7
-rw-r--r--autoload/ale/fix/registry.vim5
-rw-r--r--autoload/ale/fixers/black.vim4
-rw-r--r--autoload/ale/fixers/gnatpp.vim17
-rw-r--r--autoload/ale/list.vim37
-rw-r--r--autoload/asyncomplete/sources/ale.vim26
-rw-r--r--doc/ale-ada.txt11
-rw-r--r--doc/ale-supported-languages-and-tools.txt1
-rw-r--r--doc/ale.txt12
-rw-r--r--supported-tools.md5
-rw-r--r--test/ada_files/testfile.adb0
-rw-r--r--test/command_callback/python_paths/with_virtualenv/subdir/foo/bar.pyi0
-rw-r--r--test/completion/test_completion_events.vader28
-rw-r--r--test/fixers/test_black_fixer_callback.vader8
-rw-r--r--test/fixers/test_gnatpp_fixer_callback.vader28
-rw-r--r--test/test_ale_info.vader113
-rw-r--r--test/test_c_flag_parsing.vader162
20 files changed, 522 insertions, 102 deletions
diff --git a/ale_linters/python/mypy.vim b/ale_linters/python/mypy.vim
index c4c6507f..dc4044e6 100644
--- a/ale_linters/python/mypy.vim
+++ b/ale_linters/python/mypy.vim
@@ -78,4 +78,5 @@ call ale#linter#Define('python', {
\ 'executable': function('ale_linters#python#mypy#GetExecutable'),
\ 'command': function('ale_linters#python#mypy#GetCommand'),
\ 'callback': 'ale_linters#python#mypy#Handle',
+\ 'output_stream': 'both'
\})
diff --git a/autoload/ale/c.vim b/autoload/ale/c.vim
index 2d2083da..5540ec14 100644
--- a/autoload/ale/c.vim
+++ b/autoload/ale/c.vim
@@ -28,76 +28,107 @@ function! ale#c#GetBuildDirectory(buffer) abort
return ale#path#Dirname(l:json_file)
endfunction
-function! ale#c#AreSpecialCharsBalanced(option) abort
- " Escape \"
- let l:option_escaped = substitute(a:option, '\\"', '', 'g')
-
- " Retain special chars only
- let l:special_chars = substitute(l:option_escaped, '[^"''()`]', '', 'g')
- let l:special_chars = split(l:special_chars, '\zs')
-
- " Check if they are balanced
+function! ale#c#ShellSplit(line) abort
let l:stack = []
+ let l:args = ['']
+ let l:prev = ''
- for l:char in l:special_chars
- if l:char is# ')'
- if len(l:stack) == 0 || get(l:stack, -1) isnot# '('
- return 0
+ for l:char in split(a:line, '\zs')
+ if l:char is# ''''
+ if len(l:stack) > 0 && get(l:stack, -1) is# ''''
+ call remove(l:stack, -1)
+ elseif (len(l:stack) == 0 || get(l:stack, -1) isnot# '"') && l:prev isnot# '\'
+ call add(l:stack, l:char)
endif
-
- call remove(l:stack, -1)
- elseif l:char is# '('
- call add(l:stack, l:char)
- else
+ elseif (l:char is# '"' || l:char is# '`') && l:prev isnot# '\'
if len(l:stack) > 0 && get(l:stack, -1) is# l:char
call remove(l:stack, -1)
- else
+ elseif len(l:stack) == 0 || get(l:stack, -1) isnot# ''''
call add(l:stack, l:char)
endif
+ elseif (l:char is# '(' || l:char is# '[' || l:char is# '{') && l:prev isnot# '\'
+ if len(l:stack) == 0 || get(l:stack, -1) isnot# ''''
+ call add(l:stack, l:char)
+ endif
+ elseif (l:char is# ')' || l:char is# ']' || l:char is# '}') && l:prev isnot# '\'
+ if len(l:stack) > 0 && get(l:stack, -1) is# {')': '(', ']': '[', '}': '{'}[l:char]
+ call remove(l:stack, -1)
+ endif
+ elseif l:char is# ' ' && len(l:stack) == 0
+ if len(get(l:args, -1)) > 0
+ call add(l:args, '')
+ endif
+
+ continue
endif
+
+ let l:args[-1] = get(l:args, -1) . l:char
endfor
- return len(l:stack) == 0
+ return l:args
endfunction
function! ale#c#ParseCFlags(path_prefix, cflag_line) abort
- let l:split_lines = split(a:cflag_line)
+ let l:cflags_list = []
+
+ let l:split_lines = ale#c#ShellSplit(a:cflag_line)
let l:option_index = 0
while l:option_index < len(l:split_lines)
- let l:next_option_index = l:option_index + 1
-
- " Join space-separated option
- while l:next_option_index < len(l:split_lines)
- \&& stridx(l:split_lines[l:next_option_index], '-') != 0
- let l:next_option_index += 1
- endwhile
-
- let l:option = join(l:split_lines[l:option_index : l:next_option_index-1], ' ')
- call remove(l:split_lines, l:option_index, l:next_option_index-1)
- call insert(l:split_lines, l:option, l:option_index)
-
- " Ignore invalid or conflicting options
- if stridx(l:option, '-') != 0
- \|| stridx(l:option, '-o') == 0
- \|| stridx(l:option, '-c') == 0
- call remove(l:split_lines, l:option_index)
- let l:option_index = l:option_index - 1
- " Fix relative path
- elseif stridx(l:option, '-I') == 0
- if !(stridx(l:option, ':') == 2+1 || stridx(l:option, '/') == 2+0)
- let l:option = '-I' . a:path_prefix . s:sep . l:option[2:]
- call remove(l:split_lines, l:option_index)
- call insert(l:split_lines, l:option, l:option_index)
+ let l:option = l:split_lines[l:option_index]
+ let l:option_index = l:option_index + 1
+
+ " Include options, that may need relative path fix
+ if stridx(l:option, '-I') == 0
+ \ || stridx(l:option, '-iquote') == 0
+ \ || stridx(l:option, '-isystem') == 0
+ \ || stridx(l:option, '-idirafter') == 0
+ if stridx(l:option, '-I') == 0 && l:option isnot# '-I'
+ let l:arg = join(split(l:option, '\zs')[2:], '')
+ let l:option = '-I'
+ else
+ let l:arg = l:split_lines[l:option_index]
+ let l:option_index = l:option_index + 1
endif
- endif
- let l:option_index = l:option_index + 1
- endwhile
+ " Fix relative paths if needed
+ if stridx(l:arg, s:sep) != 0 && stridx(l:arg, '/') != 0
+ let l:rel_path = substitute(l:arg, '"', '', 'g')
+ let l:rel_path = substitute(l:rel_path, '''', '', 'g')
+ let l:arg = ale#Escape(a:path_prefix . s:sep . l:rel_path)
+ endif
+
+ call add(l:cflags_list, l:option)
+ call add(l:cflags_list, l:arg)
+ " Options with arg that can be grouped with the option or separate
+ elseif stridx(l:option, '-D') == 0 || stridx(l:option, '-B') == 0
+ call add(l:cflags_list, l:option)
- call uniq(l:split_lines)
+ if l:option is# '-D' || l:option is# '-B'
+ call add(l:cflags_list, l:split_lines[l:option_index])
+ let l:option_index = l:option_index + 1
+ endif
+ " Options that have an argument (always separate)
+ elseif l:option is# '-iprefix' || stridx(l:option, '-iwithprefix') == 0
+ \ || l:option is# '-isysroot' || l:option is# '-imultilib'
+ call add(l:cflags_list, l:option)
+ call add(l:cflags_list, l:split_lines[l:option_index])
+ let l:option_index = l:option_index + 1
+ " Options without argument
+ elseif (stridx(l:option, '-W') == 0 && stridx(l:option, '-Wa,') != 0 && stridx(l:option, '-Wl,') != 0 && stridx(l:option, '-Wp,') != 0)
+ \ || l:option is# '-w' || stridx(l:option, '-pedantic') == 0
+ \ || l:option is# '-ansi' || stridx(l:option, '-std=') == 0
+ \ || (stridx(l:option, '-f') == 0 && stridx(l:option, '-fdump') != 0 && stridx(l:option, '-fdiagnostics') != 0 && stridx(l:option, '-fno-show-column') != 0)
+ \ || stridx(l:option, '-O') == 0
+ \ || l:option is# '-C' || l:option is# '-CC' || l:option is# '-trigraphs'
+ \ || stridx(l:option, '-nostdinc') == 0 || stridx(l:option, '-iplugindir=') == 0
+ \ || stridx(l:option, '--sysroot=') == 0 || l:option is# '--no-sysroot-suffix'
+ \ || stridx(l:option, '-m') == 0
+ call add(l:cflags_list, l:option)
+ endif
+ endwhile
- return join(l:split_lines, ' ')
+ return join(l:cflags_list, ' ')
endfunction
function! ale#c#ParseCFlagsFromMakeOutput(buffer, make_output) abort
diff --git a/autoload/ale/completion.vim b/autoload/ale/completion.vim
index c0e8abd9..ebf32909 100644
--- a/autoload/ale/completion.vim
+++ b/autoload/ale/completion.vim
@@ -267,6 +267,14 @@ function! ale#completion#Show(result) abort
\ {-> ale#util#FeedKeys("\<Plug>(ale_show_completion_menu)")}
\)
endif
+
+ if l:source is# 'ale-callback'
+ call b:CompleteCallback(b:ale_completion_result)
+ endif
+endfunction
+
+function! ale#completion#GetAllTriggers() abort
+ return deepcopy(s:trigger_character_map)
endfunction
function! s:CompletionStillValid(request_id) abort
@@ -280,6 +288,7 @@ function! s:CompletionStillValid(request_id) abort
\ b:ale_completion_info.column == l:column
\ || b:ale_completion_info.source is# 'deoplete'
\ || b:ale_completion_info.source is# 'ale-omnifunc'
+ \ || b:ale_completion_info.source is# 'ale-callback'
\)
endfunction
@@ -560,12 +569,25 @@ endfunction
" This function can be used to manually trigger autocomplete, even when
" g:ale_completion_enabled is set to false
-function! ale#completion#GetCompletions(source) abort
+function! ale#completion#GetCompletions(...) abort
+ let l:source = get(a:000, 0, '')
+ let l:options = get(a:000, 1, {})
+
+ if len(a:000) > 2
+ throw 'Too many arguments!'
+ endif
+
+ let l:CompleteCallback = get(l:options, 'callback', v:null)
+
+ if l:CompleteCallback isnot v:null
+ let b:CompleteCallback = l:CompleteCallback
+ endif
+
let [l:line, l:column] = getpos('.')[1:2]
let l:prefix = ale#completion#GetPrefix(&filetype, l:line, l:column)
- if a:source is# 'ale-automatic' && empty(l:prefix)
+ if l:source is# 'ale-automatic' && empty(l:prefix)
return 0
endif
@@ -578,7 +600,7 @@ function! ale#completion#GetCompletions(source) abort
\ 'prefix': l:prefix,
\ 'conn_id': 0,
\ 'request_id': 0,
- \ 'source': a:source,
+ \ 'source': l:source,
\}
unlet! b:ale_completion_result
diff --git a/autoload/ale/debugging.vim b/autoload/ale/debugging.vim
index 7cdbabaa..379c0d73 100644
--- a/autoload/ale/debugging.vim
+++ b/autoload/ale/debugging.vim
@@ -62,7 +62,7 @@ function! s:Echo(message) abort
execute 'echo a:message'
endfunction
-function! s:GetLinterVariables(filetype, linter_names) abort
+function! s:GetLinterVariables(filetype, exclude_linter_names) abort
let l:variable_list = []
let l:filetype_parts = split(a:filetype, '\.')
@@ -73,7 +73,7 @@ function! s:GetLinterVariables(filetype, linter_names) abort
" Include matching variables.
if !empty(l:match)
\&& index(l:filetype_parts, l:match[1]) >= 0
- \&& index(a:linter_names, l:match[2]) >= 0
+ \&& index(a:exclude_linter_names, l:match[2]) == -1
call add(l:variable_list, l:key)
endif
endfor
@@ -211,10 +211,11 @@ function! ale#debugging#Info() abort
let l:all_names = map(copy(l:all_linters), 'v:val[''name'']')
let l:enabled_names = map(copy(l:enabled_linters), 'v:val[''name'']')
+ let l:exclude_names = filter(copy(l:all_names), 'index(l:enabled_names, v:val) == -1')
" Load linter variables to display
" This must be done after linters are loaded.
- let l:variable_list = s:GetLinterVariables(l:filetype, l:enabled_names)
+ let l:variable_list = s:GetLinterVariables(l:filetype, l:exclude_names)
let l:fixers = ale#fix#registry#SuggestedFixers(l:filetype)
let l:fixers = uniq(sort(l:fixers[0] + l:fixers[1]))
diff --git a/autoload/ale/fix/registry.vim b/autoload/ale/fix/registry.vim
index c5ef1544..3850d782 100644
--- a/autoload/ale/fix/registry.vim
+++ b/autoload/ale/fix/registry.vim
@@ -325,6 +325,11 @@ let s:default_registry = {
\ 'suggested_filetypes': ['python'],
\ 'description': 'Sort Python imports with reorder-python-imports.',
\ },
+\ 'gnatpp': {
+\ 'function': 'ale#fixers#gnatpp#Fix',
+\ 'suggested_filetypes': ['ada'],
+\ 'description': 'Format Ada files with gnatpp.',
+\ },
\}
" Reset the function registry to the default entries.
diff --git a/autoload/ale/fixers/black.vim b/autoload/ale/fixers/black.vim
index 367b8d52..fba6c3b4 100644
--- a/autoload/ale/fixers/black.vim
+++ b/autoload/ale/fixers/black.vim
@@ -29,6 +29,10 @@ function! ale#fixers#black#Fix(buffer) abort
let l:options = ale#Var(a:buffer, 'python_black_options')
+ if expand('#' . a:buffer . ':e') is? 'pyi'
+ let l:options .= '--pyi'
+ endif
+
return {
\ 'command': l:cd_string . ale#Escape(l:executable) . l:exec_args
\ . (!empty(l:options) ? ' ' . l:options : '')
diff --git a/autoload/ale/fixers/gnatpp.vim b/autoload/ale/fixers/gnatpp.vim
new file mode 100644
index 00000000..bf3d484e
--- /dev/null
+++ b/autoload/ale/fixers/gnatpp.vim
@@ -0,0 +1,17 @@
+" Author: tim <tim@inept.tech>
+" Description: Fix files with gnatpp.
+
+call ale#Set('ada_gnatpp_executable', 'gnatpp')
+call ale#Set('ada_gnatpp_options', '')
+
+function! ale#fixers#gnatpp#Fix(buffer) abort
+ let l:executable = ale#Var(a:buffer, 'ada_gnatpp_executable')
+ let l:options = ale#Var(a:buffer, 'ada_gnatpp_options')
+
+ return {
+ \ 'command': ale#Escape(l:executable)
+ \ . (!empty(l:options) ? ' ' . l:options : '')
+ \ . ' %t',
+ \ 'read_temporary_file': 1,
+ \}
+endfunction
diff --git a/autoload/ale/list.vim b/autoload/ale/list.vim
index e9f3f4ec..4bfe2a7b 100644
--- a/autoload/ale/list.vim
+++ b/autoload/ale/list.vim
@@ -103,6 +103,9 @@ function! s:SetListsImpl(timer_id, buffer, loclist) abort
endfor
endif
+ " Save the current view before opening/closing any window
+ call setbufvar(a:buffer, 'ale_winview', winsaveview())
+
" Open a window to show the problems if we need to.
"
" We'll check if the current buffer's List is not empty here, so the
@@ -141,6 +144,8 @@ function! s:SetListsImpl(timer_id, buffer, loclist) abort
normal! "\<c-g>"
endif
endif
+
+ call s:RestoreViewIfNeeded(a:buffer)
endif
" If ALE isn't currently checking for more problems, close the window if
@@ -151,6 +156,30 @@ function! s:SetListsImpl(timer_id, buffer, loclist) abort
endif
endfunction
+" Try to restore the window view after closing any of the lists to avoid making
+" the it moving around, especially useful when on insert mode
+function! s:RestoreViewIfNeeded(buffer) abort
+ let l:saved_view = getbufvar(a:buffer, 'ale_winview', {})
+
+ " Saved view is empty, can't do anything
+ if empty(l:saved_view)
+ return
+ endif
+
+ " Check wether the cursor has moved since linting was actually requested. If
+ " the user has indeed moved lines, do nothing
+ let l:current_view = winsaveview()
+
+ if l:current_view['lnum'] != l:saved_view['lnum']
+ return
+ endif
+
+ " Anchor view by topline if the list is set to open horizontally
+ if ale#Var(a:buffer, 'list_vertical') == 0
+ call winrestview({'topline': l:saved_view['topline']})
+ endif
+endfunction
+
function! ale#list#SetLists(buffer, loclist) abort
if get(g:, 'ale_set_lists_synchronously') == 1
\|| getbufvar(a:buffer, 'ale_save_event_fired', 0)
@@ -174,12 +203,15 @@ function! s:CloseWindowIfNeeded(buffer) abort
return
endif
+ let l:did_close_any_list = 0
+
try
" Only close windows if the quickfix list or loclist is completely empty,
" including errors set through other means.
if g:ale_set_quickfix
if empty(getqflist())
cclose
+ let l:did_close_any_list = 1
endif
else
let l:win_ids = s:WinFindBuf(a:buffer)
@@ -187,10 +219,15 @@ function! s:CloseWindowIfNeeded(buffer) abort
for l:win_id in l:win_ids
if g:ale_set_loclist && empty(getloclist(l:win_id))
lclose
+ let l:did_close_any_list = 1
endif
endfor
endif
" Ignore 'Cannot close last window' errors.
catch /E444/
endtry
+
+ if l:did_close_any_list
+ call s:RestoreViewIfNeeded(a:buffer)
+ endif
endfunction
diff --git a/autoload/asyncomplete/sources/ale.vim b/autoload/asyncomplete/sources/ale.vim
new file mode 100644
index 00000000..ce793773
--- /dev/null
+++ b/autoload/asyncomplete/sources/ale.vim
@@ -0,0 +1,26 @@
+function! asyncomplete#sources#ale#get_source_options(...) abort
+ let l:default = extend({
+ \ 'name': 'ale',
+ \ 'completor': function('asyncomplete#sources#ale#completor'),
+ \ 'whitelist': ['*'],
+ \ 'triggers': asyncomplete#sources#ale#get_triggers(),
+ \ }, a:0 >= 1 ? a:1 : {})
+
+ return extend(l:default, {'refresh_pattern': '\k\+$'})
+endfunction
+
+function! asyncomplete#sources#ale#get_triggers() abort
+ let l:triggers = ale#completion#GetAllTriggers()
+ let l:triggers['*'] = l:triggers['<default>']
+
+ return l:triggers
+endfunction
+
+function! asyncomplete#sources#ale#completor(options, context) abort
+ let l:keyword = matchstr(a:context.typed, '\w\+$')
+ let l:startcol = a:context.col - len(l:keyword)
+
+ call ale#completion#GetCompletions('ale-callback', { 'callback': {completions ->
+ \ asyncomplete#complete(a:options.name, a:context, l:startcol, completions)
+ \ }})
+endfunction
diff --git a/doc/ale-ada.txt b/doc/ale-ada.txt
index 93e3261a..2ac30c0a 100644
--- a/doc/ale-ada.txt
+++ b/doc/ale-ada.txt
@@ -22,4 +22,15 @@ g:ale_ada_gcc_options *g:ale_ada_gcc_options*
===============================================================================
+gnatpp *ale-ada-gnatpp*
+
+g:ale_ada_gnatpp_options *g:ale_ada_gnatpp_options*
+ *b:ale_ada_gnatpp_options*
+ Type: |String|
+ Default: `''`
+
+ This variable can be set to pass extra options to the gnatpp fixer.
+
+
+===============================================================================
vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl:
diff --git a/doc/ale-supported-languages-and-tools.txt b/doc/ale-supported-languages-and-tools.txt
index d39aaf7e..1a664450 100644
--- a/doc/ale-supported-languages-and-tools.txt
+++ b/doc/ale-supported-languages-and-tools.txt
@@ -14,6 +14,7 @@ Notes:
* Ada
* `gcc`
+ * `gnatpp`
* Ansible
* `ansible-lint`
* API Blueprint
diff --git a/doc/ale.txt b/doc/ale.txt
index 5541236f..6d8c6a45 100644
--- a/doc/ale.txt
+++ b/doc/ale.txt
@@ -341,6 +341,17 @@ completion source for Deoplete is named `'ale'`, and should enabled
automatically if Deoplete is enabled and configured correctly. Deoplete
integration should not be combined with ALE's own implementation.
+ *ale-asyncomplete-integration*
+
+ALE additionally integrates with asyncomplete.vim for offering automatic
+completion data. ALE's asyncomplete source requires registration and should
+use the defaults provided by the|asyncomplete#sources#ale#get_source_options| function >
+
+ " Use ALE's function for asyncomplete defaults
+ au User asyncomplete_setup call asyncomplete#register_source(asyncomplete#sources#ale#get_source_options({
+ \ 'priority': 10, " Provide your own overrides here
+ \ }))
+>
ALE also offers its own completion implementation, which does not require any
other plugins. Suggestions will be made while you type after completion is
enabled. ALE's own completion implementation can be enabled by setting
@@ -1981,6 +1992,7 @@ documented in additional help files.
ada.....................................|ale-ada-options|
gcc...................................|ale-ada-gcc|
+ gnatpp................................|ale-ada-gnatpp|
ansible.................................|ale-ansible-options|
ansible-lint..........................|ale-ansible-ansible-lint|
asciidoc................................|ale-asciidoc-options|
diff --git a/supported-tools.md b/supported-tools.md
index 6cb9f418..4127edfc 100644
--- a/supported-tools.md
+++ b/supported-tools.md
@@ -23,6 +23,7 @@ formatting.
* Ada
* [gcc](https://gcc.gnu.org)
+ * [gnatpp](https://docs.adacore.com/gnat_ugn-docs/html/gnat_ugn/gnat_ugn/gnat_utility_programs.html#the-gnat-pretty-printer-gnatpp) :floppy_disk:
* Ansible
* [ansible-lint](https://github.com/willthames/ansible-lint)
* API Blueprint
@@ -125,8 +126,8 @@ formatting.
* [hadolint](https://github.com/hadolint/hadolint)
* Elixir
* [credo](https://github.com/rrrene/credo)
- * [dialyxir](https://github.com/jeremyjh/dialyxir)
- * [dogma](https://github.com/lpil/dogma)
+ * [dialyxir](https://github.com/jeremyjh/dialyxir) :floppy_disk:
+ * [dogma](https://github.com/lpil/dogma) :floppy_disk:
* [elixir-ls](https://github.com/JakeBecker/elixir-ls) :warning:
* [mix](https://hexdocs.pm/mix/Mix.html) :warning: :floppy_disk:
* Elm
diff --git a/test/ada_files/testfile.adb b/test/ada_files/testfile.adb
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/ada_files/testfile.adb
diff --git a/test/command_callback/python_paths/with_virtualenv/subdir/foo/bar.pyi b/test/command_callback/python_paths/with_virtualenv/subdir/foo/bar.pyi
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/command_callback/python_paths/with_virtualenv/subdir/foo/bar.pyi
diff --git a/test/completion/test_completion_events.vader b/test/completion/test_completion_events.vader
index 6bc0035e..5672f8e5 100644
--- a/test/completion/test_completion_events.vader
+++ b/test/completion/test_completion_events.vader
@@ -62,6 +62,10 @@ After:
delfunction CheckCompletionCalled
+ if exists('*CompleteCallback')
+ delfunction CompleteCallback
+ endif
+
" Stop any timers we left behind.
" This stops the tests from failing randomly.
call ale#completion#StopTimer()
@@ -333,6 +337,30 @@ Execute(b:ale_completion_info should be set up correctly for other sources):
\ b:ale_completion_info
Assert !exists('b:ale_completion_result')
+Execute(b:ale_completion_info should be set up correctly when requesting completions via callback):
+ let b:ale_completion_result = []
+ call setpos('.', [bufnr(''), 3, 14, 0])
+
+ function! CompleteCallback() abort
+ echo 'Called'
+ endfunction
+
+
+ call ale#completion#GetCompletions('ale-callback', {'callback': funcref('CompleteCallback')})
+
+ AssertEqual
+ \ {
+ \ 'request_id': 0,
+ \ 'conn_id': 0,
+ \ 'column': 14,
+ \ 'line_length': 14,
+ \ 'line': 3,
+ \ 'prefix': 'ab',
+ \ 'source': 'ale-callback',
+ \ },
+ \ b:ale_completion_info
+ Assert !exists('b:ale_completion_result')
+
Execute(The correct keybinds should be configured):
redir => g:output
silent map <Plug>(ale_show_completion_menu)
diff --git a/test/fixers/test_black_fixer_callback.vader b/test/fixers/test_black_fixer_callback.vader
index 25ad05db..75864479 100644
--- a/test/fixers/test_black_fixer_callback.vader
+++ b/test/fixers/test_black_fixer_callback.vader
@@ -36,6 +36,14 @@ Execute(The black callback should include options):
\ {'command': ale#Escape(ale#path#Simplify(g:dir . '/python_paths/with_virtualenv/env/' . b:bin_dir . '/black')) . ' --some-option -' },
\ ale#fixers#black#Fix(bufnr(''))
+Execute(The black callback should include --pyi for .pyi files):
+ let g:ale_python_black_change_directory = 0
+
+ silent execute 'file ' . fnameescape(g:dir . '/python_paths/with_virtualenv/subdir/foo/bar.pyi')
+ AssertEqual
+ \ {'command': ale#Escape(ale#path#Simplify(g:dir . '/python_paths/with_virtualenv/env/' . b:bin_dir . '/black')) . ' --pyi -' },
+ \ ale#fixers#black#Fix(bufnr(''))
+
Execute(Pipenv is detected when python_black_auto_pipenv is set):
let g:ale_python_black_auto_pipenv = 1
let g:ale_python_black_change_directory = 0
diff --git a/test/fixers/test_gnatpp_fixer_callback.vader b/test/fixers/test_gnatpp_fixer_callback.vader
new file mode 100644
index 00000000..a2bf898e
--- /dev/null
+++ b/test/fixers/test_gnatpp_fixer_callback.vader
@@ -0,0 +1,28 @@
+Before:
+ call ale#assert#SetUpFixerTest('ada', 'gnatpp')
+
+After:
+ " Reset fixers, variables, etc.
+ "
+ " Vader's 'Restore' command will be called here.
+ call ale#assert#TearDownFixerTest()
+
+Execute(The default command should be correct):
+ call ale#test#SetFilename('../ada_files/testfile.adb')
+
+ AssertFixer
+ \ {
+ \ 'command': ale#Escape(g:ale_ada_gnatpp_executable) .' %t',
+ \ 'read_temporary_file': 1,
+ \ }
+
+Execute(The version check should be correct):
+ call ale#test#SetFilename('../ada_files/testfile.adb')
+ let g:ale_ada_gnatpp_options = '--no-alignment'
+
+ AssertFixer
+ \ {
+ \ 'command': ale#Escape(g:ale_ada_gnatpp_executable)
+ \ . ' --no-alignment %t',
+ \ 'read_temporary_file': 1,
+ \ }
diff --git a/test/test_ale_info.vader b/test/test_ale_info.vader
index decd49e9..e1208679 100644
--- a/test/test_ale_info.vader
+++ b/test/test_ale_info.vader
@@ -1,50 +1,112 @@
Before:
Save g:ale_buffer_info
Save g:ale_cache_executable_check_failures
+ Save g:ale_change_sign_column_color
+ Save g:ale_command_wrapper
Save g:ale_completion_delay
Save g:ale_completion_enabled
Save g:ale_completion_max_suggestions
+ Save g:ale_echo_cursor
+ Save g:ale_echo_msg_error_str
+ Save g:ale_echo_msg_format
+ Save g:ale_echo_msg_info_str
+ Save g:ale_echo_msg_warning_str
+ Save g:ale_fix_on_save
Save g:ale_fixers
+ Save g:ale_history_enabled
Save g:ale_history_log_output
+ Save g:ale_keep_list_window_open
+ Save g:ale_lint_delay
+ Save g:ale_lint_on_enter
+ Save g:ale_lint_on_filetype_changed
Save g:ale_lint_on_insert_leave
+ Save g:ale_lint_on_save
Save g:ale_lint_on_text_changed
Save g:ale_linters
+ Save g:ale_linters_explicit
+ Save g:ale_list_vertical
+ Save g:ale_list_window_size
+ Save g:ale_loclist_msg_format
Save g:ale_lsp_error_messages
+ Save g:ale_lsp_root
+ Save g:ale_max_buffer_history_size
+ Save g:ale_max_signs
Save g:ale_maximum_file_size
+ Save g:ale_open_list
Save g:ale_pattern_options
Save g:ale_pattern_options_enabled
Save g:ale_set_balloons
+ Save g:ale_set_highlights
+ Save g:ale_set_loclist
+ Save g:ale_set_quickfix
+ Save g:ale_set_signs
+ Save g:ale_sign_column_always
Save g:ale_sign_error
Save g:ale_sign_info
+ Save g:ale_sign_offset
Save g:ale_sign_style_error
Save g:ale_sign_style_warning
Save g:ale_sign_warning
Save g:ale_statusline_format
Save g:ale_type_map
+ Save g:ale_use_global_executables
+ Save g:ale_virtualtext_cursor
+ Save g:ale_warn_about_trailing_blank_lines
Save g:ale_warn_about_trailing_whitespace
unlet! b:ale_history
let g:ale_buffer_info = {}
let g:ale_cache_executable_check_failures = 0
+ let g:ale_change_sign_column_color = 0
+ let g:ale_command_wrapper = ''
let g:ale_completion_delay = 100
let g:ale_completion_enabled = 0
let g:ale_completion_max_suggestions = 50
+ let g:ale_echo_cursor = 1
+ let g:ale_echo_msg_error_str = 'Error'
+ let g:ale_echo_msg_format = '%code: %%s'
+ let g:ale_echo_msg_info_str = 'Info'
+ let g:ale_echo_msg_warning_str = 'Warning'
+ let g:ale_fix_on_save = 0
+ let g:ale_history_enabled = 1
let g:ale_history_log_output = 1
+ let g:ale_keep_list_window_open = 0
+ let g:ale_lint_delay = 200
+ let g:ale_lint_on_enter = 1
+ let g:ale_lint_on_filetype_changed = 1
let g:ale_lint_on_insert_leave = 1
+ let g:ale_lint_on_save = 1
let g:ale_lint_on_text_changed = 'normal'
+ let g:ale_linters_explicit = 0
+ let g:ale_list_vertical = 0
+ let g:ale_list_window_size = 10
+ let g:ale_loclist_msg_format = '%code: %%s'
let g:ale_lsp_error_messages = {}
+ let g:ale_lsp_root = {}
+ let g:ale_max_buffer_history_size = 20
+ let g:ale_max_signs = -1
let g:ale_maximum_file_size = 0
+ let g:ale_open_list = 0
let g:ale_pattern_options = {}
let g:ale_pattern_options_enabled = 0
let g:ale_set_balloons = 0
+ let g:ale_set_highlights = 1
+ let g:ale_set_loclist = 1
+ let g:ale_set_quickfix = 0
+ let g:ale_set_signs = 1
+ let g:ale_sign_column_always = 0
let g:ale_sign_error = '>>'
let g:ale_sign_info = '--'
+ let g:ale_sign_offset = 1000000
let g:ale_sign_style_error = '>>'
let g:ale_sign_style_warning = '--'
let g:ale_sign_warning = '--'
let g:ale_statusline_format = ['%d error(s)', '%d warning(s)', 'OK']
let g:ale_type_map = {}
+ let g:ale_use_global_executables = v:null
+ let g:ale_virtualtext_cursor = 0
+ let g:ale_warn_about_trailing_blank_lines = 1
let g:ale_warn_about_trailing_whitespace = 1
let g:testlinter1 = {'name': 'testlinter1', 'executable': 'testlinter1', 'command': 'testlinter1', 'callback': 'testCB1', 'output_stream': 'stdout'}
@@ -164,6 +226,8 @@ After:
unlet! b:ale_testft2_testlinter2_foo
unlet! g:ale_testft2_testlinter2_bar
unlet! g:info_test_file
+ unlet! g:ale_testft_build_dir_names
+ unlet! g:ale_testft_testlinter2_option
delfunction CheckInfo
call ale#test#RestoreDirectory()
@@ -632,3 +696,52 @@ Execute (LSP errors for other linters shouldn't appear):
\ + g:globals_lines
\ + g:command_header
\)
+
+Given testft.testft2 (Empty buffer with two filetypes):
+Execute (ALEInfo should include linter global options):
+ call ale#linter#Define('testft', g:testlinter1)
+ call ale#linter#Define('testft2', g:testlinter2)
+
+ " eg: like g:c_build_dir_names
+ let g:ale_testft_build_dir_names = ['build', 'bin']
+
+ call add(g:variables_lines, 'let g:ale_testft_build_dir_names = [''build'', ''bin'']')
+
+ call CheckInfo(
+ \ [
+ \ ' Current Filetype: testft.testft2',
+ \ 'Available Linters: [''testlinter1'', ''testlinter2'']',
+ \ ' Enabled Linters: [''testlinter1'', ''testlinter2'']',
+ \ ]
+ \ + g:fixer_lines
+ \ + g:variables_lines
+ \ + g:globals_lines
+ \ + g:command_header
+ \)
+
+Given testft (Empty buffer with two filetypes):
+Execute (ALEInfo should include linter global options for enabled linters):
+ call ale#linter#Define('testft', g:testlinter1)
+ call ale#linter#Define('testft', g:testlinter2)
+
+ let g:ale_linters = {'testft': ['testlinter1']}
+
+ " should not appear, since not enabled
+ let g:ale_testft_testlinter2_option = 'test'
+
+ let g:globals_lines[index(g:globals_lines, 'let g:ale_linters = {}')]
+ \ = 'let g:ale_linters = {''testft'': [''testlinter1'']}'
+
+ call CheckInfo(
+ \ [
+ \ ' Current Filetype: testft',
+ \ 'Available Linters: [''testlinter1'', ''testlinter2'']',
+ \ ' Enabled Linters: [''testlinter1'']',
+ \ ]
+ \ + g:fixer_lines
+ \ + g:variables_lines
+ \ + g:globals_lines
+ \ + g:command_header
+ \)
+
+
diff --git a/test/test_c_flag_parsing.vader b/test/test_c_flag_parsing.vader
index 045554a3..8ae6f9dc 100644
--- a/test/test_c_flag_parsing.vader
+++ b/test/test_c_flag_parsing.vader
@@ -14,7 +14,7 @@ Execute(The CFlags parser should be able to parse include directives):
call ale#test#SetFilename('test_c_projects/makefile_project/subdir/file.c')
AssertEqual
- \ '-I' . ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir'),
+ \ '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir')),
\ ale#c#ParseCFlagsFromMakeOutput(bufnr(''), ['gcc -Isubdir -c file.c'])
AssertEqual
@@ -25,14 +25,14 @@ Execute(ParseCFlags should ignore -c and -o):
call ale#test#SetFilename('test_c_projects/makefile_project/subdir/file.c')
AssertEqual
- \ '-I' . ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir'),
+ \ '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir')),
\ ale#c#ParseCFlagsFromMakeOutput(bufnr(''), ['gcc -Isubdir -c file.c -o a.out'])
Execute(The CFlags parser should be able to parse macro directives):
call ale#test#SetFilename('test_c_projects/makefile_project/subdir/file.c')
AssertEqual
- \ '-I' . ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir')
+ \ '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir'))
\ . ' -DTEST=1',
\ ale#c#ParseCFlagsFromMakeOutput(bufnr(''), ['gcc -Isubdir -DTEST=1 -c file.c'])
@@ -40,7 +40,7 @@ Execute(The CFlags parser should be able to parse macro directives with spaces):
call ale#test#SetFilename('test_c_projects/makefile_project/subdir/file.c')
AssertEqual
- \ '-I' . ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir')
+ \ '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir'))
\ . ' -DTEST=$(( 2 * 4 ))',
\ ale#c#ParseCFlagsFromMakeOutput(bufnr(''), ['gcc -Isubdir -DTEST=$(( 2 * 4 )) -c file.c'])
@@ -48,14 +48,14 @@ Execute(The CFlags parser should be able to parse shell directives with spaces):
call ale#test#SetFilename('test_c_projects/makefile_project/subdir/file.c')
AssertEqual
- \ '-I' . ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir')
+ \ '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir'))
\ . ' -DTEST=`date +%s`',
\ ale#c#ParseCFlagsFromMakeOutput(bufnr(''), ['gcc -Isubdir -DTEST=`date +%s` -c file.c'])
Execute(ParseCFlags should be able to parse flags with relative paths):
AssertEqual
- \ '-I' . ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir')
- \ . ' ' . '-I' . ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/kernel/include')
+ \ '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir'))
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/kernel/include'))
\ . ' -DTEST=`date +%s`',
\ ale#c#ParseCFlags(
\ ale#path#Simplify(g:dir. '/test_c_projects/makefile_project'),
@@ -67,8 +67,8 @@ Execute(ParseCFlags should be able to parse flags with relative paths):
Execute(ParseCFlags should be able to parse -Dgoal):
AssertEqual
\ '-Dgoal=9'
- \ . ' ' . '-I' . ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir')
- \ . ' ' . '-I' . ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/kernel/include')
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir'))
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/kernel/include'))
\ . ' -DTEST=`date +%s`',
\ ale#c#ParseCFlags(
\ ale#path#Simplify(g:dir. '/test_c_projects/makefile_project'),
@@ -77,16 +77,30 @@ Execute(ParseCFlags should be able to parse -Dgoal):
\ . ' -DTEST=`date +%s` -c file.c'
\ )
+Execute(ParseCFlags should ignore -T and other arguments):
+ AssertEqual
+ \ '-Dgoal=9'
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir'))
+ \ . ' ' . '--sysroot=subdir'
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/kernel/include'))
+ \ . ' -DTEST=`date +%s`',
+ \ ale#c#ParseCFlags(
+ \ ale#path#Simplify(g:dir. '/test_c_projects/makefile_project'),
+ \ 'gcc -Dgoal=9 -Tlinkerfile.ld blabla -Isubdir --sysroot=subdir '
+ \ . '-I'. ale#path#Simplify('kernel/include')
+ \ . ' -DTEST=`date +%s` -c file.c'
+ \ )
+
Execute(ParseCFlags should handle paths with spaces in double quotes):
AssertEqual
\ '-Dgoal=9'
- \ . ' ' . '-I' . ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir')
- \ . ' ' . '-I' . ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/"dir with spaces"')
- \ . ' ' . '-I' . ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/kernel/include')
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir'))
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/dir with spaces'))
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/kernel/include'))
\ . ' -DTEST=`date +%s`',
\ ale#c#ParseCFlags(
\ ale#path#Simplify(g:dir. '/test_c_projects/makefile_project'),
- \ 'gcc -Dgoal=9 -Isubdir '
+ \ 'gcc -Dgoal=9 -Tlinkerfile.ld blabla -Isubdir '
\ . '-I"dir with spaces"' . ' -I'. ale#path#Simplify('kernel/include')
\ . ' -DTEST=`date +%s` -c file.c'
\ )
@@ -94,28 +108,29 @@ Execute(ParseCFlags should handle paths with spaces in double quotes):
Execute(ParseCFlags should handle paths with spaces in single quotes):
AssertEqual
\ '-Dgoal=9'
- \ . ' ' . '-I' . ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir')
- \ . ' ' . '-I' . ale#path#Simplify(g:dir. "/test_c_projects/makefile_project/'dir with spaces'")
- \ . ' ' . '-I' . ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/kernel/include')
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir'))
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/dir with spaces'))
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/kernel/include'))
\ . ' -DTEST=`date +%s`',
\ ale#c#ParseCFlags(
\ ale#path#Simplify(g:dir. '/test_c_projects/makefile_project'),
- \ 'gcc -Dgoal=9 -Isubdir '
- \ . "-I'dir with spaces'" . ' -I'. ale#path#Simplify('kernel/include')
+ \ 'gcc -Dgoal=9 -Tlinkerfile.ld blabla -Isubdir '
+ \ . '-I''dir with spaces''' . ' -I'. ale#path#Simplify('kernel/include')
\ . ' -DTEST=`date +%s` -c file.c'
\ )
Execute(ParseCFlags should handle paths with minuses):
AssertEqual
\ '-Dgoal=9'
- \ . ' ' . '-I' . ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir')
- \ . ' ' . '-I' . ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/dir-with-dash')
- \ . ' ' . '-I' . ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/kernel/include')
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir'))
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/dir with spaces'))
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/dir-with-dash'))
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/kernel/include'))
\ . ' -DTEST=`date +%s`',
\ ale#c#ParseCFlags(
\ ale#path#Simplify(g:dir. '/test_c_projects/makefile_project'),
- \ 'gcc -Dgoal=9 -Isubdir '
- \ . ' -Idir-with-dash'
+ \ 'gcc -Dgoal=9 -Tlinkerfile.ld blabla -Isubdir '
+ \ . '-I''dir with spaces''' . ' -Idir-with-dash'
\ . ' -I'. ale#path#Simplify('kernel/include')
\ . ' -DTEST=`date +%s` -c file.c'
\ )
@@ -123,14 +138,17 @@ Execute(ParseCFlags should handle paths with minuses):
Execute(ParseCFlags should handle -D with minuses):
AssertEqual
\ '-Dgoal=9'
- \ . ' ' . '-I' . ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir')
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir'))
\ . ' -Dmacro-with-dash'
- \ . ' ' . '-I' . ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/kernel/include')
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/dir with spaces'))
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/dir-with-dash'))
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/kernel/include'))
\ . ' -DTEST=`date +%s`',
\ ale#c#ParseCFlags(
\ ale#path#Simplify(g:dir. '/test_c_projects/makefile_project'),
- \ 'gcc -Dgoal=9 -Isubdir '
+ \ 'gcc -Dgoal=9 -Tlinkerfile.ld blabla -Isubdir '
\ . '-Dmacro-with-dash '
+ \ . '-I''dir with spaces''' . ' -Idir-with-dash'
\ . ' -I'. ale#path#Simplify('kernel/include')
\ . ' -DTEST=`date +%s` -c file.c'
\ )
@@ -138,11 +156,16 @@ Execute(ParseCFlags should handle -D with minuses):
Execute(ParseCFlags should handle flags at the end of the line):
AssertEqual
\ '-Dgoal=9'
- \ . ' ' . '-I' . ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir')
- \ . ' ' . '-I' . ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/kernel/include'),
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir'))
+ \ . ' -Dmacro-with-dash'
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/dir with spaces'))
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/dir-with-dash'))
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/kernel/include')),
\ ale#c#ParseCFlags(
\ ale#path#Simplify(g:dir. '/test_c_projects/makefile_project'),
- \ 'gcc -Dgoal=9 -Isubdir '
+ \ 'gcc -Dgoal=9 -Tlinkerfile.ld blabla -Isubdir '
+ \ . '-Dmacro-with-dash '
+ \ . '-I''dir with spaces''' . ' -Idir-with-dash'
\ . ' -I'. ale#path#Simplify('kernel/include')
\ )
@@ -156,14 +179,14 @@ Execute(ParseCompileCommandsFlags should parse some basic flags):
silent noautocmd execute 'file! ' . fnameescape(ale#path#Simplify('/foo/bar/xmms2-mpris/src/xmms2-mpris.c'))
AssertEqual
- \ '-I/usr/include/xmms2',
+ \ '-I ' . ale#path#Simplify('/usr/include/xmms2'),
\ ale#c#ParseCompileCommandsFlags(bufnr(''), { "xmms2-mpris.c": [
\ {
- \ 'directory': '/foo/bar/xmms2-mpris',
- \ 'command': '/usr/bin/cc -I' . '/usr/include/xmms2'
+ \ 'directory': ale#path#Simplify('/foo/bar/xmms2-mpris'),
+ \ 'command': '/usr/bin/cc -I' . ale#path#Simplify('/usr/include/xmms2')
\ . ' -o CMakeFiles/xmms2-mpris.dir/src/xmms2-mpris.c.o'
- \ . ' -c ' . '/foo/bar/xmms2-mpris/src/xmms2-mpris.c',
- \ 'file': '/foo/bar/xmms2-mpris/src/xmms2-mpris.c',
+ \ . ' -c ' . ale#path#Simplify('/foo/bar/xmms2-mpris/src/xmms2-mpris.c'),
+ \ 'file': ale#path#Simplify('/foo/bar/xmms2-mpris/src/xmms2-mpris.c'),
\ },
\ ] }, {})
@@ -183,14 +206,14 @@ Execute(ParseCompileCommandsFlags should fall back to files in the same director
silent noautocmd execute 'file! ' . fnameescape(ale#path#Simplify('/foo/bar/xmms2-mpris/src/xmms2-mpris.c'))
AssertEqual
- \ '-I/usr/include/xmms2',
+ \ '-I ' . ale#path#Simplify('/usr/include/xmms2'),
\ ale#c#ParseCompileCommandsFlags(bufnr(''), {}, { "src": [
\ {
- \ 'directory': '/foo/bar/xmms2-mpris',
- \ 'command': '/usr/bin/cc -I' . '/usr/include/xmms2'
+ \ 'directory': ale#path#Simplify('/foo/bar/xmms2-mpris'),
+ \ 'command': '/usr/bin/cc -I' . ale#path#Simplify('/usr/include/xmms2')
\ . ' -o CMakeFiles/xmms2-mpris.dir/src/xmms2-mpris.c.o'
- \ . ' -c ' . '/foo/bar/xmms2-mpris/src/xmms2-mpris.c',
- \ 'file': (has('win32') ? 'C:' : '') . '/foo/bar/xmms2-mpris/src/xmms2-other.c',
+ \ . ' -c ' . ale#path#Simplify('/foo/bar/xmms2-mpris/src/xmms2-mpris.c'),
+ \ 'file': ale#path#Simplify((has('win32') ? 'C:' : '') . '/foo/bar/xmms2-mpris/src/xmms2-other.c'),
\ },
\ ] })
@@ -198,7 +221,7 @@ Execute(ParseCompileCommandsFlags should take commands from matching .c files fo
silent noautocmd execute 'file! ' . fnameescape(ale#path#Simplify('/foo/bar/xmms2-mpris/src/xmms2-mpris.h'))
AssertEqual
- \ '-I/usr/include/xmms2',
+ \ '-I /usr/include/xmms2',
\ ale#c#ParseCompileCommandsFlags(
\ bufnr(''),
\ {
@@ -220,7 +243,7 @@ Execute(ParseCompileCommandsFlags should take commands from matching .cpp files
silent noautocmd execute 'file! ' . fnameescape(ale#path#Simplify('/foo/bar/xmms2-mpris/src/xmms2-mpris.hpp'))
AssertEqual
- \ '-I/usr/include/xmms2',
+ \ '-I /usr/include/xmms2',
\ ale#c#ParseCompileCommandsFlags(
\ bufnr(''),
\ {
@@ -242,7 +265,7 @@ Execute(ParseCompileCommandsFlags should take commands from matching .cpp files
silent noautocmd execute 'file! ' . fnameescape(ale#path#Simplify('/foo/bar/xmms2-mpris/src/xmms2-mpris.h'))
AssertEqual
- \ '-I/usr/include/xmms2',
+ \ '-I /usr/include/xmms2',
\ ale#c#ParseCompileCommandsFlags(
\ bufnr(''),
\ {
@@ -282,13 +305,64 @@ Execute(ParseCompileCommandsFlags should not take commands from .c files for .h
\ },
\ )
+Execute(ParseCFlags should not merge flags):
+ AssertEqual
+ \ '-Dgoal=9'
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/subdir'))
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/dir with spaces'))
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/dir-with-dash'))
+ \ . ' ' . '-I' . ' ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/kernel/include')),
+ \ ale#c#ParseCFlags(
+ \ ale#path#Simplify(g:dir. '/test_c_projects/makefile_project'),
+ \ 'gcc -Dgoal=9 -Tlinkerfile.ld blabla -Isubdir '
+ \ . 'subdir/somedep1.o ' . 'subdir/somedep2.o '
+ \ . '-I''dir with spaces''' . ' -Idir-with-dash '
+ \ . 'subdir/somedep3.o ' . 'subdir/somedep4.o '
+ \ . ' -I'. ale#path#Simplify('kernel/include') . ' '
+ \ . 'subdir/somedep5.o ' . 'subdir/somedep6.o '
+ \ )
+
Execute(ParseCFlags should handle parenthesis and quotes):
AssertEqual
- \ '-Dgoal=9 -Dtest1="('' '')" file1.o -Dtest2=''(` `)'' file2.o -Dtest3=`(" ")` file3.o',
+ \ '-Dgoal=9 -Dtest1="('' '')" -Dtest2=''(` `)'' -Dtest3=`(" ")`',
\ ale#c#ParseCFlags(
\ ale#path#Simplify(g:dir. '/test_c_projects/makefile_project'),
- \ 'gcc -Dgoal=9 '
+ \ 'gcc -Dgoal=9 -Tlinkerfile.ld blabla '
\ . '-Dtest1="('' '')" file1.o '
\ . '-Dtest2=''(` `)'' file2.o '
\ . '-Dtest3=`(" ")` file3.o '
\ )
+
+Execute(CFlags we want to pass):
+ AssertEqual
+ \ '-I ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/inc'))
+ \ . ' -I ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/include'))
+ \ . ' -iquote ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/incquote'))
+ \ . ' -isystem ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/incsystem'))
+ \ . ' -idirafter ' . ale#Escape(ale#path#Simplify(g:dir. '/test_c_projects/makefile_project/incafter'))
+ \ . ' -Dmacro=value -D macro2 -Bbdir -B bdir2'
+ \ . ' -iprefix prefix -iwithprefix prefix2 -iwithprefixbefore prefix3'
+ \ . ' -isysroot sysroot --sysroot=test --no-sysroot-suffix -imultilib multidir'
+ \ . ' -Wsome-warning -std=c89 -pedantic -pedantic-errors -ansi'
+ \ . ' -foption -O2 -C -CC -trigraphs -nostdinc -nostdinc++'
+ \ . ' -iplugindir=dir -march=native -w',
+ \ ale#c#ParseCFlags(
+ \ ale#path#Simplify(g:dir. '/test_c_projects/makefile_project'),
+ \ 'gcc'
+ \ . ' -Iinc -I include -iquote incquote -isystem incsystem -idirafter incafter'
+ \ . ' -Dmacro=value -D macro2 -Bbdir -B bdir2'
+ \ . ' -iprefix prefix -iwithprefix prefix2 -iwithprefixbefore prefix3'
+ \ . ' -isysroot sysroot --sysroot=test --no-sysroot-suffix -imultilib multidir'
+ \ . ' -Wsome-warning -std=c89 -pedantic -pedantic-errors -ansi'
+ \ . ' -foption -O2 -C -CC -trigraphs -nostdinc -nostdinc++'
+ \ . ' -iplugindir=dir -march=native -w'
+ \ )
+
+Execute(CFlags we dont want to pass):
+ AssertEqual
+ \ '',
+ \ ale#c#ParseCFlags(
+ \ ale#path#Simplify(g:dir. '/test_c_projects/makefile_project'),
+ \ 'gcc -Wl,option -Wa,option -Wp,option filename.c somelib.a '
+ \ . '-fdump-file=name -fdiagnostics-arg -fno-show-column'
+ \ )