44
55use PhpParser \Node \Name ;
66use PHPStan \DependencyInjection \AutowiredService ;
7+ use PHPStan \DependencyInjection \Container ;
78use PHPStan \Php \ComposerPhpVersionFactory ;
89use PHPStan \Php \PhpVersion ;
10+ use PHPStan \PhpDoc \TypeStringResolver ;
911use PHPStan \Reflection \NamespaceAnswerer ;
1012use PHPStan \Reflection \ReflectionProvider ;
1113use PHPStan \Reflection \ReflectionProvider \ReflectionProviderProvider ;
@@ -50,6 +52,9 @@ public function __construct(
5052 private array $ dynamicConstantNames ,
5153 private int |array |null $ phpVersion ,
5254 private ComposerPhpVersionFactory $ composerPhpVersionFactory ,
55+ private ?PhpVersion $ composerMinPhpVersion ,
56+ private ?PhpVersion $ composerMaxPhpVersion ,
57+ private ?Container $ container ,
5358 )
5459 {
5560 }
@@ -404,8 +409,17 @@ private function getMaxPhpVersion(): ?PhpVersion
404409
405410 public function resolveConstantType (string $ constantName , Type $ constantType ): Type
406411 {
407- if ($ constantType ->isConstantValue ()->yes () && in_array ($ constantName , $ this ->dynamicConstantNames , true )) {
408- return $ constantType ->generalize (GeneralizePrecision::lessSpecific ());
412+ if ($ constantType ->isConstantValue ()->yes ()) {
413+ if (array_key_exists ($ constantName , $ this ->dynamicConstantNames )) {
414+ $ phpdocTypes = $ this ->dynamicConstantNames [$ constantName ];
415+ $ typeStringResolver = $ this ->container ?->getByType(TypeStringResolver::class);
416+ if ($ typeStringResolver !== null ) {
417+ return $ typeStringResolver ->resolve ($ phpdocTypes , new NameScope (null , [], null ));
418+ }
419+ }
420+ if (in_array ($ constantName , $ this ->dynamicConstantNames , true )) {
421+ return $ constantType ->generalize (GeneralizePrecision::lessSpecific ());
422+ }
409423 }
410424
411425 return $ constantType ;
@@ -414,6 +428,20 @@ public function resolveConstantType(string $constantName, Type $constantType): T
414428 public function resolveClassConstantType (string $ className , string $ constantName , Type $ constantType , ?Type $ nativeType ): Type
415429 {
416430 $ lookupConstantName = sprintf ('%s::%s ' , $ className , $ constantName );
431+ if (array_key_exists ($ lookupConstantName , $ this ->dynamicConstantNames )) {
432+ if ($ nativeType !== null ) {
433+ return $ nativeType ;
434+ }
435+
436+ if ($ constantType ->isConstantValue ()->yes ()) {
437+ $ phpdocTypes = $ this ->dynamicConstantNames [$ lookupConstantName ];
438+ $ typeStringResolver = $ this ->container ?->getByType(TypeStringResolver::class);
439+ if ($ typeStringResolver !== null ) {
440+ return $ typeStringResolver ->resolve ($ phpdocTypes , new NameScope (null , [], $ className ));
441+ }
442+ }
443+ }
444+
417445 if (in_array ($ lookupConstantName , $ this ->dynamicConstantNames , true )) {
418446 if ($ nativeType !== null ) {
419447 return $ nativeType ;
0 commit comments