• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

api-platform / core / 13203308337

07 Feb 2025 03:50PM UTC coverage: 8.516% (+0.3%) from 8.168%
13203308337

push

github

soyuka
docs: v4.1.0-beta.2

13369 of 156987 relevant lines covered (8.52%)

22.88 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

91.18
/src/Metadata/Util/ReflectionClassRecursiveIterator.php
1
<?php
2

3
/*
4
 * This file is part of the API Platform project.
5
 *
6
 * (c) Kévin Dunglas <dunglas@gmail.com>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11

12
declare(strict_types=1);
13

14
namespace ApiPlatform\Metadata\Util;
15

16
/**
17
 * Gets reflection classes for php files in the given directories.
18
 *
19
 * @author Antoine Bluchet <soyuka@gmail.com>
20
 *
21
 * @internal
22
 */
23
final class ReflectionClassRecursiveIterator
24
{
25
    /**
26
     * @var array<string, array<class-string, \ReflectionClass>>
27
     */
28
    private static array $localCache;
29

30
    private function __construct()
31
    {
32
    }
×
33

34
    /**
35
     * @return array<class-string, \ReflectionClass>
36
     */
37
    public static function getReflectionClassesFromDirectories(array $directories): array
38
    {
39
        $id = hash('xxh3', implode('', $directories));
8✔
40
        if (isset(self::$localCache[$id])) {
8✔
41
            return self::$localCache[$id];
4✔
42
        }
43

44
        $includedFiles = [];
4✔
45
        foreach ($directories as $path) {
4✔
46
            $iterator = new \RegexIterator(
4✔
47
                new \RecursiveIteratorIterator(
4✔
48
                    new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS),
4✔
49
                    \RecursiveIteratorIterator::LEAVES_ONLY
4✔
50
                ),
4✔
51
                '/^.+\.php$/i',
4✔
52
                \RecursiveRegexIterator::GET_MATCH
4✔
53
            );
4✔
54

55
            foreach ($iterator as $file) {
4✔
56
                $sourceFile = $file[0];
4✔
57

58
                if (!preg_match('(^phar:)i', (string) $sourceFile)) {
4✔
59
                    $sourceFile = realpath($sourceFile);
4✔
60
                }
61

62
                try {
63
                    require_once $sourceFile;
4✔
64
                } catch (\Throwable) {
×
65
                    // invalid PHP file (example: missing parent class)
66
                    continue;
×
67
                }
68

69
                $includedFiles[$sourceFile] = true;
4✔
70
            }
71
        }
72

73
        $sortedClasses = get_declared_classes();
4✔
74
        sort($sortedClasses);
4✔
75
        $sortedInterfaces = get_declared_interfaces();
4✔
76
        sort($sortedInterfaces);
4✔
77
        $declared = [...$sortedClasses, ...$sortedInterfaces];
4✔
78
        $ret = [];
4✔
79
        foreach ($declared as $className) {
4✔
80
            $reflectionClass = new \ReflectionClass($className);
4✔
81
            $sourceFile = $reflectionClass->getFileName();
4✔
82
            if (isset($includedFiles[$sourceFile])) {
4✔
83
                $ret[$className] = $reflectionClass;
4✔
84
            }
85
        }
86

87
        return self::$localCache[$id] = $ret;
4✔
88
    }
89
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc