use test_utils::{extract_offset, parse_fixture, CURSOR_MARKER};
use crate::{
- CrateGraph, CrateId, Edition, FileId, FilePosition, RelativePathBuf, SourceDatabaseExt,
+ CrateGraph, CrateId, Edition, Env, FileId, FilePosition, RelativePathBuf, SourceDatabaseExt,
SourceRoot, SourceRootId,
};
source_root.insert_file(rel_path.clone(), file_id);
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(),
+ Env::default(),
+ );
db.set_file_text(file_id, Arc::new(text.to_string()));
db.set_file_relative_path(file_id, rel_path);
assert!(meta.path.starts_with(&source_root_prefix));
if let Some(krate) = meta.krate {
- let crate_id = crate_graph.add_crate_root(file_id, meta.edition, meta.cfg);
+ let crate_id =
+ crate_graph.add_crate_root(file_id, meta.edition, meta.cfg, Env::default());
let prev = crates.insert(krate.clone(), crate_id);
assert!(prev.is_none());
for dep in meta.deps {
if crates.is_empty() {
let crate_root = default_crate_root.unwrap();
- crate_graph.add_crate_root(crate_root, Edition::Edition2018, CfgOptions::default());
+ crate_graph.add_crate_root(
+ crate_root,
+ Edition::Edition2018,
+ CfgOptions::default(),
+ Env::default(),
+ );
} else {
for (from, to) in crate_deps {
let from_id = crates[&from];
}
}
+#[derive(Default, Debug, Clone, PartialEq, Eq)]
+pub struct Env {
+ entries: FxHashMap<String, String>,
+}
+
#[derive(Debug, Clone, PartialEq, Eq)]
struct CrateData {
file_id: FileId,
edition: Edition,
dependencies: Vec<Dependency>,
cfg_options: CfgOptions,
+ env: Env,
}
impl CrateData {
- fn new(file_id: FileId, edition: Edition, cfg_options: CfgOptions) -> CrateData {
- CrateData { file_id, edition, dependencies: Vec::new(), cfg_options }
+ fn new(file_id: FileId, edition: Edition, cfg_options: CfgOptions, env: Env) -> CrateData {
+ CrateData { file_id, edition, dependencies: Vec::new(), cfg_options, env }
}
fn add_dep(&mut self, name: SmolStr, crate_id: CrateId) {
file_id: FileId,
edition: Edition,
cfg_options: CfgOptions,
+ env: Env,
) -> CrateId {
+ let data = CrateData::new(file_id, edition, cfg_options, env);
let crate_id = CrateId(self.arena.len() as u32);
- let prev = self.arena.insert(crate_id, CrateData::new(file_id, edition, cfg_options));
+ let prev = self.arena.insert(crate_id, data);
assert!(prev.is_none());
crate_id
}
#[cfg(test)]
mod tests {
- use super::{CfgOptions, CrateGraph, Edition::Edition2018, FileId, SmolStr};
+ use super::{CfgOptions, CrateGraph, Edition::Edition2018, Env, FileId, SmolStr};
#[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(), Env::default());
+ let crate2 =
+ graph.add_crate_root(FileId(2u32), Edition2018, CfgOptions::default(), Env::default());
+ let crate3 =
+ graph.add_crate_root(FileId(3u32), Edition2018, CfgOptions::default(), Env::default());
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), 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(), Env::default());
+ let crate2 =
+ graph.add_crate_root(FileId(2u32), Edition2018, CfgOptions::default(), Env::default());
+ let crate3 =
+ graph.add_crate_root(FileId(3u32), Edition2018, CfgOptions::default(), Env::default());
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::{CrateGraph, CrateId, Dependency, Edition, FileId, SourceRoot, SourceRootId},
+ input::{CrateGraph, CrateId, Dependency, Edition, Env, FileId, SourceRoot, SourceRootId},
};
pub use relative_path::{RelativePath, RelativePathBuf};
pub use salsa;
use ra_cfg::CfgOptions;
use ra_db::{
salsa::{self, ParallelDatabase},
- CheckCanceled, FileLoader, SourceDatabase,
+ CheckCanceled, Env, FileLoader, SourceDatabase,
};
use ra_syntax::{SourceFile, TextRange, TextUnit};
// Default to enable test for single file.
let mut cfg_options = CfgOptions::default();
cfg_options.insert_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, Env::default());
change.add_file(source_root, file_id, "main.rs".into(), Arc::new(text));
change.set_crate_graph(crate_graph);
host.apply_change(change);
use std::sync::Arc;
use ra_cfg::CfgOptions;
-use ra_db::RelativePathBuf;
+use ra_db::{Env, RelativePathBuf};
use test_utils::{extract_offset, extract_range, parse_fixture, CURSOR_MARKER};
use crate::{
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,
+ Env::default(),
+ ));
} 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, Env::default());
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();
#[cfg(test)]
mod tests {
+ use ra_cfg::CfgOptions;
+ use ra_db::Env;
+
use crate::{
mock_analysis::{analysis_and_position, MockAnalysis},
AnalysisChange, CrateGraph,
Edition::Edition2018,
};
- use ra_cfg::CfgOptions;
#[test]
fn test_resolve_parent_module() {
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(),
+ Env::default(),
+ );
let mut change = AnalysisChange::new();
change.set_crate_graph(crate_graph);
host.apply_change(change);
};
use ra_cfg::CfgOptions;
-use ra_db::{CrateGraph, CrateId, Edition, FileId};
+use ra_db::{CrateGraph, CrateId, Edition, Env, FileId};
use rustc_hash::FxHashMap;
use serde_json::from_reader;
};
crates.insert(
crate_id,
- crate_graph.add_crate_root(file_id, edition, cfg_options),
+ crate_graph.add_crate_root(
+ file_id,
+ edition,
+ cfg_options,
+ Env::default(),
+ ),
);
}
}
opts
};
- 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,
+ Env::default(),
+ );
sysroot_crates.insert(krate, crate_id);
names.insert(crate_id, krate.name(&sysroot).to_string());
}
opts.insert_features(pkg.features(&cargo).iter().map(Into::into));
opts
};
- 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,
+ Env::default(),
+ );
names.insert(crate_id, pkg.name(&cargo).to_string());
if tgt.kind(&cargo) == TargetKind::Lib {
lib_tgt = Some(crate_id);