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

Add @psalm-api annotation #8987

Merged

Conversation

jack-worman
Copy link
Contributor

@jack-worman jack-worman commented Dec 22, 2022

  • Added new @psalm-api
    • Added documentation
  • Method param usages are checked regardless of if the class or method has references

@jack-worman jack-worman force-pushed the Always_check_unused_methods_and_properties branch from db1167f to cf09ed1 Compare December 22, 2022 14:52
@danog
Copy link
Collaborator

danog commented Dec 22, 2022

I think a better way to implement this is by adding a @psalm-public-api annotation that can be used on classes and methods to signal that they're part of a public API (possibly in isClassReferenced), and thus cannot be marked as unused even if no references can be found within the current codebase.

@jack-worman
Copy link
Contributor Author

jack-worman commented Dec 22, 2022

I think a better way to implement this is by adding a @psalm-public-api annotation

I don't think this PR and a @psalm-public-api annotation are mutually exclusive.
This PR still has value because Psalm is making an unsafe assumption that just because it can't find usages of a class it is not worthy of further analysis.

This also has the advantage of being more consistent. For examples, I have an UnusedClass but a bunch of UnusedMethod and UnusedProperty issues are being masked. For some reason, the class gets a reference (maybe a test was added to it). Those masked issues now start to trigger. This is annoying and unintuitive.

Wouldn't @psalm-public-api just be equal to @psalm-suppress UnusedClass?

@jack-worman jack-worman force-pushed the Always_check_unused_methods_and_properties branch from cf09ed1 to 9add80a Compare December 22, 2022 17:03
@orklah
Copy link
Collaborator

orklah commented Dec 22, 2022

A test would be welcome here, I was quite confused at first.

So if I get it, tomorrow, an unused class with 50 methods will emit 51 errors because the class and each methods are unused?

I get the point for properties (that can be used inside methods that are seen as unused) but for methods, I'm not sure, seems like unnecessary noise

@jack-worman
Copy link
Contributor Author

jack-worman commented Dec 22, 2022

but for methods, I'm not sure

In my code base, I found unused method arguments being masked because because the class was unused.

seems like unnecessary noise

So, you would be in favor of adding a new option/config? This will allow end users to opt-in. Perhaps, default it to on in Psalm 6.

@jack-worman jack-worman force-pushed the Always_check_unused_methods_and_properties branch from 9add80a to 8f29edf Compare December 22, 2022 17:44
@danog
Copy link
Collaborator

danog commented Dec 22, 2022

I don't think adding a new config is a good idea, because it's the wrong way of solving the problem.

The problem is that code that will get used by users of a public API is incorrectly marked as unused.
To solve this issue, a new attribute signaling to Psalm that a class or method is public API should be created.

Wouldn't @psalm-public-api just be equal to @psalm-suppress UnusedClass?

This is not the same thing, because if for example the isClassReferenced is made to always return true if a @psalm-public-api annotation is present, checkPropertyReferences and checkMethodReferences will be invoked; @psalm-suppress UnusedClass does not have the same effect.

@jack-worman
Copy link
Contributor Author

jack-worman commented Dec 22, 2022

I don't think adding a new config is a good idea, because it's the wrong way of solving the problem.

I was suggesting the config as a BC layer. I would eventually want (in Psalm 6) to remove the config option and have it on all the time.

But anyways, I'll experiment with trying to implement your @psalm-public-api annotation.

@jack-worman jack-worman marked this pull request as draft December 22, 2022 19:26
@jack-worman jack-worman force-pushed the Always_check_unused_methods_and_properties branch from 8f29edf to 2906ed4 Compare December 22, 2022 19:36
@jack-worman jack-worman changed the title Always check unused methods and properties Add @psalm-public-api annotation Dec 22, 2022
@jack-worman jack-worman force-pushed the Always_check_unused_methods_and_properties branch 2 times, most recently from fa87483 to b6ec8fb Compare December 22, 2022 20:00
@danog
Copy link
Collaborator

danog commented Dec 22, 2022

Thanks!
Could you also add some docs? :)

@danog danog added the release:feature The PR will be included in 'Features' section of the release notes label Dec 22, 2022
@jack-worman jack-worman force-pushed the Always_check_unused_methods_and_properties branch from b6ec8fb to a0296ef Compare December 22, 2022 21:15
@jack-worman
Copy link
Contributor Author

jack-worman commented Dec 22, 2022

Could you also add some docs? :)

Done.

But, this solution still doesn't solve my original concern. UnusedParam issues in classes marked with @psalm-public-api are still suppressed.

I still want a way to say, I don't care if the class is not used, still check my properties, methods, and method args for usages.

@jack-worman jack-worman force-pushed the Always_check_unused_methods_and_properties branch 3 times, most recently from df08336 to 703723a Compare December 22, 2022 22:56
@weirdan
Copy link
Collaborator

weirdan commented Dec 23, 2022

Classes like Symfony controllers and event subscribers are not referenced directly in code and are still used

This sounds like the problem the corresponding plugin should be solving. It's not that hard either; it was one of the first things I did in the PHPUnit plugin.

@api tag would still be helpful for libraries, though.

UnusedParam issues in classes marked with @psalm-public-api are still suppressed.

Then it's something we need to improve.

@weirdan
Copy link
Collaborator

weirdan commented Dec 23, 2022

@danog
Copy link
Collaborator

danog commented Dec 23, 2022

++, and now that I think of it, it would be cool to change the default of findUnusedCode to true, now that we have this @api annotation that can be used to cleanup false positives (possibly mentioning the @api annotation in the docs for the unusedmethod/unusedclass issues).

@jack-worman jack-worman force-pushed the Always_check_unused_methods_and_properties branch from 703723a to a1db8da Compare December 23, 2022 15:47
@jack-worman jack-worman changed the title Add @psalm-public-api annotation Add @psalm-api annotation Dec 23, 2022
@jack-worman jack-worman force-pushed the Always_check_unused_methods_and_properties branch 4 times, most recently from d8387f6 to 5cf6949 Compare December 23, 2022 18:10
@jack-worman jack-worman force-pushed the Always_check_unused_methods_and_properties branch 3 times, most recently from 7240be3 to deaad89 Compare December 23, 2022 18:39
@jack-worman jack-worman marked this pull request as ready for review December 23, 2022 18:43
@danog
Copy link
Collaborator

danog commented Dec 23, 2022

LGTM!

@jack-worman jack-worman force-pushed the Always_check_unused_methods_and_properties branch from deaad89 to 6fc9e50 Compare December 23, 2022 20:11
composer.json Outdated Show resolved Hide resolved
@@ -48,4 +48,8 @@
<directory>tests</directory>
</testsuite>
</testsuites>

Copy link
Collaborator

Choose a reason for hiding this comment

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

I never used this config, does it makes sense to keep it?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

This config is used by default. It should be used if no other config file is given.

src/Psalm/Config.php Outdated Show resolved Hide resolved
@jack-worman jack-worman force-pushed the Always_check_unused_methods_and_properties branch from 6fc9e50 to cae973e Compare December 23, 2022 22:13
@jack-worman jack-worman force-pushed the Always_check_unused_methods_and_properties branch from cae973e to 703a1e1 Compare December 23, 2022 22:13
@orklah orklah merged commit dbcfe62 into vimeo:master Dec 28, 2022
@orklah
Copy link
Collaborator

orklah commented Dec 28, 2022

Thanks!

@jack-worman jack-worman deleted the Always_check_unused_methods_and_properties branch January 1, 2023 01:00
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

4 participants