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

Don't stop scan on invalid inline property annotation #3916

Conversation

jrfnl
Copy link
Contributor

@jrfnl jrfnl commented Oct 31, 2023

Description

Follow up on #3629, which was merged for PHPCS 3.8.0.

PR #3629 added logic to throw a "Ruleset invalid. Property "$propertyName" does not exist on sniff ..." error.

This error is intended for the command-line when reading the phpcs.xml.dist ruleset file.

However, this error could also be encountered if an inline // phpcs:set ... annotation would try to set a non-existent property.

While the use of // phpcs:set is typically reserved for sniff test case files, there is nothing stopping end-users from using the annotation.

The net-effect would be:

  • The Ruleset::setSniffProperty() throws a RuntimeException.
  • This exception is then passed to File::addMessage() where it is not thrown as the line on which the error is being thrown is an annotation line.
  • The scan of the file stops dead in its tracks as a RuntimeException was encountered.
  • The end-user doesn't know the file does not finish scanning as no Internal error is shown for the file.

To me, this is counter-intuitive and counter-productive as it may give people a false sense of security (CI is green, while in reality files are not being scanned).

To fix this, I propose the following:

  • Collect all // phpcs:set related inline annotations encountered while scanning.
  • Do not stop the file scan for these errors.
  • Add a warning with information about the incorrect annotations on line 1 once the file has finished scanning.

Includes a test via the Generic.PHP.BacktickOperator sniff.

Suggested changelog entry

I'd suggest updating the existing changelog entry for the change from PR #3629 and adding:

    -- Invalid sniff properties set for sniffs via inline annotations will result in an informative `Internal.PropertyDoesNotExist` errror on line, but will not halt the execution of PHPCS

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
    • This change is only breaking for integrators, not for external standards or end-users.
  • Documentation improvement

Follow up on 3629, which was merged for PHPCS 3.8.0.

PR 3629 added logic to throw a "Ruleset invalid. Property \"$propertyName\" does not exist on sniff ..." error.

This error is intended for the command-line when reading the `phpcs.xml.dist` ruleset file.

However, this error could _also_ be encountered if an inline `// phpcs:set ...` annotation would try to set a non-existent property.

While the use of `// phpcs:set` is typically reserved for sniff test case files, there is nothing stopping end-users from using the annotation.

The net-effect would be:
* The `Ruleset::setSniffProperty()` throws a `RuntimeException`.
* This exception is then passed to `File::addMessage()` where it is **not** thrown as the line on which the error is being thrown is an annotation line.
* The scan of the file stops dead in its tracks as a `RuntimeException` was encountered.
* The end-user doesn't know the file does not finish scanning as no `Internal` error is shown for the file.

To me, this is counter-intuitive and counter-productive as it may give people a false sense of security (CI is green, while in reality files are not being scanned).

To fix this, I propose the following:
* Collect all `// phpcs:set` related inline annotations encountered while scanning.
* Do **not** stop the file scan for these errors.
* Add a warning with information about the incorrect annotations on line 1 once the file has finished scanning.

Includes a test via the `Generic.PHP.BacktickOperator` sniff.
@jrfnl
Copy link
Contributor Author

jrfnl commented Dec 2, 2023

Closing as replaced by PHPCSStandards/PHP_CodeSniffer#99

@jrfnl jrfnl closed this Dec 2, 2023
@jrfnl jrfnl deleted the feature/3629-dont-stop-scan-on-invalid-property-set-annotation branch December 2, 2023 02:40
@jrfnl
Copy link
Contributor Author

jrfnl commented Dec 8, 2023

FYI: this fix is included in today's PHP_CodeSniffer 3.8.0 release.

As per #3932, development on PHP_CodeSniffer will continue in the PHPCSStandards/PHP_CodeSniffer repository. If you want to stay informed, you may want to start "watching" that repo (or watching releases from that repo).

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