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\Files\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.                         if (trim($content=== ''{
  122.                             $phpcsFile->fixer->addContent($closer' ');
  123.                             if ($found !== 0{
  124.                                 for ($i ($closer + 1)$i $opener$i++{
  125.                                     $phpcsFile->fixer->replaceToken($i'');
  126.                                 }
  127.                             }
  128.                         else {
  129.                             $phpcsFile->fixer->addContent($closer' '.$tokens[$opener]['content']);
  130.                             $phpcsFile->fixer->replaceToken($opener'');
  131.  
  132.                             if ($tokens[$opener]['line'!== $tokens[$closer]['line']{
  133.                                 $next $phpcsFile->findNext(T_WHITESPACE($opener + 1)nulltrue);
  134.                                 if ($tokens[$next]['line'!== $tokens[$opener]['line']{
  135.                                     for ($i ($opener + 1)$i $next$i++{
  136.                                         $phpcsFile->fixer->replaceToken($i'');
  137.                                     }
  138.                                 }
  139.                             }
  140.                         }
  141.  
  142.                         $phpcsFile->fixer->endChangeset();
  143.                     }//end if
  144.                 }//end if
  145.             }//end if
  146.         }//end if
  147.  
  148.         // Single newline after opening brace.
  149.         if (isset($tokens[$stackPtr]['scope_opener']=== true{
  150.             $opener $tokens[$stackPtr]['scope_opener'];
  151.             for ($next ($opener + 1)$next $phpcsFile->numTokens; $next++{
  152.                 $code $tokens[$next]['code'];
  153.  
  154.                 if ($code === T_WHITESPACE
  155.                     || ($code === T_INLINE_HTML
  156.                     && trim($tokens[$next]['content']=== '')
  157.                 {
  158.                     continue;
  159.                 }
  160.  
  161.                 // Skip all empty tokens on the same line as the opener.
  162.                 if ($tokens[$next]['line'=== $tokens[$opener]['line']
  163.                     && (isset(Tokens::$emptyTokens[$code]=== true
  164.                     || $code === T_CLOSE_TAG)
  165.                 {
  166.                     continue;
  167.                 }
  168.  
  169.                 // We found the first bit of a code, or a comment on the
  170.                 // following line.
  171.                 break;
  172.             }//end for
  173.  
  174.             if ($tokens[$next]['line'=== $tokens[$opener]['line']{
  175.                 $error 'Newline required after opening brace';
  176.                 $fix   $phpcsFile->addFixableError($error$opener'NewlineAfterOpenBrace');
  177.                 if ($fix === true{
  178.                     $phpcsFile->fixer->beginChangeset();
  179.                     for ($i ($opener + 1)$i $next$i++{
  180.                         if (trim($tokens[$i]['content']!== ''{
  181.                             break;
  182.                         }
  183.  
  184.                         // Remove whitespace.
  185.                         $phpcsFile->fixer->replaceToken($i'');
  186.                     }
  187.  
  188.                     $phpcsFile->fixer->addContent($opener$phpcsFile->eolChar);
  189.                     $phpcsFile->fixer->endChangeset();
  190.                 }
  191.             }//end if
  192.         else if ($tokens[$stackPtr]['code'=== T_WHILE{
  193.             // Zero spaces after parenthesis closer.
  194.             $closer $tokens[$stackPtr]['parenthesis_closer'];
  195.             $found  = 0;
  196.             if ($tokens[($closer + 1)]['code'=== T_WHITESPACE{
  197.                 if (strpos($tokens[($closer + 1)]['content']$phpcsFile->eolChar!== false{
  198.                     $found 'newline';
  199.                 else {
  200.                     $found strlen($tokens[($closer + 1)]['content']);
  201.                 }
  202.             }
  203.  
  204.             if ($found !== 0{
  205.                 $error 'Expected 0 spaces before semicolon; %s found';
  206.                 $data  = array($found);
  207.                 $fix   $phpcsFile->addFixableError($error$closer'SpaceBeforeSemicolon'$data);
  208.                 if ($fix === true{
  209.                     $phpcsFile->fixer->replaceToken(($closer + 1)'');
  210.                 }
  211.             }
  212.         }//end if
  213.  
  214.         // Only want to check multi-keyword structures from here on.
  215.         if ($tokens[$stackPtr]['code'=== T_DO{
  216.             if (isset($tokens[$stackPtr]['scope_closer']=== false{
  217.                 return;
  218.             }
  219.  
  220.             $closer $tokens[$stackPtr]['scope_closer'];
  221.         else if ($tokens[$stackPtr]['code'=== T_ELSE
  222.             || $tokens[$stackPtr]['code'=== T_ELSEIF
  223.             || $tokens[$stackPtr]['code'=== T_CATCH
  224.         {
  225.             if (isset($tokens[$stackPtr]['scope_opener']=== true
  226.                 && $tokens[$tokens[$stackPtr]['scope_opener']]['code'=== T_COLON
  227.             {
  228.                 // Special case for alternate syntax, where this token is actually
  229.                 // the closer for the previous block, so there is no spacing to check.
  230.                 return;
  231.             }
  232.  
  233.             $closer $phpcsFile->findPrevious(Tokens::$emptyTokens($stackPtr - 1)nulltrue);
  234.             if ($closer === false || $tokens[$closer]['code'!== T_CLOSE_CURLY_BRACKET{
  235.                 return;
  236.             }
  237.         else {
  238.             return;
  239.         }//end if
  240.  
  241.         // Single space after closing brace.
  242.         $found = 1;
  243.         if ($tokens[($closer + 1)]['code'!== T_WHITESPACE{
  244.             $found = 0;
  245.         else if ($tokens[($closer + 1)]['content'!== ' '{
  246.             if (strpos($tokens[($closer + 1)]['content']$phpcsFile->eolChar!== false{
  247.                 $found 'newline';
  248.             else {
  249.                 $found strlen($tokens[($closer + 1)]['content']);
  250.             }
  251.         }
  252.  
  253.         if ($found !== 1{
  254.             $error 'Expected 1 space after closing brace; %s found';
  255.             $data  = array($found);
  256.             $fix   $phpcsFile->addFixableError($error$closer'SpaceAfterCloseBrace'$data);
  257.             if ($fix === true{
  258.                 if ($found === 0{
  259.                     $phpcsFile->fixer->addContent($closer' ');
  260.                 else {
  261.                     $phpcsFile->fixer->replaceToken(($closer + 1)' ');
  262.                 }
  263.             }
  264.         }
  265.  
  266.     }//end process()
  267.  
  268.  
  269. }//end class

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