Skip to content

Commit

Permalink
Auto merge of rust-lang#17973 - Veykril:proc-macro-curr-dir, r=Veykril
Browse files Browse the repository at this point in the history
Expand proc-macros in workspace root, not package root

Should fix rust-lang/rust-analyzer#17748. The approach is generally not perfect though as rust-project.json projects don't benefit from this (still, nothing changes in that regard)
  • Loading branch information
bors committed Aug 27, 2024
2 parents 6593688 + df4580b commit e4c404e
Show file tree
Hide file tree
Showing 7 changed files with 34 additions and 14 deletions.
16 changes: 9 additions & 7 deletions src/tools/rust-analyzer/crates/hir-ty/src/display.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ use rustc_apfloat::{
};
use smallvec::SmallVec;
use span::Edition;
use stdx::{never, IsNoneOr};
use stdx::never;
use triomphe::Arc;

use crate::{
Expand Down Expand Up @@ -1479,12 +1479,14 @@ fn generic_args_sans_defaults<'ga>(
}
// otherwise, if the arg is equal to the param default, hide it (unless the
// default is an error which can happen for the trait Self type)
#[allow(unstable_name_collisions)]
default_parameters.get(i).is_none_or(|default_parameter| {
// !is_err(default_parameter.skip_binders())
// &&
arg != &default_parameter.clone().substitute(Interner, &parameters)
})
match default_parameters.get(i) {
None => true,
Some(default_parameter) => {
// !is_err(default_parameter.skip_binders())
// &&
arg != &default_parameter.clone().substitute(Interner, &parameters)
}
}
};
let mut default_from = 0;
for (i, parameter) in parameters.iter().enumerate() {
Expand Down
3 changes: 2 additions & 1 deletion src/tools/rust-analyzer/crates/proc-macro-api/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,8 @@ impl ProcMacro {
mixed_site: Span,
) -> Result<Result<tt::Subtree<Span>, PanicMessage>, ServerError> {
let version = self.process.version();
let current_dir = env.get("CARGO_MANIFEST_DIR");
let current_dir =
env.get("CARGO_RUSTC_CURRENT_DIR").or_else(|| env.get("CARGO_MANIFEST_DIR"));

let mut span_data_table = SpanDataIndexMap::default();
let def_site = span_data_table.insert_full(def_site).0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,10 @@ impl TargetKind {
pub fn is_executable(self) -> bool {
matches!(self, TargetKind::Bin | TargetKind::Example)
}

pub fn is_proc_macro(self) -> bool {
matches!(self, TargetKind::Lib { is_proc_macro: true })
}
}

// Deserialize helper for the cargo metadata
Expand Down
14 changes: 12 additions & 2 deletions src/tools/rust-analyzer/crates/project-model/src/env.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use base_db::Env;
use rustc_hash::FxHashMap;
use toolchain::Tool;

use crate::{utf8_stdout, ManifestPath, PackageData, Sysroot, TargetKind};
use crate::{utf8_stdout, CargoWorkspace, ManifestPath, PackageData, Sysroot, TargetKind};

/// Recreates the compile-time environment variables that Cargo sets.
///
Expand Down Expand Up @@ -50,13 +50,23 @@ pub(crate) fn inject_cargo_env(env: &mut Env) {
env.set("CARGO", Tool::Cargo.path().to_string());
}

pub(crate) fn inject_rustc_tool_env(env: &mut Env, cargo_name: &str, kind: TargetKind) {
pub(crate) fn inject_rustc_tool_env(
env: &mut Env,
cargo: &CargoWorkspace,
cargo_name: &str,
kind: TargetKind,
) {
_ = kind;
// FIXME
// if kind.is_executable() {
// env.set("CARGO_BIN_NAME", cargo_name);
// }
env.set("CARGO_CRATE_NAME", cargo_name.replace('-', "_"));
// NOTE: Technically we should set this for all crates, but that will worsen the deduplication
// logic so for now just keeping it proc-macros ought to be fine.
if kind.is_proc_macro() {
env.set("CARGO_RUSTC_CURRENT_DIR", cargo.manifest_path().to_string());
}
}

pub(crate) fn cargo_config_env(
Expand Down
2 changes: 1 addition & 1 deletion src/tools/rust-analyzer/crates/project-model/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,7 @@ fn crate_graph_dedup() {
assert_eq!(regex_crate_graph.iter().count(), 60);

crate_graph.extend(regex_crate_graph, &mut regex_proc_macros, |(_, a), (_, b)| a == b);
assert_eq!(crate_graph.iter().count(), 118);
assert_eq!(crate_graph.iter().count(), 119);
}

#[test]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1027,6 +1027,7 @@ fn cargo_to_crate_graph(
let crate_id = add_target_crate_root(
crate_graph,
proc_macros,
cargo,
pkg_data,
build_data,
cfg_options.clone(),
Expand Down Expand Up @@ -1246,6 +1247,7 @@ fn handle_rustc_crates(
let crate_id = add_target_crate_root(
crate_graph,
proc_macros,
rustc_workspace,
&rustc_workspace[pkg],
build_scripts.get_output(pkg),
cfg_options.clone(),
Expand Down Expand Up @@ -1305,6 +1307,7 @@ fn handle_rustc_crates(
fn add_target_crate_root(
crate_graph: &mut CrateGraph,
proc_macros: &mut ProcMacroPaths,
cargo: &CargoWorkspace,
pkg: &PackageData,
build_data: Option<&BuildScriptOutput>,
cfg_options: CfgOptions,
Expand Down Expand Up @@ -1338,7 +1341,7 @@ fn add_target_crate_root(
let mut env = Env::default();
inject_cargo_package_env(&mut env, pkg);
inject_cargo_env(&mut env);
inject_rustc_tool_env(&mut env, cargo_name, kind);
inject_rustc_tool_env(&mut env, cargo, cargo_name, kind);

if let Some(envs) = build_data.map(|it| &it.envs) {
for (k, v) in envs {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ fn test_deduplicate_origin_dev() {
}
}

assert!(crates_named_p2.len() == 1);
assert_eq!(crates_named_p2.len(), 1);
let p2 = crates_named_p2[0];
assert!(p2.origin.is_local());
}
Expand All @@ -120,7 +120,7 @@ fn test_deduplicate_origin_dev_rev() {
}
}

assert!(crates_named_p2.len() == 1);
assert_eq!(crates_named_p2.len(), 1);
let p2 = crates_named_p2[0];
assert!(p2.origin.is_local());
}

0 comments on commit e4c404e

Please sign in to comment.