Incompatible PHP OpenAPI changes in PhpStorm 2020.3
PHP 8 Support
PhpStorm 2020.3 introduces support for the upcoming PHP 8, which results in several noticeable changes in the PhpStorm internals.
Throw Expression
In PHP 8, the throw expression has been converted to a statement, so that it can now be used in arrow functions and coalescing and ternary expressions.
The following changes were introduced:
The PSI element
com.jetbrains.php.lang.psi.elements.PhpThrowis now deprecated, and the new PSI elementcom.jetbrains.php.lang.psi.elements.PhpThrowExpressionis introduced instead.We encourage using
PhpThrowExpression, since such expressions can appear in more places.PhpThrowPSI layout has changed: it is now aStatementwith a single childPhpThrowExpression. ThePhpThrow#getArgumentdelegates toPhpThrowExpression#getArgumentfor now.In PhpStorm 2020.2, the
PhpThrowclass will be removed and replaced withStatementImpl.
See the YouTrack issue for details.
Trailing Comma in Parameter Lists
Previously supported only in argument lists, trailing commas can now be used in parameter lists, as well.
The following changes were introduced:
The last psi-element of parameter lists can now be
PhpTokenTypes.opCOMMA. This might affect getting the last parameter: earlier the last psi-element ofParameterListwas always a parameter but now it can also be a comma.If you are using
PsiElement.getLastChild()to get the last parameter, it is now recommended replacing it with getting a parameter by index viaParameterList.getParameter(int).
See the YouTrack issue for details.
Non-Capturing Catches
With this PHP 8 change, it is now possible to catch exceptions without capturing them to variables.
The following changes were introduced:
Catchnow might not have a variable inside. The@Nullableannotation for the methodCatch.getException()that returns a variable was already available. However, if you are getting a variable fromCatchdifferently, or ignoring the@Nullableannotation, you need to be aware of this case effective since PHP 8.0.
See the YouTrack issue for details.
Constructor Property Promotion
The new shorthand syntax allows defining class properties by "promoting" the constructor parameters with a visibility keyword (public, protected, or private).
The following changes were introduced:
com.jetbrains.php.lang.psi.elements.Parameternow can contain one ofcom.jetbrains.php.lang.lexer.PhpTokenTypes#tsVARIABLE_MODIFIERSas a child element.
See the YouTrack issue for details.
Nullsafe Operator
The new nullsafe operator ?-> with full short-circuiting allows applying the null-coalescing behavior to method calls, thus eliminating the need for additional null checks.
The following changes were introduced:
com.jetbrains.php.lang.psi.elements.MemberReferencenow has an optional childcom.jetbrains.php.lang.lexer.PhpTokenTypes#opQUESTbetween the class reference andcom.jetbrains.php.lang.lexer.PhpTokenTypes#ARROW.
See the YouTrack issue for details.
Named Parameters
With named parameters, you can pass arguments to a function based on the parameter name, rather than its position.
The following changes were introduced:
The layout of
com.jetbrains.php.lang.psi.elements.ParameterListfor call sites has changed. Earlier, it was a comma-separated list of arguments; now, each argument can have optional previous siblings:com.jetbrains.php.lang.lexer.PhpTokenTypes#IDENTIFIERandcom.jetbrains.php.lang.lexer.PhpTokenTypesopCOLON.
See the YouTrack issue for details.
Attributes
With attributes, you can provide structured, syntactic metadata to declarations of classes, properties, functions, methods, parameters, and constants.
The following changes were introduced:
New PSI elements
PhpAttributeandPhpAttributesListwere added.Possible attributes' owners (
com.jetbrains.php.lang.psi.elements.Function,com.jetbrains.php.lang.psi.elements.Parameter, and so on) can now have zero or more instances ofPhpAttributesListas first children. This means that now it is not safe to assume thatPhpPsiElement#getFirstChildwill return some token. We encourage finding the needed tokens byIElementTypemanually.If a PHPDoc comment of a named element is preceded by
PhpAttribute, it will not be a sibling of a named element, but rather a child. We encourage usingPhpNamedElement#getDocComment(which is already updated to reflect the changes) instead of finding the PHPDoc comment manually.The stub tree structure has changed for some elements. If this causes problems in plugins, consider using higher-level facilities or contact support for additional help.
See the YouTrack issue for details.
Match Expression
New match expressions provide functionality similar to switch, but with safer semantics and the ability to return values.
The following changes were introduced:
New PSI elements:
PhpMatchExpressionandPhpMatchArm.A list of match arms is obtained via
PhpMatchExpression#getMatchArms(). The default match arm is not included in this list and is obtained by callingPhpMatchExpression#getDefaultMatchArm().Each
PhpMatchArmprovides a list of conditions viaPhpMatchArm#getConditions(). The method returns an empty list for the default match arm.Match arm body expression is obtained by invoking
PhpMatchArm#getBodyExpression().
See the YouTrack issue for details.
Twig Support Changes
The following changes were introduced:
PSI layout of Twig variables and fields has been changed. Earlier, Twig variables and fields used to be parsed as
PsiIdentifier; now they are wrapped into new PSI elements:TwigVariableandTwigField.TwigFieldmay be nested and contain a variable or other fields inside.