Skip to content

Instantly share code, notes, and snippets.

@cbandy
Created October 2, 2010 21:28
Show Gist options
  • Save cbandy/608017 to your computer and use it in GitHub Desktop.
Save cbandy/608017 to your computer and use it in GitHub Desktop.
<?php
/**
* Kohana_Sniffs_Classes_OpeningBraceBsdAllmanSniff.
*
* PHP version 5
*
* @category PHP
* @package PHP_CodeSniffer
* @author Greg Sherwood <[email protected]>
* @author Marc McIntyre <[email protected]>
* @copyright 2006 Squiz Pty Ltd (ABN 77 084 670 600)
* @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence
* @version CVS: $Id: OpeningFunctionBraceBsdAllmanSniff.php 301632 2010-07-28 01:57:56Z squiz $
* @link http://pear.php.net/package/PHP_CodeSniffer
*/
/**
* Kohana_Sniffs_Classes_OpeningBraceBsdAllmanSniff.
*
* Checks that the opening brace of a class is on the line after the function declaration.
*
* @category PHP
* @package PHP_CodeSniffer
* @author Greg Sherwood <[email protected]>
* @author Marc McIntyre <[email protected]>
* @copyright 2006 Squiz Pty Ltd (ABN 77 084 670 600)
* @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence
* @version Release: 1.3.0RC1
* @link http://pear.php.net/package/PHP_CodeSniffer
*/
class Kohana_Sniffs_Classes_OpeningBraceBsdAllmanSniff implements PHP_CodeSniffer_Sniff
{
/**
* Registers the tokens that this sniff wants to listen for.
*
* @return array
*/
public function register()
{
return array(T_CLASS);
}
/**
* Processes this test, when one of its tokens is encountered.
*
* @param PHP_CodeSniffer_File $phpcsFile The file being scanned.
* @param int $stackPtr The position of the current token in the
* stack passed in $tokens.
*
* @return void
*/
public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
{
$tokens = $phpcsFile->getTokens();
$openingBrace = $tokens[$stackPtr]['scope_opener'];
$classLine = $tokens[$stackPtr]['line'];
$braceLine = $tokens[$openingBrace]['line'];
$lineDifference = ($braceLine - $classLine);
if ($lineDifference === 0) {
$error = 'Opening brace should be on a new line';
$phpcsFile->addError($error, $openingBrace, 'BraceOnSameLine');
return;
}
if ($lineDifference > 1) {
$error = sprintf('Opening brace should be on the line after the declaration; found %s blank line(s)', $lineDifference - 1);
$phpcsFile->addError($error, $openingBrace, 'BraceSpacing');
return;
}
// We need to actually find the first piece of content on this line,
// as if this is a method with tokens before it (public, static etc)
// or an if with an else before it, then we need to start the scope
// checking from there, rather than the current token.
$lineStart = $stackPtr;
while (($lineStart = $phpcsFile->findPrevious(array(T_WHITESPACE), ($lineStart - 1), null, false)) !== false) {
if (strpos($tokens[$lineStart]['content'], $phpcsFile->eolChar) !== false) {
break;
}
}
// We found a new line, now go forward and find the first non-whitespace
// token.
$lineStart = $phpcsFile->findNext(array(T_WHITESPACE), $lineStart, null, true);
// The opening brace is on the correct line, now it needs to be
// checked to be correctly indented.
$startColumn = $tokens[$lineStart]['column'];
$braceIndent = $tokens[$openingBrace]['column'];
if ($braceIndent !== $startColumn) {
$error = sprintf('Opening brace indented incorrectly; expected %s spaces, found %s', $startColumn - 1, $braceIndent - 1);
$phpcsFile->addError($error, $openingBrace, 'BraceIndent');
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment