Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -68,14 +68,60 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
}

// Only one USE declaration allowed per statement.
$next = $phpcsFile->findNext(array(T_COMMA, T_SEMICOLON), ($stackPtr + 1));
if ($tokens[$next]['code'] === T_COMMA) {
$next = $phpcsFile->findNext(array(T_COMMA, T_SEMICOLON, T_OPEN_USE_GROUP), ($stackPtr + 1));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is T_OPEN_USE_GROUP created also, when PHP 5 code is parsed OR PHP 5 is used to parse PHP 7 code?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes. It's a PHPCS-specific thing. PHP doesn't tokenise that code any differently, so PHPCS does it for all PHP versions.

if ($tokens[$next]['code'] !== T_SEMICOLON) {
$error = 'There must be one USE keyword per declaration';
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'MultipleDeclarations');
if ($fix === true) {
$phpcsFile->fixer->replaceToken($next, ';'.$phpcsFile->eolChar.'use ');
}
}
if ($tokens[$next]['code'] === T_COMMA) {
$phpcsFile->fixer->replaceToken($next, ';'.$phpcsFile->eolChar.'use ');
} else {
$baseUse = rtrim($phpcsFile->getTokensAsString($stackPtr, ($next - $stackPtr)));
$closingCurly = $phpcsFile->findNext(T_CLOSE_USE_GROUP, ($next + 1));

$phpcsFile->fixer->beginChangeset();

// Remove base use statement.
for ($i = $stackPtr; $i <= $next; $i++) {
$phpcsFile->fixer->replaceToken($i, '');
}

// Convert grouped use statements into full use statements.
do {
$next = $phpcsFile->findNext(PHP_CodeSniffer_Tokens::$emptyTokens, ($next + 1), $closingCurly, true);

$whitespace = $phpcsFile->findPrevious(T_WHITESPACE, ($next - 1), null, true);
for ($i = ($whitespace + 1); $i < $next; $i++) {
$phpcsFile->fixer->replaceToken($i, '');
}

if ($tokens[$next]['code'] === T_CONST || $tokens[$next]['code'] === T_FUNCTION) {
$phpcsFile->fixer->addContentBefore($next, 'use ');
$next = $phpcsFile->findNext(PHP_CodeSniffer_Tokens::$emptyTokens, ($next + 1), $closingCurly, true);
$phpcsFile->fixer->addContentBefore($next, str_replace('use ', '', $baseUse));
} else {
$phpcsFile->fixer->addContentBefore($next, $baseUse);
}

$next = $phpcsFile->findNext(T_COMMA, ($next + 1), $closingCurly);
if ($next !== false) {
$phpcsFile->fixer->replaceToken($next, ';'.$phpcsFile->eolChar);
}
} while ($next !== false);

$phpcsFile->fixer->replaceToken($closingCurly, '');

// Remove any trailing whitespace.
$next = $phpcsFile->findNext(T_SEMICOLON, $closingCurly);
$whitespace = $phpcsFile->findPrevious(T_WHITESPACE, ($closingCurly - 1), null, true);
for ($i = ($whitespace + 1); $i < $next; $i++) {
$phpcsFile->fixer->replaceToken($i, '');
}

$phpcsFile->fixer->endChangeset();
}//end if
}//end if
}//end if

// Make sure this USE comes after the first namespace declaration.
$prev = $phpcsFile->findPrevious(T_NAMESPACE, ($stackPtr - 1));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php
namespace MyProject;

use Single\ClassA as A;
use Grouped\Classes\{ClassB, ClassC as C};
use const Grouped\Constants\{D, E};
use Single\ClassF;
use Grouped\Mixed\ {
ClassG,
const ConstH,
function func_i,
ClassJ as J
};
use function Grouped\Functions\ { func_k };

class PHP7 {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php
namespace MyProject;

use Single\ClassA as A;
use Grouped\Classes\ClassB;
use Grouped\Classes\ClassC as C;
use const Grouped\Constants\D;
use const Grouped\Constants\E;
use Single\ClassF;
use Grouped\Mixed\ClassG;
use const Grouped\Mixed\ConstH;
use function Grouped\Mixed\func_i;
use Grouped\Mixed\ClassJ as J;
use function Grouped\Functions\func_k;

class PHP7 {

}
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,13 @@ public function getErrorList($testFile='')
4 => 1,
6 => 1,
);
case 'UseDeclarationUnitTest.5.inc':
return array(
5 => 1,
6 => 1,
8 => 1,
14 => 1,
);
default:
return array();
}//end switch
Expand Down
2 changes: 2 additions & 0 deletions package.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1410,6 +1410,8 @@ http://pear.php.net/dtd/package-2.0.xsd">
<file baseinstalldir="PHP" name="UseDeclarationUnitTest.3.inc" role="test" />
<file baseinstalldir="PHP" name="UseDeclarationUnitTest.3.inc.fixed" role="test" />
<file baseinstalldir="PHP" name="UseDeclarationUnitTest.4.inc" role="test" />
<file baseinstalldir="PHP" name="UseDeclarationUnitTest.5.inc" role="test" />
<file baseinstalldir="PHP" name="UseDeclarationUnitTest.5.inc.fixed" role="test" />
<file baseinstalldir="PHP" name="UseDeclarationUnitTest.php" role="test">
<tasks:replace from="@package_version@" to="version" type="package-info" />
</file>
Expand Down