Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 129a63b

Browse files
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

Lines changed: 7 additions & 3 deletions
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

Lines changed: 37 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /