Skip to content

Commit 714877b

Browse files
committed
Introduce @internal getOnlyVariant() method on FunctionReflection/ExtendedMethodReflection to use instead of selectSingle()
1 parent 1322aaf commit 714877b

28 files changed

+149
-43
lines changed

src/Analyser/MutatingScope.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -5514,7 +5514,7 @@ private function exactInstantiation(New_ $node, string $className): ?Type
55145514

55155515
$assignedToProperty = $node->getAttribute(NewAssignedToPropertyVisitor::ATTRIBUTE_NAME);
55165516
if ($assignedToProperty !== null) {
5517-
$constructorVariant = ParametersAcceptorSelector::selectSingle($constructorMethod->getVariants());
5517+
$constructorVariant = $constructorMethod->getOnlyVariant();
55185518
$classTemplateTypes = $classReflection->getTemplateTypeMap()->getTypes();
55195519
$originalClassTemplateTypes = $classTemplateTypes;
55205520
foreach ($constructorVariant->getParameters() as $parameter) {

src/Reflection/Annotations/AnnotationMethodReflection.php

+6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use PHPStan\Reflection\ClassReflection;
88
use PHPStan\Reflection\ExtendedMethodReflection;
99
use PHPStan\Reflection\FunctionVariantWithPhpDocs;
10+
use PHPStan\Reflection\ParametersAcceptorWithPhpDocs;
1011
use PHPStan\TrinaryLogic;
1112
use PHPStan\Type\Generic\TemplateTypeMap;
1213
use PHPStan\Type\MixedType;
@@ -83,6 +84,11 @@ public function getVariants(): array
8384
return $this->variants;
8485
}
8586

87+
public function getOnlyVariant(): ParametersAcceptorWithPhpDocs
88+
{
89+
return $this->getVariants()[0];
90+
}
91+
8692
public function getNamedArgumentsVariants(): ?array
8793
{
8894
return null;

src/Reflection/ClassReflection.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -1305,7 +1305,7 @@ private function findAttributeFlags(): ?int
13051305
return null;
13061306
}
13071307
$attributeConstructor = $attributeClass->getConstructor();
1308-
$attributeConstructorVariant = ParametersAcceptorSelector::selectSingle($attributeConstructor->getVariants());
1308+
$attributeConstructorVariant = $attributeConstructor->getOnlyVariant();
13091309

13101310
if (count($arguments) === 0) {
13111311
$flagType = $attributeConstructorVariant->getParameters()[0]->getDefaultValue();

src/Reflection/Dummy/ChangedTypeMethodReflection.php

+12
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
use PHPStan\Reflection\ClassReflection;
88
use PHPStan\Reflection\ExtendedMethodReflection;
99
use PHPStan\Reflection\ParametersAcceptorWithPhpDocs;
10+
use PHPStan\ShouldNotHappenException;
1011
use PHPStan\TrinaryLogic;
1112
use PHPStan\Type\Type;
13+
use function count;
1214
use function is_bool;
1315

1416
final class ChangedTypeMethodReflection implements ExtendedMethodReflection
@@ -62,6 +64,16 @@ public function getVariants(): array
6264
return $this->variants;
6365
}
6466

67+
public function getOnlyVariant(): ParametersAcceptorWithPhpDocs
68+
{
69+
$variants = $this->getVariants();
70+
if (count($variants) !== 1) {
71+
throw new ShouldNotHappenException();
72+
}
73+
74+
return $variants[0];
75+
}
76+
6577
public function getNamedArgumentsVariants(): ?array
6678
{
6779
return $this->namedArgumentsVariants;

src/Reflection/Dummy/DummyConstructorReflection.php

+6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use PHPStan\Reflection\ClassReflection;
88
use PHPStan\Reflection\ExtendedMethodReflection;
99
use PHPStan\Reflection\FunctionVariantWithPhpDocs;
10+
use PHPStan\Reflection\ParametersAcceptorWithPhpDocs;
1011
use PHPStan\TrinaryLogic;
1112
use PHPStan\Type\Generic\TemplateTypeMap;
1213
use PHPStan\Type\MixedType;
@@ -66,6 +67,11 @@ public function getVariants(): array
6667
];
6768
}
6869

