Skip to content

Commit aa2915b

Browse files
MAGETWO-72283: Code generate: support variadic parameter #10771
2 parents 6296647 + b7cc191 commit aa2915b

File tree

8 files changed

+135
-3
lines changed

8 files changed

+135
-3
lines changed

lib/internal/Magento/Framework/Code/Generator/ClassGenerator.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ class ClassGenerator extends \Zend\Code\Generator\ClassGenerator implements
5959
'type' => 'setType',
6060
'defaultValue' => 'setDefaultValue',
6161
'passedByReference' => 'setPassedByReference',
62+
'variadic' => 'setVariadic',
6263
];
6364

6465
/**

lib/internal/Magento/Framework/Code/Generator/EntityAbstract.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,8 @@ protected function _getMethodParameterInfo(\ReflectionParameter $parameter)
313313
$parameterInfo = [
314314
'name' => $parameter->getName(),
315315
'passedByReference' => $parameter->isPassedByReference(),
316-
'type' => $parameter->getType()
316+
'type' => $parameter->getType(),
317+
'variadic' => $parameter->isVariadic()
317318
];
318319

319320
if ($parameter->isArray()) {

lib/internal/Magento/Framework/Code/Test/Unit/Generator/ClassGeneratorTest.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ class ClassGeneratorTest extends \PHPUnit\Framework\TestCase
2020

2121
const FLAG_REFERENCE = 'passedByReference';
2222

23+
const FLAG_VARIADIC = 'variadic';
24+
2325
/**#@-*/
2426

2527
/**
@@ -38,6 +40,7 @@ class ClassGeneratorTest extends \PHPUnit\Framework\TestCase
3840
self::FLAG_FINAL => 'isFinal',
3941
self::FLAG_ABSTRACT => 'isAbstract',
4042
self::FLAG_REFERENCE => 'getPassedByReference',
43+
self::FLAG_VARIADIC => 'getVariadic',
4144
];
4245

4346
/**
@@ -65,7 +68,13 @@ class ClassGeneratorTest extends \PHPUnit\Framework\TestCase
6568
'final' => true,
6669
'static' => true,
6770
'parameters' => [
68-
['name' => 'data', 'type' => 'array', 'defaultValue' => [], 'passedByReference' => true],
71+
[
72+
'name' => 'data',
73+
'type' => 'array',
74+
'defaultValue' => [],
75+
'passedByReference' => true,
76+
'variadic' => false
77+
],
6978
],
7079
'body' => 'return 1;',
7180
'docblock' => ['shortDescription' => 'test short description'],
@@ -205,6 +214,9 @@ public function testAddMethods()
205214
$actualDefaultValue = $actualParameter->getDefaultValue();
206215
$this->assertEquals($parameterData['defaultValue'], $actualDefaultValue->getValue());
207216
}
217+
218+
// assert variadic flag
219+
$this->_assertFlag(self::FLAG_VARIADIC, $parameterData, $actualParameter);
208220
}
209221
}
210222

lib/internal/Magento/Framework/Interception/Code/Generator/Interceptor.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,13 @@ protected function _getParameterList(array $parameters)
130130
', ',
131131
array_map(
132132
function ($item) {
133-
return "$" . $item['name'];
133+
$output = '';
134+
if ($item['variadic']) {
135+
$output .= '... ';
136+
}
137+
138+
$output .= "\${$item['name']}";
139+
return $output;
134140
},
135141
$parameters
136142
)

lib/internal/Magento/Framework/Interception/Test/Unit/Code/Generator/_files/Interceptor.txt

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,43 @@ class Interceptor extends \Magento\Framework\Interception\Code\Generator\Sample
5050
return $this->___callPlugins('getReference', func_get_args(), $pluginInfo);
5151
}
5252
}
53+
54+
/**
55+
* {@inheritdoc}
56+
*/
57+
public function firstVariadicParameter(... $variadicValue)
58+
{
59+
$pluginInfo = $this->pluginList->getNext($this->subjectType, 'firstVariadicParameter');
60+
if (!$pluginInfo) {
61+
return parent::firstVariadicParameter(... $variadicValue);
62+
} else {
63+
return $this->___callPlugins('firstVariadicParameter', func_get_args(), $pluginInfo);
64+
}
65+
}
66+
67+
/**
68+
* {@inheritdoc}
69+
*/
70+
public function secondVariadicParameter($value, ... $variadicValue)
71+
{
72+
$pluginInfo = $this->pluginList->getNext($this->subjectType, 'secondVariadicParameter');
73+
if (!$pluginInfo) {
74+
return parent::secondVariadicParameter($value, ... $variadicValue);
75+
} else {
76+
return $this->___callPlugins('secondVariadicParameter', func_get_args(), $pluginInfo);
77+
}
78+
}
79+
80+
/**
81+
* {@inheritdoc}
82+
*/
83+
public function byRefVariadic(&... $variadicValue)
84+
{
85+
$pluginInfo = $this->pluginList->getNext($this->subjectType, 'byRefVariadic');
86+
if (!$pluginInfo) {
87+
return parent::byRefVariadic(... $variadicValue);
88+
} else {
89+
return $this->___callPlugins('byRefVariadic', func_get_args(), $pluginInfo);
90+
}
91+
}
5392
}

