Rust project supports proc-macro dependent crates

This commit is contained in:
Toby Fleming 2021-07-31 15:26:59 -07:00
parent df0936b4af
commit cb13e4a2ca
No known key found for this signature in database
GPG Key ID: 0282BB3D7A935102
3 changed files with 18 additions and 2 deletions

View File

@ -37,6 +37,7 @@ pub struct Crate {
pub(crate) is_workspace_member: bool,
pub(crate) include: Vec<AbsPathBuf>,
pub(crate) exclude: Vec<AbsPathBuf>,
pub(crate) is_proc_macro: bool,
}
impl ProjectJson {
@ -96,6 +97,7 @@ pub fn new(base: &AbsPath, data: ProjectJsonData) -> ProjectJson {
is_workspace_member,
include,
exclude,
is_proc_macro: crate_data.is_proc_macro,
}
})
.collect::<Vec<_>>(),
@ -135,6 +137,8 @@ struct CrateData {
proc_macro_dylib_path: Option<PathBuf>,
is_workspace_member: Option<bool>,
source: Option<CrateSource>,
#[serde(default)]
is_proc_macro: bool,
}
#[derive(Deserialize, Debug, Clone)]

View File

@ -446,10 +446,20 @@ fn project_json_to_crate_graph(
for (from, krate) in project.crates() {
if let Some(&from) = crates.get(&from) {
if let Some((public_deps, _proc_macro)) = &sysroot_deps {
if let Some((public_deps, libproc_macro)) = &sysroot_deps {
for (name, to) in public_deps.iter() {
add_dep(&mut crate_graph, from, name.clone(), *to)
}
if krate.is_proc_macro {
if let Some(proc_macro) = libproc_macro {
add_dep(
&mut crate_graph,
from,
CrateName::new("proc_macro").unwrap(),
*proc_macro,
);
}
}
}
for dep in &krate.deps {

View File

@ -578,6 +578,8 @@ interface Crate {
/// the `env!` macro
env: : { [key: string]: string; },
/// Whether the crate is a proc-macro crate.
is_proc_macro: bool;
/// For proc-macro crates, path to compiled
/// proc-macro (.so file).
proc_macro_dylib_path?: string;
@ -597,7 +599,7 @@ Specifically, the `roots` setup will be different eventually.
There are three ways to feed `rust-project.json` to rust-analyzer:
* Place `rust-project.json` file at the root of the project, and rust-anlayzer will discover it.
* Place `rust-project.json` file at the root of the project, and rust-analyzer will discover it.
* Specify `"rust-analyzer.linkedProjects": [ "path/to/rust-project.json" ]` in the settings (and make sure that your LSP client sends settings as a part of initialize request).
* Specify `"rust-analyzer.linkedProjects": [ { "roots": [...], "crates": [...] }]` inline.