Merge pull request #2194 from fx-carton/fix-cflags-parsing
Fix cflags parsing
This commit is contained in:
commit
721183116e
2 changed files with 45 additions and 11 deletions
|
@ -46,6 +46,38 @@ function! ale#c#FindProjectRoot(buffer) abort
|
|||
return ''
|
||||
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
|
||||
let l:stack = []
|
||||
|
||||
for l:char in l:special_chars
|
||||
if l:char is# ')'
|
||||
if len(l:stack) == 0 || get(l:stack, -1) isnot# '('
|
||||
return 0
|
||||
endif
|
||||
|
||||
call remove(l:stack, -1)
|
||||
elseif l:char is# '('
|
||||
call add(l:stack, l:char)
|
||||
else
|
||||
if len(l:stack) > 0 && get(l:stack, -1) is# l:char
|
||||
call remove(l:stack, -1)
|
||||
else
|
||||
call add(l:stack, l:char)
|
||||
endif
|
||||
endif
|
||||
endfor
|
||||
|
||||
return len(l:stack) == 0
|
||||
endfunction
|
||||
|
||||
function! ale#c#ParseCFlags(path_prefix, cflag_line) abort
|
||||
let l:cflags_list = []
|
||||
let l:previous_options = ''
|
||||
|
@ -57,17 +89,8 @@ function! ale#c#ParseCFlags(path_prefix, cflag_line) abort
|
|||
let l:option = l:previous_options . l:split_lines[l:option_index]
|
||||
let l:option_index = l:option_index + 1
|
||||
|
||||
" Check if cflag contained an unmatched characters and should not have been splitted
|
||||
let l:option_special = substitute(l:option, '\\"', '', 'g')
|
||||
let l:option_special = substitute(l:option_special, '[^"''()`]', '', 'g')
|
||||
let l:option_special = substitute(l:option_special, '""', '', 'g')
|
||||
let l:option_special = substitute(l:option_special, '''''', '', 'g')
|
||||
let l:option_special = substitute(l:option_special, '``', '', 'g')
|
||||
let l:option_special = substitute(l:option_special, '((', '(', 'g')
|
||||
let l:option_special = substitute(l:option_special, '))', ')', 'g')
|
||||
let l:option_special = substitute(l:option_special, '()', '', 'g')
|
||||
|
||||
if len(l:option_special) > 0 && l:option_index < len(l:split_lines)
|
||||
" Check if cflag contained an unmatched special character and should not have been splitted
|
||||
if ale#c#AreSpecialCharsBalanced(l:option) == 0 && l:option_index < len(l:split_lines)
|
||||
let l:previous_options = l:option . ' '
|
||||
continue
|
||||
endif
|
||||
|
|
|
@ -209,3 +209,14 @@ Execute(ParseCFlags should not merge flags):
|
|||
\ . ' -I'. ale#path#Simplify('kernel/include') . ' '
|
||||
\ . 'subdir/somedep5.o ' . 'subdir/somedep6.o '
|
||||
\ )
|
||||
|
||||
Execute(ParseCFlags should handle parenthesis and quotes):
|
||||
AssertEqual
|
||||
\ '-Dgoal=9 -Dtest1="('' '')" -Dtest2=''(` `)'' -Dtest3=`(" ")`',
|
||||
\ ale#c#ParseCFlags(
|
||||
\ ale#path#Simplify(g:dir. '/test_c_projects/makefile_project'),
|
||||
\ 'gcc -Dgoal=9 -Tlinkerfile.ld blabla '
|
||||
\ . '-Dtest1="('' '')" file1.o '
|
||||
\ . '-Dtest2=''(` `)'' file2.o '
|
||||
\ . '-Dtest3=`(" ")` file3.o '
|
||||
\ )
|
||||
|
|
Reference in a new issue