lib/internal/Magento/Framework/Interception/Test/Unit/Code/Generator/_files/Sample.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
class Sample
99
{
1010
private $attribute;
11+
private $variadicAttribute;
1112

1213
public function getValue()
1314
{
@@ -22,4 +23,20 @@ public function setValue($value)
2223
public function & getReference()
2324
{
2425
}
26+
27+
public function firstVariadicParameter(...$variadicValue)
28+
{
29+
$this->variadicAttribute = $variadicValue;
30+
}
31+
32+
public function secondVariadicParameter($value, ...$variadicValue)
33+
{
34+
$this->attribute = $value;
35+
$this->variadicAttribute = $variadicValue;
36+
}
37+
38+
public function byRefVariadic(& ...$variadicValue)
39+
{
40+
$this->variadicAttribute = $variadicValue;
41+
}
2542
}

lib/internal/Magento/Framework/Interception/Test/Unit/Code/Generator/_files/TInterceptor.txt

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,43 @@ class Interceptor extends \Magento\Framework\Interception\Code\Generator\TSample
3737
return $this->___callPlugins('setValue', func_get_args(), $pluginInfo);
3838
}
3939
}
40+
41+
/**
42+
* {@inheritdoc}
43+
*/
44+
public function typeHintedFirstVariadicParameter(string ... $variadicValue)
45+
{
46+
$pluginInfo = $this->pluginList->getNext($this->subjectType, 'typeHintedFirstVariadicParameter');
47+
if (!$pluginInfo) {
48+
return parent::typeHintedFirstVariadicParameter(... $variadicValue);
49+
} else {
50+
return $this->___callPlugins('typeHintedFirstVariadicParameter', func_get_args(), $pluginInfo);
51+
}
52+
}
53+
54+
/**
55+
* {@inheritdoc}
56+
*/
57+
public function typeHintedSecondVariadicParameter(string $value, string ... $variadicValue)
58+
{
59+
$pluginInfo = $this->pluginList->getNext($this->subjectType, 'typeHintedSecondVariadicParameter');
60+
if (!$pluginInfo) {
61+
return parent::typeHintedSecondVariadicParameter($value, ... $variadicValue);
62+
} else {
63+
return $this->___callPlugins('typeHintedSecondVariadicParameter', func_get_args(), $pluginInfo);
64+
}
65+
}
66+
67+
/**
68+
* {@inheritdoc}
69+
*/
70+
public function byRefTypeHintedVariadic(string &... $variadicValue)
71+
{
72+
$pluginInfo = $this->pluginList->getNext($this->subjectType, 'byRefTypeHintedVariadic');
73+
if (!$pluginInfo) {
74+
return parent::byRefTypeHintedVariadic(... $variadicValue);
75+
} else {
76+
return $this->___callPlugins('byRefTypeHintedVariadic', func_get_args(), $pluginInfo);
77+
}
78+
}
4079
}

lib/internal/Magento/Framework/Interception/Test/Unit/Code/Generator/_files/TSample.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
class TSample
99
{
1010
private $value;
11+
private $variadicValue;
1112

1213
public function getValue() : string
1314
{
@@ -18,4 +19,20 @@ public function setValue(string $value)
1819
{
1920
$this->value = $value;
2021
}
22+
23+
public function typeHintedFirstVariadicParameter(string ...$variadicValue)
24+
{
25+
$this->variadicValue = $variadicValue;
26+
}
27+
28+
public function typeHintedSecondVariadicParameter(string $value, string ...$variadicValue)
29+
{
30+
$this->value = $value;
31+
$this->variadicValue = $variadicValue;
32+
}
33+
34+
public function byRefTypeHintedVariadic(string & ...$variadicValue)
35+
{
36+
$this->variadicValue = $variadicValue;
37+
}
2138
}

0 commit comments

Comments
 (0)