Skip to content

Commit

Permalink
Merge pull request #71 from smeghead/fix-avoid-array_merge-in-loop
Browse files Browse the repository at this point in the history
fix: Avoid calling the `array_merge` function in the loop process
  • Loading branch information
smeghead authored Jun 11, 2024
2 parents 99462c7 + a9d9f61 commit aae8b6a
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 109 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# CHANGELOG

### Bug fix

* Avoid calling the `array_merge` function in the loop process

## v1.3.0 (2024-06-02)

### Features
Expand Down
44 changes: 11 additions & 33 deletions src/DiagramElement/Package.php
Original file line number Diff line number Diff line change
Expand Up @@ -89,12 +89,8 @@ public function dump(int $level = 0): array
$this->getLogicalName()
);
}
foreach ($this->entries as $e) {
$lines = array_merge($lines, $e->dump($level + 1));
}
foreach ($this->children as $n) {
$lines = array_merge($lines, $n->dump($level + 1));
}
$lines = array_merge($lines, ...array_map(fn($e) => $e->dump($level + 1), $this->entries));
$lines = array_merge($lines, ...array_map(fn($n) => $n->dump($level + 1), $this->children));
if ($this->name !== 'ROOT') {
$lines[] = sprintf('%s}', $indent);
}
Expand Down Expand Up @@ -124,9 +120,7 @@ public function dumpPackages(int $level = 1): array
end($targetElements)
);
}
foreach ($this->children as $n) {
$lines = array_merge($lines, $n->dumpPackages($level + 1));
}
$lines = array_merge($lines, ...array_map(fn($n) => $n->dumpPackages($level + 1), $this->children));
$lines[] = sprintf('%s}', $indent);
return $lines;
}
Expand All @@ -137,15 +131,9 @@ public function dumpPackages(int $level = 1): array
public function getArrows(): array
{
$arrows = [];
foreach ($this->entries as $e) {
$arrows = array_merge($arrows, $e->getArrows());
}
foreach ($this->children as $n) {
$arrows = array_merge($arrows, $n->getArrows());
}
foreach ($this->entries as $n) {
$arrows = array_merge($arrows, $n->getUsingArrows());
}
$arrows = array_merge($arrows, ...array_map(fn($e) => $e->getArrows(), $this->entries));
$arrows = array_merge($arrows, ...array_map(fn($n) => $n->getArrows(), $this->children));
$arrows = array_merge($arrows, ...array_map(fn($n) => $n->getUsingArrows(), $this->entries));

return $arrows;
}
Expand All @@ -156,9 +144,7 @@ public function getArrows(): array
public function getEntries(): array
{
$entries = $this->entries;
foreach ($this->children as $n) {
$entries = array_merge($entries, $n->getEntries());
}
$entries = array_merge($entries, ...array_map(fn($n) => $n->getEntries(), $this->children));
return $entries;
}

Expand All @@ -169,14 +155,10 @@ public function getEntries(): array
public function getUses(array $acc): array
{
$uses = [];
foreach ($this->entries as $e) {
$uses = array_merge($uses, $e->getClass()->getUses());
}
$uses = array_merge($uses, ...array_map(fn($e) => $e->getClass()->getUses(), $this->entries));
$package = empty($this->package) ? sprintf('%s.%s', implode('.', $this->parents), $this->name) : $this->package;
$acc[$package] = $uses;
foreach ($this->children as $n) {
$acc = array_merge($acc, $n->getUses($acc));
}
$acc = array_merge($acc, ...array_map(fn($n) => $n->getUses($acc), $this->children));
return $acc;
}

Expand Down Expand Up @@ -239,12 +221,8 @@ public function dumpDivisions(int $level = 0): array
$this->getLogicalName()
);
}
foreach ($this->entries as $e) {
$lines = array_merge($lines, $e->dumpDivisions($level + 1));
}
foreach ($this->children as $n) {
$lines = array_merge($lines, $n->dumpDivisions($level + 1));
}
$lines = array_merge($lines, ...array_map(fn($e) => $e->dumpDivisions($level + 1), $this->entries));
$lines = array_merge($lines, ...array_map(fn($n) => $n->dumpDivisions($level + 1), $this->children));
if ($this->name !== 'ROOT') {
$lines[] = sprintf('%s}', $indent);
}
Expand Down
18 changes: 6 additions & 12 deletions test/PackageSvgLinkTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,9 @@ public function testDump_SvgLink_Classes(): void
foreach ($files as $f) {
$filename = sprintf('%s/namespace/%s', $this->fixtureDir, $f);
$classes = PhpReader::parseFile($directory, $filename, $options);
foreach ($classes as $c) {
$entries = array_merge($entries, [new Entry('product', $c->getInfo(), $options)]);
}
$entries[] = array_map(fn($c) => new Entry(dirname($f), $c->getInfo(), $options), $classes);
}
$rel = new Relation($entries, $options);
$rel = new Relation(array_merge(...$entries), $options);

