Skip to content

Fatal error if you try to get the declaration name of an arrow function #3766

Description

@antonioeatgoat

Describe the bug
If you try to get the declaration name of an arrow function using the method File::getDeclarationName(), it will throws an exception.

It looks like it is legit to use the method for a closure, since there is this condition here, so probably the same condition should be added also for T_FN.

Custom code sniff sample

use PHP_CodeSniffer\Sniffs\Sniff;
use PHP_CodeSniffer\Files\File;

class MyCustomCodeSniff implements Sniff
{
    public function register()
    {
        return [T_FUNCTION, T_CLOSURE, T_FN];
    }

    public function process(File $file, $position)
    {
        /** @var array<int, array<string, mixed>> $tokens */
        $tokens = $file->getTokens();

        if (!in_array(($tokens[$position]['code'] ?? null), [T_FUNCTION, T_CLOSURE, T_FN], true)) {
            return;
        }

        $functionStart = (int)($tokens[$position]['scope_opener'] ?? 0);
        $functionEnd = (int)($tokens[$position]['scope_closer'] ?? 0);

        if (($functionStart < 0) || ($functionEnd <= 0)) {
            return;
        }

        $declarationName = $file->getDeclarationName($position);

        // ... do other thins here ...
    }
}

To reproduce
Steps to reproduce the behavior:

  1. Create a file called test.php which contain a simple fn() => 'x';
  2. Add the custom sniff rule
  3. Run phpcs test.php ...
  4. See error message displayed
An error occurred during processing; checking has been aborted. The error message was: Token type "T_FN" is not T_FUNCTION, T_CLASS, T_INTERFACE, T_TRAIT or T_ENUM (Internal.Exception)

Expected behavior
A condition for T_FN is added as explained above, so that the method File::getDeclarationName() can return null instead of throwing an exception, when used on an arrow function.

Versions (please complete the following information):

  • OS: MacOS 13.1
  • PHP: 7.4
  • PHPCS: 3.7.2
  • Standard:

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions