Lethexie has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/275747

Change subject: add the spacebeforecontrolbrace sniff
......................................................................

add the spacebeforecontrolbrace sniff

Change-Id: Ie23b3e30d3d7b743e858f9cb45cc03e702dfdf79
---
A MediaWiki/Sniffs/WhiteSpace/SpaceBeforeControlStructureBraceSniff.php
A MediaWiki/Tests/files/WhiteSpace/space_before_structure_brace_fail.php
A MediaWiki/Tests/files/WhiteSpace/space_before_structure_brace_pass.php
3 files changed, 156 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/tools/codesniffer 
refs/changes/47/275747/1

diff --git 
a/MediaWiki/Sniffs/WhiteSpace/SpaceBeforeControlStructureBraceSniff.php 
b/MediaWiki/Sniffs/WhiteSpace/SpaceBeforeControlStructureBraceSniff.php
new file mode 100644
index 0000000..220e97f
--- /dev/null
+++ b/MediaWiki/Sniffs/WhiteSpace/SpaceBeforeControlStructureBraceSniff.php
@@ -0,0 +1,101 @@
+<?php
+/**
+ * make sure a space between closing parenthesis and opening brace
+ * during if,while,for,foreach,switch,catch statement 
+ * fail: if ( $a == 1 ){
+ * fail: if ( $a == 1 )\eol\t{
+ * fail: switch ( $a ){
+ * pass: if ( $a == 1 ) {
+ * pass: switch ( $a ) {
+ */
+// @codingStandardsIgnoreStart
+class MediaWiki_Sniffs_WhiteSpace_SpaceBeforeControlStructureBraceSniff
+       implements PHP_CodeSniffer_Sniff {
+       // @codingStandardsIgnoreEnd
+       public function register() {
+               return [
+                       T_IF,
+                       T_WHILE,
+                       T_FOR,
+                       T_FOREACH,
+                       T_SWITCH,
+                       T_CATCH,
+               ];
+       }
+
+       public function process( PHP_CodeSniffer_File $phpcsFile, $stackPtr ) {
+               $tokens = $phpcsFile->getTokens();
+               if ( $tokens[$stackPtr]['scope_opener'] === false ) {
+                       return;
+               }
+
+               if ( $tokens[$stackPtr + 1]['code'] !== T_WHITESPACE 
+                       || $tokens[$stackPtr + 2]['code'] !== T_OPEN_PARENTHESIS
+                       || $tokens[$stackPtr + 2]['parenthesis_closer'] === 
null ) {
+                       return;
+               }
+               $closeBracket = $tokens[$stackPtr + 2]['parenthesis_closer'];
+               $openBrace = $tokens[$stackPtr]['scope_opener'];
+               $closeBracketLine = $tokens[$closeBracket]['line'];
+               $openBraceLine = $tokens[$openBrace]['line'];
+               $lineDifference = ( $openBraceLine - $closeBracketLine );
+               if ( $lineDifference > 0 ) {
+                       // if brace on new line
+                       $this->processBraceLineDifferent( $phpcsFile, 
$openBrace, $closeBracket, $tokens );
+               }
+               if ( $lineDifference === 0 ) {
+                       // if brace on the same line as closing parenthesis
+                       $this->processBraceLineSame( $phpcsFile, $openBrace, 
$closeBracket, $stackPtr, $tokens );
+               }
+               $this->processEmptyLine( $phpcsFile, $closeBracket + 2, 
$stackPtr, $tokens );
+       }
+
+       protected function processBraceLineDifferent( $phpcsFile, $openBrace, 
$closeBracket, $stackPtr, $tokens ) {
+               $phpcsFile->recordMetric( $stackPtr, 'Control Structs opening 
brace placement', 'new line' );
+               $error = 'Opening brace should be on the same line as the 
declaration';
+               $fix   = $phpcsFile->addFixableError( $error, $openBrace, 
'BraceOnNewLine' );
+               if ( $fix === true ) {
+                       $phpcsFile->fixer->beginChangeset();
+                       $i = $closeBracket + 1;
+                       for ( $i; $i < $openBrace; $i++ ) {
+                               $phpcsFile->fixer->replaceToken( $i, '');
+                       }
+                       $phpcsFile->fixer->addContent( $closeBracket, ' {' );
+                       $phpcsFile->fixer->replaceToken( $openBrace, '' );
+                       $phpcsFile->fixer->addNewLine( $closeBracket + 2 );
+                       $phpcsFile->fixer->endChangeset();
+               }
+       }
+
+       protected function processBraceLineSame( $phpcsFile, $openBrace, 
$closeBracket, $stackPtr, $tokens ) {
+               $content = $phpcsFile->getTokensAsString( $closeBracket + 1, 
$openBrace - $closeBracket - 1 );
+               $length = strlen( $content );
+               if ( $length === 1 && $tokens[$closeBracket + 1]['content'] === 
' ' ) {
+                       return;
+               } else {
+                       $warning = 'Expected only 1 space between closing 
parenthesis and opening brace; find %s characters';
+                       $fix = $phpcsFile->addFixableWarning( $warning, 
$openBrace, 'SpaceBeforeControl', [ $length ] );
+                       if ( $fix === true ) {
+                               $phpcsFile->fixer->beginChangeset();
+                               $phpcsFile->fixer->replaceToken( $openBrace, '' 
);
+                               $phpcsFile->fixer->addContent( $closeBracket, ' 
{' );
+                               $next = $phpcsFile->findNext( T_WHITESPACE, 
$closeBracket + 1, null, true);
+                               for ( $i = ($closeBracket + 1) ; $i < $next; 
$i++ ) {
+                                       $phpcsFile->fixer->replaceToken( $i, '' 
);
+                               }
+                               $phpcsFile->fixer->endChangeset();
+                       }
+               }
+       }
+       protected function processEmptyLine( $phpcsFile, $openBrace, $stackPtr, 
$tokens ) {
+               $next = $phpcsFile->findNext( T_WHITESPACE, $openBrace + 2, 
null, false);
+               $found = strpos( $tokens[$next]['content'], $phpcsFile->eolChar 
);
+               if ( $tokens[$next]['code'] === T_WHITESPACE && $found !== 
false) {
+                       $warning = 'empty lines should not exist after brace of 
"%s" ';
+                       $fix   = $phpcsFile->addFixableWarning( $warning, 
$openBrace, 'EmptyLines', [ $tokens[$stackPtr]['content'] ] );
+                       if ( $fix === true ) {
+                               $phpcsFile->fixer->replaceToken($next, '');
+                       }
+               }       
+       }
+}
\ No newline at end of file
diff --git 
a/MediaWiki/Tests/files/WhiteSpace/space_before_structure_brace_fail.php 
b/MediaWiki/Tests/files/WhiteSpace/space_before_structure_brace_fail.php
new file mode 100644
index 0000000..15bd129
--- /dev/null
+++ b/MediaWiki/Tests/files/WhiteSpace/space_before_structure_brace_fail.php
@@ -0,0 +1,29 @@
+<?php
+
+function wfAOO( $a, $b ) {
+       if ( $a )
+       {
+               # code...
+       }
+       # too many spaces
+       switch ( $b )   {
+               case 'value':
+                       # code...
+                       break;
+
+               default:
+                       # code...
+                       break;
+       }
+       # opening brace on the next line and with a empty line
+       while ( $a > 0 )
+       {
+
+               $a = $a - 1;
+       }
+       # between closing parenthesis and opening brace is '\t'
+       for ( $i = $a; $i < $b; $i++ )  {
+               # code...
+       }
+       # and so on...
+}
diff --git 
a/MediaWiki/Tests/files/WhiteSpace/space_before_structure_brace_pass.php 
b/MediaWiki/Tests/files/WhiteSpace/space_before_structure_brace_pass.php
new file mode 100644
index 0000000..0ae6161
--- /dev/null
+++ b/MediaWiki/Tests/files/WhiteSpace/space_before_structure_brace_pass.php
@@ -0,0 +1,26 @@
+<?php
+
+function wfAOO( $a, $b ) {
+       if ( $a ) {
+               # code...
+       }
+       switch ( $b ) {
+               case 'value':
+                       # code...
+                       break;
+
+               default:
+                       # code...
+                       break;
+       }
+       while ( $a > 0 ) {
+               $a = $a - 1;
+       }
+       for ( $i = $a; $i < $b; $i++ ) {
+               # code...
+       }
+       foreach ( $b as $key => $value ) {
+               # code...
+       }
+       # and so on...
+}

-- 
To view, visit https://gerrit.wikimedia.org/r/275747
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie23b3e30d3d7b743e858f9cb45cc03e702dfdf79
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/tools/codesniffer
Gerrit-Branch: master
Gerrit-Owner: Lethexie <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to