diff --git a/src/Parser.php b/src/Parser.php index c318c69f..320959b5 100644 --- a/src/Parser.php +++ b/src/Parser.php @@ -757,7 +757,8 @@ private function parseAttributeGroups($parentNode): array while ($attributeToken = $this->eatOptional1(TokenKind::AttributeToken)) { $attributeGroup = new AttributeGroup(); $attributeGroup->startToken = $attributeToken; - $attributeGroup->attributes = $this->parseAttributeElementList($attributeGroup); + $attributeGroup->attributes = $this->parseAttributeElementList($attributeGroup) + ?: (new MissingToken(TokenKind::Name, $this->token->fullStart)); $attributeGroup->endToken = $this->eat1(TokenKind::CloseBracketToken); $attributeGroup->parent = $parentNode; $attributeGroups[] = $attributeGroup; diff --git a/tests/cases/parser80/attributes16.php.diag b/tests/cases/parser80/attributes16.php.diag index 6b39fb31..64210e35 100644 --- a/tests/cases/parser80/attributes16.php.diag +++ b/tests/cases/parser80/attributes16.php.diag @@ -11,6 +11,12 @@ "start": 12, "length": 0 }, + { + "kind": 0, + "message": "'Name' expected.", + "start": 15, + "length": 0 + }, { "kind": 0, "message": "']' expected.", diff --git a/tests/cases/parser80/attributes16.php.tree b/tests/cases/parser80/attributes16.php.tree index e1829e6b..5cf79aa0 100644 --- a/tests/cases/parser80/attributes16.php.tree +++ b/tests/cases/parser80/attributes16.php.tree @@ -40,7 +40,11 @@ "kind": "AttributeToken", "textLength": 2 }, - "attributes": null, + "attributes": { + "error": "MissingToken", + "kind": "Name", + "textLength": 0 + }, "endToken": { "error": "MissingToken", "kind": "CloseBracketToken", diff --git a/tests/cases/parser80/attributes17.php.diag b/tests/cases/parser80/attributes17.php.diag index ccdec7b9..599e7b3e 100644 --- a/tests/cases/parser80/attributes17.php.diag +++ b/tests/cases/parser80/attributes17.php.diag @@ -11,6 +11,12 @@ "start": 15, "length": 0 }, + { + "kind": 0, + "message": "'Name' expected.", + "start": 18, + "length": 0 + }, { "kind": 0, "message": "']' expected.", diff --git a/tests/cases/parser80/attributes17.php.tree b/tests/cases/parser80/attributes17.php.tree index f2cb28fd..43656514 100644 --- a/tests/cases/parser80/attributes17.php.tree +++ b/tests/cases/parser80/attributes17.php.tree @@ -41,7 +41,11 @@ "kind": "AttributeToken", "textLength": 2 }, - "attributes": null, + "attributes": { + "error": "MissingToken", + "kind": "Name", + "textLength": 0 + }, "endToken": { "error": "MissingToken", "kind": "CloseBracketToken", diff --git a/tests/cases/parser80/attributes18.php.diag b/tests/cases/parser80/attributes18.php.diag index 694f42ea..ad36b020 100644 --- a/tests/cases/parser80/attributes18.php.diag +++ b/tests/cases/parser80/attributes18.php.diag @@ -5,6 +5,12 @@ "start": 8, "length": 0 }, + { + "kind": 0, + "message": "'Name' expected.", + "start": 11, + "length": 0 + }, { "kind": 0, "message": "']' expected.", diff --git a/tests/cases/parser80/attributes18.php.tree b/tests/cases/parser80/attributes18.php.tree index d7a8baa2..2403179a 100644 --- a/tests/cases/parser80/attributes18.php.tree +++ b/tests/cases/parser80/attributes18.php.tree @@ -40,7 +40,11 @@ "kind": "AttributeToken", "textLength": 2 }, - "attributes": null, + "attributes": { + "error": "MissingToken", + "kind": "Name", + "textLength": 0 + }, "endToken": { "error": "MissingToken", "kind": "CloseBracketToken", diff --git a/tests/cases/parser80/attributes19.php.diag b/tests/cases/parser80/attributes19.php.diag new file mode 100644 index 00000000..377ee9fb --- /dev/null +++ b/tests/cases/parser80/attributes19.php.diag @@ -0,0 +1,8 @@ +[ + { + "kind": 0, + "message": "'Name' expected.", + "start": 8, + "length": 0 + } +] \ No newline at end of file diff --git a/tests/cases/parser80/attributes19.php.tree b/tests/cases/parser80/attributes19.php.tree new file mode 100644 index 00000000..fbd76862 --- /dev/null +++ b/tests/cases/parser80/attributes19.php.tree @@ -0,0 +1,67 @@ +{ + "SourceFileNode": { + "statementList": [ + { + "InlineHtml": { + "scriptSectionEndTag": null, + "text": null, + "scriptSectionStartTag": { + "kind": "ScriptSectionStartTag", + "textLength": 6 + } + } + }, + { + "ClassDeclaration": { + "attributes": [ + { + "AttributeGroup": { + "startToken": { + "kind": "AttributeToken", + "textLength": 2 + }, + "attributes": { + "error": "MissingToken", + "kind": "Name", + "textLength": 0 + }, + "endToken": { + "kind": "CloseBracketToken", + "textLength": 1 + } + } + } + ], + "abstractOrFinalModifier": null, + "classKeyword": { + "kind": "ClassKeyword", + "textLength": 5 + }, + "name": { + "kind": "Name", + "textLength": 1 + }, + "classBaseClause": null, + "classInterfaceClause": null, + "classMembers": { + "ClassMembersNode": { + "openBrace": { + "kind": "OpenBraceToken", + "textLength": 1 + }, + "classMemberDeclarations": [], + "closeBrace": { + "kind": "CloseBraceToken", + "textLength": 1 + } + } + } + } + } + ], + "endOfFileToken": { + "kind": "EndOfFileToken", + "textLength": 0 + } + } +} \ No newline at end of file