5
5
namespace Smeghead \PhpClassDiagram \Php ;
6
6
7
7
use PhpParser \Error ;
8
- use PhpParser \ParserFactory ;
9
- use PhpParser \Node \Stmt \{
10
- Namespace_ ,
11
- ClassLike ,
12
- };
8
+ use PhpParser \Node ;
9
+ use PhpParser \Node \Stmt \ClassLike ;
10
+ use PhpParser \Node \Stmt \Namespace_ ;
13
11
use PhpParser \NodeTraverser ;
14
12
use PhpParser \NodeVisitor \NameResolver ;
13
+ use PhpParser \ParserFactory ;
14
+ use RuntimeException ;
15
15
use Smeghead \PhpClassDiagram \Config \Options ;
16
16
17
17
final class PhpReader
18
18
{
19
- private PhpClass $ class ;
19
+ private function __construct (
20
+ private PhpClass $ class ,
21
+ ) {
22
+ }
20
23
21
- private function __construct ( PhpClass $ class )
24
+ public function getInfo (): PhpClass
22
25
{
23
- $ this ->class = $ class ;
26
+ return $ this ->class ;
24
27
}
25
28
26
29
/**
27
- * @return PhpReader[]
30
+ * @return list< PhpReader>
28
31
*/
29
32
public static function parseFile (string $ directory , string $ filename , Options $ options ): array
30
33
{
31
34
$ code = file_get_contents ($ filename );
32
35
33
- $ targetVesion = ParserFactory::PREFER_PHP7 ;
34
- switch ($ options ->phpVersion ()) {
35
- case 'php5 ' :
36
- $ targetVesion = ParserFactory::PREFER_PHP5 ;
37
- break ;
38
- case 'php7 ' :
39
- $ targetVesion = ParserFactory::PREFER_PHP7 ;
40
- break ;
41
- case 'php8 ' :
42
- $ targetVesion = ParserFactory::PREFER_PHP7 ; // php-parser でまだ php8 がサポートされていない。
43
- break ;
44
- default :
45
- throw new \Exception ("invalid php version. {$ targetVesion }\n" );
46
- }
47
- $ parser = (new ParserFactory )->create ($ targetVesion );
36
+ $ targetVersion = match ($ options ->phpVersion ()) {
37
+ 'php5 ' => ParserFactory::PREFER_PHP5 ,
38
+ 'php7 ' , 'php8 ' => ParserFactory::PREFER_PHP7 , // php-parser でまだ php8 がサポートされていない。
39
+ default => throw new RuntimeException (sprintf ("invalid php version %s \n" , ParserFactory::PREFER_PHP7 )),
40
+ };
41
+
42
+ $ parser = (new ParserFactory )->create ($ targetVersion );
48
43
try {
49
44
$ ast = $ parser ->parse ($ code );
50
45
$ nameResolver = new NameResolver ();
@@ -53,43 +48,45 @@ public static function parseFile(string $directory, string $filename, Options $o
53
48
// Resolve names
54
49
$ ast = $ nodeTraverser ->traverse ($ ast );
55
50
} catch (Error $ error ) {
56
- throw new \ Exception ( "Parse error: { $ error ->getMessage ()} file: { $ filename}\n" );
51
+ throw new RuntimeException ( sprintf ( "Parse error: %s file: %s \n" , $ error ->getMessage (), $ filename) );
57
52
}
58
53
59
54
$ relativePath = mb_substr ($ filename , mb_strlen ($ directory ) + 1 );
60
55
$ classes = [];
61
56
foreach (self ::getClasses ($ relativePath , $ ast ) as $ class ) {
62
57
$ classes [] = new self ($ class );
63
58
}
59
+
64
60
return $ classes ;
65
61
}
66
62
67
63
/**
68
- * @param \PhpParser\Node[] $ast
69
- * @return PhpClass[]|null
64
+ * @param list<Node> $ast
65
+ *
66
+ * @return list<PhpClass>
70
67
*/
71
- private static function getClasses (string $ relativePath , array $ ast ): ? array
68
+ private static function getClasses (string $ relativePath , array $ ast ): array
72
69
{
73
70
if (count ($ ast ) === 0 ) {
74
- return null ;
71
+ return [] ;
75
72
}
73
+
76
74
$ classes = [];
77
75
foreach ($ ast as $ element ) {
78
76
if ($ element instanceof ClassLike) {
79
77
$ classes [] = new PhpClass ($ relativePath , $ element , $ ast );
80
- } else if ($ element instanceof Namespace_) {
78
+ continue ;
79
+ }
80
+
81
+ if ($ element instanceof Namespace_) {
81
82
foreach ($ element ->stmts as $ e ) {
82
83
if ($ e instanceof ClassLike) {
83
84
$ classes [] = new PhpClass ($ relativePath , $ e , $ ast );
84
85
}
85
86
}
86
87
}
87
88
}
88
- return $ classes ;
89
- }
90
89
91
- public function getInfo (): PhpClass
92
- {
93
- return $ this ->class ;
90
+ return $ classes ;
94
91
}
95
92
}
0 commit comments