diff --git a/internal/php5/php5.go b/internal/php5/php5.go index f819223..2e1bb38 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 cdd7bc5..47d2df6 100644 --- a/internal/php5/php5.y +++ b/internal/php5/php5.y @@ -829,15 +829,19 @@ statement: | T_STRING ':' { label := &ast.Identifier{ast.Node{}, $1.Value} - $$ = &ast.StmtLabel{ast.Node{}, label} + $$ = &ast.StmtLabel{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $2), + }, + LabelName: label, + ColonTkn: $2, + } // save position label.GetNode().Position = position.NewTokenPosition($1) - $$.GetNode().Position = position.NewTokensPosition($1, $2) // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Label, $2.SkippedTokens) + yylex.(*Parser).setFreeFloating(label, token.Start, $1.SkippedTokens) } ; @@ -1179,17 +1183,21 @@ unticked_statement: | T_GOTO T_STRING ';' { label := &ast.Identifier{ast.Node{}, $2.Value} - $$ = &ast.StmtGoto{ast.Node{}, label} + + $$ = &ast.StmtGoto{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + GotoTkn: $1, + Label: label, + SemiColonTkn: $3, + } // save position label.GetNode().Position = position.NewTokenPosition($2) - $$.GetNode().Position = position.NewTokensPosition($1, $3) // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) yylex.(*Parser).setFreeFloating(label, token.Start, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Label, $3.SkippedTokens) - yylex.(*Parser).setToken($$, token.SemiColon, $3.SkippedTokens) } ; diff --git a/internal/php7/php7.go b/internal/php7/php7.go index f784230..cde883b 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 920dc76..e4709aa 100644 --- a/internal/php7/php7.y +++ b/internal/php7/php7.y @@ -1089,30 +1089,38 @@ statement: | T_GOTO T_STRING ';' { label := &ast.Identifier{ast.Node{}, $2.Value} - $$ = &ast.StmtGoto{ast.Node{}, label} + + $$ = &ast.StmtGoto{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + GotoTkn: $1, + Label: label, + SemiColonTkn: $3, + } // save position label.GetNode().Position = position.NewTokenPosition($2) - $$.GetNode().Position = position.NewTokensPosition($1, $3) // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) yylex.(*Parser).setFreeFloating(label, token.Start, $2.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Label, $3.SkippedTokens) - yylex.(*Parser).setToken($$, token.SemiColon, $3.SkippedTokens) } | T_STRING ':' { label := &ast.Identifier{ast.Node{}, $1.Value} - $$ = &ast.StmtLabel{ast.Node{}, label} + $$ = &ast.StmtLabel{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $2), + }, + LabelName: label, + ColonTkn: $2, + } // save position label.GetNode().Position = position.NewTokenPosition($1) - $$.GetNode().Position = position.NewTokensPosition($1, $2) // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) - yylex.(*Parser).setFreeFloating($$, token.Label, $2.SkippedTokens) + yylex.(*Parser).setFreeFloating(label, token.Start, $1.SkippedTokens) } catch_list: diff --git a/pkg/ast/node.go b/pkg/ast/node.go index e459723..7882623 100644 --- a/pkg/ast/node.go +++ b/pkg/ast/node.go @@ -505,7 +505,9 @@ func (n *StmtGlobal) Accept(v NodeVisitor) { // StmtGoto node type StmtGoto struct { Node - Label Vertex + GotoTkn *token.Token + Label Vertex + SemiColonTkn *token.Token } func (n *StmtGoto) Accept(v NodeVisitor) { @@ -582,6 +584,7 @@ func (n *StmtInterfaceExtends) Accept(v NodeVisitor) { type StmtLabel struct { Node LabelName Vertex + ColonTkn *token.Token } func (n *StmtLabel) Accept(v NodeVisitor) { diff --git a/pkg/ast/visitor/filter_tokens.go b/pkg/ast/visitor/filter_tokens.go index 62f7700..579bb8d 100644 --- a/pkg/ast/visitor/filter_tokens.go +++ b/pkg/ast/visitor/filter_tokens.go @@ -265,3 +265,12 @@ func (v *FilterTokens) StmtThrow(n *ast.StmtThrow) { n.ThrowTkn = nil n.SemiColonTkn = nil } + +func (v *FilterTokens) StmtGoto(n *ast.StmtGoto) { + n.GotoTkn = nil + n.SemiColonTkn = nil +} + +func (v *FilterTokens) StmtLabel(n *ast.StmtLabel) { + n.ColonTkn = nil +} diff --git a/pkg/printer/printer.go b/pkg/printer/printer.go index 0ade2a0..2dd68a4 100644 --- a/pkg/printer/printer.go +++ b/pkg/printer/printer.go @@ -2425,23 +2425,11 @@ func (p *Printer) printStmtGlobal(n *ast.StmtGlobal) { p.printToken(n.SemiColonTkn, ";") } -func (p *Printer) printStmtGoto(n ast.Vertex) { - nn := n.(*ast.StmtGoto) - p.printFreeFloating(nn, token.Start) - - p.write([]byte("goto")) - if nn.Label.GetNode().Tokens.IsEmpty() { - p.write([]byte(" ")) - } - p.Print(nn.Label) - p.printFreeFloating(nn, token.Label) - - p.printFreeFloating(nn, token.SemiColon) - if nn.GetNode().Tokens.IsEmpty() { - p.write([]byte(";")) - } - - p.printFreeFloating(nn, token.End) +func (p *Printer) printStmtGoto(n *ast.StmtGoto) { + p.printToken(n.GotoTkn, "goto") + p.bufStart = " " + p.Print(n.Label) + p.printToken(n.SemiColonTkn, ";") } func (p *Printer) printStmtHaltCompiler(n *ast.StmtHaltCompiler) { @@ -2527,16 +2515,9 @@ func (p *Printer) printStmtInterface(n ast.Vertex) { p.printFreeFloating(nn, token.End) } -func (p *Printer) printStmtLabel(n ast.Vertex) { - nn := n.(*ast.StmtLabel) - p.printFreeFloating(nn, token.Start) - - p.Print(nn.LabelName) - p.printFreeFloating(nn, token.Label) - - p.write([]byte(":")) - - p.printFreeFloating(nn, token.End) +func (p *Printer) printStmtLabel(n *ast.StmtLabel) { + p.Print(n.LabelName) + p.printToken(n.ColonTkn, ":") } func (p *Printer) printStmtNamespace(n *ast.StmtNamespace) {