Skip to content

Conversation

@calebdw
Copy link
Contributor

@calebdw calebdw commented Sep 5, 2025

Closes phpstan/phpstan#11707, closes phpstan/phpstan#12585

Supersedes #3828, supersedes #3131, supersedes #3823

Hello!

This adds generalized dynamic parameter type extensions and deprecates the parameter closure type extensions per phpstan/phpstan#11707 (comment).

This also fixes the return.type and the argument.type errors described in phpstan/phpstan#12585 when the parameter type is overridden via the extension.

Note

The original type from the closure type extensions was being passed around as $passedToType to the methods that needed it. However, I opted to rename this to overriddenType since I wasn't quite sure what $passedToType really meant. Let me know if there's something you'd rather do differently.

CC: @canvural, @Neol3108

Thanks!

@calebdw calebdw force-pushed the dynamic_parameter_extension branch 4 times, most recently from 49c7da8 to 58e51fb Compare September 5, 2025 14:15
@calebdw calebdw marked this pull request as draft September 5, 2025 16:35
@calebdw calebdw force-pushed the dynamic_parameter_extension branch from 58e51fb to 79de0a6 Compare September 5, 2025 17:05
@calebdw calebdw marked this pull request as ready for review September 5, 2025 17:36
@phpstan-bot
Copy link
Collaborator

This pull request has been marked as ready for review.

@canvural
Copy link
Contributor

canvural commented Sep 6, 2025

I tested it by porting my previous implementation for Larastan to this one, and looks like it works fine! Will try to implement more use cases and see if I can find any bugs. Also will try to test it on real projects.But so far so good. Thanks for this!

I'll also try to review this PR (though Ondrej would do a better job 😄 )

Copy link
Member

@ondrejmirtes ondrejmirtes left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks solid, just a few questions as a start, will do deep review later 👍

return new self($this->isDeep, $this->inAssignRightSideVariableName, $this->inAssignRightSideType, $this->inAssignRightSideNativeType, $type);
}

public function getOverriddenType(): ?Type
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why this does have to be here actually at all? Why hasn't been the passedToType parameter kept? Why is this named "overriden type"? What is it overriding?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've refactored this PR to simply pass the variable around through the methods instead of trying to use the ExpressionContext.

Why hasn't been the passedToType parameter kept? Why is this named "overriden type"?

It has been kept, I just renamed $passedToType to $overriddenType---"passed to type" didn't make any sense so I renamed it.

What is it overriding?

This is the overriding type coming from the dynamic parameter type extensions. The extensions are "overriding" the type that phpstan thinks they should be. If you have a better name in mind then I'm all ears.

@canvural
Copy link
Contributor

canvural commented Oct 2, 2025

@calebdw @ondrejmirtes Sorry to bother you, but I wanted to ask how we can move this forward? I'm really interested in this feature.

@calebdw
Copy link
Contributor Author

calebdw commented Oct 2, 2025

No worries, just been busy with personal life, I'll try to get to the comments soon

@calebdw calebdw force-pushed the dynamic_parameter_extension branch 2 times, most recently from b9ce6ac to b293d32 Compare November 10, 2025 15:46
@calebdw
Copy link
Contributor Author

calebdw commented Nov 10, 2025

@ondrejmirtes, @canvural, sorry it took so long to address these comments---just been busy with personal life but hoping to move this forward now 🙏

@calebdw calebdw force-pushed the dynamic_parameter_extension branch from b293d32 to 16430bf Compare November 26, 2025 14:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Invalid argument types when using MethodParameterClosureTypeExtension Allow specifying that parameters should be covariant

4 participants