Skip to content

Commit

Permalink
[Scoper] Make phpstan/phpdoc-parser part of preload.php and preload-s…
Browse files Browse the repository at this point in the history
…plit-package.php (#2908)
  • Loading branch information
samsonasik committed Sep 5, 2022
1 parent f06d901 commit edf1d52
Show file tree
Hide file tree
Showing 6 changed files with 233 additions and 20 deletions.
130 changes: 111 additions & 19 deletions build/build-preload.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
declare(strict_types=1);

use Nette\Utils\Strings;
use Rector\Core\Console\Style\SymfonyStyleFactory;
use Rector\Core\Util\Reflection\PrivatesAccessor;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Finder\Finder;

Expand All @@ -27,7 +29,7 @@

$buildDirectory = $argv[1];

$symfonyStyleFactory = new \Rector\Core\Console\Style\SymfonyStyleFactory(new \Rector\Core\Util\Reflection\PrivatesAccessor());
$symfonyStyleFactory = new SymfonyStyleFactory(new PrivatesAccessor());
$symfonyStyle = $symfonyStyleFactory->create();

if (! is_string($buildDirectory)) {
Expand All @@ -45,13 +47,13 @@ final class PreloadBuilder
/**
* @var string
*/
private const PRELOAD_FILE_TEMPLATE = <<<'PHP'
private const PRELOAD_FILE_TEMPLATE = <<<'CODE_SAMPLE'
<?php
declare(strict_types=1);
PHP;
CODE_SAMPLE;

/**
* @var int
Expand All @@ -64,7 +66,8 @@ final class PreloadBuilder
*
* @var string[]
*/
private const HIGH_PRIORITY_FILES = [
private const HIGH_PRIORITY_FILES = [
// nikic/php-parser
'Node.php',
'NodeAbstract.php',
'Expr.php',
Expand Down Expand Up @@ -94,40 +97,90 @@ final class PreloadBuilder
'Declaration.php',
'Builder/FunctionLike.php',
'Stmt/FunctionLike.php',

// phpstan/phpdoc-parser
'NodeAttributes.php',
'ConstExprNode.php',
'PhpDocTagValueNode.php',
'TypeNode.php',
];

public function buildPreloadScript(string $buildDirectory, string $preloadFile): void
{
$this->buildPreloadScriptPhpParser($buildDirectory, $preloadFile);
$this->buildPreloadScriptPhpDocParser($buildDirectory, $preloadFile);
}

public function buildPreloadScriptForSplitPackage(string $buildDirectory, string $preloadFile): void
{
$this->buildPreloadScriptForSplitPhpParser($buildDirectory, $preloadFile);
$this->buildPreloadScriptForSplitPhpDocParser($buildDirectory, $preloadFile);
}

private function buildPreloadScriptForSplitPhpParser(string $buildDirectory, string $preloadFile): void
{
$vendorDir = $buildDirectory . '/vendor';
if (! is_dir($vendorDir . '/nikic/php-parser/lib/PhpParser')) {
return;
}

// 1. fine php-parser file infos
// 1. find php-parser file infos
$fileInfos = $this->findPhpParserFilesAndSortThem($vendorDir);

// 3. create preload.php from provided files
$preloadFileContent = $this->createPreloadFileContent($fileInfos);
// 2. create preload.php from provided files
$preloadFileContent = $this->createPreloadFileContentForSplitPackage($fileInfos);

file_put_contents($preloadFile, $preloadFileContent);
}

public function buildPreloadScriptForSplitPackage(string $buildDirectory, string $preloadFile): void
private function buildPreloadScriptForSplitPhpDocParser(string $buildDirectory, string $preloadFile): void
{
$vendorDir = $buildDirectory . '/vendor';
if (! is_dir($vendorDir . '/phpstan/phpdoc-parser')) {
return;
}

// 1. find phpdoc-parser file infos
$fileInfos = $this->findPhpDocParserFilesAndSortThem($vendorDir);

// 2. create preload-split-package.php from provided files
$preloadFileContent = $this->createPreloadFileContentForSplitPackage($fileInfos, true);

file_put_contents($preloadFile, $preloadFileContent, FILE_APPEND);
}

private function buildPreloadScriptPhpDocParser(string $buildDirectory, string $preloadFile): void
{
$vendorDir = $buildDirectory . '/vendor';
if (! is_dir($vendorDir . '/phpstan/phpdoc-parser')) {
return;
}

// 1. find phpdoc-parser file infos
$fileInfos = $this->findPhpDocParserFilesAndSortThem($vendorDir);

// 2. create preload.php from provided files
$preloadFileContent = $this->createPreloadFileContent($fileInfos, true);

file_put_contents($preloadFile, $preloadFileContent, FILE_APPEND);
}

private function buildPreloadScriptPhpParser(string $buildDirectory, string $preloadFile): void
{
$vendorDir = $buildDirectory . '/vendor';
if (! is_dir($vendorDir . '/nikic/php-parser/lib/PhpParser')) {
return;
}

// 1. find php-parser file infos
$fileInfos = $this->findPhpParserFilesAndSortThem($vendorDir);

// 3. create preload.php from provided files
$preloadFileContent = $this->createPreloadFileContentForSplitPackage($fileInfos);
$preloadFileContent = $this->createPreloadFileContent($fileInfos);

file_put_contents($preloadFile, $preloadFileContent);
}


/**
* @return SplFileInfo[]
*/
Expand All @@ -145,12 +198,26 @@ private function findPhpParserFiles(string $vendorDir): array
return iterator_to_array($finder->getIterator());
}

/**
* @return SplFileInfo[]
*/
private function findPhpDocParserFiles(string $vendorDir): array
{
$finder = (new Finder())
->files()
->name('*.php')
->in($vendorDir . '/phpstan/phpdoc-parser')
->sortByName();

return iterator_to_array($finder->getIterator());
}

/**
* @param SplFileInfo[] $fileInfos
*/
private function createPreloadFileContent(array $fileInfos): string
private function createPreloadFileContent(array $fileInfos, bool $append = false): string
{
$preloadFileContent = self::PRELOAD_FILE_TEMPLATE;
$preloadFileContent = $append ? '' : self::PRELOAD_FILE_TEMPLATE;

foreach ($fileInfos as $fileInfo) {
$realPath = $fileInfo->getRealPath();
Expand All @@ -167,9 +234,9 @@ private function createPreloadFileContent(array $fileInfos): string
/**
* @param SplFileInfo[] $fileInfos
*/
private function createPreloadFileContentForSplitPackage(array $fileInfos): string
private function createPreloadFileContentForSplitPackage(array $fileInfos, bool $append = false): string
{
$preloadFileContent = self::PRELOAD_FILE_TEMPLATE;
$preloadFileContent = $append ? '' : self::PRELOAD_FILE_TEMPLATE;

foreach ($fileInfos as $fileInfo) {
$realPath = $fileInfo->getRealPath();
Expand Down Expand Up @@ -226,25 +293,50 @@ private function matchFilePriorityPosition(SplFileInfo $splFileInfo): int
return self::PRIORITY_LESS_FILE_POSITION;
}

/**
* @return SplFileInfo[]
*/
private function findPhpDocParserFilesAndSortThem(string $vendorDir): array
{
// 1. find php-parser file infos
$fileInfos = $this->findPhpDocParserFiles($vendorDir);

// 2. put first-class usages first
$fileInfos = $this->sortFileInfos($fileInfos);

return $fileInfos;
}

/**
* @return SplFileInfo[]
*/
private function findPhpParserFilesAndSortThem(string $vendorDir): array
{
// 1. fine php-parser file infos
// 1. find php-parser file infos
$fileInfos = $this->findPhpParserFiles($vendorDir);

// 2. put first-class usages first
usort($fileInfos, function (SplFileInfo $firstFileInfo, SplFileInfo $secondFileInfo) {
$fileInfos = $this->sortFileInfos($fileInfos);

$stmtsAwareInterface = new SplFileInfo(__DIR__ . '/../src/Contract/PhpParser/Node/StmtsAwareInterface.php');
array_splice($fileInfos, 1, 0, [$stmtsAwareInterface]);

return $fileInfos;
}

/**
* @param SplFileInfo[] $fileInfos
* @return SplFileInfo[]
*/
private function sortFileInfos(array $fileInfos): array
{
usort($fileInfos, function (SplFileInfo $firstFileInfo, SplFileInfo $secondFileInfo): int {
$firstFilePosition = $this->matchFilePriorityPosition($firstFileInfo);
$secondFilePosition = $this->matchFilePriorityPosition($secondFileInfo);

return $secondFilePosition <=> $firstFilePosition;
});

$stmtsAwareInterface = new SplFileInfo(__DIR__ . '/../src/Contract/PhpParser/Node/StmtsAwareInterface.php');
array_splice($fileInfos, 1, 0, [$stmtsAwareInterface]);

return $fileInfos;
}
}
1 change: 0 additions & 1 deletion build/target-repository/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
}
},
"conflict": {
"phpstan/phpdoc-parser": "<1.7",
"rector/rector-phpunit": "*",
"rector/rector-symfony": "*",
"rector/rector-doctrine": "*",
Expand Down
1 change: 1 addition & 0 deletions ecs.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
__DIR__ . '/easy-ci.php',
__DIR__ . '/rector.php',
__DIR__ . '/scoper.php',
__DIR__ . '/build/build-preload.php',
]);

$ecsConfig->ruleWithConfiguration(NoSuperfluousPhpdocTagsFixer::class, [
Expand Down
60 changes: 60 additions & 0 deletions preload-split-package.php
Original file line number Diff line number Diff line change
Expand Up @@ -252,3 +252,63 @@
require_once __DIR__ . '/../../../vendor/nikic/php-parser/lib/PhpParser/Parser/Tokens.php';
require_once __DIR__ . '/../../../vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php';
require_once __DIR__ . '/../../../vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/Node.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Lexer/Lexer.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/NodeAttributes.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagValueNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/Type/TypeNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayItemNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFalseNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFloatNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNullNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprStringNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprTrueNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstFetchNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagMethodValueNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagPropertyValueNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagValueNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ExtendsTagValueNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ImplementsTagValueNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MixinTagValueNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocChildNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTextNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasImportTagValueNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasTagValueNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypelessParamTagValueNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/UsesTagValueNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeItemNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeForParameterNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/Type/ConstTypeNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/Type/ThisTypeNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Parser/ParserException.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Parser/TokenIterator.php';
require_once __DIR__ . '/../../../vendor/phpstan/phpdoc-parser/src/Parser/TypeParser.php';
Loading

0 comments on commit edf1d52

Please sign in to comment.