Skip to content

Commit 009bebd

Browse files
committed
Fix: Replace deprecated PropertyFetchToMethodCallRector with GeneratorPropertyFetchToMethodCallRector
1 parent f7ac507 commit 009bebd

File tree

4 files changed

+218
-153
lines changed

4 files changed

+218
-153
lines changed

phpstan.neon.dist

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ parameters:
55
level: 5
66
bootstrapFiles:
77
- src/Faker/ORM/Doctrine/backward-compatibility.php
8+
excludes_analyse:
9+
- src/Faker/Rector/
810
paths:
911
- src
1012
tmpDir: .build/phpstan/

psalm.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
<projectFiles>
1414
<directory name="src" />
1515
<ignoreFiles>
16+
<directory name="src/Faker/Rector" />
1617
<directory name="vendor" />
1718
</ignoreFiles>
1819
</projectFiles>

rector-migrate.php

Lines changed: 2 additions & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -2,160 +2,9 @@
22

33
declare(strict_types=1);
44

5-
use Faker\Generator;
5+
use Faker\Rector;
66
use Rector\Config;
7-
use Rector\Transform;
87

9-
// This file configures rector/rector to replace all deprecated property usages with their equivalent functions.
108
return static function (Config\RectorConfig $rectorConfig): void {
11-
$properties = [
12-
'address',
13-
'amPm',
14-
'asciify',
15-
'biasedNumberBetween',
16-
'boolean',
17-
'bothify',
18-
'buildingNumber',
19-
'century',
20-
'chrome',
21-
'city',
22-
'citySuffix',
23-
'colorName',
24-
'company',
25-
'companyEmail',
26-
'companySuffix',
27-
'country',
28-
'countryCode',
29-
'countryISOAlpha3',
30-
'creditCardDetails',
31-
'creditCardExpirationDate',
32-
'creditCardExpirationDateString',
33-
'creditCardNumber',
34-
'creditCardType',
35-
'currencyCode',
36-
'date',
37-
'dateTime',
38-
'dateTimeAD',
39-
'dateTimeBetween',
40-
'dateTimeInInterval',
41-
'dateTimeThisCentury',
42-
'dateTimeThisDecade',
43-
'dateTimeThisMonth',
44-
'dateTimeThisYear',
45-
'dayOfMonth',
46-
'dayOfWeek',
47-
'domainName',
48-
'domainWord',
49-
'e164PhoneNumber',
50-
'email',
51-
'emoji',
52-
'file',
53-
'firefox',
54-
'firstName',
55-
'firstNameFemale',
56-
'firstNameMale',
57-
'freeEmail',
58-
'freeEmailDomain',
59-
'getDefaultTimezone',
60-
'hexColor',
61-
'hslColor',
62-
'hslColorAsArray',
63-
'iban',
64-
'image',
65-
'imageUrl',
66-
'imei',
67-
'internetExplorer',
68-
'iosMobileToken',
69-
'ipv4',
70-
'ipv6',
71-
'iso8601',
72-
'jobTitle',
73-
'languageCode',
74-
'lastName',
75-
'latitude',
76-
'lexify',
77-
'linuxPlatformToken',
78-
'linuxProcessor',
79-
'localCoordinates',
80-
'localIpv4',
81-
'locale',
82-
'longitude',
83-
'macAddress',
84-
'macPlatformToken',
85-
'macProcessor',
86-
'md5',
87-
'month',
88-
'monthName',
89-
'msedge',
90-
'name',
91-
'numerify',
92-
'opera',
93-
'paragraph',
94-
'paragraphs',
95-
'passthrough',
96-
'password',
97-
'phoneNumber',
98-
'postcode',
99-
'randomAscii',
100-
'randomDigitNotNull',
101-
'randomElement',
102-
'randomElements',
103-
'randomHtml',
104-
'randomKey',
105-
'randomLetter',
106-
'realText',
107-
'realTextBetween',
108-
'regexify',
109-
'rgbColor',
110-
'rgbColorAsArray',
111-
'rgbCssColor',
112-
'rgbaCssColor',
113-
'safari',
114-
'safeColorName',
115-
'safeEmail',
116-
'safeEmailDomain',
117-
'safeHexColor',
118-
'sentence',
119-
'sentences',
120-
'setDefaultTimezone',
121-
'sha1',
122-
'sha256',
123-
'shuffle',
124-
'shuffleArray',
125-
'shuffleString',
126-
'slug',
127-
'streetAddress',
128-
'streetName',
129-
'streetSuffix',
130-
'swiftBicNumber',
131-
'text',
132-
'time',
133-
'timezone',
134-
'title',
135-
'titleFemale',
136-
'titleMale',
137-
'tld',
138-
'toLower',
139-
'toUpper',
140-
'unixTime',
141-
'url',
142-
'userAgent',
143-
'userName',
144-
'uuid',
145-
'windowsPlatformToken',
146-
'word',
147-
'words',
148-
'year',
149-
];
150-
151-
$rectorConfig->ruleWithConfiguration(
152-
Transform\Rector\Assign\PropertyFetchToMethodCallRector::class,
153-
array_map(static function (string $property): Transform\ValueObject\PropertyFetchToMethodCall {
154-
return new Transform\ValueObject\PropertyFetchToMethodCall(
155-
Generator::class,
156-
$property,
157-
$property,
158-
);
159-
}, $properties),
160-
);
9+
$rectorConfig->rule(Rector\GeneratorPropertyFetchToMethodCallRector::class);
16110
};
Lines changed: 213 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,213 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Faker\Rector;
6+
7+
use Faker\Generator;
8+
use PhpParser\Node;
9+
use PHPStan\Type;
10+
use Rector\Rector;
11+
use Symplify\RuleDocGenerator;
12+
13+
final class GeneratorPropertyFetchToMethodCallRector extends Rector\AbstractRector
14+
{
15+
/**
16+
* @var list<string>
17+
*/
18+
private array $deprecatedProperties = [
19+
'address',
20+
'amPm',
21+
'asciify',
22+
'biasedNumberBetween',
23+
'boolean',
24+
'bothify',
25+
'buildingNumber',
26+
'century',
27+
'chrome',
28+
'city',
29+
'citySuffix',
30+
'colorName',
31+
'company',
32+
'companyEmail',
33+
'companySuffix',
34+
'country',
35+
'countryCode',
36+
'countryISOAlpha3',
37+
'creditCardDetails',
38+
'creditCardExpirationDate',
39+
'creditCardExpirationDateString',
40+
'creditCardNumber',
41+
'creditCardType',
42+
'currencyCode',
43+
'date',
44+
'dateTime',
45+
'dateTimeAD',
46+
'dateTimeBetween',
47+
'dateTimeInInterval',
48+
'dateTimeThisCentury',
49+
'dateTimeThisDecade',
50+
'dateTimeThisMonth',
51+
'dateTimeThisYear',
52+
'dayOfMonth',
53+
'dayOfWeek',
54+
'domainName',
55+
'domainWord',
56+
'e164PhoneNumber',
57+
'email',
58+
'emoji',
59+
'file',
60+
'firefox',
61+
'firstName',
62+
'firstNameFemale',
63+
'firstNameMale',
64+
'freeEmail',
65+
'freeEmailDomain',
66+
'getDefaultTimezone',
67+
'hexColor',
68+
'hslColor',
69+
'hslColorAsArray',
70+
'iban',
71+
'image',
72+
'imageUrl',
73+
'imei',
74+
'internetExplorer',
75+
'iosMobileToken',
76+
'ipv4',
77+
'ipv6',
78+
'iso8601',
79+
'jobTitle',
80+
'languageCode',
81+
'lastName',
82+
'latitude',
83+
'lexify',
84+
'linuxPlatformToken',
85+
'linuxProcessor',
86+
'localCoordinates',
87+
'localIpv4',
88+
'locale',
89+
'longitude',
90+
'macAddress',
91+
'macPlatformToken',
92+
'macProcessor',
93+
'md5',
94+
'month',
95+
'monthName',
96+
'msedge',
97+
'name',
98+
'numerify',
99+
'opera',
100+
'paragraph',
101+
'paragraphs',
102+
'passthrough',
103+
'password',
104+
'phoneNumber',
105+
'postcode',
106+
'randomAscii',
107+
'randomDigitNotNull',
108+
'randomElement',
109+
'randomElements',
110+
'randomHtml',
111+
'randomKey',
112+
'randomLetter',
113+
'realText',
114+
'realTextBetween',
115+
'regexify',
116+
'rgbColor',
117+
'rgbColorAsArray',
118+
'rgbCssColor',
119+
'rgbaCssColor',
120+
'safari',
121+
'safeColorName',
122+
'safeEmail',
123+
'safeEmailDomain',
124+
'safeHexColor',
125+
'sentence',
126+
'sentences',
127+
'setDefaultTimezone',
128+
'sha1',
129+
'sha256',
130+
'shuffle',
131+
'shuffleArray',
132+
'shuffleString',
133+
'slug',
134+
'streetAddress',
135+
'streetName',
136+
'streetSuffix',
137+
'swiftBicNumber',
138+
'text',
139+
'time',
140+
'timezone',
141+
'title',
142+
'titleFemale',
143+
'titleMale',
144+
'tld',
145+
'toLower',
146+
'toUpper',
147+
'unixTime',
148+
'url',
149+
'userAgent',
150+
'userName',
151+
'uuid',
152+
'windowsPlatformToken',
153+
'word',
154+
'words',
155+
'year',
156+
];
157+
158+
public function getNodeTypes(): array
159+
{
160+
return [
161+
Node\Expr\PropertyFetch::class,
162+
];
163+
}
164+
165+
public function getRuleDefinition(): RuleDocGenerator\ValueObject\RuleDefinition
166+
{
167+
return new RuleDocGenerator\ValueObject\RuleDefinition(
168+
'Converts deprecated Faker Generator property access to method calls',
169+
[
170+
new RuleDocGenerator\ValueObject\CodeSample\CodeSample(
171+
<<<'CODE_SAMPLE'
172+
$faker->address;
173+
CODE_SAMPLE
174+
,
175+
<<<'CODE_SAMPLE'
176+
$faker->address();
177+
CODE_SAMPLE
178+
),
179+
],
180+
);
181+
}
182+
183+
/**
184+
* @param Node\Expr\PropertyFetch $node
185+
*/
186+
public function refactor(Node $node): ?Node
187+
{
188+
$callerType = $this->getType($node->var);
189+
190+
if (!$callerType instanceof Type\ObjectType) {
191+
return null;
192+
}
193+
194+
if (!$callerType->isInstanceOf(Generator::class)->yes()) {
195+
return null;
196+
}
197+
198+
if (!$node->name instanceof Node\Identifier) {
199+
return null;
200+
}
201+
202+
$propertyName = $node->name->name;
203+
204+
if (!in_array($propertyName, $this->deprecatedProperties, true)) {
205+
return null;
206+
}
207+
208+
return new Node\Expr\MethodCall(
209+
$node->var,
210+
new Node\Identifier($propertyName),
211+
);
212+
}
213+
}

0 commit comments

Comments
 (0)