Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 26 additions & 8 deletions crates/ra_db/src/input.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,16 +111,28 @@ struct CrateData {
edition: Edition,
dependencies: Vec<Dependency>,
cfg_options: CfgOptions,
env: FxHashMap<String, String>,
}

impl CrateData {
fn new(file_id: FileId, edition: Edition, cfg_options: CfgOptions) -> CrateData {
CrateData { file_id, edition, dependencies: Vec::new(), cfg_options }
CrateData {
file_id,
edition,
dependencies: Vec::new(),
cfg_options,
env: Default::default(),
}
}

fn add_dep(&mut self, name: SmolStr, crate_id: CrateId) {
self.dependencies.push(Dependency { name, crate_id })
}

/// Sets environment variable available through `env!(VARIABLE_NAME)` macro for crates in crate graph.
pub fn set_env(&mut self, env: &str, value: String) {
self.env.insert(env.to_owned(), value);
}
}

#[derive(Debug, Clone, PartialEq, Eq)]
Expand All @@ -141,9 +153,15 @@ impl CrateGraph {
file_id: FileId,
edition: Edition,
cfg_options: CfgOptions,
out_dir: Option<String>,
) -> CrateId {
let crate_id = CrateId(self.arena.len() as u32);
let prev = self.arena.insert(crate_id, CrateData::new(file_id, edition, cfg_options));
let mut crate_data = CrateData::new(file_id, edition, cfg_options);
if let Some(out_dir) = out_dir {
crate_data.set_env("OUT_DIR", out_dir.to_owned());
}

let prev = self.arena.insert(crate_id, crate_data);
assert!(prev.is_none());
crate_id
}
Expand Down Expand Up @@ -237,9 +255,9 @@ mod tests {
#[test]
fn it_should_panic_because_of_cycle_dependencies() {
let mut graph = CrateGraph::default();
let crate1 = graph.add_crate_root(FileId(1u32), Edition2018, CfgOptions::default());
let crate2 = graph.add_crate_root(FileId(2u32), Edition2018, CfgOptions::default());
let crate3 = graph.add_crate_root(FileId(3u32), Edition2018, CfgOptions::default());
let crate1 = graph.add_crate_root(FileId(1u32), Edition2018, CfgOptions::default(), None);
let crate2 = graph.add_crate_root(FileId(2u32), Edition2018, CfgOptions::default(), None);
let crate3 = graph.add_crate_root(FileId(3u32), Edition2018, CfgOptions::default(), None);
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());
Expand All @@ -248,9 +266,9 @@ mod tests {
#[test]
fn it_works() {
let mut graph = CrateGraph::default();
let crate1 = graph.add_crate_root(FileId(1u32), Edition2018, CfgOptions::default());
let crate2 = graph.add_crate_root(FileId(2u32), Edition2018, CfgOptions::default());
let crate3 = graph.add_crate_root(FileId(3u32), Edition2018, CfgOptions::default());
let crate1 = graph.add_crate_root(FileId(1u32), Edition2018, CfgOptions::default(), None);
let crate2 = graph.add_crate_root(FileId(2u32), Edition2018, CfgOptions::default(), None);
let crate3 = graph.add_crate_root(FileId(3u32), Edition2018, CfgOptions::default(), None);
assert!(graph.add_dep(crate1, SmolStr::new("crate2"), crate2).is_ok());
assert!(graph.add_dep(crate2, SmolStr::new("crate3"), crate3).is_ok());
}
Expand Down
5 changes: 3 additions & 2 deletions crates/ra_hir/src/mock.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@ impl MockDatabase {
let mut crate_graph = CrateGraph::default();
for (crate_name, (crate_root, edition, cfg_options, _)) in graph.0.iter() {
let crate_root = self.file_id_of(&crate_root);
let crate_id = crate_graph.add_crate_root(crate_root, *edition, cfg_options.clone());
let crate_id =
crate_graph.add_crate_root(crate_root, *edition, cfg_options.clone(), None);
Arc::make_mut(&mut self.crate_names).insert(crate_id, crate_name.clone());
ids.insert(crate_name, crate_id);
}
Expand Down Expand Up @@ -185,7 +186,7 @@ impl MockDatabase {

if is_crate_root {
let mut crate_graph = CrateGraph::default();
crate_graph.add_crate_root(file_id, Edition::Edition2018, CfgOptions::default());
crate_graph.add_crate_root(file_id, Edition::Edition2018, CfgOptions::default(), None);
self.set_crate_graph(Arc::new(crate_graph));
}
file_id
Expand Down
2 changes: 1 addition & 1 deletion crates/ra_ide_api/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -326,7 +326,7 @@ impl Analysis {
// FIXME: cfg options
// Default to enable test for single file.
let cfg_options = CfgOptions::default().atom("test".into());
crate_graph.add_crate_root(file_id, Edition::Edition2018, cfg_options);
crate_graph.add_crate_root(file_id, Edition::Edition2018, cfg_options, None);
change.add_file(source_root, file_id, "main.rs".into(), Arc::new(text));
change.set_crate_graph(crate_graph);
host.apply_change(change);
Expand Down
6 changes: 4 additions & 2 deletions crates/ra_ide_api/src/mock_analysis.rs
Original file line number Diff line number Diff line change
Expand Up @@ -96,9 +96,11 @@ impl MockAnalysis {
let file_id = FileId(i as u32 + 1);
let cfg_options = CfgOptions::default();
if path == "/lib.rs" || path == "/main.rs" {
root_crate = Some(crate_graph.add_crate_root(file_id, Edition2018, cfg_options));
root_crate =
Some(crate_graph.add_crate_root(file_id, Edition2018, cfg_options, None));
} else if path.ends_with("/lib.rs") {
let other_crate = crate_graph.add_crate_root(file_id, Edition2018, cfg_options);
let other_crate =
crate_graph.add_crate_root(file_id, Edition2018, cfg_options, None);
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();
Expand Down
3 changes: 2 additions & 1 deletion crates/ra_ide_api/src/parent_module.rs
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,8 @@ mod tests {
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, Edition2018, CfgOptions::default());
let crate_id =
crate_graph.add_crate_root(root_file, Edition2018, CfgOptions::default(), None);
let mut change = AnalysisChange::new();
change.set_crate_graph(crate_graph);
host.apply_change(change);
Expand Down
8 changes: 7 additions & 1 deletion crates/ra_project_model/src/cargo_workspace.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ pub struct CargoWorkspace {
packages: Arena<Package, PackageData>,
targets: Arena<Target, TargetData>,
pub(crate) workspace_root: PathBuf,
pub(crate) target_directory: PathBuf,
}

#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
Expand Down Expand Up @@ -172,7 +173,12 @@ impl CargoWorkspace {
packages[source].features.extend(node.features);
}

Ok(CargoWorkspace { packages, targets, workspace_root: meta.workspace_root })
Ok(CargoWorkspace {
packages,
targets,
workspace_root: meta.workspace_root,
target_directory: meta.target_directory,
})
}

pub fn packages<'a>(&'a self) -> impl Iterator<Item = Package> + ExactSizeIterator + 'a {
Expand Down
26 changes: 21 additions & 5 deletions crates/ra_project_model/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ impl ProjectWorkspace {
}
crates.insert(
crate_id,
crate_graph.add_crate_root(file_id, edition, cfg_options),
crate_graph.add_crate_root(file_id, edition, cfg_options, None),
);
}
}
Expand Down Expand Up @@ -172,8 +172,13 @@ impl ProjectWorkspace {
if let Some(file_id) = load(krate.root(&sysroot)) {
// Crates from sysroot have `cfg(test)` disabled
let cfg_options = default_cfg_options.clone().remove_atom(&"test".into());
let crate_id =
crate_graph.add_crate_root(file_id, Edition::Edition2018, cfg_options);
let crate_id = crate_graph.add_crate_root(
file_id,
Edition::Edition2018,
cfg_options,
Self::find_out_dir(&cargo.target_directory),
);

sysroot_crates.insert(krate, crate_id);
names.insert(crate_id, krate.name(&sysroot).to_string());
}
Expand Down Expand Up @@ -205,8 +210,12 @@ impl ProjectWorkspace {
let cfg_options = default_cfg_options
.clone()
.features(pkg.features(&cargo).iter().map(Into::into));
let crate_id =
crate_graph.add_crate_root(file_id, edition, cfg_options);
let crate_id = crate_graph.add_crate_root(
file_id,
edition,
cfg_options,
Self::find_out_dir(&cargo.target_directory),
);
names.insert(crate_id, pkg.name(&cargo).to_string());
if tgt.kind(&cargo) == TargetKind::Lib {
lib_tgt = Some(crate_id);
Expand Down Expand Up @@ -273,6 +282,13 @@ impl ProjectWorkspace {
.map(|root| root.path.as_ref()),
}
}

/// A heuristic that looks for the `OUT_DIR` in the specific `target/` directory of `cargo` workspace.
fn find_out_dir(_target_path: &PathBuf) -> Option<String> {
// FIXME: put heuristic here
// Should probably traverse the `target/<release-or-debug>/...` path and find a match
None
}
}

fn find_rust_project_json(path: &Path) -> Option<PathBuf> {
Expand Down