105 lines
2.9 KiB
PHP
105 lines
2.9 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* WordPress Coding Standard.
|
||
|
*
|
||
|
* @package WPCS\WordPressCodingStandards
|
||
|
* @link https://github.com/WordPress/WordPress-Coding-Standards
|
||
|
* @license https://opensource.org/licenses/MIT MIT
|
||
|
*/
|
||
|
|
||
|
namespace WordPressCS\WordPress\Sniffs\WhiteSpace;
|
||
|
|
||
|
use WordPressCS\WordPress\Sniff;
|
||
|
use WordPressCS\WordPress\PHPCSHelper;
|
||
|
|
||
|
/**
|
||
|
* Enforces using spaces for mid-line alignment.
|
||
|
*
|
||
|
* @link https://make.wordpress.org/core/handbook/best-practices/coding-standards/php/#indentation
|
||
|
*
|
||
|
* @package WPCS\WordPressCodingStandards
|
||
|
*
|
||
|
* @since 0.12.0
|
||
|
* @since 0.13.0 Class name changed: this class is now namespaced.
|
||
|
*/
|
||
|
class DisallowInlineTabsSniff extends Sniff {
|
||
|
|
||
|
/**
|
||
|
* The --tab-width CLI value that is being used.
|
||
|
*
|
||
|
* @var int
|
||
|
*/
|
||
|
private $tab_width;
|
||
|
|
||
|
/**
|
||
|
* Returns an array of tokens this test wants to listen for.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function register() {
|
||
|
return array(
|
||
|
\T_OPEN_TAG,
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Processes this test, when one of its tokens is encountered.
|
||
|
*
|
||
|
* @param int $stackPtr The position of the current token in the stack.
|
||
|
*
|
||
|
* @return int Integer stack pointer to skip the rest of the file.
|
||
|
*/
|
||
|
public function process_token( $stackPtr ) {
|
||
|
if ( ! isset( $this->tab_width ) ) {
|
||
|
$this->tab_width = PHPCSHelper::get_tab_width( $this->phpcsFile );
|
||
|
}
|
||
|
|
||
|
$check_tokens = array(
|
||
|
\T_WHITESPACE => true,
|
||
|
\T_DOC_COMMENT_WHITESPACE => true,
|
||
|
\T_DOC_COMMENT_STRING => true,
|
||
|
);
|
||
|
|
||
|
for ( $i = ( $stackPtr + 1 ); $i < $this->phpcsFile->numTokens; $i++ ) {
|
||
|
// Skip all non-whitespace tokens and skip whitespace at the start of a new line.
|
||
|
if ( ! isset( $check_tokens[ $this->tokens[ $i ]['code'] ] ) || 1 === $this->tokens[ $i ]['column'] ) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// If tabs are being converted to spaces by the tokenizer, the
|
||
|
// original content should be checked instead of the converted content.
|
||
|
if ( isset( $this->tokens[ $i ]['orig_content'] ) ) {
|
||
|
$content = $this->tokens[ $i ]['orig_content'];
|
||
|
} else {
|
||
|
$content = $this->tokens[ $i ]['content'];
|
||
|
}
|
||
|
|
||
|
if ( '' === $content || strpos( $content, "\t" ) === false ) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$fix = $this->phpcsFile->addFixableError(
|
||
|
'Spaces must be used for mid-line alignment; tabs are not allowed',
|
||
|
$i,
|
||
|
'NonIndentTabsUsed'
|
||
|
);
|
||
|
if ( true === $fix ) {
|
||
|
if ( isset( $this->tokens[ $i ]['orig_content'] ) ) {
|
||
|
// Use the replacement that PHPCS has already done.
|
||
|
$this->phpcsFile->fixer->replaceToken( $i, $this->tokens[ $i ]['content'] );
|
||
|
} else {
|
||
|
// Replace tabs with spaces, using an indent of $tab_width.
|
||
|
// Other sniffs can then correct the indent if they need to.
|
||
|
$spaces = str_repeat( ' ', $this->tab_width );
|
||
|
$newContent = str_replace( "\t", $spaces, $this->tokens[ $i ]['content'] );
|
||
|
$this->phpcsFile->fixer->replaceToken( $i, $newContent );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Ignore the rest of the file.
|
||
|
return ( $this->phpcsFile->numTokens + 1 );
|
||
|
}
|
||
|
|
||
|
}
|