-
Notifications
You must be signed in to change notification settings - Fork 525
Fix incorrect type inference for @phpstan-assert-if-true on $this with union types #4246
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: 2.1.x
Are you sure you want to change the base?
Fix incorrect type inference for @phpstan-assert-if-true on $this with union types #4246
Conversation
please have a look at the issue-bot github action job summary. it seems this PR also affects other issues. please add regression tests for those which are getting fixed |
Thanks, @staabm. I’ll review the issue-bot GitHub Action job summary and add regression tests for the additionally affected issues. This is my first time contributing to open source (and my first PR to PHPStan), so I’ll update this PR in small batches as I add tests. If you prefer a specific location or pattern for these tests, please let me know. |
Welcome 🤗 Type related tests go usually into the https://github.com/phpstan/phpstan-src/tree/2.1.x/tests/PHPStan/Analyser/nsrt/ directory. Files located in this directory will automatically checked against using assertType(). |
Regression tests are typically added to existing test classes for rules that reported the (disappeared) errors. Alternatively covering some bugs with simple type inference tests (in |
@@ -0,0 +1,40 @@ | |||
<?php declare(strict_types=1); | |||
|
|||
namespace Bug13358; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You can move this also into nsrt/ folder
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
31b55ac
|
||
use PHPStan\Testing\TypeInferenceTestCase; | ||
|
||
class AssertIfTrueOnThisTest extends TypeInferenceTestCase |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This file can be dropped when everything else moved into nsrt/
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
31b55ac
@staabm The reason I want to run it individually is because I’d like to debug a specific function and check only the information related to this test case, without running everything else. Could you tell me how to do that? Thanks! |
This pull request has been marked as ready for review. |
Added regression test for #11441 (bug-11441.php) and updated the description accordingly. |
closes phpstan/phpstan#13358
closes phpstan/phpstan#11441
Summary
@phpstan-assert-if-true
on$this
with union types produced incorrect type inference.Repro
See added test:
tests/PHPStan/Rules/Methods/AssertIfTrueOnThisTest.php
.Cause
Union handling for
$this
assertions wasn’t propagated intoTypeSpecifier
(assert-based refinement path).Fix
Normalize/refine
$this
union members before producingSpecifiedTypes
from assert info.Tests
AssertIfTrueOnThisTest.php
.Also fixes #11441
tests/PHPStan/Analyser/nsrt/bug-11441.php
.@phpstan-assert !null $this->getParam()
works correctly when called on union types (Foo|Bar
), where each class defines its own method.null
type was not removed in such cases. After the fix,int|string
is correctly inferred.