diff --git a/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php b/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php index 5a1bb9975ed..6462c6d1cd4 100644 --- a/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php +++ b/src/Psalm/Internal/Analyzer/Statements/Expression/SimpleTypeInferer.php @@ -431,6 +431,18 @@ public static function infer( } } + if ($stmt instanceof PhpParser\Node\Expr\New_) { + $resolved_class_name = $stmt->class->getAttribute('resolvedName'); + + if (!is_string($resolved_class_name)) { + return null; + } + + return new Union([ + new Type\Atomic\TNamedObject($resolved_class_name) + ]); + } + return null; } diff --git a/tests/ConstantTest.php b/tests/ConstantTest.php index 22250503f13..d1a1af3ea43 100644 --- a/tests/ConstantTest.php +++ b/tests/ConstantTest.php @@ -2,14 +2,55 @@ namespace Psalm\Tests; +use Psalm\Context; use Psalm\Tests\Traits\InvalidCodeAnalysisTestTrait; use Psalm\Tests\Traits\ValidCodeAnalysisTestTrait; +use function getcwd; + +use const DIRECTORY_SEPARATOR; + class ConstantTest extends TestCase { use InvalidCodeAnalysisTestTrait; use ValidCodeAnalysisTestTrait; + public function testUseObjectConstant(): void + { + $file1 = getcwd() . DIRECTORY_SEPARATOR . 'tests' . DIRECTORY_SEPARATOR . 'file1.php'; + $file2 = getcwd() . DIRECTORY_SEPARATOR . 'tests' . DIRECTORY_SEPARATOR . 'file2.php'; + + $this->addFile( + $file1, + 'addFile( + $file2, + 'analyzeFile($file1, new Context()); + $this->analyzeFile($file2, new Context()); + } + /** * @return iterable,error_levels?:string[], php_version?: string}> */