@@ -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
588619class 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}
596644PHP;
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