Skip to content

Commit 12a36d3

Browse files
authored
Use FCT constants (#1049)
1 parent 636bbba commit 12a36d3

File tree

8 files changed

+67
-62
lines changed

8 files changed

+67
-62
lines changed

.dev-tools/composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"shipmonk/phpstan-rules": "^4.1.4",
1717
"squizlabs/php_codesniffer": "^3.13.2",
1818
"tomasvotruba/type-coverage": "^2.0.2",
19-
"vimeo/psalm": "^6.12.1"
19+
"vimeo/psalm": "^6.13.0"
2020
},
2121
"autoload": {
2222
"psr-4": {

.dev-tools/composer.lock

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.dev-tools/psalm.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
<directory name='../src' />
1616
</projectFiles>
1717

18+
<stubs>
19+
<file name='./psalm_stub.php' preloadClasses='true' />
20+
</stubs>
21+
1822
<issueHandlers>
1923
<DeprecatedClass errorLevel='suppress' />
2024
<InaccessibleMethod errorLevel='suppress' />

.dev-tools/psalm_stub.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php declare(strict_types=1);
2+
3+
/*
4+
* This file is part of PHP CS Fixer: custom fixers.
5+
*
6+
* (c) 2018 Kuba Werłos
7+
*
8+
* For the full copyright and license information, please view
9+
* the LICENSE file that was distributed with this source code.
10+
*/
11+
12+
namespace PhpCsFixer\Tokenizer {
13+
final class FCT
14+
{
15+
public const int T_ATTRIBUTE = \T_ATTRIBUTE;
16+
public const int T_PRIVATE_SET = \T_PRIVATE_SET;
17+
public const int T_PROTECTED_SET = \T_PROTECTED_SET;
18+
public const int T_PUBLIC_SET = \T_PUBLIC_SET;
19+
public const int T_READONLY = \T_READONLY;
20+
}
21+
final class OtherClassSoTheNameOfClassAboveIsNotChanged {}
22+
}

src/Fixer/NoUselessWriteVisibilityFixer.php

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use PhpCsFixer\FixerDefinition\FixerDefinition;
1616
use PhpCsFixer\FixerDefinition\FixerDefinitionInterface;
1717
use PhpCsFixer\Tokenizer\CT;
18+
use PhpCsFixer\Tokenizer\FCT;
1819
use PhpCsFixer\Tokenizer\Token;
1920
use PhpCsFixer\Tokenizer\Tokens;
2021

@@ -23,19 +24,11 @@
2324
*/
2425
final class NoUselessWriteVisibilityFixer extends AbstractFixer
2526
{
26-
/** @var non-empty-array<int, list<int>> */
27-
private array $predecessorKindMap;
28-
29-
public function __construct()
30-
{
31-
if (\defined('T_PUBLIC_SET')) {
32-
$this->predecessorKindMap = [
33-
\T_PUBLIC_SET => [\T_PUBLIC, CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PUBLIC],
34-
\T_PROTECTED_SET => [\T_PROTECTED, CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PROTECTED],
35-
\T_PRIVATE_SET => [\T_PRIVATE, CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PRIVATE],
36-
];
37-
}
38-
}
27+
private const PREDECESSOR_KIND_MAP = [
28+
FCT::T_PUBLIC_SET => [\T_PUBLIC, CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PUBLIC],
29+
FCT::T_PROTECTED_SET => [\T_PROTECTED, CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PROTECTED],
30+
FCT::T_PRIVATE_SET => [\T_PRIVATE, CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PRIVATE],
31+
];
3932

4033
public function getDefinition(): FixerDefinitionInterface
4134
{
@@ -61,7 +54,7 @@ public function getPriority(): int
6154

6255
public function isCandidate(Tokens $tokens): bool
6356
{
64-
return \defined('T_PUBLIC_SET') && $tokens->isAnyTokenKindsFound(\array_keys($this->predecessorKindMap));
57+
return $tokens->isAnyTokenKindsFound([FCT::T_PUBLIC_SET, FCT::T_PROTECTED_SET, FCT::T_PRIVATE_SET]);
6558
}
6659

6760
public function isRisky(): bool
@@ -71,14 +64,14 @@ public function isRisky(): bool
7164

7265
public function fix(\SplFileInfo $file, Tokens $tokens): void
7366
{
74-
foreach ($tokens->findGivenKind(\array_keys($this->predecessorKindMap)) as $kind => $elements) {
67+
foreach ($tokens->findGivenKind([FCT::T_PUBLIC_SET, FCT::T_PROTECTED_SET, FCT::T_PRIVATE_SET]) as $kind => $elements) {
7568
foreach (\array_keys($elements) as $index) {
76-
$this->fixVisibility($tokens, $index, $kind, $kind === \T_PUBLIC_SET);
69+
self::fixVisibility($tokens, $index, $kind, $kind === \T_PUBLIC_SET);
7770
}
7871
}
7972
}
8073

81-
private function fixVisibility(Tokens $tokens, int $index, int $kind, bool $makePublicIfNone): void
74+
private static function fixVisibility(Tokens $tokens, int $index, int $kind, bool $makePublicIfNone): void
8275
{
8376
$prevIndex = $tokens->getPrevMeaningfulToken($index);
8477
\assert(\is_int($prevIndex));
@@ -87,7 +80,7 @@ private function fixVisibility(Tokens $tokens, int $index, int $kind, bool $make
8780
\assert(\is_int($prevIndex));
8881
}
8982

90-
if (!$tokens[$prevIndex]->isGivenKind($this->predecessorKindMap[$kind])) {
83+
if (!$tokens[$prevIndex]->isGivenKind(self::PREDECESSOR_KIND_MAP[$kind])) {
9184
if ($makePublicIfNone) {
9285
$prevDeciderIndex = $tokens->getPrevTokenOfKind($index, ['(', ';', '{']);
9386
\assert(\is_int($prevDeciderIndex));

src/Fixer/PhpdocNoIncorrectVarAnnotationFixer.php

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use PhpCsFixer\FixerDefinition\FixerDefinitionInterface;
1818
use PhpCsFixer\Preg;
1919
use PhpCsFixer\Tokenizer\CT;
20+
use PhpCsFixer\Tokenizer\FCT;
2021
use PhpCsFixer\Tokenizer\Token;
2122
use PhpCsFixer\Tokenizer\Tokens;
2223
use PhpCsFixerCustomFixers\TokenRemover;
@@ -96,7 +97,7 @@ private static function getIndexAfterPhpDoc(Tokens $tokens, int $index): ?int
9697
{
9798
$nextIndex = $tokens->getNextMeaningfulToken($index);
9899

99-
while ($nextIndex !== null && \defined('T_ATTRIBUTE') && $tokens[$nextIndex]->isGivenKind(\T_ATTRIBUTE)) {
100+
while ($nextIndex !== null && $tokens[$nextIndex]->isGivenKind(FCT::T_ATTRIBUTE)) {
100101
$nextIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_ATTRIBUTE, $nextIndex);
101102
$nextIndex = $tokens->getNextMeaningfulToken($nextIndex);
102103
}
@@ -106,14 +107,7 @@ private static function getIndexAfterPhpDoc(Tokens $tokens, int $index): ?int
106107

107108
private static function removeForClassElement(Tokens $tokens, int $index, int $propertyStartIndex): void
108109
{
109-
$tokenKinds = [\T_NS_SEPARATOR, \T_STATIC, \T_STRING, \T_WHITESPACE, CT::T_ARRAY_TYPEHINT, CT::T_NULLABLE_TYPE, CT::T_TYPE_ALTERNATION];
110-
111-
if (\defined('T_READONLY')) {
112-
$tokenKinds[] = CT::T_TYPE_INTERSECTION;
113-
$tokenKinds[] = \T_READONLY;
114-
}
115-
116-
$variableIndex = $tokens->getTokenNotOfKindsSibling($propertyStartIndex, 1, $tokenKinds);
110+
$variableIndex = $tokens->getTokenNotOfKindsSibling($propertyStartIndex, 1, [\T_NS_SEPARATOR, \T_STATIC, \T_STRING, \T_WHITESPACE, CT::T_ARRAY_TYPEHINT, CT::T_NULLABLE_TYPE, CT::T_TYPE_ALTERNATION, CT::T_TYPE_INTERSECTION, FCT::T_READONLY]);
117111
\assert(\is_int($variableIndex));
118112

119113
if (!$tokens[$variableIndex]->isGivenKind(\T_VARIABLE)) {

src/Fixer/ReadonlyPromotedPropertiesFixer.php

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use PhpCsFixer\FixerDefinition\VersionSpecification;
1717
use PhpCsFixer\FixerDefinition\VersionSpecificCodeSample;
1818
use PhpCsFixer\Tokenizer\CT;
19+
use PhpCsFixer\Tokenizer\FCT;
1920
use PhpCsFixer\Tokenizer\Token;
2021
use PhpCsFixer\Tokenizer\Tokens;
2122
use PhpCsFixerCustomFixers\Analyzer\ConstructorAnalyzer;
@@ -43,23 +44,14 @@ final class ReadonlyPromotedPropertiesFixer extends AbstractFixer
4344
[\T_COALESCE_EQUAL, '??='],
4445
[\T_CONCAT_EQUAL, '.='],
4546
];
46-
47-
/** @var list<int> */
48-
private array $promotedPropertyVisibilityKinds;
49-
50-
public function __construct()
51-
{
52-
$this->promotedPropertyVisibilityKinds = [
53-
CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PRIVATE,
54-
CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PROTECTED,
55-
CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PUBLIC,
56-
];
57-
if (\defined('T_PUBLIC_SET')) {
58-
$this->promotedPropertyVisibilityKinds[] = \T_PUBLIC_SET;
59-
$this->promotedPropertyVisibilityKinds[] = \T_PROTECTED_SET;
60-
$this->promotedPropertyVisibilityKinds[] = \T_PRIVATE_SET;
61-
}
62-
}
47+
private const PROMOTED_PROPERTY_VISIBILITY_KINDS = [
48+
CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PRIVATE,
49+
CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PROTECTED,
50+
CT::T_CONSTRUCTOR_PROPERTY_PROMOTION_PUBLIC,
51+
FCT::T_PUBLIC_SET,
52+
FCT::T_PROTECTED_SET,
53+
FCT::T_PRIVATE_SET,
54+
];
6355

6456
public function getDefinition(): FixerDefinitionInterface
6557
{
@@ -92,7 +84,7 @@ public function getPriority(): int
9284

9385
public function isCandidate(Tokens $tokens): bool
9486
{
95-
return \defined('T_READONLY') && $tokens->isAnyTokenKindsFound($this->promotedPropertyVisibilityKinds);
87+
return $tokens->isAnyTokenKindsFound(self::PROMOTED_PROPERTY_VISIBILITY_KINDS);
9688
}
9789

9890
public function isRisky(): bool
@@ -126,7 +118,7 @@ public function fix(\SplFileInfo $file, Tokens $tokens): void
126118
\assert(\is_int($constructorOpenParenthesisIndex));
127119
$constructorCloseParenthesisIndex = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $constructorOpenParenthesisIndex);
128120

129-
$this->fixParameters(
121+
self::fixParameters(
130122
$tokens,
131123
$classOpenBraceIndex,
132124
$classCloseBraceIndex,
@@ -146,7 +138,7 @@ private static function isClassReadonly(Tokens $tokens, int $index): bool
146138
return $tokens[$index]->isGivenKind(\T_READONLY);
147139
}
148140

149-
private function fixParameters(
141+
private static function fixParameters(
150142
Tokens $tokens,
151143
int $classOpenBraceIndex,
152144
int $classCloseBraceIndex,
@@ -158,7 +150,7 @@ private function fixParameters(
158150
continue;
159151
}
160152

161-
$insertIndex = $this->getInsertIndex($tokens, $index);
153+
$insertIndex = self::getInsertIndex($tokens, $index);
162154
if ($insertIndex === null) {
163155
continue;
164156
}
@@ -177,7 +169,7 @@ private function fixParameters(
177169
}
178170
}
179171

180-
private function getInsertIndex(Tokens $tokens, int $index): ?int
172+
private static function getInsertIndex(Tokens $tokens, int $index): ?int
181173
{
182174
$insertIndex = null;
183175

@@ -189,7 +181,7 @@ private function getInsertIndex(Tokens $tokens, int $index): ?int
189181
if ($tokens[$index]->isGivenKind(\T_READONLY)) {
190182
return null;
191183
}
192-
if ($insertIndex === null && $tokens[$index]->isGivenKind($this->promotedPropertyVisibilityKinds)) {
184+
if ($insertIndex === null && $tokens[$index]->isGivenKind(self::PROMOTED_PROPERTY_VISIBILITY_KINDS)) {
193185
$insertIndex = $index;
194186
}
195187
}

tests/AutoReview/SrcCodeTest.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,9 @@ public function testFixerSupportsAllFilesByDefault(): void
8989
/**
9090
* @param class-string $className
9191
*
92-
* @dataProvider provideThereIsNoPregFunctionUsedDirectlyCases
92+
* @dataProvider provideThereIsNoDisallowedFunctionUsedDirectlyCases
9393
*/
94-
public function testThereIsNoPregFunctionUsedDirectly(string $className): void
94+
public function testThereIsNoDisallowedFunctionUsedDirectly(string $className): void
9595
{
9696
$reflectionClass = new \ReflectionClass($className);
9797

@@ -113,27 +113,27 @@ public function testThereIsNoPregFunctionUsedDirectly(string $className): void
113113
$stringTokens,
114114
);
115115
$strings = \array_unique($strings);
116-
$message = \sprintf('Class %s must not use preg_*, it shall use Preg::* instead.', $className);
117116

117+
$message = \sprintf('Class %s must not use preg_*, it shall use Preg::* instead.', $className);
118118
self::assertNotContains('preg_filter', $strings, $message);
119119
self::assertNotContains('preg_grep', $strings, $message);
120120
self::assertNotContains('preg_match', $strings, $message);
121121
self::assertNotContains('preg_match_all', $strings, $message);
122122
self::assertNotContains('preg_replace', $strings, $message);
123123
self::assertNotContains('preg_replace_callback', $strings, $message);
124124
self::assertNotContains('preg_split', $strings, $message);
125+
126+
self::assertNotContains('defined', $strings);
125127
}
126128

127129
/**
128130
* @return iterable<array{string}>
129131
*/
130-
public static function provideThereIsNoPregFunctionUsedDirectlyCases(): iterable
132+
public static function provideThereIsNoDisallowedFunctionUsedDirectlyCases(): iterable
131133
{
132134
$finder = Finder::create()
133135
->files()
134136
->in(__DIR__ . '/../../src')
135-
->notName('php-cs-fixer.config.*.php')
136-
->notName('run')
137137
->sortByName();
138138

139139
/** @var SplFileInfo $file */

0 commit comments

Comments
 (0)