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

PHP 8.0: add support for attributes #357

Merged
merged 5 commits into from
Oct 15, 2022

Conversation

jrfnl
Copy link
Member

@jrfnl jrfnl commented Oct 15, 2022

PHP 8.0 | BCFile/FunctionDeclarations::get[Method]Parameters(): sync with upstream / bug fix for attributes leaking into type hint

This commit adds handling of parameter attributes to the File::getMethodParameters() method as per option [2] discussed in issue squizlabs/PHP_CodeSniffer#3298.

In practice this means that:

  • [New] A new has_attributes index is introduced into the returned array which will hold a boolean value indicating whether attributes are attached to the parameter.
  • [Unchanged] The content index in the returned array includes the textual representation of any attributes attached to a parameter.
  • [Fixed] The type_hint and type_hint_token indexes will no longer be polluted (set incorrectly) with information belonging to the attribute(s) instead of to the type declaration.

Includes minor efficiency fix for handling of parenthesis and brackets in default values.

Includes dedicated unit test.

Refs:

PHP 8.0 | Arrays::getDoubleArrowPtr(): handle attributes

As of PHP 8.0, attributes can be attached to functions, closures, arrow functions, classes, interfaces, traits, class constants, properties, methods and method parameters.

Attributes effectively instantiate a new instance of the class being referenced and can pass arguments to the constructor of that class.

As, while uncommon, closures or arrow functions could be used in an array key, there could be an attribute attached to these.

This adjusts the method to skip over attributes to prevent them confusing the double arrow pointer determination.

Includes tests.

Refs:

PHP 8.0 | Namespaces::determineNamespace(): skip over attributes

Efficiency tweak: skip over potentially large attribute declarations when walking up to find a namespace declaration.

Includes test.

Refs:

PHP 8.0 | PassedParameters::getParameters(): handle attributes

As of PHP 8.0, attributes can be attached to functions, closures, arrow functions, classes, interfaces, traits, class constants, properties, methods and method parameters.

Attributes effectively instantiate a new instance of the class being referenced and can pass arguments to the constructor of that class.

This has two implications for the PassedParameters::getParameters() method:

  1. The class instantiation function call within an attribute should be handled by the method same as other class instantiation calls.
  2. Attributes may, in select circumstances, be encountered within "parameters" and for efficiency and to prevent incorrect parsing, we should skip over them.

This commit adds a test confirming that situation [1] is already handled correctly.

Additionally, this commit adds the code to skip over attributes within parameters and adds a test covering that as well.

Refs:

PHP 8.0 | Variables::getMemberProperties(): correctly handle attributes

Sync with upstream PR squizlabs/PHP_CodeSniffer#3203 which ensures that attributes for properties are correctly regarded as "stop points" for gathering property information.

Ref:

jrfnl added 2 commits October 15, 2022 06:06
…with upstream / bug fix for attributes leaking into type hint

> This commit adds handling of parameter attributes to the `File::getMethodParameters()` method as per option [2] discussed in issue squizlabs/PHP_CodeSniffer 3298.
>
> In practice this means that:
> * [New] A new `has_attributes` index is introduced into the returned array which will hold a boolean value indicating whether attributes are attached to the parameter.
> * [Unchanged] The `content` index in the returned array includes the textual representation of any attributes attached to a parameter.
> * [Fixed] The `type_hint` and `type_hint_token` indexes will no longer be polluted (set incorrectly) with information belonging to the attribute(s) instead of to the type declaration.
>
> Includes minor efficiency fix for handling of parenthesis and brackets in default values.
>
> Includes dedicated unit test.

Refs:
* squizlabs/PHP_CodeSniffer 3298
* squizlabs/PHP_CodeSniffer 3320
As of PHP 8.0, attributes can be attached to functions, closures, arrow functions, classes, interfaces, traits, class constants, properties, methods and method parameters.

Attributes effectively instantiate a new instance of the class being referenced and can pass arguments to the constructor of that class.

As, while uncommon, closures or arrow functions _could_ be used in an array key, there _could_ be an attribute attached to these.

This adjusts the method to skip over attributes to prevent them confusing the double arrow pointer determination.

Includes tests.

Refs:
* https://wiki.php.net/rfc/attributes_v2
jrfnl and others added 3 commits October 15, 2022 06:21
Efficiency tweak: skip over potentially large attribute declarations when walking up to find a namespace declaration.

Includes test.

Refs:
* https://wiki.php.net/rfc/attributes_v2
As of PHP 8.0, attributes can be attached to functions, closures, arrow functions, classes, interfaces, traits, class constants, properties, methods and method parameters.

Attributes effectively instantiate a new instance of the class being referenced and can pass arguments to the constructor of that class.

This has two implications for the `PassedParameters::getParameters()` method:
1. The class instantiation function call within an attribute should be handled by the method same as other class instantiation calls.
2. Attributes may, in select circumstances, be encountered _within_ "parameters" and for efficiency and to prevent incorrect parsing, we should skip over them.

This commit adds a test confirming that situation [1] is already handled correctly.

Additionally, this commit adds the code to skip over attributes _within_ parameters and adds a test covering that as well.

Refs:
* https://wiki.php.net/rfc/attributes_v2
Sync with upstream PR 3203 which ensures that attributes for properties are correctly regarded as "stop points" for gathering property information.

Ref:
* squizlabs/PHP_CodeSniffer 3203

Co-authored-by: Alessandro Chitolina <alekitto@gmail.com>
@jrfnl jrfnl force-pushed the php-8.0/add-support-for-attributes branch from 01cd5ae to 174ee37 Compare October 15, 2022 04:21
@jrfnl jrfnl merged commit 0b2f4e1 into develop Oct 15, 2022
@jrfnl jrfnl deleted the php-8.0/add-support-for-attributes branch October 15, 2022 04:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant