88use PHPStan \Analyser \Error ;
99use PHPStan \Collectors \CollectedData ;
1010use PHPStan \Command \Output ;
11- use PHPStan \Dependency \ExportedNode ;
1211use PHPStan \Dependency \ExportedNodeFetcher ;
12+ use PHPStan \Dependency \RootExportedNode ;
1313use PHPStan \File \FileFinder ;
1414use PHPStan \File \FileReader ;
1515use PHPStan \File \FileWriter ;
@@ -225,11 +225,13 @@ public function restore(array $allAnalysedFiles, bool $debug, bool $onlyFiles, ?
225225 }
226226
227227 $ cachedFileExportedNodes = $ filteredExportedNodes [$ analysedFile ];
228- if (count ($ dependentFiles ) === 0 ) {
228+ $ exportedNodesChanged = $ this ->exportedNodesChanged ($ analysedFile , $ cachedFileExportedNodes );
229+ if ($ exportedNodesChanged === null ) {
229230 continue ;
230231 }
231- if (!$ this ->exportedNodesChanged ($ analysedFile , $ cachedFileExportedNodes )) {
232- continue ;
232+
233+ if ($ exportedNodesChanged ) {
234+ $ newFileAppeared = true ;
233235 }
234236
235237 foreach ($ dependentFiles as $ dependentFile ) {
@@ -279,26 +281,42 @@ private function isMetaDifferent(array $cachedMeta, array $currentMeta): bool
279281 }
280282
281283 /**
282- * @param array<int, ExportedNode> $cachedFileExportedNodes
284+ * @param array<int, RootExportedNode> $cachedFileExportedNodes
285+ * @return bool|null null means nothing changed, true means new root symbol appeared, false means nested node changed
283286 */
284- private function exportedNodesChanged (string $ analysedFile , array $ cachedFileExportedNodes ): bool
287+ private function exportedNodesChanged (string $ analysedFile , array $ cachedFileExportedNodes ): ? bool
285288 {
286289 if (array_key_exists ($ analysedFile , $ this ->fileReplacements )) {
287290 $ analysedFile = $ this ->fileReplacements [$ analysedFile ];
288291 }
289292 $ fileExportedNodes = $ this ->exportedNodeFetcher ->fetchNodes ($ analysedFile );
293+
294+ $ cachedSymbols = [];
295+ foreach ($ cachedFileExportedNodes as $ cachedFileExportedNode ) {
296+ $ cachedSymbols [$ cachedFileExportedNode ->getType ()][] = $ cachedFileExportedNode ->getName ();
297+ }
298+
299+ $ fileSymbols = [];
300+ foreach ($ fileExportedNodes as $ fileExportedNode ) {
301+ $ fileSymbols [$ fileExportedNode ->getType ()][] = $ fileExportedNode ->getName ();
302+ }
303+
304+ if ($ cachedSymbols !== $ fileSymbols ) {
305+ return true ;
306+ }
307+
290308 if (count ($ fileExportedNodes ) !== count ($ cachedFileExportedNodes )) {
291309 return true ;
292310 }
293311
294312 foreach ($ fileExportedNodes as $ i => $ fileExportedNode ) {
295313 $ cachedExportedNode = $ cachedFileExportedNodes [$ i ];
296314 if (!$ cachedExportedNode ->equals ($ fileExportedNode )) {
297- return true ;
315+ return false ;
298316 }
299317 }
300318
301- return false ;
319+ return null ;
302320 }
303321
304322 /**
@@ -487,8 +505,8 @@ private function mergeDependencies(ResultCache $resultCache, ?array $freshDepend
487505 }
488506
489507 /**
490- * @param array<string, array<ExportedNode >> $freshExportedNodes
491- * @return array<string, array<ExportedNode >>
508+ * @param array<string, array<RootExportedNode >> $freshExportedNodes
509+ * @return array<string, array<RootExportedNode >>
492510 */
493511 private function mergeExportedNodes (ResultCache $ resultCache , array $ freshExportedNodes ): array
494512 {
@@ -509,7 +527,7 @@ private function mergeExportedNodes(ResultCache $resultCache, array $freshExport
509527 * @param array<string, array<Error>> $errors
510528 * @param array<string, array<CollectedData>> $collectedData
511529 * @param array<string, array<string>> $dependencies
512- * @param array<string, array<ExportedNode >> $exportedNodes
530+ * @param array<string, array<RootExportedNode >> $exportedNodes
513531 * @param mixed[] $meta
514532 */
515533 private function save (
0 commit comments