forked from rust-lang/rustlings
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add lsp command to fix rust-analyzer
- Loading branch information
Showing
6 changed files
with
141 additions
and
22 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,6 +5,7 @@ target/ | |
*.pdb | ||
exercises/clippy/Cargo.toml | ||
exercises/clippy/Cargo.lock | ||
rust-project.json | ||
.idea | ||
.vscode | ||
*.iml |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
use glob::glob; | ||
use serde::{Deserialize, Serialize}; | ||
use std::error::Error; | ||
use std::process::Command; | ||
|
||
/// Contains the structure of resulting rust-project.json file | ||
/// and functions to build the data required to create the file | ||
#[derive(Serialize, Deserialize)] | ||
pub struct RustAnalyzerProject { | ||
sysroot_src: String, | ||
pub crates: Vec<Crate>, | ||
} | ||
|
||
#[derive(Serialize, Deserialize)] | ||
pub struct Crate { | ||
root_module: String, | ||
edition: String, | ||
deps: Vec<String>, | ||
cfg: Vec<String>, | ||
} | ||
|
||
impl RustAnalyzerProject { | ||
pub fn new() -> RustAnalyzerProject { | ||
RustAnalyzerProject { | ||
sysroot_src: String::new(), | ||
crates: Vec::new(), | ||
} | ||
} | ||
|
||
/// Write rust-project.json to disk | ||
pub fn write_to_disk(&self) -> Result<(), std::io::Error> { | ||
std::fs::write( | ||
"./rust-project.json", | ||
serde_json::to_vec(&self).expect("Failed to serialize to JSON"), | ||
)?; | ||
Ok(()) | ||
} | ||
|
||
/// If path contains .rs extension, add a crate to `rust-project.json` | ||
fn path_to_json(&mut self, path: String) { | ||
if let Some((_, ext)) = path.split_once('.') { | ||
if ext == "rs" { | ||
self.crates.push(Crate { | ||
root_module: path, | ||
edition: "2021".to_string(), | ||
deps: Vec::new(), | ||
// This allows rust_analyzer to work inside #[test] blocks | ||
cfg: vec!["test".to_string()], | ||
}) | ||
} | ||
} | ||
} | ||
|
||
/// Parse the exercises folder for .rs files, any matches will create | ||
/// a new `crate` in rust-project.json which allows rust-analyzer to | ||
/// treat it like a normal binary | ||
pub fn exercies_to_json(&mut self) -> Result<(), Box<dyn Error>> { | ||
for e in glob("./exercises/**/*")? { | ||
let path = e?.to_string_lossy().to_string(); | ||
self.path_to_json(path); | ||
} | ||
Ok(()) | ||
} | ||
|
||
/// Use `rustc` to determine the default toolchain | ||
pub fn get_sysroot_src(&mut self) -> Result<(), Box<dyn Error>> { | ||
let toolchain = Command::new("rustc") | ||
.arg("--print") | ||
.arg("sysroot") | ||
.output()? | ||
.stdout; | ||
|
||
let toolchain = String::from_utf8_lossy(&toolchain); | ||
let mut whitespace_iter = toolchain.split_whitespace(); | ||
|
||
let toolchain = whitespace_iter.next().unwrap_or(&toolchain); | ||
|
||
println!("Determined toolchain: {}\n", &toolchain); | ||
|
||
self.sysroot_src = (std::path::Path::new(&*toolchain) | ||
.join("lib") | ||
.join("rustlib") | ||
.join("src") | ||
.join("rust") | ||
.join("library") | ||
.to_string_lossy()) | ||
.to_string(); | ||
Ok(()) | ||
} | ||
} |