aboutsummaryrefslogtreecommitdiff
path: root/dotfiles/.local/share/nvim/site/autoload/neomake/makers/ft/d.vim
diff options
context:
space:
mode:
Diffstat (limited to 'dotfiles/.local/share/nvim/site/autoload/neomake/makers/ft/d.vim')
-rw-r--r--dotfiles/.local/share/nvim/site/autoload/neomake/makers/ft/d.vim92
1 files changed, 92 insertions, 0 deletions
diff --git a/dotfiles/.local/share/nvim/site/autoload/neomake/makers/ft/d.vim b/dotfiles/.local/share/nvim/site/autoload/neomake/makers/ft/d.vim
new file mode 100644
index 0000000..5206a8d
--- /dev/null
+++ b/dotfiles/.local/share/nvim/site/autoload/neomake/makers/ft/d.vim
@@ -0,0 +1,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