diff --git a/composer.json b/composer.json
index 9db7c848f2a..0350ce192de 100644
--- a/composer.json
+++ b/composer.json
@@ -52,6 +52,7 @@
"amphp/phpunit-util": "^3",
"bamarni/composer-bin-plugin": "^1.4",
"brianium/paratest": "^6.9",
+ "danog/class-finder": "^0.4.8",
"dg/bypass-finals": "^1.5",
"mockery/mockery": "^1.5",
"nunomaduro/mock-final-classes": "^1.1",
@@ -132,13 +133,14 @@
],
"gen_callmap": "./bin/stubs/gen_callmap.sh",
"gen_propertymap": "@php ./bin/stubs/update-property-map.php",
+ "gen_preloader": "@php ./bin/stubs/gen_preloader.php",
"generate_issues_list_doc": "@php ./bin/docs/generate_issues_list_doc.php",
"generate_levels_doc": "@php ./bin/docs/generate_levels_doc.php",
"build": [
- "@gen_callmap",
- "@gen_propertymap",
+ "@gen_preloader",
"@generate_issues_list_doc",
- "@generate_levels_doc"
+ "@generate_levels_doc",
+ "@cs-fix"
]
},
"scripts-descriptions": {
diff --git a/phpcs.xml b/phpcs.xml
index 731482a19a6..50dabe896eb 100644
--- a/phpcs.xml
+++ b/phpcs.xml
@@ -24,6 +24,7 @@
tests/
+ src/Psalm/Internal/PreloaderList.php
src/Psalm/Internal/Stubs/
tests/fixtures/
diff --git a/psalm-baseline.xml b/psalm-baseline.xml
index dd6b7d42f60..14ee0eaec99 100644
--- a/psalm-baseline.xml
+++ b/psalm-baseline.xml
@@ -1,5 +1,5 @@
-
+
tags['variablesfrom'][0]]]>
@@ -1639,6 +1639,9 @@
+
+
+
diff --git a/src/Psalm/Internal/Cli/Psalm.php b/src/Psalm/Internal/Cli/Psalm.php
index e35457b40c6..a6c03e5ce55 100644
--- a/src/Psalm/Internal/Cli/Psalm.php
+++ b/src/Psalm/Internal/Cli/Psalm.php
@@ -18,6 +18,7 @@
use Psalm\Internal\ErrorHandler;
use Psalm\Internal\Fork\PsalmRestarter;
use Psalm\Internal\IncludeCollector;
+use Psalm\Internal\Preloader;
use Psalm\Internal\Provider\ClassLikeStorageCacheProvider;
use Psalm\Internal\Provider\FileProvider;
use Psalm\Internal\Provider\FileReferenceCacheProvider;
@@ -48,7 +49,6 @@
use function array_slice;
use function array_sum;
use function array_values;
-use function assert;
use function chdir;
use function count;
use function defined;
@@ -1018,9 +1018,11 @@ private static function restart(array $options, int $threads, int $scanThreads,
exit(1);
}
}
+
+ Preloader::preload($progress, $hasJit);
}
- /** @psalm-suppress UnusedParam $argv is being reported as unused */
+ /** @param array $argv */
private static function forwardCliCall(array $options, array $argv): void
{
if (isset($options['alter'])) {
@@ -1031,9 +1033,9 @@ private static function forwardCliCall(array $options, array $argv): void
if (isset($options['review'])) {
require_once __DIR__ . '/Review.php';
- assert($argv !== null);
array_shift($argv);
- Review::run($argv);
+ /** @psalm-suppress PossiblyNullArgument */
+ Review::run(array_values($argv));
exit;
}
diff --git a/src/Psalm/Internal/Cli/Psalter.php b/src/Psalm/Internal/Cli/Psalter.php
index 772245e0acd..1699285ee7f 100644
--- a/src/Psalm/Internal/Cli/Psalter.php
+++ b/src/Psalm/Internal/Cli/Psalter.php
@@ -13,6 +13,7 @@
use Psalm\Internal\ErrorHandler;
use Psalm\Internal\Fork\PsalmRestarter;
use Psalm\Internal\IncludeCollector;
+use Psalm\Internal\Preloader;
use Psalm\Internal\Provider\ClassLikeStorageCacheProvider;
use Psalm\Internal\Provider\FileProvider;
use Psalm\Internal\Provider\FileStorageCacheProvider;
@@ -243,6 +244,8 @@ public static function run(array $argv): void
// If Xdebug is enabled, restart without it
$ini_handler->check();
+ Preloader::preload();
+
$paths_to_check = CliUtils::getPathsToCheck($options['f'] ?? null);
$path_to_config = CliUtils::getPathToConfig($options);
diff --git a/src/Psalm/Internal/Preloader.php b/src/Psalm/Internal/Preloader.php
new file mode 100644
index 00000000000..5e744625d59
--- /dev/null
+++ b/src/Psalm/Internal/Preloader.php
@@ -0,0 +1,34 @@
+write("JIT compilation in progress... ");
+ }
+ foreach (PreloaderList::CLASSES as $class) {
+ class_exists($class);
+ }
+ if ($hasJit) {
+ $progress?->write("Done.".PHP_EOL.PHP_EOL);
+ }
+ self::$preloaded = true;
+ }
+}
diff --git a/src/Psalm/Internal/PreloaderList.php b/src/Psalm/Internal/PreloaderList.php
new file mode 100644
index 00000000000..c4c3ff6d755
--- /dev/null
+++ b/src/Psalm/Internal/PreloaderList.php
@@ -0,0 +1,1782 @@
+