Giter Club home page Giter Club logo

Comments (5)

Kingdutch avatar Kingdutch commented on June 16, 2024 1

Documenting the conversation we had about this on Slack in case anyone comes across this and wants to pick this up :D

The easiest way I see to achieve this is to make sure PHPStan can apply the existing rules for if statements which tell you if something is always TRUE or FALSE. This is done by MatchExpressionRule which is applied to any MatchExpressionNode.

The way to get MatchExpressionRule to apply to our allowedIf/forbiddenIf function calls then is to make sure we tell PHPStan that the arguments to those functions are a MatchExpressionNode. This can be done by implementing a TypeNodeResolver which tells PHPStan this exact information. PHPStan documents how TypeNodeResolvers work.

There is a good example of a type node resolver in PHPUnit which has three different extensions such as AssertMethodTypeSpecifyingExtension which proxies to AssertTypeSpecifyingExtensionHelper that contains the actual logic of determining which node to return. The goal of that PHPUnit extension is to make calls to functions like assert behave like the underlying PHP built-in function or type which in turn lets PHPStan apply the relevant rules to the assert* methods as if they were native functions 🤩

For example assertIsArray proxies to is_array and assertIsNotArray does the same with a BooleanNot around the result of assertIsArray.

from phpstan-drupal.

mglaman avatar mglaman commented on June 16, 2024

Okay, I dug into this a bit and I'm not sure we can make it work exactly this way. \mglaman\PHPStanDrupal\Type\AccessResultConditionTypeSpecifyingExtension::specifyTypes requires an array of expressions. MatchExpressionNode is not an expression.

I opened a draft PR for now.

from phpstan-drupal.

mglaman avatar mglaman commented on June 16, 2024

Opened phpstan/phpstan#10762 for some insight

from phpstan-drupal.

mglaman avatar mglaman commented on June 16, 2024

I think the type specifying extension was the wrong route. We should check the static method call for AccessResult and allowedIf or forbiddenIf and then take the first argument and inspect. But I wonder if that's too late', and it''s no longer a binary operation because it's been converted to a boolean.

https://github.com/phpstan/phpstan-src/blob/f1cf3bb34d949f01266c9eb08097144b262f4e4a/src/Rules/Comparison/StrictComparisonOfDifferentTypesRule.php#L33

from phpstan-drupal.

mglaman avatar mglaman commented on June 16, 2024

@Kingdutch check out #737, about 1/2 way there

from phpstan-drupal.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.