Skip to content

Commit 0fe8dc7

Browse files
committed
Require phpstan/phpdoc-parser v2
1 parent 53df2ff commit 0fe8dc7

File tree

7 files changed

+55
-37
lines changed

7 files changed

+55
-37
lines changed

composer.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"php": "^8.1",
99
"nette/utils": "^3.2 || ^4.0",
1010
"nikic/php-parser": "^5.0",
11-
"phpstan/phpdoc-parser": "^1.18.1"
11+
"phpstan/phpdoc-parser": "^2.0.0"
1212
},
1313
"require-dev": {
1414
"editorconfig-checker/editorconfig-checker": "^10.6.0",
@@ -20,7 +20,7 @@
2020
"shipmonk/composer-dependency-analyser": "^1.8.1",
2121
"shipmonk/name-collision-detector": "^2.1.1",
2222
"shipmonk/phpstan-rules": "^4.0.0",
23-
"slevomat/coding-standard": "^8.15.0"
23+
"slevomat/coding-standard": "dev-master"
2424
},
2525
"autoload": {
2626
"psr-4": {

src/Compiler/Mapper/Array/MapArrayShape.php

+4-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
use Attribute;
66
use PhpParser\Node\Expr;
77
use PhpParser\Node\Stmt;
8-
use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprStringNode;
98
use PHPStan\PhpDocParser\Ast\Type\ArrayShapeItemNode;
109
use PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode;
1110
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
@@ -102,13 +101,15 @@ public function getOutputType(): TypeNode
102101

103102
foreach ($this->items as $mapping) {
104103
$items[] = new ArrayShapeItemNode(
105-
new ConstExprStringNode($mapping->key),
104+
new IdentifierTypeNode($mapping->key),
106105
$mapping->optional,
107106
$mapping->mapper->getOutputType(),
108107
);
109108
}
110109

111-
return new ArrayShapeNode($items, $this->sealed, ArrayShapeNode::KIND_ARRAY);
110+
return $this->sealed
111+
? ArrayShapeNode::createSealed($items)
112+
: ArrayShapeNode::createUnsealed($items, null);
112113
}
113114

114115
/**

src/Compiler/MapperFactory/DefaultMapperCompilerFactoryProvider.php

+14-7
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use PHPStan\PhpDocParser\Parser\ConstExprParser;
77
use PHPStan\PhpDocParser\Parser\PhpDocParser;
88
use PHPStan\PhpDocParser\Parser\TypeParser;
9+
use PHPStan\PhpDocParser\ParserConfig;
910

1011
class DefaultMapperCompilerFactoryProvider implements MapperCompilerFactoryProvider
1112
{
@@ -19,20 +20,26 @@ public function get(): MapperCompilerFactory
1920

2021
protected function create(): MapperCompilerFactory
2122
{
22-
return new DefaultMapperCompilerFactory($this->createPhpDocLexer(), $this->createPhpDocParser());
23+
$config = $this->createParserConfig();
24+
return new DefaultMapperCompilerFactory($this->createPhpDocLexer($config), $this->createPhpDocParser($config));
2325
}
2426

25-
protected function createPhpDocLexer(): Lexer
27+
protected function createPhpDocLexer(ParserConfig $config): Lexer
2628
{
27-
return new Lexer();
29+
return new Lexer($config);
2830
}
2931

30-
protected function createPhpDocParser(): PhpDocParser
32+
protected function createParserConfig(): ParserConfig
3133
{
32-
$phpDocExprParser = new ConstExprParser(unescapeStrings: true);
33-
$phpDocTypeParser = new TypeParser($phpDocExprParser);
34+
return new ParserConfig([]);
35+
}
36+
37+
protected function createPhpDocParser(ParserConfig $config): PhpDocParser
38+
{
39+
$phpDocExprParser = new ConstExprParser($config);
40+
$phpDocTypeParser = new TypeParser($config, $phpDocExprParser);
3441

35-
return new PhpDocParser($phpDocTypeParser, $phpDocExprParser);
42+
return new PhpDocParser($config, $phpDocTypeParser, $phpDocExprParser);
3643
}
3744

3845
}

src/Compiler/Php/PhpCodeBuilder.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ public function mapperClassConstructor(MapperCompiler $mapperCompiler): ClassMet
528528
$innerMappersParameter->flags = ClassNode::MODIFIER_PRIVATE | ClassNode::MODIFIER_READONLY;
529529
$mapperConstructorBuilder->addParam($innerMappersParameter);
530530

531-
$innerMappersType = new ArrayShapeNode(Arrays::map(
531+
$innerMappersType = ArrayShapeNode::createSealed(Arrays::map(
532532
$mapperCompiler->getGenericParameters(),
533533
static function (GenericTypeParameter $genericParameter): ArrayShapeItemNode {
534534
return new ArrayShapeItemNode(

src/Compiler/Type/PhpDocTypeUtils.php

+11-7
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
use PHPStan\PhpDocParser\Parser\PhpDocParser;
4040
use PHPStan\PhpDocParser\Parser\TokenIterator;
4141
use PHPStan\PhpDocParser\Parser\TypeParser;
42+
use PHPStan\PhpDocParser\ParserConfig;
4243
use ReflectionClass;
4344
use ReflectionIntersectionType;
4445
use ReflectionNamedType;
@@ -179,7 +180,7 @@ public static function fromValue(mixed $value): TypeNode
179180
);
180181
}
181182

182-
return new ArrayShapeNode($items);
183+
return ArrayShapeNode::createSealed($items);
183184
}
184185

185186
if (is_object($value)) {
@@ -947,10 +948,11 @@ private static function getGenericTypeDefinitionFromPhpDoc(string $className): G
947948

948949
private static function parsePhpDoc(string $phpDoc): PhpDocNode
949950
{
950-
$phpDocLexer = new Lexer();
951-
$phpDocTypeParser = new TypeParser();
952-
$phpDocConstExprParser = new ConstExprParser(unescapeStrings: true);
953-
$phpDocParser = new PhpDocParser($phpDocTypeParser, $phpDocConstExprParser);
951+
$config = new ParserConfig([]);
952+
$phpDocLexer = new Lexer($config);
953+
$phpDocConstExprParser = new ConstExprParser($config);
954+
$phpDocTypeParser = new TypeParser($config, $phpDocConstExprParser);
955+
$phpDocParser = new PhpDocParser($config, $phpDocTypeParser, $phpDocConstExprParser);
954956
$phpDocTokens = $phpDocLexer->tokenize($phpDoc);
955957

956958
return $phpDocParser->parse(new TokenIterator($phpDocTokens));
@@ -1065,7 +1067,7 @@ private static function normalizeType(TypeNode $type): TypeNode
10651067

10661068
} elseif ($item->keyName instanceof IdentifierTypeNode) {
10671069
$newItems[] = new ArrayShapeItemNode(
1068-
keyName: new ConstExprStringNode($item->keyName->name),
1070+
keyName: new ConstExprStringNode($item->keyName->name, ConstExprStringNode::SINGLE_QUOTED),
10691071
optional: $item->optional,
10701072
valueType: $item->valueType,
10711073
);
@@ -1075,7 +1077,9 @@ private static function normalizeType(TypeNode $type): TypeNode
10751077
}
10761078
}
10771079

1078-
return new ArrayShapeNode($newItems, $type->sealed, $type->kind);
1080+
return $type->sealed
1081+
? ArrayShapeNode::createSealed($newItems, $type->kind)
1082+
: ArrayShapeNode::createUnsealed($newItems, null, $type->kind);
10791083
}
10801084

10811085
if ($type instanceof GenericTypeNode) {

tests/Compiler/MapperFactory/DefaultMapperCompilerFactoryTest.php

+16-12
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use PHPStan\PhpDocParser\Parser\PhpDocParser;
1212
use PHPStan\PhpDocParser\Parser\TokenIterator;
1313
use PHPStan\PhpDocParser\Parser\TypeParser;
14+
use PHPStan\PhpDocParser\ParserConfig;
1415
use PHPUnit\Framework\Attributes\DataProvider;
1516
use ShipMonk\InputMapper\Compiler\Exception\CannotCreateMapperCompilerException;
1617
use ShipMonk\InputMapper\Compiler\Mapper\Array\ArrayShapeItemMapping;
@@ -71,10 +72,11 @@ class DefaultMapperCompilerFactoryTest extends InputMapperTestCase
7172
#[DataProvider('provideCreateOkData')]
7273
public function testCreateOk(string $type, array $options, MapperCompiler $expectedMapperCompiler): void
7374
{
74-
$phpDocLexer = new Lexer();
75-
$phpDocExprParser = new ConstExprParser(unescapeStrings: true);
76-
$phpDocTypeParser = new TypeParser($phpDocExprParser);
77-
$phpDocParser = new PhpDocParser($phpDocTypeParser, $phpDocExprParser);
75+
$config = new ParserConfig([]);
76+
$phpDocLexer = new Lexer($config);
77+
$phpDocConstExprParser = new ConstExprParser($config);
78+
$phpDocTypeParser = new TypeParser($config, $phpDocConstExprParser);
79+
$phpDocParser = new PhpDocParser($config, $phpDocTypeParser, $phpDocConstExprParser);
7880
$phpDocType = $phpDocTypeParser->parse(new TokenIterator($phpDocLexer->tokenize($type)));
7981

8082
$mapperCompilerFactory = new DefaultMapperCompilerFactory($phpDocLexer, $phpDocParser);
@@ -435,10 +437,11 @@ className: InputWithRenamedSourceKey::class,
435437
#[DataProvider('provideCreateErrorData')]
436438
public function testCreateError(string $type, array $options, ?string $expectedMessage = null): void
437439
{
438-
$phpDocLexer = new Lexer();
439-
$phpDocExprParser = new ConstExprParser(unescapeStrings: true);
440-
$phpDocTypeParser = new TypeParser($phpDocExprParser);
441-
$phpDocParser = new PhpDocParser($phpDocTypeParser, $phpDocExprParser);
440+
$config = new ParserConfig([]);
441+
$phpDocLexer = new Lexer($config);
442+
$phpDocConstExprParser = new ConstExprParser($config);
443+
$phpDocTypeParser = new TypeParser($config, $phpDocConstExprParser);
444+
$phpDocParser = new PhpDocParser($config, $phpDocTypeParser, $phpDocConstExprParser);
442445
$phpDocType = $phpDocTypeParser->parse(new TokenIterator($phpDocLexer->tokenize($type)));
443446

444447
$mapperCompilerFactory = new DefaultMapperCompilerFactory($phpDocLexer, $phpDocParser);
@@ -510,10 +513,11 @@ public static function provideCreateErrorData(): iterable
510513

511514
public function testCreateWithCustomFactory(): void
512515
{
513-
$phpDocLexer = new Lexer();
514-
$phpDocExprParser = new ConstExprParser(unescapeStrings: true);
515-
$phpDocTypeParser = new TypeParser($phpDocExprParser);
516-
$phpDocParser = new PhpDocParser($phpDocTypeParser, $phpDocExprParser);
516+
$config = new ParserConfig([]);
517+
$phpDocLexer = new Lexer($config);
518+
$phpDocConstExprParser = new ConstExprParser($config);
519+
$phpDocTypeParser = new TypeParser($config, $phpDocConstExprParser);
520+
$phpDocParser = new PhpDocParser($config, $phpDocTypeParser, $phpDocConstExprParser);
517521

518522
$carMapperCompiler = new MapObject(CarInput::class, [
519523
'id' => new MapInt(),

tests/Compiler/Type/PhpDocTypeUtilsTest.php

+7-5
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
use PHPStan\PhpDocParser\Parser\ConstExprParser;
2424
use PHPStan\PhpDocParser\Parser\TokenIterator;
2525
use PHPStan\PhpDocParser\Parser\TypeParser;
26+
use PHPStan\PhpDocParser\ParserConfig;
2627
use PHPUnit\Framework\Attributes\DataProvider;
2728
use PHPUnit\Framework\TestCase;
2829
use ReflectionClass;
@@ -279,7 +280,7 @@ public static function provideToNativeTypeData(): iterable
279280
];
280281

281282
yield 'array{int, string}' => [
282-
new ArrayShapeNode([
283+
ArrayShapeNode::createSealed([
283284
new ArrayShapeItemNode(keyName: null, optional: false, valueType: new IdentifierTypeNode('int')),
284285
new ArrayShapeItemNode(keyName: null, optional: false, valueType: new IdentifierTypeNode('string')),
285286
]),
@@ -397,7 +398,7 @@ public static function provideIsNullableData(): iterable
397398
];
398399

399400
yield 'array{int, string}' => [
400-
new ArrayShapeNode([
401+
ArrayShapeNode::createSealed([
401402
new ArrayShapeItemNode(keyName: null, optional: false, valueType: new IdentifierTypeNode('int')),
402403
new ArrayShapeItemNode(keyName: null, optional: false, valueType: new IdentifierTypeNode('string')),
403404
]),
@@ -1609,9 +1610,10 @@ public static function provideInferGenericParameterData(): iterable
16091610

16101611
private function parseType(string $type): TypeNode
16111612
{
1612-
$lexer = new Lexer();
1613-
$constExprParser = new ConstExprParser(unescapeStrings: true);
1614-
$typeParser = new TypeParser($constExprParser);
1613+
$config = new ParserConfig([]);
1614+
$lexer = new Lexer($config);
1615+
$constExprParser = new ConstExprParser($config);
1616+
$typeParser = new TypeParser($config, $constExprParser);
16151617

16161618
$tokens = new TokenIterator($lexer->tokenize($type));
16171619
$typeNode = $typeParser->parse($tokens);

0 commit comments

Comments
 (0)