Skip to content
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

#7387 Add asserting non-empty-string by strlen #8761

Merged
merged 3 commits into from Jan 30, 2023
Merged

Conversation

LeoVie
Copy link
Contributor

@LeoVie LeoVie commented Nov 25, 2022

This solves #7387.

I'm not quite sure, if I catched all cases... What do you think?

Copy link
Collaborator

@weirdan weirdan left a comment

Choose a reason for hiding this comment

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

All tests show strlen() call on the left-hand side of the expression; it would be great to have at least some of them checking the other direction, e.g. 0 < strlen($str).

Does it handle (or ignore) expressions as strlen() arguments? E.g. strlen("a" . $str . "b") > 2?

@LeoVie
Copy link
Contributor Author

LeoVie commented Nov 27, 2022

Indeed, having strlen on the right-hand side or calling strlen with a concatenated string like in your example does not work, yet. I will take a look at that. :)

@LeoVie
Copy link
Contributor Author

LeoVie commented Nov 27, 2022

I implemented both cases. There is some code redundancy between strlen and count assertions, now. That could be removed by extracting generic methods. But I am not sure, if this would lead to any benefit here, as the current implementation is very verbose and therefore quite easy to unterstand.

Comment on lines 476 to 482
'strlenOnRightHandSide' => [
'code' => '<?php
/** @return non-empty-string */
function nonEmptyString(string $str): string {
return 0 < strlen($str) ? $str : "string";
}'
],
Copy link
Collaborator

Choose a reason for hiding this comment

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

Isn't it identical to strlenRighthandWithGreaterZero?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

In fact, it is. I remove that case.

'code' => '<?php
/** @return non-empty-string */
function nonEmptyString(string $str): string {
return strlen("a" . $str . "b") >= 2 ? "foo" : "string";
Copy link
Collaborator

Choose a reason for hiding this comment

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

I think you can remove this case and keep preventStrlenWithConcatenatedString only.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Removed that case, too.

if ($strlen_equality_position === self::ASSIGNMENT_TO_RIGHT) {
$strlened_expr = $conditional->left;
} else {
throw new UnexpectedValueException('$count_equality_position value');
Copy link
Collaborator

Choose a reason for hiding this comment

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

Did you mean

Suggested change
throw new UnexpectedValueException('$count_equality_position value');
throw new UnexpectedValueException('$strlen_equality_position value');

?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yes, thank you. :)

@weirdan
Copy link
Collaborator

weirdan commented Nov 27, 2022

Also, can you check if Shepherd failures are actual code issues?

https://github.com/vimeo/psalm/actions/runs/3559331115/jobs/5980058302

@LeoVie
Copy link
Contributor Author

LeoVie commented Dec 13, 2022

Also, can you check if Shepherd failures are actual code issues?

https://github.com/vimeo/psalm/actions/runs/3559331115/jobs/5980058302

What's your suggestion on these issues?
They say, the call to getArgs and then accessing the first array item is not safe. That's right, in general. But here in this case, we know, that the expression is a strlen call, which always has exactly one argument.

/** @var PhpParser\Node\Expr\FuncCall $strlen_expr */
$var_name = ExpressionIdentifier::getExtendedVarId(
    $strlen_expr->getArgs()[0]->value,
    $this_class_name,
    $source
);

I've seen similar errors in psalm-baseline.xml. Should I just add the false-positives there?

@orklah
Copy link
Collaborator

orklah commented Dec 13, 2022

the expression is a strlen call, which always has exactly one argument

It will have exactly one parameter on valid code yes, but Psalm is used to detect invalid code :)

It's also used to analyse code being typed which may miss parts to be correct. Trying to access an undefined offset would be risky.

We should probably try to fix the ones in the baseline and avoid adding new ones :) Just check isset($strlen_expr->getArgs()[0]) and skip the assertion if it returns false

@LeoVie
Copy link
Contributor Author

LeoVie commented Dec 13, 2022

Ah, okay, I thought psalm (respectively php-parser) would assume the code to be syntactically correct. As that does not seem to be the case, I will add the checks you proposed. Thank you :)

@orklah
Copy link
Collaborator

orklah commented Dec 13, 2022

php-parser checks that the syntax is correct but having the correct number of argument is not a syntax issue. Psalm will check that the number of arguments is correct but it's its own thing that won't particularly block assertions to be processed anyway

@LeoVie
Copy link
Contributor Author

LeoVie commented Dec 16, 2022

I've added the proposed checks.

@LeoVie
Copy link
Contributor Author

LeoVie commented Dec 16, 2022

