Skip to content

Commit 6707a29

Browse files
committed
Rework Php8StubsMap to accept PHP version in the constructor, create lists dynamically
1 parent 309c63b commit 6707a29

File tree

1 file changed

+78
-15
lines changed

1 file changed

+78
-15
lines changed

extractor/extract.php

+78-15
Original file line numberDiff line numberDiff line change
@@ -87,29 +87,58 @@ protected function execute(InputInterface $input, OutputInterface $output): int
8787
$finder->files()->in($srcDir)->name('*.stub.php')
8888
->exclude('ext/skeleton');
8989

90-
$classes = [];
91-
$functions = [];
92-
if ($isUpdate) {
93-
require_once __DIR__ . '/../Php8StubsMap.php';
94-
$classes = \PHPStan\Php8StubsMap::CLASSES;
95-
$functions = \PHPStan\Php8StubsMap::FUNCTIONS;
96-
}
90+
$addClasses = [];
91+
$addFunctions = [];
9792
foreach ($finder as $file) {
9893
$stubPath = $file->getRealPath();
9994
[$tmpClasses, $tmpFunctions] = $this->extractStub($stubPath, $file->getRelativePathname(), $isUpdate, $updateTo);
10095
foreach ($tmpClasses as $className => $fileName) {
101-
$classes[$className] = $fileName;
96+
$addClasses[$className] = $fileName;
10297
}
10398
foreach ($tmpFunctions as $functionName => $fileName) {
104-
$functions[$functionName] = $fileName;
99+
$addFunctions[$functionName] = $fileName;
100+
}
101+
}
102+
103+
if (!$isUpdate) {
104+
$classes = $addClasses;
105+
$functions = $addFunctions;
106+
$addClasses = [];
107+
$addFunctions = [];
108+
} else {
109+
require_once __DIR__ . '/../Php8StubsMap.php';
110+
$map = new \PHPStan\Php8StubsMap(80000); // todo "from" argument when updating from 8.1 to 8.2 for example
111+
$classes = $map->classes;
112+
$functions = $map->functions;
113+
foreach ($addClasses as $className => $fileName) {
114+
if (!array_key_exists($className, $classes)) {
115+
continue;
116+
}
117+
118+
if ($classes[$className] !== $fileName) {
119+
throw new \LogicException(sprintf('File name of class %s changed from %s to %s.', $className, $classes[$className], $fileName));
120+
}
121+
122+
unset($addClasses[$className]);
123+
}
124+
foreach ($addFunctions as $functionName => $fileName) {
125+
if (!array_key_exists($functionName, $functions)) {
126+
continue;
127+
}
128+
129+
if ($functions[$functionName] !== $fileName) {
130+
throw new \LogicException(sprintf('File name of function %s changed from %s to %s.', $functionName, $functions[$functionName], $fileName));
131+
}
132+
133+
unset($addFunctions[$functionName]);
105134
}
106135
}
107136

108137
// todo are there symbols missing at their original locations?
109138
110139
ksort($classes);
111140
ksort($functions);
112-
$this->dumpMap($classes, $functions);
141+
$this->dumpMap($classes, $functions, $updateTo, $addClasses, $addFunctions);
113142

114143
return 0;
115144
}
@@ -577,8 +606,10 @@ private function findPhpDocReturn(PhpDocNode $node): ?ReturnTagValueNode
577606
/**
578607
* @param array<string, string> $classes
579608
* @param array<string, string> $functions
609+
* @param array<string, string> $addClasses
610+
* @param array<string, string> $addFunctions
580611
*/
581-
private function dumpMap(array $classes, array $functions): void
612+
private function dumpMap(array $classes, array $functions, ?string $updateTo, array $addClasses, array $addFunctions): void
582613
{
583614
$template = <<<'PHP'
584615
<?php declare(strict_types = 1);
@@ -588,18 +619,50 @@ private function dumpMap(array $classes, array $functions): void
588619
class Php8StubsMap
589620
{
590621
591-
public const CLASSES = %s;
622+
/** @var array<string, string> */
623+
public $classes;
592624
593-
public const FUNCTIONS = %s;
625+
/** @var array<string, string> */
626+
public $functions;
594627
628+
public function __construct(int $phpVersionId)
629+
{
630+
$classes = %s;
631+
$functions = %s;
632+
%s
633+
$this->classes = $classes;
634+
$this->functions = $functions;
635+
}
636+
637+
}
638+
PHP;
639+
$updateTemplate = <<<'PHP'
640+
if ($phpVersionId >= %d) {
641+
$classes = \array_merge($classes, %s);
642+
$functions = \array_merge($functions, %s);
595643
}
596644
PHP;
597645

646+
$phpVersion = null;
647+
if ($updateTo !== null) {
648+
$parts = explode('.', $updateTo);
649+
$phpVersion = (int) $parts[0] * 10000 + (int) ($parts[1] ?? 0) * 100 + (int) ($parts[2] ?? 0);
650+
}
651+
598652
file_put_contents(
599653
__DIR__ . '/../Php8StubsMap.php',
600-
sprintf($template, var_export($classes, true), var_export($functions, true))
654+
sprintf(
655+
$template,
656+
var_export($classes, true),
657+
var_export($functions, true),
658+
$phpVersion === null ? '' : sprintf(
659+
$updateTemplate,
660+
$phpVersion,
661+
var_export($addClasses, true),
662+
var_export($addFunctions, true)
663+
)
664+
),
601665
);
602-
603666
}
604667

605668
};

0 commit comments

Comments
 (0)