From f03a55c80271838d99257440478f15fe0d1d3b64 Mon Sep 17 00:00:00 2001 From: Tyson Andre Date: Tue, 26 May 2020 09:24:54 -0400 Subject: [PATCH] Support parsing php 8.0's non-capturing catch statement https://wiki.php.net/rfc/non-capturing_catches was merged into php 8.0-dev. --- src/Node/CatchClause.php | 2 +- src/Parser.php | 2 +- tests/cases/parser/tryStatement10.php.diag | 9 +-------- tests/cases/parser/tryStatement10.php.tree | 6 +----- tests/cases/parser/tryStatement13.php.diag | 6 ------ tests/cases/parser/tryStatement13.php.tree | 6 +----- tests/cases/parser/tryStatement8.php.diag | 6 ------ tests/cases/parser/tryStatement8.php.tree | 6 +----- tests/cases/parser/tryStatement9.php.diag | 9 +-------- tests/cases/parser/tryStatement9.php.tree | 6 +----- 10 files changed, 8 insertions(+), 50 deletions(-) diff --git a/src/Node/CatchClause.php b/src/Node/CatchClause.php index ac71b64f..2784d116 100644 --- a/src/Node/CatchClause.php +++ b/src/Node/CatchClause.php @@ -24,7 +24,7 @@ class CatchClause extends Node { * TODO: In the next backwards incompatible release, replace qualifiedName with qualifiedNameList? */ public $otherQualifiedNameList; - /** @var Token */ + /** @var Token|null */ public $variableName; /** @var Token */ public $closeParen; diff --git a/src/Parser.php b/src/Parser.php index 722c447e..075c8f02 100644 --- a/src/Parser.php +++ b/src/Parser.php @@ -2249,7 +2249,7 @@ private function parseCatchClause($parentNode) { $qualifiedNameList = $this->parseQualifiedNameCatchList($catchClause)->children ?? []; $catchClause->qualifiedName = $qualifiedNameList[0] ?? null; // TODO generate missing token or error if null $catchClause->otherQualifiedNameList = array_slice($qualifiedNameList, 1); // TODO: Generate error if the name list has missing tokens - $catchClause->variableName = $this->eat1(TokenKind::VariableName); + $catchClause->variableName = $this->eatOptional1(TokenKind::VariableName); $catchClause->closeParen = $this->eat1(TokenKind::CloseParenToken); $catchClause->compoundStatement = $this->parseCompoundStatement($catchClause); diff --git a/tests/cases/parser/tryStatement10.php.diag b/tests/cases/parser/tryStatement10.php.diag index 4d7b4b56..0637a088 100644 --- a/tests/cases/parser/tryStatement10.php.diag +++ b/tests/cases/parser/tryStatement10.php.diag @@ -1,8 +1 @@ -[ - { - "kind": 0, - "message": "'VariableName' expected.", - "start": 22, - "length": 0 - } -] \ No newline at end of file +[] \ No newline at end of file diff --git a/tests/cases/parser/tryStatement10.php.tree b/tests/cases/parser/tryStatement10.php.tree index 420bd99f..bf879ad6 100644 --- a/tests/cases/parser/tryStatement10.php.tree +++ b/tests/cases/parser/tryStatement10.php.tree @@ -43,11 +43,7 @@ }, "qualifiedName": null, "otherQualifiedNameList": [], - "variableName": { - "error": "MissingToken", - "kind": "VariableName", - "textLength": 0 - }, + "variableName": null, "closeParen": { "kind": "CloseParenToken", "textLength": 1 diff --git a/tests/cases/parser/tryStatement13.php.diag b/tests/cases/parser/tryStatement13.php.diag index af385f5b..be775903 100644 --- a/tests/cases/parser/tryStatement13.php.diag +++ b/tests/cases/parser/tryStatement13.php.diag @@ -1,10 +1,4 @@ [ - { - "kind": 0, - "message": "'VariableName' expected.", - "start": 169, - "length": 0 - }, { "kind": 0, "message": "')' expected.", diff --git a/tests/cases/parser/tryStatement13.php.tree b/tests/cases/parser/tryStatement13.php.tree index 4ffc4bc9..42e811bf 100644 --- a/tests/cases/parser/tryStatement13.php.tree +++ b/tests/cases/parser/tryStatement13.php.tree @@ -43,11 +43,7 @@ }, "qualifiedName": null, "otherQualifiedNameList": [], - "variableName": { - "error": "MissingToken", - "kind": "VariableName", - "textLength": 0 - }, + "variableName": null, "closeParen": { "error": "MissingToken", "kind": "CloseParenToken", diff --git a/tests/cases/parser/tryStatement8.php.diag b/tests/cases/parser/tryStatement8.php.diag index 513e7607..6d37d1e0 100644 --- a/tests/cases/parser/tryStatement8.php.diag +++ b/tests/cases/parser/tryStatement8.php.diag @@ -5,12 +5,6 @@ "start": 21, "length": 0 }, - { - "kind": 0, - "message": "'VariableName' expected.", - "start": 21, - "length": 0 - }, { "kind": 0, "message": "')' expected.", diff --git a/tests/cases/parser/tryStatement8.php.tree b/tests/cases/parser/tryStatement8.php.tree index faf2c8c1..76d019e9 100644 --- a/tests/cases/parser/tryStatement8.php.tree +++ b/tests/cases/parser/tryStatement8.php.tree @@ -44,11 +44,7 @@ }, "qualifiedName": null, "otherQualifiedNameList": [], - "variableName": { - "error": "MissingToken", - "kind": "VariableName", - "textLength": 0 - }, + "variableName": null, "closeParen": { "error": "MissingToken", "kind": "CloseParenToken", diff --git a/tests/cases/parser/tryStatement9.php.diag b/tests/cases/parser/tryStatement9.php.diag index 59cd30be..0637a088 100644 --- a/tests/cases/parser/tryStatement9.php.diag +++ b/tests/cases/parser/tryStatement9.php.diag @@ -1,8 +1 @@ -[ - { - "kind": 0, - "message": "'VariableName' expected.", - "start": 27, - "length": 0 - } -] \ No newline at end of file +[] \ No newline at end of file diff --git a/tests/cases/parser/tryStatement9.php.tree b/tests/cases/parser/tryStatement9.php.tree index 4891bc60..b209092c 100644 --- a/tests/cases/parser/tryStatement9.php.tree +++ b/tests/cases/parser/tryStatement9.php.tree @@ -54,11 +54,7 @@ } }, "otherQualifiedNameList": [], - "variableName": { - "error": "MissingToken", - "kind": "VariableName", - "textLength": 0 - }, + "variableName": null, "closeParen": { "kind": "CloseParenToken", "textLength": 1