diff --git a/internal/php5/php5.go b/internal/php5/php5.go index f836b8b..caf5d74 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 181e9a4..05a8884 100644 --- a/internal/php5/php5.y +++ b/internal/php5/php5.y @@ -844,14 +844,14 @@ statement: unticked_statement: '{' inner_statement_list '}' { - $$ = &ast.StmtStmtList{ast.Node{}, $2} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Stmts, $3.SkippedTokens) + $$ = &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + OpenCurlyBracket: $1, + Stmts: $2, + CloseCurlyBracket: $3, + } } | T_IF parenthesis_expr statement elseif_list else_single { @@ -871,12 +871,16 @@ unticked_statement: } | T_IF parenthesis_expr ':' inner_statement_list new_elseif_list new_else_single T_ENDIF ';' { - stmts := &ast.StmtStmtList{ast.Node{}, $4} + stmts := &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewNodeListPosition($4), + }, + Stmts: $4, + } stmtsBrackets := &ast.ParserBrackets{ast.Node{}, stmts} $$ = &ast.StmtAltIf{ast.Node{}, $2, stmtsBrackets, $5, $6} // save position - stmts.GetNode().Position = position.NewNodeListPosition($4) stmtsBrackets.GetNode().Position = position.NewTokenNodeListPosition($3, $4) $$.GetNode().Position = position.NewTokensPosition($1, $8) @@ -1673,11 +1677,15 @@ for_statement: } | ':' inner_statement_list T_ENDFOR ';' { - stmtList := &ast.StmtStmtList{ast.Node{}, $2} + stmtList := &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewNodeListPosition($2), + }, + Stmts: $2, + } $$ = &ast.StmtAltFor{ast.Node{}, nil, nil, nil, stmtList} // save position - stmtList.GetNode().Position = position.NewNodeListPosition($2) $$.GetNode().Position = position.NewTokensPosition($1, $4) // save comments @@ -1698,11 +1706,15 @@ foreach_statement: } | ':' inner_statement_list T_ENDFOREACH ';' { - stmtList := &ast.StmtStmtList{ast.Node{}, $2} + stmtList := &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewNodeListPosition($2), + }, + Stmts: $2, + } $$ = &ast.StmtAltForeach{ast.Node{}, nil, nil, nil, stmtList} // save position - stmtList.GetNode().Position = position.NewNodeListPosition($2) $$.GetNode().Position = position.NewTokensPosition($1, $4) // save comments @@ -1724,11 +1736,15 @@ declare_statement: } | ':' inner_statement_list T_ENDDECLARE ';' { - stmtList := &ast.StmtStmtList{ast.Node{}, $2} + stmtList := &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewNodeListPosition($2), + }, + Stmts: $2, + } $$ = &ast.StmtDeclare{ast.Node{}, true, nil, stmtList} // save position - stmtList.GetNode().Position = position.NewNodeListPosition($2) $$.GetNode().Position = position.NewTokensPosition($1, $4) // save comments @@ -1902,11 +1918,15 @@ while_statement: } | ':' inner_statement_list T_ENDWHILE ';' { - stmtList := &ast.StmtStmtList{ast.Node{}, $2} + stmtList := &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewNodeListPosition($2), + }, + Stmts: $2, + } $$ = &ast.StmtAltWhile{ast.Node{}, nil, stmtList} // save position - stmtList.GetNode().Position = position.NewNodeListPosition($2) $$.GetNode().Position = position.NewTokensPosition($1, $4) // save comments @@ -1945,13 +1965,17 @@ new_elseif_list: } | new_elseif_list T_ELSEIF parenthesis_expr ':' inner_statement_list { - stmts := &ast.StmtStmtList{ast.Node{}, $5} + stmts := &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewNodeListPosition($5), + }, + Stmts: $5, + } stmtsBrackets := &ast.ParserBrackets{ast.Node{}, stmts} _elseIf := &ast.StmtAltElseIf{ast.Node{}, $3, stmtsBrackets} $$ = append($1, _elseIf) // save position - stmts.GetNode().Position = position.NewNodeListPosition($5) stmtsBrackets.GetNode().Position = position.NewTokenNodeListPosition($4, $5) _elseIf.GetNode().Position = position.NewTokenNodeListPosition($2, $5) @@ -1987,12 +2011,16 @@ new_else_single: } | T_ELSE ':' inner_statement_list { - stmts := &ast.StmtStmtList{ast.Node{}, $3} + stmts := &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewNodeListPosition($3), + }, + Stmts: $3, + } stmtsBrackets := &ast.ParserBrackets{ast.Node{}, stmts} $$ = &ast.StmtAltElse{ast.Node{}, stmtsBrackets} // save position - stmts.GetNode().Position = position.NewNodeListPosition($3) stmtsBrackets.GetNode().Position = position.NewTokenNodeListPosition($2, $3) $$.GetNode().Position = position.NewTokenNodeListPosition($1, $3) @@ -2626,14 +2654,14 @@ method_body: } | '{' inner_statement_list '}' { - $$ = &ast.StmtStmtList{ast.Node{}, $2} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Stmts, $3.SkippedTokens) + $$ = &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + OpenCurlyBracket: $1, + Stmts: $2, + CloseCurlyBracket: $3, + } } ; diff --git a/internal/php7/php7.go b/internal/php7/php7.go index 39c7876..bfc8970 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 ab3d550..a1ca1c7 100644 --- a/internal/php7/php7.y +++ b/internal/php7/php7.y @@ -851,14 +851,14 @@ inner_statement: statement: '{' inner_statement_list '}' { - $$ = &ast.StmtStmtList{ast.Node{}, $2} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Stmts, $3.SkippedTokens) + $$ = &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + OpenCurlyBracket: $1, + Stmts: $2, + CloseCurlyBracket: $3, + } } | if_stmt { @@ -1535,11 +1535,15 @@ for_statement: } | ':' inner_statement_list T_ENDFOR ';' { - stmtList := &ast.StmtStmtList{ast.Node{}, $2} + stmtList := &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewNodeListPosition($2), + }, + Stmts: $2, + } $$ = &ast.StmtAltFor{ast.Node{}, nil, nil, nil, stmtList} // save position - stmtList.GetNode().Position = position.NewNodeListPosition($2) $$.GetNode().Position = position.NewTokensPosition($1, $4) // save comments @@ -1560,11 +1564,15 @@ foreach_statement: } | ':' inner_statement_list T_ENDFOREACH ';' { - stmtList := &ast.StmtStmtList{ast.Node{}, $2} + stmtList := &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewNodeListPosition($2), + }, + Stmts: $2, + } $$ = &ast.StmtAltForeach{ast.Node{}, nil, nil, nil, stmtList} // save position - stmtList.GetNode().Position = position.NewNodeListPosition($2) $$.GetNode().Position = position.NewTokensPosition($1, $4) // save comments @@ -1585,11 +1593,15 @@ declare_statement: } | ':' inner_statement_list T_ENDDECLARE ';' { - stmtList := &ast.StmtStmtList{ast.Node{}, $2} + stmtList := &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewNodeListPosition($2), + }, + Stmts: $2, + } $$ = &ast.StmtDeclare{ast.Node{}, true, nil, stmtList} // save position - stmtList.GetNode().Position = position.NewNodeListPosition($2) $$.GetNode().Position = position.NewTokensPosition($1, $4) // save comments @@ -1716,11 +1728,15 @@ while_statement: } | ':' inner_statement_list T_ENDWHILE ';' { - stmtList := &ast.StmtStmtList{ast.Node{}, $2} + stmtList := &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewNodeListPosition($2), + }, + Stmts: $2, + } $$ = &ast.StmtAltWhile{ast.Node{}, nil, stmtList} // save position - stmtList.GetNode().Position = position.NewNodeListPosition($2) $$.GetNode().Position = position.NewTokensPosition($1, $4) // save comments @@ -1791,13 +1807,17 @@ alt_if_stmt_without_else: T_IF '(' expr ')' ':' inner_statement_list { exprBrackets := &ast.ParserBrackets{ast.Node{}, $3} - stmts := &ast.StmtStmtList{ast.Node{}, $6} + stmts := &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewNodeListPosition($6), + }, + Stmts: $6, + } stmtsBrackets := &ast.ParserBrackets{ast.Node{}, stmts} $$ = &ast.StmtAltIf{ast.Node{}, exprBrackets, stmtsBrackets, nil, nil} // save position exprBrackets.GetNode().Position = position.NewTokensPosition($2, $4) - stmts.GetNode().Position = position.NewNodeListPosition($6) stmtsBrackets.GetNode().Position = position.NewTokenNodeListPosition($5, $6) $$.GetNode().Position = position.NewTokenNodeListPosition($1, $6) @@ -1810,7 +1830,12 @@ alt_if_stmt_without_else: | alt_if_stmt_without_else T_ELSEIF '(' expr ')' ':' inner_statement_list { exprBrackets := &ast.ParserBrackets{ast.Node{}, $4} - stmts := &ast.StmtStmtList{ast.Node{}, $7} + stmts := &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewNodeListPosition($7), + }, + Stmts: $7, + } stmtsBrackets := &ast.ParserBrackets{ast.Node{}, stmts} _elseIf := &ast.StmtAltElseIf{ast.Node{}, exprBrackets, stmtsBrackets} $1.(*ast.StmtAltIf).ElseIf = append($1.(*ast.StmtAltIf).ElseIf, _elseIf) @@ -1819,7 +1844,6 @@ alt_if_stmt_without_else: // save position exprBrackets.GetNode().Position = position.NewTokensPosition($3, $5) - stmts.GetNode().Position = position.NewNodeListPosition($7) stmtsBrackets.GetNode().Position = position.NewTokenNodeListPosition($6, $7) _elseIf.GetNode().Position = position.NewTokenNodeListPosition($2, $7) @@ -1850,7 +1874,12 @@ alt_if_stmt: } | alt_if_stmt_without_else T_ELSE ':' inner_statement_list T_ENDIF ';' { - stmts := &ast.StmtStmtList{ast.Node{}, $4} + stmts := &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewNodeListPosition($4), + }, + Stmts: $4, + } stmtsBrackets := &ast.ParserBrackets{ast.Node{}, stmts} _else := &ast.StmtAltElse{ast.Node{}, stmtsBrackets} $1.(*ast.StmtAltIf).Else = _else @@ -1858,7 +1887,6 @@ alt_if_stmt: $$ = $1 // save position - stmts.GetNode().Position = position.NewNodeListPosition($4) stmtsBrackets.GetNode().Position = position.NewTokensPosition($3, $5) _else.GetNode().Position = position.NewTokenNodeListPosition($2, $4) $$.GetNode().Position = position.NewNodeTokenPosition($1, $6) @@ -2446,14 +2474,14 @@ method_body: } | '{' inner_statement_list '}' { - $$ = &ast.StmtStmtList{ast.Node{}, $2} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Stmts, $3.SkippedTokens) + $$ = &ast.StmtStmtList{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + OpenCurlyBracket: $1, + Stmts: $2, + CloseCurlyBracket: $3, + } } ; diff --git a/pkg/ast/node.go b/pkg/ast/node.go index 038dc46..2013eee 100644 --- a/pkg/ast/node.go +++ b/pkg/ast/node.go @@ -691,7 +691,9 @@ func (n *StmtStaticVar) Accept(v NodeVisitor) { // StmtStmtList node type StmtStmtList struct { Node - Stmts []Vertex + OpenCurlyBracket *token.Token + Stmts []Vertex + CloseCurlyBracket *token.Token } func (n *StmtStmtList) Accept(v NodeVisitor) { diff --git a/pkg/ast/visitor/filter_tokens.go b/pkg/ast/visitor/filter_tokens.go index 5cd2215..b368d8a 100644 --- a/pkg/ast/visitor/filter_tokens.go +++ b/pkg/ast/visitor/filter_tokens.go @@ -82,3 +82,8 @@ func (v *FilterTokens) StmtConstant(n *ast.StmtConstant) { n.EqualTkn = nil n.CommaTkn = nil } + +func (v *FilterTokens) StmtStmtList(n *ast.StmtStmtList) { + n.OpenCurlyBracket = nil + n.CloseCurlyBracket = nil +} diff --git a/pkg/printer/printer.go b/pkg/printer/printer.go index f87cd9b..4d1c2aa 100644 --- a/pkg/printer/printer.go +++ b/pkg/printer/printer.go @@ -2530,6 +2530,7 @@ func (p *Printer) printStmtDo(n ast.Vertex) { } p.Print(nn.Stmt) + p.printFreeFloating(nn, token.Stmts) io.WriteString(p.w, "while") @@ -3001,16 +3002,10 @@ func (p *Printer) printStmtStatic(n ast.Vertex) { p.printFreeFloating(nn, token.End) } -func (p *Printer) printStmtStmtList(n ast.Vertex) { - nn := n.(*ast.StmtStmtList) - p.printFreeFloating(nn, token.Start) - - io.WriteString(p.w, "{") - p.printNodes(nn.Stmts) - p.printFreeFloating(nn, token.Stmts) - io.WriteString(p.w, "}") - - p.printFreeFloating(nn, token.End) +func (p *Printer) printStmtStmtList(n *ast.StmtStmtList) { + p.printToken(n.OpenCurlyBracket, "{") + p.printNodes(n.Stmts) + p.printToken(n.CloseCurlyBracket, "}") } func (p *Printer) printStmtSwitch(n ast.Vertex) { diff --git a/pkg/printer/printer_parsed_php5_test.go b/pkg/printer/printer_parsed_php5_test.go index 5c14c0f..cd835d9 100644 --- a/pkg/printer/printer_parsed_php5_test.go +++ b/pkg/printer/printer_parsed_php5_test.go @@ -1211,7 +1211,8 @@ func TestParseAndPrintPhp5StaticVar(t *testing.T) { } func TestParseAndPrintPhp5StmtList(t *testing.T) { - src := `