Skip to content

Commit 0ec6765

Browse files
uekannuekann
authored andcommitted
Refactor
1 parent 1229db9 commit 0ec6765

File tree

2 files changed

+88
-127
lines changed

2 files changed

+88
-127
lines changed

src/Type/Php/ArrayAllFunctionTypeSpecifyingExtension.php

Lines changed: 26 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,19 @@
44

55
use PhpParser\Node\Expr;
66
use PhpParser\Node\Expr\FuncCall;
7-
use PhpParser\Node\Expr\Variable;
87
use PHPStan\Analyser\Scope;
98
use PHPStan\Analyser\SpecifiedTypes;
109
use PHPStan\Analyser\TypeSpecifier;
1110
use PHPStan\Analyser\TypeSpecifierAwareExtension;
1211
use PHPStan\Analyser\TypeSpecifierContext;
1312
use PHPStan\DependencyInjection\AutowiredService;
14-
use PHPStan\Node\Expr\TypeExpr;
1513
use PHPStan\Reflection\FunctionReflection;
16-
use PHPStan\Type\Constant\ConstantBooleanType;
17-
use PHPStan\ShouldNotHappenException;
1814
use PHPStan\Type\ArrayType;
1915
use PHPStan\Type\FunctionTypeSpecifyingExtension;
2016
use PHPStan\Type\MixedType;
17+
use PHPStan\Type\Type;
18+
use function array_find;
19+
use function count;
2120
use function strtolower;
2221

2322
#[AutowiredService]
@@ -43,90 +42,54 @@ public function specifyTypes(FunctionReflection $functionReflection, FuncCall $n
4342
$arrayArgType = $scope->getType($array);
4443
$arrayTypes = $arrayArgType->getArrays();
4544

46-
if(count($arrayTypes) === 0) {
45+
if (count($arrayTypes) === 0) {
4746
return new SpecifiedTypes();
4847
}
4948

5049
$callable = $args[1]->value;
5150

52-
53-
// if ($callable instanceof Expr\ArrowFunction && $callable->expr instanceof Expr\FuncCall) {
5451
if ($callable instanceof Expr\ArrowFunction) {
5552

5653
$callableParms = $callable->params;
57-
58-
// foreach($arrayTypes as $arrayType) {
59-
// $keyType = $arrayType->getKeyType();
60-
// $itemType = $arrayType->getItemType();
61-
//
62-
// $variables = [];
63-
//
64-
// if (count($callableParms) < 1) {
65-
// continue;
66-
// }
67-
//
68-
// if ($callableParms[0] ?? null instanceof Expr\Variable) {
69-
// $variables[$callableParms[0]->name] = $itemType;
70-
// }
71-
//
72-
// if ($callableParms[1] ?? null instanceof Expr\Variable) {
73-
// $variables[$callableParms[1]->name] = $keyType;
74-
// }
75-
// }
7654
$specifiedTypesInFuncCall = $this->typeSpecifier->specifyTypesInCondition($scope, $callable->expr, $context)->getSureTypes();
7755

78-
if(count($callableParms) >= 1 && $callableParms[0] instanceof Expr\Variable) {
79-
80-
$callableParmValueName = $callableParms[0]->name;
81-
$specifiedTypeOfValue = array_find(
82-
$specifiedTypesInFuncCall,
83-
fn($specifiedType) => $specifiedType[0] instanceof Expr\Variable && $specifiedType[0]->name === $callableParmValueName
84-
);
85-
86-
if(isset($specifiedTypeOfValue)) {
87-
$valueType = $specifiedTypeOfValue[1];
88-
}
89-
56+
if (isset($callableParms[0]) && $callableParms[0] instanceof Expr\Variable) {
57+
$valueType = $this->fetchTypeByVariable($specifiedTypesInFuncCall, $callableParms[0]->name);
9058
}
9159

92-
if(count($callableParms) >= 2 && $callableParms[1] instanceof Expr\Variable) {
93-
94-
$callableParmKeyName = $callableParms[1]->name;
95-
$specifiedTypeOfKey = array_find(
96-
$specifiedTypesInFuncCall,
97-
fn($specifiedType) => $specifiedType[0] instanceof Expr\Variable && $specifiedType[0]->name === $callableParmKeyName
98-
);
99-
100-
if(isset($specifiedTypeOfKey)) {
101-
$keyType = $specifiedTypeOfKey[1];
102-
}
103-
60+
if (isset($callableParms[1]) && $callableParms[1] instanceof Expr\Variable) {
61+
$keyType = $this->fetchTypeByVariable($specifiedTypesInFuncCall, $callableParms[1]->name);
10462
}
10563

106-
if(isset($keyType) || isset($valueType)) {
64+
if (isset($keyType) || isset($valueType)) {
10765
return $this->typeSpecifier->create(
10866
$array,
10967
new ArrayType($keyType ?? new MixedType(), $valueType ?? new MixedType()),
11068
$context,
111-
$scope
69+
$scope,
11270
);
11371
}
11472
}
11573

11674
return new SpecifiedTypes();
11775
}
11876

119-
// /**
120-
// * @param array<string, TypeExpr> $paramTypes
121-
// */
122-
// private function replaceVariable(Expr $expr, array $paramTypes) : Expr {
123-
// if ($expr instanceof Variable) {
124-
// $variableName = $expr->name;
125-
// if (isset($paramTypes[$variableName])) {
126-
// return $paramTypes[$variableName];
127-
// }
128-
// } elseif ($expr instanceof )
129-
// }
77+
/**
78+
* @param array<string, list{Expr, Type}> $specifiedTypes
79+
*/
80+
private function fetchTypeByVariable(array $specifiedTypes, string $variableName): ?Type
81+
{
82+
$specifiedTypeOfKey = array_find(
83+
$specifiedTypes,
84+
static fn ($specifiedType) => $specifiedType[0] instanceof Expr\Variable && $specifiedType[0]->name === $variableName,
85+
);
86+
87+
if (isset($specifiedTypeOfKey)) {
88+
return $specifiedTypeOfKey[1];
89+
}
90+
91+
return null;
92+
}
13093

13194
public function setTypeSpecifier(TypeSpecifier $typeSpecifier): void
13295
{

tests/PHPStan/Analyser/TypeSpecifierTest.php

Lines changed: 62 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
use PhpParser\Node\Name;
1818
use PhpParser\Node\Scalar\LNumber;
1919
use PhpParser\Node\Scalar\String_;
20-
use PhpParser\Node\VariadicPlaceholder;
2120
use PhpParser\Node\VarLikeIdentifier;
2221
use PhpParser\PrettyPrinter\Standard;
2322
use PHPStan\Node\Expr\AlwaysRememberedExpr;
@@ -27,7 +26,6 @@
2726
use PHPStan\Type\ArrayType;
2827
use PHPStan\Type\ClassStringType;
2928
use PHPStan\Type\Constant\ConstantBooleanType;
30-
use PHPStan\Type\Constant\ConstantIntegerType;
3129
use PHPStan\Type\FloatType;
3230
use PHPStan\Type\Generic\GenericClassStringType;
3331
use PHPStan\Type\IntegerType;
@@ -1324,136 +1322,136 @@ public static function dataCondition(): iterable
13241322
],
13251323
[
13261324
new FuncCall(
1327-
new Name("array_all"),
1325+
new Name('array_all'),
13281326
[
1329-
new Arg(new Variable("array")),
1327+
new Arg(new Variable('array')),
13301328
new Arg(
13311329
new Expr\ArrowFunction(
13321330
[
1333-
'expr' => new FuncCall(new Name("is_int"), [new Arg(new Variable("value"))]),
1334-
'params' => [new Variable("value")],
1331+
'expr' => new FuncCall(new Name('is_int'), [new Arg(new Variable('value'))]),
1332+
'params' => [new Variable('value')],
13351333
],
1336-
[]
1337-
)
1338-
)
1339-
]
1334+
[],
1335+
),
1336+
),
1337+
],
13401338
),
13411339
[
1342-
'$array' => 'array<int>'
1340+
'$array' => 'array<int>',
13431341
],
1344-
[]
1342+
[],
13451343
],
13461344
[
13471345
new FuncCall(
1348-
new Name("array_all"),
1346+
new Name('array_all'),
13491347
[
1350-
new Arg(new Variable("array")),
1348+
new Arg(new Variable('array')),
13511349
new Arg(
13521350
new Expr\ArrowFunction(
13531351
[
1354-
'expr' => new FuncCall(new Name("is_string"), [new Arg(new Variable("key"))]),
1355-
'params' => [new Variable("value"), new Variable("key")],
1352+
'expr' => new FuncCall(new Name('is_string'), [new Arg(new Variable('key'))]),
1353+
'params' => [new Variable('value'), new Variable('key')],
13561354
],
1357-
[]
1358-
)
1359-
)
1360-
]
1355+
[],
1356+
),
1357+
),
1358+
],
13611359
),
13621360
[
1363-
'$array' => 'array<string, mixed>'
1361+
'$array' => 'array<string, mixed>',
13641362
],
1365-
[]
1363+
[],
13661364
],
13671365
[
13681366
new FuncCall(
1369-
new Name("array_all"),
1367+
new Name('array_all'),
13701368
[
1371-
new Arg(new Variable("array")),
1369+
new Arg(new Variable('array')),
13721370
new Arg(
13731371
new Expr\ArrowFunction(
13741372
[
13751373
'expr' => new Expr\BinaryOp\BooleanAnd(
1376-
new FuncCall(new Name("is_int"), [new Arg(new Variable("value"))]),
1377-
new FuncCall(new Name("is_string"), [new Arg(new Variable("key"))]),
1374+
new FuncCall(new Name('is_int'), [new Arg(new Variable('value'))]),
1375+
new FuncCall(new Name('is_string'), [new Arg(new Variable('key'))]),
13781376
),
1379-
'params' => [new Variable("value"), new Variable("key")],
1377+
'params' => [new Variable('value'), new Variable('key')],
13801378
],
1381-
[]
1382-
)
1383-
)
1384-
]
1379+
[],
1380+
),
1381+
),
1382+
],
13851383
),
13861384
[
1387-
'$array' => 'array<string, int>'
1385+
'$array' => 'array<string, int>',
13881386
],
1389-
[]
1387+
[],
13901388
],
13911389
[
13921390
new FuncCall(
1393-
new Name("array_all"),
1391+
new Name('array_all'),
13941392
[
1395-
new Arg(new Variable("array")),
1393+
new Arg(new Variable('array')),
13961394
new Arg(
13971395
new Expr\ArrowFunction(
13981396
[
13991397
'expr' => new Expr\BinaryOp\BooleanAnd(
1400-
new FuncCall(new Name("is_string"), [new Arg(new Variable("value"))]),
1401-
new FuncCall(new Name("is_numeric"), [new Arg(new Variable("value"))]),
1398+
new FuncCall(new Name('is_string'), [new Arg(new Variable('value'))]),
1399+
new FuncCall(new Name('is_numeric'), [new Arg(new Variable('value'))]),
14021400
),
1403-
'params' => [new Variable("value"), new Variable("key")],
1401+
'params' => [new Variable('value'), new Variable('key')],
14041402
],
1405-
[]
1406-
)
1407-
)
1408-
]
1403+
[],
1404+
),
1405+
),
1406+
],
14091407
),
14101408
[
1411-
'$array' => 'array<numeric-string>'
1409+
'$array' => 'array<numeric-string>',
14121410
],
1413-
[]
1411+
[],
14141412
],
14151413
[
14161414
new FuncCall(
1417-
new Name("array_all"),
1415+
new Name('array_all'),
14181416
[
1419-
new Arg(new Variable("array")),
1417+
new Arg(new Variable('array')),
14201418
new Arg(
14211419
new Expr\ArrowFunction(
14221420
[
14231421
'expr' => new Expr\BinaryOp\BooleanOr(
1424-
new FuncCall(new Name("is_float"), [new Arg(new Variable("value"))]),
1425-
new FuncCall(new Name("is_bool"), [new Arg(new Variable("value"))]),
1422+
new FuncCall(new Name('is_float'), [new Arg(new Variable('value'))]),
1423+
new FuncCall(new Name('is_bool'), [new Arg(new Variable('value'))]),
14261424
),
1427-
'params' => [new Variable("value"), new Variable("key")],
1425+
'params' => [new Variable('value'), new Variable('key')],
14281426
],
1429-
[]
1430-
)
1431-
)
1432-
]
1427+
[],
1428+
),
1429+
),
1430+
],
14331431
),
14341432
[
1435-
'$array' => 'array<bool|float>'
1433+
'$array' => 'array<bool|float>',
14361434
],
1437-
[]
1435+
[],
14381436
],
14391437
[
14401438
new FuncCall(
1441-
new Name("array_all"),
1439+
new Name('array_all'),
14421440
[
1443-
new Arg(new Variable("array")),
1441+
new Arg(new Variable('array')),
14441442
new Arg(
14451443
new Expr\ArrowFunction(
14461444
[
1447-
'expr' => new FuncCall(new Name("is_int"), [new Arg(new Expr\ConstFetch(new Name("1")))]),
1448-
'params' => [new Variable("value")],
1445+
'expr' => new FuncCall(new Name('is_int'), [new Arg(new Expr\ConstFetch(new Name('1')))]),
1446+
'params' => [new Variable('value')],
14491447
],
1450-
[]
1451-
)
1452-
)
1453-
]
1448+
[],
1449+
),
1450+
),
1451+
],
14541452
),
14551453
[],
1456-
[]
1454+
[],
14571455
],
14581456
];
14591457
}

0 commit comments

Comments
 (0)