Skip to content

Commit 70839b7

Browse files
committed
Make edition handling a bit nicer and allow specifying edition in crate_graph macro
1 parent d5ad38c commit 70839b7

File tree

5 files changed

+28
-25
lines changed

5 files changed

+28
-25
lines changed

crates/ra_db/src/input.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,15 @@ pub enum Edition {
6262
Edition2015,
6363
}
6464

65+
impl Edition {
66+
pub fn from_string(s: &str) -> Edition {
67+
match s {
68+
"2015" => Edition::Edition2015,
69+
"2018" | _ => Edition::Edition2018,
70+
}
71+
}
72+
}
73+
6574
#[derive(Debug, Clone, PartialEq, Eq)]
6675
struct CrateData {
6776
file_id: FileId,

crates/ra_hir/src/mock.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,12 @@ impl MockDatabase {
5959
pub fn set_crate_graph_from_fixture(&mut self, graph: CrateGraphFixture) {
6060
let mut ids = FxHashMap::default();
6161
let mut crate_graph = CrateGraph::default();
62-
for (crate_name, (crate_root, _)) in graph.0.iter() {
62+
for (crate_name, (crate_root, edition, _)) in graph.0.iter() {
6363
let crate_root = self.file_id_of(&crate_root);
64-
let crate_id = crate_graph.add_crate_root(crate_root, Edition::Edition2018);
64+
let crate_id = crate_graph.add_crate_root(crate_root, *edition);
6565
ids.insert(crate_name, crate_id);
6666
}
67-
for (crate_name, (_, deps)) in graph.0.iter() {
67+
for (crate_name, (_, _, deps)) in graph.0.iter() {
6868
let from = ids[crate_name];
6969
for dep in deps {
7070
let to = ids[dep];
@@ -233,16 +233,19 @@ impl MockDatabase {
233233
}
234234

235235
#[derive(Default)]
236-
pub struct CrateGraphFixture(pub FxHashMap<String, (String, Vec<String>)>);
236+
pub struct CrateGraphFixture(pub FxHashMap<String, (String, Edition, Vec<String>)>);
237237

238238
#[macro_export]
239239
macro_rules! crate_graph {
240-
($($crate_name:literal: ($crate_path:literal, [$($dep:literal),*]),)*) => {{
240+
($($crate_name:literal: ($crate_path:literal, $($edition:literal,)? [$($dep:literal),*]),)*) => {{
241241
let mut res = $crate::mock::CrateGraphFixture::default();
242242
$(
243+
#[allow(unused_mut, unused_assignments)]
244+
let mut edition = ra_db::Edition::Edition2018;
245+
$(edition = ra_db::Edition::from_string($edition);)?
243246
res.0.insert(
244247
$crate_name.to_string(),
245-
($crate_path.to_string(), vec![$($dep.to_string()),*])
248+
($crate_path.to_string(), edition, vec![$($dep.to_string()),*])
246249
);
247250
)*
248251
res

crates/ra_hir/src/nameres/tests.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,6 @@ fn glob_across_crates() {
267267

268268
#[test]
269269
fn edition_2015_imports() {
270-
use ra_db::{CrateGraph, Edition};
271270
let mut db = MockDatabase::with_files(
272271
"
273272
//- /main.rs
@@ -285,17 +284,12 @@ fn edition_2015_imports() {
285284
struct FromLib;
286285
",
287286
);
288-
let main_id = db.file_id_of("/main.rs");
289-
let lib_id = db.file_id_of("/lib.rs");
287+
db.set_crate_graph_from_fixture(crate_graph! {
288+
"main": ("/main.rs", "2015", ["other_crate"]),
289+
"other_crate": ("/lib.rs", "2018", []),
290+
});
290291
let foo_id = db.file_id_of("/foo.rs");
291292

292-
let mut crate_graph = CrateGraph::default();
293-
let main_crate = crate_graph.add_crate_root(main_id, Edition::Edition2015);
294-
let lib_crate = crate_graph.add_crate_root(lib_id, Edition::Edition2018);
295-
crate_graph.add_dep(main_crate, "other_crate".into(), lib_crate).unwrap();
296-
297-
db.set_crate_graph(Arc::new(crate_graph));
298-
299293
let module = crate::source_binder::module_from_file_id(&db, foo_id).unwrap();
300294
let krate = module.krate(&db).unwrap();
301295
let item_map = db.item_map(krate);

crates/ra_project_model/src/cargo_workspace.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use cargo_metadata::{MetadataCommand, CargoOpt};
44
use ra_arena::{Arena, RawId, impl_arena_id};
55
use rustc_hash::FxHashMap;
66
use failure::format_err;
7+
use ra_db::Edition;
78

89
use crate::Result;
910

@@ -35,7 +36,7 @@ struct PackageData {
3536
targets: Vec<Target>,
3637
is_member: bool,
3738
dependencies: Vec<PackageDependency>,
38-
edition: String,
39+
edition: Edition,
3940
}
4041

4142
#[derive(Debug, Clone)]
@@ -85,8 +86,8 @@ impl Package {
8586
pub fn root(self, ws: &CargoWorkspace) -> &Path {
8687
ws.packages[self].manifest.parent().unwrap()
8788
}
88-
pub fn edition(self, ws: &CargoWorkspace) -> &str {
89-
&ws.packages[self].edition
89+
pub fn edition(self, ws: &CargoWorkspace) -> Edition {
90+
ws.packages[self].edition
9091
}
9192
pub fn targets<'a>(self, ws: &'a CargoWorkspace) -> impl Iterator<Item = Target> + 'a {
9293
ws.packages[self].targets.iter().cloned()
@@ -139,7 +140,7 @@ impl CargoWorkspace {
139140
manifest: meta_pkg.manifest_path.clone(),
140141
targets: Vec::new(),
141142
is_member,
142-
edition: meta_pkg.edition,
143+
edition: Edition::from_string(&meta_pkg.edition),
143144
dependencies: Vec::new(),
144145
});
145146
let pkg_data = &mut packages[pkg];

crates/ra_project_model/src/lib.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,7 @@ impl ProjectWorkspace {
6363
for tgt in pkg.targets(&self.cargo) {
6464
let root = tgt.root(&self.cargo);
6565
if let Some(file_id) = load(root) {
66-
let edition = if pkg.edition(&self.cargo) == "2015" {
67-
Edition::Edition2015
68-
} else {
69-
Edition::Edition2018
70-
};
66+
let edition = pkg.edition(&self.cargo);
7167
let crate_id = crate_graph.add_crate_root(file_id, edition);
7268
if tgt.kind(&self.cargo) == TargetKind::Lib {
7369
lib_tgt = Some(crate_id);

0 commit comments

Comments
 (0)