1212use PhpParser \Node \Expr \New_ ;
1313use PhpParser \Node \Expr \StaticCall ;
1414use PhpParser \Node \Expr \Variable ;
15+ use PhpParser \Node \Identifier ;
16+ use PhpParser \Node \Name ;
1517use PhpParser \Node \Stmt \ClassMethod ;
1618use Rector \Arguments \Contract \ReplaceArgumentDefaultValueInterface ;
1719use Rector \Arguments \ValueObject \ReplaceArgumentDefaultValue ;
1820use Rector \NodeAnalyzer \ArgsAnalyzer ;
21+ use Rector \NodeTypeResolver \NodeTypeResolver ;
1922use Rector \PhpParser \AstResolver ;
2023use Rector \PhpParser \Node \NodeFactory ;
2124use Rector \PhpParser \Node \Value \ValueResolver ;
25+ use Rector \StaticTypeMapper \ValueObject \Type \FullyQualifiedObjectType ;
2226final class ArgumentDefaultValueReplacer
2327{
2428 /**
@@ -37,12 +41,17 @@ final class ArgumentDefaultValueReplacer
3741 * @readonly
3842 */
3943 private AstResolver $ astResolver ;
40- public function __construct (NodeFactory $ nodeFactory , ValueResolver $ valueResolver , ArgsAnalyzer $ argsAnalyzer , AstResolver $ astResolver )
44+ /**
45+ * @readonly
46+ */
47+ private NodeTypeResolver $ nodeTypeResolver ;
48+ public function __construct (NodeFactory $ nodeFactory , ValueResolver $ valueResolver , ArgsAnalyzer $ argsAnalyzer , AstResolver $ astResolver , NodeTypeResolver $ nodeTypeResolver )
4149 {
4250 $ this ->nodeFactory = $ nodeFactory ;
4351 $ this ->valueResolver = $ valueResolver ;
4452 $ this ->argsAnalyzer = $ argsAnalyzer ;
4553 $ this ->astResolver = $ astResolver ;
54+ $ this ->nodeTypeResolver = $ nodeTypeResolver ;
4655 }
4756 /**
4857 * @template TCall as (MethodCall|StaticCall|ClassMethod|FuncCall|New_)
@@ -139,7 +148,15 @@ private function processArgs($expr, ReplaceArgumentDefaultValueInterface $replac
139148 }
140149 $ argValue = $ this ->valueResolver ->getValue ($ particularArg ->value );
141150 if (is_scalar ($ replaceArgumentDefaultValue ->getValueBefore ()) && $ argValue === $ replaceArgumentDefaultValue ->getValueBefore ()) {
142- $ particularArg ->value = $ this ->normalizeValue ($ replaceArgumentDefaultValue ->getValueAfter ());
151+ $ normalizedValueAfter = $ this ->normalizeValue ($ replaceArgumentDefaultValue ->getValueAfter ());
152+ if ($ particularArg ->value instanceof ClassConstFetch && $ particularArg ->value ->class instanceof Name && $ particularArg ->value ->class ->isSpecialClassName () && $ normalizedValueAfter instanceof ClassConstFetch && is_string ($ replaceArgumentDefaultValue ->getValueAfter ()) && strpos ($ replaceArgumentDefaultValue ->getValueAfter (), ':: ' ) !== \false) {
153+ [$ targetClass , $ targetConstant ] = explode (':: ' , $ replaceArgumentDefaultValue ->getValueAfter ());
154+ $ type = $ this ->nodeTypeResolver ->getType ($ particularArg ->value ->class );
155+ if ($ type instanceof FullyQualifiedObjectType && $ type ->getClassName () === $ targetClass && $ particularArg ->value ->name instanceof Identifier && $ particularArg ->value ->name ->toString () === $ targetConstant ) {
156+ return null ;
157+ }
158+ }
159+ $ particularArg ->value = $ normalizedValueAfter ;
143160 return $ expr ;
144161 }
145162 if (is_array ($ replaceArgumentDefaultValue ->getValueBefore ())) {
0 commit comments