Skip to content

Commit 129a63b

Browse files
authored
Extend allowed types for conditional for parameter
1 parent d8e9fd9 commit 129a63b

File tree

2 files changed

+44
-3
lines changed

2 files changed

+44
-3
lines changed

src/Parser/TypeParser.php

+7-3
Original file line numberDiff line numberDiff line change
@@ -259,15 +259,19 @@ private function parseConditionalForParameter(TokenIterator $tokens, string $par
259259
$tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER);
260260
}
261261

262-
$targetType = $this->parseAtomic($tokens);
262+
$targetType = $this->parse($tokens);
263263

264+
$tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL);
264265
$tokens->consumeTokenType(Lexer::TOKEN_NULLABLE);
266+
$tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL);
265267

266-
$ifType = $this->parseAtomic($tokens);
268+
$ifType = $this->parse($tokens);
267269

270+
$tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL);
268271
$tokens->consumeTokenType(Lexer::TOKEN_COLON);
272+
$tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL);
269273

270-
$elseType = $this->parseAtomic($tokens);
274+
$elseType = $this->parse($tokens);
271275

272276
return new Ast\Type\ConditionalTypeForParameterNode($parameterName, $targetType, $ifType, $elseType, $negated);
273277
}

tests/PHPStan/Parser/TypeParserTest.php

+37
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode;
1313
use PHPStan\PhpDocParser\Ast\Type\CallableTypeNode;
1414
use PHPStan\PhpDocParser\Ast\Type\CallableTypeParameterNode;
15+
use PHPStan\PhpDocParser\Ast\Type\ConditionalTypeForParameterNode;
1516
use PHPStan\PhpDocParser\Ast\Type\ConditionalTypeNode;
1617
use PHPStan\PhpDocParser\Ast\Type\ConstTypeNode;
1718
use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode;
@@ -1210,6 +1211,42 @@ public function provideParseData(): array
12101211
false
12111212
),
12121213
],
1214+
[
1215+
'($foo is Bar|Baz ? never : int|string)',
1216+
new ConditionalTypeForParameterNode(
1217+
'$foo',
1218+
new UnionTypeNode([
1219+
new IdentifierTypeNode('Bar'),
1220+
new IdentifierTypeNode('Baz'),
1221+
]),
1222+
new IdentifierTypeNode('never'),
1223+
new UnionTypeNode([
1224+
new IdentifierTypeNode('int'),
1225+
new IdentifierTypeNode('string'),
1226+
]),
1227+
false
1228+
),
1229+
],
1230+
[
1231+
'(' . PHP_EOL .
1232+
' $foo is Bar|Baz' . PHP_EOL .
1233+
' ? never' . PHP_EOL .
1234+
' : int|string' . PHP_EOL .
1235+
')',
1236+
new ConditionalTypeForParameterNode(
1237+
'$foo',
1238+
new UnionTypeNode([
1239+
new IdentifierTypeNode('Bar'),
1240+
new IdentifierTypeNode('Baz'),
1241+
]),
1242+
new IdentifierTypeNode('never'),
1243+
new UnionTypeNode([
1244+
new IdentifierTypeNode('int'),
1245+
new IdentifierTypeNode('string'),
1246+
]),
1247+
false
1248+
),
1249+
],
12131250
];
12141251
}
12151252

0 commit comments

Comments
 (0)