diff --git a/build/build-preload.php b/build/build-preload.php index 8129619832f..cac10bc1e87 100755 --- a/build/build-preload.php +++ b/build/build-preload.php @@ -51,11 +51,28 @@ final class PreloadBuilder declare(strict_types=1); +use PhpParser\Node; +use PHPStan\Testing\PHPStanTestCase; + if (defined('__PHPSTAN_RUNNING__')) { return; } +// edge case during Rector tests case, happens when +// 1. phpstan autoload test case is triggered first, +// 2. all php-parser classes are loaded, +if (defined('PHPUNIT_COMPOSER_INSTALL') && isPHPStanTestPreloaded()) { + return; +} +function isPHPStanTestPreloaded(): bool +{ + if (! class_exists(PHPStanTestCase::class, false)) { + return false; + } + + return interface_exists(Node::class, false); +} CODE_SAMPLE; /** diff --git a/ecs.php b/ecs.php index 0497edc8d5b..1ab742fc29d 100644 --- a/ecs.php +++ b/ecs.php @@ -24,6 +24,9 @@ '*/Fixture/*', '*/Expected/*', + // avoid re-running on build + __DIR__ . '/preload.php', + PhpdocTypesFixer::class => [ // double to Double false positive __DIR__ . '/rules/Php74/Rector/Double/RealToFloatTypeCastRector.php', diff --git a/preload-split-package.php b/preload-split-package.php index 7da50430478..b014aa1f698 100644 --- a/preload-split-package.php +++ b/preload-split-package.php @@ -2,11 +2,28 @@ declare(strict_types=1); +use PhpParser\Node; +use PHPStan\Testing\PHPStanTestCase; + if (defined('__PHPSTAN_RUNNING__')) { return; } -require_once __DIR__ . '/../../../vendor/nikic/php-parser/lib/PhpParser/Node.php'; +// edge case during Rector tests case, happens when +// 1. phpstan autoload test case is triggered first, +// 2. all php-parser classes are loaded, +if (defined('PHPUNIT_COMPOSER_INSTALL') && isPHPStanTestPreloaded()) { + return; +} + +function isPHPStanTestPreloaded(): bool +{ + if (! class_exists(PHPStanTestCase::class, false)) { + return false; + } + + return interface_exists(Node::class, false); +}require_once __DIR__ . '/../../../vendor/nikic/php-parser/lib/PhpParser/Node.php'; require_once __DIR__ . '/src/Contract/PhpParser/Node/StmtsAwareInterface.php'; require_once __DIR__ . '/../../../vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php'; require_once __DIR__ . '/../../../vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php'; diff --git a/preload.php b/preload.php index ff3df4b2673..0e8f2828f72 100644 --- a/preload.php +++ b/preload.php @@ -2,11 +2,28 @@ declare(strict_types=1); +use PhpParser\Node; +use PHPStan\Testing\PHPStanTestCase; + if (defined('__PHPSTAN_RUNNING__')) { return; } -require_once __DIR__ . '/vendor/nikic/php-parser/lib/PhpParser/Node.php'; +// edge case during Rector tests case, happens when +// 1. phpstan autoload test case is triggered first, +// 2. all php-parser classes are loaded, +if (defined('PHPUNIT_COMPOSER_INSTALL') && isPHPStanTestPreloaded()) { + return; +} + +function isPHPStanTestPreloaded(): bool +{ + if (! class_exists(PHPStanTestCase::class, false)) { + return false; + } + + return interface_exists(Node::class, false); +}require_once __DIR__ . '/vendor/nikic/php-parser/lib/PhpParser/Node.php'; require_once __DIR__ . '/src/Contract/PhpParser/Node/StmtsAwareInterface.php'; require_once __DIR__ . '/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php'; require_once __DIR__ . '/vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php'; diff --git a/src/BetterPhpDocParser/PhpDocManipulator/PhpDocTypeChanger.php b/src/BetterPhpDocParser/PhpDocManipulator/PhpDocTypeChanger.php index 8cb0abd62bc..4a4df6812cf 100644 --- a/src/BetterPhpDocParser/PhpDocManipulator/PhpDocTypeChanger.php +++ b/src/BetterPhpDocParser/PhpDocManipulator/PhpDocTypeChanger.php @@ -7,7 +7,6 @@ use PhpParser\Node\FunctionLike; use PhpParser\Node\Param; use PhpParser\Node\Stmt; -use PhpParser\Node\Stmt\ClassMethod; use PHPStan\PhpDocParser\Ast\ConstExpr\ConstFetchNode; use PHPStan\PhpDocParser\Ast\Node; use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode;