diff --git a/internal/php5/php5.go b/internal/php5/php5.go index 51b160f..51ae856 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 e529812..383a19d 100644 --- a/internal/php5/php5.y +++ b/internal/php5/php5.y @@ -4467,11 +4467,15 @@ backticks_expr: } | T_ENCAPSED_AND_WHITESPACE { - part := &ast.ScalarEncapsedStringPart{ast.Node{}, $1.Value} - $$ = []ast.Vertex{part} - - // save position - part.GetNode().Position = position.NewTokenPosition($1) + $$ = []ast.Vertex{ + &ast.ScalarEncapsedStringPart{ + Node: ast.Node{ + Position: position.NewTokenPosition($1), + }, + EncapsedStrTkn: $1, + Value: $1.Value, + }, + } } | encaps_list { @@ -4593,25 +4597,32 @@ common_scalar: } | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC { - encapsed := &ast.ScalarEncapsedStringPart{ast.Node{}, $2.Value} - $$ = &ast.ScalarHeredoc{ast.Node{}, $1.Value, []ast.Vertex{encapsed}} - - // save position - encapsed.GetNode().Position = position.NewTokenPosition($2) - $$.GetNode().Position = position.NewTokensPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) + $$ = &ast.ScalarHeredoc{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + OpenHeredocTkn: $1, + Parts: []ast.Vertex{ + &ast.ScalarEncapsedStringPart{ + Node: ast.Node{ + Position: position.NewTokenPosition($2), + }, + EncapsedStrTkn: $2, + Value: $2.Value, + }, + }, + CloseHeredocTkn: $3, + } } | T_START_HEREDOC T_END_HEREDOC { - $$ = &ast.ScalarHeredoc{ast.Node{}, $1.Value, nil} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $2) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) + $$ = &ast.ScalarHeredoc{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $2), + }, + OpenHeredocTkn: $1, + CloseHeredocTkn: $2, + } } ; @@ -5180,23 +5191,25 @@ scalar: } | '"' encaps_list '"' { - $$ = &ast.ScalarEncapsed{ast.Node{}, $2} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) + $$ = &ast.ScalarEncapsed{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + OpenQoteTkn: $1, + Parts: $2, + CloseQoteTkn: $1, + } } | T_START_HEREDOC encaps_list T_END_HEREDOC { - $$ = &ast.ScalarHeredoc{ast.Node{}, $1.Value, $2} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) + $$ = &ast.ScalarHeredoc{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + OpenHeredocTkn: $1, + Parts: $2, + CloseHeredocTkn: $3, + } } | T_CLASS_C { @@ -5976,14 +5989,16 @@ encaps_list: } | encaps_list T_ENCAPSED_AND_WHITESPACE { - encapsed := &ast.ScalarEncapsedStringPart{ast.Node{}, $2.Value} - $$ = append($1, encapsed) - - // save position - encapsed.GetNode().Position = position.NewTokenPosition($2) - - // save comments - yylex.(*Parser).setFreeFloating(encapsed, token.Start, $2.SkippedTokens) + $$ = append( + $1, + &ast.ScalarEncapsedStringPart{ + Node: ast.Node{ + Position: position.NewTokenPosition($2), + }, + EncapsedStrTkn: $2, + Value: $2.Value, + }, + ) } | encaps_var { @@ -5991,14 +6006,16 @@ encaps_list: } | T_ENCAPSED_AND_WHITESPACE encaps_var { - encapsed := &ast.ScalarEncapsedStringPart{ast.Node{}, $1.Value} - $$ = []ast.Vertex{encapsed, $2} - - // save position - encapsed.GetNode().Position = position.NewTokenPosition($1) - - // save comments - yylex.(*Parser).setFreeFloating(encapsed, token.Start, $1.SkippedTokens) + $$ = []ast.Vertex{ + &ast.ScalarEncapsedStringPart{ + Node: ast.Node{ + Position: position.NewTokenPosition($1), + }, + EncapsedStrTkn: $1, + Value: $1.Value, + }, + $2, + } } ; diff --git a/internal/php7/php7.go b/internal/php7/php7.go index 1ee2e1f..0ae49e3 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 d171ae7..f896af8 100644 --- a/internal/php7/php7.y +++ b/internal/php7/php7.y @@ -3878,11 +3878,15 @@ backticks_expr: } | T_ENCAPSED_AND_WHITESPACE { - part := &ast.ScalarEncapsedStringPart{ast.Node{}, $1.Value} - $$ = []ast.Vertex{part} - - // save position - part.GetNode().Position = position.NewTokenPosition($1) + $$ = []ast.Vertex{ + &ast.ScalarEncapsedStringPart{ + Node: ast.Node{ + Position: position.NewTokenPosition($1), + }, + EncapsedStrTkn: $1, + Value: $1.Value, + }, + } } | encaps_list { @@ -4040,45 +4044,54 @@ scalar: } | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC { - encapsed := &ast.ScalarEncapsedStringPart{ast.Node{}, $2.Value} - $$ = &ast.ScalarHeredoc{ast.Node{}, $1.Value, []ast.Vertex{encapsed}} - - // save position - encapsed.GetNode().Position = position.NewTokenPosition($2) - $$.GetNode().Position = position.NewTokensPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) + $$ = &ast.ScalarHeredoc{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + OpenHeredocTkn: $1, + Parts: []ast.Vertex{ + &ast.ScalarEncapsedStringPart{ + Node: ast.Node{ + Position: position.NewTokenPosition($2), + }, + EncapsedStrTkn: $2, + Value: $2.Value, + }, + }, + CloseHeredocTkn: $3, + } } | T_START_HEREDOC T_END_HEREDOC { - $$ = &ast.ScalarHeredoc{ast.Node{}, $1.Value, nil} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $2) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) + $$ = &ast.ScalarHeredoc{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $2), + }, + OpenHeredocTkn: $1, + CloseHeredocTkn: $2, + } } | '"' encaps_list '"' { - $$ = &ast.ScalarEncapsed{ast.Node{}, $2} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) + $$ = &ast.ScalarEncapsed{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + OpenQoteTkn: $1, + Parts: $2, + CloseQoteTkn: $1, + } } | T_START_HEREDOC encaps_list T_END_HEREDOC { - $$ = &ast.ScalarHeredoc{ast.Node{}, $1.Value, $2} - - // save position - $$.GetNode().Position = position.NewTokensPosition($1, $3) - - // save comments - yylex.(*Parser).setFreeFloating($$, token.Start, $1.SkippedTokens) + $$ = &ast.ScalarHeredoc{ + Node: ast.Node{ + Position: position.NewTokensPosition($1, $3), + }, + OpenHeredocTkn: $1, + Parts: $2, + CloseHeredocTkn: $3, + } } | dereferencable_scalar { @@ -4615,14 +4628,16 @@ encaps_list: } | encaps_list T_ENCAPSED_AND_WHITESPACE { - encapsed := &ast.ScalarEncapsedStringPart{ast.Node{}, $2.Value} - $$ = append($1, encapsed) - - // save position - encapsed.GetNode().Position = position.NewTokenPosition($2) - - // save comments - yylex.(*Parser).setFreeFloating(encapsed, token.Start, $2.SkippedTokens) + $$ = append( + $1, + &ast.ScalarEncapsedStringPart{ + Node: ast.Node{ + Position: position.NewTokenPosition($2), + }, + EncapsedStrTkn: $2, + Value: $2.Value, + }, + ) } | encaps_var { @@ -4630,14 +4645,16 @@ encaps_list: } | T_ENCAPSED_AND_WHITESPACE encaps_var { - encapsed := &ast.ScalarEncapsedStringPart{ast.Node{}, $1.Value} - $$ = []ast.Vertex{encapsed, $2} - - // save position - encapsed.GetNode().Position = position.NewTokenPosition($1) - - // save comments - yylex.(*Parser).setFreeFloating(encapsed, token.Start, $1.SkippedTokens) + $$ = []ast.Vertex{ + &ast.ScalarEncapsedStringPart{ + Node: ast.Node{ + Position: position.NewTokenPosition($1), + }, + EncapsedStrTkn: $1, + Value: $1.Value, + }, + $2, + } } ; diff --git a/pkg/ast/node.go b/pkg/ast/node.go index 5e6e373..a1b04f4 100644 --- a/pkg/ast/node.go +++ b/pkg/ast/node.go @@ -126,7 +126,9 @@ func (n *ScalarDnumber) Accept(v NodeVisitor) { // ScalarEncapsed node type ScalarEncapsed struct { Node - Parts []Vertex + OpenQoteTkn *token.Token + Parts []Vertex + CloseQoteTkn *token.Token } func (n *ScalarEncapsed) Accept(v NodeVisitor) { @@ -136,7 +138,8 @@ func (n *ScalarEncapsed) Accept(v NodeVisitor) { // ScalarEncapsedStringPart node type ScalarEncapsedStringPart struct { Node - Value []byte + EncapsedStrTkn *token.Token + Value []byte } func (n *ScalarEncapsedStringPart) Accept(v NodeVisitor) { @@ -146,8 +149,9 @@ func (n *ScalarEncapsedStringPart) Accept(v NodeVisitor) { // ScalarHeredoc node type ScalarHeredoc struct { Node - Label []byte - Parts []Vertex + OpenHeredocTkn *token.Token + Parts []Vertex + CloseHeredocTkn *token.Token } func (n *ScalarHeredoc) Accept(v NodeVisitor) { diff --git a/pkg/ast/visitor/dump.go b/pkg/ast/visitor/dump.go index 7e11d72..15c3226 100644 --- a/pkg/ast/visitor/dump.go +++ b/pkg/ast/visitor/dump.go @@ -1224,9 +1224,6 @@ func (v *Dump) ScalarHeredoc(n *ast.ScalarHeredoc) { v.printIndentIfNotSingle(v.indent - 1) v.print("&ast.ScalarHeredoc{\n") v.printNode(n.GetNode()) - - v.printIndent(v.indent) - v.print(fmt.Sprintf("Label: %q,\n", n.Label)) } func (v *Dump) ScalarLnumber(n *ast.ScalarLnumber) { diff --git a/pkg/printer/pretty_printer.go b/pkg/printer/pretty_printer.go index 6caa793..b1e411f 100644 --- a/pkg/printer/pretty_printer.go +++ b/pkg/printer/pretty_printer.go @@ -558,7 +558,7 @@ func (p *PrettyPrinter) printScalarEncapsed(n ast.Vertex) { func (p *PrettyPrinter) printScalarHeredoc(n ast.Vertex) { nn := n.(*ast.ScalarHeredoc) - io.WriteString(p.w, string(nn.Label)) + io.WriteString(p.w, string(nn.OpenHeredocTkn.Value)) for _, part := range nn.Parts { switch part.(type) { @@ -571,7 +571,7 @@ func (p *PrettyPrinter) printScalarHeredoc(n ast.Vertex) { } } - io.WriteString(p.w, strings.Trim(string(nn.Label), "<\"'\n")) + io.WriteString(p.w, strings.Trim(string(nn.OpenHeredocTkn.Value), "<\"'\n")) } func (p *PrettyPrinter) printScalarMagicConstant(n ast.Vertex) { diff --git a/pkg/printer/printer.go b/pkg/printer/printer.go index 7f5fae5..4925c35 100644 --- a/pkg/printer/printer.go +++ b/pkg/printer/printer.go @@ -687,7 +687,7 @@ func (p *Printer) printScalarHeredoc(n ast.Vertex) { p.printFreeFloatingOrDefault(nn, token.Start, p.bufStart) p.bufStart = "" - p.write(nn.Label) + p.write(nn.OpenHeredocTkn.Value) for _, part := range nn.Parts { switch part.(type) { @@ -710,7 +710,7 @@ func (p *Printer) printScalarHeredoc(n ast.Vertex) { } } - p.write([]byte(strings.Trim(string(nn.Label), "<\"'\n"))) + p.write([]byte(strings.Trim(string(nn.OpenHeredocTkn.Value), "<\"'\n"))) p.printFreeFloating(nn, token.End) }