2626use Rector \Assert \NodeAnalyzer \ExistingAssertStaticCallResolver ;
2727use Rector \BetterPhpDocParser \PhpDocInfo \PhpDocInfo ;
2828use Rector \BetterPhpDocParser \PhpDocInfo \PhpDocInfoFactory ;
29+ use Rector \Contract \Rector \ConfigurableRectorInterface ;
2930use Rector \PHPStan \ScopeFetcher ;
3031use Rector \Rector \AbstractRector ;
31- use Symplify \RuleDocGenerator \ValueObject \CodeSample \CodeSample ;
32+ use Symplify \RuleDocGenerator \ValueObject \CodeSample \ConfiguredCodeSample ;
3233use Symplify \RuleDocGenerator \ValueObject \RuleDefinition ;
34+ use Webmozart \Assert \Assert ;
3335
3436/**
3537 * @experimental Check generic array key/value types in runtime with assert. Generics for impatient people.
3638 *
3739 * @see \Rector\Tests\Assert\Rector\ClassMethod\AddAssertArrayFromClassMethodDocblockRector\AddAssertArrayFromClassMethodDocblockRectorTest
3840 */
39- final class AddAssertArrayFromClassMethodDocblockRector extends AbstractRector
41+ final class AddAssertArrayFromClassMethodDocblockRector extends AbstractRector implements ConfigurableRectorInterface
4042{
43+ private string $ assertClass = AssertClassName::WEBMOZART ;
44+
4145 public function __construct (
4246 private readonly PhpDocInfoFactory $ phpDocInfoFactory ,
4347 private readonly ExistingAssertStaticCallResolver $ existingAssertStaticCallResolver
@@ -46,9 +50,11 @@ public function __construct(
4650
4751 public function getRuleDefinition (): RuleDefinition
4852 {
49- return new RuleDefinition ('Add key and value assert based on docblock @param type declarations ' , [
50- new CodeSample (
51- <<<'CODE_SAMPLE'
53+ return new RuleDefinition (
54+ 'Add key and value assert based on docblock @param type declarations (pick from "webmozart" or "beberlei" asserts) ' ,
55+ [
56+ new ConfiguredCodeSample (
57+ <<<'CODE_SAMPLE'
5258<?php
5359
5460class SomeClass
@@ -62,11 +68,13 @@ public function run(array $items)
6268}
6369
6470CODE_SAMPLE
65- ,
66- <<<'CODE_SAMPLE'
71+ ,
72+ <<<'CODE_SAMPLE'
6773<?php
6874
69- use Webmozart\Assert\Assert;class SomeClass
75+ use Webmozart\Assert\Assert;
76+
77+ class SomeClass
7078{
7179 /**
7280 * @param int[] $items
@@ -77,8 +85,12 @@ public function run(array $items)
7785 }
7886}
7987CODE_SAMPLE
80- ),
81- ]);
88+ ,
89+ [AssertClassName::WEBMOZART ]
90+ ),
91+
92+ ]
93+ );
8294 }
8395
8496 public function getNodeTypes (): array
@@ -118,7 +130,7 @@ public function refactor(Node $node): ?ClassMethod
118130 }
119131
120132 // handle arrays only
121- if ($ param -> type -> name !== 'array ' ) {
133+ if (! $ this -> isName ( $ param -> type , 'array ' ) ) {
122134 continue ;
123135 }
124136
@@ -168,9 +180,27 @@ public function refactor(Node $node): ?ClassMethod
168180 return $ node ;
169181 }
170182
183+ /**
184+ * @param array<string> $configuration
185+ */
186+ public function configure (array $ configuration ): void
187+ {
188+ if ($ configuration === []) {
189+ // default
190+ return ;
191+ }
192+
193+ Assert::count ($ configuration , 1 );
194+ Assert::inArray ($ configuration [0 ], [AssertClassName::BEBERLEI , AssertClassName::WEBMOZART ]);
195+
196+ $ this ->assertClass = $ configuration [0 ];
197+ }
198+
171199 private function createAssertExpression (Expr $ expr , string $ methodName ): Expression
172200 {
173- $ staticCall = new StaticCall (new FullyQualified (AssertClassName::ASSERT ), $ methodName , [new Arg ($ expr )]);
201+ $ assertFullyQualified = new FullyQualified ($ this ->assertClass );
202+
203+ $ staticCall = new StaticCall ($ assertFullyQualified , $ methodName , [new Arg ($ expr )]);
174204
175205 return new Expression ($ staticCall );
176206 }
0 commit comments