$expected = <<<EOS
@startuml class-diagram
Expand Down Expand Up @@ -75,11 +73,9 @@ public function testDump_SvgLink_Interfaces(): void
foreach ($files as $f) {
$filename = sprintf('%s/%s', $directory, $f);
$classes = PhpReader::parseFile($directory, $filename, $options);
foreach ($classes as $c) {
$entries = array_merge($entries, [new Entry(dirname($f), $c->getInfo(), $options)]);
}
$entries[] = array_map(fn($c) => new Entry(dirname($f), $c->getInfo(), $options), $classes);
}
$rel = new Relation($entries, $options);
$rel = new Relation(array_merge(...$entries), $options);
$expected = <<<EOS
@startuml class-diagram
skinparam svgLinkTarget _blank
Expand Down Expand Up @@ -110,11 +106,9 @@ public function testDump_SvgLink_ClassesWithoutNamespace(): void
foreach ($files as $f) {
$filename = sprintf('%s/%s', $directory, $f);
$classes = PhpReader::parseFile($directory, $filename, $options);
foreach ($classes as $c) {
$entries = array_merge($entries, [new Entry(dirname($f), $c->getInfo(), $options)]);
}
$entries[] = array_map(fn($c) => new Entry(dirname($f), $c->getInfo(), $options), $classes);
}
$rel = new Relation($entries, $options);
$rel = new Relation(array_merge(...$entries), $options);

$expected = <<<EOS
@startuml class-diagram
Expand Down
60 changes: 20 additions & 40 deletions test/PackageTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,10 @@ public function testInitialize(): void
foreach ($files as $f) {
$filename = sprintf('%s/%s', $directory, $f);
$classes = PhpReader::parseFile($directory, $filename, $options);
foreach ($classes as $c) {
$entries = array_merge($entries, [new Entry(dirname($f), $c->getInfo(), $options)]);
}
$entries[] = array_map(fn($c) => new Entry(dirname($f), $c->getInfo(), $options), $classes);
}

$rel = new Relation($entries, $options);
$rel = new Relation(array_merge(...$entries), $options);
$namespace = $rel->getPackage();

$this->assertInstanceOf(Package::class, $namespace, 'namespace instance');
Expand Down Expand Up @@ -72,11 +70,9 @@ public function testDump(): void
foreach ($files as $f) {
$filename = sprintf('%s/namespace/%s', $this->fixtureDir, $f);
$classes = PhpReader::parseFile($directory, $filename, $options);
foreach ($classes as $c) {
$entries = array_merge($entries, [new Entry('product', $c->getInfo(), $options)]);
}
$entries[] = array_map(fn($c) => new Entry('product', $c->getInfo(), $options), $classes);
}
$rel = new Relation($entries, $options);
$rel = new Relation(array_merge(...$entries), $options);

