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

Source for file ControlStructureSpacingSniff.php

Documentation is available at ControlStructureSpacingSniff.php

  1. <?php
  2. /**
  3.  * Checks that control structures have the correct spacing around brackets.
  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\PSR2\Sniffs\ControlStructures;
  11.  
  12. use PHP_CodeSniffer\Sniffs\Sniff;
  13. use PHP_CodeSniffer\Files\File;
  14.  
  15. class ControlStructureSpacingSniff 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(
  42.                 T_IF,
  43.                 T_WHILE,
  44.                 T_FOREACH,
  45.                 T_FOR,
  46.                 T_SWITCH,
  47.                 T_DO,
  48.                 T_ELSE,
  49.                 T_ELSEIF,
  50.                 T_TRY,
  51.                 T_CATCH,
  52.                );
  53.  
  54.     }//end register()
  55.  
  56.  
  57.     /**
  58.      * Processes this test, when one of its tokens is encountered.
  59.      *
  60.      * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned.
  61.      * @param int                         $stackPtr  The position of the current token
  62.      *                                                in the stack passed in $tokens.
  63.      *
  64.      * @return void 
  65.      */
  66.     public function process(File $phpcsFile$stackPtr)
  67.     {
  68.         $this->requiredSpacesAfterOpen   = (int) $this->requiredSpacesAfterOpen;
  69.         $this->requiredSpacesBeforeClose = (int) $this->requiredSpacesBeforeClose;
  70.         $tokens $phpcsFile->getTokens();
  71.  
  72.         if (isset($tokens[$stackPtr]['parenthesis_opener']=== false
  73.             || isset($tokens[$stackPtr]['parenthesis_closer']=== false
  74.         {
  75.             return;
  76.         }
  77.  
  78.         $parenOpener    $tokens[$stackPtr]['parenthesis_opener'];
  79.         $parenCloser    $tokens[$stackPtr]['parenthesis_closer'];
  80.         $spaceAfterOpen = 0;
  81.         if ($tokens[($parenOpener + 1)]['code'=== T_WHITESPACE{
  82.             if (strpos($tokens[($parenOpener + 1)]['content']$phpcsFile->eolChar!== false{
  83.                 $spaceAfterOpen 'newline';
  84.             else {
  85.                 $spaceAfterOpen strlen($tokens[($parenOpener + 1)]['content']);
  86.             }
  87.         }
  88.  
  89.         $phpcsFile->recordMetric($stackPtr'Spaces after control structure open parenthesis'$spaceAfterOpen);
  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($parenOpener + 1)'SpacingAfterOpenBrace'$data);
  98.             if ($fix === true{
  99.                 $padding str_repeat(' '$this->requiredSpacesAfterOpen);
  100.                 if ($spaceAfterOpen === 0{
  101.                     $phpcsFile->fixer->addContent($parenOpener$padding);
  102.                 else if ($spaceAfterOpen === 'newline'{
  103.                     $phpcsFile->fixer->replaceToken(($parenOpener + 1)'');
  104.                 else {
  105.                     $phpcsFile->fixer->replaceToken(($parenOpener + 1)$padding);
  106.                 }
  107.             }
  108.         }
  109.  
  110.         if ($tokens[$parenOpener]['line'=== $tokens[$parenCloser]['line']{
  111.             $spaceBeforeClose = 0;
  112.             if ($tokens[($parenCloser - 1)]['code'=== T_WHITESPACE{
  113.                 $spaceBeforeClose strlen(ltrim($tokens[($parenCloser - 1)]['content']$phpcsFile->eolChar));
  114.             }
  115.  
  116.             $phpcsFile->recordMetric($stackPtr'Spaces before control structure close parenthesis'$spaceBeforeClose);
  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($parenCloser - 1)'SpaceBeforeCloseBrace'$data);
  125.                 if ($fix === true{
  126.                     $padding str_repeat(' '$this->requiredSpacesBeforeClose);
  127.                     if ($spaceBeforeClose === 0{
  128.                         $phpcsFile->fixer->addContentBefore($parenCloser$padding);
  129.                     else {
  130.                         $phpcsFile->fixer->replaceToken(($parenCloser - 1)$padding);
  131.                     }
  132.                 }
  133.             }
  134.         }//end if
  135.  
  136.     }//end process()
  137.  
  138.  
  139. }//end class

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