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.