diff --git a/internal/php5/php5.go b/internal/php5/php5.go index 8aa85e6..e289a39 100644 Binary files a/internal/php5/php5.go and b/internal/php5/php5.go differ diff --git a/internal/php5/php5.y b/internal/php5/php5.y index d4cc523..35a1e60 100644 --- a/internal/php5/php5.y +++ b/internal/php5/php5.y @@ -3789,27 +3789,28 @@ expr_without_variable: } | expr '?' expr ':' expr { - $$ = &ast.ExprTernary{ast.Node{}, $1, $3, $5} - - // save position - $$.GetNode().Position = position.NewNodesPosition($1, $5) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) - yylex.(*Parser).setFreeFloating($$, token.Cond, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.True, $4.SkippedTokens) + $$ = &ast.ExprTernary{ + Node: ast.Node{ + Position: position.NewNodesPosition($1, $5), + }, + Condition: $1, + QuestionTkn: $2, + IfTrue: $3, + ColonTkn: $4, + IfFalse: $5, + } } | expr '?' ':' expr { - $$ = &ast.ExprTernary{ast.Node{}, $1, nil, $4} - - // save position - $$.GetNode().Position = position.NewNodesPosition($1, $4) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) - yylex.(*Parser).setFreeFloating($$, token.Cond, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.True, $3.SkippedTokens) + $$ = &ast.ExprTernary{ + Node: ast.Node{ + Position: position.NewNodesPosition($1, $4), + }, + Condition: $1, + QuestionTkn: $2, + ColonTkn: $3, + IfFalse: $4, + } } | internal_functions_in_yacc { @@ -3933,13 +3934,14 @@ expr_without_variable: } | '`' backticks_expr '`' { - $$ = &ast.ExprShellExec{ast.Node{}, $2} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) + $$ = &ast.ExprShellExec{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + OpenBacktickTkn: $1, + Parts: $2, + CloseBacktickTkn: $3, + } } | T_PRINT expr { @@ -4305,47 +4307,59 @@ function_call: } | class_name T_PAAMAYIM_NEKUDOTAYIM variable_name function_call_parameter_list { - $$ = &ast.ExprStaticCall{ast.Node{}, $1, $3, $4.(*ast.ArgumentList)} - - // save position - $$.GetNode().Position = position.NewNodesPosition($1, $4) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) - yylex.(*Parser).setFreeFloating($$, token.Name, $2.SkippedTokens) + $$ = &ast.ExprStaticCall{ + Node: ast.Node{ + Position: position.NewNodesPosition($1, $4), + }, + Class: $1, + DoubleColonTkn: $2, + Call: $3, + OpenParenthesisTkn: $4.(*ast.ArgumentList).OpenParenthesisTkn, + Arguments: $4.(*ast.ArgumentList).Arguments, + CloseParenthesisTkn: $4.(*ast.ArgumentList).OpenParenthesisTkn, + } } | class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects function_call_parameter_list { - $$ = &ast.ExprStaticCall{ast.Node{}, $1, $3, $4.(*ast.ArgumentList)} - - // save position - $$.GetNode().Position = position.NewNodesPosition($1, $4) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) - yylex.(*Parser).setFreeFloating($$, token.Name, $2.SkippedTokens) + $$ = &ast.ExprStaticCall{ + Node: ast.Node{ + Position: position.NewNodesPosition($1, $4), + }, + Class: $1, + DoubleColonTkn: $2, + Call: $3, + OpenParenthesisTkn: $4.(*ast.ArgumentList).OpenParenthesisTkn, + Arguments: $4.(*ast.ArgumentList).Arguments, + CloseParenthesisTkn: $4.(*ast.ArgumentList).OpenParenthesisTkn, + } } | variable_class_name T_PAAMAYIM_NEKUDOTAYIM variable_name function_call_parameter_list { - $$ = &ast.ExprStaticCall{ast.Node{}, $1, $3, $4.(*ast.ArgumentList)} - - // save position - $$.GetNode().Position = position.NewNodesPosition($1, $4) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) - yylex.(*Parser).setFreeFloating($$, token.Name, $2.SkippedTokens) + $$ = &ast.ExprStaticCall{ + Node: ast.Node{ + Position: position.NewNodesPosition($1, $4), + }, + Class: $1, + DoubleColonTkn: $2, + Call: $3, + OpenParenthesisTkn: $4.(*ast.ArgumentList).OpenParenthesisTkn, + Arguments: $4.(*ast.ArgumentList).Arguments, + CloseParenthesisTkn: $4.(*ast.ArgumentList).OpenParenthesisTkn, + } } | variable_class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects function_call_parameter_list { - $$ = &ast.ExprStaticCall{ast.Node{}, $1, $3, $4.(*ast.ArgumentList)} - - // save position - $$.GetNode().Position = position.NewNodesPosition($1, $4) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) - yylex.(*Parser).setFreeFloating($$, token.Name, $2.SkippedTokens) + $$ = &ast.ExprStaticCall{ + Node: ast.Node{ + Position: position.NewNodesPosition($1, $4), + }, + Class: $1, + DoubleColonTkn: $2, + Call: $3, + OpenParenthesisTkn: $4.(*ast.ArgumentList).OpenParenthesisTkn, + Arguments: $4.(*ast.ArgumentList).Arguments, + CloseParenthesisTkn: $4.(*ast.ArgumentList).OpenParenthesisTkn, + } } | variable_without_objects function_call_parameter_list { @@ -5145,27 +5159,28 @@ static_operation: } | static_scalar_value '?' ':' static_scalar_value { - $$ = &ast.ExprTernary{ast.Node{}, $1, nil, $4} - - // save position - $$.GetNode().Position = position.NewNodesPosition($1, $4) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) - yylex.(*Parser).setFreeFloating($$, token.Cond, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.True, $3.SkippedTokens) + $$ = &ast.ExprTernary{ + Node: ast.Node{ + Position: position.NewNodesPosition($1, $4), + }, + Condition: $1, + QuestionTkn: $2, + ColonTkn: $3, + IfFalse: $4, + } } | static_scalar_value '?' static_scalar_value ':' static_scalar_value { - $$ = &ast.ExprTernary{ast.Node{}, $1, $3, $5} - - // save position - $$.GetNode().Position = position.NewNodesPosition($1, $5) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) - yylex.(*Parser).setFreeFloating($$, token.Cond, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.True, $4.SkippedTokens) + $$ = &ast.ExprTernary{ + Node: ast.Node{ + Position: position.NewNodesPosition($1, $5), + }, + Condition: $1, + QuestionTkn: $2, + IfTrue: $3, + ColonTkn: $4, + IfFalse: $5, + } } | '+' static_scalar_value { @@ -5674,25 +5689,25 @@ variable_without_objects: static_member: class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects { - $$ = &ast.ExprStaticPropertyFetch{ast.Node{}, $1, $3} - - // save position - $$.GetNode().Position = position.NewNodesPosition($1, $3) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) - yylex.(*Parser).setFreeFloating($$, token.Name, $2.SkippedTokens) + $$ = &ast.ExprStaticPropertyFetch{ + Node: ast.Node{ + Position: position.NewNodesPosition($1, $3), + }, + Class: $1, + DoubleColonTkn: $2, + Property: $3, + } } | variable_class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects { - $$ = &ast.ExprStaticPropertyFetch{ast.Node{}, $1, $3} - - // save position - $$.GetNode().Position = position.NewNodesPosition($1, $3) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) - yylex.(*Parser).setFreeFloating($$, token.Name, $2.SkippedTokens) + $$ = &ast.ExprStaticPropertyFetch{ + Node: ast.Node{ + Position: position.NewNodesPosition($1, $3), + }, + Class: $1, + DoubleColonTkn: $2, + Property: $3, + } } ; diff --git a/internal/php7/php7.go b/internal/php7/php7.go index 8e48f1b..db2863b 100644 Binary files a/internal/php7/php7.go and b/internal/php7/php7.go differ diff --git a/internal/php7/php7.y b/internal/php7/php7.y index bd1fe44..b61b9cc 100644 --- a/internal/php7/php7.y +++ b/internal/php7/php7.y @@ -3424,27 +3424,28 @@ expr_without_variable: } | expr '?' expr ':' expr { - $$ = &ast.ExprTernary{ast.Node{}, $1, $3, $5} - - // save position - $$.GetNode().Position = position.NewNodesPosition($1, $5) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) - yylex.(*Parser).setFreeFloating($$, token.Cond, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.True, $4.SkippedTokens) + $$ = &ast.ExprTernary{ + Node: ast.Node{ + Position: position.NewNodesPosition($1, $5), + }, + Condition: $1, + QuestionTkn: $2, + IfTrue: $3, + ColonTkn: $4, + IfFalse: $5, + } } | expr '?' ':' expr { - $$ = &ast.ExprTernary{ast.Node{}, $1, nil, $4} - - // save position - $$.GetNode().Position = position.NewNodesPosition($1, $4) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) - yylex.(*Parser).setFreeFloating($$, token.Cond, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.True, $3.SkippedTokens) + $$ = &ast.ExprTernary{ + Node: ast.Node{ + Position: position.NewNodesPosition($1, $4), + }, + Condition: $1, + QuestionTkn: $2, + ColonTkn: $3, + IfFalse: $4, + } } | expr T_COALESCE expr { @@ -3571,13 +3572,14 @@ expr_without_variable: } | '`' backticks_expr '`' { - $$ = &ast.ExprShellExec{ast.Node{}, $2} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) + $$ = &ast.ExprShellExec{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + OpenBacktickTkn: $1, + Parts: $2, + CloseBacktickTkn: $3, + } } | T_PRINT expr { @@ -3795,25 +3797,31 @@ function_call: } | class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list { - $$ = &ast.ExprStaticCall{ast.Node{}, $1, $3, $4.(*ast.ArgumentList)} - - // save position - $$.GetNode().Position = position.NewNodesPosition($1, $4) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) - yylex.(*Parser).setFreeFloating($$, token.Name, $2.SkippedTokens) + $$ = &ast.ExprStaticCall{ + Node: ast.Node{ + Position: position.NewNodesPosition($1, $4), + }, + Class: $1, + DoubleColonTkn: $2, + Call: $3, + OpenParenthesisTkn: $4.(*ast.ArgumentList).OpenParenthesisTkn, + Arguments: $4.(*ast.ArgumentList).Arguments, + CloseParenthesisTkn: $4.(*ast.ArgumentList).OpenParenthesisTkn, + } } | variable_class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list { - $$ = &ast.ExprStaticCall{ast.Node{}, $1, $3, $4.(*ast.ArgumentList)} - - // save position - $$.GetNode().Position = position.NewNodesPosition($1, $4) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) - yylex.(*Parser).setFreeFloating($$, token.Name, $2.SkippedTokens) + $$ = &ast.ExprStaticCall{ + Node: ast.Node{ + Position: position.NewNodesPosition($1, $4), + }, + Class: $1, + DoubleColonTkn: $2, + Call: $3, + OpenParenthesisTkn: $4.(*ast.ArgumentList).OpenParenthesisTkn, + Arguments: $4.(*ast.ArgumentList).Arguments, + CloseParenthesisTkn: $4.(*ast.ArgumentList).OpenParenthesisTkn, + } } | callable_expr argument_list { @@ -4368,25 +4376,25 @@ simple_variable: static_member: class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable { - $$ = &ast.ExprStaticPropertyFetch{ast.Node{}, $1, $3} - - // save position - $$.GetNode().Position = position.NewNodesPosition($1, $3) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) - yylex.(*Parser).setFreeFloating($$, token.Name, $2.SkippedTokens) + $$ = &ast.ExprStaticPropertyFetch{ + Node: ast.Node{ + Position: position.NewNodesPosition($1, $3), + }, + Class: $1, + DoubleColonTkn: $2, + Property: $3, + } } | variable_class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable { - $$ = &ast.ExprStaticPropertyFetch{ast.Node{}, $1, $3} - - // save position - $$.GetNode().Position = position.NewNodesPosition($1, $3) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) - yylex.(*Parser).setFreeFloating($$, token.Name, $2.SkippedTokens) + $$ = &ast.ExprStaticPropertyFetch{ + Node: ast.Node{ + Position: position.NewNodesPosition($1, $3), + }, + Class: $1, + DoubleColonTkn: $2, + Property: $3, + } } ; @@ -4432,25 +4440,25 @@ new_variable: } | class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable { - $$ = &ast.ExprStaticPropertyFetch{ast.Node{}, $1, $3} - - // save position - $$.GetNode().Position = position.NewNodesPosition($1, $3) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) - yylex.(*Parser).setFreeFloating($$, token.Var, $2.SkippedTokens) + $$ = &ast.ExprStaticPropertyFetch{ + Node: ast.Node{ + Position: position.NewNodesPosition($1, $3), + }, + Class: $1, + DoubleColonTkn: $2, + Property: $3, + } } | new_variable T_PAAMAYIM_NEKUDOTAYIM simple_variable { - $$ = &ast.ExprStaticPropertyFetch{ast.Node{}, $1, $3} - - // save position - $$.GetNode().Position = position.NewNodesPosition($1, $3) - - // save comments - yylex.(*Parser).MoveFreeFloating($1, $$) - yylex.(*Parser).setFreeFloating($$, token.Var, $2.SkippedTokens) + $$ = &ast.ExprStaticPropertyFetch{ + Node: ast.Node{ + Position: position.NewNodesPosition($1, $3), + }, + Class: $1, + DoubleColonTkn: $2, + Property: $3, + } } ; diff --git a/pkg/ast/node.go b/pkg/ast/node.go index c6d4c8d..d65527a 100644 --- a/pkg/ast/node.go +++ b/pkg/ast/node.go @@ -1344,7 +1344,9 @@ func (n *ExprRequireOnce) Accept(v NodeVisitor) { // ExprShellExec node type ExprShellExec struct { Node - Parts []Vertex + OpenBacktickTkn *token.Token + Parts []Vertex + CloseBacktickTkn *token.Token } func (n *ExprShellExec) Accept(v NodeVisitor) { @@ -1354,9 +1356,12 @@ func (n *ExprShellExec) Accept(v NodeVisitor) { // ExprStaticCall node type ExprStaticCall struct { Node - Class Vertex - Call Vertex - ArgumentList *ArgumentList + Class Vertex + DoubleColonTkn *token.Token + Call Vertex + OpenParenthesisTkn *token.Token + Arguments []Vertex + CloseParenthesisTkn *token.Token } func (n *ExprStaticCall) Accept(v NodeVisitor) { @@ -1366,8 +1371,9 @@ func (n *ExprStaticCall) Accept(v NodeVisitor) { // ExprStaticPropertyFetch node type ExprStaticPropertyFetch struct { Node - Class Vertex - Property Vertex + Class Vertex + DoubleColonTkn *token.Token + Property Vertex } func (n *ExprStaticPropertyFetch) Accept(v NodeVisitor) { @@ -1377,9 +1383,11 @@ func (n *ExprStaticPropertyFetch) Accept(v NodeVisitor) { // ExprTernary node type ExprTernary struct { Node - Condition Vertex - IfTrue Vertex - IfFalse Vertex + Condition Vertex + QuestionTkn *token.Token + IfTrue Vertex + ColonTkn *token.Token + IfFalse Vertex } func (n *ExprTernary) Accept(v NodeVisitor) { diff --git a/pkg/ast/traverser/dfs.go b/pkg/ast/traverser/dfs.go index ad492b0..bc119f8 100644 --- a/pkg/ast/traverser/dfs.go +++ b/pkg/ast/traverser/dfs.go @@ -1566,10 +1566,12 @@ func (t *DFS) Traverse(n ast.Vertex) { t.Traverse(nn.Call) t.visitor.Leave("Call", true) } - if nn.ArgumentList != nil { - t.visitor.Enter("ArgumentList", true) - t.Traverse(nn.ArgumentList) - t.visitor.Leave("ArgumentList", true) + if nn.Arguments != nil { + t.visitor.Enter("Arguments", false) + for _, c := range nn.Arguments { + t.Traverse(c) + } + t.visitor.Leave("Arguments", false) } case *ast.ExprStaticPropertyFetch: if nn == nil { diff --git a/pkg/printer/pretty_printer.go b/pkg/printer/pretty_printer.go index a840cea..b046302 100644 --- a/pkg/printer/pretty_printer.go +++ b/pkg/printer/pretty_printer.go @@ -1239,7 +1239,7 @@ func (p *PrettyPrinter) printExprStaticCall(n ast.Vertex) { io.WriteString(p.w, "::") p.Print(nn.Call) io.WriteString(p.w, "(") - p.joinPrint(", ", nn.ArgumentList.Arguments) + p.joinPrint(", ", nn.Arguments) io.WriteString(p.w, ")") } diff --git a/pkg/printer/printer.go b/pkg/printer/printer.go index 58ac6eb..fc63109 100644 --- a/pkg/printer/printer.go +++ b/pkg/printer/printer.go @@ -1842,9 +1842,9 @@ func (p *Printer) printExprStaticCall(n ast.Vertex) { p.write([]byte("::")) p.Print(nn.Call) - p.printFreeFloatingOrDefault(nn.ArgumentList, token.Start, "(") - p.joinPrint(",", nn.ArgumentList.Arguments) - p.printFreeFloatingOrDefault(nn.ArgumentList, token.End, ")") + p.printToken(nn.OpenParenthesisTkn, "(") + p.joinPrint(",", nn.Arguments) + p.printToken(nn.CloseParenthesisTkn, ")") p.printFreeFloating(nn, token.End) }