refactoring: update ast structure of "MethodCall" and "PropertyFetch" nodes
This commit is contained in:
parent
2c09138600
commit
0f2341bfa9
BIN
internal/php5/php5.go
generated
BIN
internal/php5/php5.go
generated
Binary file not shown.
@ -4709,7 +4709,9 @@ variable:
|
|||||||
)
|
)
|
||||||
$3 = append($3, $4[1:len($4)]...)
|
$3 = append($3, $4[1:len($4)]...)
|
||||||
case *ast.ExprPropertyFetch:
|
case *ast.ExprPropertyFetch:
|
||||||
|
$4[0].(*ast.ExprMethodCall).OpenCurlyBracketTkn = l.OpenCurlyBracketTkn
|
||||||
$4[0].(*ast.ExprMethodCall).Method = l.Property
|
$4[0].(*ast.ExprMethodCall).Method = l.Property
|
||||||
|
$4[0].(*ast.ExprMethodCall).CloseCurlyBracketTkn = l.CloseCurlyBracketTkn
|
||||||
$4[0].(*ast.ExprMethodCall).ObjectOperatorTkn = l.ObjectOperatorTkn
|
$4[0].(*ast.ExprMethodCall).ObjectOperatorTkn = l.ObjectOperatorTkn
|
||||||
$3 = append($3[:len($3)-1], $4...)
|
$3 = append($3[:len($3)-1], $4...)
|
||||||
}
|
}
|
||||||
@ -4801,7 +4803,9 @@ variable_property:
|
|||||||
)
|
)
|
||||||
$2 = append($2, $3[1:len($3)]...)
|
$2 = append($2, $3[1:len($3)]...)
|
||||||
case *ast.ExprPropertyFetch:
|
case *ast.ExprPropertyFetch:
|
||||||
|
$3[0].(*ast.ExprMethodCall).OpenCurlyBracketTkn = l.OpenCurlyBracketTkn
|
||||||
$3[0].(*ast.ExprMethodCall).Method = l.Property
|
$3[0].(*ast.ExprMethodCall).Method = l.Property
|
||||||
|
$3[0].(*ast.ExprMethodCall).CloseCurlyBracketTkn = l.CloseCurlyBracketTkn
|
||||||
$3[0].(*ast.ExprMethodCall).ObjectOperatorTkn = l.ObjectOperatorTkn
|
$3[0].(*ast.ExprMethodCall).ObjectOperatorTkn = l.ObjectOperatorTkn
|
||||||
$2 = append($2[:len($2)-1], $3...)
|
$2 = append($2[:len($2)-1], $3...)
|
||||||
}
|
}
|
||||||
@ -5078,12 +5082,18 @@ object_dim_list:
|
|||||||
}
|
}
|
||||||
| variable_name
|
| variable_name
|
||||||
{
|
{
|
||||||
$$ = []ast.Vertex{
|
property := &ast.ExprPropertyFetch{
|
||||||
&ast.ExprPropertyFetch{
|
Position: yylex.(*Parser).builder.NewNodePosition($1),
|
||||||
Position: yylex.(*Parser).builder.NewNodePosition($1),
|
Property: $1,
|
||||||
Property: $1,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if brackets, ok := $1.(*ast.ParserBrackets); ok {
|
||||||
|
property.OpenCurlyBracketTkn = brackets.OpenBracketTkn
|
||||||
|
property.Property = brackets.Child
|
||||||
|
property.CloseCurlyBracketTkn = brackets.CloseBracketTkn
|
||||||
|
}
|
||||||
|
|
||||||
|
$$ = []ast.Vertex{ property }
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
BIN
internal/php7/php7.go
generated
BIN
internal/php7/php7.go
generated
Binary file not shown.
@ -3738,7 +3738,7 @@ callable_variable:
|
|||||||
}
|
}
|
||||||
| dereferencable T_OBJECT_OPERATOR property_name argument_list
|
| dereferencable T_OBJECT_OPERATOR property_name argument_list
|
||||||
{
|
{
|
||||||
$$ = &ast.ExprMethodCall{
|
methodCall := &ast.ExprMethodCall{
|
||||||
Position: yylex.(*Parser).builder.NewNodesPosition($1, $4),
|
Position: yylex.(*Parser).builder.NewNodesPosition($1, $4),
|
||||||
Var: $1,
|
Var: $1,
|
||||||
ObjectOperatorTkn: $2,
|
ObjectOperatorTkn: $2,
|
||||||
@ -3748,6 +3748,14 @@ callable_variable:
|
|||||||
SeparatorTkns: $4.(*ast.ArgumentList).SeparatorTkns,
|
SeparatorTkns: $4.(*ast.ArgumentList).SeparatorTkns,
|
||||||
CloseParenthesisTkn: $4.(*ast.ArgumentList).CloseParenthesisTkn,
|
CloseParenthesisTkn: $4.(*ast.ArgumentList).CloseParenthesisTkn,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if brackets, ok := $3.(*ast.ParserBrackets); ok {
|
||||||
|
methodCall.OpenCurlyBracketTkn = brackets.OpenBracketTkn
|
||||||
|
methodCall.Method = brackets.Child
|
||||||
|
methodCall.CloseCurlyBracketTkn = brackets.CloseBracketTkn
|
||||||
|
}
|
||||||
|
|
||||||
|
$$ = methodCall
|
||||||
}
|
}
|
||||||
| function_call
|
| function_call
|
||||||
{
|
{
|
||||||
@ -3766,12 +3774,20 @@ variable:
|
|||||||
}
|
}
|
||||||
| dereferencable T_OBJECT_OPERATOR property_name
|
| dereferencable T_OBJECT_OPERATOR property_name
|
||||||
{
|
{
|
||||||
$$ = &ast.ExprPropertyFetch{
|
propertyFetch := &ast.ExprPropertyFetch{
|
||||||
Position: yylex.(*Parser).builder.NewNodesPosition($1, $3),
|
Position: yylex.(*Parser).builder.NewNodesPosition($1, $3),
|
||||||
Var: $1,
|
Var: $1,
|
||||||
ObjectOperatorTkn: $2,
|
ObjectOperatorTkn: $2,
|
||||||
Property: $3,
|
Property: $3,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if brackets, ok := $3.(*ast.ParserBrackets); ok {
|
||||||
|
propertyFetch.OpenCurlyBracketTkn = brackets.OpenBracketTkn
|
||||||
|
propertyFetch.Property = brackets.Child
|
||||||
|
propertyFetch.CloseCurlyBracketTkn = brackets.CloseBracketTkn
|
||||||
|
}
|
||||||
|
|
||||||
|
$$ = propertyFetch
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -3855,12 +3871,20 @@ new_variable:
|
|||||||
}
|
}
|
||||||
| new_variable T_OBJECT_OPERATOR property_name
|
| new_variable T_OBJECT_OPERATOR property_name
|
||||||
{
|
{
|
||||||
$$ = &ast.ExprPropertyFetch{
|
propertyFetch := &ast.ExprPropertyFetch{
|
||||||
Position: yylex.(*Parser).builder.NewNodesPosition($1, $3),
|
Position: yylex.(*Parser).builder.NewNodesPosition($1, $3),
|
||||||
Var: $1,
|
Var: $1,
|
||||||
ObjectOperatorTkn: $2,
|
ObjectOperatorTkn: $2,
|
||||||
Property: $3,
|
Property: $3,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if brackets, ok := $3.(*ast.ParserBrackets); ok {
|
||||||
|
propertyFetch.OpenCurlyBracketTkn = brackets.OpenBracketTkn
|
||||||
|
propertyFetch.Property = brackets.Child
|
||||||
|
propertyFetch.CloseCurlyBracketTkn = brackets.CloseBracketTkn
|
||||||
|
}
|
||||||
|
|
||||||
|
$$ = propertyFetch
|
||||||
}
|
}
|
||||||
| class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable
|
| class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable
|
||||||
{
|
{
|
||||||
|
@ -1501,14 +1501,16 @@ func (n *ExprList) GetPosition() *position.Position {
|
|||||||
|
|
||||||
// ExprMethodCall node
|
// ExprMethodCall node
|
||||||
type ExprMethodCall struct {
|
type ExprMethodCall struct {
|
||||||
Position *position.Position
|
Position *position.Position
|
||||||
Var Vertex
|
Var Vertex
|
||||||
ObjectOperatorTkn *token.Token
|
ObjectOperatorTkn *token.Token
|
||||||
Method Vertex
|
OpenCurlyBracketTkn *token.Token
|
||||||
OpenParenthesisTkn *token.Token
|
Method Vertex
|
||||||
Arguments []Vertex
|
CloseCurlyBracketTkn *token.Token
|
||||||
SeparatorTkns []*token.Token
|
OpenParenthesisTkn *token.Token
|
||||||
CloseParenthesisTkn *token.Token
|
Arguments []Vertex
|
||||||
|
SeparatorTkns []*token.Token
|
||||||
|
CloseParenthesisTkn *token.Token
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *ExprMethodCall) Accept(v NodeVisitor) {
|
func (n *ExprMethodCall) Accept(v NodeVisitor) {
|
||||||
@ -1615,10 +1617,12 @@ func (n *ExprPrint) GetPosition() *position.Position {
|
|||||||
|
|
||||||
// ExprPropertyFetch node
|
// ExprPropertyFetch node
|
||||||
type ExprPropertyFetch struct {
|
type ExprPropertyFetch struct {
|
||||||
Position *position.Position
|
Position *position.Position
|
||||||
Var Vertex
|
Var Vertex
|
||||||
ObjectOperatorTkn *token.Token
|
ObjectOperatorTkn *token.Token
|
||||||
Property Vertex
|
OpenCurlyBracketTkn *token.Token
|
||||||
|
Property Vertex
|
||||||
|
CloseCurlyBracketTkn *token.Token
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *ExprPropertyFetch) Accept(v NodeVisitor) {
|
func (n *ExprPropertyFetch) Accept(v NodeVisitor) {
|
||||||
|
@ -1326,7 +1326,9 @@ func (v *Dumper) ExprMethodCall(n *ast.ExprMethodCall) {
|
|||||||
v.dumpPosition(n.Position)
|
v.dumpPosition(n.Position)
|
||||||
v.dumpVertex("Var", n.Var)
|
v.dumpVertex("Var", n.Var)
|
||||||
v.dumpToken("ObjectOperatorTkn", n.ObjectOperatorTkn)
|
v.dumpToken("ObjectOperatorTkn", n.ObjectOperatorTkn)
|
||||||
|
v.dumpToken("OpenCurlyBracketTkn", n.OpenCurlyBracketTkn)
|
||||||
v.dumpVertex("Method", n.Method)
|
v.dumpVertex("Method", n.Method)
|
||||||
|
v.dumpToken("CloseCurlyBracketTkn", n.CloseCurlyBracketTkn)
|
||||||
v.dumpToken("OpenParenthesisTkn", n.OpenParenthesisTkn)
|
v.dumpToken("OpenParenthesisTkn", n.OpenParenthesisTkn)
|
||||||
v.dumpVertexList("Arguments", n.Arguments)
|
v.dumpVertexList("Arguments", n.Arguments)
|
||||||
v.dumpTokenList("SeparatorTkns", n.SeparatorTkns)
|
v.dumpTokenList("SeparatorTkns", n.SeparatorTkns)
|
||||||
@ -1419,7 +1421,9 @@ func (v *Dumper) ExprPropertyFetch(n *ast.ExprPropertyFetch) {
|
|||||||
v.dumpPosition(n.Position)
|
v.dumpPosition(n.Position)
|
||||||
v.dumpVertex("Var", n.Var)
|
v.dumpVertex("Var", n.Var)
|
||||||
v.dumpToken("ObjectOperatorTkn", n.ObjectOperatorTkn)
|
v.dumpToken("ObjectOperatorTkn", n.ObjectOperatorTkn)
|
||||||
|
v.dumpToken("OpenCurlyBracketTkn", n.OpenCurlyBracketTkn)
|
||||||
v.dumpVertex("Property", n.Property)
|
v.dumpVertex("Property", n.Property)
|
||||||
|
v.dumpToken("CloseCurlyBracketTkn", n.CloseCurlyBracketTkn)
|
||||||
|
|
||||||
v.indent--
|
v.indent--
|
||||||
v.print(v.indent, "},\n")
|
v.print(v.indent, "},\n")
|
||||||
|
@ -1290,6 +1290,17 @@ func (f *formatter) ExprList(n *ast.ExprList) {
|
|||||||
func (f *formatter) ExprMethodCall(n *ast.ExprMethodCall) {
|
func (f *formatter) ExprMethodCall(n *ast.ExprMethodCall) {
|
||||||
n.Var.Accept(f)
|
n.Var.Accept(f)
|
||||||
n.ObjectOperatorTkn = f.newToken(token.T_OBJECT_OPERATOR, []byte("->"))
|
n.ObjectOperatorTkn = f.newToken(token.T_OBJECT_OPERATOR, []byte("->"))
|
||||||
|
|
||||||
|
n.OpenCurlyBracketTkn = nil
|
||||||
|
n.CloseCurlyBracketTkn = nil
|
||||||
|
switch n.Method.(type) {
|
||||||
|
case *ast.Identifier:
|
||||||
|
case *ast.ExprVariable:
|
||||||
|
default:
|
||||||
|
n.OpenCurlyBracketTkn = f.newToken('{', []byte("{"))
|
||||||
|
n.CloseCurlyBracketTkn = f.newToken('}', []byte("}"))
|
||||||
|
}
|
||||||
|
|
||||||
n.Method.Accept(f)
|
n.Method.Accept(f)
|
||||||
|
|
||||||
n.OpenParenthesisTkn = f.newToken('(', []byte("("))
|
n.OpenParenthesisTkn = f.newToken('(', []byte("("))
|
||||||
@ -1346,6 +1357,17 @@ func (f *formatter) ExprPrint(n *ast.ExprPrint) {
|
|||||||
func (f *formatter) ExprPropertyFetch(n *ast.ExprPropertyFetch) {
|
func (f *formatter) ExprPropertyFetch(n *ast.ExprPropertyFetch) {
|
||||||
n.Var.Accept(f)
|
n.Var.Accept(f)
|
||||||
n.ObjectOperatorTkn = f.newToken(token.T_OBJECT_OPERATOR, []byte("->"))
|
n.ObjectOperatorTkn = f.newToken(token.T_OBJECT_OPERATOR, []byte("->"))
|
||||||
|
|
||||||
|
n.OpenCurlyBracketTkn = nil
|
||||||
|
n.CloseCurlyBracketTkn = nil
|
||||||
|
switch n.Property.(type) {
|
||||||
|
case *ast.Identifier:
|
||||||
|
case *ast.ExprVariable:
|
||||||
|
default:
|
||||||
|
n.OpenCurlyBracketTkn = f.newToken('{', []byte("{"))
|
||||||
|
n.CloseCurlyBracketTkn = f.newToken('}', []byte("}"))
|
||||||
|
}
|
||||||
|
|
||||||
n.Property.Accept(f)
|
n.Property.Accept(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4216,6 +4216,34 @@ func TestFormatter_ExprMethodCall(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestFormatter_ExprMethodCall_Expr(t *testing.T) {
|
||||||
|
o := bytes.NewBufferString("")
|
||||||
|
|
||||||
|
n := &ast.ExprMethodCall{
|
||||||
|
Var: &ast.ExprVariable{
|
||||||
|
VarName: &ast.Identifier{
|
||||||
|
Value: []byte("$foo"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Method: &ast.ScalarString{
|
||||||
|
Value: []byte("'bar'"),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
f := visitor.NewFormatter().WithState(visitor.FormatterStatePHP).WithIndent(1)
|
||||||
|
n.Accept(f)
|
||||||
|
|
||||||
|
p := visitor.NewPrinter(o).WithState(visitor.PrinterStatePHP)
|
||||||
|
n.Accept(p)
|
||||||
|
|
||||||
|
expected := `$foo->{'bar'}()`
|
||||||
|
actual := o.String()
|
||||||
|
|
||||||
|
if expected != actual {
|
||||||
|
t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestFormatter_ExprMethodCall_Arguments(t *testing.T) {
|
func TestFormatter_ExprMethodCall_Arguments(t *testing.T) {
|
||||||
o := bytes.NewBufferString("")
|
o := bytes.NewBufferString("")
|
||||||
|
|
||||||
@ -4483,6 +4511,34 @@ func TestFormatter_ExprPropertyFetch(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestFormatter_ExprPropertyFetch_Expr(t *testing.T) {
|
||||||
|
o := bytes.NewBufferString("")
|
||||||
|
|
||||||
|
n := &ast.ExprPropertyFetch{
|
||||||
|
Var: &ast.ExprVariable{
|
||||||
|
VarName: &ast.Identifier{
|
||||||
|
Value: []byte("$foo"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Property: &ast.ScalarString{
|
||||||
|
Value: []byte("'bar'"),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
f := visitor.NewFormatter().WithState(visitor.FormatterStatePHP).WithIndent(1)
|
||||||
|
n.Accept(f)
|
||||||
|
|
||||||
|
p := visitor.NewPrinter(o).WithState(visitor.PrinterStatePHP)
|
||||||
|
n.Accept(p)
|
||||||
|
|
||||||
|
expected := `$foo->{'bar'}`
|
||||||
|
actual := o.String()
|
||||||
|
|
||||||
|
if expected != actual {
|
||||||
|
t.Errorf("\nexpected: %s\ngot: %s\n", expected, actual)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestFormatter_ExprRequire(t *testing.T) {
|
func TestFormatter_ExprRequire(t *testing.T) {
|
||||||
o := bytes.NewBufferString("")
|
o := bytes.NewBufferString("")
|
||||||
|
|
||||||
|
@ -772,7 +772,9 @@ func (p *printer) ExprList(n *ast.ExprList) {
|
|||||||
func (p *printer) ExprMethodCall(n *ast.ExprMethodCall) {
|
func (p *printer) ExprMethodCall(n *ast.ExprMethodCall) {
|
||||||
p.printNode(n.Var)
|
p.printNode(n.Var)
|
||||||
p.printToken(n.ObjectOperatorTkn, []byte("->"))
|
p.printToken(n.ObjectOperatorTkn, []byte("->"))
|
||||||
|
p.printToken(n.OpenCurlyBracketTkn, nil)
|
||||||
p.printNode(n.Method)
|
p.printNode(n.Method)
|
||||||
|
p.printToken(n.CloseCurlyBracketTkn, nil)
|
||||||
p.printToken(n.OpenParenthesisTkn, []byte("("))
|
p.printToken(n.OpenParenthesisTkn, []byte("("))
|
||||||
p.printSeparatedList(n.Arguments, n.SeparatorTkns, []byte(","))
|
p.printSeparatedList(n.Arguments, n.SeparatorTkns, []byte(","))
|
||||||
p.printToken(n.CloseParenthesisTkn, []byte(")"))
|
p.printToken(n.CloseParenthesisTkn, []byte(")"))
|
||||||
@ -814,7 +816,9 @@ func (p *printer) ExprPrint(n *ast.ExprPrint) {
|
|||||||
func (p *printer) ExprPropertyFetch(n *ast.ExprPropertyFetch) {
|
func (p *printer) ExprPropertyFetch(n *ast.ExprPropertyFetch) {
|
||||||
p.printNode(n.Var)
|
p.printNode(n.Var)
|
||||||
p.printToken(n.ObjectOperatorTkn, []byte("->"))
|
p.printToken(n.ObjectOperatorTkn, []byte("->"))
|
||||||
|
p.printToken(n.OpenCurlyBracketTkn, nil)
|
||||||
p.printNode(n.Property)
|
p.printNode(n.Property)
|
||||||
|
p.printToken(n.CloseCurlyBracketTkn, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *printer) ExprRequire(n *ast.ExprRequire) {
|
func (p *printer) ExprRequire(n *ast.ExprRequire) {
|
||||||
|
Loading…
Reference in New Issue
Block a user