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

Source for file ForEachLoopDeclarationSniff.php

Documentation is available at ForEachLoopDeclarationSniff.php

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

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