Completed
Push — master ( 55b21a...aec22b )
by Thomas
06:20
created

ParametersPart::checkPosition()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 3

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 5
ccs 4
cts 4
cp 1
rs 9.4285
cc 3
eloc 3
nc 2
nop 1
crap 3
1
<?php
2
namespace gossi\codegen\model\parts;
3
4
use gossi\codegen\model\PhpParameter;
5
use gossi\docblock\tags\ParamTag;
6
7
/**
8
 * Parameters Part
9
 *
10
 * For all models that can have parameters
11
 *
12
 * @author Thomas Gossmann
13
 */
14
trait ParametersPart {
15
16
	/** @var array */
17
	private $parameters = [];
18
	
19 47
	private function initParameters() {
20
// 		$this->parameters = new ArrayList();
1 ignored issue
show
Unused Code Comprehensibility introduced by
47% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
21 47
	}
22
23
	/**
24
	 * Sets a collection of parameters
25
	 * 
26
	 * Note: clears all parameters before setting the new ones
27
	 *
28
	 * @param PhpParameter[] $parameters
29
	 * @return $this
30
	 */
31 1
	public function setParameters(array $parameters) {
32 1
		$this->parameters = [];
33 1
		foreach ($parameters as $parameter) {
34 1
			$this->addParameter($parameter);
35
		}
36
37 1
		return $this;
38
	}
39
40
	/**
41
	 * Adds a parameter
42
	 *
43
	 * @param PhpParameter $parameter
44
	 * @return $this
45
	 */
46 22
	public function addParameter(PhpParameter $parameter) {
47 22
		$this->parameters[] = $parameter;
48
49 22
		return $this;
50
	}
51
52
	/**
53
	 * Checks whether a parameter exists
54
	 *
55
	 * @param string $name parameter name
56
	 * @return bool `true` if a parameter exists and `false` if not
57
	 */
58 2
	public function hasParameter($name) {
59 2
		foreach ($this->parameters as $param) {
60 2
			if ($param->getName() == $name) {
61 2
				return true;
62
			}
63
		}
64
		
65 2
		return false;
66
	}
67
68
	/**
69
	 * A quick way to add a parameter which is created from the given parameters
70
	 *
71
	 * @param string      $name
72
	 * @param null|string $type
73
	 * @param mixed       $defaultValue omit the argument to define no default value
74
	 *
75
	 * @return $this
76
	 */
77 1
	public function addSimpleParameter($name, $type = null, $defaultValue = null) {
78 1
		$parameter = new PhpParameter($name);
79 1
		$parameter->setType($type);
80
81 1
		if (2 < func_num_args()) {
82 1
			$parameter->setValue($defaultValue);
83
		}
84
85 1
		$this->addParameter($parameter);
86 1
		return $this;
87
	}
88
89
	/**
90
	 * A quick way to add a parameter with description which is created from the given parameters
91
	 *
92
	 * @param string      $name
93
	 * @param null|string $type
94
	 * @param null|string $typeDescription
95
	 * @param mixed       $defaultValue omit the argument to define no default value
96
	 *
97
	 * @return $this
98
	 */
99 1
	public function addSimpleDescParameter($name, $type = null, $typeDescription = null, $defaultValue = null) {
100 1
		$parameter = new PhpParameter($name);
101 1
		$parameter->setType($type);
102 1
		$parameter->setTypeDescription($typeDescription);
103
104 1
		if (3 < func_num_args() == 3) {
105 1
			$parameter->setValue($defaultValue);
106
		}
107
108 1
		$this->addParameter($parameter);
109 1
		return $this;
110
	}
111
112
	/**
113
	 * Returns a parameter by index or name
114
	 *
115
	 * @param string|int $nameOrIndex
116
	 * @throws \InvalidArgumentException
117
	 * @return PhpParameter
118
	 */
119 9
	public function getParameter($nameOrIndex) {
120 9
		if (is_int($nameOrIndex)) {
121 2
			$this->checkPosition($nameOrIndex);
122 1
			return $this->parameters[$nameOrIndex];
123
		}
124
125 8
		foreach ($this->parameters as $param) {
126 7
			if ($param->getName() === $nameOrIndex) {
127 7
				return $param;
128
			}
129
		}
130
131 1
		throw new \InvalidArgumentException(sprintf('There is no parameter named "%s".', $nameOrIndex));
132
	}
133
134
	/**
135
	 * Replaces a parameter at a given position
136
	 *
137
	 * @param int $position
138
	 * @param PhpParameter $parameter
139
	 * @throws \InvalidArgumentException
140
	 * @return $this
141
	 */
142 2
	public function replaceParameter($position, PhpParameter $parameter) {
143 2
		$this->checkPosition($position);
144 1
		$this->parameters[$position] = $parameter;
145
146 1
		return $this;
147
	}
148
149
	/**
150
	 * Remove a parameter at a given position
151
	 *
152
	 * @param int|string|PhpParameter $position
0 ignored issues
show
Bug introduced by
There is no parameter named $position. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
153
	 * @return $this
154
	 */
155 2
	public function removeParameter($param) {
156 2
		if (is_int($param)) {
157 2
			$this->removeParameterByPosition($param);
158
		} else if (is_string($param)) {
159
			$this->removeParameterByName($param);
160
		} else if ($param instanceof PhpParameter) {
161
			$this->removeParameterByName($param->getName());
162
		}
163
164 1
		return $this;
165
	}
166
	
167 2
	private function removeParameterByPosition($position) {
168 2
		$this->checkPosition($position);
169 1
		unset($this->parameters[$position]);
170 1
		$this->parameters = array_values($this->parameters);
171 1
	}
172
	
173
	private function removeParameterByName($name) {
174
		$position = null;
175
		foreach ($this->parameters as $index => $param) {
176
			if ($param->getName() == $name) {
177
				$position = $index;
178
			}
179
		}
180
		
181
		if ($position !== null) {
182
			$this->removeParameterByPosition($position);
183
		}
184
	}
185
	
186 4
	private function checkPosition($position) {
187 4
		if ($position < 0 || $position > count($this->parameters)) {
188 3
			throw new \InvalidArgumentException(sprintf('The position must be in the range [0, %d].', count($this->parameters)));
189
		}
190 1
	}
191
192
	/**
193
	 * Returns a collection of parameters
194
	 *
195
	 * @return array
196
	 */
197 16
	public function getParameters() {
198 16
		return $this->parameters;
199
	}
200
201
	/**
202
	 * Returns the docblock
203
	 *
204
	 * @return Docblock
205
	 */
206
	abstract protected function getDocblock();
207
208
	/**
209
	 * Generates docblock for params
210
	 */
211 14
	protected function generateParamDocblock() {
212 14
		$docblock = $this->getDocblock();
213 14
		$tags = $docblock->getTags('param');
214 14
		foreach ($this->parameters as $param) {
215 7
			$ptag = $param->getDocblockTag();
216
217 7
			$tag = $tags->find($ptag, function (ParamTag $tag, ParamTag $ptag) {
218 1
				return $tag->getVariable() == $ptag->getVariable();
219 7
			});
220
221
			// try to update existing docblock first
222 7
			if ($tag !== null) {
223 1
				$tag->setDescription($ptag->getDescription());
224 1
				$tag->setType($ptag->getType());
225
			}
226
227
			// ... append if it doesn't exist
228
			else {
229 7
				$docblock->appendTag($ptag);
230
			}
231
		}
232 14
	}
233
234
}
235