1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
" vim: ts=4 sw=4 et
function! neomake#makers#ft#d#EnabledMakers() abort
" dmd, ldmd, and gdmd all share a common CLI.
" Ordered in efficiency of compiler
for m in ['dmd', 'ldmd', 'gdmd']
if executable(m)
return [m]
endif
endfor
return []
endfunction
function! s:findDubRoot() abort
"Look upwards for a dub.json or dub.sdl to find the root
"I did it like this because it's the only cross platform way I know of
let tmp_file = findfile('dub.json', '.;')
if empty(tmp_file)
let tmp_file = findfile('dub.sdl', '.;')
endif
return tmp_file
endfunction
function! s:UpdateDub() abort
"Add dub directories
let s:dubImports = []
let tmp_file = s:findDubRoot()
if executable('dub') && !empty(tmp_file)
let tmp_dir = fnamemodify(tmp_file,':p:h')
let dubCmd = 'dub describe --data=import-paths --annotate '
\ .'--skip-registry=all --vquiet --data-list --root='
let output = system(dubCmd . tmp_dir)
if(v:shell_error == 0 && !empty(output))
" Is \n portable?
let s:dubImports = split(output, '\n')
call map(s:dubImports, "'-I' . v:val")
endif
endif
endfunction
"GDMD does not adhere to dmd's flags or output, but to GCC's.
"This is for LDMD and dmd only.
function! s:DmdStyleMaker(args) abort
"Updating dub paths each make might be slow?
call s:UpdateDub()
let args = ['-w', '-wi', '-c', '-o-', '-vcolumns'] + a:args + s:dubImports
return {
\ 'args': args,
\ 'errorformat':
\ '%f(%l\,%c): %trror: %m,' .
\ '%f(%l): %trror: %m,' .
\ '%f(%l\,%c): %tarning: %m,' .
\ '%f(%l): %tarning: %m,' .
\ '%f(%l\,%c): Deprecation: %m,' .
\ '%f(%l): Deprecation: %m,',
\ }
endfunction
function! neomake#makers#ft#d#dmd() abort
let args = []
if exists('g:neomake_d_dmd_args_conf')
call add(args, '-conf=' . expand(g:neomake_d_dmd_args_conf))
endif
return s:DmdStyleMaker(args)
endfunction
function! neomake#makers#ft#d#ldmd() abort
let args = []
if exists('g:neomake_d_ldmd_args_conf')
call add(args, '-conf=' . expand(g:neomake_d_ldmd_args_conf))
endif
return s:DmdStyleMaker(args)
endfunction
function! neomake#makers#ft#d#gdmd() abort
let args = ['-c', '-o-', '-fsyntax-only', s:UpdateDub()]
return {
\ 'args': args,
\ 'errorformat':
\ '%-G%f:%s:,' .
\ '%-G%f:%l: %#error: %#(Each undeclared identifier is reported only%.%#,' .
\ '%-G%f:%l: %#error: %#for each function it appears%.%#,' .
\ '%-GIn file included%.%#,' .
\ '%-G %#from %f:%l\,,' .
\ '%f:%l:%c: %trror: %m,' .
\ '%f:%l:%c: %tarning: %m,' .
\ '%f:%l:%c: %m,' .
\ '%f:%l: %trror: %m,' .
\ '%f:%l: %tarning: %m,'.
\ '%f:%l: %m',
\ }
endfunction
|