70+
public function getOnlyVariant(): ParametersAcceptorWithPhpDocs
71+
{
72+
return $this->getVariants()[0];
73+
}
74+
6975
public function getNamedArgumentsVariants(): ?array
7076
{
7177
return null;

src/Reflection/Dummy/DummyMethodReflection.php

+6
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use PHPStan\Reflection\ClassMemberReflection;
77
use PHPStan\Reflection\ClassReflection;
88
use PHPStan\Reflection\ExtendedMethodReflection;
9+
use PHPStan\Reflection\ParametersAcceptorWithPhpDocs;
910
use PHPStan\Reflection\ReflectionProviderStaticAccessor;
1011
use PHPStan\Reflection\TrivialParametersAcceptor;
1112
use PHPStan\TrinaryLogic;
@@ -58,6 +59,11 @@ public function getVariants(): array
5859
];
5960
}
6061

62+
public function getOnlyVariant(): ParametersAcceptorWithPhpDocs
63+
{
64+
return $this->getVariants()[0];
65+
}
66+
6167
public function getNamedArgumentsVariants(): ?array
6268
{
6369
return null;

src/Reflection/ExtendedMethodReflection.php

+5
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ interface ExtendedMethodReflection extends MethodReflection
2727
*/
2828
public function getVariants(): array;
2929

30+
/**
31+
* @internal
32+
*/
33+
public function getOnlyVariant(): ParametersAcceptorWithPhpDocs;
34+
3035
/**
3136
* @return ParametersAcceptorWithPhpDocs[]|null
3237
*/

src/Reflection/FunctionReflection.php

+5
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ public function getFileName(): ?string;
1818
*/
1919
public function getVariants(): array;
2020

21+
/**
22+
* @internal
23+
*/
24+
public function getOnlyVariant(): ParametersAcceptorWithPhpDocs;
25+
2126
/**
2227
* @return ParametersAcceptorWithPhpDocs[]|null
2328
*/

src/Reflection/Native/NativeFunctionReflection.php

+12-3
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
use PHPStan\Reflection\Assertions;
66
use PHPStan\Reflection\FunctionReflection;
77
use PHPStan\Reflection\ParametersAcceptorWithPhpDocs;
8+
use PHPStan\ShouldNotHappenException;
89
use PHPStan\TrinaryLogic;
910
use PHPStan\Type\Type;
11+
use function count;
1012

1113
final class NativeFunctionReflection implements FunctionReflection
1214
{
@@ -46,14 +48,21 @@ public function getFileName(): ?string
4648
return null;
4749
}
4850

49-
/**
50-
* @return ParametersAcceptorWithPhpDocs[]
51-
*/
5251
public function getVariants(): array
5352
{
5453
return $this->variants;
5554
}
5655

56+
public function getOnlyVariant(): ParametersAcceptorWithPhpDocs
57+
{
58+
$variants = $this->getVariants();
59+
if (count($variants) !== 1) {
60+
throw new ShouldNotHappenException();
61+
}
62+
63+
return $variants[0];
64+
}
65+
5766
public function getNamedArgumentsVariants(): ?array
5867
{
5968
return $this->namedArgumentsVariants;

src/Reflection/Native/NativeMethodReflection.php

+12
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
use PHPStan\Reflection\ParametersAcceptorWithPhpDocs;
1111
use PHPStan\Reflection\Php\BuiltinMethodReflection;
1212
use PHPStan\Reflection\ReflectionProvider;
13+
use PHPStan\ShouldNotHappenException;
1314
use PHPStan\TrinaryLogic;
1415
use PHPStan\Type\Type;
1516
use PHPStan\Type\TypehintHelper;
1617
use ReflectionException;
18+
use function count;
1719
use function strtolower;
1820

1921
final class NativeMethodReflection implements ExtendedMethodReflection
@@ -109,6 +111,16 @@ public function getVariants(): array
109111
return $this->variants;
110112
}
111113

114+
public function getOnlyVariant(): ParametersAcceptorWithPhpDocs
115+
{
116+
$variants = $this->getVariants();
117+
if (count($variants) !== 1) {
118+
throw new ShouldNotHappenException();
119+
}
120+
121+
return $variants[0];
122+
}
123+
112124
public function getNamedArgumentsVariants(): ?array
113125
{
114126
return $this->namedArgumentsVariants;

src/Reflection/Php/ClosureCallMethodReflection.php

+6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use PHPStan\Reflection\Native\NativeParameterReflection;
1111
use PHPStan\Reflection\ParameterReflection;
1212
use PHPStan\Reflection\ParameterReflectionWithPhpDocs;
13+
use PHPStan\Reflection\ParametersAcceptorWithPhpDocs;
1314
use PHPStan\Reflection\PassedByReference;
1415
use PHPStan\TrinaryLogic;
1516
use PHPStan\Type\ClosureType;
@@ -105,6 +106,11 @@ public function getVariants(): array
105106
];
106107
}
107108

