[refactoring] parameters: new node structure

This commit is contained in:
Vadym Slizov
2020-07-05 22:47:46 +03:00
parent b5e29fc9f5
commit ce18c23597
22 changed files with 10090 additions and 9935 deletions

View File

@@ -64,6 +64,10 @@ func (p *PrettyPrinter) printNode(n ast.Vertex) {
p.printNodeRoot(n)
case *ast.Identifier:
p.printNodeIdentifier(n)
case *ast.Reference:
p.printNodeReference(n)
case *ast.Variadic:
p.printNodeVariadic(n)
case *ast.Parameter:
p.printNodeParameter(n)
case *ast.Nullable:
@@ -434,6 +438,20 @@ func (p *PrettyPrinter) printNodeIdentifier(n ast.Vertex) {
io.WriteString(p.w, v)
}
func (p *PrettyPrinter) printNodeReference(n ast.Vertex) {
nn := n.(*ast.Reference)
io.WriteString(p.w, "&")
p.Print(nn.Var)
}
func (p *PrettyPrinter) printNodeVariadic(n ast.Vertex) {
nn := n.(*ast.Variadic)
io.WriteString(p.w, "...")
p.Print(nn.Var)
}
func (p *PrettyPrinter) printNodeParameter(n ast.Vertex) {
nn := n.(*ast.Parameter)
@@ -442,14 +460,6 @@ func (p *PrettyPrinter) printNodeParameter(n ast.Vertex) {
io.WriteString(p.w, " ")
}
if nn.ByRef {
io.WriteString(p.w, "&")
}
if nn.Variadic {
io.WriteString(p.w, "...")
}
p.Print(nn.Var)
if nn.DefaultValue != nil {

View File

@@ -119,10 +119,14 @@ func TestPrintParameter(t *testing.T) {
p := printer.NewPrettyPrinter(o, " ")
p.Print(&ast.Parameter{
ByRef: false,
Variadic: true,
Type: &ast.NameFullyQualified{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}},
Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}},
Type: &ast.NameFullyQualified{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}},
Var: &ast.Variadic{
Var: &ast.ExprVariable{
VarName: &ast.Identifier{
Value: []byte("var"),
},
},
},
DefaultValue: &ast.ScalarString{Value: []byte("'default'")},
})
@@ -140,10 +144,8 @@ func TestPrintNullable(t *testing.T) {
p := printer.NewPrettyPrinter(o, " ")
p.Print(&ast.Nullable{
Expr: &ast.Parameter{
ByRef: false,
Variadic: true,
Type: &ast.NameFullyQualified{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}},
Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}},
Var: &ast.Variadic{Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}},
DefaultValue: &ast.ScalarString{Value: []byte("'default'")},
},
})
@@ -1389,9 +1391,7 @@ func TestPrintExprClosure(t *testing.T) {
ReturnsRef: true,
Params: []ast.Vertex{
&ast.Parameter{
ByRef: true,
Variadic: false,
Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}},
Var: &ast.Reference{Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}},
},
},
ClosureUse: &ast.ExprClosureUse{
@@ -2446,14 +2446,12 @@ func TestPrintStmtClassMethod(t *testing.T) {
MethodName: &ast.Identifier{Value: []byte("foo")},
Params: []ast.Vertex{
&ast.Parameter{
ByRef: true,
Type: &ast.Nullable{Expr: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("int")}}}},
Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}},
Var: &ast.Reference{Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}},
DefaultValue: &ast.ExprConstFetch{Const: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("null")}}}},
},
&ast.Parameter{
Variadic: true,
Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}},
Var: &ast.Variadic{Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}},
},
},
ReturnType: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("void")}}},
@@ -2484,14 +2482,12 @@ func TestPrintStmtAbstractClassMethod(t *testing.T) {
MethodName: &ast.Identifier{Value: []byte("foo")},
Params: []ast.Vertex{
&ast.Parameter{
ByRef: true,
Type: &ast.Nullable{Expr: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("int")}}}},
Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}},
Var: &ast.Reference{Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}},
DefaultValue: &ast.ExprConstFetch{Const: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("null")}}}},
},
&ast.Parameter{
Variadic: true,
Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}},
Var: &ast.Variadic{Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}},
},
},
ReturnType: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("void")}}},
@@ -3197,9 +3193,7 @@ func TestPrintStmtFunction(t *testing.T) {
FunctionName: &ast.Identifier{Value: []byte("foo")},
Params: []ast.Vertex{
&ast.Parameter{
ByRef: true,
Variadic: false,
Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}},
Var: &ast.Reference{Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}},
},
},
ReturnType: &ast.NameFullyQualified{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}},

