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

Source for file ForLoopDeclarationSniff.php

Documentation is available at ForLoopDeclarationSniff.php

  1. <?php
  2. /**
  3.  * Verifies that there is a space between each condition of for loops.
  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.  
  15. class ForLoopDeclarationSniff implements Sniff
  16. {
  17.  
  18.     /**
  19.      * How many spaces should follow the opening bracket.
  20.      *
  21.      * @var integer 
  22.      */
  23.     public $requiredSpacesAfterOpen = 0;
  24.  
  25.     /**
  26.      * How many spaces should precede the closing bracket.
  27.      *
  28.      * @var integer 
  29.      */
  30.     public $requiredSpacesBeforeClose = 0;
  31.  
  32.     /**
  33.      * A list of tokenizers this sniff supports.
  34.      *
  35.      * @var array 
  36.      */
  37.     public $supportedTokenizers = array(
  38.                                    'PHP',
  39.                                    'JS',
  40.                                   );
  41.  
  42.  
  43.     /**
  44.      * Returns an array of tokens this test wants to listen for.
  45.      *
  46.      * @return array 
  47.      */
  48.     public function register()
  49.     {
  50.         return array(T_FOR);
  51.  
  52.     }//end register()
  53.  
  54.  
  55.     /**
  56.      * Processes this test, when one of its tokens is encountered.
  57.      *
  58.      * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned.
  59.      * @param int                         $stackPtr  The position of the current token in the
  60.      *                                                stack passed in $tokens.
  61.      *
  62.      * @return void 
  63.      */
  64.     public function process(File $phpcsFile$stackPtr)
  65.     {
  66.         $this->requiredSpacesAfterOpen   = (int) $this->requiredSpacesAfterOpen;
  67.         $this->requiredSpacesBeforeClose = (int) $this->requiredSpacesBeforeClose;
  68.         $tokens $phpcsFile->getTokens();
  69.  
  70.         $openingBracket $phpcsFile->findNext(T_OPEN_PARENTHESIS$stackPtr);
  71.         if ($openingBracket === false{
  72.             $error 'Possible parse error: no opening parenthesis for FOR keyword';
  73.             $phpcsFile->addWarning($error$stackPtr'NoOpenBracket');
  74.             return;
  75.         }
  76.  
  77.         $closingBracket $tokens[$openingBracket]['parenthesis_closer'];
  78.  
  79.         if ($this->requiredSpacesAfterOpen === 0 && $tokens[($openingBracket + 1)]['code'=== T_WHITESPACE{
  80.             $error 'Space found after opening bracket of FOR loop';
  81.             $fix   $phpcsFile->addFixableError($error$stackPtr'SpacingAfterOpen');
  82.             if ($fix === true{
  83.                 $phpcsFile->fixer->replaceToken(($openingBracket + 1)'');
  84.             }
  85.         else if ($this->requiredSpacesAfterOpen > 0{
  86.             $spaceAfterOpen = 0;
  87.             if ($tokens[($openingBracket + 1)]['code'=== T_WHITESPACE{
  88.                 $spaceAfterOpen strlen($tokens[($openingBracket + 1)]['content']);
  89.             }
  90.  
  91.             if ($spaceAfterOpen !== $this->requiredSpacesAfterOpen{
  92.                 $error 'Expected %s spaces after opening bracket; %s found';
  93.                 $data  = array(
  94.                           $this->requiredSpacesAfterOpen,
  95.                           $spaceAfterOpen,
  96.                          );
  97.                 $fix   $phpcsFile->addFixableError($error$stackPtr'SpacingAfterOpen'$data);
  98.                 if ($fix === true{
  99.                     $padding str_repeat(' '$this->requiredSpacesAfterOpen);
  100.                     if ($spaceAfterOpen === 0{
  101.                         $phpcsFile->fixer->addContent($openingBracket$padding);
  102.                     else {
  103.                         $phpcsFile->fixer->replaceToken(($openingBracket + 1)$padding);
  104.                     }
  105.                 }
  106.             }
  107.         }//end if
  108.  
  109.         if ($this->requiredSpacesBeforeClose === 0 && $tokens[($closingBracket - 1)]['code'=== T_WHITESPACE{
  110.             $error 'Space found before closing bracket of FOR loop';
  111.             $fix   $phpcsFile->addFixableError($error$stackPtr'SpacingBeforeClose');
  112.             if ($fix === true{
  113.                 $phpcsFile->fixer->replaceToken(($closingBracket - 1)'');
  114.             }
  115.         else if ($this->requiredSpacesBeforeClose > 0{
  116.             $spaceBeforeClose = 0;
  117.             if ($tokens[($closingBracket - 1)]['code'=== T_WHITESPACE{
  118.                 $spaceBeforeClose strlen($tokens[($closingBracket - 1)]['content']);
  119.             }
  120.  
  121.             if ($this->requiredSpacesBeforeClose !== $spaceBeforeClose{
  122.                 $error 'Expected %s spaces before closing bracket; %s found';
  123.                 $data  = array(
  124.                           $this->requiredSpacesBeforeClose,
  125.                           $spaceBeforeClose,
  126.                          );
  127.                 $fix   $phpcsFile->addFixableError($error$stackPtr'SpacingBeforeClose'$data);
  128.                 if ($fix === true{
  129.                     $padding str_repeat(' '$this->requiredSpacesBeforeClose);
  130.                     if ($spaceBeforeClose === 0{
  131.                         $phpcsFile->fixer->addContentBefore($closingBracket$padding);
  132.                     else {
  133.                         $phpcsFile->fixer->replaceToken(($closingBracket - 1)$padding);
  134.                     }
  135.                 }
  136.             }
  137.         }//end if
  138.  
  139.         $firstSemicolon $phpcsFile->findNext(T_SEMICOLON$openingBracket$closingBracket);
  140.  
  141.         // Check whitespace around each of the tokens.
  142.         if ($firstSemicolon !== false{
  143.             if ($tokens[($firstSemicolon - 1)]['code'=== T_WHITESPACE{
  144.                 $error 'Space found before first semicolon of FOR loop';
  145.                 $fix   $phpcsFile->addFixableError($error$stackPtr'SpacingBeforeFirst');
  146.                 if ($fix === true{
  147.                     $phpcsFile->fixer->replaceToken(($firstSemicolon - 1)'');
  148.                 }
  149.             }
  150.  
  151.             if ($tokens[($firstSemicolon + 1)]['code'!== T_WHITESPACE
  152.                 && $tokens[($firstSemicolon + 1)]['code'!== T_SEMICOLON
  153.             {
  154.                 $error 'Expected 1 space after first semicolon of FOR loop; 0 found';
  155.                 $fix   $phpcsFile->addFixableError($error$stackPtr'NoSpaceAfterFirst');
  156.                 if ($fix === true{
  157.                     $phpcsFile->fixer->addContent($firstSemicolon' ');
  158.                 }
  159.             else {
  160.                 if (strlen($tokens[($firstSemicolon + 1)]['content']!== 1{
  161.                     $spaces strlen($tokens[($firstSemicolon + 1)]['content']);
  162.                     $error  'Expected 1 space after first semicolon of FOR loop; %s found';
  163.                     $data   = array($spaces);
  164.                     $fix    $phpcsFile->addFixableError($error$stackPtr'SpacingAfterFirst'$data);
  165.                     if ($fix === true{
  166.                         $phpcsFile->fixer->replaceToken(($firstSemicolon + 1)' ');
  167.                     }
  168.                 }
  169.             }
  170.  
  171.             $secondSemicolon $phpcsFile->findNext(T_SEMICOLON($firstSemicolon + 1));
  172.  
  173.             if ($secondSemicolon !== false{
  174.                 if ($tokens[($secondSemicolon - 1)]['code'=== T_WHITESPACE
  175.                     && $tokens[($firstSemicolon + 1)]['code'!== T_SEMICOLON
  176.                 {
  177.                     $error 'Space found before second semicolon of FOR loop';
  178.                     $fix   $phpcsFile->addFixableError($error$stackPtr'SpacingBeforeSecond');
  179.                     if ($fix === true{
  180.                         $phpcsFile->fixer->replaceToken(($secondSemicolon - 1)'');
  181.                     }
  182.                 }
  183.  
  184.                 if (($secondSemicolon + 1!== $closingBracket
  185.                     && $tokens[($secondSemicolon + 1)]['code'!== T_WHITESPACE
  186.                 {
  187.                     $error 'Expected 1 space after second semicolon of FOR loop; 0 found';
  188.                     $fix   $phpcsFile->addFixableError($error$stackPtr'NoSpaceAfterSecond');
  189.                     if ($fix === true{
  190.                         $phpcsFile->fixer->addContent($secondSemicolon' ');
  191.                     }
  192.                 else {
  193.                     if (strlen($tokens[($secondSemicolon + 1)]['content']!== 1{
  194.                         $spaces strlen($tokens[($secondSemicolon + 1)]['content']);
  195.                         $data   = array($spaces);
  196.                         if (($secondSemicolon + 2=== $closingBracket{
  197.                             $error 'Expected no space after second semicolon of FOR loop; %s found';
  198.                             $fix   $phpcsFile->addFixableError($error$stackPtr'SpacingAfterSecondNoThird'$data);
  199.                             if ($fix === true{
  200.                                 $phpcsFile->fixer->replaceToken(($secondSemicolon + 1)'');
  201.                             }
  202.                         else {
  203.                             $error 'Expected 1 space after second semicolon of FOR loop; %s found';
  204.                             $fix   $phpcsFile->addFixableError($error$stackPtr'SpacingAfterSecond'$data);
  205.                             if ($fix === true{
  206.                                 $phpcsFile->fixer->replaceToken(($secondSemicolon + 1)' ');
  207.                             }
  208.                         }
  209.                     }
  210.                 }//end if
  211.             }//end if
  212.         }//end if
  213.  
  214.     }//end process()
  215.  
  216.  
  217. }//end class

Documentation generated on Mon, 11 Mar 2019 15:27:30 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.