109+
public function getOnlyVariant(): ParametersAcceptorWithPhpDocs
110+
{
111+
return $this->getVariants()[0];
112+
}
113+
108114
public function getNamedArgumentsVariants(): ?array
109115
{
110116
return null;

src/Reflection/Php/EnumCasesMethodReflection.php

+6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use PHPStan\Reflection\ClassReflection;
88
use PHPStan\Reflection\ExtendedMethodReflection;
99
use PHPStan\Reflection\FunctionVariantWithPhpDocs;
10+
use PHPStan\Reflection\ParametersAcceptorWithPhpDocs;
1011
use PHPStan\ShouldNotHappenException;
1112
use PHPStan\TrinaryLogic;
1213
use PHPStan\Type\Generic\TemplateTypeMap;
@@ -75,6 +76,11 @@ public function getVariants(): array
7576
];
7677
}
7778

79+
public function getOnlyVariant(): ParametersAcceptorWithPhpDocs
80+
{
81+
return $this->getVariants()[0];
82+
}
83+
7884
public function getNamedArgumentsVariants(): ?array
7985
{
8086
return null;

src/Reflection/Php/ExitFunctionReflection.php

+5
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,11 @@ public function getVariants(): array
6969
];
7070
}
7171

72+
public function getOnlyVariant(): ParametersAcceptorWithPhpDocs
73+
{
74+
return $this->getVariants()[0];
75+
}
76+
7277
/**
7378
* @return ParametersAcceptorWithPhpDocs[]
7479
*/

src/Reflection/Php/PhpFunctionFromParserNodeReflection.php

+5
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,11 @@ public function getVariants(): array
116116
return $this->variants;
117117
}
118118

119+
public function getOnlyVariant(): ParametersAcceptorWithPhpDocs
120+
{
121+
return $this;
122+
}
123+
119124
public function getNamedArgumentsVariants(): ?array
120125
{
121126
return null;

src/Reflection/Php/PhpFunctionReflection.php

+5
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,11 @@ public function getVariants(): array
107107
return $this->variants;
108108
}
109109

110+
public function getOnlyVariant(): ParametersAcceptorWithPhpDocs
111+
{
112+
return $this->getVariants()[0];
113+
}
114+
110115
public function getNamedArgumentsVariants(): ?array
111116
{
112117
return null;

src/Reflection/Php/PhpMethodReflection.php

+5
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,11 @@ public function getVariants(): array
212212
return $this->variants;
213213
}
214214

