From 3bf028edb66abcb2ec93a0de0d335c4214fe8db8 Mon Sep 17 00:00:00 2001 From: jrfnl Date: Mon, 11 Aug 2025 17:46:43 +0200 Subject: [PATCH] PHP 8.4 | File::getMemberProperties(): add support for `abstract` properties Ref: https://wiki.php.net/rfc/property-hooks#abstract_properties --- src/Files/File.php | 7 + .../Files/File/GetMemberPropertiesTest.inc | 24 ++ .../Files/File/GetMemberPropertiesTest.php | 260 ++++++++++++++++++ 3 files changed, 291 insertions(+) diff --git a/src/Files/File.php b/src/Files/File.php index fe3b7b1c66..1a63437ea4 100644 --- a/src/Files/File.php +++ b/src/Files/File.php @@ -1851,6 +1851,7 @@ public function getMethodProperties($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. @@ -1921,6 +1922,7 @@ public function getMemberProperties($stackPtr) T_VAR => T_VAR, T_READONLY => T_READONLY, T_FINAL => T_FINAL, + T_ABSTRACT => T_ABSTRACT, ]; $valid += Tokens::$scopeModifiers; @@ -1932,6 +1934,7 @@ public function getMemberProperties($stackPtr) $isStatic = false; $isReadonly = false; $isFinal = false; + $isAbstract = false; $startOfStatement = $this->findPrevious( [ @@ -1979,6 +1982,9 @@ public function getMemberProperties($stackPtr) case T_FINAL: $isFinal = true; break; + case T_ABSTRACT: + $isAbstract = true; + break; }//end switch }//end for @@ -2037,6 +2043,7 @@ public function getMemberProperties($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/Core/Files/File/GetMemberPropertiesTest.inc b/tests/Core/Files/File/GetMemberPropertiesTest.inc index b5fcea9406..2f3699e710 100644 --- a/tests/Core/Files/File/GetMemberPropertiesTest.inc +++ b/tests/Core/Files/File/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/Core/Files/File/GetMemberPropertiesTest.php b/tests/Core/Files/File/GetMemberPropertiesTest.php index 3c218911b2..adb44d4652 100644 --- a/tests/Core/Files/File/GetMemberPropertiesTest.php +++ b/tests/Core/Files/File/GetMemberPropertiesTest.php @@ -72,6 +72,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, @@ -87,6 +88,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, @@ -102,6 +104,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, @@ -117,6 +120,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, @@ -132,6 +136,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, @@ -147,6 +152,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, @@ -162,6 +168,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, @@ -177,6 +184,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, @@ -192,6 +200,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, @@ -207,6 +216,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, @@ -222,6 +232,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, @@ -237,6 +248,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, @@ -252,6 +264,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, @@ -267,6 +280,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, @@ -282,6 +296,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, @@ -297,6 +312,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, @@ -312,6 +328,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, @@ -327,6 +344,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, @@ -342,6 +360,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, @@ -357,6 +376,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, @@ -372,6 +392,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, @@ -387,6 +408,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, @@ -402,6 +424,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, @@ -417,6 +440,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, @@ -432,6 +456,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, @@ -447,6 +472,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, @@ -462,6 +488,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, @@ -477,6 +504,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, @@ -492,6 +520,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, @@ -507,6 +536,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, @@ -522,6 +552,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, @@ -537,6 +568,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, @@ -552,6 +584,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, @@ -567,6 +600,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, @@ -582,6 +616,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '\MyNamespace\MyClass', 'type_token' => -5, 'type_end_token' => -2, @@ -597,6 +632,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, @@ -612,6 +648,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '?Folder\ClassName', 'type_token' => -4, 'type_end_token' => -2, @@ -627,6 +664,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '\MyNamespace\MyClass\Foo', 'type_token' => -18, 'type_end_token' => -2, @@ -642,6 +680,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, @@ -661,6 +700,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, @@ -676,6 +716,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, @@ -691,6 +732,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, @@ -706,6 +748,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, @@ -721,6 +764,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '?namespace\Name', 'type_token' => -4, 'type_end_token' => -2, @@ -736,6 +780,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, @@ -751,6 +796,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => 'MyClassA|\Package\MyClassB', 'type_token' => -7, 'type_end_token' => -2, @@ -766,6 +812,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, @@ -781,6 +828,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, @@ -796,6 +844,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' => -4, @@ -812,6 +861,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, @@ -827,6 +877,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, @@ -842,6 +893,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, @@ -857,6 +909,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, @@ -872,6 +925,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, @@ -887,6 +941,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, @@ -902,6 +957,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, @@ -917,6 +973,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, @@ -932,6 +989,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, @@ -947,6 +1005,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, @@ -962,6 +1021,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, @@ -977,6 +1037,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, @@ -992,6 +1053,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => true, 'is_final' => false, + 'is_abstract' => false, 'type' => '\InterfaceA|\Sub\InterfaceB|false', 'type_token' => -11, 'type_end_token' => -3, @@ -1007,6 +1069,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, @@ -1022,6 +1085,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, @@ -1037,6 +1101,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, @@ -1052,6 +1117,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, @@ -1067,6 +1133,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, @@ -1086,6 +1153,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, @@ -1101,6 +1169,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, @@ -1116,6 +1185,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, @@ -1131,6 +1201,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, @@ -1147,6 +1218,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, @@ -1162,6 +1234,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '\Foo&Bar', 'type_token' => -9, 'type_end_token' => -2, @@ -1177,6 +1250,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, @@ -1192,6 +1266,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, @@ -1207,6 +1282,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, @@ -1222,6 +1298,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, @@ -1238,6 +1315,7 @@ public static function dataGetMemberProperties() 'is_static' => true, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '(Foo&\Bar)|bool', 'type_token' => -9, 'type_end_token' => -2, @@ -1253,6 +1331,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => true, 'is_final' => false, + 'is_abstract' => false, 'type' => 'float|(Partially\Qualified&Traversable)', 'type_token' => -10, 'type_end_token' => -2, @@ -1268,6 +1347,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => true, 'is_final' => false, + 'is_abstract' => false, 'type' => '(namespace\Foo&Bar)|string', 'type_token' => -10, 'type_end_token' => -2, @@ -1283,6 +1363,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => false, + 'is_abstract' => false, 'type' => '?(A&\Pck\B)|bool', 'type_token' => -11, 'type_end_token' => -2, @@ -1298,6 +1379,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, @@ -1313,6 +1395,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, @@ -1328,6 +1411,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, @@ -1343,6 +1427,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, @@ -1358,6 +1443,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, @@ -1373,6 +1459,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, @@ -1388,6 +1475,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, @@ -1403,6 +1491,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, @@ -1418,6 +1507,7 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => true, + 'is_abstract' => false, 'type' => '(Foo&\Bar)|bool', 'type_token' => -9, 'type_end_token' => -2, @@ -1434,6 +1524,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, @@ -1449,6 +1540,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, @@ -1464,6 +1556,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, @@ -1479,6 +1572,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, @@ -1494,6 +1588,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, @@ -1509,6 +1604,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, @@ -1524,6 +1620,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, @@ -1539,6 +1636,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, @@ -1554,6 +1652,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, @@ -1569,12 +1668,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' => -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, + ], + ], ]; }//end dataGetMemberProperties()