diff --git a/tests/Core/File/GetMemberPropertiesTest.inc b/tests/Core/File/GetMemberPropertiesTest.inc index 441bd97772..f69a685ecf 100644 --- a/tests/Core/File/GetMemberPropertiesTest.inc +++ b/tests/Core/File/GetMemberPropertiesTest.inc @@ -39,7 +39,10 @@ class TestMemberProperties var static $varG = true; /* testPublicStatic */ - public static $varH = true; + public // comment + // phpcs:ignore Stnd.Cat.Sniff -- For reasons. + static + $varH = true; /* testProtectedStatic */ static protected $varI = true; @@ -245,7 +248,7 @@ $anon = class() { public readonly int $readonly; /* testPHP81ReadonlyWithNullableType */ - public readonly ?array $array; + public readonly ?array $readonlyWithNullableType; /* testPHP81ReadonlyWithUnionType */ public readonly string|int $readonlyWithUnionType; @@ -255,6 +258,16 @@ $anon = class() { /* testPHP81OnlyReadonlyWithUnionType */ readonly string|int $onlyReadonly; + + /* testPHP81OnlyReadonlyWithUnionTypeMultiple */ + readonly \InterfaceA|\Sub\InterfaceB|false + $onlyReadonly; + + /* testPHP81ReadonlyAndStatic */ + readonly private static ?string $readonlyAndStatic; + + /* testPHP81ReadonlyMixedCase */ + public ReadONLY static $readonlyMixedCase; }; $anon = class { @@ -318,3 +331,11 @@ $anon = class() { // Intentional fatal error - Type contains both true and false, bool should be used instead, but that's not the concern of the method. readonly true|FALSE $pseudoTypeFalseAndTrue; }; + +class WhitespaceAndCommentsInTypes { + /* testUnionTypeWithWhitespaceAndComment */ + public int | /*comment*/ string $hasWhitespaceAndComment; + + /* testIntersectionTypeWithWhitespaceAndComment */ + public \Foo /*comment*/ & Bar $hasWhitespaceAndComment; +} diff --git a/tests/Core/File/GetMemberPropertiesTest.php b/tests/Core/File/GetMemberPropertiesTest.php index 36bf4d7d3e..24a170ae92 100644 --- a/tests/Core/File/GetMemberPropertiesTest.php +++ b/tests/Core/File/GetMemberPropertiesTest.php @@ -23,8 +23,8 @@ class GetMemberPropertiesTest extends AbstractMethodUnitTest /** * Test the getMemberProperties() method. * - * @param string $identifier Comment which precedes the test case. - * @param bool $expected Expected function output. + * @param string $identifier Comment which precedes the test case. + * @param array $expected Expected function output. * * @dataProvider dataGetMemberProperties * @@ -35,8 +35,14 @@ public function testGetMemberProperties($identifier, $expected) $variable = $this->getTargetToken($identifier, T_VARIABLE); $result = self::$phpcsFile->getMemberProperties($variable); - // Unset those indexes which are not being tested. - unset($result['type_token'], $result['type_end_token']); + // Convert offsets to absolute positions in the token stream. + if (isset($expected['type_token']) === true && is_int($expected['type_token']) === true) { + $expected['type_token'] += $variable; + } + + if (isset($expected['type_end_token']) === true && is_int($expected['type_end_token']) === true) { + $expected['type_end_token'] += $variable; + } $this->assertSame($expected, $result); @@ -46,810 +52,1025 @@ public function testGetMemberProperties($identifier, $expected) /** * Data provider for the GetMemberProperties test. * + * Note: the `expected - type_token` and `expected - type_end_token` indexes should + * contain either `false` (no type) or the _offset_ of the type start/end token in + * relation to the `T_VARIABLE` token which is passed to the getMemberProperties() method. + * * @see testGetMemberProperties() * - * @return array + * @return array>> */ public function dataGetMemberProperties() { return [ - [ - '/* testVar */', - [ + 'var-modifier' => [ + 'identifier' => '/* testVar */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => false, 'is_static' => false, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testVarType */', - [ + 'var-modifier-and-type' => [ + 'identifier' => '/* testVarType */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => false, 'is_static' => false, 'is_readonly' => false, 'type' => '?int', + 'type_token' => -2, + 'type_end_token' => -2, 'nullable_type' => true, ], ], - [ - '/* testPublic */', - [ + 'public-modifier' => [ + 'identifier' => '/* testPublic */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testPublicType */', - [ + 'public-modifier-and-type' => [ + 'identifier' => '/* testPublicType */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => 'string', + 'type_token' => -2, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testProtected */', - [ + 'protected-modifier' => [ + 'identifier' => '/* testProtected */', + 'expected' => [ 'scope' => 'protected', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testProtectedType */', - [ + 'protected-modifier-and-type' => [ + 'identifier' => '/* testProtectedType */', + 'expected' => [ 'scope' => 'protected', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => 'bool', + 'type_token' => -2, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPrivate */', - [ + 'private-modifier' => [ + 'identifier' => '/* testPrivate */', + 'expected' => [ 'scope' => 'private', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testPrivateType */', - [ + 'private-modifier-and-type' => [ + 'identifier' => '/* testPrivateType */', + 'expected' => [ 'scope' => 'private', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => 'array', + 'type_token' => -2, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testStatic */', - [ + 'static-modifier' => [ + 'identifier' => '/* testStatic */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => false, 'is_static' => true, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testStaticType */', - [ + 'static-modifier-and-type' => [ + 'identifier' => '/* testStaticType */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => false, 'is_static' => true, 'is_readonly' => false, 'type' => '?string', + 'type_token' => -2, + 'type_end_token' => -2, 'nullable_type' => true, ], ], - [ - '/* testStaticVar */', - [ + 'static-and-var-modifier' => [ + 'identifier' => '/* testStaticVar */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => false, 'is_static' => true, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testVarStatic */', - [ + 'var-and-static-modifier' => [ + 'identifier' => '/* testVarStatic */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => false, 'is_static' => true, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testPublicStatic */', - [ + 'public-static-modifiers' => [ + 'identifier' => '/* testPublicStatic */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testProtectedStatic */', - [ + 'protected-static-modifiers' => [ + 'identifier' => '/* testProtectedStatic */', + 'expected' => [ 'scope' => 'protected', 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testPrivateStatic */', - [ + 'private-static-modifiers' => [ + 'identifier' => '/* testPrivateStatic */', + 'expected' => [ 'scope' => 'private', 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testNoPrefix */', - [ + 'no-modifier' => [ + 'identifier' => '/* testNoPrefix */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => false, 'is_static' => false, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testPublicStaticWithDocblock */', - [ + 'public-and-static-modifier-with-docblock' => [ + 'identifier' => '/* testPublicStaticWithDocblock */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testProtectedStaticWithDocblock */', - [ + 'protected-and-static-modifier-with-docblock' => [ + 'identifier' => '/* testProtectedStaticWithDocblock */', + 'expected' => [ 'scope' => 'protected', 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testPrivateStaticWithDocblock */', - [ + 'private-and-static-modifier-with-docblock' => [ + 'identifier' => '/* testPrivateStaticWithDocblock */', + 'expected' => [ 'scope' => 'private', 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testGroupType 1 */', - [ + 'property-group-simple-type-prop-1' => [ + 'identifier' => '/* testGroupType 1 */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => 'float', + 'type_token' => -6, + 'type_end_token' => -6, 'nullable_type' => false, ], ], - [ - '/* testGroupType 2 */', - [ + 'property-group-simple-type-prop-2' => [ + 'identifier' => '/* testGroupType 2 */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => 'float', + 'type_token' => -13, + 'type_end_token' => -13, 'nullable_type' => false, ], ], - [ - '/* testGroupNullableType 1 */', - [ + 'property-group-nullable-type-prop-1' => [ + 'identifier' => '/* testGroupNullableType 1 */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, 'type' => '?string', + 'type_token' => -6, + 'type_end_token' => -6, 'nullable_type' => true, ], ], - [ - '/* testGroupNullableType 2 */', - [ + 'property-group-nullable-type-prop-2' => [ + 'identifier' => '/* testGroupNullableType 2 */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, 'type' => '?string', + 'type_token' => -17, + 'type_end_token' => -17, 'nullable_type' => true, ], ], - [ - '/* testGroupProtectedStatic 1 */', - [ + 'property-group-protected-static-prop-1' => [ + 'identifier' => '/* testGroupProtectedStatic 1 */', + 'expected' => [ 'scope' => 'protected', 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testGroupProtectedStatic 2 */', - [ + 'property-group-protected-static-prop-2' => [ + 'identifier' => '/* testGroupProtectedStatic 2 */', + 'expected' => [ 'scope' => 'protected', 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testGroupProtectedStatic 3 */', - [ + 'property-group-protected-static-prop-3' => [ + 'identifier' => '/* testGroupProtectedStatic 3 */', + 'expected' => [ 'scope' => 'protected', 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testGroupPrivate 1 */', - [ + 'property-group-private-prop-1' => [ + 'identifier' => '/* testGroupPrivate 1 */', + 'expected' => [ 'scope' => 'private', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testGroupPrivate 2 */', - [ + 'property-group-private-prop-2' => [ + 'identifier' => '/* testGroupPrivate 2 */', + 'expected' => [ 'scope' => 'private', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testGroupPrivate 3 */', - [ + 'property-group-private-prop-3' => [ + 'identifier' => '/* testGroupPrivate 3 */', + 'expected' => [ 'scope' => 'private', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testGroupPrivate 4 */', - [ + 'property-group-private-prop-4' => [ + 'identifier' => '/* testGroupPrivate 4 */', + 'expected' => [ 'scope' => 'private', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testGroupPrivate 5 */', - [ + 'property-group-private-prop-5' => [ + 'identifier' => '/* testGroupPrivate 5 */', + 'expected' => [ 'scope' => 'private', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testGroupPrivate 6 */', - [ + 'property-group-private-prop-6' => [ + 'identifier' => '/* testGroupPrivate 6 */', + 'expected' => [ 'scope' => 'private', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testGroupPrivate 7 */', - [ + 'property-group-private-prop-7' => [ + 'identifier' => '/* testGroupPrivate 7 */', + 'expected' => [ 'scope' => 'private', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testMessyNullableType */', - [ + 'messy-nullable-type' => [ + 'identifier' => '/* testMessyNullableType */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => '?array', + 'type_token' => -2, + 'type_end_token' => -2, 'nullable_type' => true, ], ], - [ - '/* testNamespaceType */', - [ + 'fqn-type' => [ + 'identifier' => '/* testNamespaceType */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => '\MyNamespace\MyClass', + 'type_token' => -5, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testNullableNamespaceType 1 */', - [ + 'nullable-classname-type' => [ + 'identifier' => '/* testNullableNamespaceType 1 */', + 'expected' => [ 'scope' => 'private', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => '?ClassName', + 'type_token' => -2, + 'type_end_token' => -2, 'nullable_type' => true, ], ], - [ - '/* testNullableNamespaceType 2 */', - [ + 'nullable-namespace-relative-class-type' => [ + 'identifier' => '/* testNullableNamespaceType 2 */', + 'expected' => [ 'scope' => 'protected', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => '?Folder\ClassName', + 'type_token' => -4, + 'type_end_token' => -2, 'nullable_type' => true, ], ], - [ - '/* testMultilineNamespaceType */', - [ + 'multiline-namespaced-type' => [ + 'identifier' => '/* testMultilineNamespaceType */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => '\MyNamespace\MyClass\Foo', + 'type_token' => -18, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPropertyAfterMethod */', - [ + 'property-after-method' => [ + 'identifier' => '/* testPropertyAfterMethod */', + 'expected' => [ 'scope' => 'private', 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testInterfaceProperty */', - [], + 'invalid-property-in-interface' => [ + 'identifier' => '/* testInterfaceProperty */', + 'expected' => [], ], - [ - '/* testNestedProperty 1 */', - [ + 'property-in-nested-class-1' => [ + 'identifier' => '/* testNestedProperty 1 */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testNestedProperty 2 */', - [ + 'property-in-nested-class-2' => [ + 'identifier' => '/* testNestedProperty 2 */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => '', + 'type_token' => false, + 'type_end_token' => false, 'nullable_type' => false, ], ], - [ - '/* testPHP8MixedTypeHint */', - [ + 'php8-mixed-type' => [ + 'identifier' => '/* testPHP8MixedTypeHint */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, 'type' => 'miXed', + 'type_token' => -2, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPHP8MixedTypeHintNullable */', - [ + 'php8-nullable-mixed-type' => [ + 'identifier' => '/* testPHP8MixedTypeHintNullable */', + 'expected' => [ 'scope' => 'private', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => '?mixed', + 'type_token' => -2, + 'type_end_token' => -2, 'nullable_type' => true, ], ], - [ - '/* testNamespaceOperatorTypeHint */', - [ + 'namespace-operator-type-declaration' => [ + 'identifier' => '/* testNamespaceOperatorTypeHint */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => '?namespace\Name', + 'type_token' => -4, + 'type_end_token' => -2, 'nullable_type' => true, ], ], - [ - '/* testPHP8UnionTypesSimple */', - [ + 'php8-union-types-simple' => [ + 'identifier' => '/* testPHP8UnionTypesSimple */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => 'int|float', + 'type_token' => -4, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPHP8UnionTypesTwoClasses */', - [ + 'php8-union-types-two-classes' => [ + 'identifier' => '/* testPHP8UnionTypesTwoClasses */', + 'expected' => [ 'scope' => 'private', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => 'MyClassA|\Package\MyClassB', + 'type_token' => -7, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPHP8UnionTypesAllBaseTypes */', - [ + 'php8-union-types-all-base-types' => [ + 'identifier' => '/* testPHP8UnionTypesAllBaseTypes */', + 'expected' => [ 'scope' => 'protected', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => 'array|bool|int|float|NULL|object|string', + 'type_token' => -14, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPHP8UnionTypesAllPseudoTypes */', - [ + 'php8-union-types-all-pseudo-types' => [ + 'identifier' => '/* testPHP8UnionTypesAllPseudoTypes */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => false, 'is_static' => false, 'is_readonly' => false, 'type' => 'false|mixed|self|parent|iterable|Resource', + 'type_token' => -12, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPHP8UnionTypesIllegalTypes */', - [ + 'php8-union-types-illegal-types' => [ + 'identifier' => '/* testPHP8UnionTypesIllegalTypes */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + // Missing static, but that's OK as not an allowed syntax. 'type' => 'callable|void', + 'type_token' => -4, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPHP8UnionTypesNullable */', - [ + 'php8-union-types-nullable' => [ + 'identifier' => '/* testPHP8UnionTypesNullable */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => '?int|float', + 'type_token' => -4, + 'type_end_token' => -2, 'nullable_type' => true, ], ], - [ - '/* testPHP8PseudoTypeNull */', - [ + 'php8-union-types-pseudo-type-null' => [ + 'identifier' => '/* testPHP8PseudoTypeNull */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => 'null', + 'type_token' => -2, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPHP8PseudoTypeFalse */', - [ + 'php8-union-types-pseudo-type-false' => [ + 'identifier' => '/* testPHP8PseudoTypeFalse */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => 'false', + 'type_token' => -2, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPHP8PseudoTypeFalseAndBool */', - [ + 'php8-union-types-pseudo-type-false-and-bool' => [ + 'identifier' => '/* testPHP8PseudoTypeFalseAndBool */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => 'bool|FALSE', + 'type_token' => -4, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPHP8ObjectAndClass */', - [ + 'php8-union-types-object-and-class' => [ + 'identifier' => '/* testPHP8ObjectAndClass */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => 'object|ClassName', + 'type_token' => -4, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPHP8PseudoTypeIterableAndArray */', - [ + 'php8-union-types-pseudo-type-iterable-and-array' => [ + 'identifier' => '/* testPHP8PseudoTypeIterableAndArray */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => 'iterable|array|Traversable', + 'type_token' => -6, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPHP8DuplicateTypeInUnionWhitespaceAndComment */', - [ + 'php8-union-types-duplicate-type-with-whitespace-and-comments' => [ + 'identifier' => '/* testPHP8DuplicateTypeInUnionWhitespaceAndComment */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => 'int|string|INT', + 'type_token' => -10, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPHP81Readonly */', - [ + 'php8.1-readonly-property' => [ + 'identifier' => '/* testPHP81Readonly */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => true, 'type' => 'int', + 'type_token' => -2, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPHP81ReadonlyWithNullableType */', - [ + 'php8.1-readonly-property-with-nullable-type' => [ + 'identifier' => '/* testPHP81ReadonlyWithNullableType */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => true, 'type' => '?array', + 'type_token' => -2, + 'type_end_token' => -2, 'nullable_type' => true, ], ], - [ - '/* testPHP81ReadonlyWithUnionType */', - [ + 'php8.1-readonly-property-with-union-type' => [ + 'identifier' => '/* testPHP81ReadonlyWithUnionType */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => true, 'type' => 'string|int', + 'type_token' => -4, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPHP81ReadonlyWithUnionTypeWithNull */', - [ + 'php8.1-readonly-property-with-union-type-with-null' => [ + 'identifier' => '/* testPHP81ReadonlyWithUnionTypeWithNull */', + 'expected' => [ 'scope' => 'protected', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => true, 'type' => 'string|null', + 'type_token' => -4, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPHP81OnlyReadonlyWithUnionType */', - [ + 'php8.1-readonly-property-with-union-type-no-visibility' => [ + 'identifier' => '/* testPHP81OnlyReadonlyWithUnionType */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => false, 'is_static' => false, 'is_readonly' => true, 'type' => 'string|int', + 'type_token' => -4, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPHP8PropertySingleAttribute */', - [ + 'php8.1-readonly-property-with-multi-union-type-no-visibility' => [ + 'identifier' => '/* testPHP81OnlyReadonlyWithUnionTypeMultiple */', + 'expected' => [ + 'scope' => 'public', + 'scope_specified' => false, + 'is_static' => false, + 'is_readonly' => true, + 'type' => '\InterfaceA|\Sub\InterfaceB|false', + 'type_token' => -11, + 'type_end_token' => -3, + 'nullable_type' => false, + ], + ], + 'php8.1-readonly-and-static-property' => [ + 'identifier' => '/* testPHP81ReadonlyAndStatic */', + 'expected' => [ + 'scope' => 'private', + 'scope_specified' => true, + 'is_static' => true, + 'is_readonly' => true, + 'type' => '?string', + 'type_token' => -2, + 'type_end_token' => -2, + 'nullable_type' => true, + ], + ], + 'php8.1-readonly-mixed-case-keyword' => [ + 'identifier' => '/* testPHP81ReadonlyMixedCase */', + 'expected' => [ + 'scope' => 'public', + 'scope_specified' => true, + 'is_static' => true, + 'is_readonly' => true, + 'type' => '', + 'type_token' => false, + 'type_end_token' => false, + 'nullable_type' => false, + ], + ], + 'php8-property-with-single-attribute' => [ + 'identifier' => '/* testPHP8PropertySingleAttribute */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => 'string', + 'type_token' => -2, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPHP8PropertyMultipleAttributes */', - [ + 'php8-property-with-multiple-attributes' => [ + 'identifier' => '/* testPHP8PropertyMultipleAttributes */', + 'expected' => [ 'scope' => 'protected', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => '?int|float', + 'type_token' => -4, + 'type_end_token' => -2, 'nullable_type' => true, ], ], - [ - '/* testPHP8PropertyMultilineAttribute */', - [ + 'php8-property-with-multiline-attribute' => [ + 'identifier' => '/* testPHP8PropertyMultilineAttribute */', + 'expected' => [ 'scope' => 'private', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => 'mixed', + 'type_token' => -2, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testEnumProperty */', - [], + 'invalid-property-in-enum' => [ + 'identifier' => '/* testEnumProperty */', + 'expected' => [], ], - [ - '/* testPHP81IntersectionTypes */', - [ + 'php8.1-single-intersection-type' => [ + 'identifier' => '/* testPHP81IntersectionTypes */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => 'Foo&Bar', + 'type_token' => -4, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPHP81MoreIntersectionTypes */', - [ + 'php8.1-multi-intersection-type' => [ + 'identifier' => '/* testPHP81MoreIntersectionTypes */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => 'Foo&Bar&Baz', + 'type_token' => -6, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPHP81IllegalIntersectionTypes */', - [ + 'php8.1-illegal-intersection-type' => [ + 'identifier' => '/* testPHP81IllegalIntersectionTypes */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => 'int&string', + 'type_token' => -4, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPHP81NullableIntersectionType */', - [ + 'php8.1-nullable-intersection-type' => [ + 'identifier' => '/* testPHP81NullableIntersectionType */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => '?Foo&Bar', + 'type_token' => -4, + 'type_end_token' => -2, 'nullable_type' => true, ], ], - [ - '/* testPHP82PseudoTypeTrue */', - [ + + 'php8.0-union-type-with-whitespace-and-comment' => [ + 'identifier' => '/* testUnionTypeWithWhitespaceAndComment */', + 'expected' => [ + 'scope' => 'public', + 'scope_specified' => true, + 'is_static' => false, + 'is_readonly' => false, + 'type' => 'int|string', + 'type_token' => -8, + 'type_end_token' => -2, + 'nullable_type' => false, + ], + ], + 'php8.1-intersection-type-with-whitespace-and-comment' => [ + 'identifier' => '/* testIntersectionTypeWithWhitespaceAndComment */', + 'expected' => [ + 'scope' => 'public', + 'scope_specified' => true, + 'is_static' => false, + 'is_readonly' => false, + 'type' => '\Foo&Bar', + 'type_token' => -9, + 'type_end_token' => -2, + 'nullable_type' => false, + ], + ], + 'php8.2-pseudo-type-true' => [ + 'identifier' => '/* testPHP82PseudoTypeTrue */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => 'true', + 'type_token' => -2, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPHP82NullablePseudoTypeTrue */', - [ + 'php8.2-pseudo-type-true-nullable' => [ + 'identifier' => '/* testPHP82NullablePseudoTypeTrue */', + 'expected' => [ 'scope' => 'protected', 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, 'type' => '?true', + 'type_token' => -2, + 'type_end_token' => -2, 'nullable_type' => true, ], ], - [ - '/* testPHP82PseudoTypeTrueInUnion */', - [ + 'php8.2-pseudo-type-true-in-union' => [ + 'identifier' => '/* testPHP82PseudoTypeTrueInUnion */', + 'expected' => [ 'scope' => 'private', 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, 'type' => 'int|string|true', + 'type_token' => -6, + 'type_end_token' => -2, 'nullable_type' => false, ], ], - [ - '/* testPHP82PseudoTypeFalseAndTrue */', - [ + 'php8.2-pseudo-type-invalid-true-false-union' => [ + 'identifier' => '/* testPHP82PseudoTypeFalseAndTrue */', + 'expected' => [ 'scope' => 'public', 'scope_specified' => false, 'is_static' => false, 'is_readonly' => true, 'type' => 'true|FALSE', + 'type_token' => -4, + 'type_end_token' => -2, 'nullable_type' => false, ], ], @@ -883,18 +1104,18 @@ public function testNotClassPropertyException($identifier) * * @see testNotClassPropertyException() * - * @return array + * @return array> */ public function dataNotClassProperty() { return [ - ['/* testMethodParam */'], - ['/* testImportedGlobal */'], - ['/* testLocalVariable */'], - ['/* testGlobalVariable */'], - ['/* testNestedMethodParam 1 */'], - ['/* testNestedMethodParam 2 */'], - ['/* testEnumMethodParamNotProperty */'], + 'method parameter' => ['/* testMethodParam */'], + 'variable import using global keyword' => ['/* testImportedGlobal */'], + 'function local variable' => ['/* testLocalVariable */'], + 'global variable' => ['/* testGlobalVariable */'], + 'method parameter in anon class nested in ternary' => ['/* testNestedMethodParam 1 */'], + 'method parameter in anon class nested in function call' => ['/* testNestedMethodParam 2 */'], + 'method parameter in enum' => ['/* testEnumMethodParamNotProperty */'], ]; }//end dataNotClassProperty()