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: /** @var array<string, list<string>> */
20: private array $mappings = [];
21:
22: private function __construct()
23: {
24: }
25:
26: /** @param array<string, list<string>> $mappings */
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: /** {@inheritDoc} */
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: /** {@inheritDoc} */
67: public function directories(): array
68: {
69: return array_values(array_unique(array_merge([], ...array_values($this->mappings))));
70: }
71: }
72: