diff options
author | w0rp <devw0rp@gmail.com> | 2020-08-27 20:18:13 +0100 |
---|---|---|
committer | w0rp <devw0rp@gmail.com> | 2020-08-27 20:18:13 +0100 |
commit | 6d843715f3dfddf869dfec5b1031a93fea87db18 (patch) | |
tree | 0f5b118e4c26a67b5884813a75d466615b16e86e | |
parent | 6074720dc20cae1031ae5ba84511398be81c5854 (diff) | |
download | ale-6d843715f3dfddf869dfec5b1031a93fea87db18.zip |
Fix C flag parsing and tests on Windows
-rw-r--r-- | autoload/ale/c.vim | 29 | ||||
-rw-r--r-- | autoload/ale/path.vim | 8 | ||||
-rw-r--r-- | test/test_c_flag_parsing.vader | 2 |
3 files changed, 37 insertions, 2 deletions
diff --git a/autoload/ale/c.vim b/autoload/ale/c.vim index eac9879c..4c7ee5bc 100644 --- a/autoload/ale/c.vim +++ b/autoload/ale/c.vim @@ -356,9 +356,27 @@ function! ale#c#ParseCompileCommandsFlags(buffer, file_lookup, dir_lookup) abort " Search for an exact file match first. let l:file_list = get(a:file_lookup, l:buffer_filename, []) + + " We may have to look for /foo/bar instead of C:\foo\bar + if empty(l:file_list) && has('win32') + let l:file_list = get( + \ a:file_lookup, + \ ale#path#RemoveDriveLetter(l:buffer_filename), + \ [] + \) + endif + " Try the absolute path to the directory second. let l:dir_list = get(a:dir_lookup, l:dir, []) + if empty(l:dir_list) && has('win32') + let l:dir_list = get( + \ a:dir_lookup, + \ ale#path#RemoveDriveLetter(l:dir), + \ [] + \) + endif + if empty(l:file_list) && empty(l:dir_list) " If we can't find matches with the path to the file, try a " case-insensitive match for any similarly-named file. @@ -378,6 +396,14 @@ function! ale#c#ParseCompileCommandsFlags(buffer, file_lookup, dir_lookup) abort let l:key = fnamemodify(l:buffer_filename, ':r') . l:suffix let l:file_list = get(a:file_lookup, l:key, []) + if empty(l:file_list) && has('win32') + let l:file_list = get( + \ a:file_lookup, + \ ale#path#RemoveDriveLetter(l:key), + \ [] + \) + endif + if empty(l:file_list) " Look fuzzy matches on the basename second. let l:key = fnamemodify(l:basename, ':r') . l:suffix @@ -412,7 +438,8 @@ function! ale#c#ParseCompileCommandsFlags(buffer, file_lookup, dir_lookup) abort for l:item in l:dir_list let l:filename = ale#path#GetAbsPath(l:item.directory, l:item.file) - if ale#path#Simplify(fnamemodify(l:filename, ':h')) is? l:dir + if ale#path#RemoveDriveLetter(fnamemodify(l:filename, ':h')) + \ is? ale#path#RemoveDriveLetter(l:dir) let [l:should_quote, l:args] = s:GetArguments(l:item) return ale#c#ParseCFlags(l:item.directory, l:should_quote, l:args) diff --git a/autoload/ale/path.vim b/autoload/ale/path.vim index f18a9733..4e59ce2f 100644 --- a/autoload/ale/path.vim +++ b/autoload/ale/path.vim @@ -24,6 +24,14 @@ function! ale#path#Simplify(path) abort return substitute(simplify(l:win_path), '^\\\+', '\', 'g') " no-custom-checks endfunction +" Simplify a path without a Windows drive letter. +" This function can be used for checking if paths are equal. +function! ale#path#RemoveDriveLetter(path) abort + return has('win32') && a:path[1:2] is# ':\' + \ ? ale#path#Simplify(a:path[2:]) + \ : ale#path#Simplify(a:path) +endfunction + " Given a buffer and a filename, find the nearest file by searching upwards " through the paths relative to the given buffer. function! ale#path#FindNearestFile(buffer, filename) abort diff --git a/test/test_c_flag_parsing.vader b/test/test_c_flag_parsing.vader index d9541037..abd63527 100644 --- a/test/test_c_flag_parsing.vader +++ b/test/test_c_flag_parsing.vader @@ -419,7 +419,7 @@ Execute(ShellSplit should not merge flags): \ '-Idir-with-dash', \ 'subdir/somedep3.o', \ 'subdir/somedep4.o', - \ '-Ikernel/include', + \ '-I' . ale#path#Simplify('kernel/include'), \ 'subdir/somedep5.o', \ 'subdir/somedep6.o', \ ], |