From 69c372ba0eca61b05260d6d208445d9e69d14e34 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 13 Jun 2026 11:38:20 +0900 Subject: fix(console): flatten Application inheritance to restore overrides Composer\Console\Application embedded Symfony's Application as an `inner` field and delegated to it, so polymorphic calls inside the Symfony base (e.g. doRun -> $this->getLongVersion()) resolved to Symfony's own methods and never reached Composer's overrides. As a result `--version` bypassed Composer's getLongVersion()/doRun() entirely. Flatten the PHP inheritance chain into the single shirabe Application struct: take in the Symfony base methods (parent-calling overrides kept under a `base_` prefix) and drop the `inner` delegation. Replace the Symfony Application struct in shirabe-external-packages with an `Application` trait that the merged struct implements, so commands and descriptors can reference it without a reverse crate dependency. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../src/symfony/console/descriptor/application_description.rs | 4 ++-- .../src/symfony/console/descriptor/descriptor.rs | 4 ++-- .../src/symfony/console/descriptor/json_descriptor.rs | 4 ++-- .../src/symfony/console/descriptor/markdown_descriptor.rs | 8 ++++---- .../src/symfony/console/descriptor/text_descriptor.rs | 4 ++-- .../src/symfony/console/descriptor/xml_descriptor.rs | 6 +++--- 6 files changed, 15 insertions(+), 15 deletions(-) (limited to 'crates/shirabe-external-packages/src/symfony/console/descriptor') diff --git a/crates/shirabe-external-packages/src/symfony/console/descriptor/application_description.rs b/crates/shirabe-external-packages/src/symfony/console/descriptor/application_description.rs index 3454b78..ff14c22 100644 --- a/crates/shirabe-external-packages/src/symfony/console/descriptor/application_description.rs +++ b/crates/shirabe-external-packages/src/symfony/console/descriptor/application_description.rs @@ -9,7 +9,7 @@ use std::rc::Rc; /// @internal #[derive(Debug)] pub struct ApplicationDescription { - application: Rc>, + application: Rc>, namespace: Option, show_hidden: bool, @@ -28,7 +28,7 @@ impl ApplicationDescription { pub const GLOBAL_NAMESPACE: &'static str = "_global"; pub fn new( - application: Rc>, + application: Rc>, namespace: Option, show_hidden: bool, ) -> Self { diff --git a/crates/shirabe-external-packages/src/symfony/console/descriptor/descriptor.rs b/crates/shirabe-external-packages/src/symfony/console/descriptor/descriptor.rs index d4aa575..d086b28 100644 --- a/crates/shirabe-external-packages/src/symfony/console/descriptor/descriptor.rs +++ b/crates/shirabe-external-packages/src/symfony/console/descriptor/descriptor.rs @@ -48,7 +48,7 @@ pub trait Descriptor: DescriptorInterface { } // case $object instanceof Application: _ if todo!("$object instanceof Application") => { - let application: std::rc::Rc> = + let application: std::rc::Rc> = todo!("downcast object to Application"); self.describe_application(application, options)?; } @@ -113,7 +113,7 @@ pub trait Descriptor: DescriptorInterface { /// Describes an Application instance. fn describe_application( &mut self, - application: std::rc::Rc>, + application: std::rc::Rc>, options: IndexMap, ) -> anyhow::Result<()>; } diff --git a/crates/shirabe-external-packages/src/symfony/console/descriptor/json_descriptor.rs b/crates/shirabe-external-packages/src/symfony/console/descriptor/json_descriptor.rs index b651618..a74fc4b 100644 --- a/crates/shirabe-external-packages/src/symfony/console/descriptor/json_descriptor.rs +++ b/crates/shirabe-external-packages/src/symfony/console/descriptor/json_descriptor.rs @@ -62,7 +62,7 @@ impl JsonDescriptor { fn describe_application( &mut self, - application: std::rc::Rc>, + application: std::rc::Rc>, options: IndexMap, ) -> anyhow::Result<()> { let described_namespace = match options.get("namespace") { @@ -418,7 +418,7 @@ impl Descriptor for JsonDescriptor { fn describe_application( &mut self, - application: std::rc::Rc>, + application: std::rc::Rc>, options: IndexMap, ) -> anyhow::Result<()> { JsonDescriptor::describe_application(self, application, options) diff --git a/crates/shirabe-external-packages/src/symfony/console/descriptor/markdown_descriptor.rs b/crates/shirabe-external-packages/src/symfony/console/descriptor/markdown_descriptor.rs index 1fec085..90cad25 100644 --- a/crates/shirabe-external-packages/src/symfony/console/descriptor/markdown_descriptor.rs +++ b/crates/shirabe-external-packages/src/symfony/console/descriptor/markdown_descriptor.rs @@ -214,7 +214,7 @@ impl MarkdownDescriptor { fn describe_application( &mut self, - application: std::rc::Rc>, + application: std::rc::Rc>, options: IndexMap, ) -> anyhow::Result<()> { let described_namespace = match options.get("namespace") { @@ -223,7 +223,7 @@ impl MarkdownDescriptor { }; let mut description = ApplicationDescription::new(application.clone(), described_namespace, false); - let title = self.get_application_title(&application.borrow()); + let title = self.get_application_title(&*application.borrow()); self.write( &format!( @@ -289,7 +289,7 @@ impl MarkdownDescriptor { Ok(()) } - fn get_application_title(&self, application: &Application) -> String { + fn get_application_title(&self, application: &dyn Application) -> String { if "UNKNOWN" != application.get_name() { if "UNKNOWN" != application.get_version() { return format!( @@ -376,7 +376,7 @@ impl Descriptor for MarkdownDescriptor { fn describe_application( &mut self, - application: std::rc::Rc>, + application: std::rc::Rc>, options: IndexMap, ) -> anyhow::Result<()> { MarkdownDescriptor::describe_application(self, application, options) diff --git a/crates/shirabe-external-packages/src/symfony/console/descriptor/text_descriptor.rs b/crates/shirabe-external-packages/src/symfony/console/descriptor/text_descriptor.rs index b5faaae..323b284 100644 --- a/crates/shirabe-external-packages/src/symfony/console/descriptor/text_descriptor.rs +++ b/crates/shirabe-external-packages/src/symfony/console/descriptor/text_descriptor.rs @@ -262,7 +262,7 @@ impl TextDescriptor { fn describe_application( &mut self, - application: std::rc::Rc>, + application: std::rc::Rc>, options: IndexMap, ) -> anyhow::Result<()> { let described_namespace = match options.get("namespace") { @@ -597,7 +597,7 @@ impl Descriptor for TextDescriptor { fn describe_application( &mut self, - application: std::rc::Rc>, + application: std::rc::Rc>, options: IndexMap, ) -> anyhow::Result<()> { TextDescriptor::describe_application(self, application, options) diff --git a/crates/shirabe-external-packages/src/symfony/console/descriptor/xml_descriptor.rs b/crates/shirabe-external-packages/src/symfony/console/descriptor/xml_descriptor.rs index 209964a..2ed8f17 100644 --- a/crates/shirabe-external-packages/src/symfony/console/descriptor/xml_descriptor.rs +++ b/crates/shirabe-external-packages/src/symfony/console/descriptor/xml_descriptor.rs @@ -106,7 +106,7 @@ impl XmlDescriptor { pub fn get_application_document( &self, - application: std::rc::Rc>, + application: std::rc::Rc>, namespace: Option, short: bool, ) -> DOMDocument { @@ -209,7 +209,7 @@ impl XmlDescriptor { fn describe_application( &mut self, - application: std::rc::Rc>, + application: std::rc::Rc>, options: IndexMap, ) -> anyhow::Result<()> { let namespace = match options.get("namespace") { @@ -420,7 +420,7 @@ impl Descriptor for XmlDescriptor { fn describe_application( &mut self, - application: std::rc::Rc>, + application: std::rc::Rc>, options: IndexMap, ) -> anyhow::Result<()> { XmlDescriptor::describe_application(self, application, options) -- cgit v1.3.1