Skip to content

Commit 249c1a7

Browse files
committed
describe text from DocComment in division-diagram options.
1 parent d79fd8e commit 249c1a7

File tree

5 files changed

+65
-5
lines changed

5 files changed

+65
-5
lines changed

src/DiagramElement/Entry.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Smeghead\PhpClassDiagram\Php\{
99
PhpClass,
1010
PhpAccessModifier,
11+
PhpEnumCase,
1112
PhpMethodParameter,
1213
};
1314

@@ -73,12 +74,16 @@ public function dumpDivisions($level = 0): array
7374
$lines = [];
7475
$meta = $this->class->getClassType()->getMetaName();
7576
if ($meta === 'enum') {
76-
$lines[] = sprintf('%scard %s [', $indent, $this->class->getClassType()->getName());
77+
$lines[] = sprintf('%scard %s #ccffcc [', $indent, $this->class->getClassType()->getName());
7778
$lines[] = sprintf('%s %s', $indent, $this->class->getClassType()->getName());
7879
$lines[] = sprintf('%s ====', $indent);
7980
$cases = $this->class->getEnumCases();
80-
$lines[] = implode(sprintf("\r\n%s ----\r\n", $indent), array_map(function (string $x) use($indent) {
81-
return sprintf('%s %s', $indent, $x);
81+
$lines[] = implode(sprintf("\r\n%s ----\r\n", $indent), array_map(function (PhpEnumCase $x) use($indent) {
82+
$doc = $x->getDocString();
83+
if (empty($doc)) {
84+
return sprintf('%s %s', $indent, $x->getName());
85+
}
86+
return sprintf("%s %s\n%s <b>%s</b>", $indent, $x->getName(), $indent, $doc);
8287
}, $cases));
8388
$lines[] = sprintf('%s]', $indent);
8489
}

src/Php/PhpClass.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,9 @@ public function getExtends(): array
228228
return $extends;
229229
}
230230

231+
/**
232+
* @return PhpEnumCase[] list of enum options.
233+
*/
231234
public function getEnumCases(): array
232235
{
233236
if ( ! $this->syntax instanceof Enum_) {
@@ -236,7 +239,7 @@ public function getEnumCases(): array
236239
$cases = [];
237240
foreach ($this->syntax->stmts as $stmt) {
238241
if ($stmt instanceof EnumCase) {
239-
$cases[] = $stmt->name->name;
242+
$cases[] = new PhpEnumCase($stmt);
240243
}
241244
}
242245
return $cases;

src/Php/PhpEnumCase.php

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Smeghead\PhpClassDiagram\Php;
6+
7+
use PhpParser\Comment\Doc;
8+
use PhpParser\Node\Stmt\{
9+
EnumCase,
10+
};
11+
12+
class PhpEnumCase
13+
{
14+
protected string $name;
15+
protected ?Doc $doc;
16+
17+
public function __construct(EnumCase $e)
18+
{
19+
$this->name = $e->name->name;
20+
$this->doc = $e->getDocComment();
21+
}
22+
23+
public function getName(): string
24+
{
25+
return $this->name;
26+
}
27+
28+
public function getDocString(): string
29+
{
30+
if (empty($this->doc)) {
31+
return '';
32+
}
33+
$str = $this->doc->getText();
34+
$str = preg_replace('/\/\*\*?\s*(.*)\s*\*\//s', '$1', $str);
35+
$str = preg_replace('/^\s*\**\s*/', '', $str);
36+
$str = str_replace(["\r\n", "\r", "\n"], "\n", $str);
37+
$lines = explode("\n", $str);
38+
return trim(array_shift($lines));
39+
}
40+
41+
}

test/PhpReflectionTest.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
use PHPUnit\Framework\TestCase;
33

44
use Smeghead\PhpClassDiagram\Config\Options;
5+
use Smeghead\PhpClassDiagram\Php\PhpEnumCase;
56
use Smeghead\PhpClassDiagram\Php\PhpReader;
67

78
final class PhpReflectionTest extends TestCase {
@@ -311,6 +312,8 @@ public function testEnum(): void {
311312
$data = $parsed[0]->getInfo();
312313
$this->assertSame('Suit', $data->getClassType()->getName(), '1st class type name.');
313314
$this->assertSame(['Hoge', 'TestEnum'], $data->getClassType()->getNamespace(), '1st namespace name.');
314-
$this->assertSame(['Hearts', 'Diamonds', 'Clubs', 'Spades'], $data->getEnumCases(), 'enum cases.');
315+
$enums = $data->getEnumCases();
316+
$this->assertSame(['Hearts', 'Diamonds', 'Clubs', 'Spades'], array_map(function(PhpEnumCase $e){return $e->getName();}, $enums), 'enum cases.');
317+
$this->assertSame(['ハート', 'ダイヤ', 'クローバー', 'スペード'], array_map(function(PhpEnumCase $e){return $e->getDocString();}, $enums), 'enum cases.');
315318
}
316319
}

test/fixtures/enum/TestEnum.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
<?php
22
namespace Hoge\TestEnum;
33

4+
/** スート */
45
enum Suit
56
{
7+
/** ハート */
68
case Hearts;
9+
/** ダイヤ */
710
case Diamonds;
11+
/** クローバー */
812
case Clubs;
13+
/**
14+
* スペード
15+
* 説明コメント
16+
*/
917
case Spades;
1018
}
1119

0 commit comments

Comments
 (0)