View File

@@ -79,6 +79,10 @@ func (p *Printer) printNode(n ast.Vertex) {
p.printNodeRoot(n)
case *ast.Identifier:
p.printNodeIdentifier(n)
case *ast.Reference:
p.printNodeReference(n)
case *ast.Variadic:
p.printNodeVariadic(n)
case *ast.Parameter:
p.printNodeParameter(n)
case *ast.Nullable:
@@ -444,6 +448,26 @@ func (p *Printer) printNodeIdentifier(n ast.Vertex) {
p.printFreeFloating(nn, token.End)
}
func (p *Printer) printNodeReference(n ast.Vertex) {
nn := n.(*ast.Reference)
p.printFreeFloating(nn, token.Start)
io.WriteString(p.w, "&")
p.Print(nn.Var)
p.printFreeFloating(nn, token.End)
}
func (p *Printer) printNodeVariadic(n ast.Vertex) {
nn := n.(*ast.Variadic)
p.printFreeFloating(nn, token.Start)
io.WriteString(p.w, "...")
p.Print(nn.Var)
p.printFreeFloating(nn, token.End)
}
func (p *Printer) printNodeParameter(n ast.Vertex) {
nn := n.(*ast.Parameter)
p.printFreeFloating(nn, token.Start)
@@ -451,22 +475,10 @@ func (p *Printer) printNodeParameter(n ast.Vertex) {
if nn.Type != nil {
p.Print(nn.Type)
}
p.printFreeFloating(nn, token.OptionalType)
if nn.ByRef {
io.WriteString(p.w, "&")
}
p.printFreeFloating(nn, token.Ampersand)
if nn.Variadic {
io.WriteString(p.w, "...")
}
p.printFreeFloating(nn, token.Variadic)
p.Print(nn.Var)
if nn.DefaultValue != nil {
p.printFreeFloating(nn, token.Var)
io.WriteString(p.w, "=")
p.Print(nn.DefaultValue)
}

View File

@@ -107,6 +107,18 @@ func TestParseAndPrintIdentifier(t *testing.T) {
}
}
func TestParseAndPrintParameterTMP(t *testing.T) {
src := `<?php
function foo ( foo & ... $foo = null ) {}`
actual := print(parse(src))
if src != actual {
t.Errorf("\nexpected: %s\ngot: %s\n", src, actual)
}
}
func TestParseAndPrintParameter(t *testing.T) {
src := `<?php

View File

@@ -141,8 +141,6 @@ func TestPrinterPrintParameter(t *testing.T) {
p := printer.NewPrinter(o)
p.Print(&ast.Parameter{
ByRef: false,
Variadic: true,
Type: &ast.NameFullyQualified{
Parts: []ast.Vertex{
&ast.NameNamePart{
@@ -150,8 +148,10 @@ func TestPrinterPrintParameter(t *testing.T) {
},
},
},
Var: &ast.ExprVariable{
VarName: &ast.Identifier{Value: []byte("$var")},
Var: &ast.Variadic{
Var: &ast.ExprVariable{
VarName: &ast.Identifier{Value: []byte("$var")},
},
},
DefaultValue: &ast.ScalarString{
Value: []byte("'default'"),
@@ -172,8 +172,6 @@ func TestPrinterPrintNullable(t *testing.T) {
p := printer.NewPrinter(o)
p.Print(&ast.Nullable{
Expr: &ast.Parameter{
ByRef: true,
Variadic: false,
Type: &ast.NameFullyQualified{
Parts: []ast.Vertex{
&ast.NameNamePart{
@@ -181,8 +179,10 @@ func TestPrinterPrintNullable(t *testing.T) {
},
},
},
Var: &ast.ExprVariable{
VarName: &ast.Identifier{Value: []byte("$var")},
Var: &ast.Reference{
Var: &ast.ExprVariable{
VarName: &ast.Identifier{Value: []byte("$var")},
},
},
DefaultValue: &ast.ScalarString{
Value: []byte("'default'"),
@@ -1703,10 +1703,10 @@ func TestPrinterPrintExprClosure(t *testing.T) {
ReturnsRef: true,
Params: []ast.Vertex{
&ast.Parameter{
ByRef: true,
Variadic: false,
Var: &ast.ExprVariable{
VarName: &ast.Identifier{Value: []byte("$var")},
Var: &ast.Reference{
Var: &ast.ExprVariable{
VarName: &ast.Identifier{Value: []byte("$var")},
},
},
},
},
@@ -1748,10 +1748,10 @@ func TestPrinterPrintExprArrowFunction(t *testing.T) {
ReturnsRef: true,
Params: []ast.Vertex{
&ast.Parameter{
ByRef: true,
Variadic: false,
Var: &ast.ExprVariable{
VarName: &ast.Identifier{Value: []byte("$var")},
Var: &ast.Reference{
Var: &ast.ExprVariable{
VarName: &ast.Identifier{Value: []byte("$var")},
},
},
},
},
@@ -2925,17 +2925,19 @@ func TestPrinterPrintStmtClassMethod(t *testing.T) {
MethodName: &ast.Identifier{Value: []byte("foo")},
Params: []ast.Vertex{
&ast.Parameter{
ByRef: true,
Type: &ast.Nullable{Expr: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("int")}}}},
Var: &ast.ExprVariable{
VarName: &ast.Identifier{Value: []byte("$a")},
Var: &ast.Reference{
Var: &ast.ExprVariable{
VarName: &ast.Identifier{Value: []byte("$a")},
},
},
DefaultValue: &ast.ExprConstFetch{Const: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("null")}}}},
},
&ast.Parameter{
Variadic: true,
Var: &ast.ExprVariable{
VarName: &ast.Identifier{Value: []byte("$b")},
Var: &ast.Variadic{
Var: &ast.ExprVariable{
VarName: &ast.Identifier{Value: []byte("$b")},
},
},
},
},
@@ -2972,17 +2974,19 @@ func TestPrinterPrintStmtAbstractClassMethod(t *testing.T) {
MethodName: &ast.Identifier{Value: []byte("foo")},
Params: []ast.Vertex{
&ast.Parameter{
ByRef: true,
Type: &ast.Nullable{Expr: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("int")}}}},
Var: &ast.ExprVariable{
VarName: &ast.Identifier{Value: []byte("$a")},
Var: &ast.Reference{
Var: &ast.ExprVariable{
VarName: &ast.Identifier{Value: []byte("$a")},
},
},
DefaultValue: &ast.ExprConstFetch{Const: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("null")}}}},
},
&ast.Parameter{
Variadic: true,
Var: &ast.ExprVariable{
VarName: &ast.Identifier{Value: []byte("$b")},
Var: &ast.Variadic{
Var: &ast.ExprVariable{
VarName: &ast.Identifier{Value: []byte("$b")},
},
},
},
},
@@ -3607,10 +3611,10 @@ func TestPrinterPrintStmtFunction(t *testing.T) {
FunctionName: &ast.Identifier{Value: []byte("foo")},
Params: []ast.Vertex{
&ast.Parameter{
ByRef: true,
Variadic: false,
Var: &ast.ExprVariable{
VarName: &ast.Identifier{Value: []byte("$var")},
Var: &ast.Reference{
Var: &ast.ExprVariable{
VarName: &ast.Identifier{Value: []byte("$var")},
},
},
},
},