| 1: | <?php | 
| 2: |  | 
| 3: | declare(strict_types=1); | 
| 4: |  | 
| 5: | namespace PHPStan\BetterReflection\SourceLocator\Type\Composer\Psr; | 
| 6: |  | 
| 7: | use PHPStan\BetterReflection\Identifier\Identifier; | 
| 8: |  | 
| 9: | use function array_map; | 
| 10: | use function array_merge; | 
| 11: | use function array_unique; | 
| 12: | use function array_values; | 
| 13: | use function rtrim; | 
| 14: | use function str_replace; | 
| 15: | use function str_starts_with; | 
| 16: |  | 
| 17: | final class Psr0Mapping implements PsrAutoloaderMapping | 
| 18: | { | 
| 19: |  | 
| 20: | private array $mappings = []; | 
| 21: |  | 
| 22: | private function __construct() | 
| 23: | { | 
| 24: | } | 
| 25: |  | 
| 26: |  | 
| 27: | public static function fromArrayMappings(array $mappings): self | 
| 28: | { | 
| 29: | $instance = new self(); | 
| 30: |  | 
| 31: | $instance->mappings = array_map( | 
| 32: | static function (array $directories): array { | 
| 33: | return array_map(static fn (string $directory): string => rtrim($directory, '/'), $directories); | 
| 34: | }, | 
| 35: | $mappings, | 
| 36: | ); | 
| 37: |  | 
| 38: | return $instance; | 
| 39: | } | 
| 40: |  | 
| 41: |  | 
| 42: | public function resolvePossibleFilePaths(Identifier $identifier): array | 
| 43: | { | 
| 44: | if (! $identifier->isClass()) { | 
| 45: | return []; | 
| 46: | } | 
| 47: |  | 
| 48: | $className = $identifier->getName(); | 
| 49: |  | 
| 50: | foreach ($this->mappings as $prefix => $paths) { | 
| 51: | if ($prefix === '') { | 
| 52: | continue; | 
| 53: | } | 
| 54: |  | 
| 55: | if (strpos($className, $prefix) === 0) { | 
| 56: | return array_map( | 
| 57: | static fn (string $path): string => $path . '/' . str_replace(['\\', '_'], '/', $className) . '.php', | 
| 58: | $paths, | 
| 59: | ); | 
| 60: | } | 
| 61: | } | 
| 62: |  | 
| 63: | return []; | 
| 64: | } | 
| 65: |  | 
| 66: |  | 
| 67: | public function directories(): array | 
| 68: | { | 
| 69: | return array_values(array_unique(array_merge([], ...array_values($this->mappings)))); | 
| 70: | } | 
| 71: | } | 
| 72: |  |