From 07c1ef1aea3a0c60484fdada89de7c5a3b7cf7c6 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sun, 17 May 2026 20:36:04 +0900 Subject: fix(compile): make Rule trait dyn-compatible by extracting RuleBase Removed the static fn new() from the Rule trait (which prevented dyn compatibility) and moved it into a new RuleBase struct. --- .../src/dependency_resolver/generic_rule.rs | 5 ++-- .../src/dependency_resolver/multi_conflict_rule.rs | 5 ++-- crates/shirabe/src/dependency_resolver/rule.rs | 34 ++++++++++++---------- .../src/dependency_resolver/rule2_literals.rs | 5 ++-- 4 files changed, 28 insertions(+), 21 deletions(-) (limited to 'crates/shirabe/src/dependency_resolver') diff --git a/crates/shirabe/src/dependency_resolver/generic_rule.rs b/crates/shirabe/src/dependency_resolver/generic_rule.rs index 1e14020..19974b6 100644 --- a/crates/shirabe/src/dependency_resolver/generic_rule.rs +++ b/crates/shirabe/src/dependency_resolver/generic_rule.rs @@ -1,18 +1,19 @@ //! ref: composer/src/Composer/DependencyResolver/GenericRule.php -use crate::dependency_resolver::rule::Rule; +use crate::dependency_resolver::rule::{Rule, RuleBase}; use anyhow::Result; use shirabe_php_shim::{PHP_VERSION_ID, PhpMixed, RuntimeException, hash_raw, implode, unpack}; use super::{request::Request, rule::ReasonData}; pub struct GenericRule { + inner: RuleBase, pub(crate) literals: Vec, } impl GenericRule { pub fn new(mut literals: Vec, reason: PhpMixed, reason_data: PhpMixed) -> Self { - let inner = Rule::new(reason, reason_data); + let inner = RuleBase::new(reason, reason_data); literals.sort(); Self { inner, literals } } diff --git a/crates/shirabe/src/dependency_resolver/multi_conflict_rule.rs b/crates/shirabe/src/dependency_resolver/multi_conflict_rule.rs index 33ba3ca..d198a27 100644 --- a/crates/shirabe/src/dependency_resolver/multi_conflict_rule.rs +++ b/crates/shirabe/src/dependency_resolver/multi_conflict_rule.rs @@ -4,12 +4,13 @@ use shirabe_php_shim::PhpMixed; use crate::dependency_resolver::generic_rule::RuleLiterals; use crate::dependency_resolver::request::Request; -use crate::dependency_resolver::rule::{ReasonData, Rule}; +use crate::dependency_resolver::rule::{ReasonData, Rule, RuleBase}; use anyhow::Result; use shirabe_php_shim::{PHP_VERSION_ID, RuntimeException, hash_raw}; #[derive(Debug)] pub struct MultiConflictRule { + inner: RuleBase, pub(crate) literals: Vec, } @@ -31,7 +32,7 @@ impl MultiConflictRule { literals.sort(); Ok(Self { - inner: Rule::new(reason, reason_data), + inner: RuleBase::new(reason, reason_data), literals, }) } diff --git a/crates/shirabe/src/dependency_resolver/rule.rs b/crates/shirabe/src/dependency_resolver/rule.rs index d1ec5c9..23a5981 100644 --- a/crates/shirabe/src/dependency_resolver/rule.rs +++ b/crates/shirabe/src/dependency_resolver/rule.rs @@ -67,21 +67,6 @@ pub trait Rule: std::fmt::Display { fn equals(&self, rule: &dyn Rule) -> bool; fn is_assertion(&self) -> bool; - /// @param self::RULE_* $reason A RULE_* constant describing the reason for generating this rule - /// @param mixed $reasonData - /// - /// @phpstan-param ReasonData $reasonData - fn new(reason: i64, reason_data: ReasonData) -> Self { - let bitfield = (0i64 << Self::BITFIELD_DISABLED) - | (reason << Self::BITFIELD_REASON) - | (255i64 << Self::BITFIELD_TYPE); - Self { - bitfield, - request: None, - reason_data, - } - } - /// @return self::RULE_* fn get_reason(&self) -> i64 { (self.bitfield & (255 << Self::BITFIELD_REASON)) >> Self::BITFIELD_REASON @@ -680,3 +665,22 @@ pub trait Rule: std::fmt::Display { package } } + +pub struct RuleBase { + bitfield: i64, + request: Option, + reason_data: Option, +} + +impl RuleBase { + fn new(reason: i64, reason_data: ReasonData) -> Self { + let bitfield = (0i64 << Self::BITFIELD_DISABLED) + | (reason << Self::BITFIELD_REASON) + | (255i64 << Self::BITFIELD_TYPE); + Self { + bitfield, + request: None, + reason_data: Some(reason_data), + } + } +} diff --git a/crates/shirabe/src/dependency_resolver/rule2_literals.rs b/crates/shirabe/src/dependency_resolver/rule2_literals.rs index 183e9a8..cdd1a9c 100644 --- a/crates/shirabe/src/dependency_resolver/rule2_literals.rs +++ b/crates/shirabe/src/dependency_resolver/rule2_literals.rs @@ -4,10 +4,11 @@ use shirabe_php_shim::PhpMixed; use crate::dependency_resolver::generic_rule::RuleLiterals; use crate::dependency_resolver::request::Request; -use crate::dependency_resolver::rule::{ReasonData, Rule}; +use crate::dependency_resolver::rule::{ReasonData, Rule, RuleBase}; #[derive(Debug)] pub struct Rule2Literals { + inner: RuleBase, pub(crate) literal1: i64, pub(crate) literal2: i64, literals: Vec, @@ -27,7 +28,7 @@ impl Rule2Literals { }; Self { - inner: Rule::new(reason, reason_data), + inner: RuleBase::new(reason, reason_data), literal1, literal2, literals: vec![literal1, literal2], -- cgit v1.3.1