Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
83.87% covered (warning)
83.87%
26 / 31
60.00% covered (warning)
60.00%
3 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
TagUnion
83.87% covered (warning)
83.87%
26 / 31
60.00% covered (warning)
60.00%
3 / 5
19.36
0.00% covered (danger)
0.00%
0 / 1
 parseUnion
78.57% covered (warning)
78.57%
11 / 14
0.00% covered (danger)
0.00%
0 / 1
5.25
 parseWsdl
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
2
 parsingTag
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 findSuitableInheritance
77.78% covered (warning)
77.78%
7 / 9
0.00% covered (danger)
0.00%
0 / 1
5.27
 getUnionMemberTypesFromChildren
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
5
1<?php
2
3declare(strict_types=1);
4
5namespace WsdlToPhp\PackageGenerator\Parser\Wsdl;
6
7use WsdlToPhp\PackageGenerator\Model\AbstractModel;
8use WsdlToPhp\PackageGenerator\Model\Wsdl;
9use WsdlToPhp\WsdlHandler\Tag\TagSimpleType as SimpleType;
10use WsdlToPhp\WsdlHandler\Tag\TagUnion as Union;
11use WsdlToPhp\WsdlHandler\Wsdl as WsdlDocument;
12
13final class TagUnion extends AbstractTagParser
14{
15    public function parseUnion(Union $union): void
16    {
17        $parent = $union->getSuitableParent();
18        if (!$parent) {
19            return;
20        }
21
22        $model = $this->getModel($parent);
23        if (!$model) {
24            return;
25        }
26
27        $memberTypes = $union->getAttributeMemberTypes();
28        if ($union->hasMemberTypesAsChildren()) {
29            $memberTypes = array_unique(array_merge($memberTypes, $this->getUnionMemberTypesFromChildren($union)));
30        }
31
32        $memberTypes = array_filter($memberTypes, fn ($memberType): bool => $model->getName() !== $memberType);
33
34        if (empty($memberTypes)) {
35            return;
36        }
37
38        $model->addMeta('union', $memberTypes);
39        $model->setInheritance($this->findSuitableInheritance($memberTypes));
40    }
41
42    protected function parseWsdl(Wsdl $wsdl): void
43    {
44        foreach ($this->getTags() as $tag) {
45            $this->parseUnion($tag);
46        }
47    }
48
49    protected function parsingTag(): string
50    {
51        return WsdlDocument::TAG_UNION;
52    }
53
54    protected function findSuitableInheritance(array $values): string
55    {
56        $validInheritance = '';
57        foreach ($values as $value) {
58            $model = $this->getStructByName($value);
59            while ($model instanceof AbstractModel && !empty($model->getInheritance())) {
60                $model = $this->getStructByName($validInheritance = $model->getInheritance());
61            }
62
63            if ($model instanceof AbstractModel) {
64                $validInheritance = $model->getName();
65
66                break;
67            }
68        }
69
70        return $validInheritance;
71    }
72
73    protected function getUnionMemberTypesFromChildren(Union $union): array
74    {
75        $memberTypes = [];
76        foreach ($union->getMemberTypesChildren() as $child) {
77            if ($child instanceof SimpleType && $child->hasRestrictionChild() && '' !== $child->getFirstRestrictionChild()->getAttributeBase()) {
78                $memberTypes[] = $child->getFirstRestrictionChild()->getAttributeBase();
79            }
80        }
81
82        return array_unique($memberTypes);
83    }
84}