Skip to content

Commit f5892f2

Browse files
committed
perf(toml): Avoid inferring when targets are known
We read the file system to infer two different data points - Implicit targets - Implicit `path` values for targets I took a shortcut for this case and recognize the scenario where we can bypass both and do so. I went with a bypass, rather than this being integrating into the inferring code because the inferring code is complex and I didn't want to add to it further in isolating the inferring to only when its needed.
1 parent 3740bbb commit f5892f2

File tree

1 file changed

+110
-73
lines changed

1 file changed

+110
-73
lines changed

src/cargo/util/toml/targets.rs

Lines changed: 110 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -261,48 +261,60 @@ pub fn resolve_bins(
261261
errors: &mut Vec<String>,
262262
has_lib: bool,
263263
) -> CargoResult<Vec<TomlBinTarget>> {
264-
let inferred = inferred_bins(package_root, package_name);
264+
if is_resolved(toml_bins, autodiscover) {
265+
let toml_bins = toml_bins.cloned().unwrap_or_default();
266+
for bin in &toml_bins {
267+
validate_bin_name(bin, warnings)?;
268+
validate_bin_crate_types(bin, edition, warnings, errors)?;
269+
validate_bin_proc_macro(bin, edition, warnings, errors)?;
270+
}
271+
Ok(toml_bins)
272+
} else {
273+
let inferred = inferred_bins(package_root, package_name);
265274

266-
let mut bins = toml_targets_and_inferred(
267-
toml_bins,
268-
&inferred,
269-
package_root,
270-
autodiscover,
271-
edition,
272-
warnings,
273-
"binary",
274-
"bin",
275-
"autobins",
276-
);
275+
let mut bins = toml_targets_and_inferred(
276+
toml_bins,
277+
&inferred,
278+
package_root,
279+
autodiscover,
280+
edition,
281+
warnings,
282+
"binary",
283+
"bin",
284+
"autobins",
285+
);
277286

278-
for bin in &mut bins {
279-
// Check early to improve error messages
280-
validate_bin_name(bin, warnings)?;
287+
for bin in &mut bins {
288+
// Check early to improve error messages
289+
validate_bin_name(bin, warnings)?;
281290

282-
validate_bin_crate_types(bin, edition, warnings, errors)?;
283-
validate_bin_proc_macro(bin, edition, warnings, errors)?;
291+
validate_bin_crate_types(bin, edition, warnings, errors)?;
292+
validate_bin_proc_macro(bin, edition, warnings, errors)?;
284293

285-
let path = target_path(bin, &inferred, "bin", package_root, edition, &mut |_| {
286-
if let Some(legacy_path) = legacy_bin_path(package_root, name_or_panic(bin), has_lib) {
287-
warnings.push(format!(
288-
"path `{}` was erroneously implicitly accepted for binary `{}`,\n\
294+
let path = target_path(bin, &inferred, "bin", package_root, edition, &mut |_| {
295+
if let Some(legacy_path) =
296+
legacy_bin_path(package_root, name_or_panic(bin), has_lib)
297+
{
298+
warnings.push(format!(
299+
"path `{}` was erroneously implicitly accepted for binary `{}`,\n\
289300
please set bin.path in Cargo.toml",
290-
legacy_path.display(),
291-
name_or_panic(bin)
292-
));
293-
Some(legacy_path)
294-
} else {
295-
None
296-
}
297-
});
298-
let path = match path {
299-
Ok(path) => path,
300-
Err(e) => anyhow::bail!("{}", e),
301-
};
302-
bin.path = Some(PathValue(path));
303-
}
301+
legacy_path.display(),
302+
name_or_panic(bin)
303+
));
304+
Some(legacy_path)
305+
} else {
306+
None
307+
}
308+
});
309+
let path = match path {
310+
Ok(path) => path,
311+
Err(e) => anyhow::bail!("{}", e),
312+
};
313+
bin.path = Some(PathValue(path));
314+
}
304315

305-
Ok(bins)
316+
Ok(bins)
317+
}
306318
}
307319

308320
#[tracing::instrument(skip_all)]
@@ -536,6 +548,19 @@ fn to_bench_targets(
536548
Ok(result)
537549
}
538550

551+
fn is_resolved(toml_targets: Option<&Vec<TomlTarget>>, autodiscover: Option<bool>) -> bool {
552+
if autodiscover != Some(false) {
553+
return false;
554+
}
555+
556+
let Some(toml_targets) = toml_targets else {
557+
return true;
558+
};
559+
toml_targets
560+
.iter()
561+
.all(|t| t.name.is_some() && t.path.is_some())
562+
}
563+
539564
fn resolve_targets(
540565
target_kind_human: &str,
541566
target_kind: &str,
@@ -576,48 +601,60 @@ fn resolve_targets_with_legacy_path(
576601
legacy_path: &mut dyn FnMut(&TomlTarget) -> Option<PathBuf>,
577602
autodiscover_flag_name: &str,
578603
) -> CargoResult<Vec<TomlTarget>> {
579-
let inferred = inferred();
580-
let toml_targets = toml_targets_and_inferred(
581-
toml_targets,
582-
&inferred,
583-
package_root,
584-
autodiscover,
585-
edition,
586-
warnings,
587-
target_kind_human,
588-
target_kind,
589-
autodiscover_flag_name,
590-
);
591-
592-
for target in &toml_targets {
593-
// Check early to improve error messages
594-
validate_target_name(target, target_kind_human, target_kind, warnings)?;
595-
596-
validate_proc_macro(target, target_kind_human, edition, warnings)?;
597-
validate_crate_types(target, target_kind_human, edition, warnings)?;
598-
}
599-
600-
let mut result = Vec::new();
601-
for mut target in toml_targets {
602-
let path = target_path(
603-
&target,
604+
if is_resolved(toml_targets, autodiscover) {
605+
let toml_targets = toml_targets.cloned().unwrap_or_default();
606+
for target in &toml_targets {
607+
// Check early to improve error messages
608+
validate_target_name(target, target_kind_human, target_kind, warnings)?;
609+
610+
validate_proc_macro(target, target_kind_human, edition, warnings)?;
611+
validate_crate_types(target, target_kind_human, edition, warnings)?;
612+
}
613+
Ok(toml_targets)
614+
} else {
615+
let inferred = inferred();
616+
let toml_targets = toml_targets_and_inferred(
617+
toml_targets,
604618
&inferred,
605-
target_kind,
606619
package_root,
620+
autodiscover,
607621
edition,
608-
legacy_path,
622+
warnings,
623+
target_kind_human,
624+
target_kind,
625+
autodiscover_flag_name,
609626
);
610-
let path = match path {
611-
Ok(path) => path,
612-
Err(e) => {
613-
errors.push(e);
614-
continue;
615-
}
616-
};
617-
target.path = Some(PathValue(path));
618-
result.push(target);
627+
628+
for target in &toml_targets {
629+
// Check early to improve error messages
630+
validate_target_name(target, target_kind_human, target_kind, warnings)?;
631+
632+
validate_proc_macro(target, target_kind_human, edition, warnings)?;
633+
validate_crate_types(target, target_kind_human, edition, warnings)?;
634+
}
635+
636+
let mut result = Vec::new();
637+
for mut target in toml_targets {
638+
let path = target_path(
639+
&target,
640+
&inferred,
641+
target_kind,
642+
package_root,
643+
edition,
644+
legacy_path,
645+
);
646+
let path = match path {
647+
Ok(path) => path,
648+
Err(e) => {
649+
errors.push(e);
650+
continue;
651+
}
652+
};
653+
target.path = Some(PathValue(path));
654+
result.push(target);
655+
}
656+
Ok(result)
619657
}
620-
Ok(result)
621658
}
622659

623660
fn inferred_lib(package_root: &Path) -> Option<PathBuf> {

0 commit comments

Comments
 (0)