Skip to content

Commit 6d3b0af

Browse files
committed
Use empty-deps tricks to detect it is core
1 parent 213d208 commit 6d3b0af

File tree

2 files changed

+26
-11
lines changed

2 files changed

+26
-11
lines changed

crates/ra_hir_expand/src/builtin_derive.rs

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -160,11 +160,17 @@ fn find_builtin_crate(db: &dyn AstDatabase, id: LazyMacroId) -> tt::TokenTree {
160160
let m: MacroCallId = id.into();
161161
let file_id = m.as_file().original_file(db);
162162
let cg = db.crate_graph();
163-
let crates = db.relevant_crates(file_id);
164-
let mut crate_names =
165-
crates.iter().filter_map(|krate| cg[*krate].display_name.clone()).map(|it| it.to_string());
163+
let krates = db.relevant_crates(file_id);
164+
let krate = match krates.get(0) {
165+
Some(krate) => krate,
166+
None => {
167+
let tt = quote! { core };
168+
return tt.token_trees[0].clone();
169+
}
170+
};
166171

167-
let tt = if crate_names.any(|name| name == "std" || name == "core") {
172+
// Check whether it has any deps, if not, it should be core:
173+
let tt = if cg[*krate].dependencies.is_empty() {
168174
quote! { crate }
169175
} else {
170176
quote! { core }
@@ -263,8 +269,18 @@ mod tests {
263269

264270
fn expand_builtin_derive(s: &str, name: Name) -> String {
265271
let def = find_builtin_derive(&name).unwrap();
272+
let fixture = format!(
273+
r#"//- /main.rs crate:main deps:core
274+
<|>
275+
{}
276+
//- /lib.rs crate:core
277+
// empty
278+
"#,
279+
s
280+
);
266281

267-
let (db, file_id) = TestDB::with_single_file(&s);
282+
let (db, file_pos) = TestDB::with_position(&fixture);
283+
let file_id = file_pos.file_id;
268284
let parsed = db.parse(file_id);
269285
let items: Vec<_> =
270286
parsed.syntax_node().descendants().filter_map(ast::ModuleItem::cast).collect();

crates/ra_hir_ty/src/tests/macros.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -646,12 +646,6 @@ mod clone {
646646
fn infer_derive_clone_in_core() {
647647
let (db, pos) = TestDB::with_position(
648648
r#"
649-
//- /main.rs crate:main deps:core
650-
use core::S;
651-
fn test() {
652-
S.clone()<|>;
653-
}
654-
655649
//- /lib.rs crate:core
656650
#[prelude_import]
657651
use clone::*;
@@ -663,6 +657,11 @@ mod clone {
663657
#[derive(Clone)]
664658
pub struct S;
665659
660+
//- /main.rs crate:main deps:core
661+
use core::S;
662+
fn test() {
663+
S.clone()<|>;
664+
}
666665
"#,
667666
);
668667
assert_eq!("S", type_at_pos(&db, pos));

0 commit comments

Comments
 (0)