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