diff --git a/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php b/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php index 4a4779d39f6..989bae6e232 100644 --- a/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php +++ b/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php @@ -238,6 +238,12 @@ public function enterNode(PhpParser\Node $node): ?int $var_id = '$' . $var->name; $functionlike_node_scanner->storage->global_variables[$var_id] = true; + + if (isset($this->codebase->config->globals[$var_id])) { + $var_type = Type::parseString($this->codebase->config->globals[$var_id]); + /** @psalm-suppress UnusedMethodCall */ + $var_type->queueClassLikesForScanning($this->codebase, $this->file_storage); + } } } } diff --git a/tests/Internal/Scanner/FileScannerTest.php b/tests/Internal/Scanner/FileScannerTest.php new file mode 100644 index 00000000000..bb2b9ee91f7 --- /dev/null +++ b/tests/Internal/Scanner/FileScannerTest.php @@ -0,0 +1,90 @@ +registerFile('/dir/file.php', $file_contents); + + $file_scanner = new FileScanner('/dir/file.php', 'file.php', true); + $file_storage = new FileStorage('/dir/file.php'); + $file_scanner->scan( + $codebase, + $file_storage, + ); + + // Reset properties that are difficult to mock + foreach ($file_storage->functions as $function_storage) { + $function_storage->location = null; + $function_storage->stmt_location = null; + } + + self::assertEquals($expected_file_storage, $file_storage); + } + + /** + * @return iterable + */ + public static function providerScan(): iterable + { + $config = new TestConfig(); + $config->globals['$global'] = 'GlobalClass'; + + $function_storage_some_function = new FunctionStorage(); + $function_storage_some_function->cased_name = 'some_function'; + $function_storage_some_function->required_param_count = 0; + $function_storage_some_function->global_variables = [ + '$global' => true, + ]; + + $file_storage = new FileStorage('/dir/file.php'); + $file_storage->deep_scan = true; + $file_storage->aliases = new Aliases(); + $file_storage->functions = [ + 'some_function' => $function_storage_some_function, + ]; + $file_storage->declaring_function_ids = [ + 'some_function' => '/dir/file.php', + ]; + $file_storage->referenced_classlikes = [ + 'globalclass' => 'GlobalClass', + ]; + yield 'referenceConfiguredGlobalClass' => [ + $config, + <<<'PHP' +