diff --git a/internal/php5/parser_test.go b/internal/php5/parser_test.go index c875222..bff1735 100644 --- a/internal/php5/parser_test.go +++ b/internal/php5/parser_test.go @@ -3975,14 +3975,14 @@ func TestScalarEncapsed_StringVarCurveOpen(t *testing.T) { Value: []byte("$a"), }, }, - &ast.ParserBrackets{ + &ast.ScalarEncapsedStringBrackets{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 7, EndPos: 11, }, - OpenBracketTkn: &token.Token{ + OpenCurlyBracketTkn: &token.Token{ ID: token.T_CURLY_OPEN, Value: []byte("{"), Position: &position.Position{ @@ -3992,7 +3992,7 @@ func TestScalarEncapsed_StringVarCurveOpen(t *testing.T) { EndPos: 8, }, }, - Child: &ast.ExprVariable{ + Var: &ast.ExprVariable{ Position: &position.Position{ StartLine: 1, EndLine: 1, @@ -4019,7 +4019,7 @@ func TestScalarEncapsed_StringVarCurveOpen(t *testing.T) { Value: []byte("$b"), }, }, - CloseBracketTkn: &token.Token{ + CloseCurlyBracketTkn: &token.Token{ ID: token.ID(125), Value: []byte("}"), Position: &position.Position{ @@ -4690,14 +4690,14 @@ func TestScalarEncapsed_CurlyOpenMethodCall(t *testing.T) { }, Value: []byte("test "), }, - &ast.ParserBrackets{ + &ast.ScalarEncapsedStringBrackets{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 9, EndPos: 22, }, - OpenBracketTkn: &token.Token{ + OpenCurlyBracketTkn: &token.Token{ ID: token.T_CURLY_OPEN, Value: []byte("{"), Position: &position.Position{ @@ -4707,7 +4707,7 @@ func TestScalarEncapsed_CurlyOpenMethodCall(t *testing.T) { EndPos: 10, }, }, - Child: &ast.ExprMethodCall{ + Var: &ast.ExprMethodCall{ Position: &position.Position{ StartLine: 1, EndLine: 1, @@ -4791,7 +4791,7 @@ func TestScalarEncapsed_CurlyOpenMethodCall(t *testing.T) { }, }, }, - CloseBracketTkn: &token.Token{ + CloseCurlyBracketTkn: &token.Token{ ID: token.ID(125), Value: []byte("}"), Position: &position.Position{ diff --git a/internal/php5/php5.go b/internal/php5/php5.go index b1468ec..3c7d097 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 5c2a399..65e6ed1 100644 --- a/internal/php5/php5.y +++ b/internal/php5/php5.y @@ -5450,11 +5450,11 @@ encaps_var: } | T_CURLY_OPEN variable '}' { - $$ = &ast.ParserBrackets{ - Position: yylex.(*Parser).builder.NewTokensPosition($1, $3), - OpenBracketTkn: $1, - Child: $2, - CloseBracketTkn: $3, + $$ = &ast.ScalarEncapsedStringBrackets{ + Position: yylex.(*Parser).builder.NewTokensPosition($1, $3), + OpenCurlyBracketTkn: $1, + Var: $2, + CloseCurlyBracketTkn: $3, } } ; diff --git a/internal/php7/parser_test.go b/internal/php7/parser_test.go index ca22168..d6ddeac 100644 --- a/internal/php7/parser_test.go +++ b/internal/php7/parser_test.go @@ -4332,14 +4332,14 @@ func TestScalarEncapsed_StringVarCurveOpen(t *testing.T) { Value: []byte("$a"), }, }, - &ast.ParserBrackets{ + &ast.ScalarEncapsedStringBrackets{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 7, EndPos: 11, }, - OpenBracketTkn: &token.Token{ + OpenCurlyBracketTkn: &token.Token{ ID: token.T_CURLY_OPEN, Value: []byte("{"), Position: &position.Position{ @@ -4349,7 +4349,7 @@ func TestScalarEncapsed_StringVarCurveOpen(t *testing.T) { EndPos: 8, }, }, - Child: &ast.ExprVariable{ + Var: &ast.ExprVariable{ Position: &position.Position{ StartLine: 1, EndLine: 1, @@ -4376,7 +4376,7 @@ func TestScalarEncapsed_StringVarCurveOpen(t *testing.T) { Value: []byte("$b"), }, }, - CloseBracketTkn: &token.Token{ + CloseCurlyBracketTkn: &token.Token{ ID: token.ID(125), Value: []byte("}"), Position: &position.Position{ @@ -5047,14 +5047,14 @@ func TestScalarEncapsed_CurlyOpenMethodCall(t *testing.T) { }, Value: []byte("test "), }, - &ast.ParserBrackets{ + &ast.ScalarEncapsedStringBrackets{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 9, EndPos: 22, }, - OpenBracketTkn: &token.Token{ + OpenCurlyBracketTkn: &token.Token{ ID: token.T_CURLY_OPEN, Value: []byte("{"), Position: &position.Position{ @@ -5064,7 +5064,7 @@ func TestScalarEncapsed_CurlyOpenMethodCall(t *testing.T) { EndPos: 10, }, }, - Child: &ast.ExprMethodCall{ + Var: &ast.ExprMethodCall{ Position: &position.Position{ StartLine: 1, EndLine: 1, @@ -5148,7 +5148,7 @@ func TestScalarEncapsed_CurlyOpenMethodCall(t *testing.T) { }, }, }, - CloseBracketTkn: &token.Token{ + CloseCurlyBracketTkn: &token.Token{ ID: token.ID(125), Value: []byte("}"), Position: &position.Position{ diff --git a/internal/php7/php7.go b/internal/php7/php7.go index f4271ba..97c37c1 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 e695902..ec98771 100644 --- a/internal/php7/php7.y +++ b/internal/php7/php7.y @@ -4208,11 +4208,11 @@ encaps_var: } | T_CURLY_OPEN variable '}' { - $$ = &ast.ParserBrackets{ - Position: yylex.(*Parser).builder.NewTokensPosition($1, $3), - OpenBracketTkn: $1, - Child: $2, - CloseBracketTkn: $3, + $$ = &ast.ScalarEncapsedStringBrackets{ + Position: yylex.(*Parser).builder.NewTokensPosition($1, $3), + OpenCurlyBracketTkn: $1, + Var: $2, + CloseCurlyBracketTkn: $3, } } ; diff --git a/pkg/ast/ast.go b/pkg/ast/ast.go index 214c67d..508cca0 100644 --- a/pkg/ast/ast.go +++ b/pkg/ast/ast.go @@ -176,6 +176,7 @@ type NodeVisitor interface { ScalarEncapsed(n *ScalarEncapsed) ScalarEncapsedStringPart(n *ScalarEncapsedStringPart) ScalarEncapsedStringVar(n *ScalarEncapsedStringVar) + ScalarEncapsedStringBrackets(n *ScalarEncapsedStringBrackets) ScalarHeredoc(n *ScalarHeredoc) ScalarLnumber(n *ScalarLnumber) ScalarMagicConstant(n *ScalarMagicConstant) @@ -185,6 +186,4 @@ type NodeVisitor interface { NameFullyQualified(n *NameFullyQualified) NameRelative(n *NameRelative) NameNamePart(n *NameNamePart) - - ParserBrackets(n *ParserBrackets) } diff --git a/pkg/ast/node.go b/pkg/ast/node.go index edfa296..d523b27 100644 --- a/pkg/ast/node.go +++ b/pkg/ast/node.go @@ -150,6 +150,22 @@ func (n *ScalarEncapsedStringVar) GetPosition() *position.Position { return n.Position } +// ScalarEncapsedStringVar node +type ScalarEncapsedStringBrackets struct { + Position *position.Position + OpenCurlyBracketTkn *token.Token + Var Vertex + CloseCurlyBracketTkn *token.Token +} + +func (n *ScalarEncapsedStringBrackets) Accept(v NodeVisitor) { + v.ScalarEncapsedStringBrackets(n) +} + +func (n *ScalarEncapsedStringBrackets) GetPosition() *position.Position { + return n.Position +} + // ScalarHeredoc node type ScalarHeredoc struct { Position *position.Position @@ -2695,7 +2711,7 @@ type ParserBrackets struct { } func (n *ParserBrackets) Accept(v NodeVisitor) { - v.ParserBrackets(n) + // do nothing } func (n *ParserBrackets) GetPosition() *position.Position { diff --git a/pkg/ast/traverser/dfs.go b/pkg/ast/traverser/dfs.go index f5683de..93333c9 100644 --- a/pkg/ast/traverser/dfs.go +++ b/pkg/ast/traverser/dfs.go @@ -2472,6 +2472,18 @@ func (t *DFS) Traverse(n ast.Vertex) { t.Traverse(nn.Dim) t.visitor.Leave("Dim", true) } + case *ast.ScalarEncapsedStringBrackets: + if nn == nil { + return + } + if !t.visitor.EnterNode(nn) { + return + } + if nn.Var != nil { + t.visitor.Enter("Var", true) + t.Traverse(nn.Var) + t.visitor.Leave("Var", true) + } case *ast.ScalarHeredoc: if nn == nil { return @@ -2556,18 +2568,6 @@ func (t *DFS) Traverse(n ast.Vertex) { if !t.visitor.EnterNode(nn) { return } - case *ast.ParserBrackets: - if nn == nil { - return - } - if !t.visitor.EnterNode(nn) { - return - } - if nn.Child != nil { - t.visitor.Enter("Child", true) - t.Traverse(nn.Child) - t.visitor.Leave("Child", true) - } default: panic("unexpected type of node") } diff --git a/pkg/ast/visitor/dumper.go b/pkg/ast/visitor/dumper.go index 6b01b99..0e1bf41 100644 --- a/pkg/ast/visitor/dumper.go +++ b/pkg/ast/visitor/dumper.go @@ -2274,6 +2274,19 @@ func (v *Dumper) ScalarEncapsedStringVar(n *ast.ScalarEncapsedStringVar) { v.print(v.indent, "},\n") } +func (v *Dumper) ScalarEncapsedStringBrackets(n *ast.ScalarEncapsedStringBrackets) { + v.print(0, "&ast.ScalarEncapsedStringBrackets{\n") + v.indent++ + + v.dumpPosition(n.Position) + v.dumpToken("OpenCurlyBracketTkn", n.OpenCurlyBracketTkn) + v.dumpVertex("Var", n.Var) + v.dumpToken("CloseCurlyBracketTkn", n.CloseCurlyBracketTkn) + + v.indent-- + v.print(v.indent, "},\n") +} + func (v *Dumper) ScalarHeredoc(n *ast.ScalarHeredoc) { v.print(0, "&ast.ScalarHeredoc{\n") v.indent++ @@ -2374,16 +2387,3 @@ func (v *Dumper) NameNamePart(n *ast.NameNamePart) { v.indent-- v.print(v.indent, "},\n") } - -func (v *Dumper) ParserBrackets(n *ast.ParserBrackets) { - v.print(0, "&ast.ParserBrackets{\n") - v.indent++ - - v.dumpPosition(n.Position) - v.dumpToken("OpenBracketTkn", n.OpenBracketTkn) - v.dumpVertex("Child", n.Child) - v.dumpToken("CloseBracketTkn", n.CloseBracketTkn) - - v.indent-- - v.print(v.indent, "},\n") -} diff --git a/pkg/ast/visitor/formatter.go b/pkg/ast/visitor/formatter.go index 8c42228..b81a13c 100644 --- a/pkg/ast/visitor/formatter.go +++ b/pkg/ast/visitor/formatter.go @@ -1985,6 +1985,12 @@ func (f *formatter) ScalarEncapsedStringVar(n *ast.ScalarEncapsedStringVar) { n.CloseCurlyBracketTkn = f.newToken('}', []byte("}")) } +func (f *formatter) ScalarEncapsedStringBrackets(n *ast.ScalarEncapsedStringBrackets) { + n.OpenCurlyBracketTkn = f.newToken('{', []byte("{")) + n.Var.Accept(f) + n.CloseCurlyBracketTkn = f.newToken('}', []byte("}")) +} + func (f *formatter) ScalarHeredoc(n *ast.ScalarHeredoc) { n.OpenHeredocTkn = f.newToken(token.T_START_HEREDOC, []byte("<<