@@ -711,6 +711,12 @@ private function parseAttributeStatement($parentNode) {
711711 if ($ parentNode instanceof ClassMembersNode) {
712712 // Create a class element or a MissingMemberDeclaration
713713 $ statement = $ this ->parseClassElementFn ()($ parentNode );
714+ } elseif ($ parentNode instanceof TraitMembers) {
715+ // Create a trait element or a MissingMemberDeclaration
716+ $ statement = $ this ->parseTraitElementFn ()($ parentNode );
717+ } elseif ($ parentNode instanceof InterfaceMembers) {
718+ // Create an interface element or a MissingMemberDeclaration
719+ $ statement = $ this ->parseInterfaceElementFn ()($ parentNode );
714720 } else {
715721 // Classlikes, anonymous functions, global functions, and arrow functions can have attributes. Global constants cannot.
716722 if (in_array ($ this ->token ->kind , [TokenKind::ClassKeyword, TokenKind::TraitKeyword, TokenKind::InterfaceKeyword, TokenKind::AbstractKeyword, TokenKind::FinalKeyword, TokenKind::FunctionKeyword, TokenKind::FnKeyword], true ) ||
@@ -3319,6 +3325,9 @@ private function parseInterfaceElementFn() {
33193325 case TokenKind::FunctionKeyword:
33203326 return $ this ->parseMethodDeclaration ($ parentNode , $ modifiers );
33213327
3328+ case TokenKind::AttributeToken:
3329+ return $ this ->parseAttributeStatement ($ parentNode );
3330+
33223331 default :
33233332 $ missingInterfaceMemberDeclaration = new MissingMemberDeclaration ();
33243333 $ missingInterfaceMemberDeclaration ->parent = $ parentNode ;
@@ -3499,6 +3508,9 @@ private function parseTraitElementFn() {
34993508 case TokenKind::UseKeyword:
35003509 return $ this ->parseTraitUseClause ($ parentNode );
35013510
3511+ case TokenKind::AttributeToken:
3512+ return $ this ->parseAttributeStatement ($ parentNode );
3513+
35023514 default :
35033515 return $ this ->parseRemainingPropertyDeclarationOrMissingMemberDeclaration ($ parentNode , $ modifiers );
35043516 }
0 commit comments