summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorw0rp <devw0rp@gmail.com>2020-08-27 20:18:13 +0100
committerw0rp <devw0rp@gmail.com>2020-08-27 20:18:13 +0100
commit6d843715f3dfddf869dfec5b1031a93fea87db18 (patch)
tree0f5b118e4c26a67b5884813a75d466615b16e86e
parent6074720dc20cae1031ae5ba84511398be81c5854 (diff)
downloadale-6d843715f3dfddf869dfec5b1031a93fea87db18.zip
Fix C flag parsing and tests on Windows
-rw-r--r--autoload/ale/c.vim29
-rw-r--r--autoload/ale/path.vim8
-rw-r--r--test/test_c_flag_parsing.vader2
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',
\ ],