forked from github-mirrors/ale
rust-analyzer for non-Cargo projects (#4118)
* rust-analyzer in non-cargo projects rust-analyzer can also be used in non-cargo projects. This requires a rust-project.json file in the project root [1]. Make the rust-analyzer linter search for a rust-project.json file if no Cargo.toml file could be found. [1]: https://rust-analyzer.github.io/manual.html#non-cargo-based-projects * Document rust-analyzer without cargo * Test rust-analyzer with non-cargo projects Change the other rust tests to match the new directory structure of the test files.
This commit is contained in:
parent
5c7019f394
commit
80dcd648d3
|
@ -9,9 +9,21 @@ function! ale_linters#rust#analyzer#GetCommand(buffer) abort
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! ale_linters#rust#analyzer#GetProjectRoot(buffer) abort
|
function! ale_linters#rust#analyzer#GetProjectRoot(buffer) abort
|
||||||
|
" Try to find nearest Cargo.toml for cargo projects
|
||||||
let l:cargo_file = ale#path#FindNearestFile(a:buffer, 'Cargo.toml')
|
let l:cargo_file = ale#path#FindNearestFile(a:buffer, 'Cargo.toml')
|
||||||
|
|
||||||
return !empty(l:cargo_file) ? fnamemodify(l:cargo_file, ':h') : ''
|
if !empty(l:cargo_file)
|
||||||
|
return fnamemodify(l:cargo_file, ':h')
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Try to find nearest rust-project.json for non-cargo projects
|
||||||
|
let l:rust_project = ale#path#FindNearestFile(a:buffer, 'rust-project.json')
|
||||||
|
|
||||||
|
if !empty(l:rust_project)
|
||||||
|
return fnamemodify(l:rust_project, ':h')
|
||||||
|
endif
|
||||||
|
|
||||||
|
return ''
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
call ale#linter#Define('rust', {
|
call ale#linter#Define('rust', {
|
||||||
|
|
|
@ -26,8 +26,10 @@ Integration Information
|
||||||
4. analyzer -- If you have rust-analyzer installed, you might prefer using
|
4. analyzer -- If you have rust-analyzer installed, you might prefer using
|
||||||
this linter over cargo and rls. rust-analyzer also implements the
|
this linter over cargo and rls. rust-analyzer also implements the
|
||||||
Language Server Protocol for incremental compilation of Rust code, and is
|
Language Server Protocol for incremental compilation of Rust code, and is
|
||||||
the next iteration of rls. rust-analyzer, like rls, requires Rust files
|
the next iteration of rls. rust-analyzer either requires Rust files to be
|
||||||
to be contained in Cargo projects.
|
contained in Cargo projects or requires the project to be described in
|
||||||
|
the rust-project.json format:
|
||||||
|
https://rust-analyzer.github.io/manual.html#non-cargo-based-projects
|
||||||
5. rustfmt -- If you have `rustfmt` installed, you can use it as a fixer to
|
5. rustfmt -- If you have `rustfmt` installed, you can use it as a fixer to
|
||||||
consistently reformat your Rust code.
|
consistently reformat your Rust code.
|
||||||
|
|
||||||
|
|
|
@ -7,12 +7,19 @@ After:
|
||||||
Execute(The default executable path should be correct):
|
Execute(The default executable path should be correct):
|
||||||
AssertLinter 'rust-analyzer', ale#Escape('rust-analyzer')
|
AssertLinter 'rust-analyzer', ale#Escape('rust-analyzer')
|
||||||
|
|
||||||
Execute(The project root should be detected correctly):
|
Execute(The project root should be detected correctly in cargo projects):
|
||||||
AssertLSPProject ''
|
AssertLSPProject ''
|
||||||
|
|
||||||
call ale#test#SetFilename('../test-files/rust/test.rs')
|
call ale#test#SetFilename('../test-files/rust/cargo/testfile.rs')
|
||||||
|
|
||||||
AssertLSPProject ale#path#Simplify(g:dir . '/../test-files/rust')
|
AssertLSPProject ale#path#Simplify(g:dir . '/../test-files/rust/cargo')
|
||||||
|
|
||||||
|
Execute(The project root should be detected correctly in non-cargo projects):
|
||||||
|
AssertLSPProject ''
|
||||||
|
|
||||||
|
call ale#test#SetFilename('../test-files/rust/rust-project/testfile.rs')
|
||||||
|
|
||||||
|
AssertLSPProject ale#path#Simplify(g:dir . '/../test-files/rust/rust-project')
|
||||||
|
|
||||||
Execute(Should accept configuration settings):
|
Execute(Should accept configuration settings):
|
||||||
AssertLSPConfig {}
|
AssertLSPConfig {}
|
||||||
|
|
|
@ -20,9 +20,9 @@ Execute(The toolchain should be ommitted if not given):
|
||||||
Execute(The project root should be detected correctly):
|
Execute(The project root should be detected correctly):
|
||||||
AssertLSPProject ''
|
AssertLSPProject ''
|
||||||
|
|
||||||
call ale#test#SetFilename('../test-files/rust/test.rs')
|
call ale#test#SetFilename('../test-files/rust/cargo/testfile.rs')
|
||||||
|
|
||||||
AssertLSPProject ale#path#Simplify(g:dir . '/../test-files/rust')
|
AssertLSPProject ale#path#Simplify(g:dir . '/../test-files/rust/cargo')
|
||||||
|
|
||||||
Execute(Should accept configuration settings):
|
Execute(Should accept configuration settings):
|
||||||
AssertLSPConfig {}
|
AssertLSPConfig {}
|
||||||
|
|
|
@ -13,9 +13,9 @@ Execute(The options should be configurable):
|
||||||
AssertLinter 'rustc', 'rustc --error-format=json --foo -'
|
AssertLinter 'rustc', 'rustc --error-format=json --foo -'
|
||||||
|
|
||||||
Execute(Some default paths should be included when the project is a Cargo project):
|
Execute(Some default paths should be included when the project is a Cargo project):
|
||||||
call ale#test#SetFilename('../test-files/cargo/test.rs')
|
call ale#test#SetFilename('../test-files/rust/cargo/testfile.rs')
|
||||||
|
|
||||||
AssertLinter 'rustc', 'rustc --error-format=json --emit=mir -o /dev/null'
|
AssertLinter 'rustc', 'rustc --error-format=json --emit=mir -o /dev/null'
|
||||||
\ . ' -L ' . ale#Escape(ale#path#GetAbsPath(g:dir, '../test-files/cargo/target/debug/deps'))
|
\ . ' -L ' . ale#Escape(ale#path#GetAbsPath(g:dir, '../test-files/rust/cargo/target/debug/deps'))
|
||||||
\ . ' -L ' . ale#Escape(ale#path#GetAbsPath(g:dir, '../test-files/cargo/target/release/deps'))
|
\ . ' -L ' . ale#Escape(ale#path#GetAbsPath(g:dir, '../test-files/rust/cargo/target/release/deps'))
|
||||||
\ . ' -'
|
\ . ' -'
|
||||||
|
|
Loading…
Reference in New Issue