PHP_CodeSniffer
[ class tree: PHP_CodeSniffer ] [ index: PHP_CodeSniffer ] [ all elements ]

Source for file ControlSignatureSniff.php

Documentation is available at ControlSignatureSniff.php

  1. <?php
  2. /**
  3.  * Verifies that control statements conform to their coding standards.
  4.  *
  5.  * @author    Greg Sherwood <gsherwood@squiz.net>
  6.  * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600)
  7.  * @license   https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
  8.  */
  9.  
  10. namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\ControlStructures;
  11.  
  12. use PHP_CodeSniffer\Sniffs\Sniff;
  13. use PHP_CodeSniffer\Files\File;
  14. use PHP_CodeSniffer\Util\Tokens;
  15.  
  16. class ControlSignatureSniff implements Sniff
  17. {
  18.  
  19.     /**
  20.      * A list of tokenizers this sniff supports.
  21.      *
  22.      * @var array 
  23.      */
  24.     public $supportedTokenizers = array(
  25.                                    'PHP',
  26.                                    'JS',
  27.                                   );
  28.  
  29.  
  30.     /**
  31.      * Returns an array of tokens this test wants to listen for.
  32.      *
  33.      * @return int[] 
  34.      */
  35.     public function register()
  36.     {
  37.         return array(
  38.                 T_TRY,
  39.                 T_CATCH,
  40.                 T_DO,
  41.                 T_WHILE,
  42.                 T_FOR,
  43.                 T_IF,
  44.                 T_FOREACH,
  45.                 T_ELSE,
  46.                 T_ELSEIF,
  47.                 T_SWITCH,
  48.                );
  49.  
  50.     }//end register()
  51.  
  52.  
  53.     /**
  54.      * Processes this test, when one of its tokens is encountered.
  55.      *
  56.      * @param PHP_CodeSniffer_File $phpcsFile The file being scanned.
  57.      * @param int                  $stackPtr  The position of the current token in the
  58.      *                                         stack passed in $tokens.
  59.      *
  60.      * @return void 
  61.      */
  62.     public function process(File $phpcsFile$stackPtr)
  63.     {
  64.         $tokens $phpcsFile->getTokens();
  65.  
  66.         if (isset($tokens[($stackPtr + 1)]=== false{
  67.             return;
  68.         }
  69.  
  70.         // Single space after the keyword.
  71.         $found = 1;
  72.         if ($tokens[($stackPtr + 1)]['code'!== T_WHITESPACE{
  73.             $found = 0;
  74.         else if ($tokens[($stackPtr + 1)]['content'!== ' '{
  75.             if (strpos($tokens[($stackPtr + 1)]['content']$phpcsFile->eolChar!== false{
  76.                 $found 'newline';
  77.             else {
  78.                 $found strlen($tokens[($stackPtr + 1)]['content']);
  79.             }
  80.         }
  81.  
  82.         if ($found !== 1{
  83.             $error 'Expected 1 space after %s keyword; %s found';
  84.             $data  = array(
  85.                       strtoupper($tokens[$stackPtr]['content']),
  86.                       $found,
  87.                      );
  88.  
  89.             $fix $phpcsFile->addFixableError($error$stackPtr'SpaceAfterKeyword'$data);
  90.             if ($fix === true{
  91.                 if ($found === 0{
  92.                     $phpcsFile->fixer->addContent($stackPtr' ');
  93.                 else {
  94.                     $phpcsFile->fixer->replaceToken(($stackPtr + 1)' ');
  95.                 }
  96.             }
  97.         }
  98.  
  99.         // Single space after closing parenthesis.
  100.         if (isset($tokens[$stackPtr]['parenthesis_closer']=== true
  101.             && isset($tokens[$stackPtr]['scope_opener']=== true
  102.         {
  103.             $closer  $tokens[$stackPtr]['parenthesis_closer'];
  104.             $opener  $tokens[$stackPtr]['scope_opener'];
  105.             $content $phpcsFile->getTokensAsString(($closer + 1)($opener $closer - 1));
  106.  
  107.             if ($content !== ' '{
  108.                 $error 'Expected 1 space after closing parenthesis; found %s';
  109.                 if (trim($content=== ''{
  110.                     $found strlen($content);
  111.                 else {
  112.                     $found '"'.str_replace($phpcsFile->eolChar'\n'$content).'"';
  113.                 }
  114.  
  115.                 $fix $phpcsFile->addFixableError($error$closer'SpaceAfterCloseParenthesis'array($found));
  116.                 if ($fix === true{
  117.                     if ($closer === ($opener - 1)) {
  118.                         $phpcsFile->fixer->addContent($closer' ');
  119.                     else {
  120.                         $phpcsFile->fixer->beginChangeset();
  121.                         $phpcsFile->fixer->addContent($closer' '.$tokens[$opener]['content']);
  122.                         $phpcsFile->fixer->replaceToken($opener'');
  123.  
  124.                         if ($tokens[$opener]['line'!== $tokens[$closer]['line']{
  125.                             $next $phpcsFile->findNext(T_WHITESPACE($opener + 1)nulltrue);
  126.                             if ($tokens[$next]['line'!== $tokens[$opener]['line']{
  127.                                 for ($i ($opener + 1)$i $next$i++{
  128.                                     $phpcsFile->fixer->replaceToken($i'');
  129.                                 }
  130.                             }
  131.                         }
  132.  
  133.                         $phpcsFile->fixer->endChangeset();
  134.                     }
  135.                 }
  136.             }//end if
  137.         }//end if
  138.  
  139.         // Single newline after opening brace.
  140.         if (isset($tokens[$stackPtr]['scope_opener']=== true{
  141.             $opener $tokens[$stackPtr]['scope_opener'];
  142.             for ($next ($opener + 1)$next $phpcsFile->numTokens; $next++{
  143.                 $code $tokens[$next]['code'];
  144.  
  145.                 if ($code === T_WHITESPACE
  146.                     || ($code === T_INLINE_HTML
  147.                     && trim($tokens[$next]['content']=== '')
  148.                 {
  149.                     continue;
  150.                 }
  151.  
  152.                 // Skip all empty tokens on the same line as the opener.
  153.                 if ($tokens[$next]['line'=== $tokens[$opener]['line']
  154.                     && (isset(Tokens::$emptyTokens[$code]=== true
  155.                     || $code === T_CLOSE_TAG)
  156.                 {
  157.                     continue;
  158.                 }
  159.  
  160.                 // We found the first bit of a code, or a comment on the
  161.                 // following line.
  162.                 break;
  163.             }//end for
  164.  
  165.             if ($tokens[$next]['line'=== $tokens[$opener]['line']{
  166.                 $error 'Newline required after opening brace';
  167.                 $fix   $phpcsFile->addFixableError($error$opener'NewlineAfterOpenBrace');
  168.                 if ($fix === true{
  169.                     $phpcsFile->fixer->beginChangeset();
  170.                     for ($i ($opener + 1)$i $next$i++{
  171.                         if (trim($tokens[$i]['content']!== ''{
  172.                             break;
  173.                         }
  174.  
  175.                         // Remove whitespace.
  176.                         $phpcsFile->fixer->replaceToken($i'');
  177.                     }
  178.  
  179.                     $phpcsFile->fixer->addContent($opener$phpcsFile->eolChar);
  180.                     $phpcsFile->fixer->endChangeset();
  181.                 }
  182.             }//end if
  183.         else if ($tokens[$stackPtr]['code'=== T_WHILE{
  184.             // Zero spaces after parenthesis closer.
  185.             $closer $tokens[$stackPtr]['parenthesis_closer'];
  186.             $found  = 0;
  187.             if ($tokens[($closer + 1)]['code'=== T_WHITESPACE{
  188.                 if (strpos($tokens[($closer + 1)]['content']$phpcsFile->eolChar!== false{
  189.                     $found 'newline';
  190.                 else {
  191.                     $found strlen($tokens[($closer + 1)]['content']);
  192.                 }
  193.             }
  194.  
  195.             if ($found !== 0{
  196.                 $error 'Expected 0 spaces before semicolon; %s found';
  197.                 $data  = array($found);
  198.                 $fix   $phpcsFile->addFixableError($error$closer'SpaceBeforeSemicolon'$data);
  199.                 if ($fix === true{
  200.                     $phpcsFile->fixer->replaceToken(($closer + 1)'');
  201.                 }
  202.             }
  203.         }//end if
  204.  
  205.         // Only want to check multi-keyword structures from here on.
  206.         if ($tokens[$stackPtr]['code'=== T_DO{
  207.             if (isset($tokens[$stackPtr]['scope_closer']=== false{
  208.                 return;
  209.             }
  210.  
  211.             $closer $tokens[$stackPtr]['scope_closer'];
  212.         else if ($tokens[$stackPtr]['code'=== T_ELSE
  213.             || $tokens[$stackPtr]['code'=== T_ELSEIF
  214.             || $tokens[$stackPtr]['code'=== T_CATCH
  215.         {
  216.             $closer $phpcsFile->findPrevious(Tokens::$emptyTokens($stackPtr - 1)nulltrue);
  217.             if ($closer === false || $tokens[$closer]['code'!== T_CLOSE_CURLY_BRACKET{
  218.                 return;
  219.             }
  220.         else {
  221.             return;
  222.         }
  223.  
  224.         // Single space after closing brace.
  225.         $found = 1;
  226.         if ($tokens[($closer + 1)]['code'!== T_WHITESPACE{
  227.             $found = 0;
  228.         else if ($tokens[($closer + 1)]['content'!== ' '{
  229.             if (strpos($tokens[($closer + 1)]['content']$phpcsFile->eolChar!== false{
  230.                 $found 'newline';
  231.             else {
  232.                 $found strlen($tokens[($closer + 1)]['content']);
  233.             }
  234.         }
  235.  
  236.         if ($found !== 1{
  237.             $error 'Expected 1 space after closing brace; %s found';
  238.             $data  = array($found);
  239.             $fix   $phpcsFile->addFixableError($error$closer'SpaceAfterCloseBrace'$data);
  240.             if ($fix === true{
  241.                 if ($found === 0{
  242.                     $phpcsFile->fixer->addContent($closer' ');
  243.                 else {
  244.                     $phpcsFile->fixer->replaceToken(($closer + 1)' ');
  245.                 }
  246.             }
  247.         }
  248.  
  249.     }//end process()
  250.  
  251.  
  252. }//end class

Documentation generated on Mon, 11 Mar 2019 14:53:18 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.