auto merge of #17513 : dradtke/rust/master, r=kballard

Looks like I made my previous PR a little too hastily. =)

This PR fixes a couple issues that I discovered with my previous revision:

1. Updated the errorformat to ignore "pointer lines" so that they don't show up in the output (with quickfix jumping, they're redundant and unnecessary).
2. Renamed a couple variables to be more in line with Cargo's terminology (`g:cargo_toml_name` should now be `g:cargo_manifest_name`).
3. Added support for errors reported with absolute paths (looks to be the case when compiling an executable instead of a library).
4. Most importantly, added support for errors reported while compiling a dependency. When building a Cargo package with local dependencies, if one of those dependencies failed to compile, the quickfix would be completely broken as it assumed that all errors were relative to the local manifest, or the closest Cargo.toml. With this update, it now pays attention to lines that end with `(file://<path>)`, and from then on adjusts all errors to be relative to `<path>`.

As a side note, that `<path>` output is somewhat broken on Windows. While `file:///home/damien/...` on *Nix is a valid URI, `file:///C:/Users/damien/...` on Windows is not, because `C:/` (or whatever the drive is) should take the place of the third slash which is *Nix's root, not be appended to it. I added a workaround for this in my script, but I figured I'd mention it to see if this is a bug in how Rust formats paths.
This commit is contained in:
bors 2014-11-22 06:31:43 +00:00
commit 829680840c
2 changed files with 38 additions and 15 deletions

View File

@ -1,29 +1,35 @@
" Vim compiler file " Vim compiler file
" Compiler: Cargo Compiler " Compiler: Cargo Compiler
" Maintainer: Damien Radtke <damienradtke@gmail.com> " Maintainer: Damien Radtke <damienradtke@gmail.com>
" Latest Revision: 2014 Sep 18 " Latest Revision: 2014 Sep 24
if exists("current_compiler") if exists('current_compiler')
finish finish
endif endif
runtime compiler/rustc.vim
let current_compiler = "cargo" let current_compiler = "cargo"
if exists(":CompilerSet") != 2 if exists(':CompilerSet') != 2
command -nargs=* CompilerSet setlocal <args> command -nargs=* CompilerSet setlocal <args>
endif endif
CompilerSet errorformat& if exists('g:cargo_makeprg_params')
CompilerSet makeprg=cargo\ $* execute 'CompilerSet makeprg=cargo\ '.escape(g:cargo_makeprg_params, ' \|"').'\ $*'
else
CompilerSet makeprg=cargo\ $*
endif
" Allow a configurable global Cargo.toml name. This makes it easy to " Allow a configurable global Cargo.toml name. This makes it easy to
" support variations like 'cargo.toml'. " support variations like 'cargo.toml'.
if !exists('g:cargo_toml_name') let s:cargo_manifest_name = get(g:, 'cargo_manifest_name', 'Cargo.toml')
let g:cargo_toml_name = 'Cargo.toml'
endif
let s:toml_dir = fnamemodify(findfile(g:cargo_toml_name, '.;'), ':p:h').'/' function! s:is_absolute(path)
return a:path[0] == '/' || a:path =~ '[A-Z]\+:'
endfunction
if s:toml_dir != '' let s:local_manifest = findfile(s:cargo_manifest_name, '.;')
if s:local_manifest != ''
let s:local_manifest = fnamemodify(s:local_manifest, ':p:h').'/'
augroup cargo augroup cargo
au! au!
au QuickfixCmdPost make call s:FixPaths() au QuickfixCmdPost make call s:FixPaths()
@ -33,15 +39,25 @@ if s:toml_dir != ''
" to be relative to the current directory instead of Cargo.toml. " to be relative to the current directory instead of Cargo.toml.
function! s:FixPaths() function! s:FixPaths()
let qflist = getqflist() let qflist = getqflist()
let manifest = s:local_manifest
for qf in qflist for qf in qflist
if !qf['valid'] if !qf.valid
let m = matchlist(qf.text, '(file://\(.*\))$')
if !empty(m)
let manifest = m[1].'/'
" Manually strip another slash if needed; usually just an
" issue on Windows.
if manifest =~ '^/[A-Z]\+:/'
let manifest = manifest[1:]
endif
endif
continue continue
endif endif
let filename = bufname(qf['bufnr']) let filename = bufname(qf.bufnr)
if stridx(filename, s:toml_dir) == -1 if s:is_absolute(filename)
let filename = s:toml_dir.filename continue
endif endif
let qf['filename'] = simplify(s:toml_dir.bufname(qf['bufnr'])) let qf.filename = simplify(manifest.filename)
call remove(qf, 'bufnr') call remove(qf, 'bufnr')
endfor endfor
call setqflist(qflist, 'r') call setqflist(qflist, 'r')

View File

@ -88,6 +88,13 @@ g:ftplugin_rust_source_path~
let g:ftplugin_rust_source_path = $HOME.'/dev/rust' let g:ftplugin_rust_source_path = $HOME.'/dev/rust'
< <
*g:cargo_manifest_name*
g:cargo_manifest_name~
Set this option to the name of the manifest file for your projects. If
not specified it defaults to 'Cargo.toml' : >
let g:cargo_manifest_name = 'Cargo.toml'
<
============================================================================== ==============================================================================
COMMANDS *rust-commands* COMMANDS *rust-commands*