1: <?php declare(strict_types=1);
2:
3: namespace Salient\PHPDoc\Tag;
4:
5: use Salient\Utility\Arr;
6:
7: /**
8: * @api
9: */
10: class MethodTag extends AbstractTag
11: {
12: /** @var array<string,MethodParam> */
13: protected array $Params;
14: protected bool $IsStatic;
15:
16: /**
17: * @internal
18: *
19: * @param MethodParam[] $params
20: */
21: public function __construct(
22: string $name,
23: ?string $type = null,
24: array $params = [],
25: bool $isStatic = false,
26: ?string $description = null,
27: ?string $class = null,
28: ?string $member = null,
29: ?string $static = null,
30: ?string $self = null,
31: array $aliases = []
32: ) {
33: parent::__construct('method', $name, $type, $description, $class, $member, $static, $self, $aliases);
34: $this->Params = $this->filterParams($params, $aliases);
35: $this->IsStatic = $isStatic;
36: }
37:
38: /**
39: * @inheritDoc
40: */
41: public function getName(): string
42: {
43: return $this->Name;
44: }
45:
46: /**
47: * Get the method's parameters, indexed by name
48: *
49: * @return array<string,MethodParam>
50: */
51: public function getParams(): array
52: {
53: return $this->Params;
54: }
55:
56: /**
57: * Check if the method is static
58: */
59: public function isStatic(): bool
60: {
61: return $this->IsStatic;
62: }
63:
64: /**
65: * @inheritDoc
66: */
67: public function __toString(): string
68: {
69: $string = "@{$this->Tag} ";
70: if ($this->IsStatic) {
71: $string .= 'static ';
72: }
73: if (isset($this->Type)) {
74: $string .= "{$this->Type} ";
75: }
76: $string .= "{$this->Name}(";
77: $string .= Arr::implode(', ', $this->Params, '');
78: $string .= ')';
79: if ($this->Description !== null) {
80: $string .= " {$this->Description}";
81: }
82: return $string;
83: }
84:
85: /**
86: * @param MethodParam[] $params
87: * @param array<string,class-string> $aliases
88: * @return array<string,MethodParam>
89: */
90: final protected function filterParams(array $params, array $aliases = []): array
91: {
92: foreach ($params as $param) {
93: $name = $this->filterString($param->getName(), 'parameter name');
94: $filtered[$name] = $param->withType($this->filterType($param->getType(), $aliases));
95: }
96:
97: return $filtered ?? [];
98: }
99: }
100: