1
0
Fork 0
mirror of synced 2024-11-05 00:48:57 -05:00
ultimate-vim/sources_non_forked/vim-go/autoload/go/tool.vim

217 lines
6.3 KiB
VimL
Raw Normal View History

2017-09-02 06:43:18 -04:00
" From "go list -h".
function! go#tool#ValidFiles(...)
let l:list = ["GoFiles", "CgoFiles", "IgnoredGoFiles", "CFiles", "CXXFiles",
\ "MFiles", "HFiles", "FFiles", "SFiles", "SwigFiles", "SwigCXXFiles",
\ "SysoFiles", "TestGoFiles", "XTestGoFiles"]
" Used as completion
if len(a:000) > 0
let l:list = filter(l:list, 'strpart(v:val, 0, len(a:1)) == a:1')
endif
return l:list
endfunction
function! go#tool#Files(...) abort
if len(a:000) > 0
let source_files = a:000
2016-06-26 07:12:36 -04:00
else
2017-09-02 06:43:18 -04:00
let source_files = ['GoFiles']
2016-06-26 07:12:36 -04:00
endif
2017-09-02 06:43:18 -04:00
let combined = ''
for sf in source_files
" Strip dot in case people used ":GoFiles .GoFiles".
let sf = substitute(sf, '^\.', '', '')
" Make sure the passed options are valid.
if index(go#tool#ValidFiles(), sf) == -1
echoerr "unknown source file variable: " . sf
endif
if go#util#IsWin()
let combined .= '{{range $f := .' . sf . '}}{{$.Dir}}\{{$f}}{{printf \"\n\"}}{{end}}{{range $f := .CgoFiles}}{{$.Dir}}\{{$f}}{{printf \"\n\"}}{{end}}'
else
let combined .= "{{range $f := ." . sf . "}}{{$.Dir}}/{{$f}}{{printf \"\\n\"}}{{end}}{{range $f := .CgoFiles}}{{$.Dir}}/{{$f}}{{printf \"\\n\"}}{{end}}"
endif
endfor
2018-07-04 06:53:25 -04:00
let [l:out, l:err] = go#tool#ExecuteInDir(['go', 'list', '-tags', go#config#BuildTags(), '-f', l:combined])
2018-06-14 06:31:12 -04:00
return split(l:out, '\n')
2014-10-31 17:30:24 -04:00
endfunction
2016-12-27 09:46:49 -05:00
function! go#tool#Deps() abort
2016-06-26 07:12:36 -04:00
if go#util#IsWin()
let format = '{{range $f := .Deps}}{{$f}}{{printf \"\n\"}}{{end}}'
else
let format = "{{range $f := .Deps}}{{$f}}\n{{end}}"
endif
2018-07-04 06:53:25 -04:00
let [l:out, l:err] = go#tool#ExecuteInDir(['go', 'list', '-tags', go#config#BuildTags(), '-f', l:format])
2018-06-14 06:31:12 -04:00
return split(l:out, '\n')
2014-10-31 17:30:24 -04:00
endfunction
2016-12-27 09:46:49 -05:00
function! go#tool#Imports() abort
2016-06-26 07:12:36 -04:00
let imports = {}
if go#util#IsWin()
let format = '{{range $f := .Imports}}{{$f}}{{printf \"\n\"}}{{end}}'
else
let format = "{{range $f := .Imports}}{{$f}}{{printf \"\\n\"}}{{end}}"
endif
2018-07-04 06:53:25 -04:00
let [l:out, l:err] = go#tool#ExecuteInDir(['go', 'list', '-tags', go#config#BuildTags(), '-f', l:format])
2018-06-14 06:31:12 -04:00
if l:err != 0
2016-06-26 07:12:36 -04:00
echo out
return imports
endif
2014-10-31 17:30:24 -04:00
2016-06-26 07:12:36 -04:00
for package_path in split(out, '\n')
2018-07-04 06:53:25 -04:00
let [l:out, l:err] = go#tool#ExecuteInDir(['go', 'list', '-tags', go#config#BuildTags(), '-f', '{{.Name}}', l:package_path])
2018-06-14 06:31:12 -04:00
if l:err != 0
echo out
return imports
endif
let package_name = substitute(l:out, '\n$', '', '')
2016-06-26 07:12:36 -04:00
let imports[package_name] = package_path
endfor
2014-10-31 17:30:24 -04:00
2016-06-26 07:12:36 -04:00
return imports
2014-10-31 17:30:24 -04:00
endfunction
2016-12-27 09:46:49 -05:00
function! go#tool#Info(auto) abort
2018-06-14 06:31:12 -04:00
let l:mode = go#config#InfoMode()
2016-12-27 09:46:49 -05:00
if l:mode == 'gocode'
call go#complete#Info(a:auto)
elseif l:mode == 'guru'
call go#guru#DescribeInfo()
else
call go#util#EchoError('go_info_mode value: '. l:mode .' is not valid. Valid values are: [gocode, guru]')
endif
endfunction
function! go#tool#PackageName() abort
2018-07-04 06:53:25 -04:00
let [l:out, l:err] = go#tool#ExecuteInDir(['go', 'list', '-tags', go#config#BuildTags(), '-f', '{{.Name}}'])
2018-06-14 06:31:12 -04:00
if l:err != 0
2016-07-03 07:53:59 -04:00
return -1
endif
return split(out, '\n')[0]
endfunction
2016-12-27 09:46:49 -05:00
function! go#tool#ParseErrors(lines) abort
2016-06-26 07:12:36 -04:00
let errors = []
for line in a:lines
let fatalerrors = matchlist(line, '^\(fatal error:.*\)$')
let tokens = matchlist(line, '^\s*\(.\{-}\):\(\d\+\):\s*\(.*\)')
if !empty(fatalerrors)
call add(errors, {"text": fatalerrors[1]})
elseif !empty(tokens)
" strip endlines of form ^M
let out = substitute(tokens[3], '\r$', '', '')
call add(errors, {
\ "filename" : fnamemodify(tokens[1], ':p'),
\ "lnum" : tokens[2],
\ "text" : out,
\ })
elseif !empty(errors)
" Preserve indented lines.
" This comes up especially with multi-line test output.
if match(line, '^\s') >= 0
2018-06-14 06:31:12 -04:00
call add(errors, {"text": substitute(line, '\r$', '', '')})
2016-06-26 07:12:36 -04:00
endif
endif
endfor
2014-10-31 17:30:24 -04:00
2016-06-26 07:12:36 -04:00
return errors
2014-10-31 17:30:24 -04:00
endfunction
2015-12-16 08:53:53 -05:00
"FilterValids filters the given items with only items that have a valid
"filename. Any non valid filename is filtered out.
2016-12-27 09:46:49 -05:00
function! go#tool#FilterValids(items) abort
2016-06-26 07:12:36 -04:00
" Remove any nonvalid filename from the location list to avoid opening an
" empty buffer. See https://github.com/fatih/vim-go/issues/287 for
" details.
let filtered = []
let is_readable = {}
for item in a:items
if has_key(item, 'bufnr')
let filename = bufname(item.bufnr)
elseif has_key(item, 'filename')
let filename = item.filename
else
" nothing to do, add item back to the list
call add(filtered, item)
continue
endif
2015-12-16 08:53:53 -05:00
2016-06-26 07:12:36 -04:00
if !has_key(is_readable, filename)
let is_readable[filename] = filereadable(filename)
endif
if is_readable[filename]
call add(filtered, item)
endif
endfor
2015-12-16 08:53:53 -05:00
2016-06-26 07:12:36 -04:00
for k in keys(filter(is_readable, '!v:val'))
echo "vim-go: " | echohl Identifier | echon "[run] Dropped " | echohl Constant | echon '"' . k . '"'
echohl Identifier | echon " from location list (nonvalid filename)" | echohl None
endfor
2015-12-16 08:53:53 -05:00
2016-06-26 07:12:36 -04:00
return filtered
2015-12-16 08:53:53 -05:00
endfunction
2014-10-31 17:30:24 -04:00
function! go#tool#ExecuteInDir(cmd) abort
if !isdirectory(expand("%:p:h"))
2018-06-14 06:31:12 -04:00
return ['', 1]
endif
2016-06-26 07:12:36 -04:00
let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd '
let dir = getcwd()
try
execute cd . fnameescape(expand("%:p:h"))
2018-06-14 06:31:12 -04:00
let [l:out, l:err] = go#util#Exec(a:cmd)
2016-06-26 07:12:36 -04:00
finally
2018-06-14 06:31:12 -04:00
execute cd . fnameescape(l:dir)
2016-06-26 07:12:36 -04:00
endtry
2018-06-14 06:31:12 -04:00
return [l:out, l:err]
2014-10-31 17:30:24 -04:00
endfunction
" Exists checks whether the given importpath exists or not. It returns 0 if
" the importpath exists under GOPATH.
2016-12-27 09:46:49 -05:00
function! go#tool#Exists(importpath) abort
2018-06-14 06:31:12 -04:00
let [l:out, l:err] = go#tool#ExecuteInDir(['go', 'list', a:importpath])
if l:err != 0
2014-10-31 17:30:24 -04:00
return -1
endif
return 0
endfunction
2016-12-27 09:46:49 -05:00
function! go#tool#OpenBrowser(url) abort
2018-06-14 06:31:12 -04:00
let l:cmd = go#config#PlayBrowserCommand()
if len(l:cmd) == 0
2014-10-31 17:30:24 -04:00
redraw
echohl WarningMsg
echo "It seems that you don't have general web browser. Open URL below."
echohl None
echo a:url
return
endif
2018-06-14 06:31:12 -04:00
" if setting starts with a !.
if l:cmd =~ '^!'
let l:cmd = substitute(l:cmd, '%URL%', '\=escape(shellescape(a:url), "#")', 'g')
silent! exec l:cmd
2014-10-31 17:30:24 -04:00
elseif cmd =~ '^:[A-Z]'
2018-06-14 06:31:12 -04:00
let l:cmd = substitute(l:cmd, '%URL%', '\=escape(a:url,"#")', 'g')
exec l:cmd
2014-10-31 17:30:24 -04:00
else
2018-06-14 06:31:12 -04:00
let l:cmd = substitute(l:cmd, '%URL%', '\=shellescape(a:url)', 'g')
call go#util#System(l:cmd)
2014-10-31 17:30:24 -04:00
endif
endfunction
2016-06-26 07:12:36 -04:00
" vim: sw=2 ts=2 et