Skip to content

Conversation

VincentLanglet
Copy link
Contributor

@VincentLanglet VincentLanglet commented Jul 26, 2025

Extracted from #4012

It will be easier to review the CastArrayKeyRule after

@VincentLanglet VincentLanglet force-pushed the invalidKey branch 2 times, most recently from b32f7fe to 2caa239 Compare July 26, 2025 16:39
Copy link
Member

@ondrejmirtes ondrejmirtes left a comment

Choose a reason for hiding this comment

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

If you're doing something to respect levels better, you need to add some cases to LevelsIntegrationTest. You can just add the "topic" php file and run the test, it will generate JSONs with the current result.

It'd actually be great to see the current behaviour in the first commit and then see how things get corrected in the second commit with the code changes.

The expectations are:

  • level < 7 - report things that are always wrong
  • level 7 - report things that might be wrong, like int|string only where int is expected
  • level 8 - same but for int|null
  • level 9 - explicit mixed
  • level 10 - implicit (untyped) mixed

@ondrejmirtes
Copy link
Member

The best way to get LevelsIntegrationTest results fast is to comment out all the other "topics" when you're working on a single topic. Otherwise it takes a long time for the tests to run.

Also you could add some upload-artifact action call to tests-levels in tests.yml so that when PR run fails, we can download the updated JSON files and there's no need to run the test locally and slowly.

@VincentLanglet VincentLanglet force-pushed the invalidKey branch 7 times, most recently from 891baf8 to 38c316f Compare July 26, 2025 23:09
@VincentLanglet
Copy link
Contributor Author

Ok, so here you have

  • First commit introduce the integration test with the current behavior
    5e15e2e

  • Second commit is my fix of InvalidKeyInArrayDimFetchRule and the impact
    ae06b48

  • Funny things, the message is different between level 7 and 8, and I found the fix needed was in RuleLevelHelper:
    38c316f
    -> You should not remove null if it's an accepted type in the Union (because if you do so, you might transform a "maybe error" into a "100% sure error".

Then last commit was just to fix the lint 7.4.

$varType = $this->ruleLevelHelper->findTypeToCheck(
$scope,
$node->var,
'',
static fn (Type $varType): bool => $varType->isArray()->no() || AllowedArrayKeysTypes::getType()->isSuperTypeOf($dimensionType)->yes(),
static fn (Type $varType): bool => $varType->isArray()->no(),
Copy link
Member

Choose a reason for hiding this comment

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

I'm still wondering about what's the effect of the $varType going through RuleLevelHelper. Does something change if we get rid of it only continue if $scope->getType($node->var)->isArray()->yes()?

It's weird to me that this rule checks maybe-arrays. It's okay for array|null for example, but I'm not sure if it ever should report something on mixed.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I added more test case here with the commit 6f99f04

You can see that

  • array|foo is checked
  • explicit and implicit mixed are not checked (because transformed to ErrorType or to a StrictMixedType in which isArray() return no.

But it was right to report I need to check the result for maybe array.
The error message was Invalid array key type DateTimeImmutable., I think it should be Possibly invalid array key type DateTimeImmutable. then. And I fix that in the commit 7e0f73b

@VincentLanglet VincentLanglet marked this pull request as draft September 2, 2025 15:18
@VincentLanglet VincentLanglet force-pushed the invalidKey branch 4 times, most recently from 5264f3d to 0f29634 Compare September 2, 2025 15:34
@VincentLanglet VincentLanglet marked this pull request as ready for review September 2, 2025 16:05
@phpstan-bot
Copy link
Collaborator

This pull request has been marked as ready for review.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants