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

Avoid false positive about array which are non-callable #10935

Merged
merged 4 commits into from
May 5, 2024

Conversation

VincentLanglet
Copy link
Contributor

@VincentLanglet VincentLanglet commented May 3, 2024

From discussion #10839 (comment)

This should be valid, cf https://3v4l.org/JZgNh

@VincentLanglet VincentLanglet changed the title Avoid false positive about non-callable Avoid false positive about array which are non-callable May 3, 2024
@kkmuffme
Copy link
Contributor

kkmuffme commented May 3, 2024

I get the point of this PR and it's good, the question is since the array{class-string, string} type generally indicates a callable.
Are we ok with it not catching obvious errors anymore in that case?
e.g. these wouldn't report an error anymore too, however practically these would be bugs.

foo([\DateTime::class, "formt"]);
foo([\DateTime::class, "doesntExist"]);

@VincentLanglet
Copy link
Contributor Author

I get the point of this PR and it's good, the question is since the array{class-string, string} type generally indicates a callable.

generally but not always. If someone wants to indicate a callable, he HAVE TO use the right type callable.

Are we ok with it not catching obvious errors anymore in that case?

The opposite question would be "Are we ok to return false positive for people using correctly the phpdoc in order to keep catching errors for people which used the wrong phpdoc". I would say NEVER.

And if we're doing nothing we'll end with a lot of issue like #10936 which makes psalm unusable with Symfony/Twig.

I agree catching a wrong method could be great, but first the false-positive need to be fixed.

@kkmuffme
Copy link
Contributor

kkmuffme commented May 3, 2024

Agree, 2 things that come to my mind at this point:

  • if we do that for arrays, this should also be changed for strings (e.g. callable|string) since it's the same issue (in the PR/same file just a bit further down in the elseif). Can you update this in the PR?
  • can you confirm that this will still report an error with this PR:
/**
 * @param int|callable $arg
 */
function foo($arg): void {}
foo([\DateTime::class, "errorHere"]);',

@VincentLanglet
Copy link
Contributor Author

Agree, 2 things that come to my mind at this point:

  • if we do that for arrays, this should also be changed for strings (e.g. callable|string) since it's the same issue (in the PR/same file just a bit further down in the elseif). Can you update this in the PR?
  • can you confirm that this will still report an error with this PR:
/**
 * @param int|callable $arg
 */
function foo($arg): void {}
foo([\DateTime::class, "errorHere"]);',

Both are added in the last commit.

@weirdan weirdan added the release:fix The PR will be included in 'Fixes' section of the release notes label May 5, 2024
@weirdan weirdan merged commit 08ea062 into vimeo:5.x May 5, 2024
50 of 51 checks passed
@weirdan
Copy link
Collaborator

weirdan commented May 5, 2024

Thanks!

@VincentLanglet
Copy link
Contributor Author

Would it be ok to make a new patch release @weirdan ? This PR fix a lot of false positive for symfony/twig users.

