aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/autoload/autoload_generator.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src/autoload/autoload_generator.rs')
-rw-r--r--crates/shirabe/src/autoload/autoload_generator.rs78
1 files changed, 45 insertions, 33 deletions
diff --git a/crates/shirabe/src/autoload/autoload_generator.rs b/crates/shirabe/src/autoload/autoload_generator.rs
index 5c9f008..3786011 100644
--- a/crates/shirabe/src/autoload/autoload_generator.rs
+++ b/crates/shirabe/src/autoload/autoload_generator.rs
@@ -27,9 +27,9 @@ use crate::installer::InstallationManager;
use crate::io::IOInterface;
use crate::io::NullIO;
use crate::json::JsonFile;
-use crate::package::AliasPackage;
use crate::package::Locker;
use crate::package::PackageInterface;
+use crate::package::PackageInterfaceHandle;
use crate::package::RootPackageInterface;
use crate::repository::InstalledRepositoryInterface;
use crate::script::ScriptEvents;
@@ -267,7 +267,7 @@ impl AutoloadGenerator {
let autoloads = self.parse_autoloads(
package_map
.iter()
- .map(|(p, s)| (p.clone_package_box(), s.clone()))
+ .map(|(p, s)| (p.clone(), s.clone()))
.collect(),
root_package,
filtered_dev_packages,
@@ -741,20 +741,24 @@ impl AutoloadGenerator {
&self,
installation_manager: &mut InstallationManager,
root_package: &dyn RootPackageInterface,
- packages: Vec<Box<dyn PackageInterface>>,
- ) -> anyhow::Result<Vec<(Box<dyn PackageInterface>, Option<String>)>> {
+ packages: Vec<PackageInterfaceHandle>,
+ ) -> anyhow::Result<Vec<(PackageInterfaceHandle, Option<String>)>> {
// build package => install path map
- let mut package_map: Vec<(Box<dyn PackageInterface>, Option<String>)> = vec![(
- root_package.clone_as_package_interface(),
- Some(String::new()),
- )];
+ // TODO(phase-c): the root package needs to be available here as a shared handle;
+ // a borrowed &dyn RootPackageInterface cannot be lifted into a PackageInterfaceHandle.
+ let _ = root_package;
+ let root_package_handle: PackageInterfaceHandle =
+ todo!("root package handle for build_package_map");
+ let mut package_map: Vec<(PackageInterfaceHandle, Option<String>)> =
+ vec![(root_package_handle, Some(String::new()))];
for package in packages {
- if package.as_alias_package().is_some() {
+ if package.as_alias().is_some() {
continue;
}
- self.validate_package(&*package)?;
- let install_path = installation_manager.get_install_path(&*package);
+ self.validate_package(package.as_rc().borrow().as_package_interface())?;
+ let install_path = installation_manager
+ .get_install_path(package.as_rc().borrow().as_package_interface());
package_map.push((package, install_path));
}
@@ -795,7 +799,7 @@ impl AutoloadGenerator {
/// Compiles an ordered list of namespace => path mappings
pub fn parse_autoloads(
&self,
- package_map: Vec<(Box<dyn PackageInterface>, Option<String>)>,
+ package_map: Vec<(PackageInterfaceHandle, Option<String>)>,
root_package: &dyn RootPackageInterface,
filtered_dev_packages: PhpMixed,
) -> IndexMap<String, PhpMixed> {
@@ -812,7 +816,7 @@ impl AutoloadGenerator {
.unwrap_or_default();
package_map
.into_iter()
- .filter(|item| !dev_list.contains(&item.0.get_name().to_string()))
+ .filter(|item| !dev_list.contains(&item.0.get_name()))
.collect()
} else if filtered_dev_packages.as_bool() == Some(true) {
self.filter_package_map(package_map, root_package)
@@ -932,7 +936,7 @@ impl AutoloadGenerator {
pub(crate) fn get_include_paths_file(
&self,
- package_map: &Vec<(Box<dyn PackageInterface>, Option<String>)>,
+ package_map: &Vec<(PackageInterfaceHandle, Option<String>)>,
filesystem: &Filesystem,
base_path: &str,
vendor_path: &str,
@@ -1083,7 +1087,7 @@ impl AutoloadGenerator {
pub(crate) fn get_platform_check(
&self,
- package_map: &Vec<(Box<dyn PackageInterface>, Option<String>)>,
+ package_map: &Vec<(PackageInterfaceHandle, Option<String>)>,
check_platform: PhpMixed,
dev_package_names: &Vec<String>,
) -> Option<String> {
@@ -1625,7 +1629,7 @@ impl AutoloadGenerator {
pub(crate) fn parse_autoloads_type(
&self,
- package_map: &Vec<(Box<dyn PackageInterface>, Option<String>)>,
+ package_map: &Vec<(PackageInterfaceHandle, Option<String>)>,
r#type: &str,
root_package: &dyn RootPackageInterface,
) -> IndexMap<String, Box<PhpMixed>> {
@@ -1794,7 +1798,10 @@ impl AutoloadGenerator {
if r#type == "files" {
autoloads.insert(
- self.get_file_identifier(&**package, &path_str),
+ self.get_file_identifier(
+ package.as_rc().borrow().as_package_interface(),
+ &path_str,
+ ),
Box::new(PhpMixed::String(relative_path)),
);
continue;
@@ -1830,17 +1837,17 @@ impl AutoloadGenerator {
/// Filters out dev-dependencies
pub(crate) fn filter_package_map(
&self,
- package_map: Vec<(Box<dyn PackageInterface>, Option<String>)>,
+ package_map: Vec<(PackageInterfaceHandle, Option<String>)>,
root_package: &dyn RootPackageInterface,
- ) -> Vec<(Box<dyn PackageInterface>, Option<String>)> {
- let mut packages: IndexMap<String, Box<dyn PackageInterface>> = IndexMap::new();
+ ) -> Vec<(PackageInterfaceHandle, Option<String>)> {
+ let mut packages: IndexMap<String, PackageInterfaceHandle> = IndexMap::new();
let mut include: IndexMap<String, bool> = IndexMap::new();
let mut replaced_by: IndexMap<String, String> = IndexMap::new();
for item in &package_map {
let package = &item.0;
- let name = package.get_name().to_string();
- packages.insert(name.clone(), package.clone_package_box());
+ let name = package.get_name();
+ packages.insert(name.clone(), package.clone());
for (_k, replace) in &package.get_replaces() {
replaced_by.insert(replace.get_target().to_string(), name.clone());
}
@@ -1849,7 +1856,7 @@ impl AutoloadGenerator {
// Recursive walk emulating PHP's by-reference closure capture.
fn add(
package: &dyn PackageInterface,
- packages: &IndexMap<String, Box<dyn PackageInterface>>,
+ packages: &IndexMap<String, PackageInterfaceHandle>,
include: &mut IndexMap<String, bool>,
replaced_by: &IndexMap<String, String>,
) {
@@ -1861,7 +1868,12 @@ impl AutoloadGenerator {
if !include.contains_key(&target) {
include.insert(target.clone(), true);
if let Some(p) = packages.get(&target) {
- add(&**p, packages, include, replaced_by);
+ add(
+ p.as_rc().borrow().as_package_interface(),
+ packages,
+ include,
+ replaced_by,
+ );
}
}
}
@@ -1892,29 +1904,29 @@ impl AutoloadGenerator {
/// Packages of equal weight are sorted alphabetically
pub(crate) fn sort_package_map(
&self,
- package_map: Vec<(Box<dyn PackageInterface>, Option<String>)>,
- ) -> Vec<(Box<dyn PackageInterface>, Option<String>)> {
- let mut packages: IndexMap<String, Box<dyn PackageInterface>> = IndexMap::new();
+ package_map: Vec<(PackageInterfaceHandle, Option<String>)>,
+ ) -> Vec<(PackageInterfaceHandle, Option<String>)> {
+ let mut packages: IndexMap<String, PackageInterfaceHandle> = IndexMap::new();
let mut paths: IndexMap<String, Option<String>> = IndexMap::new();
for item in &package_map {
let (package, path) = item;
- let name = package.get_name().to_string();
- packages.insert(name.clone(), package.clone_package_box());
+ let name = package.get_name();
+ packages.insert(name.clone(), package.clone());
paths.insert(name, path.clone());
}
let sorted_packages = PackageSorter::sort_packages(
- packages.values().map(|p| p.clone_package_box()).collect(),
+ packages.values().map(|p| p.clone()).collect(),
IndexMap::new(),
);
- let mut sorted_package_map: Vec<(Box<dyn PackageInterface>, Option<String>)> = vec![];
+ let mut sorted_package_map: Vec<(PackageInterfaceHandle, Option<String>)> = vec![];
for package in sorted_packages {
- let name = package.get_name().to_string();
+ let name = package.get_name();
sorted_package_map.push((
- packages.get(&name).unwrap().clone_package_box(),
+ packages.get(&name).unwrap().clone(),
paths.get(&name).cloned().flatten(),
));
}