|
6 | 6 | use Phpactor\ClassFileConverter\Domain\ClassNameCandidates; |
7 | 7 | use Phpactor\ClassFileConverter\Domain\FilePath; |
8 | 8 | use Phpactor\ClassFileConverter\Domain\ClassName; |
| 9 | +use Phpactor\ClassFileConverter\Adapter\Simple\ClassScanner; |
9 | 10 |
|
10 | 11 | class SimpleFileToClass implements FileToClass |
11 | 12 | { |
| 13 | + /** |
| 14 | + * @var ClassScanner |
| 15 | + */ |
| 16 | + private $classScanner; |
| 17 | + |
| 18 | + public function __construct() |
| 19 | + { |
| 20 | + $this->classScanner = new ClassScanner(); |
| 21 | + } |
| 22 | + |
12 | 23 | public function fileToClassCandidates(FilePath $filePath): ClassNameCandidates |
13 | 24 | { |
14 | 25 | $classNames = []; |
15 | 26 |
|
16 | | - $className = $this->getClassNameFromFile($filePath->__toString()); |
| 27 | + $className = $this->classScanner->getClassNameFromFile($filePath->__toString()); |
17 | 28 |
|
18 | 29 | if ($className) { |
19 | 30 | $classNames[] = ClassName::fromString($className); |
20 | 31 | } |
21 | 32 |
|
22 | 33 | return ClassNameCandidates::fromClassNames($classNames); |
23 | 34 | } |
24 | | - |
25 | | - /** |
26 | | - * Return the class name from a file. |
27 | | - * |
28 | | - * Taken from http://stackoverflow.com/questions/7153000/get-class-name-from-file |
29 | | - * |
30 | | - * @param string $file |
31 | | - * |
32 | | - * @return string |
33 | | - */ |
34 | | - private function getClassNameFromFile($file) |
35 | | - { |
36 | | - $fp = fopen($file, 'r'); |
37 | | - |
38 | | - $class = $namespace = $buffer = ''; |
39 | | - $i = 0; |
40 | | - |
41 | | - while (!$class) { |
42 | | - if (feof($fp)) { |
43 | | - break; |
44 | | - } |
45 | | - |
46 | | - // Read entire lines to prevent keyword truncation |
47 | | - for ($line = 0; $line <= 20; $line++) { |
48 | | - $buffer .= fgets($fp); |
49 | | - } |
50 | | - $tokens = @token_get_all($buffer); |
51 | | - |
52 | | - if (strpos($buffer, '{') === false) { |
53 | | - continue; |
54 | | - } |
55 | | - |
56 | | - for (; $i < count($tokens); $i++) { |
57 | | - if ($tokens[$i][0] === T_NAMESPACE) { |
58 | | - for ($j = $i + 1; $j < count($tokens); $j++) { |
59 | | - if ($tokens[$j][0] === T_STRING) { |
60 | | - $namespace .= '\\' . $tokens[$j][1]; |
61 | | - } elseif ($tokens[$j] === '{' || $tokens[$j] === ';') { |
62 | | - break; |
63 | | - } |
64 | | - } |
65 | | - } |
66 | | - |
67 | | - if ($tokens[$i][0] === T_CLASS) { |
68 | | - for ($j = $i + 1; $j < count($tokens); $j++) { |
69 | | - if ($tokens[$j][0] === T_STRING) { |
70 | | - $class = $tokens[$i + 2][1]; |
71 | | - break 2; |
72 | | - } |
73 | | - } |
74 | | - } |
75 | | - } |
76 | | - } |
77 | | - |
78 | | - if (!trim($class)) { |
79 | | - return; |
80 | | - } |
81 | | - |
82 | | - fclose($fp); |
83 | | - |
84 | | - return ltrim($namespace . '\\' . $class, '\\'); |
85 | | - } |
86 | 35 | } |
0 commit comments