Skip to content

Commit

Permalink
Add fixing of "Classes.ClassDeclaration" sniff
Browse files Browse the repository at this point in the history
- removed redundant code for checking that class closing brace is on it's own line
- also test the case, when there are too many empty lines after class declaration
  • Loading branch information
Alexander Obuhovich committed Oct 12, 2014
1 parent 235bf06 commit da60ac3
Show file tree
Hide file tree
Showing 4 changed files with 191 additions and 22 deletions.
80 changes: 59 additions & 21 deletions CodingStandard/Sniffs/Classes/ClassDeclarationSniff.php
Expand Up @@ -80,10 +80,18 @@ public function processOpen(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
$type,
$spaces,
);
$phpcsFile->addError($error, $stackPtr, 'SpaceBeforeKeyword', $data);

if (isset($phpcsFile->fixer) === true) {
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceBeforeKeyword', $data);
if ($fix === true) {
$phpcsFile->fixer->replaceToken(($stackPtr - 1), '');
}
} else {
$phpcsFile->addError($error, $stackPtr, 'SpaceBeforeKeyword', $data);
}
}
}
}
}//end if
}//end if

}//end processOpen()
Expand All @@ -109,17 +117,32 @@ public function processClose(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
$blankSpace = substr($prevContent, strpos($prevContent, $phpcsFile->eolChar));
$spaces = strlen($blankSpace);
if ($spaces !== 0) {
$fix = false;
if ($tokens[($closeBrace - 1)]['line'] !== $tokens[$closeBrace]['line']) {
$error = 'Expected 0 spaces before closing brace; newline found';
$phpcsFile->addError($error, $closeBrace, 'NewLineBeforeCloseBrace');
if (isset($phpcsFile->fixer) === true) {
$fix = $phpcsFile->addFixableError($error, $closeBrace, 'NewLineBeforeCloseBrace');
} else {
$phpcsFile->addError($error, $closeBrace, 'NewLineBeforeCloseBrace');
}
} else {
$error = 'Expected 0 spaces before closing brace; %s found';
$data = array($spaces);
$phpcsFile->addError($error, $closeBrace, 'SpaceBeforeCloseBrace', $data);
if (isset($phpcsFile->fixer) === true) {
$fix = $phpcsFile->addFixableError($error, $closeBrace, 'SpaceBeforeCloseBrace', $data);
} else {
$phpcsFile->addError($error, $closeBrace, 'SpaceBeforeCloseBrace', $data);
}
}//end if

if ($fix === true) {
$phpcsFile->fixer->beginChangeset();
$phpcsFile->fixer->replaceToken(($closeBrace - 1), '');
$phpcsFile->fixer->endChangeset();
}
}
}
}
}//end if
}//end if
}//end if

// Check that the closing brace has one blank line after it.
$nextContent = $phpcsFile->findNext(array(T_WHITESPACE), ($closeBrace + 1), null, true);
Expand All @@ -129,29 +152,44 @@ public function processClose(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
if ($braceLine === $nextLine) {
$error = 'Closing brace of a %s must be followed by a single blank line';
$data = array($tokens[$stackPtr]['content']);
$phpcsFile->addError($error, $closeBrace, 'NoNewlineAfterCloseBrace', $data);
if (isset($phpcsFile->fixer) === true) {
$fix = $phpcsFile->addFixableError($error, $closeBrace, 'NoNewlineAfterCloseBrace', $data);
if ($fix === true) {
$phpcsFile->fixer->beginChangeset();
$phpcsFile->fixer->addNewline($closeBrace);
$phpcsFile->fixer->endChangeset();
}
} else {
$phpcsFile->addError($error, $closeBrace, 'NoNewlineAfterCloseBrace', $data);
}
} else if ($nextLine !== ($braceLine + 2)) {
$difference = ($nextLine - $braceLine - 1);
$error = 'Closing brace of a %s must be followed by a single blank line; found %s';
$data = array(
$tokens[$stackPtr]['content'],
$difference,
);
$phpcsFile->addError($error, $closeBrace, 'NewlinesAfterCloseBrace', $data);
}
if (isset($phpcsFile->fixer) === true) {
$fix = $phpcsFile->addFixableError($error, $closeBrace, 'NewlinesAfterCloseBrace', $data);
if ($fix === true) {
$phpcsFile->fixer->beginChangeset();

if ($difference === 0) {
$phpcsFile->fixer->addNewline($closeBrace);
} else {
for ($i = 1; $i < $difference; $i++) {
$phpcsFile->fixer->replaceToken(($closeBrace + $i), '');
}
}

$phpcsFile->fixer->endChangeset();
}
} else {
$phpcsFile->addError($error, $closeBrace, 'NewlinesAfterCloseBrace', $data);
}
}//end if
}//end if

// Check the closing brace is on it's own line, but allow
// for comments like "//end class".
$nextContent = $phpcsFile->findNext(T_COMMENT, ($closeBrace + 1), null, true);
if ($tokens[$nextContent]['content'] !== $phpcsFile->eolChar
&& $tokens[$nextContent]['line'] === $tokens[$closeBrace]['line']
) {
$error = 'Closing %s brace must be on a line by itself';
$data = array($tokens[$stackPtr]['content']);
$phpcsFile->addError($error, $closeBrace, 'CloseBraceSameLine', $data);
}

}//end processClose()


Expand Down
2 changes: 2 additions & 0 deletions CodingStandard/Tests/Classes/ClassDeclarationUnitTest.inc
Expand Up @@ -119,6 +119,8 @@ interface MyInterface extends
{
}



class SomeClass
{

Expand Down
127 changes: 127 additions & 0 deletions CodingStandard/Tests/Classes/ClassDeclarationUnitTest.inc.fixed
@@ -0,0 +1,127 @@
<?php
class ClassName extends ParentClass implements \ArrayAccess, \Countable
{
// constants, properties, methods
}

class ClassName extends ParentClass, AnotherParentClass implements \ArrayAccess, \Countable
{
// constants, properties, methods
}

class ClassName extends ParentClass implements \ArrayAccess, \Countable
{
// constants, properties, methods
}

class ClassName extends ParentClass implements
\ArrayAccess,
\Foo\Bar\Countable,
\Serializable
{
// constants, properties, methods

}

class ClassName extends ParentClass implements \ArrayAccess,
\Countable,
\Serializable
{
// constants, properties, methods
}

class ClassName extends ParentClass implements
\ArrayAccess, \Countable, \Foo\Serializable
{
// constants, properties, methods
}

// Different indent
if ($foo) {
class ClassName extends ParentClass implements
\ArrayAccess,
\Countable,
\Serializable
{
// constants, properties, methods
}

}

class Foo extends \Foo\Bar\Object
{
}

class ClassName extends ParentClass implements
\Foo\Bar\Countable,
\Serializable
{
// constants, properties, methods
}

class ClassName extends ParentClass implements
\Foo\Bar\Countable,
\Serializable
{
// constants, properties, methods
}

class Test
{
public function test() {
if (1) 1;
1 ? (1 ? 1 : 1) : 1;
}
}

class MyClass
{
}

class MyClass
{

}

class MyClass
{
// Foo.
}

class MyClass
{
// Foo.

}

abstract class Test implements
TestInterface1,
TestInterface2
{
}

interface MyInterface extends LongInterfaceName1, LongInterfaceName2, LongInterfaceName3, LoginInterfaceName4
{
}

interface MyInterface extends
LongInterfaceName1,
LongInterfaceName2,
LongInterfaceName3,
LoginInterfaceName4
{
}

interface MyInterface extends
LongInterfaceName1,
LongInterfaceName2,
LongInterfaceName3,
{
}

class SomeClass
{

}

?>
4 changes: 3 additions & 1 deletion CodingStandard/Tests/Classes/ClassDeclarationUnitTest.php
Expand Up @@ -83,8 +83,10 @@ public function getErrorList($testFile)
116 => 1,
// Incorrect extended interface indentation in multi-line interface declaration.
118 => 1,
// Too much empty lines after interface declaration.
120 => 1,
// Class closing brace must on it's own line and must have an empty line after it.
125 => 2,
127 => 1,
);

}//end getErrorList()
Expand Down

0 comments on commit da60ac3

Please sign in to comment.