@@ -87,29 +87,58 @@ protected function execute(InputInterface $input, OutputInterface $output): int
87
87
$ finder ->files ()->in ($ srcDir )->name ('*.stub.php ' )
88
88
->exclude ('ext/skeleton ' );
89
89
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 = [];
97
92
foreach ($ finder as $ file ) {
98
93
$ stubPath = $ file ->getRealPath ();
99
94
[$ tmpClasses , $ tmpFunctions ] = $ this ->extractStub ($ stubPath , $ file ->getRelativePathname (), $ isUpdate , $ updateTo );
100
95
foreach ($ tmpClasses as $ className => $ fileName ) {
101
- $ classes [$ className ] = $ fileName ;
96
+ $ addClasses [$ className ] = $ fileName ;
102
97
}
103
98
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 ]);
105
134
}
106
135
}
107
136
108
137
// todo are there symbols missing at their original locations?
109
138
110
139
ksort ($ classes );
111
140
ksort ($ functions );
112
- $ this ->dumpMap ($ classes , $ functions );
141
+ $ this ->dumpMap ($ classes , $ functions, $ updateTo , $ addClasses , $ addFunctions );
113
142
114
143
return 0 ;
115
144
}
@@ -577,8 +606,10 @@ private function findPhpDocReturn(PhpDocNode $node): ?ReturnTagValueNode
577
606
/**
578
607
* @param array<string, string> $classes
579
608
* @param array<string, string> $functions
609
+ * @param array<string, string> $addClasses
610
+ * @param array<string, string> $addFunctions
580
611
*/
581
- private function dumpMap (array $ classes , array $ functions ): void
612
+ private function dumpMap (array $ classes , array $ functions, ? string $ updateTo , array $ addClasses , array $ addFunctions ): void
582
613
{
583
614
$ template = <<<'PHP'
584
615
<?php declare(strict_types = 1);
@@ -588,18 +619,50 @@ private function dumpMap(array $classes, array $functions): void
588
619
class Php8StubsMap
589
620
{
590
621
591
- public const CLASSES = %s;
622
+ /** @var array<string, string> */
623
+ public $classes;
592
624
593
- public const FUNCTIONS = %s;
625
+ /** @var array<string, string> */
626
+ public $functions;
594
627
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);
595
643
}
596
644
PHP;
597
645
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
+
598
652
file_put_contents (
599
653
__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
+ ),
601
665
);
602
-
603
666
}
604
667
605
668
};
0 commit comments