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 @@ +