@VincentLanglet VincentLanglet deleted the fix-array-callable branch June 19, 2024 08:17
Gashmob referenced this pull request in Gashmob/project-templates Jun 20, 2024
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [vimeo/psalm](https://togithub.com/vimeo/psalm) | `5.24.0` -> `5.25.0`
|
[![age](https://developer.mend.io/api/mc/badges/age/packagist/vimeo%2fpsalm/5.25.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/packagist/vimeo%2fpsalm/5.25.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/packagist/vimeo%2fpsalm/5.24.0/5.25.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/packagist/vimeo%2fpsalm/5.24.0/5.25.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>vimeo/psalm (vimeo/psalm)</summary>

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

[Compare
Source](https://togithub.com/vimeo/psalm/compare/5.24.0...5.25.0)

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

#### What's Changed

##### Features

- Casting int-range should keep literals by
[@&#8203;kkmuffme](https://togithub.com/kkmuffme) in
[https://github.com/vimeo/psalm/pull/10941](https://togithub.com/vimeo/psalm/pull/10941)
- Update help panel by [@&#8203;llaville](https://togithub.com/llaville)
in
[https://github.com/vimeo/psalm/pull/11000](https://togithub.com/vimeo/psalm/pull/11000)
- Add support for phpstan-pure by
[@&#8203;VincentLanglet](https://togithub.com/VincentLanglet) in
[https://github.com/vimeo/psalm/pull/10975](https://togithub.com/vimeo/psalm/pull/10975)
- Precise preg_match_all return type by
[@&#8203;VincentLanglet](https://togithub.com/VincentLanglet) in
[https://github.com/vimeo/psalm/pull/10969](https://togithub.com/vimeo/psalm/pull/10969)

##### Fixes

-
Fix-[GH-10933](https://togithub.com/vimeo/psalm/issues/10933)-And-[GH-10951](https://togithub.com/vimeo/psalm/issues/10951)
by [@&#8203;jack-worman](https://togithub.com/jack-worman) in
[https://github.com/vimeo/psalm/pull/10953](https://togithub.com/vimeo/psalm/pull/10953)
- redis: add possible types for `Redis#auth` method by
[@&#8203;boesing](https://togithub.com/boesing) in
[https://github.com/vimeo/psalm/pull/10934](https://togithub.com/vimeo/psalm/pull/10934)
- Avoid false positive about array which are non-callable by
[@&#8203;VincentLanglet](https://togithub.com/VincentLanglet) in
[https://github.com/vimeo/psalm/pull/10935](https://togithub.com/vimeo/psalm/pull/10935)
- Fix literal-string|non-empty-literal-string by
[@&#8203;VincentLanglet](https://togithub.com/VincentLanglet) in
[https://github.com/vimeo/psalm/pull/10930](https://togithub.com/vimeo/psalm/pull/10930)
- Fix signature of Locale::canonicalize. by
[@&#8203;ADmad](https://togithub.com/ADmad) in
[https://github.com/vimeo/psalm/pull/11010](https://togithub.com/vimeo/psalm/pull/11010)

#### New Contributors

- [@&#8203;llaville](https://togithub.com/llaville) made their first
contribution in
[https://github.com/vimeo/psalm/pull/11000](https://togithub.com/vimeo/psalm/pull/11000)

**Full Changelog**:
vimeo/psalm@5.24.0...5.25.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://developer.mend.io/github/Gashmob/project-templates).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MTAuMSIsInVwZGF0ZWRJblZlciI6IjM3LjQxMC4xIiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==-->
@michnovka
Copy link
Contributor

michnovka commented Jun 21, 2024

This PR did not fix the issue with setting protected function as callable.

https://psalm.dev/r/3c405968f1

This code reports no error on psalm.dev, as it uses outdated version there. But with 5.24 and 5.25 it complains that

setCode expects a public callable, but a non-public callable provided (see https://psalm.dev/004)

However setting a protected function this way is totally fine. The issue would be setting a private function

Copy link

I found these snippets:

https://psalm.dev/r/3c405968f1
<?php

class Command{
    /**
     * @param callable $code
     */
	public function setCode(callable $code): static
    {
        return $this;
    }
}

class Code extends Command{
    public function __construct(){
        parent::setCode([$this, 'runCode']);
    }
    
    protected function runCode(): void
    {}
}
Psalm output (using commit 16b24bd):

No issues!

oguzhand95 referenced this pull request in cerbos/cerbos-sdk-php Jun 21, 2024
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [phpstan/phpstan](https://togithub.com/phpstan/phpstan) | `1.11.4` ->
`1.11.5` |
[![age](https://developer.mend.io/api/mc/badges/age/packagist/phpstan%2fphpstan/1.11.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/packagist/phpstan%2fphpstan/1.11.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/packagist/phpstan%2fphpstan/1.11.4/1.11.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/packagist/phpstan%2fphpstan/1.11.4/1.11.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [phpunit/phpunit](https://phpunit.de/)
([source](https://togithub.com/sebastianbergmann/phpunit)) | `10.5.20`
-> `10.5.24` |
[![age](https://developer.mend.io/api/mc/badges/age/packagist/phpunit%2fphpunit/10.5.24?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/packagist/phpunit%2fphpunit/10.5.24?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/packagist/phpunit%2fphpunit/10.5.20/10.5.24?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/packagist/phpunit%2fphpunit/10.5.20/10.5.24?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [vimeo/psalm](https://togithub.com/vimeo/psalm) | `5.24.0` -> `5.25.0`
|
[![age](https://developer.mend.io/api/mc/badges/age/packagist/vimeo%2fpsalm/5.25.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/packagist/vimeo%2fpsalm/5.25.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/packagist/vimeo%2fpsalm/5.24.0/5.25.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/packagist/vimeo%2fpsalm/5.24.0/5.25.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>phpstan/phpstan (phpstan/phpstan)</summary>

###
[`v1.11.5`](https://togithub.com/phpstan/phpstan/compare/1.11.4...1.11.5)

[Compare
Source](https://togithub.com/phpstan/phpstan/compare/1.11.4...1.11.5)

</details>

<details>
<summary>sebastianbergmann/phpunit (phpunit/phpunit)</summary>

###
[`v10.5.24`](https://togithub.com/sebastianbergmann/phpunit/releases/tag/10.5.24):
PHPUnit 10.5.24

[Compare
Source](https://togithub.com/sebastianbergmann/phpunit/compare/10.5.23...10.5.24)

##### Changed

-
[#&#8203;5877](https://togithub.com/sebastianbergmann/phpunit/pull/5877):
Use `array_pop()` instead of `array_shift()` for processing `Test`
objects in `TestSuite::run()` and optimize `TestSuite::isEmpty()`

***

[How to install or update
PHPUnit](https://docs.phpunit.de/en/10.5/installation.html)

###
[`v10.5.23`](https://togithub.com/sebastianbergmann/phpunit/releases/tag/10.5.23):
PHPUnit 10.5.23

[Compare
Source](https://togithub.com/sebastianbergmann/phpunit/compare/10.5.22...10.5.23)

##### Changed

-
[#&#8203;5875](https://togithub.com/sebastianbergmann/phpunit/pull/5875):
Also destruct `TestCase` objects early that use a data provider

***

[How to install or update
PHPUnit](https://docs.phpunit.de/en/10.5/installation.html)

###
[`v10.5.22`](https://togithub.com/sebastianbergmann/phpunit/releases/tag/10.5.22):
PHPUnit 10.5.22

[Compare
Source](https://togithub.com/sebastianbergmann/phpunit/compare/10.5.21...10.5.22)

##### Changed

-
[#&#8203;5871](https://togithub.com/sebastianbergmann/phpunit/pull/5871):
Do not collect unnecessary information using `debug_backtrace()`

***

[How to install or update
PHPUnit](https://docs.phpunit.de/en/10.5/installation.html)

###
[`v10.5.21`](https://togithub.com/sebastianbergmann/phpunit/releases/tag/10.5.21):
PHPUnit 10.5.21

[Compare
Source](https://togithub.com/sebastianbergmann/phpunit/compare/10.5.20...10.5.21)

##### Changed

-
[#&#8203;5861](https://togithub.com/sebastianbergmann/phpunit/pull/5861):
Destroy `TestCase` object after its test was run

***

[How to install or update
PHPUnit](https://docs.phpunit.de/en/10.5/installation.html)

</details>

<details>
<summary>vimeo/psalm (vimeo/psalm)</summary>

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

[Compare
Source](https://togithub.com/vimeo/psalm/compare/5.24.0...5.25.0)

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

#### What's Changed

##### Features

- Casting int-range should keep literals by
[@&#8203;kkmuffme](https://togithub.com/kkmuffme) in
[https://github.com/vimeo/psalm/pull/10941](https://togithub.com/vimeo/psalm/pull/10941)
- Update help panel by [@&#8203;llaville](https://togithub.com/llaville)
in
[https://github.com/vimeo/psalm/pull/11000](https://togithub.com/vimeo/psalm/pull/11000)
- Add support for phpstan-pure by
[@&#8203;VincentLanglet](https://togithub.com/VincentLanglet) in
[https://github.com/vimeo/psalm/pull/10975](https://togithub.com/vimeo/psalm/pull/10975)
- Precise preg_match_all return type by
[@&#8203;VincentLanglet](https://togithub.com/VincentLanglet) in
[https://github.com/vimeo/psalm/pull/10969](https://togithub.com/vimeo/psalm/pull/10969)

##### Fixes

-
Fix-[GH-10933](https://togithub.com/vimeo/psalm/issues/10933)-And-[GH-10951](https://togithub.com/vimeo/psalm/issues/10951)
by [@&#8203;jack-worman](https://togithub.com/jack-worman) in
[https://github.com/vimeo/psalm/pull/10953](https://togithub.com/vimeo/psalm/pull/10953)
- redis: add possible types for `Redis#auth` method by
[@&#8203;boesing](https://togithub.com/boesing) in
[https://github.com/vimeo/psalm/pull/10934](https://togithub.com/vimeo/psalm/pull/10934)
- Avoid false positive about array which are non-callable by
[@&#8203;VincentLanglet](https://togithub.com/VincentLanglet) in
[https://github.com/vimeo/psalm/pull/10935](https://togithub.com/vimeo/psalm/pull/10935)
- Fix literal-string|non-empty-literal-string by
[@&#8203;VincentLanglet](https://togithub.com/VincentLanglet) in
[https://github.com/vimeo/psalm/pull/10930](https://togithub.com/vimeo/psalm/pull/10930)
- Fix signature of Locale::canonicalize. by
[@&#8203;ADmad](https://togithub.com/ADmad) in
[https://github.com/vimeo/psalm/pull/11010](https://togithub.com/vimeo/psalm/pull/11010)

#### New Contributors

- [@&#8203;llaville](https://togithub.com/llaville) made their first
contribution in
[https://github.com/vimeo/psalm/pull/11000](https://togithub.com/vimeo/psalm/pull/11000)

**Full Changelog**:
vimeo/psalm@5.24.0...5.25.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC),
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.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config help](https://togithub.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- 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://developer.mend.io/github/cerbos/cerbos-sdk-php).

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

Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Signed-off-by: Oğuzhan Durgun <[email protected]>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
tcarrio referenced this pull request in open-feature/php-sdk Aug 5, 2024
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [vimeo/psalm](https://togithub.com/vimeo/psalm) | `~5.24.0` ->
`~5.25.0` |
[![age](https://developer.mend.io/api/mc/badges/age/packagist/vimeo%2fpsalm/5.25.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/packagist/vimeo%2fpsalm/5.25.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/packagist/vimeo%2fpsalm/5.24.0/5.25.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/packagist/vimeo%2fpsalm/5.24.0/5.25.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>vimeo/psalm (vimeo/psalm)</summary>

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

[Compare
Source](https://togithub.com/vimeo/psalm/compare/5.24.0...5.25.0)

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

#### What's Changed

##### Features

- Casting int-range should keep literals by
[@&#8203;kkmuffme](https://togithub.com/kkmuffme) in
[https://github.com/vimeo/psalm/pull/10941](https://togithub.com/vimeo/psalm/pull/10941)
- Update help panel by [@&#8203;llaville](https://togithub.com/llaville)
in
[https://github.com/vimeo/psalm/pull/11000](https://togithub.com/vimeo/psalm/pull/11000)
- Add support for phpstan-pure by
[@&#8203;VincentLanglet](https://togithub.com/VincentLanglet) in
[https://github.com/vimeo/psalm/pull/10975](https://togithub.com/vimeo/psalm/pull/10975)
- Precise preg_match_all return type by
[@&#8203;VincentLanglet](https://togithub.com/VincentLanglet) in
[https://github.com/vimeo/psalm/pull/10969](https://togithub.com/vimeo/psalm/pull/10969)

##### Fixes

-
Fix-[GH-10933](https://togithub.com/vimeo/psalm/issues/10933)-And-[GH-10951](https://togithub.com/vimeo/psalm/issues/10951)
by [@&#8203;jack-worman](https://togithub.com/jack-worman) in
[https://github.com/vimeo/psalm/pull/10953](https://togithub.com/vimeo/psalm/pull/10953)
- redis: add possible types for `Redis#auth` method by
[@&#8203;boesing](https://togithub.com/boesing) in
[https://github.com/vimeo/psalm/pull/10934](https://togithub.com/vimeo/psalm/pull/10934)
- Avoid false positive about array which are non-callable by
[@&#8203;VincentLanglet](https://togithub.com/VincentLanglet) in
[https://github.com/vimeo/psalm/pull/10935](https://togithub.com/vimeo/psalm/pull/10935)
- Fix literal-string|non-empty-literal-string by
[@&#8203;VincentLanglet](https://togithub.com/VincentLanglet) in
[https://github.com/vimeo/psalm/pull/10930](https://togithub.com/vimeo/psalm/pull/10930)
- Fix signature of Locale::canonicalize. by
[@&#8203;ADmad](https://togithub.com/ADmad) in
[https://github.com/vimeo/psalm/pull/11010](https://togithub.com/vimeo/psalm/pull/11010)

#### New Contributors

- [@&#8203;llaville](https://togithub.com/llaville) made their first
contribution in
[https://github.com/vimeo/psalm/pull/11000](https://togithub.com/vimeo/psalm/pull/11000)

**Full Changelog**:
vimeo/psalm@5.24.0...5.25.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 was generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View the
[repository job
log](https://developer.mend.io/github/open-feature/php-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MTAuMSIsInVwZGF0ZWRJblZlciI6IjM3LjQzOC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

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:fix The PR will be included in 'Fixes' section of the release notes
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants