Skip to content

Commit

Permalink
Merge 45f4964 into 2eecb13
Browse files Browse the repository at this point in the history
  • Loading branch information
jrfnl committed May 19, 2023
2 parents 2eecb13 + 45f4964 commit d968203
Show file tree
Hide file tree
Showing 6 changed files with 120 additions and 81 deletions.
49 changes: 47 additions & 2 deletions PHPCSUtils/BackCompat/BCFile.php
Expand Up @@ -527,19 +527,21 @@ public static function getMemberProperties(File $phpcsFile, $stackPtr)
* array(
* 'is_abstract' => boolean, // TRUE if the abstract keyword was found.
* 'is_final' => boolean, // TRUE if the final keyword was found.
* 'is_readonly' => false, // TRUE if the readonly keyword was found.
* );
* ```
*
* PHPCS cross-version compatible version of the `File::getClassProperties()` method.
*
* Changelog for the PHPCS native function:
* - Introduced in PHPCS 1.3.0.
* - The upstream method has received no significant updates since PHPCS 3.7.1.
* - PHPCS 3.8.0: Added support for PHP 8.2 `readonly` classes.
*
* @see \PHP_CodeSniffer\Files\File::getClassProperties() Original source.
* @see \PHPCSUtils\Utils\ObjectDeclarations::getClassProperties() PHPCSUtils native improved version.
*
* @since 1.0.0
* @since 1.0.6 Sync with PHPCS 3.8.0, support for readonly classes. PHPCS#3686.
*
* @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned.
* @param int $stackPtr The position in the stack of the `T_CLASS`
Expand All @@ -552,7 +554,50 @@ public static function getMemberProperties(File $phpcsFile, $stackPtr)
*/
public static function getClassProperties(File $phpcsFile, $stackPtr)
{
return $phpcsFile->getClassProperties($stackPtr);
$tokens = $phpcsFile->getTokens();

if ($tokens[$stackPtr]['code'] !== T_CLASS) {
throw new RuntimeException('$stackPtr must be of type T_CLASS');
}

$valid = [
T_FINAL => T_FINAL,
T_ABSTRACT => T_ABSTRACT,
T_READONLY => T_READONLY,
T_WHITESPACE => T_WHITESPACE,
T_COMMENT => T_COMMENT,
T_DOC_COMMENT => T_DOC_COMMENT,
];

$isAbstract = false;
$isFinal = false;
$isReadonly = false;

for ($i = ($stackPtr - 1); $i > 0; $i--) {
if (isset($valid[$tokens[$i]['code']]) === false) {
break;
}

switch ($tokens[$i]['code']) {
case T_ABSTRACT:
$isAbstract = true;
break;

case T_FINAL:
$isFinal = true;
break;

case T_READONLY:
$isReadonly = true;
break;
}
}

return [
'is_abstract' => $isAbstract,
'is_final' => $isFinal,
'is_readonly' => $isReadonly,
];
}

/**
Expand Down
1 change: 0 additions & 1 deletion PHPCSUtils/Utils/ObjectDeclarations.php
Expand Up @@ -136,7 +136,6 @@ public static function getName(File $phpcsFile, $stackPtr)
* - Handling of PHPCS annotations.
* - Handling of unorthodox docblock placement.
* - Defensive coding against incorrect calls to this method.
* - Support for PHP 8.2 readonly classes.
* - Additional `'abstract_token'`, `'final_token'`, and `'readonly_token'` indexes in the return array.
*
* @see \PHP_CodeSniffer\Files\File::getClassProperties() Original source.
Expand Down
17 changes: 17 additions & 0 deletions Tests/BackCompat/BCFile/GetClassPropertiesTest.inc
Expand Up @@ -18,6 +18,23 @@ abstract class AbstractClass {}
/* testFinalClass */
final class FinalClass {}

/* testReadonlyClass */
readonly class ReadOnlyClass {}

/* testFinalReadonlyClass */
final readonly class FinalReadOnlyClass extends Foo {}

/* testReadonlyFinalClass */
readonly /*comment*/ final class ReadOnlyFinalClass {}

/* testAbstractReadonlyClass */
abstract readonly class AbstractReadOnlyClass {}

/* testReadonlyAbstractClass */
readonly
abstract
class ReadOnlyAbstractClass {}

/* testWithCommentsAndNewLines */
abstract
/* comment */
Expand Down
62 changes: 56 additions & 6 deletions Tests/BackCompat/BCFile/GetClassPropertiesTest.php
Expand Up @@ -92,12 +92,7 @@ public function dataNotAClassException()
public function testGetClassProperties($testMarker, $expected)
{
// Remove keys which will only exist in the PHPCSUtils version of this method.
unset(
$expected['abstract_token'],
$expected['final_token'],
$expected['is_readonly'],
$expected['readonly_token']
);
unset($expected['abstract_token'], $expected['final_token'], $expected['readonly_token']);

$class = $this->getTargetToken($testMarker, \T_CLASS);
$result = BCFile::getClassProperties(self::$phpcsFile, $class);
Expand Down Expand Up @@ -147,6 +142,61 @@ public function dataGetClassProperties()
'readonly_token' => false,
],
],
'readonly' => [
'/* testReadonlyClass */',
[
'is_abstract' => false,
'abstract_token' => false,
'is_final' => false,
'final_token' => false,
'is_readonly' => true,
'readonly_token' => -2,
],
],
'final-readonly' => [
'/* testFinalReadonlyClass */',
[
'is_abstract' => false,
'abstract_token' => false,
'is_final' => true,
'final_token' => -4,
'is_readonly' => true,
'readonly_token' => -2,
],
],
'readonly-final' => [
'/* testReadonlyFinalClass */',
[
'is_abstract' => false,
'abstract_token' => false,
'is_final' => true,
'final_token' => -2,
'is_readonly' => true,
'readonly_token' => -6,
],
],
'abstract-readonly' => [
'/* testAbstractReadonlyClass */',
[
'is_abstract' => true,
'abstract_token' => -4,
'is_final' => false,
'final_token' => false,
'is_readonly' => true,
'readonly_token' => -2,
],
],
'readonly-abstract' => [
'/* testReadonlyAbstractClass */',
[
'is_abstract' => true,
'abstract_token' => -2,
'is_final' => false,
'final_token' => false,
'is_readonly' => true,
'readonly_token' => -4,
],
],
'comments-and-new-lines' => [
'/* testWithCommentsAndNewLines */',
[
Expand Down
17 changes: 0 additions & 17 deletions Tests/Utils/ObjectDeclarations/GetClassPropertiesDiffTest.inc
Expand Up @@ -16,20 +16,3 @@ final
* @phpcs:disable Standard.Cat.SniffName -- Just because.
*/
class ClassWithModifierBeforeDocblock {}

/* testReadonlyClass */
readonly class ReadOnlyClass {}

/* testFinalReadonlyClass */
final readonly class FinalReadOnlyClass extends Foo {}

/* testReadonlyFinalClass */
readonly /*comment*/ final class ReadOnlyFinalClass {}

/* testAbstractReadonlyClass */
abstract readonly class AbstractReadOnlyClass {}

/* testReadonlyAbstractClass */
readonly
abstract
class ReadOnlyAbstractClass {}
55 changes: 0 additions & 55 deletions Tests/Utils/ObjectDeclarations/GetClassPropertiesDiffTest.php
Expand Up @@ -101,61 +101,6 @@ public function dataGetClassProperties()
'readonly_token' => false,
],
],
'readonly' => [
'/* testReadonlyClass */',
[
'is_abstract' => false,
'abstract_token' => false,
'is_final' => false,
'final_token' => false,
'is_readonly' => true,
'readonly_token' => -2,
],
],
'final-readonly' => [
'/* testFinalReadonlyClass */',
[
'is_abstract' => false,
'abstract_token' => false,
'is_final' => true,
'final_token' => -4,
'is_readonly' => true,
'readonly_token' => -2,
],
],
'readonly-final' => [
'/* testReadonlyFinalClass */',
[
'is_abstract' => false,
'abstract_token' => false,
'is_final' => true,
'final_token' => -2,
'is_readonly' => true,
'readonly_token' => -6,
],
],
'abstract-readonly' => [
'/* testAbstractReadonlyClass */',
[
'is_abstract' => true,
'abstract_token' => -4,
'is_final' => false,
'final_token' => false,
'is_readonly' => true,
'readonly_token' => -2,
],
],
'readonly-abstract' => [
'/* testReadonlyAbstractClass */',
[
'is_abstract' => true,
'abstract_token' => -2,
'is_final' => false,
'final_token' => false,
'is_readonly' => true,
'readonly_token' => -4,
],
],
];
}
}

0 comments on commit d968203

Please sign in to comment.