mirror of
https://github.com/Noratrieb/cargo-minimize.git
synced 2026-01-14 16:35:01 +01:00
resolve crates simple
This commit is contained in:
parent
7fd4516494
commit
f5e8a3d51e
1 changed files with 63 additions and 4 deletions
|
|
@ -8,7 +8,7 @@ use cargo::{
|
||||||
ops::{self, CompileOptions},
|
ops::{self, CompileOptions},
|
||||||
util::{command_prelude::CompileMode, Config},
|
util::{command_prelude::CompileMode, Config},
|
||||||
};
|
};
|
||||||
use std::{collections::HashMap, ops::Not, path::Path, process::Command};
|
use std::{collections::BTreeSet, fmt::Debug, ops::Not, path::Path, process::Command};
|
||||||
use syn::{visit_mut::VisitMut, File, Item, ItemMod, Visibility};
|
use syn::{visit_mut::VisitMut, File, Item, ItemMod, Visibility};
|
||||||
|
|
||||||
fn cargo_expand(cargo_dir: &TargetSourcePath) -> Result<syn::File> {
|
fn cargo_expand(cargo_dir: &TargetSourcePath) -> Result<syn::File> {
|
||||||
|
|
@ -39,11 +39,40 @@ fn cargo_expand(cargo_dir: &TargetSourcePath) -> Result<syn::File> {
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Crate {
|
struct Crate {
|
||||||
file: syn::File,
|
|
||||||
name: String,
|
name: String,
|
||||||
|
file: syn::File,
|
||||||
deps: Vec<String>,
|
deps: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Debug for Crate {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
f.debug_struct("Crate")
|
||||||
|
.field("name", &self.name)
|
||||||
|
.field("deps", &self.deps)
|
||||||
|
.finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PartialEq for Crate {
|
||||||
|
fn eq(&self, other: &Self) -> bool {
|
||||||
|
self.name == other.name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Eq for Crate {}
|
||||||
|
|
||||||
|
impl PartialOrd for Crate {
|
||||||
|
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
|
||||||
|
self.name.partial_cmp(&other.name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Ord for Crate {
|
||||||
|
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
|
||||||
|
self.name.cmp(&other.name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct DepExpander<'ws, 'cfg> {
|
struct DepExpander<'ws, 'cfg> {
|
||||||
bcx: BuildContext<'ws, 'cfg>,
|
bcx: BuildContext<'ws, 'cfg>,
|
||||||
}
|
}
|
||||||
|
|
@ -56,12 +85,42 @@ impl<'ws, 'cfg> DepExpander<'ws, 'cfg> {
|
||||||
.context("unit source path not found")
|
.context("unit source path not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn crates(&self) -> Vec<Crate> {
|
fn crates(&self, unit: &Unit, set: &mut BTreeSet<Crate>) -> Result<()> {
|
||||||
todo!()
|
let ast = cargo_expand(unit.target.src_path()).context("expanding unit")?;
|
||||||
|
|
||||||
|
let deps = self
|
||||||
|
.bcx
|
||||||
|
.unit_graph
|
||||||
|
.get(unit)
|
||||||
|
.context("dependencies not found for crate")?;
|
||||||
|
|
||||||
|
let dep_names = deps
|
||||||
|
.iter()
|
||||||
|
.map(|dep| dep.unit.target.crate_name())
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let krate = Crate {
|
||||||
|
file: ast,
|
||||||
|
name: unit.target.crate_name(),
|
||||||
|
deps: dep_names,
|
||||||
|
};
|
||||||
|
|
||||||
|
set.insert(krate);
|
||||||
|
|
||||||
|
for dep in deps {
|
||||||
|
self.crates(&dep.unit, set)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn expand(&self) -> Result<File> {
|
fn expand(&self) -> Result<File> {
|
||||||
let unit = self.bcx.roots.get(0).context("root unit not found")?;
|
let unit = self.bcx.roots.get(0).context("root unit not found")?;
|
||||||
|
|
||||||
|
let mut crates = BTreeSet::new();
|
||||||
|
self.crates(unit, &mut crates).context("get crate list")?;
|
||||||
|
println!("{crates:?}");
|
||||||
|
|
||||||
self.expand_recursively(unit)
|
self.expand_recursively(unit)
|
||||||
.context(format!("expanding {} crate", unit.target.crate_name()))
|
.context(format!("expanding {} crate", unit.target.crate_name()))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue