Comments (5)
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.
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.
Opened phpstan/phpstan#10762 for some insight
from phpstan-drupal.
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.
from phpstan-drupal.
@Kingdutch check out #737, about 1/2 way there
from phpstan-drupal.
Related Issues (20)
- ModuleHandler->loadInclude() call is not being processed HOT 2
- Update `bleedingEdge.neon` to include new rules
- Support turning off @internal check HOT 2
- New accessibility requirement requires title attributes for most form elements.
- Validate FormBuilderInterface::getForm() arguments by inspecting form class HOT 1
- New rule for checking "static create()" method in controller
- Register dynamic services from DrupalKernel::attachSynthetic
- Determine return value from `\Drupal\Core\Config\Config::get` HOT 3
- Warn about max-age less then 10
- Fatal error: Uncaught TypeError: is_link(): Argument #1 ($filename) must be of type string, Drush\Config\Environment given in /tmp/site/vendor/webflo/drupal-finder/src/DrupalFinder.php:153 HOT 22
- Stop testing PHP 7.4, 8.0 and Drupal 9 HOT 4
- Method XY has parameter $yz with generic interface Drupal\Core\Field\FieldItemListInterface but does not specify its types: T
- Detect contructor change for ConfigFormBase HOT 2
- Make opting into loading API files more granular to support finding deprecated hooks from Drupal core more easily HOT 4
- Drupal multisite compatibility. HOT 1
- Add error identifiers to phpstan-drupal rules.
- $defaultTheme being set via a Trait is not discovered.
- Support for deprecated preprocess variables HOT 1
- InstallerExistingConfigTestBase is going to be deprecated HOT 4
- Add @mixin to FieldItemListInterface to explain that properties of its first item are being forwarded HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from phpstan-drupal.