Skip to content

Commit 7c3a613

Browse files
committed
namespace parameters
1 parent 9409aa7 commit 7c3a613

File tree

4 files changed

+69
-10
lines changed

4 files changed

+69
-10
lines changed

src/Php/PhpTypeExpression.php

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
namespace Smeghead\PhpClassDiagram\Php;
44

55
use PhpParser\Node\Identifier;
6+
use PhpParser\Node\Name;
7+
use PhpParser\Node\Name\FullyQualified;
68
use PhpParser\Node\NullableType;
79
use PhpParser\Node\Stmt\Property;
810
use PhpParser\Node\UnionType;
@@ -15,18 +17,22 @@ class PhpTypeExpression {
1517
/** @var PhpType[] */
1618
private array $types;
1719

18-
public function __construct(NodeAbstract $stmt, string $targetType) {
20+
public function __construct(NodeAbstract $stmt, string $targetType, array $currentNamespace) {
1921
$type = $stmt->{$targetType};
2022
if ($type instanceOf UnionType) {
2123
foreach ($type->types as $t) {
22-
$this->types[] = $this->parseType($t);
24+
$this->types[] = $this->parseType($t, $currentNamespace);
2325
}
2426
} else {
25-
$this->types[] = $this->parseType($type);
27+
$this->types[] = $this->parseType($type, $currentNamespace);
2628
}
2729
}
2830

29-
private function parseType(Property|Identifier|NullableType $type) {
31+
/**
32+
* @param Property|Identifier|NullableType|Name $type 型を表すAST
33+
* @param string[] $currentNamespace 名前空間配列
34+
*/
35+
private function parseType(Property|Identifier|NullableType|Name $type, array $currentNamespace) {
3036
$nullable = false;
3137
if ($type instanceOf NullableType) {
3238
$type = $type->type;
@@ -35,12 +41,15 @@ private function parseType(Property|Identifier|NullableType $type) {
3541
$parts = [];
3642
if ($type instanceOf Identifier) {
3743
$parts[] = $type->name;
44+
} else if ($type instanceOf FullyQualified) {
45+
$parts = $type->parts;
46+
} else if ($type instanceOf Name) {
47+
$parts = array_merge($currentNamespace, $type->parts);
3848
}
39-
$namespace = [];
4049
$typeName = array_pop($parts);
41-
return new PhpType($namespace, $type->getType(), $typeName ?? '', null, $nullable);
42-
50+
return new PhpType($parts, $type->getType(), $typeName ?? '', null, $nullable);
4351
}
52+
4453
/**
4554
* @return PhpType[] types
4655
*/

test/PhpTypeExpressionTest.php

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public function testNullableString(): void {
2020
throw new \Exception("Parse error: {$error->getMessage()} file: {$filename}\n");
2121
}
2222

23-
$expression = new PhpTypeExpression($ast[0]->stmts[1]->stmts[0], PhpTypeExpression::TYPE);
23+
$expression = new PhpTypeExpression($ast[0]->stmts[1]->stmts[0], PhpTypeExpression::TYPE, ['hoge', 'fuga', 'product']);
2424
$types = $expression->getTypes();
2525

2626
$this->assertSame([], $types[0]->getNamespace(), 'namespace');
@@ -35,8 +35,7 @@ public function testIntOrString(): void {
3535
} catch (Error $error) {
3636
throw new \Exception("Parse error: {$error->getMessage()} file: {$filename}\n");
3737
}
38-
// var_dump($ast[0]->stmts[1]->stmts[1]);die();
39-
$expression = new PhpTypeExpression($ast[0]->stmts[1]->stmts[1], PhpTypeExpression::TYPE);
38+
$expression = new PhpTypeExpression($ast[0]->stmts[1]->stmts[1], PhpTypeExpression::TYPE, ['hoge', 'fuga', 'product']);
4039
$types = $expression->getTypes();
4140

4241
$this->assertSame([], $types[0]->getNamespace(), 'namespace');
@@ -46,4 +45,49 @@ public function testIntOrString(): void {
4645
$this->assertSame('string', $types[1]->getName(), 'name');
4746
$this->assertSame(false, $types[1]->getNullable(), 'nullable');
4847
}
48+
public function testPrice(): void {
49+
$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
50+
$filename = sprintf('%s/php8/product/Product.php', $this->fixtureDir);
51+
try {
52+
$ast = $parser->parse(file_get_contents($filename));
53+
} catch (Error $error) {
54+
throw new \Exception("Parse error: {$error->getMessage()} file: {$filename}\n");
55+
}
56+
$expression = new PhpTypeExpression($ast[0]->stmts[1]->stmts[2], PhpTypeExpression::TYPE, ['hoge', 'fuga', 'product']);
57+
$types = $expression->getTypes();
58+
59+
$this->assertSame(['hoge', 'fuga', 'product'], $types[0]->getNamespace(), 'namespace');
60+
$this->assertSame('Name', $types[0]->getName(), 'name');
61+
$this->assertSame(false, $types[0]->getNullable(), 'nullable');
62+
}
63+
public function testException(): void {
64+
$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
65+
$filename = sprintf('%s/php8/product/Product.php', $this->fixtureDir);
66+
try {
67+
$ast = $parser->parse(file_get_contents($filename));
68+
} catch (Error $error) {
69+
throw new \Exception("Parse error: {$error->getMessage()} file: {$filename}\n");
70+
}
71+
$expression = new PhpTypeExpression($ast[0]->stmts[1]->stmts[4], PhpTypeExpression::TYPE, ['hoge', 'fuga', 'product']);
72+
$types = $expression->getTypes();
73+
74+
$this->assertSame([], $types[0]->getNamespace(), 'namespace');
75+
$this->assertSame('Exception', $types[0]->getName(), 'name');
76+
$this->assertSame(false, $types[0]->getNullable(), 'nullable');
77+
}
78+
public function testRelated(): void {
79+
$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
80+
$filename = sprintf('%s/php8/product/Product.php', $this->fixtureDir);
81+
try {
82+
$ast = $parser->parse(file_get_contents($filename));
83+
} catch (Error $error) {
84+
throw new \Exception("Parse error: {$error->getMessage()} file: {$filename}\n");
85+
}
86+
$expression = new PhpTypeExpression($ast[0]->stmts[1]->stmts[5], PhpTypeExpression::TYPE, ['hoge', 'fuga', 'product']);
87+
$types = $expression->getTypes();
88+
89+
$this->assertSame(['hoge', 'fuga', 'product', 'bar'], $types[0]->getNamespace(), 'namespace');
90+
$this->assertSame('Boo', $types[0]->getName(), 'name');
91+
$this->assertSame(false, $types[0]->getNullable(), 'nullable');
92+
}
4993
}

test/fixtures/php8/product/Product.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ class Product {
1111
private int|string $intOrString;
1212
private Name $name;
1313
private Price $price;
14+
private \Exception $error;
15+
private bar\Boo $boo;
1416

1517
/** @return Product product */
1618
public function method1(string $param1) {
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?php
2+
class Boo {
3+
4+
}

0 commit comments

Comments
 (0)