Ah, missed one check. Psalm now reports no PR related errors locally, anymore.
Please give the workflow another try.

@orklah
Copy link
Collaborator

orklah commented Dec 16, 2022

There you go :)

CI is failing, not because of your change directly, but because there is an assertion in a loop that messes with other condition in that same loop.

@muglug if you could enlighten us on what can be done to avoid this kind of error, it would be great. I had the same kind of errors when working on integer ranges and I never could fix them correctly

@LeoVie
Copy link
Contributor Author

LeoVie commented Jan 27, 2023

Hi, is there anything I can do to make this PR mergable? :)

@orklah
Copy link
Collaborator

orklah commented Jan 27, 2023

Yeah, put the error in the baseline, the behaviour is not related to this PR and is already broken anyway, it may be fixed later

@LeoVie
Copy link
Contributor Author

LeoVie commented Jan 30, 2023

Hi, @orklah, I've added the two errors to the baseline. CI hopefully gets green, now :)

@orklah orklah added the release:feature The PR will be included in 'Features' section of the release notes label Jan 30, 2023
@orklah orklah merged commit d7e9cbc into vimeo:master Jan 30, 2023
@orklah
Copy link
Collaborator

orklah commented Jan 30, 2023

Thanks!

@weirdan
Copy link
Collaborator

weirdan commented Feb 21, 2023

This is causing a lot of issues, so I'm going to revert it and reopen the original ticket.

tcarrio pushed a commit to open-feature/php-sdk that referenced this pull request Mar 11, 2023
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [vimeo/psalm](https://togithub.com/vimeo/psalm) | require-dev | minor
| `~5.4.0` -> `~5.8.0` |

---

### Release Notes

<details>
<summary>vimeo/psalm</summary>

### [`v5.8.0`](https://togithub.com/vimeo/psalm/releases/tag/5.8.0)

[Compare Source](https://togithub.com/vimeo/psalm/compare/5.7.7...5.8.0)

<!-- Release notes generated using configuration in .github/release.yml
at master -->

#### What's Changed

##### Features

- FFI stubs improvement by
[@&#8203;UlrichEckhardt](https://togithub.com/UlrichEckhardt) in
[vimeo/psalm#9368
- Support sizeof alias of count by
[@&#8203;jsanahuja](https://togithub.com/jsanahuja) in
[vimeo/psalm#9375
- Iterated array in `foreach` body is never empty by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9380
- Process `@psalm-api` tags on methods by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9383
- Enforce literal string length limit by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9381
- \[ibm_db2] Improve return type inference for `db2_autocommit()` by
[@&#8203;phansys](https://togithub.com/phansys) in
[vimeo/psalm#9310
- Only disable grpc extension if it is not properly configured by
[@&#8203;gndk](https://togithub.com/gndk) in
[vimeo/psalm#9398
- PHP 8.3 dictionary by [@&#8203;lptn](https://togithub.com/lptn) in
[vimeo/psalm#9366
- concat should never remove non empty non falsy from string
[#&#8203;9411](https://togithub.com/vimeo/psalm/issues/9411) by
[@&#8203;EgorBakulin](https://togithub.com/EgorBakulin) in
[vimeo/psalm#9422
- Forbid private final methods by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9442
- Support for `readonly` classes by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9444
- Consider new HTML entity en/decode function defaults since PHP 8.1 by
[@&#8203;pereorga](https://togithub.com/pereorga) in
[vimeo/psalm#9471

##### Fixes

- Instances of `object` returned by `db2_*()` functions are always
instances of `stdClass` by
[@&#8203;phansys](https://togithub.com/phansys) in
[vimeo/psalm#9369
- Simplify and fix Shepherd to support custom endpoints for reporting by
[@&#8203;lptn](https://togithub.com/lptn) in
[vimeo/psalm#9296
- Fixes [#&#8203;9384](https://togithub.com/vimeo/psalm/issues/9384)
(Wrong type for variable checked with is_long) by
[@&#8203;ygottschalk](https://togithub.com/ygottschalk) in
[vimeo/psalm#9385
- Update Phar callmaps by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9389
- Correctly process use aliases in `@psalm-scope-this` by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9390
- Allow `array` as magic method name by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9391
- Consistently report docblock issues on all classlikes by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9392
- \[ibm_db2] Update some return types in callmaps by
[@&#8203;phansys](https://togithub.com/phansys) in
[vimeo/psalm#9387
- Preserve PossiblyUndefinedVariable when fixing UnusedVariable by
[@&#8203;edsrzf](https://togithub.com/edsrzf) in
[vimeo/psalm#9400
- \[ibm_db2] Update callmaps by
[@&#8203;phansys](https://togithub.com/phansys) in
[vimeo/psalm#9404
- Fix [#&#8203;9401](https://togithub.com/vimeo/psalm/issues/9401) by
[@&#8203;ptomulik](https://togithub.com/ptomulik) in
[vimeo/psalm#9418
- Fix remaining spl and iterator callmaps by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9420
- An attempt to fix
[#&#8203;4460](https://togithub.com/vimeo/psalm/issues/4460) by
[@&#8203;ptomulik](https://togithub.com/ptomulik) in
[vimeo/psalm#9415
- `array_pop` is impure by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9434
- Revert "`array_pop` is impure" by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9435
- Update pack() stub by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9438
- Merge param descriptions when adding or updating types by
[@&#8203;aboyton](https://togithub.com/aboyton) in
[vimeo/psalm#9441
- PHP 8.2 attributes moved to 8.2 stub by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9445
- Improce enum case reconciliation by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9457
- Do not strip the last `)` bracket when parsing phpdoc type aliases. by
[@&#8203;pvandommelen](https://togithub.com/pvandommelen) in
[vimeo/psalm#9458
- Replace package-versions with Composer 2 APIs by
[@&#8203;Jean85](https://togithub.com/Jean85) in
[vimeo/psalm#9459
- Fix DOM callmaps by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9460
- Don't crash on unary minus overflow by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9466
- Fix remaining intl callmaps by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9473

##### Internal changes

- Convert callmap associative-array types into proper array types by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9362
- Callmap is always non-empty by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9405
- Reorganize pushes to `psalm/phar` by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9399
- Do not display ext deprecation note when `disableExtensions` used by
[@&#8203;lptn](https://togithub.com/lptn) in
[vimeo/psalm#9291
- Require `<?php` tag in tests by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9443

#### New Contributors

- [@&#8203;UlrichEckhardt](https://togithub.com/UlrichEckhardt) made
their first contribution in
[vimeo/psalm#9368
- [@&#8203;jsanahuja](https://togithub.com/jsanahuja) made their first
contribution in
[vimeo/psalm#9375
- [@&#8203;EgorBakulin](https://togithub.com/EgorBakulin) made their
first contribution in
[vimeo/psalm#9422
- [@&#8203;pereorga](https://togithub.com/pereorga) made their first
contribution in
[vimeo/psalm#9471

**Full Changelog**: vimeo/psalm@5.7.7...5.8.0

### [`v5.7.7`](https://togithub.com/vimeo/psalm/releases/tag/5.7.7)

[Compare Source](https://togithub.com/vimeo/psalm/compare/5.7.6...5.7.7)

<!-- Release notes generated using configuration in .github/release.yml
at 5.7.x -->

#### What's Changed

##### Fixes

- Don't crash on empty `jit_buffer_size` by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9397

**Full Changelog**: vimeo/psalm@5.7.6...5.7.7

### [`v5.7.6`](https://togithub.com/vimeo/psalm/releases/tag/5.7.6)

[Compare Source](https://togithub.com/vimeo/psalm/compare/5.7.5...5.7.6)

<!-- Release notes generated using configuration in .github/release.yml
at 5.7.x -->

#### What's Changed

##### Fixes

- Disable `opcache.preload` if it's enabled by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9388

**Full Changelog**: vimeo/psalm@5.7.5...5.7.6

### [`v5.7.5`](https://togithub.com/vimeo/psalm/releases/tag/5.7.5)

[Compare Source](https://togithub.com/vimeo/psalm/compare/5.7.4...5.7.5)

<!-- Release notes generated using configuration in .github/release.yml
at master -->

#### What's Changed

##### Fixes

- Workaround opcache issue (fixes
[#&#8203;9363](https://togithub.com/vimeo/psalm/issues/9363)) by
[@&#8203;danog](https://togithub.com/danog) in
[vimeo/psalm#9364

**Full Changelog**: vimeo/psalm@5.7.4...5.7.5

### [`v5.7.4`](https://togithub.com/vimeo/psalm/releases/tag/5.7.4)

[Compare Source](https://togithub.com/vimeo/psalm/compare/5.7.3...5.7.4)

<!-- Release notes generated using configuration in .github/release.yml
at master -->

#### What's Changed

##### Fixes

- Include setrawcookie as an impure function by
[@&#8203;edsrzf](https://togithub.com/edsrzf) in
[vimeo/psalm#9356
- Fix several spl callmap methods by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9360
- Revert "[#&#8203;7387](https://togithub.com/vimeo/psalm/issues/7387)
Add asserting non-empty-string by strlen" by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9358

**Full Changelog**: vimeo/psalm@5.7.3...5.7.4

### [`v5.7.3`](https://togithub.com/vimeo/psalm/releases/tag/5.7.3)

[Compare Source](https://togithub.com/vimeo/psalm/compare/5.7.2...5.7.3)

<!-- Release notes generated using configuration in .github/release.yml
at master -->

#### What's Changed

##### Fixes

- Replace use of DOMParentNode::append() with appendChild() by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9354

**Full Changelog**: vimeo/psalm@5.7.2...5.7.3

### [`v5.7.2`](https://togithub.com/vimeo/psalm/releases/tag/5.7.2)

[Compare Source](https://togithub.com/vimeo/psalm/compare/5.7.1...5.7.2)

<!-- Release notes generated using configuration in .github/release.yml
at master -->

#### What's Changed

##### Fixes

- fix (DateTime|DateTimeImmutable)::modify() return types by
[@&#8203;DaDeather](https://togithub.com/DaDeather) in
[vimeo/psalm#9172
- Workaround arm64 opcache bug (fixes
[#&#8203;9350](https://togithub.com/vimeo/psalm/issues/9350)) by
[@&#8203;danog](https://togithub.com/danog) in
[vimeo/psalm#9351

#### New Contributors

- [@&#8203;DaDeather](https://togithub.com/DaDeather) made their first
contribution in
[vimeo/psalm#9172

**Full Changelog**: vimeo/psalm@5.7.1...5.7.2

### [`v5.7.1`](https://togithub.com/vimeo/psalm/releases/tag/5.7.1)

[Compare Source](https://togithub.com/vimeo/psalm/compare/5.7.0...5.7.1)

<!-- Release notes generated using configuration in .github/release.yml
at master -->

#### What's Changed

##### Fixes

- Always use 0x7FFEBFFF opcache optimization level (fixes
[#&#8203;9340](https://togithub.com/vimeo/psalm/issues/9340)) by
[@&#8203;danog](https://togithub.com/danog) in
[vimeo/psalm#9342
- Fix `PsalmRestarter::restart()` signature by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9347

**Full Changelog**: vimeo/psalm@5.7.0...5.7.1

### [`v5.7.0`](https://togithub.com/vimeo/psalm/releases/tag/5.7.0)

[Compare Source](https://togithub.com/vimeo/psalm/compare/5.6.0...5.7.0)

<!-- Release notes generated using configuration in .github/release.yml
at master -->

#### What's Changed

##### Deprecations

- Deprecate `FunctionLikeStorage::$unused_docblock_params` by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9312

##### Features

- [#&#8203;7387](https://togithub.com/vimeo/psalm/issues/7387) Add
asserting non-empty-string by strlen by
[@&#8203;LeoVie](https://togithub.com/LeoVie) in
[vimeo/psalm#8761
- Forbid implementing some interfaces by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9272
- Added issue type and psalm.dev link to Emacs report by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9299
- Allow `@var` annotations on global vars by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9301
- Allow suppressing `MissingThrowsDocblock` for individual exceptions by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9303
- Flag direct constructor calls by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9311
- Flag docblock parameters that have no counterparts in function
signature by [@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9314
- Forbid non-null defaults for callable parameters by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9316

##### Fixes

- cdata in baseline by
[@&#8203;jack-worman](https://togithub.com/jack-worman) in
[vimeo/psalm#9184
- Resolve class constants within PhpStorm metadata by
[@&#8203;shvlv](https://togithub.com/shvlv) in
[vimeo/psalm#9173
- Detect duplicate keys in array shapes by
[@&#8203;danog](https://togithub.com/danog) in
[vimeo/psalm#9177
- Fix xmlrpc callmap functions that were dropped in PHP 8.0 by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9212
- fix `didChange` event in LSP by
[@&#8203;ging-dev](https://togithub.com/ging-dev) in
[vimeo/psalm#9207
- Added [@&#8203;psalm-pure](https://togithub.com/psalm-pure) to
filter_var() by [@&#8203;mmcev106](https://togithub.com/mmcev106) in
[vimeo/psalm#9170
- Add DatePeriod::INCLUDE_END_DATE option by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9220
- Add more specific return for class-implements by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9228
- Convert callmaps resource types by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9227
- Use "numeric-string" type for some MySQLi properties by
[@&#8203;phansys](https://togithub.com/phansys) in
[vimeo/psalm#9226
- find_unused_code CLI arg should not be overwritten by config file by
[@&#8203;kkmuffme](https://togithub.com/kkmuffme) in
[vimeo/psalm#9235
- Fix divide by a floating point zero by
[@&#8203;aboyton](https://togithub.com/aboyton) in
[vimeo/psalm#9247
- Don't crash on unknown exceptions in `@throws` docblock by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9250
- Fix Spoofchecker callmaps by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9256
- Fix crashes with invalid `@psalm-check-type` syntax by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9257
- Fix crash when int range boundary is overflown by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9260
- Drop abandoned mcve m\_ functions by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9266
- Fix several callmap fuction signatures by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9264
- fix lstat bug cache directory race condition by
[@&#8203;kkmuffme](https://togithub.com/kkmuffme) in
[vimeo/psalm#9253
- Drop removed xsl callmap functions by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9269
- Drop abandoned maxdb callmap functions by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9270
- Drop abandoned newt callmap functions by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9271
- Update callmap types for php 8.2 by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9273
- Fix opcache being loaded twice by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9265
- Forbid overriding built-in enum methods by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9280
- Fix remaining callmap functions by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9278
- Add curl stubs to prevent crashes by
[@&#8203;kamil-tekiela](https://togithub.com/kamil-tekiela) in
[vimeo/psalm#9283
- Compare enum cases thoroughly by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9286
- Drop abandoned ncurses extension by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9293
- Drop abandoned cairo extension by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9292
- Emit issues for calls to `is_a(string, class-string, false)` by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9287
- Made `WeakReference` mutable by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9297
- Flag class constant references where LHS is ordinary string by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9302
- Fixed issue message for missing `@psalm-external-mutation-free` by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9304
- Fix memcached extension callmap by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9309
- Fix strpos stub return type by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9322
- Propagate phantom classes to closure context by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9329
- Fix language server first-class callable crashes by
[@&#8203;edsrzf](https://togithub.com/edsrzf) in
[vimeo/psalm#9336
- Forbid first-class callables in `new` by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9338
- Negated is_numeric narrows scalar type by
[@&#8203;edsrzf](https://togithub.com/edsrzf) in
[vimeo/psalm#9339

##### Docs

- Documentation: Add BackedEnum compatibility to value-of docs by
[@&#8203;bitwise-operators](https://togithub.com/bitwise-operators) in
[vimeo/psalm#9252
- Added note on properties used in constructor only by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9298
- Added a page explaining how to add a new issue type by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9315

##### Internal changes

- Unify warning messages for deprecated config variables by
[@&#8203;lptn](https://togithub.com/lptn) in
[vimeo/psalm#9135
- Fix newly discovered CS issues by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9210
- Fixed more CS issues by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9236
- Always enable JIT by [@&#8203;danog](https://togithub.com/danog) in
[vimeo/psalm#9237
- Allow fidry/cpu-core-counter:v0.5 by
[@&#8203;Slamdunk](https://togithub.com/Slamdunk) in
[vimeo/psalm#9234
- Update workflows to use non-deprecated method of setting step output
by [@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9251
- Emit warning if opcache cannot be enabled by
[@&#8203;danog](https://togithub.com/danog) in
[vimeo/psalm#9240
- Add option to skip callmap test by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9300
- Suggest Psalm to be installed in require-dev section by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9308
- Skip verifying callmaps based on name pattern by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9313
- Skip verifying memcache extension callmap by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9325
- Run assertions on CI by [@&#8203;lptn](https://togithub.com/lptn) in
[vimeo/psalm#9318
- Allow spatie/array-to-xml v3 by
[@&#8203;gharlan](https://togithub.com/gharlan) in
[vimeo/psalm#9331
- Disable JIT-incompatible extensions to prevent warnings by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9326
- Added the test to validate test environment itself by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9337

##### Other changes

- Remove some logic that didn't need to be there by
[@&#8203;muglug](https://togithub.com/muglug) in
[vimeo/psalm#9209

#### New Contributors

- [@&#8203;shvlv](https://togithub.com/shvlv) made their first
contribution in
[vimeo/psalm#9173
- [@&#8203;LeoVie](https://togithub.com/LeoVie) made their first
contribution in
[vimeo/psalm#8761
- [@&#8203;phansys](https://togithub.com/phansys) made their first
contribution in
[vimeo/psalm#9226
- [@&#8203;Slamdunk](https://togithub.com/Slamdunk) made their first
contribution in
[vimeo/psalm#9234
- [@&#8203;aboyton](https://togithub.com/aboyton) made their first
contribution in
[vimeo/psalm#9247
- [@&#8203;edsrzf](https://togithub.com/edsrzf) made their first
contribution in
[vimeo/psalm#9336

**Full Changelog**: vimeo/psalm@5.6.0...5.7.0

### [`v5.6.0`](https://togithub.com/vimeo/psalm/releases/tag/5.6.0)

[Compare Source](https://togithub.com/vimeo/psalm/compare/5.5.0...5.6.0)

<!-- Release notes generated using configuration in .github/release.yml
at master -->

#### What's Changed

##### Features

- Check `$this` in static closures by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9164

##### Fixes

- Use STDERR for Shepherd output by
[@&#8203;lptn](https://togithub.com/lptn) in
[vimeo/psalm#9169

##### Typos

- HEAD in all caps by
[@&#8203;buismaarten](https://togithub.com/buismaarten) in
[vimeo/psalm#9163

#### New Contributors

- [@&#8203;buismaarten](https://togithub.com/buismaarten) made their
first contribution in
[vimeo/psalm#9163

**Full Changelog**: vimeo/psalm@5.5.0...5.6.0

### [`v5.5.0`](https://togithub.com/vimeo/psalm/releases/tag/5.5.0)

[Compare Source](https://togithub.com/vimeo/psalm/compare/5.4.0...5.5.0)

<!-- Release notes generated using configuration in .github/release.yml
at master -->

#### What's Changed

##### Features

- Add Codebase to remaining events by
[@&#8203;jack-worman](https://togithub.com/jack-worman) in
[vimeo/psalm#8961
- Add [@&#8203;psalm-api](https://togithub.com/psalm-api) annotation by
[@&#8203;jack-worman](https://togithub.com/jack-worman) in
[vimeo/psalm#8987
- Refined `explode()` types by
[@&#8203;Ocramius](https://togithub.com/Ocramius) in
[vimeo/psalm#9016
- Support constants in traits by
[@&#8203;jack-worman](https://togithub.com/jack-worman) in
[vimeo/psalm#9126
- Report unused baseline entries by
[@&#8203;jack-worman](https://togithub.com/jack-worman) in
[vimeo/psalm#9130
- Allow to specify custom shepherd endpoint by
[@&#8203;lptn](https://togithub.com/lptn) in
[vimeo/psalm#9133
- Narrow ->value of enum case(s) to only the possible values by
[@&#8203;annervisser](https://togithub.com/annervisser) in
[vimeo/psalm#9157

##### Fixes

- Fix bug by [@&#8203;danog](https://togithub.com/danog) in
[vimeo/psalm#8955
- getopt() return type fix by
[@&#8203;jack-worman](https://togithub.com/jack-worman) in
[vimeo/psalm#8945
- Allow omitting argument offsets for map-type overrides in
phpstorm.meta by [@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#8781
- Extend XML enum of supported PHP ext by
[@&#8203;lptn](https://togithub.com/lptn) in
[vimeo/psalm#8971
- Revert [#&#8203;8955](https://togithub.com/vimeo/psalm/issues/8955) by
[@&#8203;danog](https://togithub.com/danog) in
[vimeo/psalm#8972
- (mb\_)chr returns a non-empty-string by
[@&#8203;fluffycondor](https://togithub.com/fluffycondor) in
[vimeo/psalm#8974
- Remove occurrences from error baseline by
[@&#8203;jack-worman](https://togithub.com/jack-worman) in
[vimeo/psalm#8967
- Add DateTimeInterface::\__serialize and \__unserialize by
[@&#8203;michnovka](https://togithub.com/michnovka) in
[vimeo/psalm#8976
- Fix get_object_vars on enums by
[@&#8203;jack-worman](https://togithub.com/jack-worman) in
[vimeo/psalm#8973
- Fixes [#&#8203;8112](https://togithub.com/vimeo/psalm/issues/8112) by
[@&#8203;emmanuelGuiton](https://togithub.com/emmanuelGuiton) in
[vimeo/psalm#8792
- Verify nullable callmap parameters by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#8990
- Improve `invalid references` message in `@psalm-type` by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#8996
- Fix missing version in PHARs build on GA by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#8997
- forbidden function bug and better get_defined_functions() signature by
[@&#8203;jack-worman](https://togithub.com/jack-worman) in
[vimeo/psalm#9002
- Add imap_is_open() to PHP 8.2 dictionary by
[@&#8203;lptn](https://togithub.com/lptn) in
[vimeo/psalm#9007
- Do not require return type on destructors in interfaces by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9009
- feat: add xdebug_info (fixes
[#&#8203;8977](https://togithub.com/vimeo/psalm/issues/8977)) by
[@&#8203;mathe42](https://togithub.com/mathe42) in
[vimeo/psalm#9011
- Make `$http_response_header` a non-empty-list by
[@&#8203;fluffycondor](https://togithub.com/fluffycondor) in
[vimeo/psalm#9001
- Preserve from_docblock in TypeCombiner by
[@&#8203;VincentLanglet](https://togithub.com/VincentLanglet) in
[vimeo/psalm#8999
- Add getAtomicType to IsNotAClass for proper negation Reconciliation by
[@&#8203;orklah](https://togithub.com/orklah) in
[vimeo/psalm#9017
- create proper TClosure instead of TNamedObject with a Closure value by
[@&#8203;orklah](https://togithub.com/orklah) in
[vimeo/psalm#9018
- Prevent DB escaping functions from affecting non-sql taints by
[@&#8203;mmcev106](https://togithub.com/mmcev106) in
[vimeo/psalm#9019
- Is containedbug by [@&#8203;orklah](https://togithub.com/orklah) in
[vimeo/psalm#9020
- Better type inference and type checking for large union types used in
array keys/values by [@&#8203;Ocramius](https://togithub.com/Ocramius)
in
[vimeo/psalm#9022
- fix never return for MethodCalls by
[@&#8203;kkmuffme](https://togithub.com/kkmuffme) in
[vimeo/psalm#9024
- Fix never return union type wrong condition by
[@&#8203;kkmuffme](https://togithub.com/kkmuffme) in
[vimeo/psalm#9023
- fixes return type issues of methods reported for the wrong file by
[@&#8203;kkmuffme](https://togithub.com/kkmuffme) in
[vimeo/psalm#9025
- Non empty reconciliation by
[@&#8203;orklah](https://togithub.com/orklah) in
[vimeo/psalm#9021
- fix [@&#8203;psalm-scope-this](https://togithub.com/psalm-scope-this)
not working with FQCN with leading backslash by
[@&#8203;kkmuffme](https://togithub.com/kkmuffme) in
[vimeo/psalm#9030
- Fix iterator and exception callmaps by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9035
- fix DateTime::modify() and DateTimeImmutable::modify() return types by
[@&#8203;pilif](https://togithub.com/pilif) in
[vimeo/psalm#9043
- Fix `ReflectionClass::getModifiers()` stub by
[@&#8203;kukulich](https://togithub.com/kukulich) in
[vimeo/psalm#9047
- Fix `ReflectionClass::getReflectionConstants()` stub by
[@&#8203;kukulich](https://togithub.com/kukulich) in
[vimeo/psalm#9048
- Fix `ReflectionClass::getTraitAliases()` stub by
[@&#8203;kukulich](https://togithub.com/kukulich) in
[vimeo/psalm#9046
- Fix `ReflectionFunctionAbstract::getExtensionName()` stub by
[@&#8203;kukulich](https://togithub.com/kukulich) in
[vimeo/psalm#9053
- Fix `ReflectionMethod::getModifiers()` stub by
[@&#8203;kukulich](https://togithub.com/kukulich) in
[vimeo/psalm#9052
- Fix `ReflectionClass::getTraitNames()` stub by
[@&#8203;kukulich](https://togithub.com/kukulich) in
[vimeo/psalm#9051
- Fix `ReflectionClass` stub by
[@&#8203;kukulich](https://togithub.com/kukulich) in
[vimeo/psalm#9055
- fix autoloader not working with absolute path by
[@&#8203;kkmuffme](https://togithub.com/kkmuffme) in
[vimeo/psalm#9044
- Narrow down the return type of DOMXPath::query() by
[@&#8203;MidnightDesign](https://togithub.com/MidnightDesign) in
[vimeo/psalm#9072
- fix `I::cases()` where `interface I extends BackedEnum` by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9067
- fix implicit return type by
[@&#8203;kkmuffme](https://togithub.com/kkmuffme) in
[vimeo/psalm#9026
- Update Call Maps and Signature for get_headers by
[@&#8203;therealryanbonham](https://togithub.com/therealryanbonham) in
[vimeo/psalm#9073
- dont report MissingFile error when file_exists is validated beforehand
by [@&#8203;kkmuffme](https://togithub.com/kkmuffme) in
[vimeo/psalm#9012
- Handle template type on promoted property by
[@&#8203;vincent4vx](https://togithub.com/vincent4vx) in
[vimeo/psalm#9092
- Additional test and fix when comparing nested templates by
[@&#8203;emmanuelGuiton](https://togithub.com/emmanuelGuiton) in
[vimeo/psalm#9095
- Automatically load stubs for random ext on PHP 8.2 by
[@&#8203;lptn](https://togithub.com/lptn) in
[vimeo/psalm#9099
- Add missing `int-range` aliases into the list of psalm reserved words
by [@&#8203;eopnetto](https://togithub.com/eopnetto) in
[vimeo/psalm#9107
- Clean up more callmap return types by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9113
- Infer getDefaultValueConstantName() type when isDefaultValueConstant()
is true by [@&#8203;BenMorel](https://togithub.com/BenMorel) in
[vimeo/psalm#9115
- Fix libxml_get_errors() return type by
[@&#8203;jack-worman](https://togithub.com/jack-worman) in
[vimeo/psalm#9118
- Fix remaining ignored CallMap return types that can be updated by
[@&#8203;othercorey](https://togithub.com/othercorey) in
[vimeo/psalm#9122
- Fix dom_import_simplexml() by
[@&#8203;jack-worman](https://togithub.com/jack-worman) in
[vimeo/psalm#9139
- Fix ReflectionClass::newInstanceArgs() with named parameters by
[@&#8203;BenMorel](https://togithub.com/BenMorel) in
[vimeo/psalm#9085
- Fix shepherd for default domain by
[@&#8203;lptn](https://togithub.com/lptn) in
[vimeo/psalm#9136
- Suppress warnings when `--no-output` is specified by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9162

##### Docs

- restrictReturnTypes configuration documentation by
[@&#8203;jack-worman](https://togithub.com/jack-worman) in
[vimeo/psalm#9000
- Update ForbiddenCode.md by
[@&#8203;maniaba](https://togithub.com/maniaba) in
[vimeo/psalm#9105
- Add information on pure-callables to documentation by
[@&#8203;bitwise-operators](https://togithub.com/bitwise-operators) in
[vimeo/psalm#9141

##### Internal changes

- Update BCC by [@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#8966
- Drop symfony/polyfill-php80 dependency by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#8988
- Fix PHPCS trailing comma by
[@&#8203;theodorejb](https://togithub.com/theodorejb) in
[vimeo/psalm#9014
- Misc fixes by [@&#8203;danog](https://togithub.com/danog) in
[vimeo/psalm#9031
- Fix remaining markdown issues by
[@&#8203;danog](https://togithub.com/danog) in
[vimeo/psalm#9033
- Bump mheap/github-action-required-labels from 2 to 3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[vimeo/psalm#9039
- Internal: use more specific types by
[@&#8203;lptn](https://togithub.com/lptn) in
[vimeo/psalm#9063
- Make it more clear what do we test from Psalm output by
[@&#8203;lptn](https://togithub.com/lptn) in
[vimeo/psalm#9061
- Internal cleanup: Unify syntax for redis.phpstub by
[@&#8203;lptn](https://togithub.com/lptn) in
[vimeo/psalm#9088
- Cleanup unsupported extensions message by
[@&#8203;lptn](https://togithub.com/lptn) in
[vimeo/psalm#9089
- Allow sebastian/diff 5 by
[@&#8203;Jean85](https://togithub.com/Jean85) in
[vimeo/psalm#9117
- Enhance error output for shepherd by
[@&#8203;lptn](https://togithub.com/lptn) in
[vimeo/psalm#9134
- Indent docblocks in DocComment test by
[@&#8203;weirdan](https://togithub.com/weirdan) in
[vimeo/psalm#9156

#### New Contributors

- [@&#8203;michnovka](https://togithub.com/michnovka) made their first
contribution in
[vimeo/psalm#8976
- [@&#8203;emmanuelGuiton](https://togithub.com/emmanuelGuiton) made
their first contribution in
[vimeo/psalm#8792
- [@&#8203;mathe42](https://togithub.com/mathe42) made their first
contribution in
[vimeo/psalm#9011
- [@&#8203;kukulich](https://togithub.com/kukulich) made their first
contribution in
[vimeo/psalm#9047
- [@&#8203;therealryanbonham](https://togithub.com/therealryanbonham)
made their first contribution in
[vimeo/psalm#9073
- [@&#8203;maniaba](https://togithub.com/maniaba) made their first
contribution in
[vimeo/psalm#9105
- [@&#8203;eopnetto](https://togithub.com/eopnetto) made their first
contribution in
[vimeo/psalm#9107

**Full Changelog**: vimeo/psalm@5.4.0...5.5.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://app.renovatebot.com/dashboard#github/open-feature/php-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNC4xMDguNCIsInVwZGF0ZWRJblZlciI6IjM0LjE1OS4yIn0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
release:feature The PR will be included in 'Features' section of the release notes
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants