#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct CrateId(pub u32);
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+pub enum Edition {
+ Edition2018,
+ Edition2015,
+}
+
#[derive(Debug, Clone, PartialEq, Eq)]
struct CrateData {
file_id: FileId,
+ edition: Edition,
dependencies: Vec<Dependency>,
}
impl CrateData {
- fn new(file_id: FileId) -> CrateData {
- CrateData { file_id, dependencies: Vec::new() }
+ fn new(file_id: FileId, edition: Edition) -> CrateData {
+ CrateData { file_id, edition, dependencies: Vec::new() }
}
fn add_dep(&mut self, name: SmolStr, crate_id: CrateId) {
}
impl CrateGraph {
- pub fn add_crate_root(&mut self, file_id: FileId) -> CrateId {
+ pub fn add_crate_root(&mut self, file_id: FileId, edition: Edition) -> CrateId {
let crate_id = CrateId(self.arena.len() as u32);
- let prev = self.arena.insert(crate_id, CrateData::new(file_id));
+ let prev = self.arena.insert(crate_id, CrateData::new(file_id, edition));
assert!(prev.is_none());
crate_id
}
#[cfg(test)]
mod tests {
- use super::{CrateGraph, FileId, SmolStr};
+ use super::{CrateGraph, FileId, SmolStr, Edition::Edition2018};
#[test]
- fn it_should_painc_because_of_cycle_dependencies() {
+ fn it_should_panic_because_of_cycle_dependencies() {
let mut graph = CrateGraph::default();
- let crate1 = graph.add_crate_root(FileId(1u32));
- let crate2 = graph.add_crate_root(FileId(2u32));
- let crate3 = graph.add_crate_root(FileId(3u32));
+ let crate1 = graph.add_crate_root(FileId(1u32), Edition2018);
+ let crate2 = graph.add_crate_root(FileId(2u32), Edition2018);
+ let crate3 = graph.add_crate_root(FileId(3u32), Edition2018);
assert!(graph.add_dep(crate1, SmolStr::new("crate2"), crate2).is_ok());
assert!(graph.add_dep(crate2, SmolStr::new("crate3"), crate3).is_ok());
assert!(graph.add_dep(crate3, SmolStr::new("crate1"), crate1).is_err());
#[test]
fn it_works() {
let mut graph = CrateGraph::default();
- let crate1 = graph.add_crate_root(FileId(1u32));
- let crate2 = graph.add_crate_root(FileId(2u32));
- let crate3 = graph.add_crate_root(FileId(3u32));
+ let crate1 = graph.add_crate_root(FileId(1u32), Edition2018);
+ let crate2 = graph.add_crate_root(FileId(2u32), Edition2018);
+ let crate3 = graph.add_crate_root(FileId(3u32), Edition2018);
assert!(graph.add_dep(crate1, SmolStr::new("crate2"), crate2).is_ok());
assert!(graph.add_dep(crate2, SmolStr::new("crate3"), crate3).is_ok());
}
pub use crate::{
cancellation::Canceled,
input::{
- FileId, CrateId, SourceRoot, SourceRootId, CrateGraph, Dependency,
+ FileId, CrateId, SourceRoot, SourceRootId, CrateGraph, Dependency, Edition,
},
loc2id::LocationIntener,
};
use parking_lot::Mutex;
use ra_db::{
FilePosition, FileId, CrateGraph, SourceRoot, SourceRootId, SourceDatabase, salsa,
+ Edition,
};
use relative_path::RelativePathBuf;
use test_utils::{parse_fixture, CURSOR_MARKER, extract_offset};
let mut crate_graph = CrateGraph::default();
for (crate_name, (crate_root, _)) in graph.0.iter() {
let crate_root = self.file_id_of(&crate_root);
- let crate_id = crate_graph.add_crate_root(crate_root);
+ let crate_id = crate_graph.add_crate_root(crate_root, Edition::Edition2018);
ids.insert(crate_name, crate_id);
}
for (crate_name, (_, deps)) in graph.0.iter() {
if is_crate_root {
let mut crate_graph = CrateGraph::default();
- crate_graph.add_crate_root(file_id);
+ crate_graph.add_crate_root(file_id, Edition::Edition2018);
self.set_crate_graph(Arc::new(crate_graph));
}
file_id
LineIndex, LineCol, translate_offset_with_edit,
};
pub use ra_db::{
- Canceled, CrateGraph, CrateId, FileId, FilePosition, FileRange, SourceRootId
+ Canceled, CrateGraph, CrateId, FileId, FilePosition, FileRange, SourceRootId,
+ Edition
};
pub use hir::Documentation;
use relative_path::RelativePathBuf;
use test_utils::{extract_offset, extract_range, parse_fixture, CURSOR_MARKER};
-use crate::{Analysis, AnalysisChange, AnalysisHost, CrateGraph, FileId, FilePosition, FileRange, SourceRootId};
+use crate::{Analysis, AnalysisChange, AnalysisHost, CrateGraph, FileId, FilePosition, FileRange, SourceRootId, Edition::Edition2018};
/// Mock analysis is used in test to bootstrap an AnalysisHost/Analysis
/// from a set of in-memory files.
let path = RelativePathBuf::from_path(&path[1..]).unwrap();
let file_id = FileId(i as u32 + 1);
if path == "/lib.rs" || path == "/main.rs" {
- root_crate = Some(crate_graph.add_crate_root(file_id));
+ root_crate = Some(crate_graph.add_crate_root(file_id, Edition2018));
} else if path.ends_with("/lib.rs") {
- let other_crate = crate_graph.add_crate_root(file_id);
+ let other_crate = crate_graph.add_crate_root(file_id, Edition2018);
let crate_name = path.parent().unwrap().file_name().unwrap();
if let Some(root_crate) = root_crate {
crate_graph.add_dep(root_crate, crate_name.into(), other_crate).unwrap();
use insta::assert_debug_snapshot_matches;
use ra_ide_api::{
mock_analysis::{single_file, single_file_with_position, MockAnalysis},
- AnalysisChange, CrateGraph, FileId, Query, NavigationTarget,
+ AnalysisChange, CrateGraph, Edition::Edition2018, FileId, Query, NavigationTarget
};
use ra_syntax::{TextRange, SmolStr};
assert!(host.analysis().crate_for(mod_file).unwrap().is_empty());
let mut crate_graph = CrateGraph::default();
- let crate_id = crate_graph.add_crate_root(root_file);
+ let crate_id = crate_graph.add_crate_root(root_file, Edition2018);
let mut change = AnalysisChange::new();
change.set_crate_graph(crate_graph);
host.apply_change(change);
targets: Vec<Target>,
is_member: bool,
dependencies: Vec<PackageDependency>,
+ edition: String,
}
#[derive(Debug, Clone)]
pub fn root(self, ws: &CargoWorkspace) -> &Path {
ws.packages[self].manifest.parent().unwrap()
}
+ pub fn edition(self, ws: &CargoWorkspace) -> &str {
+ &ws.packages[self].edition
+ }
pub fn targets<'a>(self, ws: &'a CargoWorkspace) -> impl Iterator<Item = Target> + 'a {
ws.packages[self].targets.iter().cloned()
}
manifest: meta_pkg.manifest_path.clone(),
targets: Vec::new(),
is_member,
+ edition: meta_pkg.edition,
dependencies: Vec::new(),
});
let pkg_data = &mut packages[pkg];
use failure::bail;
use rustc_hash::FxHashMap;
-use ra_db::{CrateGraph, FileId};
+use ra_db::{CrateGraph, FileId, Edition};
pub use crate::{
cargo_workspace::{CargoWorkspace, Package, Target, TargetKind},
let mut sysroot_crates = FxHashMap::default();
for krate in self.sysroot.crates() {
if let Some(file_id) = load(krate.root(&self.sysroot)) {
- sysroot_crates.insert(krate, crate_graph.add_crate_root(file_id));
+ sysroot_crates
+ .insert(krate, crate_graph.add_crate_root(file_id, Edition::Edition2015));
}
}
for from in self.sysroot.crates() {
for tgt in pkg.targets(&self.cargo) {
let root = tgt.root(&self.cargo);
if let Some(file_id) = load(root) {
- let crate_id = crate_graph.add_crate_root(file_id);
+ let edition = if pkg.edition(&self.cargo) == "2015" {
+ Edition::Edition2015
+ } else {
+ Edition::Edition2018
+ };
+ let crate_id = crate_graph.add_crate_root(file_id, edition);
if tgt.kind(&self.cargo) == TargetKind::Lib {
lib_tgt = Some(crate_id);
pkg_to_lib_crate.insert(pkg, crate_id);