}|list|null $installedJson */ $installedJson = json_decode($jsonContent, true); if (! is_array($installedJson)) { throw FailedToParseJson::inFile($installedJsonPath); } /** @psalm-var list $installed */ $installed = $installedJson['packages'] ?? $installedJson; $classMapPaths = array_merge( [], ...array_map(fn (array $package): array => $this->prefixPaths( $this->packageToClassMapPaths($package), $this->packagePrefixPath($realInstallationPath, $package, $vendorDir), ), $installed), ); $classMapFiles = array_filter($classMapPaths, 'is_file'); $classMapDirectories = array_values(array_filter($classMapPaths, 'is_dir')); $filePaths = array_merge( [], ...array_map(fn (array $package): array => $this->prefixPaths( $this->packageToFilePaths($package), $this->packagePrefixPath($realInstallationPath, $package, $vendorDir), ), $installed), ); return new AggregateSourceLocator(array_merge( [ new PsrAutoloaderLocator( Psr4Mapping::fromArrayMappings(array_merge_recursive( [], ...array_map(fn (array $package): array => $this->prefixWithPackagePath( $this->packageToPsr4AutoloadNamespaces($package), $realInstallationPath, $package, $vendorDir, ), $installed), )), $astLocator, ), new PsrAutoloaderLocator( Psr0Mapping::fromArrayMappings(array_merge_recursive( [], ...array_map(fn (array $package): array => $this->prefixWithPackagePath( $this->packageToPsr0AutoloadNamespaces($package), $realInstallationPath, $package, $vendorDir, ), $installed), )), $astLocator, ), new DirectoriesSourceLocator($classMapDirectories, $astLocator), ], ...array_map( static function (string $file) use ($astLocator): array { assert($file !== ''); return [new SingleFileSourceLocator($file, $astLocator)]; }, array_merge($classMapFiles, $filePaths), ), )); } /** * @param ComposerPackage $package * * @return array> */ private function packageToPsr4AutoloadNamespaces(array $package): array { return array_map(static fn (string|array $namespacePaths): array => (array) $namespacePaths, $package['autoload']['psr-4'] ?? []); } /** * @param ComposerPackage $package * * @return array> */ private function packageToPsr0AutoloadNamespaces(array $package): array { return array_map(static fn (string|array $namespacePaths): array => (array) $namespacePaths, $package['autoload']['psr-0'] ?? []); } /** * @param ComposerPackage $package * * @return list */ private function packageToClassMapPaths(array $package): array { return $package['autoload']['classmap'] ?? []; } /** * @param ComposerPackage $package * * @return list */ private function packageToFilePaths(array $package): array { return $package['autoload']['files'] ?? []; } /** * @param ComposerPackage $package */ private function packagePrefixPath(string $trimmedInstallationPath, array $package, string $vendorDir): string { return $trimmedInstallationPath . '/' . $vendorDir . '/' . $package['name'] . '/'; } /** * @param array> $paths * @param ComposerPackage $package * * @return array> */ private function prefixWithPackagePath( array $paths, string $trimmedInstallationPath, array $package, string $vendorDir, ): array { $prefix = $this->packagePrefixPath($trimmedInstallationPath, $package, $vendorDir); return array_map(fn (array $paths): array => $this->prefixPaths($paths, $prefix), $paths); } /** * @param array $paths * * @return array */ private function prefixPaths(array $paths, string $prefix): array { return array_map(static fn (string $path): string => $prefix . $path, $paths); } } __halt_compiler();----SIGNATURE:----LuAKzsUj4iW76KGULysgwxVGCY3kSKpbxjniiA397BB8wqBB0bTdAtp6U3u+79UrMgu+s/c8T8XxBnqKtrggq40IutPs92Re4XxnbB1tuUMC1iqrA0GMtOcSoHbghuhkDmiga52Hyr4qae+7eTqh1V2f4la3i/hkrVrtyaqzTR50HDf45Sr7Szm7cYAhjmoUUBimkskI5lMuMYULLfQpmkptjShwkXVoUY/UB/m2nmGFIMSarUNyO2AmJJnAKBMMcXlCQSwah2KteKZJBS0X/+AHwAcYvXpbbAkTkY1HdhZBzwIbKCXOKdrfFzwB0gbTRYpXbyiWz+7Z7nlxbdLnJDA21gx+Xv/rPKuzB0UYQEeqv8HrbU1VIruuaXk+BQQ0O/3bM5q64ckVrg4XPef+c0AQ0852FjkTv28oqIQQg3a2pPNNtfENPfTVLbzZ+nsY0lKYjfc1ZbwkDSrRtcL6/iR0cErEn3k+yQgFjrZ5ZGUtVdSC2w96IlwTHp28bI5GhBaq3CZeoR448fBtTPktwQd+WqvvublTZJ41eiVCjZa4gj+QabzCizrWL8S+Uq94/rAA2bn/8G2u+j3wlltEHBpoWgRht0i6LrsfR/tA0hoHV6CpB7bdQobeViP6a+GyWNMJvvyJOqzhFzZcFb1Rhc15/PXuuzuHCdxjVV5iFIo=----ATTACHMENT:----OTk3ODg2NDk1MTQ4NzY2NCAxNjI3NTQ5MzEyMDIwNjU1IDU5OTM4NzIwMDQzOTk0MDc=