See the upgrading guide for detailed migration instructions. The changelog is relative to PHP-Parser 4.18.0.
Added
Added PhpVersion class, which is accepted in a number of places (e.g. ParserFactory, Parser, Lexer, PrettyPrinter) and gives more precise control over the PHP version being targeted.
Added PHP 8 parser though it only differs from the PHP 7 parser in concatenation precedence.
Added Parser::getTokens() method.
Added a Modifiers class, as a replacement for Stmt\Class_::MODIFIER_*.
Added support for returning an array or REMOVE_NODE from NodeVisitor::enterNode().
Added many additional type annotations. PhpStan is now used.
Added a fuzzing target for PHP-Fuzzer, which was how a lot of pretty printer bugs were found.
Added isPromoted(), isPublic(), isProtected(), isPrivate() and isReadonly() methods on Param.
Added support for class constants in trait builder.
Added PrettyPrinter interface.
Added support for formatting preservation when toggling static modifiers.
The php-parse binary now accepts - as the file name, in which case it will read from stdin.
Added support for NodeVisitor::REPLACE_WITH_NULL.
Added support for CRLF newlines in the pretty printer, using the new newline option.
Visitors can now be passed directly to the NodeTraverser constructor. A separate call to addVisitor() is no longer required.
Added support for printing additional attributes (like kind) in NodeDumper.
Added rawValue attribute to InterpolatedStringPart and heredoc/nowdoc String_s, which provides the original, unparsed value. It was previously only available for non-interpolated single/double quoted strings.
Added Stmt\Block to represent {} code blocks. Previously, such code blocks were flattened into the parent statements array. Stmt\Block will not be created for structures that are typically used with code blocks, for example if ($x) { $y; } will be represented as previously, while if ($x) { { $x; } } will have an extra Stmt\Block wrapper.
Changed
PHP 7.4 is now required to run PHP-Parser.
Property types have been added where possible.
Formatting of the standard pretty printer has been adjusted to match PSR-12 more closely.
The internal token representation now uses a PhpParser\Token class, which is compatible with PHP 8 token representation (PhpToken).
Array destructuring is now always represented using Expr\List_ nodes, even if it uses [] syntax.
Renamed a number of node classes, and moved things that were not real expressions/statements outside the Expr/Stmt hierarchy. Compatibility shims for the old names have been retained.
The pretty printer no longer unconditionally wraps yield in parentheses, unless the target version is set to older than PHP 7.0.
The pretty printer now defaults to PHP 7.4 as the target version.
Print else if { } instead of else { if { } }.
The leaveNode() method on visitors is now invoked in reverse order of enterNode().
Moved NodeTraverser::REMOVE_NODE etc. to NodeVisitor::REMOVE_NODE. The old constants are still available for compatibility.
The Name subnode parts has been replaced by name, which stores the name as a string rather than an array of parts separated by namespace separators. The getParts() method returns the old representation.
No longer accept strings for types in Node constructors. Instead, either an Identifier, Name or ComplexType must be passed.
Comment::getReformattedText() now normalizes CRLF newlines to LF newlines.
The Lexer no longer accepts options. Lexer\Emulative only accepts a PhpVersion. The startLexing(), getTokens() and handleHaltCompiler() methods have been removed. Instead, there is a single method tokenize() returning the tokens.
Attribute handling has been moved from the lexer to the parser, and is no longer configurable. The comments, startLine, endLine, startTokenPos, endTokenPos, startFilePos, and endFilePos attributes will always be added.
The pretty printer now indents heredoc/nowdoc strings if the target version is >= 7.3 (flexible heredoc/nowdoc).
Use visitor to assign comments. This fixes the long-standing issue where comments were assigned to all nodes sharing a starting position. Now only the outer-most node will hold the comments.
Improve NodeDumper performance for large dumps.
Removed
The PHP 5 parser has been removed. The PHP 7 parser has been adjusted to deal with PHP 5 code more gracefully.
Removed deprecated Error constructor taking a line number instead of an attributes array.
See UPGRADE-5.0 for detailed migration instructions.
Fixed
Fixed parent class of PropertyItem and UseItem.
Version 5.0.0-rc1 (2023-12-20)
See UPGRADE-5.0 for detailed migration instructions.
Fixed
Fixed parsing of empty files.
Added
Added support for printing additional attributes (like kind) in NodeDumper.
Added rawValue attribute to InterpolatedStringPart and heredoc/nowdoc String_s, which
provides the original, unparsed value. It was previously only available for non-interpolated
single/double quoted strings.
Added Stmt\Block to represent {} code blocks. Previously, such code blocks were flattened
into the parent statements array. Stmt\Block will not be created for structures that are
typically used with code blocks, for example if ($x) { $y; } will be represented as previously,
while if ($x) { { $x; } } will have an extra Stmt\Block wrapper.
Changed
Use visitor to assign comments. This fixes the long-standing issue where comments were assigned
to all nodes sharing a starting position. Now only the outer-most node will hold the comments.
Don't parse unicode escape sequences when targeting PHP < 7.0.
Improve NodeDumper performance for large dumps.
Removed
Removed Stmt\Throw_ node, use Expr\Throw_ inside Stmt\Expression instead.
Removed ParserFactory::create().
Version 5.0.0-beta1 (2023-09-17)
See UPGRADE-5.0 for detailed migration instructions.
Added
Visitors can now be passed directly to the NodeTraverser constructor. A separate call to
addVisitor() is no longer required.
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Updates the requirements on nikic/php-parser to permit the latest version.
Release notes
Sourced from nikic/php-parser's releases.
... (truncated)
Changelog
Sourced from nikic/php-parser's changelog.
... (truncated)
Commits
4a21235
Update documentation links in READMEfba1d62
Release PHP-Parser 5.0.05cc5a67
Upgrading guide tweaksf603e19
Avoid PHPUnit deprecation warnings1eeeb2d
Fix parent class of PropertyItem and UseItem255000a
Release PHP-Parser 5.0.0rc1f7d484a
Fix handling of empty inputf82a636
Add upgrading nodes for changes since beta113a41f0
Fix typos in UPGRADE-5.0.mdf666500
Fix NameResolver for class constant native typeDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting
@dependabot rebase
.Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show