Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
91.67% covered (success)
91.67%
44 / 48
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
Functions
91.67% covered (success)
91.67%
44 / 48
0.00% covered (danger)
0.00%
0 / 1
19.21
0.00% covered (danger)
0.00%
0 / 1
 parse
91.67% covered (success)
91.67%
44 / 48
0.00% covered (danger)
0.00%
0 / 1
19.21
1<?php
2
3declare(strict_types=1);
4
5namespace WsdlToPhp\PackageGenerator\Parser\SoapClient;
6
7final class Functions extends AbstractParser
8{
9    public function parse(): void
10    {
11        $methods = $this
12            ->getGenerator()
13            ->getSoapClient()
14            ->getSoapClient()
15            ->getSoapClient()
16            ->__getFunctions()
17        ;
18
19        $services = $this->getGenerator()->getServices();
20
21        if (!is_array($methods) || 0 === count($methods)) {
22            return;
23        }
24
25        foreach ($methods as $method) {
26            $infos = explode(' ', $method);
27            // "Regular" SOAP Style
28            if (count($infos) < 3) {
29                $returnType = $infos[0];
30                if (false !== mb_strpos($infos[1], '()') && array_key_exists(1, $infos)) {
31                    $methodName = trim(str_replace('()', '', $infos[1]));
32                    $parameterType = null;
33                } else {
34                    [$methodName, $parameterType] = explode('(', $infos[1]);
35                }
36                if (!empty($returnType) && !empty($methodName)) {
37                    $services->addService($this->getGenerator()->getServiceName($methodName), $methodName, $parameterType, $returnType);
38                }
39            } else {
40                /*
41                 * RPC SOAP Style
42                 * Some RPC WS defines the return type as a list of values
43                 * So we define the return type as an array and reset the information to use to extract method name and parameters
44                 */
45                if (0 === mb_stripos($infos[0], 'list(')) {
46                    $infos = explode(' ', preg_replace('/(list\(.*\)\s)/i', '', $method));
47                    array_unshift($infos, 'array');
48                }
49
50                /**
51                 * Returns type is not defined in some case.
52                 */
53                $start = 0;
54                $returnType = false === mb_strpos($infos[0], '(') ? $infos[0] : '';
55                $firstParameterType = '';
56                if (empty($returnType) && false !== mb_strpos($infos[0], '(')) {
57                    $start = 1;
58                    [$methodName, $firstParameterType] = explode('(', $infos[0]);
59                } elseif (false !== mb_strpos($infos[1], '(')) {
60                    $start = 2;
61                    [$methodName, $firstParameterType] = explode('(', $infos[1]);
62                }
63                if (!empty($methodName)) {
64                    $methodParameters = [];
65                    $infosCount = count($infos);
66                    for ($i = $start; $i < $infosCount; $i += 2) {
67                        $info = str_replace([
68                            ', ',
69                            ',',
70                            '(',
71                            ')',
72                            '$',
73                        ], '', trim($infos[$i]));
74                        if (!empty($info)) {
75                            $methodParameters = array_merge($methodParameters, [
76                                $info => $start === $i ? $firstParameterType : $infos[$i - 1],
77                            ]);
78                        }
79                    }
80                    $services->addService($this->getGenerator()->getServiceName($methodName), $methodName, $methodParameters, empty($returnType) ? 'unknown' : $returnType);
81                }
82            }
83        }
84    }
85}