microsoft/tolerant-php-parser

Trait `insteadof` should be able to accept a name list, but only accepts a single name

TysonAndre opened this issue · 0 comments

Version: between 0.0.5 and master

Expected: Should parse without error (<?php class C{use T1,T2,T3{T1::foo insteadof T2,T3;}} is syntactically valid)

https://secure.php.net/manual/en/language.oop5.traits.php#language.oop5.traits.conflict

(If there are 3 methods with the same list, one needs to exclude two of them, so it has to be a name list)

Observed: There were parse errors, MissingToken and SkippedToken were seen.

php dump.php 'class C{use T1,T2,T3{T1::foo insteadof T2,T3;}}'                                                           
Node\SourceFileNode                            
    statementList: Node\Statement\ClassDeclaration                                             
        classKeyword: Token: ClassKeyword(109): "class"                                        
        name: Token: Name(2): " C"             
        classMembers: Node\ClassMembersNode    
            openBrace: Token: OpenBraceToken(205): "{"                                         
            classMemberDeclarations: Node\TraitUseClause                                       
                useKeyword: Token: UseKeyword(162): "use"                                      
                traitNameList: Node\DelimitedList\QualifiedNameList                            
                    children: Node\QualifiedName                                               
                        nameParts: Token: Name(2): " T1"                                       
                    children: Token: CommaToken(251): ","                                      
                    children: Node\QualifiedName                                               
                        nameParts: Token: Name(2): "T2"                                        
                    children: Token: CommaToken(251): ","                                      
                    children: Node\QualifiedName                                               
                        nameParts: Token: Name(2): "T3"                                        
                semicolonOrOpenBrace: Token: OpenBraceToken(205): "{"                          
                traitSelectAndAliasClauses: Node\DelimitedList\TraitSelectOrAliasClauseList    
                    children: Node\TraitSelectOrAliasClause                                    
                        name: Node\Expression\ScopedPropertyAccessExpression                   
                            scopeResolutionQualifier: Node\QualifiedName                       
                                nameParts: Token: Name(2): "T1"                                
                            doubleColon: Token: ColonColonToken(256): "::"                     
                            memberName: Token: Name(2): "foo"                                  
                        asOrInsteadOfKeyword: Token: InsteadOfKeyword(142): " insteadof"       
                        targetName: Node\QualifiedName                                         
                            nameParts: Token: Name(2): " T2"                                   
                closeBrace: MissingToken: CloseBraceToken(206): ""  <-- Unexpected MissingToken
            classMemberDeclarations: SkippedToken: CommaToken(251): ","                        
            closeBrace: MissingToken: CloseBraceToken(206): ""                                 
    statementList: Node\Statement\ExpressionStatement                                          
        expression: Node\QualifiedName         
            nameParts: Token: Name(2): "T3"    
        semicolon: Token: SemicolonToken(237): ";"                                             
    statementList: SkippedToken: CloseBraceToken(206): "}"                                     
    statementList: SkippedToken: CloseBraceToken(206): "}"                                     
    endOfFileToken: Token: EndOfFileToken(1): ""