$expected = <<<EOS
@startuml class-diagram
Expand Down Expand Up @@ -109,11 +105,9 @@ public function testDump2(): void
foreach ($files as $f) {
$filename = sprintf('%s/%s', $directory, $f);
$classes = PhpReader::parseFile($directory, $filename, $options);
foreach ($classes as $c) {
$entries = array_merge($entries, [new Entry(dirname($f), $c->getInfo(), $options)]);
}
$entries[] = array_map(fn($c) => new Entry(dirname($f), $c->getInfo(), $options), $classes);
}
$rel = new Relation($entries, $options);
$rel = new Relation(array_merge(...$entries), $options);
$expected = <<<EOS
@startuml class-diagram
package product as product {
Expand Down Expand Up @@ -144,11 +138,9 @@ public function testDump3(): void
foreach ($files as $f) {
$filename = sprintf('%s/%s', $directory, $f);
$classes = PhpReader::parseFile($directory, $filename, $options);
foreach ($classes as $c) {
$entries = array_merge($entries, [new Entry(dirname($f), $c->getInfo(), $options)]);
}
$entries[] = array_map(fn($c) => new Entry(dirname($f), $c->getInfo(), $options), $classes);
}
$rel = new Relation($entries, $options);
$rel = new Relation(array_merge(...$entries), $options);
$expected = <<<EOS
@startuml class-diagram
package product as product {
Expand All @@ -173,11 +165,9 @@ public function testDump4(): void
foreach ($files as $f) {
$filename = sprintf('%s/%s', $directory, $f);
$classes = PhpReader::parseFile($directory, $filename, $options);
foreach ($classes as $c) {
$entries = array_merge($entries, [new Entry(dirname($f), $c->getInfo(), $options)]);
}
$entries[] = array_map(fn($c) => new Entry(dirname($f), $c->getInfo(), $options), $classes);
}
$rel = new Relation($entries, $options);
$rel = new Relation(array_merge(...$entries), $options);
$expected = <<<EOS
@startuml class-diagram
package product as product {
Expand All @@ -203,11 +193,9 @@ public function testDump5(): void
foreach ($files as $f) {
$filename = sprintf('%s/%s', $directory, $f);
$classes = PhpReader::parseFile($directory, $filename, $options);
foreach ($classes as $c) {
$entries = array_merge($entries, [new Entry(dirname($f), $c->getInfo(), $options)]);
}
$entries[] = array_map(fn($c) => new Entry(dirname($f), $c->getInfo(), $options), $classes);
}
$rel = new Relation($entries, $options);
$rel = new Relation(array_merge(...$entries), $options);
$expected = <<<EOS
@startuml class-diagram
package product as product {
Expand All @@ -234,11 +222,9 @@ public function testDump6(): void
foreach ($files as $f) {
$filename = sprintf('%s/%s', $directory, $f);
$classes = PhpReader::parseFile($directory, $filename, $options);
foreach ($classes as $c) {
$entries = array_merge($entries, [new Entry(dirname($f), $c->getInfo(), $options)]);
}
$entries[] = array_map(fn($c) => new Entry(dirname($f), $c->getInfo(), $options), $classes);
}
$rel = new Relation($entries, $options);
$rel = new Relation(array_merge(...$entries), $options);
$expected = <<<EOS
@startuml class-diagram
package product as product {
Expand Down Expand Up @@ -270,11 +256,9 @@ public function testDump7(): void
foreach ($files as $f) {
$filename = sprintf('%s/%s', $directory, $f);
$classes = PhpReader::parseFile($directory, $filename, $options);
foreach ($classes as $c) {
$entries = array_merge($entries, [new Entry(dirname($f), $c->getInfo(), $options)]);
}
$entries[] = array_map(fn($c) => new Entry(dirname($f), $c->getInfo(), $options), $classes);
}
$rel = new Relation($entries, $options);
$rel = new Relation(array_merge(...$entries), $options);

$expected = <<<EOS
@startuml class-diagram
Expand Down Expand Up @@ -306,11 +290,9 @@ public function testDumpPackage1(): void
foreach ($files as $f) {
$filename = sprintf('%s/%s', $directory, $f);
$classes = PhpReader::parseFile($directory, $filename, $options);
foreach ($classes as $c) {
$entries = array_merge($entries, [new Entry(dirname($f), $c->getInfo(), $options)]);
}
$entries[] = array_map(fn($c) => new Entry(dirname($f), $c->getInfo(), $options), $classes);
}
$rel = new Relation($entries, $options);
$rel = new Relation(array_merge(...$entries), $options);

$expected = <<<EOS
@startuml package-related-diagram
Expand Down Expand Up @@ -340,11 +322,9 @@ public function testDumpPackage_bothSideArrows(): void
foreach ($files as $f) {
$filename = sprintf('%s/%s', $directory, $f);
$classes = PhpReader::parseFile($directory, $filename, $options);
foreach ($classes as $c) {
$entries = array_merge($entries, [new Entry(dirname($f), $c->getInfo(), $options)]);
}
$entries[] = array_map(fn($c) => new Entry(dirname($f), $c->getInfo(), $options), $classes);
}
$rel = new Relation($entries, $options);
$rel = new Relation(array_merge(...$entries), $options);
$expected = <<<EOS
@startuml package-related-diagram
package hoge.fuga as fuga {
Expand Down
36 changes: 12 additions & 24 deletions test/RelationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,9 @@ public function testInitialize(): void
foreach ($files as $f) {
$filename = sprintf('%s/%s', $directory, $f);
$classes = PhpReader::parseFile($directory, $filename, $options);
foreach ($classes as $c) {
$entries = array_merge($entries, [new Entry(dirname($f), $c->getInfo(), $options)]);
}
$entries[] = array_map(fn($c) => new Entry(dirname($f), $c->getInfo(), $options), $classes);
}
$rel = new Relation($entries, $options);
$rel = new Relation(array_merge(...$entries), $options);

$this->assertNotNull($rel, 'initialize Relation');
}
Expand All @@ -54,11 +52,9 @@ public function testGetRelations1(): void
foreach ($files as $f) {
$filename = sprintf('%s/%s', $directory, $f);
$classes = PhpReader::parseFile($directory, $filename, $options);
foreach ($classes as $c) {
$entries = array_merge($entries, [new Entry(dirname($f), $c->getInfo(), $options)]);
}
$entries[] = array_map(fn($c) => new Entry(dirname($f), $c->getInfo(), $options), $classes);
}
$rel = new Relation($entries, $options);
$rel = new Relation(array_merge(...$entries), $options);
$relations = $rel->getRelations();

$this->assertSame(3, count($relations), 'count');
Expand All @@ -78,11 +74,9 @@ public function testGetRelations_in_code_dependency(): void
foreach ($files as $f) {
$filename = sprintf('%s/%s', $directory, $f);
$classes = PhpReader::parseFile($directory, $filename, $options);
foreach ($classes as $c) {
$entries = array_merge($entries, [new Entry(dirname($f), $c->getInfo(), $options)]);
}
$entries[] = array_map(fn($c) => new Entry(dirname($f), $c->getInfo(), $options), $classes);
}
$rel = new Relation($entries, $options);
$rel = new Relation(array_merge(...$entries), $options);
$relations = $rel->getRelations();

$this->assertSame(2, count($relations), 'count');
Expand All @@ -103,11 +97,9 @@ public function testGetRelations2(): void
foreach ($files as $f) {
$filename = sprintf('%s/%s', $directory, $f);
$classes = PhpReader::parseFile($directory, $filename, $options);
foreach ($classes as $c) {
$entries = array_merge($entries, [new Entry(dirname($f), $c->getInfo(), $options)]);
}
$entries[] = array_map(fn($c) => new Entry(dirname($f), $c->getInfo(), $options), $classes);
}
$rel = new Relation($entries, $options);
$rel = new Relation(array_merge(...$entries), $options);
$relations = $rel->getRelations();

$this->assertSame(3, count($relations), 'count');
Expand All @@ -128,11 +120,9 @@ public function testGetRelations_array_expression_in_doc(): void
foreach ($files as $f) {
$filename = sprintf('%s/%s', $directory, $f);
$classes = PhpReader::parseFile($directory, $filename, $options);
foreach ($classes as $c) {
$entries = array_merge($entries, [new Entry(dirname($f), $c->getInfo(), $options)]);
}
$entries[] = array_map(fn ($c) => new Entry(dirname($f), $c->getInfo(), $options), $classes);
}
$rel = new Relation($entries, $options);
$rel = new Relation(array_merge(...$entries), $options);
$relations = $rel->getRelations();

$this->assertSame(2, count($relations), 'count');
Expand All @@ -152,11 +142,9 @@ public function testGetRelations_extends1(): void
foreach ($files as $f) {
$filename = sprintf('%s/%s', $directory, $f);
$classes = PhpReader::parseFile($directory, $filename, $options);
foreach ($classes as $c) {
$entries = array_merge($entries, [new Entry(dirname($f), $c->getInfo(), $options)]);
}
$entries[] = array_map(fn($c) => new Entry(dirname($f), $c->getInfo(), $options), $classes);
}
$rel = new Relation($entries, $options);
$rel = new Relation(array_merge(...$entries), $options);
$relations = $rel->getRelations();

$this->assertSame(1, count($relations), 'count');
Expand Down

0 comments on commit aae8b6a

Please sign in to comment.