From 1921f173ea219cb4b25847294d2d3fa465550fbb Mon Sep 17 00:00:00 2001 From: nsfisis Date: Mon, 25 May 2026 00:58:20 +0900 Subject: refactor(package): introduce Rc> handles for packages PHP packages have reference semantics, so introduce shared-ownership handles over an AnyPackage enum (PackageInterfaceHandle and friends) and replace Box throughout. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../shirabe/src/command/package_discovery_trait.rs | 26 ++++++++++++++-------- 1 file changed, 17 insertions(+), 9 deletions(-) (limited to 'crates/shirabe/src/command/package_discovery_trait.rs') diff --git a/crates/shirabe/src/command/package_discovery_trait.rs b/crates/shirabe/src/command/package_discovery_trait.rs index fa25fa3..a268469 100644 --- a/crates/shirabe/src/command/package_discovery_trait.rs +++ b/crates/shirabe/src/command/package_discovery_trait.rs @@ -574,7 +574,10 @@ pub trait PackageDiscoveryTrait { message: sprintf( &format!( "Package %s has requirements incompatible with your PHP version, PHP extensions and Composer version{}", - self.get_platform_exception_details(&*candidate, platform_repo), + self.get_platform_exception_details( + candidate.as_rc().borrow().as_package_interface(), + platform_repo, + ), ), &[PhpMixed::String(name.to_string())], ), @@ -610,8 +613,10 @@ pub trait PackageDiscoveryTrait { message: format!( "Package {} exists in {} and {} which has a higher repository priority. The packages from the higher priority repository do not match your minimum-stability and are therefore not installable. That repository is canonical so the lower priority repo's packages are not installable. See https://getcomposer.org/repoprio for details and assistance.", name, - all_repos_package.get_repository().unwrap().get_repo_name(), - package.get_repository().unwrap().get_repo_name(), + // TODO(phase-c): the originating repository names need the handle's + // repository back-reference (phase-c handoff item #1). + "a higher priority repository", + "a lower priority repository", ), code: 0, } @@ -666,7 +671,10 @@ pub trait PackageDiscoveryTrait { message: sprintf( &format!( "Could not find package %s in any version matching your PHP version, PHP extensions and Composer version{}%s", - self.get_platform_exception_details(&*candidate, platform_repo), + self.get_platform_exception_details( + candidate.as_rc().borrow().as_package_interface(), + platform_repo, + ), ), &[ PhpMixed::String(name.to_string()), @@ -772,7 +780,9 @@ pub trait PackageDiscoveryTrait { if fixed { package.get_pretty_version().to_string() } else { - version_selector.find_recommended_require_version(&*package)? + version_selector.find_recommended_require_version( + package.as_rc().borrow().as_package_interface(), + )? }, )) } @@ -798,9 +808,7 @@ pub trait PackageDiscoveryTrait { Ok(r) => r, Err(e) => { // PHP: if ($e instanceof \LogicException) throw $e; - // TODO(phase-b): downcast to LogicException - let is_logic: bool = todo!("e instanceof LogicException"); - if is_logic { + if e.downcast_ref::().is_some() { return Err(e); } @@ -891,7 +899,7 @@ pub trait PackageDiscoveryTrait { let mut platform_pkg_version = platform_pkg.get_pretty_version().to_string(); let platform_extra = platform_pkg.get_extra(); let has_config_platform = platform_extra.contains_key("config.platform"); - let is_complete = platform_pkg.as_complete_package_interface().is_some(); + let is_complete = platform_pkg.as_complete().is_some(); if has_config_platform && is_complete { // TODO(phase-b): platform_pkg.get_description() via CompletePackageInterface platform_pkg_version = format!( -- cgit v1.3.1