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:
Felix Maurer 2022-03-23 02:56:29 +01:00 committed by GitHub
parent 5c7019f394
commit 80dcd648d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 32 additions and 11 deletions

View File

@ -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', {

View File

@ -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.

View File

@ -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 {}

View File

@ -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 {}

View File

@ -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'))
\ . ' -' \ . ' -'