Skip to content

Commit

Permalink
add support for phpstan/phpdoc-parser 2
Browse files Browse the repository at this point in the history
  • Loading branch information
xabbuh committed Nov 8, 2024
1 parent 0c70d2c commit 0e5d1e0
Show file tree
Hide file tree
Showing 7 changed files with 86 additions and 17 deletions.
3 changes: 2 additions & 1 deletion composer-require-checker.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
"symbol-whitelist" : [
"null", "true", "false",
"static", "self", "parent",
"array", "string", "int", "float", "bool", "iterable", "callable", "void", "object", "XSLTProcessor"
"array", "string", "int", "float", "bool", "iterable", "callable", "void", "object", "XSLTProcessor",
"PHPStan\\PhpDocParser\\ParserConfig"
],
"php-core-extensions" : [
"Core",
Expand Down
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
"webmozart/assert": "^1.9.1",
"phpdocumentor/reflection-common": "^2.2",
"ext-filter": "*",
"phpstan/phpdoc-parser": "^1.7",
"phpstan/phpdoc-parser": "^1.7|^2.0",
"doctrine/deprecations": "^1.1"
},
"require-dev": {
Expand Down
2 changes: 1 addition & 1 deletion composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

40 changes: 40 additions & 0 deletions phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,45 @@ parameters:
ignoreErrors:
- '#Method phpDocumentor\\Reflection\\DocBlock\\StandardTagFactory::createTag\(\) should return phpDocumentor\\Reflection\\DocBlock\\Tag but returns mixed#'
- '#Offset 2 on array\{string, 28, int\} on left side of \?\? always exists and is not nullable\.#'
-
message: "#^Class PHPStan\\\\PhpDocParser\\\\Parser\\\\ConstExprParser constructor invoked with 3 parameters, 1 required\\.$#"
count: 1
path: src/DocBlock/Tags/Factory/AbstractPHPStanFactory.php
-
message: "#^Class PHPStan\\\\PhpDocParser\\\\Parser\\\\PhpDocParser constructor invoked with 6 parameters, 3 required\\.$#"
count: 1
path: src/DocBlock/Tags/Factory/AbstractPHPStanFactory.php
-
message: "#^Class PHPStan\\\\PhpDocParser\\\\Parser\\\\TypeParser constructor invoked with 3 parameters, 2 required\\.$#"
count: 1
path: src/DocBlock/Tags/Factory/AbstractPHPStanFactory.php
-
message: "#^Parameter \\#1 \\$config of class PHPStan\\\\PhpDocParser\\\\Lexer\\\\Lexer constructor expects PHPStan\\\\PhpDocParser\\\\ParserConfig, true given\\.$#"
count: 1
path: src/DocBlock/Tags/Factory/AbstractPHPStanFactory.php
-
message: "#^Parameter \\#1 \\$config of class PHPStan\\\\PhpDocParser\\\\Parser\\\\ConstExprParser constructor expects PHPStan\\\\PhpDocParser\\\\ParserConfig, true given\\.$#"
count: 1
path: src/DocBlock/Tags/Factory/AbstractPHPStanFactory.php
-
message: "#^Parameter \\#1 \\$config of class PHPStan\\\\PhpDocParser\\\\Parser\\\\PhpDocParser constructor expects PHPStan\\\\PhpDocParser\\\\ParserConfig, PHPStan\\\\PhpDocParser\\\\Parser\\\\TypeParser given\\.$#"
count: 1
path: src/DocBlock/Tags/Factory/AbstractPHPStanFactory.php
-
message: "#^Parameter \\#1 \\$config of class PHPStan\\\\PhpDocParser\\\\Parser\\\\TypeParser constructor expects PHPStan\\\\PhpDocParser\\\\ParserConfig, PHPStan\\\\PhpDocParser\\\\Parser\\\\ConstExprParser given\\.$#"
count: 1
path: src/DocBlock/Tags/Factory/AbstractPHPStanFactory.php
-
message: "#^Parameter \\#2 \\$constExprParser of class PHPStan\\\\PhpDocParser\\\\Parser\\\\TypeParser constructor expects PHPStan\\\\PhpDocParser\\\\Parser\\\\ConstExprParser, true given\\.$#"
count: 1
path: src/DocBlock/Tags/Factory/AbstractPHPStanFactory.php
-
message: "#^Parameter \\#2 \\$typeParser of class PHPStan\\\\PhpDocParser\\\\Parser\\\\PhpDocParser constructor expects PHPStan\\\\PhpDocParser\\\\Parser\\\\TypeParser, PHPStan\\\\PhpDocParser\\\\Parser\\\\ConstExprParser given\\.$#"
count: 1
path: src/DocBlock/Tags/Factory/AbstractPHPStanFactory.php
-
message: "#^Parameter \\#3 \\$constantExprParser of class PHPStan\\\\PhpDocParser\\\\Parser\\\\PhpDocParser constructor expects PHPStan\\\\PhpDocParser\\\\Parser\\\\ConstExprParser, true given\\.$#"
count: 1
path: src/DocBlock/Tags/Factory/AbstractPHPStanFactory.php
paths:
- src
7 changes: 7 additions & 0 deletions psalm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -68,5 +68,12 @@
<file name="src/Utils.php"/>
</errorLevel>
</ArgumentTypeCoercion>

<InvalidArgument>
<errorLevel type="suppress">
<referencedFunction name="PHPStan\PhpDocParser\Parser\PhpDocParser::__construct"/>
<referencedFunction name="PHPStan\PhpDocParser\Parser\TypeParser::__construct"/>
</errorLevel>
</InvalidArgument>
</issueHandlers>
</psalm>
33 changes: 23 additions & 10 deletions src/DocBlock/Tags/Factory/AbstractPHPStanFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,10 @@
use PHPStan\PhpDocParser\Parser\PhpDocParser;
use PHPStan\PhpDocParser\Parser\TokenIterator;
use PHPStan\PhpDocParser\Parser\TypeParser;
use PHPStan\PhpDocParser\ParserConfig;
use RuntimeException;

use function class_exists;
use function ltrim;
use function property_exists;
use function rtrim;
Expand All @@ -44,16 +46,27 @@ class AbstractPHPStanFactory implements Factory

public function __construct(PHPStanFactory ...$factories)
{
$this->lexer = new Lexer(true);
$constParser = new ConstExprParser(true, true, ['lines' => true, 'indexes' => true]);
$this->parser = new PhpDocParser(
new TypeParser($constParser, true, ['lines' => true, 'indexes' => true]),
$constParser,
true,
true,
['lines' => true, 'indexes' => true],
true
);
if (class_exists(ParserConfig::class)) {
$config = new ParserConfig(['indexes' => true, 'lines' => true]);
$this->lexer = new Lexer($config);
$constParser = new ConstExprParser($config);
$this->parser = new PhpDocParser(
$config,
new TypeParser($config, $constParser),
$constParser
);
} else {
$this->lexer = new Lexer(true);
$constParser = new ConstExprParser(true, true, ['lines' => true, 'indexes' => true]);
$this->parser = new PhpDocParser(
new TypeParser($constParser, true, ['lines' => true, 'indexes' => true]),
$constParser,
true,
true,
['lines' => true, 'indexes' => true],
true
);
}
$this->factories = $factories;
}

Expand Down
16 changes: 12 additions & 4 deletions tests/unit/DocBlock/Tags/Factory/TagFactoryTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
use PHPStan\PhpDocParser\Parser\PhpDocParser;
use PHPStan\PhpDocParser\Parser\TokenIterator;
use PHPStan\PhpDocParser\Parser\TypeParser;
use PHPStan\PhpDocParser\ParserConfig;
use PHPUnit\Framework\TestCase;

use function property_exists;
Expand All @@ -32,11 +33,18 @@ abstract class TagFactoryTestCase extends TestCase
{
public function parseTag(string $tag): PhpDocTagNode
{
$lexer = new Lexer();
$tokens = $lexer->tokenize($tag);
$constParser = new ConstExprParser();
if (class_exists(ParserConfig::class)) {
$config = new ParserConfig([]);
$lexer = new Lexer($config);
$constParser = new ConstExprParser($config);
$phpDocParser = new PhpDocParser($config, new TypeParser($config, $constParser), $constParser);
} else {
$lexer = new Lexer();
$constParser = new ConstExprParser();
$phpDocParser = new PhpDocParser(new TypeParser($constParser), $constParser);
}

$tagNode = (new PhpDocParser(new TypeParser($constParser), $constParser))->parseTag(new TokenIterator($tokens));
$tagNode = ($phpDocParser)->parseTag(new TokenIterator($lexer->tokenize($tag)));
if (property_exists($tagNode->value, 'description') === true) {
$tagNode->value->setAttribute('description', $tagNode->value->description);
}
Expand Down

0 comments on commit 0e5d1e0

Please sign in to comment.