215+
public function getOnlyVariant(): ParametersAcceptorWithPhpDocs
216+
{
217+
return $this->getVariants()[0];
218+
}
219+
215220
public function getNamedArgumentsVariants(): ?array
216221
{
217222
return null;

src/Reflection/Php/UniversalObjectCratesClassReflectionExtension.php

+2-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
use PHPStan\Reflection\Annotations\AnnotationsPropertiesClassReflectionExtension;
66
use PHPStan\Reflection\ClassReflection;
7-
use PHPStan\Reflection\ParametersAcceptorSelector;
87
use PHPStan\Reflection\PropertiesClassReflectionExtension;
98
use PHPStan\Reflection\PropertyReflection;
109
use PHPStan\Reflection\ReflectionProvider;
@@ -66,13 +65,13 @@ public function getProperty(ClassReflection $classReflection, string $propertyNa
6665
}
6766

6867
if ($classReflection->hasNativeMethod('__get')) {
69-
$readableType = ParametersAcceptorSelector::selectSingle($classReflection->getNativeMethod('__get')->getVariants())->getReturnType();
68+
$readableType = $classReflection->getNativeMethod('__get')->getOnlyVariant()->getReturnType();
7069
} else {
7170
$readableType = new MixedType();
7271
}
7372

7473
if ($classReflection->hasNativeMethod('__set')) {
75-
$writableType = ParametersAcceptorSelector::selectSingle($classReflection->getNativeMethod('__set')->getVariants())->getParameters()[1]->getType();
74+
$writableType = $classReflection->getNativeMethod('__set')->getOnlyVariant()->getParameters()[1]->getType();
7675
} else {
7776
$writableType = new MixedType();
7877
}

src/Reflection/ResolvedMethodReflection.php

+5
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ public function getVariants(): array
5252
return $this->variants = $this->resolveVariants($this->reflection->getVariants());
5353
}
5454

55+
public function getOnlyVariant(): ParametersAcceptorWithPhpDocs
56+
{
57+
return $this->getVariants()[0];
58+
}
59+
5560
public function getNamedArgumentsVariants(): ?array
5661
{
5762
$variants = $this->namedArgumentVariants;

src/Reflection/Type/IntersectionTypeMethodReflection.php

+11
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use PHPStan\Reflection\MethodReflection;
1111
use PHPStan\Reflection\ParametersAcceptor;
1212
use PHPStan\Reflection\ParametersAcceptorWithPhpDocs;
13+
use PHPStan\ShouldNotHappenException;
1314
use PHPStan\TrinaryLogic;
1415
use PHPStan\Type\Type;
1516
use PHPStan\Type\TypeCombinator;
@@ -94,6 +95,16 @@ public function getVariants(): array
9495
), $this->methods[0]->getVariants());
9596
}
9697

98+
public function getOnlyVariant(): ParametersAcceptorWithPhpDocs
99+
{
100+
$variants = $this->getVariants();
101+
if (count($variants) !== 1) {
102+
throw new ShouldNotHappenException();
103+
}
104+
105+
return $variants[0];
106+
}
107+
97108
public function getNamedArgumentsVariants(): ?array
98109
{
99110
return null;

src/Reflection/Type/UnionTypeMethodReflection.php

+6
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use PHPStan\Reflection\ExtendedMethodReflection;
99
use PHPStan\Reflection\MethodReflection;
1010
use PHPStan\Reflection\ParametersAcceptorSelector;
11+
use PHPStan\Reflection\ParametersAcceptorWithPhpDocs;
1112
use PHPStan\TrinaryLogic;
1213
use PHPStan\Type\Type;
1314
use PHPStan\Type\TypeCombinator;
@@ -82,6 +83,11 @@ public function getVariants(): array
8283
return [ParametersAcceptorSelector::combineAcceptors($variants)];
8384
}
8485

86+
public function getOnlyVariant(): ParametersAcceptorWithPhpDocs
87+
{
88+
return $this->getVariants()[0];
89+
}
90+
8591
public function getNamedArgumentsVariants(): ?array
8692
{
8793
return null;

src/Reflection/WrappedExtendedMethodReflection.php

+5
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,11 @@ public function getVariants(): array
8787
return $variants;
8888
}
8989

90+
public function getOnlyVariant(): ParametersAcceptorWithPhpDocs
91+
{
92+
return $this->getVariants()[0];
93+
}
94+
9095
public function getNamedArgumentsVariants(): ?array
9196
{
9297
return null;

0 commit comments

Comments
 (0)