Skip to content

Commit 8f3335f

Browse files
committed
internal: make it clearer where IO happens
1 parent 398ae3e commit 8f3335f

File tree

5 files changed

+47
-25
lines changed

5 files changed

+47
-25
lines changed

crates/base_db/src/fixture.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ impl ChangeFixture {
156156
let crate_root = default_crate_root.unwrap();
157157
crate_graph.add_crate_root(
158158
crate_root,
159-
Edition::Edition2018,
159+
Edition::CURRENT,
160160
Some(CrateName::new("test").unwrap().into()),
161161
default_cfg.clone(),
162162
default_cfg,
@@ -227,10 +227,7 @@ impl From<Fixture> for FileMeta {
227227
krate: f.krate,
228228
deps: f.deps,
229229
cfg,
230-
edition: f
231-
.edition
232-
.as_ref()
233-
.map_or(Edition::Edition2018, |v| Edition::from_str(v).unwrap()),
230+
edition: f.edition.as_ref().map_or(Edition::CURRENT, |v| Edition::from_str(v).unwrap()),
234231
env: f.env.into_iter().collect(),
235232
introduce_new_source_root: f.introduce_new_source_root,
236233
}

crates/base_db/src/input.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,10 @@ pub enum Edition {
195195
Edition2021,
196196
}
197197

198+
impl Edition {
199+
pub const CURRENT: Edition = Edition::Edition2018;
200+
}
201+
198202
#[derive(Default, Debug, Clone, PartialEq, Eq)]
199203
pub struct Env {
200204
entries: FxHashMap<String, String>,

crates/ide/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ impl Analysis {
217217
cfg_options.insert_atom("test".into());
218218
crate_graph.add_crate_root(
219219
file_id,
220-
Edition::Edition2018,
220+
Edition::CURRENT,
221221
None,
222222
cfg_options.clone(),
223223
cfg_options,

crates/project_model/src/cargo_workspace.rs

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -228,11 +228,11 @@ struct PackageMetadata {
228228
}
229229

230230
impl CargoWorkspace {
231-
pub fn from_cargo_metadata(
231+
pub fn fetch_metadata(
232232
cargo_toml: &AbsPath,
233233
config: &CargoConfig,
234234
progress: &dyn Fn(String),
235-
) -> Result<CargoWorkspace> {
235+
) -> Result<cargo_metadata::Metadata> {
236236
let mut meta = MetadataCommand::new();
237237
meta.cargo_path(toolchain::cargo());
238238
meta.manifest_path(cargo_toml.to_path_buf());
@@ -262,10 +262,12 @@ impl CargoWorkspace {
262262
meta.other_options(vec![String::from("--filter-platform"), target]);
263263
}
264264

265-
// FIXME: Currently MetadataCommand is not based on parse_stream,
266-
// So we just report it as a whole
265+
// FIXME: Fetching metadata is a slow process, as it might require
266+
// calling crates.io. We should be reporting progress here, but it's
267+
// unclear whether cargo itself supports it.
267268
progress("metadata".to_string());
268-
let mut meta = meta.exec().with_context(|| {
269+
270+
let meta = meta.exec().with_context(|| {
269271
let cwd: Option<AbsPathBuf> =
270272
std::env::current_dir().ok().and_then(|p| p.try_into().ok());
271273

@@ -283,6 +285,14 @@ impl CargoWorkspace {
283285
)
284286
})?;
285287

288+
Ok(meta)
289+
}
290+
291+
pub fn new(
292+
cargo_toml: &AbsPath,
293+
config: &CargoConfig,
294+
mut meta: cargo_metadata::Metadata,
295+
) -> CargoWorkspace {
286296
let mut pkg_by_id = FxHashMap::default();
287297
let mut packages = Arena::default();
288298
let mut targets = Arena::default();
@@ -296,9 +306,10 @@ impl CargoWorkspace {
296306
} = meta_pkg;
297307
let meta = from_value::<PackageMetadata>(metadata.clone()).unwrap_or_default();
298308
let is_member = ws_members.contains(id);
299-
let edition = edition
300-
.parse::<Edition>()
301-
.with_context(|| format!("Failed to parse edition {}", edition))?;
309+
let edition = edition.parse::<Edition>().unwrap_or_else(|err| {
310+
log::error!("Failed to parse edition {}", err);
311+
Edition::CURRENT
312+
});
302313

303314
let pkg = packages.alloc(PackageData {
304315
id: id.repr.clone(),
@@ -366,7 +377,16 @@ impl CargoWorkspace {
366377
let build_data_config =
367378
BuildDataConfig::new(cargo_toml.to_path_buf(), config.clone(), Arc::new(meta.packages));
368379

369-
Ok(CargoWorkspace { packages, targets, workspace_root, build_data_config })
380+
CargoWorkspace { packages, targets, workspace_root, build_data_config }
381+
}
382+
383+
pub fn from_cargo_metadata3(
384+
cargo_toml: &AbsPath,
385+
config: &CargoConfig,
386+
progress: &dyn Fn(String),
387+
) -> Result<CargoWorkspace> {
388+
let meta = CargoWorkspace::fetch_metadata(cargo_toml, config, progress)?;
389+
Ok(CargoWorkspace::new(cargo_toml, config, meta))
370390
}
371391

372392
pub fn packages<'a>(&'a self) -> impl Iterator<Item = Package> + ExactSizeIterator + 'a {

crates/project_model/src/workspace.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -126,14 +126,15 @@ impl ProjectWorkspace {
126126
cmd
127127
})?;
128128

129-
let cargo = CargoWorkspace::from_cargo_metadata(&cargo_toml, config, progress)
129+
let meta = CargoWorkspace::fetch_metadata(&cargo_toml, config, progress)
130130
.with_context(|| {
131131
format!(
132132
"Failed to read Cargo metadata from Cargo.toml file {}, {}",
133133
cargo_toml.display(),
134134
cargo_version
135135
)
136136
})?;
137+
let cargo = CargoWorkspace::new(&cargo_toml, config, meta);
137138

138139
let sysroot = if config.no_sysroot {
139140
Sysroot::default()
@@ -156,15 +157,15 @@ impl ProjectWorkspace {
156157
None
157158
};
158159

159-
let rustc = if let Some(rustc_dir) = rustc_dir {
160-
Some(
161-
CargoWorkspace::from_cargo_metadata(&rustc_dir, config, progress)
160+
let rustc = match rustc_dir {
161+
Some(rustc_dir) => Some({
162+
let meta = CargoWorkspace::fetch_metadata(&rustc_dir, config, progress)
162163
.with_context(|| {
163164
format!("Failed to read Cargo metadata for Rust sources")
164-
})?,
165-
)
166-
} else {
167-
None
165+
})?;
166+
CargoWorkspace::new(&rustc_dir, config, meta)
167+
}),
168+
None => None,
168169
};
169170

170171
let rustc_cfg = rustc_cfg::get(Some(&cargo_toml), config.target.as_deref());
@@ -595,7 +596,7 @@ fn detached_files_to_crate_graph(
595596
.map(|file_stem| CrateDisplayName::from_canonical_name(file_stem.to_string()));
596597
let detached_file_crate = crate_graph.add_crate_root(
597598
file_id,
598-
Edition::Edition2018,
599+
Edition::CURRENT,
599600
display_name,
600601
cfg_options.clone(),
601602
cfg_options.clone(),
@@ -777,7 +778,7 @@ fn sysroot_to_crate_graph(
777778
let display_name = CrateDisplayName::from_canonical_name(sysroot[krate].name.clone());
778779
let crate_id = crate_graph.add_crate_root(
779780
file_id,
780-
Edition::Edition2018,
781+
Edition::CURRENT,
781782
Some(display_name),
782783
cfg_options.clone(),
783784
cfg_options.clone(),

0 commit comments

Comments
 (0)