You are here

public function ClassFileNameSniff::process in Coder 8.3.x

Same name and namespace in other branches
  1. 8.3 coder_sniffer/Drupal/Sniffs/Classes/ClassFileNameSniff.php \Drupal\Sniffs\Classes\ClassFileNameSniff::process()

Processes this test, when one of its tokens is encountered.

Parameters

\PHP_CodeSniffer\Files\File $phpcsFile The file being scanned.:

int $stackPtr The position of the current token in: the stack passed in $tokens.

Return value

int

File

coder_sniffer/Drupal/Sniffs/Classes/ClassFileNameSniff.php, line 45

Class

ClassFileNameSniff

Namespace

Drupal\Sniffs\Classes

Code

public function process(File $phpcsFile, $stackPtr) {

  // This check only applies to Drupal 8+, in Drupal 7 we can have classes
  // in all kinds of files.
  if (Project::getCoreVersion($phpcsFile) < 8) {
    return $phpcsFile->numTokens + 1;
  }
  $fullPath = basename($phpcsFile
    ->getFilename());
  $fileName = substr($fullPath, 0, strrpos($fullPath, '.'));
  if ($fileName === '') {

    // No filename probably means STDIN, so we can't do this check.
    return $phpcsFile->numTokens + 1;
  }

  // If the file is not a php file, we do not care about how it looks,
  // since we care about psr-4.
  $extension = pathinfo($fullPath, PATHINFO_EXTENSION);
  if ($extension !== 'php') {
    return $phpcsFile->numTokens + 1;
  }
  $tokens = $phpcsFile
    ->getTokens();
  $decName = $phpcsFile
    ->findNext(Tokens::$emptyTokens, $stackPtr + 1, null, true);
  if ($tokens[$decName]['code'] === T_STRING && $tokens[$decName]['content'] !== $fileName) {
    $error = '%s name doesn\'t match filename; expected "%s %s"';
    $data = [
      ucfirst($tokens[$stackPtr]['content']),
      $tokens[$stackPtr]['content'],
      $fileName,
    ];
    $phpcsFile
      ->addError($error, $stackPtr, 'NoMatch', $data);
  }

  // Only check the first class in a file, we don't care about helper
  // classes in tests for example.
  return $phpcsFile->numTokens + 1;
}