mirror of
https://github.com/danog/phpdoc-parser.git
synced 2024-11-26 20:15:11 +01:00
Add support for strict arrays and list shapes
This commit is contained in:
parent
066f9d07ee
commit
7978df2946
@ -5,6 +5,7 @@ namespace PHPStan\PhpDocParser\Parser;
|
|||||||
use LogicException;
|
use LogicException;
|
||||||
use PHPStan\PhpDocParser\Ast;
|
use PHPStan\PhpDocParser\Ast;
|
||||||
use PHPStan\PhpDocParser\Lexer\Lexer;
|
use PHPStan\PhpDocParser\Lexer\Lexer;
|
||||||
|
use function in_array;
|
||||||
use function strpos;
|
use function strpos;
|
||||||
use function trim;
|
use function trim;
|
||||||
|
|
||||||
@ -123,7 +124,7 @@ class TypeParser
|
|||||||
} elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) {
|
} elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) {
|
||||||
$type = $this->tryParseArrayOrOffsetAccess($tokens, $type);
|
$type = $this->tryParseArrayOrOffsetAccess($tokens, $type);
|
||||||
|
|
||||||
} elseif ($type->name === 'array' && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) {
|
} elseif (in_array($type->name, ['array', 'list', 'strict-array', 'strict-list'], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) {
|
||||||
$type = $this->parseArrayShape($tokens, $type);
|
$type = $this->parseArrayShape($tokens, $type);
|
||||||
|
|
||||||
if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) {
|
if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) {
|
||||||
@ -409,7 +410,7 @@ class TypeParser
|
|||||||
if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET)) {
|
if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET)) {
|
||||||
$type = $this->parseGeneric($tokens, $type);
|
$type = $this->parseGeneric($tokens, $type);
|
||||||
|
|
||||||
} elseif ($type->name === 'array' && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) {
|
} elseif (in_array($type->name, ['array', 'list', 'strict-array', 'strict-list'], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) {
|
||||||
$type = $this->parseArrayShape($tokens, $type);
|
$type = $this->parseArrayShape($tokens, $type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -592,6 +592,60 @@ class TypeParserTest extends TestCase
|
|||||||
),
|
),
|
||||||
]),
|
]),
|
||||||
],
|
],
|
||||||
|
[
|
||||||
|
'strict-array{
|
||||||
|
a: int,
|
||||||
|
b: string
|
||||||
|
}',
|
||||||
|
new ArrayShapeNode([
|
||||||
|
new ArrayShapeItemNode(
|
||||||
|
new IdentifierTypeNode('a'),
|
||||||
|
false,
|
||||||
|
new IdentifierTypeNode('int')
|
||||||
|
),
|
||||||
|
new ArrayShapeItemNode(
|
||||||
|
new IdentifierTypeNode('b'),
|
||||||
|
false,
|
||||||
|
new IdentifierTypeNode('string')
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'strict-list{
|
||||||
|
int,
|
||||||
|
string
|
||||||
|
}',
|
||||||
|
new ArrayShapeNode([
|
||||||
|
new ArrayShapeItemNode(
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
new IdentifierTypeNode('int')
|
||||||
|
),
|
||||||
|
new ArrayShapeItemNode(
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
new IdentifierTypeNode('string')
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'list{
|
||||||
|
int,
|
||||||
|
string
|
||||||
|
}',
|
||||||
|
new ArrayShapeNode([
|
||||||
|
new ArrayShapeItemNode(
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
new IdentifierTypeNode('int')
|
||||||
|
),
|
||||||
|
new ArrayShapeItemNode(
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
new IdentifierTypeNode('string')
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
],
|
||||||
[
|
[
|
||||||
'callable(): Foo',
|
'callable(): Foo',
|
||||||
new CallableTypeNode(
|
new CallableTypeNode(
|
||||||
|
Loading…
Reference in New Issue
Block a user