From ed88362e081d8594630921f8c238e0d11fa90963 Mon Sep 17 00:00:00 2001 From: jrfnl Date: Tue, 12 Aug 2025 04:00:24 +0200 Subject: [PATCH 1/3] Composer: raise the minimum supported PHPCS version to 3.13.3 ... to benefit from tokenizer support for PHP 8.4 abstract properties. Includes updating references to the PHPCS version whenever relevant throughout the codebase. --- PHPCSUtils/BackCompat/BCFile.php | 16 ++++++++-------- PHPCSUtils/BackCompat/BCTokens.php | 2 +- README.md | 4 ++-- Tests/BackCompat/Helper/GetVersionTest.php | 4 ++-- composer.json | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/PHPCSUtils/BackCompat/BCFile.php b/PHPCSUtils/BackCompat/BCFile.php index 4a786015..ddbc0a8c 100644 --- a/PHPCSUtils/BackCompat/BCFile.php +++ b/PHPCSUtils/BackCompat/BCFile.php @@ -524,7 +524,7 @@ public static function getMethodParameters(File $phpcsFile, $stackPtr) * * Changelog for the PHPCS native function: * - Introduced in PHPCS 0.0.5. - * - The upstream method has received no significant updates since PHPCS 3.13.0. + * - The upstream method has received no significant updates since PHPCS 3.13.3. * * @see \PHP_CodeSniffer\Files\File::getMethodProperties() Original source. * @see \PHPCSUtils\Utils\FunctionDeclarations::getProperties() PHPCSUtils native improved version. @@ -751,7 +751,7 @@ public static function getMemberProperties(File $phpcsFile, $stackPtr) * * Changelog for the PHPCS native function: * - Introduced in PHPCS 1.3.0. - * - The upstream method has received no significant updates since PHPCS 3.13.0. + * - The upstream method has received no significant updates since PHPCS 3.13.3. * * @see \PHP_CodeSniffer\Files\File::getClassProperties() Original source. * @see \PHPCSUtils\Utils\ObjectDeclarations::getClassProperties() PHPCSUtils native improved version. @@ -779,7 +779,7 @@ public static function getClassProperties(File $phpcsFile, $stackPtr) * * Changelog for the PHPCS native function: * - Introduced in PHPCS 0.0.5. - * - The upstream method has received no significant updates since PHPCS 3.13.0. + * - The upstream method has received no significant updates since PHPCS 3.13.3. * * @see \PHP_CodeSniffer\Files\File::isReference() Original source. * @see \PHPCSUtils\Utils\Operators::isReference() PHPCSUtils native improved version. @@ -805,7 +805,7 @@ public static function isReference(File $phpcsFile, $stackPtr) * * Changelog for the PHPCS native function: * - Introduced in PHPCS 0.0.5. - * - The upstream method has received no significant updates since PHPCS 3.13.0. + * - The upstream method has received no significant updates since PHPCS 3.13.3. * * @see \PHP_CodeSniffer\Files\File::getTokensAsString() Original source. * @see \PHPCSUtils\Utils\GetTokensAsString Related set of functions. @@ -834,7 +834,7 @@ public static function getTokensAsString(File $phpcsFile, $start, $length, $orig * * Changelog for the PHPCS native function: * - Introduced in PHPCS 2.1.0. - * - The upstream method has received no significant updates since PHPCS 3.13.0. + * - The upstream method has received no significant updates since PHPCS 3.13.3. * * @see \PHP_CodeSniffer\Files\File::findStartOfStatement() Original source. * @@ -858,7 +858,7 @@ public static function findStartOfStatement(File $phpcsFile, $start, $ignore = n * * Changelog for the PHPCS native function: * - Introduced in PHPCS 2.1.0. - * - The upstream method has received no significant updates since PHPCS 3.13.0. + * - The upstream method has received no significant updates since PHPCS 3.13.3. * * @see \PHP_CodeSniffer\Files\File::findEndOfStatement() Original source. * @@ -882,7 +882,7 @@ public static function findEndOfStatement(File $phpcsFile, $start, $ignore = nul * * Changelog for the PHPCS native function: * - Introduced in PHPCS 0.0.5. - * - The upstream method has received no significant updates since PHPCS 3.13.0. + * - The upstream method has received no significant updates since PHPCS 3.13.3. * * @see \PHP_CodeSniffer\Files\File::hasCondition() Original source. * @see \PHPCSUtils\Utils\Conditions::hasCondition() PHPCSUtils native alternative. @@ -907,7 +907,7 @@ public static function hasCondition(File $phpcsFile, $stackPtr, $types) * * Changelog for the PHPCS native function: * - Introduced in PHPCS 1.3.0. - * - The upstream method has received no significant updates since PHPCS 3.13.0. + * - The upstream method has received no significant updates since PHPCS 3.13.3. * * @see \PHP_CodeSniffer\Files\File::getCondition() Original source. * @see \PHPCSUtils\Utils\Conditions::getCondition() More versatile alternative. diff --git a/PHPCSUtils/BackCompat/BCTokens.php b/PHPCSUtils/BackCompat/BCTokens.php index 49b8c155..68102588 100644 --- a/PHPCSUtils/BackCompat/BCTokens.php +++ b/PHPCSUtils/BackCompat/BCTokens.php @@ -72,7 +72,7 @@ final class BCTokens /** * Handle calls to (undeclared) methods for token arrays which haven't received any - * changes since PHPCS 3.13.0. + * changes since PHPCS 3.13.3. * * @since 1.0.0 * diff --git a/README.md b/README.md index 09d034ff..d1096462 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ Whether you need to split an `array` into the individual items, are trying to de Includes improved versions of the PHPCS native utility functions and plenty of new utility functions. -These functions are compatible with PHPCS 3.13.0 up to PHPCS `4.x`. +These functions are compatible with PHPCS 3.13.3 up to PHPCS `4.x`. ### A collection of static properties and methods for often-used token groups @@ -78,7 +78,7 @@ To see detailed information about all the available abstract sniffs, utility fun ## Minimum Requirements * PHP 5.4 or higher. -* [PHP_CodeSniffer] 3.13.0+/4.0.0+. +* [PHP_CodeSniffer] 3.13.3+/4.0.0+. * Recommended PHP extensions for optimal functionality: - PCRE with Unicode support (normally enabled by default) diff --git a/Tests/BackCompat/Helper/GetVersionTest.php b/Tests/BackCompat/Helper/GetVersionTest.php index 9a05b9d3..b6bf7804 100644 --- a/Tests/BackCompat/Helper/GetVersionTest.php +++ b/Tests/BackCompat/Helper/GetVersionTest.php @@ -30,7 +30,7 @@ final class GetVersionTest extends TestCase * * @var string */ - const LATEST_3X_VERSION = '3.13.2'; + const LATEST_3X_VERSION = '3.13.3'; /** * Version number of the last PHPCS 4.x release. @@ -56,7 +56,7 @@ public function testGetVersion() } if ($expected === 'lowest') { - $expected = '3.13.0'; + $expected = '3.13.3'; } $result = Helper::getVersion(); diff --git a/composer.json b/composer.json index 7fd8d7be..5155061e 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,7 @@ }, "require" : { "php" : ">=5.4", - "squizlabs/php_codesniffer" : "^3.13.0 || ^4.0", + "squizlabs/php_codesniffer" : "^3.13.3 || ^4.0", "dealerdirect/phpcodesniffer-composer-installer" : "^0.4.1 || ^0.5 || ^0.6.2 || ^0.7 || ^1.0" }, "require-dev" : { From a1b8177a05b018251213caace8fde69d585e2c5d Mon Sep 17 00:00:00 2001 From: jrfnl Date: Mon, 11 Aug 2025 17:33:26 +0200 Subject: [PATCH 2/3] PHP 8.4 | Tokens/Collections::$propertyModifierKeywords: allow for "abstract" modifier keyword --- PHPCSUtils/Tokens/Collections.php | 1 + 1 file changed, 1 insertion(+) diff --git a/PHPCSUtils/Tokens/Collections.php b/PHPCSUtils/Tokens/Collections.php index 5cfada12..43288eec 100644 --- a/PHPCSUtils/Tokens/Collections.php +++ b/PHPCSUtils/Tokens/Collections.php @@ -478,6 +478,7 @@ final class Collections \T_VAR => \T_VAR, \T_READONLY => \T_READONLY, \T_FINAL => \T_FINAL, + \T_ABSTRACT => \T_ABSTRACT, ]; /** From f8203a86d552ffd69cf21fe497ccf143be2061bc Mon Sep 17 00:00:00 2001 From: jrfnl Date: Mon, 11 Aug 2025 17:34:57 +0200 Subject: [PATCH 3/3] PHP 8.4 | BCFile|Variables::getMemberProperties(): sync with PHPCS 3.13.3 / handle abstract properties Refs: * https://wiki.php.net/rfc/property-hooks#abstract_properties * PHPCSStandards/PHP_CodeSniffer 1184 --- PHPCSUtils/BackCompat/BCFile.php | 10 + PHPCSUtils/Utils/Variables.php | 6 + .../BCFile/GetMemberPropertiesTest.inc | 24 ++ .../BCFile/GetMemberPropertiesTest.php | 261 ++++++++++++++++++ 4 files changed, 301 insertions(+) diff --git a/PHPCSUtils/BackCompat/BCFile.php b/PHPCSUtils/BackCompat/BCFile.php index ddbc0a8c..dfdd98c7 100644 --- a/PHPCSUtils/BackCompat/BCFile.php +++ b/PHPCSUtils/BackCompat/BCFile.php @@ -559,6 +559,7 @@ public static function getMethodProperties(File $phpcsFile, $stackPtr) * 'is_static' => boolean, // TRUE if the static keyword was found. * 'is_readonly' => boolean, // TRUE if the readonly keyword was found. * 'is_final' => boolean, // TRUE if the final keyword was found. + * 'is_abstract' => boolean, // TRUE if the abstract keyword was found. * 'type' => string, // The type of the var (empty if no type specified). * 'type_token' => integer|false, // The stack pointer to the start of the type * // or FALSE if there is no type. @@ -573,6 +574,7 @@ public static function getMethodProperties(File $phpcsFile, $stackPtr) * * Changelog for the PHPCS native function: * - Introduced in PHPCS 0.0.5. + * - PHPCS 3.13.3: support for PHP 8.4 abstract properties. * - PHPCS 4.0: properties in interfaces (PHP 8.4+) are accepted. * - PHPCS 4.0: will no longer throw a parse error warning. * @@ -580,6 +582,8 @@ public static function getMethodProperties(File $phpcsFile, $stackPtr) * @see \PHPCSUtils\Utils\Variables::getMemberProperties() PHPCSUtils native improved version. * * @since 1.0.0 + * @since 1.1.0 Sync with PHPCS 4.0.0, remove parse error warning and support PHP 8.4 properties in interfaces. PHPCS(new)#991 + * @since 1.1.2 Sync with PHPCS 3.13.3, support for abstract properties. PHPCS(new)#xxx * * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. * @param int $stackPtr The position in the stack of the `T_VARIABLE` token to @@ -626,6 +630,7 @@ public static function getMemberProperties(File $phpcsFile, $stackPtr) T_VAR => T_VAR, T_READONLY => T_READONLY, T_FINAL => T_FINAL, + T_ABSTRACT => T_ABSTRACT, ]; $valid += Tokens::$scopeModifiers; @@ -637,6 +642,7 @@ public static function getMemberProperties(File $phpcsFile, $stackPtr) $isStatic = false; $isReadonly = false; $isFinal = false; + $isAbstract = false; $startOfStatement = $phpcsFile->findPrevious( [ @@ -684,6 +690,9 @@ public static function getMemberProperties(File $phpcsFile, $stackPtr) case T_FINAL: $isFinal = true; break; + case T_ABSTRACT: + $isAbstract = true; + break; } } @@ -728,6 +737,7 @@ public static function getMemberProperties(File $phpcsFile, $stackPtr) 'is_static' => $isStatic, 'is_readonly' => $isReadonly, 'is_final' => $isFinal, + 'is_abstract' => $isAbstract, 'type' => $type, 'type_token' => $typeToken, 'type_end_token' => $typeEndToken, diff --git a/PHPCSUtils/Utils/Variables.php b/PHPCSUtils/Utils/Variables.php index 817134c4..b7469489 100644 --- a/PHPCSUtils/Utils/Variables.php +++ b/PHPCSUtils/Utils/Variables.php @@ -108,6 +108,7 @@ final class Variables * 'is_static' => boolean, // TRUE if the static keyword was found. * 'is_readonly' => boolean, // TRUE if the readonly keyword was found. * 'is_final' => boolean, // TRUE if the final keyword was found. + * 'is_abstract' => boolean, // TRUE if the abstract keyword was found. * 'type' => string, // The type of the var (empty if no type specified). * 'type_token' => integer|false, // The stack pointer to the start of the type * // or FALSE if there is no type. @@ -155,6 +156,7 @@ public static function getMemberProperties(File $phpcsFile, $stackPtr) $isStatic = false; $isReadonly = false; $isFinal = false; + $isAbstract = false; $startOfStatement = $phpcsFile->findPrevious( [ @@ -211,6 +213,9 @@ public static function getMemberProperties(File $phpcsFile, $stackPtr) case \T_FINAL: $isFinal = true; break; + case \T_ABSTRACT: + $isAbstract = true; + break; } } @@ -254,6 +259,7 @@ public static function getMemberProperties(File $phpcsFile, $stackPtr) 'is_static' => $isStatic, 'is_readonly' => $isReadonly, 'is_final' => $isFinal, + 'is_abstract' => $isAbstract, 'type' => $type, 'type_token' => $typeToken, 'type_end_token' => $typeEndToken, diff --git a/Tests/BackCompat/BCFile/GetMemberPropertiesTest.inc b/Tests/BackCompat/BCFile/GetMemberPropertiesTest.inc index ccc90fa6..3b27cbe2 100644 --- a/Tests/BackCompat/BCFile/GetMemberPropertiesTest.inc +++ b/Tests/BackCompat/BCFile/GetMemberPropertiesTest.inc @@ -401,3 +401,27 @@ class AsymVisibility { /* testPHP84IllegalAsymPublicProtectedSetStaticProperty */ public protected(set) static mixed $prop10; } + +abstract class WithAbstractProperties { + /* testPHP84AbstractPublicTypedProp */ + abstract public string $val1 { get; } + /* testPHP84AbstractProtectedTypedProp */ + abstract protected Union|Type $val2 { set; } + /* testPHP84AbstractMiddleTypedProp */ + public abstract Intersection&Type $val3 { get; } + /* testPHP84AbstractImplicitVisibilityTypedProp */ + abstract int $val4 { set; } + /* testPHP84AbstractImplicitVisibilityProp */ + abstract $val5 { get; } + /* testPHP84AbstractNullableTypedProp */ + abstract public ?string $val6 { set; } + /* testPHP84AbstractComplexTypedProp */ + abstract protected (Foo&\Bar)|false $val7 { get; } + + /* testPHP84IllegalAbstractPrivateProp */ + private abstract string $val8 { get; } + /* testPHP84IllegalAbstractReadonlyProp */ + public readonly abstract string $val9 { get; } + /* testPHP84IllegalAbstractStaticProp */ + public abstract static string $val10 { get; } +} diff --git a/Tests/BackCompat/BCFile/GetMemberPropertiesTest.php b/Tests/BackCompat/BCFile/GetMemberPropertiesTest.php index 31e9516b..81321a2e 100644 --- a/Tests/BackCompat/BCFile/GetMemberPropertiesTest.php +++ b/Tests/BackCompat/BCFile/GetMemberPropertiesTest.php @@ -99,6 +99,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -114,6 +115,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '?int', 'type_token' => -2, 'type_end_token' => -2, @@ -129,6 +131,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -144,6 +147,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'string', 'type_token' => -2, 'type_end_token' => -2, @@ -159,6 +163,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -174,6 +179,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'bool', 'type_token' => -2, 'type_end_token' => -2, @@ -189,6 +195,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -204,6 +211,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'array', 'type_token' => -2, 'type_end_token' => -2, @@ -219,6 +227,7 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -234,6 +243,7 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '?string', 'type_token' => -2, 'type_end_token' => -2, @@ -249,6 +259,7 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -264,6 +275,7 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -279,6 +291,7 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -294,6 +307,7 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -309,6 +323,7 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -324,6 +339,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -339,6 +355,7 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -354,6 +371,7 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -369,6 +387,7 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -384,6 +403,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'float', 'type_token' => -6, 'type_end_token' => -6, @@ -399,6 +419,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'float', 'type_token' => -13, 'type_end_token' => -13, @@ -414,6 +435,7 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '?string', 'type_token' => -6, 'type_end_token' => -6, @@ -429,6 +451,7 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '?string', 'type_token' => -17, 'type_end_token' => -17, @@ -444,6 +467,7 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -459,6 +483,7 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -474,6 +499,7 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -489,6 +515,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -504,6 +531,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -519,6 +547,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -534,6 +563,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -549,6 +579,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -564,6 +595,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -579,6 +611,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -594,6 +627,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '?array', 'type_token' => -2, 'type_end_token' => -2, @@ -609,6 +643,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '\MyNamespace\MyClass', 'type_token' => ($php8Names === true) ? -2 : -5, 'type_end_token' => -2, @@ -624,6 +659,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '?ClassName', 'type_token' => -2, 'type_end_token' => -2, @@ -639,6 +675,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '?Folder\ClassName', 'type_token' => ($php8Names === true) ? -2 : -4, 'type_end_token' => -2, @@ -654,6 +691,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '\MyNamespace\MyClass\Foo', 'type_token' => ($php8Names === true) ? -15 : -18, 'type_end_token' => -2, @@ -669,6 +707,7 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -684,6 +723,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -699,6 +739,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -714,6 +755,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -729,6 +771,7 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'miXed', 'type_token' => -2, 'type_end_token' => -2, @@ -744,6 +787,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '?mixed', 'type_token' => -2, 'type_end_token' => -2, @@ -759,6 +803,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '?namespace\Name', 'type_token' => ($php8Names === true) ? -2 : -4, 'type_end_token' => -2, @@ -774,6 +819,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'int|float', 'type_token' => -4, 'type_end_token' => -2, @@ -789,6 +835,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'MyClassA|\Package\MyClassB', 'type_token' => ($php8Names === true) ? -4 : -7, 'type_end_token' => -2, @@ -804,6 +851,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'array|bool|int|float|NULL|object|string', 'type_token' => -14, 'type_end_token' => -2, @@ -819,6 +867,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'false|mixed|self|parent|iterable|Resource', 'type_token' => -12, 'type_end_token' => -2, @@ -834,6 +883,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, // Missing static, but that's OK as not an allowed syntax. 'type' => 'callable|void', 'type_token' => -6, @@ -850,6 +900,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '?int|float', 'type_token' => -4, 'type_end_token' => -2, @@ -865,6 +916,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'null', 'type_token' => -2, 'type_end_token' => -2, @@ -880,6 +932,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'false', 'type_token' => -2, 'type_end_token' => -2, @@ -895,6 +948,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'bool|FALSE', 'type_token' => -4, 'type_end_token' => -2, @@ -910,6 +964,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'object|ClassName', 'type_token' => -4, 'type_end_token' => -2, @@ -925,6 +980,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'iterable|array|Traversable', 'type_token' => -6, 'type_end_token' => -2, @@ -940,6 +996,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'int|string|INT', 'type_token' => -10, 'type_end_token' => -2, @@ -955,6 +1012,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => true, 'is_final' => false, + 'is_abstract' => false, 'type' => 'int', 'type_token' => -2, 'type_end_token' => -2, @@ -970,6 +1028,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => true, 'is_final' => false, + 'is_abstract' => false, 'type' => '?array', 'type_token' => -2, 'type_end_token' => -2, @@ -985,6 +1044,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => true, 'is_final' => false, + 'is_abstract' => false, 'type' => 'string|int', 'type_token' => -4, 'type_end_token' => -2, @@ -1000,6 +1060,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => true, 'is_final' => false, + 'is_abstract' => false, 'type' => 'string|null', 'type_token' => -4, 'type_end_token' => -2, @@ -1015,6 +1076,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => true, 'is_final' => false, + 'is_abstract' => false, 'type' => 'string|int', 'type_token' => -4, 'type_end_token' => -2, @@ -1030,6 +1092,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => true, 'is_final' => false, + 'is_abstract' => false, 'type' => '\InterfaceA|\Sub\InterfaceB|false', 'type_token' => ($php8Names === true) ? -7 : -11, 'type_end_token' => -3, @@ -1045,6 +1108,7 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => true, 'is_final' => false, + 'is_abstract' => false, 'type' => '?string', 'type_token' => -2, 'type_end_token' => -2, @@ -1060,6 +1124,7 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => true, 'is_final' => false, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -1075,6 +1140,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'string', 'type_token' => -2, 'type_end_token' => -2, @@ -1090,6 +1156,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '?int|float', 'type_token' => -4, 'type_end_token' => -2, @@ -1105,6 +1172,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'mixed', 'type_token' => -2, 'type_end_token' => -2, @@ -1120,6 +1188,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'Foo&Bar', 'type_token' => -4, 'type_end_token' => -2, @@ -1135,6 +1204,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'Foo&Bar&Baz', 'type_token' => -6, 'type_end_token' => -2, @@ -1150,6 +1220,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'int&string', 'type_token' => -4, 'type_end_token' => -2, @@ -1165,6 +1236,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '?Foo&Bar', 'type_token' => -4, 'type_end_token' => -2, @@ -1181,6 +1253,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'int|string', 'type_token' => -8, 'type_end_token' => -2, @@ -1196,6 +1269,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '\Foo&Bar', 'type_token' => ($php8Names === true) ? -8 : -9, 'type_end_token' => -2, @@ -1211,6 +1285,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'true', 'type_token' => -2, 'type_end_token' => -2, @@ -1226,6 +1301,7 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '?true', 'type_token' => -2, 'type_end_token' => -2, @@ -1241,6 +1317,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'int|string|true', 'type_token' => -6, 'type_end_token' => -2, @@ -1256,6 +1333,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => true, 'is_final' => false, + 'is_abstract' => false, 'type' => 'true|FALSE', 'type_token' => -4, 'type_end_token' => -2, @@ -1272,6 +1350,7 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '(Foo&\Bar)|bool', 'type_token' => ($php8Names === true) ? -8 : -9, 'type_end_token' => -2, @@ -1287,6 +1366,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => true, 'is_final' => false, + 'is_abstract' => false, 'type' => 'float|(Partially\Qualified&Traversable)', 'type_token' => ($php8Names === true) ? -8 : -10, 'type_end_token' => -2, @@ -1302,6 +1382,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => true, 'is_final' => false, + 'is_abstract' => false, 'type' => '(namespace\Foo&Bar)|string', 'type_token' => ($php8Names === true) ? -8 : -10, 'type_end_token' => -2, @@ -1317,6 +1398,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '?(A&\Pck\B)|bool', 'type_token' => ($php8Names === true) ? -8 : -11, 'type_end_token' => -2, @@ -1332,6 +1414,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => true, + 'is_abstract' => false, 'type' => 'string', 'type_token' => -2, 'type_end_token' => -2, @@ -1347,6 +1430,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => true, + 'is_abstract' => false, 'type' => 'string', 'type_token' => -2, 'type_end_token' => -2, @@ -1362,6 +1446,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => true, + 'is_abstract' => false, 'type' => 'string', 'type_token' => -2, 'type_end_token' => -2, @@ -1377,6 +1462,7 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => false, 'is_final' => true, + 'is_abstract' => false, 'type' => 'string', 'type_token' => -2, 'type_end_token' => -2, @@ -1392,6 +1478,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => true, 'is_final' => true, + 'is_abstract' => false, 'type' => 'string', 'type_token' => -2, 'type_end_token' => -2, @@ -1407,6 +1494,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => true, + 'is_abstract' => false, 'type' => 'string', 'type_token' => -2, 'type_end_token' => -2, @@ -1422,6 +1510,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => true, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -1437,6 +1526,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => true, + 'is_abstract' => false, 'type' => '?string', 'type_token' => -2, 'type_end_token' => -2, @@ -1452,6 +1542,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => true, + 'is_abstract' => false, 'type' => '(Foo&\Bar)|bool', 'type_token' => ($php8Names === true) ? -8 : -9, 'type_end_token' => -2, @@ -1468,6 +1559,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'mixed', 'type_token' => -2, 'type_end_token' => -2, @@ -1483,6 +1575,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '(A&B)|null', 'type_token' => -8, 'type_end_token' => -2, @@ -1498,6 +1591,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'bool', 'type_token' => -2, 'type_end_token' => -2, @@ -1513,6 +1607,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => true, 'is_final' => false, + 'is_abstract' => false, 'type' => 'mixed', 'type_token' => -2, 'type_end_token' => -2, @@ -1528,6 +1623,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'string', 'type_token' => -2, 'type_end_token' => -2, @@ -1543,6 +1639,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '?float', 'type_token' => -2, 'type_end_token' => -2, @@ -1558,6 +1655,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'string|int', 'type_token' => -4, 'type_end_token' => -2, @@ -1573,6 +1671,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => true, + 'is_abstract' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -1588,6 +1687,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'mixed', 'type_token' => -2, 'type_end_token' => -2, @@ -1603,12 +1703,173 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'mixed', 'type_token' => -2, 'type_end_token' => -2, 'nullable_type' => false, ], ], + 'php8.4-abstract-public-property' => [ + 'identifier' => '/* testPHP84AbstractPublicTypedProp */', + 'expected' => [ + 'scope' => 'public', + 'scope_specified' => true, + 'set_scope' => false, + 'is_static' => false, + 'is_readonly' => false, + 'is_final' => false, + 'is_abstract' => true, + 'type' => 'string', + 'type_token' => -2, + 'type_end_token' => -2, + 'nullable_type' => false, + ], + ], + 'php8.4-abstract-protected-property' => [ + 'identifier' => '/* testPHP84AbstractProtectedTypedProp */', + 'expected' => [ + 'scope' => 'protected', + 'scope_specified' => true, + 'set_scope' => false, + 'is_static' => false, + 'is_readonly' => false, + 'is_final' => false, + 'is_abstract' => true, + 'type' => 'Union|Type', + 'type_token' => -4, + 'type_end_token' => -2, + 'nullable_type' => false, + ], + ], + 'php8.4-abstract-middle-keyword-property' => [ + 'identifier' => '/* testPHP84AbstractMiddleTypedProp */', + 'expected' => [ + 'scope' => 'public', + 'scope_specified' => true, + 'set_scope' => false, + 'is_static' => false, + 'is_readonly' => false, + 'is_final' => false, + 'is_abstract' => true, + 'type' => 'Intersection&Type', + 'type_token' => -4, + 'type_end_token' => -2, + 'nullable_type' => false, + ], + ], + 'php8.4-abstract-implicit-public-typed-property' => [ + 'identifier' => '/* testPHP84AbstractImplicitVisibilityTypedProp */', + 'expected' => [ + 'scope' => 'public', + 'scope_specified' => false, + 'set_scope' => false, + 'is_static' => false, + 'is_readonly' => false, + 'is_final' => false, + 'is_abstract' => true, + 'type' => 'int', + 'type_token' => -2, + 'type_end_token' => -2, + 'nullable_type' => false, + ], + ], + 'php8.4-abstract-implicit-public-untyped-property' => [ + 'identifier' => '/* testPHP84AbstractImplicitVisibilityProp */', + 'expected' => [ + 'scope' => 'public', + 'scope_specified' => false, + 'set_scope' => false, + 'is_static' => false, + 'is_readonly' => false, + 'is_final' => false, + 'is_abstract' => true, + 'type' => '', + 'type_token' => false, + 'type_end_token' => false, + 'nullable_type' => false, + ], + ], + 'php8.4-abstract-public-nullable-typed-property' => [ + 'identifier' => '/* testPHP84AbstractNullableTypedProp */', + 'expected' => [ + 'scope' => 'public', + 'scope_specified' => true, + 'set_scope' => false, + 'is_static' => false, + 'is_readonly' => false, + 'is_final' => false, + 'is_abstract' => true, + 'type' => '?string', + 'type_token' => -2, + 'type_end_token' => -2, + 'nullable_type' => true, + ], + ], + 'php8.4-abstract-protected-complex-type-property' => [ + 'identifier' => '/* testPHP84AbstractComplexTypedProp */', + 'expected' => [ + 'scope' => 'protected', + 'scope_specified' => true, + 'set_scope' => false, + 'is_static' => false, + 'is_readonly' => false, + 'is_final' => false, + 'is_abstract' => true, + 'type' => '(Foo&\Bar)|false', + 'type_token' => ($php8Names === true) ? -8 : -9, + 'type_end_token' => -2, + 'nullable_type' => false, + ], + ], + 'php8.4-illegal-abstract-private-property' => [ + 'identifier' => '/* testPHP84IllegalAbstractPrivateProp */', + 'expected' => [ + 'scope' => 'private', + 'scope_specified' => true, + 'set_scope' => false, + 'is_static' => false, + 'is_readonly' => false, + 'is_final' => false, + 'is_abstract' => true, + 'type' => 'string', + 'type_token' => -2, + 'type_end_token' => -2, + 'nullable_type' => false, + ], + ], + 'php8.4-illegal-abstract-readonly-property' => [ + 'identifier' => '/* testPHP84IllegalAbstractReadonlyProp */', + 'expected' => [ + 'scope' => 'public', + 'scope_specified' => true, + 'set_scope' => false, + 'is_static' => false, + 'is_readonly' => true, + 'is_final' => false, + 'is_abstract' => true, + 'type' => 'string', + 'type_token' => -2, + 'type_end_token' => -2, + 'nullable_type' => false, + ], + ], + 'php8.4-illegal-abstract-static-property' => [ + 'identifier' => '/* testPHP84IllegalAbstractStaticProp */', + 'expected' => [ + 'scope' => 'public', + 'scope_specified' => true, + 'set_scope' => false, + 'is_static' => true, + 'is_readonly' => false, + 'is_final' => false, + 'is_abstract' => true, + 'type' => 'string', + 'type_token' => -2, + 'type_end_token' => -2, + 'nullable_type' => false, + ], + ], ]; }