diff --git a/cmd/php-parser/main.go b/cmd/php-parser/main.go index 569dd30..33d03e0 100644 --- a/cmd/php-parser/main.go +++ b/cmd/php-parser/main.go @@ -13,8 +13,8 @@ import ( "github.com/pkg/profile" "github.com/yookoala/realpath" - "github.com/z7zmey/php-parser/pkg/parser" "github.com/z7zmey/php-parser/pkg/ast/visitor" + "github.com/z7zmey/php-parser/pkg/parser" ) var wg sync.WaitGroup diff --git a/internal/php5/parser.go b/internal/php5/parser.go index 060be97..d4ec16d 100644 --- a/internal/php5/parser.go +++ b/internal/php5/parser.go @@ -2,6 +2,7 @@ package php5 import ( "bytes" + "fmt" "github.com/z7zmey/php-parser/internal/positionbuilder" "github.com/z7zmey/php-parser/internal/scanner" @@ -132,10 +133,25 @@ func (l *Parser) GetFreeFloatingToken(t *scanner.Token) []token.Token { return []token.Token{} } - tokens := make([]token.Token, len(t.Tokens)) - copy(tokens, t.Tokens) + return []token.Token{ + { + ID: token.ID(t.ID), + Value: t.Value, + }, + } +} - return tokens +func (l *Parser) addDollarToken(v ast.Vertex) { + if l.Lexer.GetWithFreeFloating() == false { + return + } + + l.setFreeFloating(v, token.Dollar, []token.Token{ + { + ID: token.ID('$'), + Value: []byte("$"), + }, + }) } func (l *Parser) splitSemiColonAndPhpCloseTag(htmlNode ast.Vertex, prevNode ast.Vertex) { @@ -159,6 +175,8 @@ func (l *Parser) splitSemiColonAndPhpCloseTag(htmlNode ast.Vertex, prevNode ast. } vlen := len(semiColon[0].Value) + fmt.Printf("vlen: %q\n", string(semiColon[0].Value)) + tlen := 2 if bytes.HasSuffix(semiColon[0].Value, []byte("?>\n")) { tlen = 3 diff --git a/internal/php5/php5.go b/internal/php5/php5.go index 0b7071c..b63ef14 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 fc42063..082430d 100644 --- a/internal/php5/php5.y +++ b/internal/php5/php5.y @@ -1431,6 +1431,7 @@ catch_statement: yylex.(*Parser).setFreeFloating(catchNode, token.Start, $1.Tokens) yylex.(*Parser).setFreeFloating(catchNode, token.Catch, $2.Tokens) yylex.(*Parser).setFreeFloating(variable, token.Start, $4.Tokens) + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).setFreeFloating(catchNode, token.Var, $5.Tokens) yylex.(*Parser).setFreeFloating(catchNode, token.Cond, $6.Tokens) yylex.(*Parser).setFreeFloating(catchNode, token.Stmts, $8.Tokens) @@ -1508,6 +1509,7 @@ additional_catch: yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) yylex.(*Parser).setFreeFloating($$, token.Catch, $2.Tokens) yylex.(*Parser).setFreeFloating(variable, token.Start, $4.Tokens) + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).setFreeFloating($$, token.Var, $5.Tokens) yylex.(*Parser).setFreeFloating($$, token.Cond, $6.Tokens) yylex.(*Parser).setFreeFloating($$, token.Stmts, $8.Tokens) @@ -2309,6 +2311,7 @@ parameter: yylex.(*Parser).setFreeFloating($$, token.Ampersand, $3.Tokens) } yylex.(*Parser).setFreeFloating($$, token.Variadic, $4.Tokens) + yylex.(*Parser).addDollarToken(variable) // normalize if $3 == nil { @@ -2354,6 +2357,7 @@ parameter: } yylex.(*Parser).setFreeFloating($$, token.Variadic, $4.Tokens) yylex.(*Parser).setFreeFloating($$, token.Var, $5.Tokens) + yylex.(*Parser).addDollarToken(variable) // normalize if $3 == nil { @@ -2556,6 +2560,7 @@ global_var: // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) + yylex.(*Parser).addDollarToken($$) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -2605,6 +2610,7 @@ static_var_list: // save comments yylex.(*Parser).setFreeFloating(lastNode($1), token.End, $2.Tokens) + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).setFreeFloating(staticVar, token.Start, $3.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) @@ -2623,6 +2629,7 @@ static_var_list: // save comments yylex.(*Parser).setFreeFloating(lastNode($1), token.End, $2.Tokens) + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).setFreeFloating(staticVar, token.Start, $3.Tokens) yylex.(*Parser).setFreeFloating(staticVar, token.Var, $4.Tokens) @@ -2641,6 +2648,7 @@ static_var_list: staticVar.GetNode().Position = yylex.(*Parser).positionBuilder.NewTokenPosition($1) // save comments + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).setFreeFloating(staticVar, token.Start, $1.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) @@ -2658,6 +2666,7 @@ static_var_list: staticVar.GetNode().Position = yylex.(*Parser).positionBuilder.NewTokenNodePosition($1, $3) // save comments + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).setFreeFloating(staticVar, token.Start, $1.Tokens) yylex.(*Parser).setFreeFloating(staticVar, token.Var, $2.Tokens) @@ -3155,6 +3164,7 @@ class_variable_declaration: property.GetNode().Position = yylex.(*Parser).positionBuilder.NewTokenPosition($3) // save comments + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).setFreeFloating(lastNode($1), token.End, $2.Tokens) yylex.(*Parser).setFreeFloating(property, token.Start, $3.Tokens) @@ -3174,6 +3184,7 @@ class_variable_declaration: // save comments yylex.(*Parser).setFreeFloating(lastNode($1), token.End, $2.Tokens) + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).setFreeFloating(property, token.Start, $3.Tokens) yylex.(*Parser).setFreeFloating(property, token.Var, $4.Tokens) @@ -3192,6 +3203,7 @@ class_variable_declaration: property.GetNode().Position = yylex.(*Parser).positionBuilder.NewTokenPosition($1) // save comments + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).setFreeFloating(property, token.Start, $1.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) @@ -3209,6 +3221,7 @@ class_variable_declaration: property.GetNode().Position = yylex.(*Parser).positionBuilder.NewTokenNodePosition($1, $3) // save comments + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).setFreeFloating(property, token.Start, $2.Tokens) yylex.(*Parser).setFreeFloating(property, token.Var, $2.Tokens) @@ -4589,6 +4602,7 @@ lexical_var_list: // save comments yylex.(*Parser).setFreeFloating(lastNode($1), token.End, $2.Tokens) yylex.(*Parser).setFreeFloating(variable, token.Start, $3.Tokens) + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -4608,6 +4622,7 @@ lexical_var_list: yylex.(*Parser).setFreeFloating(lastNode($1), token.End, $2.Tokens) yylex.(*Parser).setFreeFloating(reference, token.Start, $3.Tokens) yylex.(*Parser).setFreeFloating(variable, token.Start, $4.Tokens) + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -4623,6 +4638,7 @@ lexical_var_list: // save comments yylex.(*Parser).setFreeFloating(variable, token.Start, $1.Tokens) + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -4641,6 +4657,7 @@ lexical_var_list: // save comments yylex.(*Parser).setFreeFloating(reference, token.Start, $1.Tokens) yylex.(*Parser).setFreeFloating(variable, token.Start, $2.Tokens) + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -6381,6 +6398,7 @@ compound_variable: // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) + yylex.(*Parser).addDollarToken($$) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -6807,6 +6825,7 @@ encaps_var: // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) + yylex.(*Parser).addDollarToken($$) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -6822,6 +6841,7 @@ encaps_var: $$.GetNode().Position = yylex.(*Parser).positionBuilder.NewTokensPosition($1, $4) // save comments + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).setFreeFloating($$, token.Var, append($2.Tokens, yylex.(*Parser).GetFreeFloatingToken($2)...)) yylex.(*Parser).setFreeFloating($$, token.Expr, append($4.Tokens, yylex.(*Parser).GetFreeFloatingToken($4)...)) @@ -6841,6 +6861,7 @@ encaps_var: $$.GetNode().Position = yylex.(*Parser).positionBuilder.NewTokensPosition($1, $3) // save comments + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).setFreeFloating($$, token.Var, $2.Tokens) yylex.(*Parser).setFreeFloating(fetch, token.Start, $3.Tokens) @@ -6950,6 +6971,7 @@ encaps_var_offset: // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) + yylex.(*Parser).addDollarToken($$) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } diff --git a/internal/php7/parser.go b/internal/php7/parser.go index cb42f54..a960984 100644 --- a/internal/php7/parser.go +++ b/internal/php7/parser.go @@ -131,10 +131,25 @@ func (l *Parser) GetFreeFloatingToken(t *scanner.Token) []token.Token { return []token.Token{} } - tokens := make([]token.Token, len(t.Tokens)) - copy(tokens, t.Tokens) + return []token.Token{ + { + ID: token.ID(t.ID), + Value: t.Value, + }, + } +} - return tokens +func (l *Parser) addDollarToken(v ast.Vertex) { + if l.Lexer.GetWithFreeFloating() == false { + return + } + + l.setFreeFloating(v, token.Dollar, []token.Token{ + { + ID: token.ID('$'), + Value: []byte("$"), + }, + }) } func (l *Parser) splitSemiColonAndPhpCloseTag(htmlNode ast.Vertex, prevNode ast.Vertex) { diff --git a/internal/php7/parser_test.go b/internal/php7/parser_test.go index 25490fc..bceae9c 100644 --- a/internal/php7/parser_test.go +++ b/internal/php7/parser_test.go @@ -982,7 +982,7 @@ func TestPhp7ParameterNode(t *testing.T) { EndPos: 51, }, }, - ReturnsRef: false, + ReturnsRef: false, FunctionName: &ast.Identifier{ Node: ast.Node{ Position: &position.Position{ @@ -1183,7 +1183,7 @@ func TestPhp7ParameterNode(t *testing.T) { EndPos: 117, }, }, - ReturnsRef: false, + ReturnsRef: false, MethodName: &ast.Identifier{ Node: ast.Node{ Position: &position.Position{ @@ -1397,8 +1397,8 @@ func TestPhp7ParameterNode(t *testing.T) { EndPos: 162, }, }, - ReturnsRef: false, - Static: false, + ReturnsRef: false, + Static: false, Params: []ast.Vertex{ &ast.Parameter{ Node: ast.Node{ @@ -1577,8 +1577,8 @@ func TestPhp7ParameterNode(t *testing.T) { EndPos: 214, }, }, - Static: true, - ReturnsRef: false, + Static: true, + ReturnsRef: false, Params: []ast.Vertex{ &ast.Parameter{ Node: ast.Node{ @@ -4376,7 +4376,7 @@ func TestStmtClassMethod_SimpleClassMethod(t *testing.T) { EndPos: 31, }, }, - ReturnsRef: false, + ReturnsRef: false, MethodName: &ast.Identifier{ Node: ast.Node{ Position: &position.Position{ @@ -4454,7 +4454,7 @@ func TestStmtClassMethod_PrivateProtectedClassMethod(t *testing.T) { EndPos: 45, }, }, - ReturnsRef: false, + ReturnsRef: false, MethodName: &ast.Identifier{ Node: ast.Node{ Position: &position.Position{ @@ -4511,7 +4511,7 @@ func TestStmtClassMethod_PrivateProtectedClassMethod(t *testing.T) { EndPos: 73, }, }, - ReturnsRef: false, + ReturnsRef: false, MethodName: &ast.Identifier{ Node: ast.Node{ Position: &position.Position{ @@ -4602,7 +4602,7 @@ func TestStmtClassMethod_Php7ClassMethod(t *testing.T) { EndPos: 52, }, }, - ReturnsRef: true, + ReturnsRef: true, MethodName: &ast.Identifier{ Node: ast.Node{ Position: &position.Position{ @@ -4740,7 +4740,7 @@ func TestStmtClassMethod_AbstractClassMethod(t *testing.T) { EndPos: 54, }, }, - ReturnsRef: false, + ReturnsRef: false, MethodName: &ast.Identifier{ Node: ast.Node{ Position: &position.Position{ @@ -4854,7 +4854,7 @@ func TestStmtClassMethod_Php7AbstractClassMethod(t *testing.T) { EndPos: 51, }, }, - ReturnsRef: false, + ReturnsRef: false, MethodName: &ast.Identifier{ Node: ast.Node{ Position: &position.Position{ @@ -7300,7 +7300,7 @@ func TestStmtFunction(t *testing.T) { EndPos: 20, }, }, - ReturnsRef: false, + ReturnsRef: false, FunctionName: &ast.Identifier{ Node: ast.Node{ Position: &position.Position{ @@ -7345,7 +7345,7 @@ func TestStmtFunction_Return(t *testing.T) { EndPos: 27, }, }, - ReturnsRef: false, + ReturnsRef: false, FunctionName: &ast.Identifier{ Node: ast.Node{ Position: &position.Position{ @@ -7401,7 +7401,7 @@ func TestStmtFunction_ReturnVar(t *testing.T) { EndPos: 51, }, }, - ReturnsRef: false, + ReturnsRef: false, FunctionName: &ast.Identifier{ Node: ast.Node{ Position: &position.Position{ @@ -7568,7 +7568,7 @@ func TestStmtFunction_Ref(t *testing.T) { EndPos: 30, }, }, - ReturnsRef: true, + ReturnsRef: true, FunctionName: &ast.Identifier{ Node: ast.Node{ Position: &position.Position{ @@ -7635,7 +7635,7 @@ func TestStmtFunction_ReturnType(t *testing.T) { EndPos: 27, }, }, - ReturnsRef: true, + ReturnsRef: true, FunctionName: &ast.Identifier{ Node: ast.Node{ Position: &position.Position{ @@ -14535,8 +14535,8 @@ func TestExprArrowFunction(t *testing.T) { EndPos: 13, }, }, - ReturnsRef: false, - Static: false, + ReturnsRef: false, + Static: false, Expr: &ast.ExprVariable{ Node: ast.Node{ Position: &position.Position{ @@ -14600,8 +14600,8 @@ func TestExprArrowFunction_ReturnType(t *testing.T) { EndPos: 22, }, }, - Static: false, - ReturnsRef: true, + Static: false, + ReturnsRef: true, ReturnType: &ast.NameName{ Node: ast.Node{ Position: &position.Position{ @@ -15080,9 +15080,9 @@ func TestExprClosure(t *testing.T) { EndPos: 15, }, }, - ReturnsRef: false, - Static: false, - Stmts: []ast.Vertex{}, + ReturnsRef: false, + Static: false, + Stmts: []ast.Vertex{}, }, }, }, @@ -15125,8 +15125,8 @@ func TestExprClosure_Use(t *testing.T) { EndPos: 36, }, }, - ReturnsRef: false, - Static: false, + ReturnsRef: false, + Static: false, Params: []ast.Vertex{ &ast.Parameter{ Node: ast.Node{ @@ -15302,8 +15302,8 @@ func TestExprClosure_Use2(t *testing.T) { EndPos: 36, }, }, - ReturnsRef: false, - Static: false, + ReturnsRef: false, + Static: false, Params: []ast.Vertex{ &ast.Parameter{ Node: ast.Node{ @@ -15479,8 +15479,8 @@ func TestExprClosure_ReturnType(t *testing.T) { EndPos: 22, }, }, - ReturnsRef: false, - Static: false, + ReturnsRef: false, + Static: false, ReturnType: &ast.NameName{ Node: ast.Node{ Position: &position.Position{ diff --git a/internal/php7/php7.go b/internal/php7/php7.go index 9a3f30a..0900ad3 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 9f08fa4..cd147ff 100644 --- a/internal/php7/php7.y +++ b/internal/php7/php7.y @@ -1368,6 +1368,7 @@ catch_list: yylex.(*Parser).setFreeFloating(catch, token.Start, $2.Tokens) yylex.(*Parser).setFreeFloating(catch, token.Catch, $3.Tokens) yylex.(*Parser).setFreeFloating(variable, token.Start, $5.Tokens) + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).setFreeFloating(catch, token.Var, $6.Tokens) yylex.(*Parser).setFreeFloating(catch, token.Cond, $7.Tokens) yylex.(*Parser).setFreeFloating(catch, token.Stmts, $9.Tokens) @@ -2172,6 +2173,8 @@ parameter: } yylex.(*Parser).setFreeFloating($$, token.Variadic, $4.Tokens) + yylex.(*Parser).addDollarToken(variable) + // normalize if $3 == nil { yylex.(*Parser).setFreeFloating($$, token.Ampersand, $$.GetNode().Tokens[token.Variadic]); delete($$.GetNode().Tokens, token.Variadic) @@ -2217,6 +2220,8 @@ parameter: yylex.(*Parser).setFreeFloating($$, token.Variadic, $4.Tokens) yylex.(*Parser).setFreeFloating($$, token.Var, $5.Tokens) + yylex.(*Parser).addDollarToken(variable) + // normalize if $3 == nil { yylex.(*Parser).setFreeFloating($$, token.Ampersand, $$.GetNode().Tokens[token.Variadic]); delete($$.GetNode().Tokens, token.Variadic) @@ -2456,6 +2461,7 @@ static_var: // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -2472,6 +2478,7 @@ static_var: // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).setFreeFloating($$, token.Var, $2.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) @@ -2981,6 +2988,7 @@ property: // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -2997,6 +3005,7 @@ property: // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).setFreeFloating($$, token.Var, $2.Tokens) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) @@ -4297,6 +4306,7 @@ lexical_var: // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) + yylex.(*Parser).addDollarToken($$) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -4314,6 +4324,7 @@ lexical_var: // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) yylex.(*Parser).setFreeFloating(variable, token.Start, $2.Tokens) + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -4943,6 +4954,7 @@ simple_variable: // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) + yylex.(*Parser).addDollarToken($$) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -5352,6 +5364,7 @@ encaps_var: // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) + yylex.(*Parser).addDollarToken($$) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } @@ -5367,6 +5380,7 @@ encaps_var: $$.GetNode().Position = yylex.(*Parser).positionBuilder.NewTokensPosition($1, $4) // save comments + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).setFreeFloating($$, token.Var, append($2.Tokens, yylex.(*Parser).GetFreeFloatingToken($2)...)) yylex.(*Parser).setFreeFloating($$, token.Expr, append($4.Tokens, yylex.(*Parser).GetFreeFloatingToken($4)...)) @@ -5386,6 +5400,7 @@ encaps_var: $$.GetNode().Position = yylex.(*Parser).positionBuilder.NewTokensPosition($1, $3) // save comments + yylex.(*Parser).addDollarToken(variable) yylex.(*Parser).setFreeFloating($$, token.Var, $2.Tokens) yylex.(*Parser).setFreeFloating(fetch, token.Start, $3.Tokens) @@ -5521,6 +5536,7 @@ encaps_var_offset: // save comments yylex.(*Parser).setFreeFloating($$, token.Start, $1.Tokens) + yylex.(*Parser).addDollarToken($$) yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL) } diff --git a/internal/scanner/scanner.go b/internal/scanner/scanner.go index 3764cec..0d411e1 100644 Binary files a/internal/scanner/scanner.go and b/internal/scanner/scanner.go differ diff --git a/internal/scanner/scanner.rl b/internal/scanner/scanner.rl index 5eec481..d9195f2 100644 --- a/internal/scanner/scanner.rl +++ b/internal/scanner/scanner.rl @@ -510,6 +510,7 @@ func (lex *Lexer) Lex(lval Lval) int { token.Tokens = lex.Tokens token.Value = lex.data[lex.ts:lex.te] + token.ID = tok lval.Token(token) diff --git a/internal/scanner/token.go b/internal/scanner/token.go index d45a12e..7c07126 100644 --- a/internal/scanner/token.go +++ b/internal/scanner/token.go @@ -6,6 +6,7 @@ import ( // Token value returned by lexer type Token struct { + ID TokenID Value []byte Tokens []token.Token StartLine int diff --git a/pkg/ast/visitor/namespace_resolver.go b/pkg/ast/visitor/namespace_resolver.go index f79378c..3029c5c 100644 --- a/pkg/ast/visitor/namespace_resolver.go +++ b/pkg/ast/visitor/namespace_resolver.go @@ -27,7 +27,7 @@ func NewNamespaceResolver() *NamespaceResolver { func (nsr *NamespaceResolver) EnterNode(n ast.Vertex) bool { n.Accept(nsr) - + if !nsr.goDeep { nsr.goDeep = true return false @@ -54,7 +54,7 @@ func (nsr *NamespaceResolver) StmtUseList(n *ast.StmtUseList) { for _, nn := range n.Uses { nsr.AddAlias(useType, nn, nil) } - + nsr.goDeep = false } diff --git a/pkg/ast/visitor/namespace_resolver_test.go b/pkg/ast/visitor/namespace_resolver_test.go index 61ed537..607aa9e 100644 --- a/pkg/ast/visitor/namespace_resolver_test.go +++ b/pkg/ast/visitor/namespace_resolver_test.go @@ -194,8 +194,8 @@ func TestResolveInstanceCatch(t *testing.T) { nameBC, nameF, }, - Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("foo")}}, - Stmts: []ast.Vertex{}, + Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("foo")}}, + Stmts: []ast.Vertex{}, }, }, }, @@ -407,7 +407,7 @@ func TestResolveClassName(t *testing.T) { nameBC := &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("B")}, &ast.NameNamePart{Value: []byte("C")}}} class := &ast.StmtClass{ - ClassName: &ast.Identifier{Value: []byte("A")}, + ClassName: &ast.Identifier{Value: []byte("A")}, Extends: &ast.StmtClassExtends{ ClassName: nameAB, }, @@ -472,8 +472,8 @@ func TestResolveInterfaceName(t *testing.T) { func TestResolveTraitName(t *testing.T) { traitNode := &ast.StmtTrait{ - TraitName: &ast.Identifier{Value: []byte("A")}, - Stmts: []ast.Vertex{}, + TraitName: &ast.Identifier{Value: []byte("A")}, + Stmts: []ast.Vertex{}, } stxTree := &ast.StmtStmtList{ @@ -498,14 +498,14 @@ func TestResolveFunctionName(t *testing.T) { nameBC := &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("B")}, &ast.NameNamePart{Value: []byte("C")}}} functionNode := &ast.StmtFunction{ - ReturnsRef: false, - FunctionName: &ast.Identifier{Value: []byte("A")}, + ReturnsRef: false, + FunctionName: &ast.Identifier{Value: []byte("A")}, Params: []ast.Vertex{ &ast.Parameter{ - ByRef: false, - Variadic: false, - Type: nameAB, - Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("foo")}}, + ByRef: false, + Variadic: false, + Type: nameAB, + Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("foo")}}, }, }, ReturnType: &ast.Nullable{Expr: nameBC}, @@ -536,14 +536,14 @@ func TestResolveMethodName(t *testing.T) { nameBC := &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("B")}, &ast.NameNamePart{Value: []byte("C")}}} methodNode := &ast.StmtClassMethod{ - ReturnsRef: false, - MethodName: &ast.Identifier{Value: []byte("A")}, + ReturnsRef: false, + MethodName: &ast.Identifier{Value: []byte("A")}, Params: []ast.Vertex{ &ast.Parameter{ - ByRef: false, - Variadic: false, - Type: nameAB, - Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("foo")}}, + ByRef: false, + Variadic: false, + Type: nameAB, + Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("foo")}}, }, }, ReturnType: &ast.Nullable{Expr: nameBC}, @@ -569,14 +569,14 @@ func TestResolveClosureName(t *testing.T) { nameBC := &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("B")}, &ast.NameNamePart{Value: []byte("C")}}} closureNode := &ast.ExprClosure{ - ReturnsRef: false, - Static: false, + ReturnsRef: false, + Static: false, Params: []ast.Vertex{ &ast.Parameter{ - ByRef: false, - Variadic: false, - Type: nameAB, - Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("foo")}}, + ByRef: false, + Variadic: false, + Type: nameAB, + Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("foo")}}, }, }, ClosureUse: nil, @@ -600,12 +600,12 @@ func TestResolveConstantsName(t *testing.T) { nameAB := &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("A")}, &ast.NameNamePart{Value: []byte("B")}}} constantB := &ast.StmtConstant{ - ConstantName: &ast.Identifier{Value: []byte("B")}, - Expr: &ast.ScalarLnumber{Value: []byte("1")}, + ConstantName: &ast.Identifier{Value: []byte("B")}, + Expr: &ast.ScalarLnumber{Value: []byte("1")}, } constantC := &ast.StmtConstant{ - ConstantName: &ast.Identifier{Value: []byte("C")}, - Expr: &ast.ScalarLnumber{Value: []byte("1")}, + ConstantName: &ast.Identifier{Value: []byte("C")}, + Expr: &ast.ScalarLnumber{Value: []byte("1")}, } stxTree := &ast.StmtStmtList{ @@ -644,12 +644,12 @@ func TestResolveNamespaces(t *testing.T) { relativeNameCE := &ast.NameRelative{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("C")}, &ast.NameNamePart{Value: []byte("E")}}} constantB := &ast.StmtConstant{ - ConstantName: &ast.Identifier{Value: []byte("B")}, - Expr: &ast.ScalarLnumber{Value: []byte("1")}, + ConstantName: &ast.Identifier{Value: []byte("B")}, + Expr: &ast.ScalarLnumber{Value: []byte("1")}, } constantC := &ast.StmtConstant{ - ConstantName: &ast.Identifier{Value: []byte("C")}, - Expr: &ast.ScalarLnumber{Value: []byte("1")}, + ConstantName: &ast.Identifier{Value: []byte("C")}, + Expr: &ast.ScalarLnumber{Value: []byte("1")}, } stxTree := &ast.StmtStmtList{ diff --git a/printer/pretty_printer.go b/pkg/printer/pretty_printer.go similarity index 54% rename from printer/pretty_printer.go rename to pkg/printer/pretty_printer.go index 95de96f..37a1a71 100644 --- a/printer/pretty_printer.go +++ b/pkg/printer/pretty_printer.go @@ -4,15 +4,7 @@ import ( "io" "strings" - "github.com/z7zmey/php-parser/node/stmt" - - "github.com/z7zmey/php-parser/node" - "github.com/z7zmey/php-parser/node/expr" - "github.com/z7zmey/php-parser/node/expr/assign" - "github.com/z7zmey/php-parser/node/expr/binary" - "github.com/z7zmey/php-parser/node/expr/cast" - "github.com/z7zmey/php-parser/node/name" - "github.com/z7zmey/php-parser/node/scalar" + "github.com/z7zmey/php-parser/pkg/ast" ) type PrettyPrinter struct { @@ -30,11 +22,11 @@ func NewPrettyPrinter(w io.Writer, indentStr string) *PrettyPrinter { } } -func (p *PrettyPrinter) Print(n node.Node) { +func (p *PrettyPrinter) Print(n ast.Vertex) { p.printNode(n) } -func (p *PrettyPrinter) joinPrint(glue string, nn []node.Node) { +func (p *PrettyPrinter) joinPrint(glue string, nn []ast.Vertex) { for k, n := range nn { if k > 0 { io.WriteString(p.w, glue) @@ -44,7 +36,7 @@ func (p *PrettyPrinter) joinPrint(glue string, nn []node.Node) { } } -func (p *PrettyPrinter) printNodes(nn []node.Node) { +func (p *PrettyPrinter) printNodes(nn []ast.Vertex) { p.indentDepth++ l := len(nn) - 1 for k, n := range nn { @@ -63,367 +55,367 @@ func (p *PrettyPrinter) printIndent() { } } -func (p *PrettyPrinter) printNode(n node.Node) { +func (p *PrettyPrinter) printNode(n ast.Vertex) { switch n.(type) { // node - case *node.Root: + case *ast.Root: p.printNodeRoot(n) - case *node.Identifier: + case *ast.Identifier: p.printNodeIdentifier(n) - case *node.Parameter: + case *ast.Parameter: p.printNodeParameter(n) - case *node.Nullable: + case *ast.Nullable: p.printNodeNullable(n) - case *node.Argument: + case *ast.Argument: p.printNodeArgument(n) // name - case *name.NamePart: + case *ast.NameNamePart: p.printNameNamePart(n) - case *name.Name: + case *ast.NameName: p.printNameName(n) - case *name.FullyQualified: + case *ast.NameFullyQualified: p.printNameFullyQualified(n) - case *name.Relative: + case *ast.NameRelative: p.printNameRelative(n) // scalar - case *scalar.Lnumber: + case *ast.ScalarLnumber: p.printScalarLNumber(n) - case *scalar.Dnumber: + case *ast.ScalarDnumber: p.printScalarDNumber(n) - case *scalar.String: + case *ast.ScalarString: p.printScalarString(n) - case *scalar.EncapsedStringPart: + case *ast.ScalarEncapsedStringPart: p.printScalarEncapsedStringPart(n) - case *scalar.Encapsed: + case *ast.ScalarEncapsed: p.printScalarEncapsed(n) - case *scalar.Heredoc: + case *ast.ScalarHeredoc: p.printScalarHeredoc(n) - case *scalar.MagicConstant: + case *ast.ScalarMagicConstant: p.printScalarMagicConstant(n) // assign - case *assign.Assign: - p.printAssign(n) - case *assign.Reference: - p.printReference(n) - case *assign.BitwiseAnd: + case *ast.ExprAssign: + p.printAssignAssign(n) + case *ast.ExprAssignReference: + p.printAssignReference(n) + case *ast.ExprAssignBitwiseAnd: p.printAssignBitwiseAnd(n) - case *assign.BitwiseOr: + case *ast.ExprAssignBitwiseOr: p.printAssignBitwiseOr(n) - case *assign.BitwiseXor: + case *ast.ExprAssignBitwiseXor: p.printAssignBitwiseXor(n) - case *assign.Concat: + case *ast.ExprAssignConcat: p.printAssignConcat(n) - case *assign.Div: + case *ast.ExprAssignDiv: p.printAssignDiv(n) - case *assign.Minus: + case *ast.ExprAssignMinus: p.printAssignMinus(n) - case *assign.Mod: + case *ast.ExprAssignMod: p.printAssignMod(n) - case *assign.Mul: + case *ast.ExprAssignMul: p.printAssignMul(n) - case *assign.Plus: + case *ast.ExprAssignPlus: p.printAssignPlus(n) - case *assign.Pow: + case *ast.ExprAssignPow: p.printAssignPow(n) - case *assign.ShiftLeft: + case *ast.ExprAssignShiftLeft: p.printAssignShiftLeft(n) - case *assign.ShiftRight: + case *ast.ExprAssignShiftRight: p.printAssignShiftRight(n) // binary - case *binary.BitwiseAnd: + case *ast.ExprBinaryBitwiseAnd: p.printBinaryBitwiseAnd(n) - case *binary.BitwiseOr: + case *ast.ExprBinaryBitwiseOr: p.printBinaryBitwiseOr(n) - case *binary.BitwiseXor: + case *ast.ExprBinaryBitwiseXor: p.printBinaryBitwiseXor(n) - case *binary.BooleanAnd: + case *ast.ExprBinaryBooleanAnd: p.printBinaryBooleanAnd(n) - case *binary.BooleanOr: + case *ast.ExprBinaryBooleanOr: p.printBinaryBooleanOr(n) - case *binary.Coalesce: + case *ast.ExprBinaryCoalesce: p.printBinaryCoalesce(n) - case *binary.Concat: + case *ast.ExprBinaryConcat: p.printBinaryConcat(n) - case *binary.Div: + case *ast.ExprBinaryDiv: p.printBinaryDiv(n) - case *binary.Equal: + case *ast.ExprBinaryEqual: p.printBinaryEqual(n) - case *binary.GreaterOrEqual: + case *ast.ExprBinaryGreaterOrEqual: p.printBinaryGreaterOrEqual(n) - case *binary.Greater: + case *ast.ExprBinaryGreater: p.printBinaryGreater(n) - case *binary.Identical: + case *ast.ExprBinaryIdentical: p.printBinaryIdentical(n) - case *binary.LogicalAnd: + case *ast.ExprBinaryLogicalAnd: p.printBinaryLogicalAnd(n) - case *binary.LogicalOr: + case *ast.ExprBinaryLogicalOr: p.printBinaryLogicalOr(n) - case *binary.LogicalXor: + case *ast.ExprBinaryLogicalXor: p.printBinaryLogicalXor(n) - case *binary.Minus: + case *ast.ExprBinaryMinus: p.printBinaryMinus(n) - case *binary.Mod: + case *ast.ExprBinaryMod: p.printBinaryMod(n) - case *binary.Mul: + case *ast.ExprBinaryMul: p.printBinaryMul(n) - case *binary.NotEqual: + case *ast.ExprBinaryNotEqual: p.printBinaryNotEqual(n) - case *binary.NotIdentical: + case *ast.ExprBinaryNotIdentical: p.printBinaryNotIdentical(n) - case *binary.Plus: + case *ast.ExprBinaryPlus: p.printBinaryPlus(n) - case *binary.Pow: + case *ast.ExprBinaryPow: p.printBinaryPow(n) - case *binary.ShiftLeft: + case *ast.ExprBinaryShiftLeft: p.printBinaryShiftLeft(n) - case *binary.ShiftRight: + case *ast.ExprBinaryShiftRight: p.printBinaryShiftRight(n) - case *binary.SmallerOrEqual: + case *ast.ExprBinarySmallerOrEqual: p.printBinarySmallerOrEqual(n) - case *binary.Smaller: + case *ast.ExprBinarySmaller: p.printBinarySmaller(n) - case *binary.Spaceship: + case *ast.ExprBinarySpaceship: p.printBinarySpaceship(n) // cast - case *cast.Array: + case *ast.ExprCastArray: p.printArray(n) - case *cast.Bool: + case *ast.ExprCastBool: p.printBool(n) - case *cast.Double: + case *ast.ExprCastDouble: p.printDouble(n) - case *cast.Int: + case *ast.ExprCastInt: p.printInt(n) - case *cast.Object: + case *ast.ExprCastObject: p.printObject(n) - case *cast.String: + case *ast.ExprCastString: p.printString(n) - case *cast.Unset: + case *ast.ExprCastUnset: p.printUnset(n) // expr - case *expr.ArrayDimFetch: + case *ast.ExprArrayDimFetch: p.printExprArrayDimFetch(n) - case *expr.ArrayItem: + case *ast.ExprArrayItem: p.printExprArrayItem(n) - case *expr.Array: + case *ast.ExprArray: p.printExprArray(n) - case *expr.BitwiseNot: + case *ast.ExprBitwiseNot: p.printExprBitwiseNot(n) - case *expr.BooleanNot: + case *ast.ExprBooleanNot: p.printExprBooleanNot(n) - case *expr.ClassConstFetch: + case *ast.ExprClassConstFetch: p.printExprClassConstFetch(n) - case *expr.Clone: + case *ast.ExprClone: p.printExprClone(n) - case *expr.ClosureUse: + case *ast.ExprClosureUse: p.printExprClosureUse(n) - case *expr.Closure: + case *ast.ExprClosure: p.printExprClosure(n) - case *expr.ConstFetch: + case *ast.ExprConstFetch: p.printExprConstFetch(n) - case *expr.Empty: + case *ast.ExprEmpty: p.printExprEmpty(n) - case *expr.ErrorSuppress: + case *ast.ExprErrorSuppress: p.printExprErrorSuppress(n) - case *expr.Eval: + case *ast.ExprEval: p.printExprEval(n) - case *expr.Exit: + case *ast.ExprExit: p.printExprExit(n) - case *expr.FunctionCall: + case *ast.ExprFunctionCall: p.printExprFunctionCall(n) - case *expr.Include: + case *ast.ExprInclude: p.printExprInclude(n) - case *expr.IncludeOnce: + case *ast.ExprIncludeOnce: p.printExprIncludeOnce(n) - case *expr.InstanceOf: + case *ast.ExprInstanceOf: p.printExprInstanceOf(n) - case *expr.Isset: + case *ast.ExprIsset: p.printExprIsset(n) - case *expr.List: + case *ast.ExprList: p.printExprList(n) - case *expr.MethodCall: + case *ast.ExprMethodCall: p.printExprMethodCall(n) - case *expr.New: + case *ast.ExprNew: p.printExprNew(n) - case *expr.PostDec: + case *ast.ExprPostDec: p.printExprPostDec(n) - case *expr.PostInc: + case *ast.ExprPostInc: p.printExprPostInc(n) - case *expr.PreDec: + case *ast.ExprPreDec: p.printExprPreDec(n) - case *expr.PreInc: + case *ast.ExprPreInc: p.printExprPreInc(n) - case *expr.Print: + case *ast.ExprPrint: p.printExprPrint(n) - case *expr.PropertyFetch: + case *ast.ExprPropertyFetch: p.printExprPropertyFetch(n) - case *expr.Reference: + case *ast.ExprReference: p.printExprReference(n) - case *expr.Require: + case *ast.ExprRequire: p.printExprRequire(n) - case *expr.RequireOnce: + case *ast.ExprRequireOnce: p.printExprRequireOnce(n) - case *expr.ShellExec: + case *ast.ExprShellExec: p.printExprShellExec(n) - case *expr.ShortArray: + case *ast.ExprShortArray: p.printExprShortArray(n) - case *expr.ShortList: + case *ast.ExprShortList: p.printExprShortList(n) - case *expr.StaticCall: + case *ast.ExprStaticCall: p.printExprStaticCall(n) - case *expr.StaticPropertyFetch: + case *ast.ExprStaticPropertyFetch: p.printExprStaticPropertyFetch(n) - case *expr.Ternary: + case *ast.ExprTernary: p.printExprTernary(n) - case *expr.UnaryMinus: + case *ast.ExprUnaryMinus: p.printExprUnaryMinus(n) - case *expr.UnaryPlus: + case *ast.ExprUnaryPlus: p.printExprUnaryPlus(n) - case *expr.Variable: + case *ast.ExprVariable: p.printExprVariable(n) - case *expr.YieldFrom: + case *ast.ExprYieldFrom: p.printExprYieldFrom(n) - case *expr.Yield: + case *ast.ExprYield: p.printExprYield(n) // stmt - case *stmt.AltElseIf: + case *ast.StmtAltElseIf: p.printStmtAltElseIf(n) - case *stmt.AltElse: + case *ast.StmtAltElse: p.printStmtAltElse(n) - case *stmt.AltFor: + case *ast.StmtAltFor: p.printStmtAltFor(n) - case *stmt.AltForeach: + case *ast.StmtAltForeach: p.printStmtAltForeach(n) - case *stmt.AltIf: + case *ast.StmtAltIf: p.printStmtAltIf(n) - case *stmt.AltSwitch: + case *ast.StmtAltSwitch: p.printStmtAltSwitch(n) - case *stmt.AltWhile: + case *ast.StmtAltWhile: p.printStmtAltWhile(n) - case *stmt.Break: + case *ast.StmtBreak: p.printStmtBreak(n) - case *stmt.Case: + case *ast.StmtCase: p.printStmtCase(n) - case *stmt.Catch: + case *ast.StmtCatch: p.printStmtCatch(n) - case *stmt.ClassMethod: + case *ast.StmtClassMethod: p.printStmtClassMethod(n) - case *stmt.Class: + case *ast.StmtClass: p.printStmtClass(n) - case *stmt.ClassConstList: + case *ast.StmtClassConstList: p.printStmtClassConstList(n) - case *stmt.Constant: + case *ast.StmtConstant: p.printStmtConstant(n) - case *stmt.Continue: + case *ast.StmtContinue: p.printStmtContinue(n) - case *stmt.Declare: + case *ast.StmtDeclare: p.printStmtDeclare(n) - case *stmt.Default: + case *ast.StmtDefault: p.printStmtDefault(n) - case *stmt.Do: + case *ast.StmtDo: p.printStmtDo(n) - case *stmt.Echo: + case *ast.StmtEcho: p.printStmtEcho(n) - case *stmt.ElseIf: + case *ast.StmtElseIf: p.printStmtElseif(n) - case *stmt.Else: + case *ast.StmtElse: p.printStmtElse(n) - case *stmt.Expression: + case *ast.StmtExpression: p.printStmtExpression(n) - case *stmt.Finally: + case *ast.StmtFinally: p.printStmtFinally(n) - case *stmt.For: + case *ast.StmtFor: p.printStmtFor(n) - case *stmt.Foreach: + case *ast.StmtForeach: p.printStmtForeach(n) - case *stmt.Function: + case *ast.StmtFunction: p.printStmtFunction(n) - case *stmt.Global: + case *ast.StmtGlobal: p.printStmtGlobal(n) - case *stmt.Goto: + case *ast.StmtGoto: p.printStmtGoto(n) - case *stmt.GroupUse: + case *ast.StmtGroupUse: p.printStmtGroupUse(n) - case *stmt.HaltCompiler: + case *ast.StmtHaltCompiler: p.printStmtHaltCompiler(n) - case *stmt.If: + case *ast.StmtIf: p.printStmtIf(n) - case *stmt.InlineHtml: + case *ast.StmtInlineHtml: p.printStmtInlineHTML(n) - case *stmt.Interface: + case *ast.StmtInterface: p.printStmtInterface(n) - case *stmt.Label: + case *ast.StmtLabel: p.printStmtLabel(n) - case *stmt.Namespace: + case *ast.StmtNamespace: p.printStmtNamespace(n) - case *stmt.Nop: + case *ast.StmtNop: p.printStmtNop(n) - case *stmt.PropertyList: + case *ast.StmtPropertyList: p.printStmtPropertyList(n) - case *stmt.Property: + case *ast.StmtProperty: p.printStmtProperty(n) - case *stmt.Return: + case *ast.StmtReturn: p.printStmtReturn(n) - case *stmt.StaticVar: + case *ast.StmtStaticVar: p.printStmtStaticVar(n) - case *stmt.Static: + case *ast.StmtStatic: p.printStmtStatic(n) - case *stmt.StmtList: + case *ast.StmtStmtList: p.printStmtStmtList(n) - case *stmt.Switch: + case *ast.StmtSwitch: p.printStmtSwitch(n) - case *stmt.Throw: + case *ast.StmtThrow: p.printStmtThrow(n) - case *stmt.TraitMethodRef: + case *ast.StmtTraitMethodRef: p.printStmtTraitMethodRef(n) - case *stmt.TraitUseAlias: + case *ast.StmtTraitUseAlias: p.printStmtTraitUseAlias(n) - case *stmt.TraitUsePrecedence: + case *ast.StmtTraitUsePrecedence: p.printStmtTraitUsePrecedence(n) - case *stmt.TraitUse: + case *ast.StmtTraitUse: p.printStmtTraitUse(n) - case *stmt.Trait: + case *ast.StmtTrait: p.printStmtTrait(n) - case *stmt.Try: + case *ast.StmtTry: p.printStmtTry(n) - case *stmt.Unset: + case *ast.StmtUnset: p.printStmtUnset(n) - case *stmt.UseList: + case *ast.StmtUseList: p.printStmtUseList(n) - case *stmt.Use: + case *ast.StmtUse: p.printStmtUse(n) - case *stmt.While: + case *ast.StmtWhile: p.printStmtWhile(n) } } // node -func (p *PrettyPrinter) printNodeRoot(n node.Node) { - v := n.(*node.Root) +func (p *PrettyPrinter) printNodeRoot(n ast.Vertex) { + v := n.(*ast.Root) if len(v.Stmts) > 0 { firstStmt := v.Stmts[0] v.Stmts = v.Stmts[1:] switch fs := firstStmt.(type) { - case *stmt.InlineHtml: - io.WriteString(p.w, fs.Value) + case *ast.StmtInlineHtml: + io.WriteString(p.w, string(fs.Value)) io.WriteString(p.w, " 0 { @@ -506,8 +498,8 @@ func (p *PrettyPrinter) printNameName(n node.Node) { } } -func (p *PrettyPrinter) printNameFullyQualified(n node.Node) { - nn := n.(*name.FullyQualified) +func (p *PrettyPrinter) printNameFullyQualified(n ast.Vertex) { + nn := n.(*ast.NameFullyQualified) for _, part := range nn.Parts { io.WriteString(p.w, "\\") @@ -515,8 +507,8 @@ func (p *PrettyPrinter) printNameFullyQualified(n node.Node) { } } -func (p *PrettyPrinter) printNameRelative(n node.Node) { - nn := n.(*name.Relative) +func (p *PrettyPrinter) printNameRelative(n ast.Vertex) { + nn := n.(*ast.NameRelative) io.WriteString(p.w, "namespace") for _, part := range nn.Parts { @@ -527,34 +519,34 @@ func (p *PrettyPrinter) printNameRelative(n node.Node) { // scalar -func (p *PrettyPrinter) printScalarLNumber(n node.Node) { - v := n.(*scalar.Lnumber).Value +func (p *PrettyPrinter) printScalarLNumber(n ast.Vertex) { + v := string(n.(*ast.ScalarLnumber).Value) io.WriteString(p.w, v) } -func (p *PrettyPrinter) printScalarDNumber(n node.Node) { - v := n.(*scalar.Dnumber).Value +func (p *PrettyPrinter) printScalarDNumber(n ast.Vertex) { + v := string(n.(*ast.ScalarDnumber).Value) io.WriteString(p.w, v) } -func (p *PrettyPrinter) printScalarString(n node.Node) { - v := n.(*scalar.String).Value +func (p *PrettyPrinter) printScalarString(n ast.Vertex) { + v := string(n.(*ast.ScalarString).Value) io.WriteString(p.w, v) } -func (p *PrettyPrinter) printScalarEncapsedStringPart(n node.Node) { - v := n.(*scalar.EncapsedStringPart).Value +func (p *PrettyPrinter) printScalarEncapsedStringPart(n ast.Vertex) { + v := string(n.(*ast.ScalarEncapsedStringPart).Value) io.WriteString(p.w, v) } -func (p *PrettyPrinter) printScalarEncapsed(n node.Node) { - nn := n.(*scalar.Encapsed) +func (p *PrettyPrinter) printScalarEncapsed(n ast.Vertex) { + nn := n.(*ast.ScalarEncapsed) io.WriteString(p.w, "\"") for _, part := range nn.Parts { switch part.(type) { - case *scalar.EncapsedStringPart: + case *ast.ScalarEncapsedStringPart: p.Print(part) default: io.WriteString(p.w, "{") @@ -566,14 +558,14 @@ func (p *PrettyPrinter) printScalarEncapsed(n node.Node) { io.WriteString(p.w, "\"") } -func (p *PrettyPrinter) printScalarHeredoc(n node.Node) { - nn := n.(*scalar.Heredoc) +func (p *PrettyPrinter) printScalarHeredoc(n ast.Vertex) { + nn := n.(*ast.ScalarHeredoc) - io.WriteString(p.w, nn.Label) + io.WriteString(p.w, string(nn.Label)) for _, part := range nn.Parts { switch part.(type) { - case *scalar.EncapsedStringPart: + case *ast.ScalarEncapsedStringPart: p.Print(part) default: io.WriteString(p.w, "{") @@ -582,326 +574,326 @@ func (p *PrettyPrinter) printScalarHeredoc(n node.Node) { } } - io.WriteString(p.w, strings.Trim(nn.Label, "<\"'\n")) + io.WriteString(p.w, strings.Trim(string(nn.Label), "<\"'\n")) } -func (p *PrettyPrinter) printScalarMagicConstant(n node.Node) { - v := n.(*scalar.MagicConstant).Value +func (p *PrettyPrinter) printScalarMagicConstant(n ast.Vertex) { + v := string(n.(*ast.ScalarMagicConstant).Value) io.WriteString(p.w, v) } // Assign -func (p *PrettyPrinter) printAssign(n node.Node) { - nn := n.(*assign.Assign) - p.Print(nn.Variable) +func (p *PrettyPrinter) printAssignAssign(n ast.Vertex) { + nn := n.(*ast.ExprAssign) + p.Print(nn.Var) io.WriteString(p.w, " = ") - p.Print(nn.Expression) + p.Print(nn.Expr) } -func (p *PrettyPrinter) printReference(n node.Node) { - nn := n.(*assign.Reference) - p.Print(nn.Variable) +func (p *PrettyPrinter) printAssignReference(n ast.Vertex) { + nn := n.(*ast.ExprAssignReference) + p.Print(nn.Var) io.WriteString(p.w, " =& ") - p.Print(nn.Expression) + p.Print(nn.Expr) } -func (p *PrettyPrinter) printAssignBitwiseAnd(n node.Node) { - nn := n.(*assign.BitwiseAnd) - p.Print(nn.Variable) +func (p *PrettyPrinter) printAssignBitwiseAnd(n ast.Vertex) { + nn := n.(*ast.ExprAssignBitwiseAnd) + p.Print(nn.Var) io.WriteString(p.w, " &= ") - p.Print(nn.Expression) + p.Print(nn.Expr) } -func (p *PrettyPrinter) printAssignBitwiseOr(n node.Node) { - nn := n.(*assign.BitwiseOr) - p.Print(nn.Variable) +func (p *PrettyPrinter) printAssignBitwiseOr(n ast.Vertex) { + nn := n.(*ast.ExprAssignBitwiseOr) + p.Print(nn.Var) io.WriteString(p.w, " |= ") - p.Print(nn.Expression) + p.Print(nn.Expr) } -func (p *PrettyPrinter) printAssignBitwiseXor(n node.Node) { - nn := n.(*assign.BitwiseXor) - p.Print(nn.Variable) +func (p *PrettyPrinter) printAssignBitwiseXor(n ast.Vertex) { + nn := n.(*ast.ExprAssignBitwiseXor) + p.Print(nn.Var) io.WriteString(p.w, " ^= ") - p.Print(nn.Expression) + p.Print(nn.Expr) } -func (p *PrettyPrinter) printAssignConcat(n node.Node) { - nn := n.(*assign.Concat) - p.Print(nn.Variable) +func (p *PrettyPrinter) printAssignConcat(n ast.Vertex) { + nn := n.(*ast.ExprAssignConcat) + p.Print(nn.Var) io.WriteString(p.w, " .= ") - p.Print(nn.Expression) + p.Print(nn.Expr) } -func (p *PrettyPrinter) printAssignDiv(n node.Node) { - nn := n.(*assign.Div) - p.Print(nn.Variable) +func (p *PrettyPrinter) printAssignDiv(n ast.Vertex) { + nn := n.(*ast.ExprAssignDiv) + p.Print(nn.Var) io.WriteString(p.w, " /= ") - p.Print(nn.Expression) + p.Print(nn.Expr) } -func (p *PrettyPrinter) printAssignMinus(n node.Node) { - nn := n.(*assign.Minus) - p.Print(nn.Variable) +func (p *PrettyPrinter) printAssignMinus(n ast.Vertex) { + nn := n.(*ast.ExprAssignMinus) + p.Print(nn.Var) io.WriteString(p.w, " -= ") - p.Print(nn.Expression) + p.Print(nn.Expr) } -func (p *PrettyPrinter) printAssignMod(n node.Node) { - nn := n.(*assign.Mod) - p.Print(nn.Variable) +func (p *PrettyPrinter) printAssignMod(n ast.Vertex) { + nn := n.(*ast.ExprAssignMod) + p.Print(nn.Var) io.WriteString(p.w, " %= ") - p.Print(nn.Expression) + p.Print(nn.Expr) } -func (p *PrettyPrinter) printAssignMul(n node.Node) { - nn := n.(*assign.Mul) - p.Print(nn.Variable) +func (p *PrettyPrinter) printAssignMul(n ast.Vertex) { + nn := n.(*ast.ExprAssignMul) + p.Print(nn.Var) io.WriteString(p.w, " *= ") - p.Print(nn.Expression) + p.Print(nn.Expr) } -func (p *PrettyPrinter) printAssignPlus(n node.Node) { - nn := n.(*assign.Plus) - p.Print(nn.Variable) +func (p *PrettyPrinter) printAssignPlus(n ast.Vertex) { + nn := n.(*ast.ExprAssignPlus) + p.Print(nn.Var) io.WriteString(p.w, " += ") - p.Print(nn.Expression) + p.Print(nn.Expr) } -func (p *PrettyPrinter) printAssignPow(n node.Node) { - nn := n.(*assign.Pow) - p.Print(nn.Variable) +func (p *PrettyPrinter) printAssignPow(n ast.Vertex) { + nn := n.(*ast.ExprAssignPow) + p.Print(nn.Var) io.WriteString(p.w, " **= ") - p.Print(nn.Expression) + p.Print(nn.Expr) } -func (p *PrettyPrinter) printAssignShiftLeft(n node.Node) { - nn := n.(*assign.ShiftLeft) - p.Print(nn.Variable) +func (p *PrettyPrinter) printAssignShiftLeft(n ast.Vertex) { + nn := n.(*ast.ExprAssignShiftLeft) + p.Print(nn.Var) io.WriteString(p.w, " <<= ") - p.Print(nn.Expression) + p.Print(nn.Expr) } -func (p *PrettyPrinter) printAssignShiftRight(n node.Node) { - nn := n.(*assign.ShiftRight) - p.Print(nn.Variable) +func (p *PrettyPrinter) printAssignShiftRight(n ast.Vertex) { + nn := n.(*ast.ExprAssignShiftRight) + p.Print(nn.Var) io.WriteString(p.w, " >>= ") - p.Print(nn.Expression) + p.Print(nn.Expr) } // binary -func (p *PrettyPrinter) printBinaryBitwiseAnd(n node.Node) { - nn := n.(*binary.BitwiseAnd) +func (p *PrettyPrinter) printBinaryBitwiseAnd(n ast.Vertex) { + nn := n.(*ast.ExprBinaryBitwiseAnd) p.Print(nn.Left) io.WriteString(p.w, " & ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinaryBitwiseOr(n node.Node) { - nn := n.(*binary.BitwiseOr) +func (p *PrettyPrinter) printBinaryBitwiseOr(n ast.Vertex) { + nn := n.(*ast.ExprBinaryBitwiseOr) p.Print(nn.Left) io.WriteString(p.w, " | ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinaryBitwiseXor(n node.Node) { - nn := n.(*binary.BitwiseXor) +func (p *PrettyPrinter) printBinaryBitwiseXor(n ast.Vertex) { + nn := n.(*ast.ExprBinaryBitwiseXor) p.Print(nn.Left) io.WriteString(p.w, " ^ ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinaryBooleanAnd(n node.Node) { - nn := n.(*binary.BooleanAnd) +func (p *PrettyPrinter) printBinaryBooleanAnd(n ast.Vertex) { + nn := n.(*ast.ExprBinaryBooleanAnd) p.Print(nn.Left) io.WriteString(p.w, " && ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinaryBooleanOr(n node.Node) { - nn := n.(*binary.BooleanOr) +func (p *PrettyPrinter) printBinaryBooleanOr(n ast.Vertex) { + nn := n.(*ast.ExprBinaryBooleanOr) p.Print(nn.Left) io.WriteString(p.w, " || ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinaryCoalesce(n node.Node) { - nn := n.(*binary.Coalesce) +func (p *PrettyPrinter) printBinaryCoalesce(n ast.Vertex) { + nn := n.(*ast.ExprBinaryCoalesce) p.Print(nn.Left) io.WriteString(p.w, " ?? ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinaryConcat(n node.Node) { - nn := n.(*binary.Concat) +func (p *PrettyPrinter) printBinaryConcat(n ast.Vertex) { + nn := n.(*ast.ExprBinaryConcat) p.Print(nn.Left) io.WriteString(p.w, " . ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinaryDiv(n node.Node) { - nn := n.(*binary.Div) +func (p *PrettyPrinter) printBinaryDiv(n ast.Vertex) { + nn := n.(*ast.ExprBinaryDiv) p.Print(nn.Left) io.WriteString(p.w, " / ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinaryEqual(n node.Node) { - nn := n.(*binary.Equal) +func (p *PrettyPrinter) printBinaryEqual(n ast.Vertex) { + nn := n.(*ast.ExprBinaryEqual) p.Print(nn.Left) io.WriteString(p.w, " == ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinaryGreaterOrEqual(n node.Node) { - nn := n.(*binary.GreaterOrEqual) +func (p *PrettyPrinter) printBinaryGreaterOrEqual(n ast.Vertex) { + nn := n.(*ast.ExprBinaryGreaterOrEqual) p.Print(nn.Left) io.WriteString(p.w, " >= ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinaryGreater(n node.Node) { - nn := n.(*binary.Greater) +func (p *PrettyPrinter) printBinaryGreater(n ast.Vertex) { + nn := n.(*ast.ExprBinaryGreater) p.Print(nn.Left) io.WriteString(p.w, " > ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinaryIdentical(n node.Node) { - nn := n.(*binary.Identical) +func (p *PrettyPrinter) printBinaryIdentical(n ast.Vertex) { + nn := n.(*ast.ExprBinaryIdentical) p.Print(nn.Left) io.WriteString(p.w, " === ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinaryLogicalAnd(n node.Node) { - nn := n.(*binary.LogicalAnd) +func (p *PrettyPrinter) printBinaryLogicalAnd(n ast.Vertex) { + nn := n.(*ast.ExprBinaryLogicalAnd) p.Print(nn.Left) io.WriteString(p.w, " and ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinaryLogicalOr(n node.Node) { - nn := n.(*binary.LogicalOr) +func (p *PrettyPrinter) printBinaryLogicalOr(n ast.Vertex) { + nn := n.(*ast.ExprBinaryLogicalOr) p.Print(nn.Left) io.WriteString(p.w, " or ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinaryLogicalXor(n node.Node) { - nn := n.(*binary.LogicalXor) +func (p *PrettyPrinter) printBinaryLogicalXor(n ast.Vertex) { + nn := n.(*ast.ExprBinaryLogicalXor) p.Print(nn.Left) io.WriteString(p.w, " xor ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinaryMinus(n node.Node) { - nn := n.(*binary.Minus) +func (p *PrettyPrinter) printBinaryMinus(n ast.Vertex) { + nn := n.(*ast.ExprBinaryMinus) p.Print(nn.Left) io.WriteString(p.w, " - ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinaryMod(n node.Node) { - nn := n.(*binary.Mod) +func (p *PrettyPrinter) printBinaryMod(n ast.Vertex) { + nn := n.(*ast.ExprBinaryMod) p.Print(nn.Left) io.WriteString(p.w, " % ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinaryMul(n node.Node) { - nn := n.(*binary.Mul) +func (p *PrettyPrinter) printBinaryMul(n ast.Vertex) { + nn := n.(*ast.ExprBinaryMul) p.Print(nn.Left) io.WriteString(p.w, " * ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinaryNotEqual(n node.Node) { - nn := n.(*binary.NotEqual) +func (p *PrettyPrinter) printBinaryNotEqual(n ast.Vertex) { + nn := n.(*ast.ExprBinaryNotEqual) p.Print(nn.Left) io.WriteString(p.w, " != ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinaryNotIdentical(n node.Node) { - nn := n.(*binary.NotIdentical) +func (p *PrettyPrinter) printBinaryNotIdentical(n ast.Vertex) { + nn := n.(*ast.ExprBinaryNotIdentical) p.Print(nn.Left) io.WriteString(p.w, " !== ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinaryPlus(n node.Node) { - nn := n.(*binary.Plus) +func (p *PrettyPrinter) printBinaryPlus(n ast.Vertex) { + nn := n.(*ast.ExprBinaryPlus) p.Print(nn.Left) io.WriteString(p.w, " + ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinaryPow(n node.Node) { - nn := n.(*binary.Pow) +func (p *PrettyPrinter) printBinaryPow(n ast.Vertex) { + nn := n.(*ast.ExprBinaryPow) p.Print(nn.Left) io.WriteString(p.w, " ** ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinaryShiftLeft(n node.Node) { - nn := n.(*binary.ShiftLeft) +func (p *PrettyPrinter) printBinaryShiftLeft(n ast.Vertex) { + nn := n.(*ast.ExprBinaryShiftLeft) p.Print(nn.Left) io.WriteString(p.w, " << ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinaryShiftRight(n node.Node) { - nn := n.(*binary.ShiftRight) +func (p *PrettyPrinter) printBinaryShiftRight(n ast.Vertex) { + nn := n.(*ast.ExprBinaryShiftRight) p.Print(nn.Left) io.WriteString(p.w, " >> ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinarySmallerOrEqual(n node.Node) { - nn := n.(*binary.SmallerOrEqual) +func (p *PrettyPrinter) printBinarySmallerOrEqual(n ast.Vertex) { + nn := n.(*ast.ExprBinarySmallerOrEqual) p.Print(nn.Left) io.WriteString(p.w, " <= ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinarySmaller(n node.Node) { - nn := n.(*binary.Smaller) +func (p *PrettyPrinter) printBinarySmaller(n ast.Vertex) { + nn := n.(*ast.ExprBinarySmaller) p.Print(nn.Left) io.WriteString(p.w, " < ") p.Print(nn.Right) } -func (p *PrettyPrinter) printBinarySpaceship(n node.Node) { - nn := n.(*binary.Spaceship) +func (p *PrettyPrinter) printBinarySpaceship(n ast.Vertex) { + nn := n.(*ast.ExprBinarySpaceship) p.Print(nn.Left) io.WriteString(p.w, " <=> ") @@ -910,50 +902,50 @@ func (p *PrettyPrinter) printBinarySpaceship(n node.Node) { // cast -func (p *PrettyPrinter) printArray(n node.Node) { - nn := n.(*cast.Array) +func (p *PrettyPrinter) printArray(n ast.Vertex) { + nn := n.(*ast.ExprCastArray) io.WriteString(p.w, "(array)") p.Print(nn.Expr) } -func (p *PrettyPrinter) printBool(n node.Node) { - nn := n.(*cast.Bool) +func (p *PrettyPrinter) printBool(n ast.Vertex) { + nn := n.(*ast.ExprCastBool) io.WriteString(p.w, "(bool)") p.Print(nn.Expr) } -func (p *PrettyPrinter) printDouble(n node.Node) { - nn := n.(*cast.Double) +func (p *PrettyPrinter) printDouble(n ast.Vertex) { + nn := n.(*ast.ExprCastDouble) io.WriteString(p.w, "(float)") p.Print(nn.Expr) } -func (p *PrettyPrinter) printInt(n node.Node) { - nn := n.(*cast.Int) +func (p *PrettyPrinter) printInt(n ast.Vertex) { + nn := n.(*ast.ExprCastInt) io.WriteString(p.w, "(int)") p.Print(nn.Expr) } -func (p *PrettyPrinter) printObject(n node.Node) { - nn := n.(*cast.Object) +func (p *PrettyPrinter) printObject(n ast.Vertex) { + nn := n.(*ast.ExprCastObject) io.WriteString(p.w, "(object)") p.Print(nn.Expr) } -func (p *PrettyPrinter) printString(n node.Node) { - nn := n.(*cast.String) +func (p *PrettyPrinter) printString(n ast.Vertex) { + nn := n.(*ast.ExprCastString) io.WriteString(p.w, "(string)") p.Print(nn.Expr) } -func (p *PrettyPrinter) printUnset(n node.Node) { - nn := n.(*cast.Unset) +func (p *PrettyPrinter) printUnset(n ast.Vertex) { + nn := n.(*ast.ExprCastUnset) io.WriteString(p.w, "(unset)") p.Print(nn.Expr) @@ -961,16 +953,16 @@ func (p *PrettyPrinter) printUnset(n node.Node) { // expr -func (p *PrettyPrinter) printExprArrayDimFetch(n node.Node) { - nn := n.(*expr.ArrayDimFetch) - p.Print(nn.Variable) +func (p *PrettyPrinter) printExprArrayDimFetch(n ast.Vertex) { + nn := n.(*ast.ExprArrayDimFetch) + p.Print(nn.Var) io.WriteString(p.w, "[") p.Print(nn.Dim) io.WriteString(p.w, "]") } -func (p *PrettyPrinter) printExprArrayItem(n node.Node) { - nn := n.(*expr.ArrayItem) +func (p *PrettyPrinter) printExprArrayItem(n ast.Vertex) { + nn := n.(*ast.ExprArrayItem) if nn.Key != nil { p.Print(nn.Key) @@ -980,51 +972,51 @@ func (p *PrettyPrinter) printExprArrayItem(n node.Node) { p.Print(nn.Val) } -func (p *PrettyPrinter) printExprArray(n node.Node) { - nn := n.(*expr.Array) +func (p *PrettyPrinter) printExprArray(n ast.Vertex) { + nn := n.(*ast.ExprArray) io.WriteString(p.w, "array(") p.joinPrint(", ", nn.Items) io.WriteString(p.w, ")") } -func (p *PrettyPrinter) printExprBitwiseNot(n node.Node) { - nn := n.(*expr.BitwiseNot) +func (p *PrettyPrinter) printExprBitwiseNot(n ast.Vertex) { + nn := n.(*ast.ExprBitwiseNot) io.WriteString(p.w, "~") p.Print(nn.Expr) } -func (p *PrettyPrinter) printExprBooleanNot(n node.Node) { - nn := n.(*expr.BooleanNot) +func (p *PrettyPrinter) printExprBooleanNot(n ast.Vertex) { + nn := n.(*ast.ExprBooleanNot) io.WriteString(p.w, "!") p.Print(nn.Expr) } -func (p *PrettyPrinter) printExprClassConstFetch(n node.Node) { - nn := n.(*expr.ClassConstFetch) +func (p *PrettyPrinter) printExprClassConstFetch(n ast.Vertex) { + nn := n.(*ast.ExprClassConstFetch) p.Print(nn.Class) io.WriteString(p.w, "::") - io.WriteString(p.w, nn.ConstantName.(*node.Identifier).Value) + io.WriteString(p.w, string(nn.ConstantName.(*ast.Identifier).Value)) } -func (p *PrettyPrinter) printExprClone(n node.Node) { - nn := n.(*expr.Clone) +func (p *PrettyPrinter) printExprClone(n ast.Vertex) { + nn := n.(*ast.ExprClone) io.WriteString(p.w, "clone ") p.Print(nn.Expr) } -func (p *PrettyPrinter) printExprClosureUse(n node.Node) { - nn := n.(*expr.ClosureUse) +func (p *PrettyPrinter) printExprClosureUse(n ast.Vertex) { + nn := n.(*ast.ExprClosureUse) io.WriteString(p.w, "use (") p.joinPrint(", ", nn.Uses) io.WriteString(p.w, ")") } -func (p *PrettyPrinter) printExprClosure(n node.Node) { - nn := n.(*expr.Closure) +func (p *PrettyPrinter) printExprClosure(n ast.Vertex) { + nn := n.(*ast.ExprClosure) if nn.Static { io.WriteString(p.w, "static ") @@ -1057,37 +1049,37 @@ func (p *PrettyPrinter) printExprClosure(n node.Node) { io.WriteString(p.w, "}") } -func (p *PrettyPrinter) printExprConstFetch(n node.Node) { - nn := n.(*expr.ConstFetch) +func (p *PrettyPrinter) printExprConstFetch(n ast.Vertex) { + nn := n.(*ast.ExprConstFetch) - p.Print(nn.Constant) + p.Print(nn.Const) } -func (p *PrettyPrinter) printExprEmpty(n node.Node) { - nn := n.(*expr.Empty) +func (p *PrettyPrinter) printExprEmpty(n ast.Vertex) { + nn := n.(*ast.ExprEmpty) io.WriteString(p.w, "empty(") p.Print(nn.Expr) io.WriteString(p.w, ")") } -func (p *PrettyPrinter) printExprErrorSuppress(n node.Node) { - nn := n.(*expr.ErrorSuppress) +func (p *PrettyPrinter) printExprErrorSuppress(n ast.Vertex) { + nn := n.(*ast.ExprErrorSuppress) io.WriteString(p.w, "@") p.Print(nn.Expr) } -func (p *PrettyPrinter) printExprEval(n node.Node) { - nn := n.(*expr.Eval) +func (p *PrettyPrinter) printExprEval(n ast.Vertex) { + nn := n.(*ast.ExprEval) io.WriteString(p.w, "eval(") p.Print(nn.Expr) io.WriteString(p.w, ")") } -func (p *PrettyPrinter) printExprExit(n node.Node) { - nn := n.(*expr.Exit) +func (p *PrettyPrinter) printExprExit(n ast.Vertex) { + nn := n.(*ast.ExprExit) if nn.Die { io.WriteString(p.w, "die(") @@ -1098,8 +1090,8 @@ func (p *PrettyPrinter) printExprExit(n node.Node) { io.WriteString(p.w, ")") } -func (p *PrettyPrinter) printExprFunctionCall(n node.Node) { - nn := n.(*expr.FunctionCall) +func (p *PrettyPrinter) printExprFunctionCall(n ast.Vertex) { + nn := n.(*ast.ExprFunctionCall) p.Print(nn.Function) io.WriteString(p.w, "(") @@ -1107,48 +1099,48 @@ func (p *PrettyPrinter) printExprFunctionCall(n node.Node) { io.WriteString(p.w, ")") } -func (p *PrettyPrinter) printExprInclude(n node.Node) { - nn := n.(*expr.Include) +func (p *PrettyPrinter) printExprInclude(n ast.Vertex) { + nn := n.(*ast.ExprInclude) io.WriteString(p.w, "include ") p.Print(nn.Expr) } -func (p *PrettyPrinter) printExprIncludeOnce(n node.Node) { - nn := n.(*expr.IncludeOnce) +func (p *PrettyPrinter) printExprIncludeOnce(n ast.Vertex) { + nn := n.(*ast.ExprIncludeOnce) io.WriteString(p.w, "include_once ") p.Print(nn.Expr) } -func (p *PrettyPrinter) printExprInstanceOf(n node.Node) { - nn := n.(*expr.InstanceOf) +func (p *PrettyPrinter) printExprInstanceOf(n ast.Vertex) { + nn := n.(*ast.ExprInstanceOf) p.Print(nn.Expr) io.WriteString(p.w, " instanceof ") p.Print(nn.Class) } -func (p *PrettyPrinter) printExprIsset(n node.Node) { - nn := n.(*expr.Isset) +func (p *PrettyPrinter) printExprIsset(n ast.Vertex) { + nn := n.(*ast.ExprIsset) io.WriteString(p.w, "isset(") - p.joinPrint(", ", nn.Variables) + p.joinPrint(", ", nn.Vars) io.WriteString(p.w, ")") } -func (p *PrettyPrinter) printExprList(n node.Node) { - nn := n.(*expr.List) +func (p *PrettyPrinter) printExprList(n ast.Vertex) { + nn := n.(*ast.ExprList) io.WriteString(p.w, "list(") p.joinPrint(", ", nn.Items) io.WriteString(p.w, ")") } -func (p *PrettyPrinter) printExprMethodCall(n node.Node) { - nn := n.(*expr.MethodCall) +func (p *PrettyPrinter) printExprMethodCall(n ast.Vertex) { + nn := n.(*ast.ExprMethodCall) - p.Print(nn.Variable) + p.Print(nn.Var) io.WriteString(p.w, "->") p.Print(nn.Method) io.WriteString(p.w, "(") @@ -1156,8 +1148,8 @@ func (p *PrettyPrinter) printExprMethodCall(n node.Node) { io.WriteString(p.w, ")") } -func (p *PrettyPrinter) printExprNew(n node.Node) { - nn := n.(*expr.New) +func (p *PrettyPrinter) printExprNew(n ast.Vertex) { + nn := n.(*ast.ExprNew) io.WriteString(p.w, "new ") p.Print(nn.Class) @@ -1169,78 +1161,78 @@ func (p *PrettyPrinter) printExprNew(n node.Node) { } } -func (p *PrettyPrinter) printExprPostDec(n node.Node) { - nn := n.(*expr.PostDec) +func (p *PrettyPrinter) printExprPostDec(n ast.Vertex) { + nn := n.(*ast.ExprPostDec) - p.Print(nn.Variable) + p.Print(nn.Var) io.WriteString(p.w, "--") } -func (p *PrettyPrinter) printExprPostInc(n node.Node) { - nn := n.(*expr.PostInc) +func (p *PrettyPrinter) printExprPostInc(n ast.Vertex) { + nn := n.(*ast.ExprPostInc) - p.Print(nn.Variable) + p.Print(nn.Var) io.WriteString(p.w, "++") } -func (p *PrettyPrinter) printExprPreDec(n node.Node) { - nn := n.(*expr.PreDec) +func (p *PrettyPrinter) printExprPreDec(n ast.Vertex) { + nn := n.(*ast.ExprPreDec) io.WriteString(p.w, "--") - p.Print(nn.Variable) + p.Print(nn.Var) } -func (p *PrettyPrinter) printExprPreInc(n node.Node) { - nn := n.(*expr.PreInc) +func (p *PrettyPrinter) printExprPreInc(n ast.Vertex) { + nn := n.(*ast.ExprPreInc) io.WriteString(p.w, "++") - p.Print(nn.Variable) + p.Print(nn.Var) } -func (p *PrettyPrinter) printExprPrint(n node.Node) { - nn := n.(*expr.Print) +func (p *PrettyPrinter) printExprPrint(n ast.Vertex) { + nn := n.(*ast.ExprPrint) io.WriteString(p.w, "print(") p.Print(nn.Expr) io.WriteString(p.w, ")") } -func (p *PrettyPrinter) printExprPropertyFetch(n node.Node) { - nn := n.(*expr.PropertyFetch) +func (p *PrettyPrinter) printExprPropertyFetch(n ast.Vertex) { + nn := n.(*ast.ExprPropertyFetch) - p.Print(nn.Variable) + p.Print(nn.Var) io.WriteString(p.w, "->") p.Print(nn.Property) } -func (p *PrettyPrinter) printExprReference(n node.Node) { - nn := n.(*expr.Reference) +func (p *PrettyPrinter) printExprReference(n ast.Vertex) { + nn := n.(*ast.ExprReference) io.WriteString(p.w, "&") - p.Print(nn.Variable) + p.Print(nn.Var) } -func (p *PrettyPrinter) printExprRequire(n node.Node) { - nn := n.(*expr.Require) +func (p *PrettyPrinter) printExprRequire(n ast.Vertex) { + nn := n.(*ast.ExprRequire) io.WriteString(p.w, "require ") p.Print(nn.Expr) } -func (p *PrettyPrinter) printExprRequireOnce(n node.Node) { - nn := n.(*expr.RequireOnce) +func (p *PrettyPrinter) printExprRequireOnce(n ast.Vertex) { + nn := n.(*ast.ExprRequireOnce) io.WriteString(p.w, "require_once ") p.Print(nn.Expr) } -func (p *PrettyPrinter) printExprShellExec(n node.Node) { - nn := n.(*expr.ShellExec) +func (p *PrettyPrinter) printExprShellExec(n ast.Vertex) { + nn := n.(*ast.ExprShellExec) io.WriteString(p.w, "`") for _, part := range nn.Parts { switch part.(type) { - case *scalar.EncapsedStringPart: + case *ast.ScalarEncapsedStringPart: p.Print(part) default: io.WriteString(p.w, "{") @@ -1251,24 +1243,24 @@ func (p *PrettyPrinter) printExprShellExec(n node.Node) { io.WriteString(p.w, "`") } -func (p *PrettyPrinter) printExprShortArray(n node.Node) { - nn := n.(*expr.ShortArray) +func (p *PrettyPrinter) printExprShortArray(n ast.Vertex) { + nn := n.(*ast.ExprShortArray) io.WriteString(p.w, "[") p.joinPrint(", ", nn.Items) io.WriteString(p.w, "]") } -func (p *PrettyPrinter) printExprShortList(n node.Node) { - nn := n.(*expr.ShortList) +func (p *PrettyPrinter) printExprShortList(n ast.Vertex) { + nn := n.(*ast.ExprShortList) io.WriteString(p.w, "[") p.joinPrint(", ", nn.Items) io.WriteString(p.w, "]") } -func (p *PrettyPrinter) printExprStaticCall(n node.Node) { - nn := n.(*expr.StaticCall) +func (p *PrettyPrinter) printExprStaticCall(n ast.Vertex) { + nn := n.(*ast.ExprStaticCall) p.Print(nn.Class) io.WriteString(p.w, "::") @@ -1278,16 +1270,16 @@ func (p *PrettyPrinter) printExprStaticCall(n node.Node) { io.WriteString(p.w, ")") } -func (p *PrettyPrinter) printExprStaticPropertyFetch(n node.Node) { - nn := n.(*expr.StaticPropertyFetch) +func (p *PrettyPrinter) printExprStaticPropertyFetch(n ast.Vertex) { + nn := n.(*ast.ExprStaticPropertyFetch) p.Print(nn.Class) io.WriteString(p.w, "::") p.Print(nn.Property) } -func (p *PrettyPrinter) printExprTernary(n node.Node) { - nn := n.(*expr.Ternary) +func (p *PrettyPrinter) printExprTernary(n ast.Vertex) { + nn := n.(*ast.ExprTernary) p.Print(nn.Condition) io.WriteString(p.w, " ?") @@ -1302,35 +1294,35 @@ func (p *PrettyPrinter) printExprTernary(n node.Node) { p.Print(nn.IfFalse) } -func (p *PrettyPrinter) printExprUnaryMinus(n node.Node) { - nn := n.(*expr.UnaryMinus) +func (p *PrettyPrinter) printExprUnaryMinus(n ast.Vertex) { + nn := n.(*ast.ExprUnaryMinus) io.WriteString(p.w, "-") p.Print(nn.Expr) } -func (p *PrettyPrinter) printExprUnaryPlus(n node.Node) { - nn := n.(*expr.UnaryPlus) +func (p *PrettyPrinter) printExprUnaryPlus(n ast.Vertex) { + nn := n.(*ast.ExprUnaryPlus) io.WriteString(p.w, "+") p.Print(nn.Expr) } -func (p *PrettyPrinter) printExprVariable(n node.Node) { - nn := n.(*expr.Variable) +func (p *PrettyPrinter) printExprVariable(n ast.Vertex) { + nn := n.(*ast.ExprVariable) io.WriteString(p.w, "$") p.Print(nn.VarName) } -func (p *PrettyPrinter) printExprYieldFrom(n node.Node) { - nn := n.(*expr.YieldFrom) +func (p *PrettyPrinter) printExprYieldFrom(n ast.Vertex) { + nn := n.(*ast.ExprYieldFrom) io.WriteString(p.w, "yield from ") p.Print(nn.Expr) } -func (p *PrettyPrinter) printExprYield(n node.Node) { - nn := n.(*expr.Yield) +func (p *PrettyPrinter) printExprYield(n ast.Vertex) { + nn := n.(*ast.ExprYield) io.WriteString(p.w, "yield ") @@ -1344,32 +1336,32 @@ func (p *PrettyPrinter) printExprYield(n node.Node) { // smtm -func (p *PrettyPrinter) printStmtAltElseIf(n node.Node) { - nn := n.(*stmt.AltElseIf) +func (p *PrettyPrinter) printStmtAltElseIf(n ast.Vertex) { + nn := n.(*ast.StmtAltElseIf) io.WriteString(p.w, "elseif (") p.Print(nn.Cond) io.WriteString(p.w, ") :") - if s := nn.Stmt.(*stmt.StmtList).Stmts; len(s) > 0 { + if s := nn.Stmt.(*ast.StmtStmtList).Stmts; len(s) > 0 { io.WriteString(p.w, "\n") p.printNodes(s) } } -func (p *PrettyPrinter) printStmtAltElse(n node.Node) { - nn := n.(*stmt.AltElse) +func (p *PrettyPrinter) printStmtAltElse(n ast.Vertex) { + nn := n.(*ast.StmtAltElse) io.WriteString(p.w, "else :") - if s := nn.Stmt.(*stmt.StmtList).Stmts; len(s) > 0 { + if s := nn.Stmt.(*ast.StmtStmtList).Stmts; len(s) > 0 { io.WriteString(p.w, "\n") p.printNodes(s) } } -func (p *PrettyPrinter) printStmtAltFor(n node.Node) { - nn := n.(*stmt.AltFor) +func (p *PrettyPrinter) printStmtAltFor(n ast.Vertex) { + nn := n.(*ast.StmtAltFor) io.WriteString(p.w, "for (") p.joinPrint(", ", nn.Init) @@ -1379,7 +1371,7 @@ func (p *PrettyPrinter) printStmtAltFor(n node.Node) { p.joinPrint(", ", nn.Loop) io.WriteString(p.w, ") :\n") - s := nn.Stmt.(*stmt.StmtList) + s := nn.Stmt.(*ast.StmtStmtList) p.printNodes(s.Stmts) io.WriteString(p.w, "\n") p.printIndent() @@ -1387,8 +1379,8 @@ func (p *PrettyPrinter) printStmtAltFor(n node.Node) { io.WriteString(p.w, "endfor;") } -func (p *PrettyPrinter) printStmtAltForeach(n node.Node) { - nn := n.(*stmt.AltForeach) +func (p *PrettyPrinter) printStmtAltForeach(n ast.Vertex) { + nn := n.(*ast.StmtAltForeach) io.WriteString(p.w, "foreach (") p.Print(nn.Expr) @@ -1399,11 +1391,11 @@ func (p *PrettyPrinter) printStmtAltForeach(n node.Node) { io.WriteString(p.w, " => ") } - p.Print(nn.Variable) + p.Print(nn.Var) io.WriteString(p.w, ") :\n") - s := nn.Stmt.(*stmt.StmtList) + s := nn.Stmt.(*ast.StmtStmtList) p.printNodes(s.Stmts) io.WriteString(p.w, "\n") @@ -1411,14 +1403,14 @@ func (p *PrettyPrinter) printStmtAltForeach(n node.Node) { io.WriteString(p.w, "endforeach;") } -func (p *PrettyPrinter) printStmtAltIf(n node.Node) { - nn := n.(*stmt.AltIf) +func (p *PrettyPrinter) printStmtAltIf(n ast.Vertex) { + nn := n.(*ast.StmtAltIf) io.WriteString(p.w, "if (") p.Print(nn.Cond) io.WriteString(p.w, ") :\n") - s := nn.Stmt.(*stmt.StmtList) + s := nn.Stmt.(*ast.StmtStmtList) p.printNodes(s.Stmts) for _, elseif := range nn.ElseIf { @@ -1438,8 +1430,8 @@ func (p *PrettyPrinter) printStmtAltIf(n node.Node) { io.WriteString(p.w, "endif;") } -func (p *PrettyPrinter) printStmtAltSwitch(n node.Node) { - nn := n.(*stmt.AltSwitch) +func (p *PrettyPrinter) printStmtAltSwitch(n ast.Vertex) { + nn := n.(*ast.StmtAltSwitch) io.WriteString(p.w, "switch (") p.Print(nn.Cond) @@ -1453,14 +1445,14 @@ func (p *PrettyPrinter) printStmtAltSwitch(n node.Node) { io.WriteString(p.w, "endswitch;") } -func (p *PrettyPrinter) printStmtAltWhile(n node.Node) { - nn := n.(*stmt.AltWhile) +func (p *PrettyPrinter) printStmtAltWhile(n ast.Vertex) { + nn := n.(*ast.StmtAltWhile) io.WriteString(p.w, "while (") p.Print(nn.Cond) io.WriteString(p.w, ") :\n") - s := nn.Stmt.(*stmt.StmtList) + s := nn.Stmt.(*ast.StmtStmtList) p.printNodes(s.Stmts) io.WriteString(p.w, "\n") @@ -1468,8 +1460,8 @@ func (p *PrettyPrinter) printStmtAltWhile(n node.Node) { io.WriteString(p.w, "endwhile;") } -func (p *PrettyPrinter) printStmtBreak(n node.Node) { - nn := n.(*stmt.Break) +func (p *PrettyPrinter) printStmtBreak(n ast.Vertex) { + nn := n.(*ast.StmtBreak) io.WriteString(p.w, "break") if nn.Expr != nil { @@ -1480,8 +1472,8 @@ func (p *PrettyPrinter) printStmtBreak(n node.Node) { io.WriteString(p.w, ";") } -func (p *PrettyPrinter) printStmtCase(n node.Node) { - nn := n.(*stmt.Case) +func (p *PrettyPrinter) printStmtCase(n ast.Vertex) { + nn := n.(*ast.StmtCase) io.WriteString(p.w, "case ") p.Print(nn.Cond) @@ -1493,13 +1485,13 @@ func (p *PrettyPrinter) printStmtCase(n node.Node) { } } -func (p *PrettyPrinter) printStmtCatch(n node.Node) { - nn := n.(*stmt.Catch) +func (p *PrettyPrinter) printStmtCatch(n ast.Vertex) { + nn := n.(*ast.StmtCatch) io.WriteString(p.w, "catch (") p.joinPrint(" | ", nn.Types) io.WriteString(p.w, " ") - p.Print(nn.Variable) + p.Print(nn.Var) io.WriteString(p.w, ") {\n") p.printNodes(nn.Stmts) io.WriteString(p.w, "\n") @@ -1507,8 +1499,8 @@ func (p *PrettyPrinter) printStmtCatch(n node.Node) { io.WriteString(p.w, "}") } -func (p *PrettyPrinter) printStmtClassMethod(n node.Node) { - nn := n.(*stmt.ClassMethod) +func (p *PrettyPrinter) printStmtClassMethod(n ast.Vertex) { + nn := n.(*ast.StmtClassMethod) if nn.Modifiers != nil { p.joinPrint(" ", nn.Modifiers) @@ -1531,7 +1523,7 @@ func (p *PrettyPrinter) printStmtClassMethod(n node.Node) { } switch s := nn.Stmt.(type) { - case *stmt.StmtList: + case *ast.StmtStmtList: io.WriteString(p.w, "\n") p.printIndent() io.WriteString(p.w, "{\n") @@ -1544,8 +1536,8 @@ func (p *PrettyPrinter) printStmtClassMethod(n node.Node) { } } -func (p *PrettyPrinter) printStmtClass(n node.Node) { - nn := n.(*stmt.Class) +func (p *PrettyPrinter) printStmtClass(n ast.Vertex) { + nn := n.(*ast.StmtClass) if nn.Modifiers != nil { p.joinPrint(" ", nn.Modifiers) @@ -1583,8 +1575,8 @@ func (p *PrettyPrinter) printStmtClass(n node.Node) { io.WriteString(p.w, "}") } -func (p *PrettyPrinter) printStmtClassConstList(n node.Node) { - nn := n.(*stmt.ClassConstList) +func (p *PrettyPrinter) printStmtClassConstList(n ast.Vertex) { + nn := n.(*ast.StmtClassConstList) if nn.Modifiers != nil { p.joinPrint(" ", nn.Modifiers) @@ -1597,16 +1589,16 @@ func (p *PrettyPrinter) printStmtClassConstList(n node.Node) { io.WriteString(p.w, ";") } -func (p *PrettyPrinter) printStmtConstant(n node.Node) { - nn := n.(*stmt.Constant) +func (p *PrettyPrinter) printStmtConstant(n ast.Vertex) { + nn := n.(*ast.StmtConstant) p.Print(nn.ConstantName) io.WriteString(p.w, " = ") p.Print(nn.Expr) } -func (p *PrettyPrinter) printStmtContinue(n node.Node) { - nn := n.(*stmt.Continue) +func (p *PrettyPrinter) printStmtContinue(n ast.Vertex) { + nn := n.(*ast.StmtContinue) io.WriteString(p.w, "continue") if nn.Expr != nil { @@ -1617,18 +1609,18 @@ func (p *PrettyPrinter) printStmtContinue(n node.Node) { io.WriteString(p.w, ";") } -func (p *PrettyPrinter) printStmtDeclare(n node.Node) { - nn := n.(*stmt.Declare) +func (p *PrettyPrinter) printStmtDeclare(n ast.Vertex) { + nn := n.(*ast.StmtDeclare) io.WriteString(p.w, "declare(") p.joinPrint(", ", nn.Consts) io.WriteString(p.w, ")") switch s := nn.Stmt.(type) { - case *stmt.Nop: + case *ast.StmtNop: p.Print(s) break - case *stmt.StmtList: + case *ast.StmtStmtList: io.WriteString(p.w, " ") p.Print(s) default: @@ -1640,8 +1632,8 @@ func (p *PrettyPrinter) printStmtDeclare(n node.Node) { } } -func (p *PrettyPrinter) printStmtDefault(n node.Node) { - nn := n.(*stmt.Default) +func (p *PrettyPrinter) printStmtDefault(n ast.Vertex) { + nn := n.(*ast.StmtDefault) io.WriteString(p.w, "default:") if len(nn.Stmts) > 0 { @@ -1650,12 +1642,12 @@ func (p *PrettyPrinter) printStmtDefault(n node.Node) { } } -func (p *PrettyPrinter) printStmtDo(n node.Node) { - nn := n.(*stmt.Do) +func (p *PrettyPrinter) printStmtDo(n ast.Vertex) { + nn := n.(*ast.StmtDo) io.WriteString(p.w, "do") switch s := nn.Stmt.(type) { - case *stmt.StmtList: + case *ast.StmtStmtList: io.WriteString(p.w, " ") p.Print(s) io.WriteString(p.w, " ") @@ -1674,25 +1666,25 @@ func (p *PrettyPrinter) printStmtDo(n node.Node) { io.WriteString(p.w, ");") } -func (p *PrettyPrinter) printStmtEcho(n node.Node) { - nn := n.(*stmt.Echo) +func (p *PrettyPrinter) printStmtEcho(n ast.Vertex) { + nn := n.(*ast.StmtEcho) io.WriteString(p.w, "echo ") p.joinPrint(", ", nn.Exprs) io.WriteString(p.w, ";") } -func (p *PrettyPrinter) printStmtElseif(n node.Node) { - nn := n.(*stmt.ElseIf) +func (p *PrettyPrinter) printStmtElseif(n ast.Vertex) { + nn := n.(*ast.StmtElseIf) io.WriteString(p.w, "elseif (") p.Print(nn.Cond) io.WriteString(p.w, ")") switch s := nn.Stmt.(type) { - case *stmt.Nop: + case *ast.StmtNop: p.Print(s) break - case *stmt.StmtList: + case *ast.StmtStmtList: io.WriteString(p.w, " ") p.Print(s) default: @@ -1704,16 +1696,16 @@ func (p *PrettyPrinter) printStmtElseif(n node.Node) { } } -func (p *PrettyPrinter) printStmtElse(n node.Node) { - nn := n.(*stmt.Else) +func (p *PrettyPrinter) printStmtElse(n ast.Vertex) { + nn := n.(*ast.StmtElse) io.WriteString(p.w, "else") switch s := nn.Stmt.(type) { - case *stmt.Nop: + case *ast.StmtNop: p.Print(s) break - case *stmt.StmtList: + case *ast.StmtStmtList: io.WriteString(p.w, " ") p.Print(s) default: @@ -1725,16 +1717,16 @@ func (p *PrettyPrinter) printStmtElse(n node.Node) { } } -func (p *PrettyPrinter) printStmtExpression(n node.Node) { - nn := n.(*stmt.Expression) +func (p *PrettyPrinter) printStmtExpression(n ast.Vertex) { + nn := n.(*ast.StmtExpression) p.Print(nn.Expr) io.WriteString(p.w, ";") } -func (p *PrettyPrinter) printStmtFinally(n node.Node) { - nn := n.(*stmt.Finally) +func (p *PrettyPrinter) printStmtFinally(n ast.Vertex) { + nn := n.(*ast.StmtFinally) io.WriteString(p.w, "finally {\n") p.printNodes(nn.Stmts) @@ -1743,8 +1735,8 @@ func (p *PrettyPrinter) printStmtFinally(n node.Node) { io.WriteString(p.w, "}") } -func (p *PrettyPrinter) printStmtFor(n node.Node) { - nn := n.(*stmt.For) +func (p *PrettyPrinter) printStmtFor(n ast.Vertex) { + nn := n.(*ast.StmtFor) io.WriteString(p.w, "for (") p.joinPrint(", ", nn.Init) @@ -1755,10 +1747,10 @@ func (p *PrettyPrinter) printStmtFor(n node.Node) { io.WriteString(p.w, ")") switch s := nn.Stmt.(type) { - case *stmt.Nop: + case *ast.StmtNop: p.Print(s) break - case *stmt.StmtList: + case *ast.StmtStmtList: io.WriteString(p.w, " ") p.Print(s) default: @@ -1770,8 +1762,8 @@ func (p *PrettyPrinter) printStmtFor(n node.Node) { } } -func (p *PrettyPrinter) printStmtForeach(n node.Node) { - nn := n.(*stmt.Foreach) +func (p *PrettyPrinter) printStmtForeach(n ast.Vertex) { + nn := n.(*ast.StmtForeach) io.WriteString(p.w, "foreach (") p.Print(nn.Expr) @@ -1782,14 +1774,14 @@ func (p *PrettyPrinter) printStmtForeach(n node.Node) { io.WriteString(p.w, " => ") } - p.Print(nn.Variable) + p.Print(nn.Var) io.WriteString(p.w, ")") switch s := nn.Stmt.(type) { - case *stmt.Nop: + case *ast.StmtNop: p.Print(s) break - case *stmt.StmtList: + case *ast.StmtStmtList: io.WriteString(p.w, " ") p.Print(s) default: @@ -1801,8 +1793,8 @@ func (p *PrettyPrinter) printStmtForeach(n node.Node) { } } -func (p *PrettyPrinter) printStmtFunction(n node.Node) { - nn := n.(*stmt.Function) +func (p *PrettyPrinter) printStmtFunction(n ast.Vertex) { + nn := n.(*ast.StmtFunction) io.WriteString(p.w, "function ") @@ -1828,24 +1820,24 @@ func (p *PrettyPrinter) printStmtFunction(n node.Node) { io.WriteString(p.w, "}") } -func (p *PrettyPrinter) printStmtGlobal(n node.Node) { - nn := n.(*stmt.Global) +func (p *PrettyPrinter) printStmtGlobal(n ast.Vertex) { + nn := n.(*ast.StmtGlobal) io.WriteString(p.w, "global ") p.joinPrint(", ", nn.Vars) io.WriteString(p.w, ";") } -func (p *PrettyPrinter) printStmtGoto(n node.Node) { - nn := n.(*stmt.Goto) +func (p *PrettyPrinter) printStmtGoto(n ast.Vertex) { + nn := n.(*ast.StmtGoto) io.WriteString(p.w, "goto ") p.Print(nn.Label) io.WriteString(p.w, ";") } -func (p *PrettyPrinter) printStmtGroupUse(n node.Node) { - nn := n.(*stmt.GroupUse) +func (p *PrettyPrinter) printStmtGroupUse(n ast.Vertex) { + nn := n.(*ast.StmtGroupUse) io.WriteString(p.w, "use ") @@ -1860,22 +1852,22 @@ func (p *PrettyPrinter) printStmtGroupUse(n node.Node) { io.WriteString(p.w, "};") } -func (p *PrettyPrinter) printStmtHaltCompiler(n node.Node) { +func (p *PrettyPrinter) printStmtHaltCompiler(n ast.Vertex) { io.WriteString(p.w, "__halt_compiler();") } -func (p *PrettyPrinter) printStmtIf(n node.Node) { - nn := n.(*stmt.If) +func (p *PrettyPrinter) printStmtIf(n ast.Vertex) { + nn := n.(*ast.StmtIf) io.WriteString(p.w, "if (") p.Print(nn.Cond) io.WriteString(p.w, ")") switch s := nn.Stmt.(type) { - case *stmt.Nop: + case *ast.StmtNop: p.Print(s) break - case *stmt.StmtList: + case *ast.StmtStmtList: io.WriteString(p.w, " ") p.Print(s) default: @@ -1900,16 +1892,16 @@ func (p *PrettyPrinter) printStmtIf(n node.Node) { } } -func (p *PrettyPrinter) printStmtInlineHTML(n node.Node) { - nn := n.(*stmt.InlineHtml) +func (p *PrettyPrinter) printStmtInlineHTML(n ast.Vertex) { + nn := n.(*ast.StmtInlineHtml) io.WriteString(p.w, "?>") - io.WriteString(p.w, nn.Value) + io.WriteString(p.w, string(nn.Value)) io.WriteString(p.w, "HTML"}, - &stmt.Expression{ - Expr: &scalar.Heredoc{ - Label: "<<<\"LBL\"\n", - Parts: []node.Node{ - &scalar.EncapsedStringPart{Value: "hello world\n"}, + p.Print(&ast.Root{ + Stmts: []ast.Vertex{ + &ast.StmtInlineHtml{Value: []byte("
HTML
")}, + &ast.StmtExpression{ + Expr: &ast.ScalarHeredoc{ + Label: []byte("<<<\"LBL\"\n"), + Parts: []ast.Vertex{ + &ast.ScalarEncapsedStringPart{Value: []byte("hello world\n")}, }, }, }, @@ -114,7 +107,7 @@ func TestPrintIdentifier(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&node.Identifier{Value: "test"}) + p.Print(&ast.Identifier{Value: []byte("test")}) if o.String() != `test` { t.Errorf("TestPrintIdentifier is failed\n") @@ -125,12 +118,12 @@ func TestPrintParameter(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&node.Parameter{ + p.Print(&ast.Parameter{ ByRef: false, Variadic: true, - VariableType: &name.FullyQualified{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, - Variable: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, - DefaultValue: &scalar.String{Value: "'default'"}, + Type: &ast.NameFullyQualified{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, + Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, + DefaultValue: &ast.ScalarString{Value: []byte("'default'")}, }) expected := "\\Foo ...$var = 'default'" @@ -145,13 +138,13 @@ func TestPrintNullable(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&node.Nullable{ - Expr: &node.Parameter{ + p.Print(&ast.Nullable{ + Expr: &ast.Parameter{ ByRef: false, Variadic: true, - VariableType: &name.FullyQualified{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, - Variable: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, - DefaultValue: &scalar.String{Value: "'default'"}, + Type: &ast.NameFullyQualified{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, + Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, + DefaultValue: &ast.ScalarString{Value: []byte("'default'")}, }, }) @@ -167,10 +160,10 @@ func TestPrintArgument(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&node.Argument{ + p.Print(&ast.Argument{ IsReference: false, Variadic: true, - Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }) expected := "...$var" @@ -184,10 +177,10 @@ func TestPrintArgumentByRef(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&node.Argument{ + p.Print(&ast.Argument{ IsReference: true, Variadic: false, - Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }) expected := "&$var" @@ -204,8 +197,8 @@ func TestPrintNameNamePart(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&name.NamePart{ - Value: "foo", + p.Print(&ast.NameNamePart{ + Value: []byte("foo"), }) expected := "foo" @@ -220,13 +213,13 @@ func TestPrintNameName(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&name.Name{ - Parts: []node.Node{ - &name.NamePart{ - Value: "Foo", + p.Print(&ast.NameName{ + Parts: []ast.Vertex{ + &ast.NameNamePart{ + Value: []byte("Foo"), }, - &name.NamePart{ - Value: "Bar", + &ast.NameNamePart{ + Value: []byte("Bar"), }, }, }) @@ -243,13 +236,13 @@ func TestPrintNameFullyQualified(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&name.FullyQualified{ - Parts: []node.Node{ - &name.NamePart{ - Value: "Foo", + p.Print(&ast.NameFullyQualified{ + Parts: []ast.Vertex{ + &ast.NameNamePart{ + Value: []byte("Foo"), }, - &name.NamePart{ - Value: "Bar", + &ast.NameNamePart{ + Value: []byte("Bar"), }, }, }) @@ -266,13 +259,13 @@ func TestPrintNameRelative(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&name.Relative{ - Parts: []node.Node{ - &name.NamePart{ - Value: "Foo", + p.Print(&ast.NameRelative{ + Parts: []ast.Vertex{ + &ast.NameNamePart{ + Value: []byte("Foo"), }, - &name.NamePart{ - Value: "Bar", + &ast.NameNamePart{ + Value: []byte("Bar"), }, }, }) @@ -291,7 +284,7 @@ func TestPrintScalarLNumber(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&scalar.Lnumber{Value: "1"}) + p.Print(&ast.ScalarLnumber{Value: []byte("1")}) if o.String() != `1` { t.Errorf("TestPrintScalarLNumber is failed\n") @@ -302,7 +295,7 @@ func TestPrintScalarDNumber(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&scalar.Dnumber{Value: ".1"}) + p.Print(&ast.ScalarDnumber{Value: []byte(".1")}) if o.String() != `.1` { t.Errorf("TestPrintScalarDNumber is failed\n") @@ -313,7 +306,7 @@ func TestPrintScalarString(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&scalar.String{Value: "'hello world'"}) + p.Print(&ast.ScalarString{Value: []byte("'hello world'")}) expected := `'hello world'` actual := o.String() @@ -327,7 +320,7 @@ func TestPrintScalarEncapsedStringPart(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&scalar.EncapsedStringPart{Value: "hello world"}) + p.Print(&ast.ScalarEncapsedStringPart{Value: []byte("hello world")}) if o.String() != `hello world` { t.Errorf("TestPrintScalarEncapsedStringPart is failed\n") @@ -338,11 +331,11 @@ func TestPrintScalarEncapsed(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&scalar.Encapsed{ - Parts: []node.Node{ - &scalar.EncapsedStringPart{Value: "hello "}, - &expr.Variable{VarName: &node.Identifier{Value: "var"}}, - &scalar.EncapsedStringPart{Value: " world"}, + p.Print(&ast.ScalarEncapsed{ + Parts: []ast.Vertex{ + &ast.ScalarEncapsedStringPart{Value: []byte("hello ")}, + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, + &ast.ScalarEncapsedStringPart{Value: []byte(" world")}, }, }) @@ -355,12 +348,12 @@ func TestPrintScalarHeredoc(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&scalar.Heredoc{ - Label: "<<>= $b` @@ -652,9 +645,9 @@ func TestPrintBinaryBitwiseAnd(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.BitwiseAnd{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryBitwiseAnd{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a & $b` @@ -669,9 +662,9 @@ func TestPrintBinaryBitwiseOr(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.BitwiseOr{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryBitwiseOr{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a | $b` @@ -686,9 +679,9 @@ func TestPrintBinaryBitwiseXor(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.BitwiseXor{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryBitwiseXor{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a ^ $b` @@ -703,9 +696,9 @@ func TestPrintBinaryBooleanAnd(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.BooleanAnd{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryBooleanAnd{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a && $b` @@ -720,9 +713,9 @@ func TestPrintBinaryBooleanOr(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.BooleanOr{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryBooleanOr{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a || $b` @@ -737,9 +730,9 @@ func TestPrintBinaryCoalesce(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.Coalesce{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryCoalesce{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a ?? $b` @@ -754,9 +747,9 @@ func TestPrintBinaryConcat(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.Concat{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryConcat{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a . $b` @@ -771,9 +764,9 @@ func TestPrintBinaryDiv(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.Div{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryDiv{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a / $b` @@ -788,9 +781,9 @@ func TestPrintBinaryEqual(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.Equal{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryEqual{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a == $b` @@ -805,9 +798,9 @@ func TestPrintBinaryGreaterOrEqual(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.GreaterOrEqual{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryGreaterOrEqual{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a >= $b` @@ -822,9 +815,9 @@ func TestPrintBinaryGreater(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.Greater{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryGreater{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a > $b` @@ -839,9 +832,9 @@ func TestPrintBinaryIdentical(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.Identical{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryIdentical{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a === $b` @@ -856,9 +849,9 @@ func TestPrintBinaryLogicalAnd(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.LogicalAnd{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryLogicalAnd{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a and $b` @@ -873,9 +866,9 @@ func TestPrintBinaryLogicalOr(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.LogicalOr{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryLogicalOr{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a or $b` @@ -890,9 +883,9 @@ func TestPrintBinaryLogicalXor(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.LogicalXor{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryLogicalXor{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a xor $b` @@ -907,9 +900,9 @@ func TestPrintBinaryMinus(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.Minus{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryMinus{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a - $b` @@ -924,9 +917,9 @@ func TestPrintBinaryMod(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.Mod{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryMod{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a % $b` @@ -941,9 +934,9 @@ func TestPrintBinaryMul(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.Mul{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryMul{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a * $b` @@ -958,9 +951,9 @@ func TestPrintBinaryNotEqual(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.NotEqual{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryNotEqual{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a != $b` @@ -975,9 +968,9 @@ func TestPrintBinaryNotIdentical(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.NotIdentical{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryNotIdentical{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a !== $b` @@ -992,9 +985,9 @@ func TestPrintBinaryPlus(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.Plus{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryPlus{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a + $b` @@ -1009,9 +1002,9 @@ func TestPrintBinaryPow(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.Pow{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryPow{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a ** $b` @@ -1026,9 +1019,9 @@ func TestPrintBinaryShiftLeft(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.ShiftLeft{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryShiftLeft{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a << $b` @@ -1043,9 +1036,9 @@ func TestPrintBinaryShiftRight(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.ShiftRight{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinaryShiftRight{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a >> $b` @@ -1060,9 +1053,9 @@ func TestPrintBinarySmallerOrEqual(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.SmallerOrEqual{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinarySmallerOrEqual{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a <= $b` @@ -1077,9 +1070,9 @@ func TestPrintBinarySmaller(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.Smaller{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinarySmaller{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a < $b` @@ -1094,9 +1087,9 @@ func TestPrintBinarySpaceship(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&binary.Spaceship{ - Left: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Right: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprBinarySpaceship{ + Left: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Right: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a <=> $b` @@ -1113,8 +1106,8 @@ func TestPrintArray(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&cast.Array{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + p.Print(&ast.ExprCastArray{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }) expected := `(array)$var` @@ -1129,8 +1122,8 @@ func TestPrintBool(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&cast.Bool{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + p.Print(&ast.ExprCastBool{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }) expected := `(bool)$var` @@ -1145,8 +1138,8 @@ func TestPrintDouble(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&cast.Double{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + p.Print(&ast.ExprCastDouble{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }) expected := `(float)$var` @@ -1161,8 +1154,8 @@ func TestPrintInt(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&cast.Int{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + p.Print(&ast.ExprCastInt{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }) expected := `(int)$var` @@ -1177,8 +1170,8 @@ func TestPrintObject(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&cast.Object{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + p.Print(&ast.ExprCastObject{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }) expected := `(object)$var` @@ -1193,8 +1186,8 @@ func TestPrintString(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&cast.String{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + p.Print(&ast.ExprCastString{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }) expected := `(string)$var` @@ -1209,8 +1202,8 @@ func TestPrintUnset(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&cast.Unset{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + p.Print(&ast.ExprCastUnset{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }) expected := `(unset)$var` @@ -1227,9 +1220,9 @@ func TestPrintExprArrayDimFetch(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.ArrayDimFetch{ - Variable: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, - Dim: &scalar.Lnumber{Value: "1"}, + p.Print(&ast.ExprArrayDimFetch{ + Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, + Dim: &ast.ScalarLnumber{Value: []byte("1")}, }) expected := `$var[1]` @@ -1244,9 +1237,9 @@ func TestPrintExprArrayItemWithKey(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.ArrayItem{ - Key: &scalar.String{Value: "'Hello'"}, - Val: &expr.Variable{VarName: &node.Identifier{Value: "world"}}, + p.Print(&ast.ExprArrayItem{ + Key: &ast.ScalarString{Value: []byte("'Hello'")}, + Val: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("world")}}, }) expected := `'Hello' => $world` @@ -1261,8 +1254,8 @@ func TestPrintExprArrayItem(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.ArrayItem{ - Val: &expr.Reference{Variable: &expr.Variable{VarName: &node.Identifier{Value: "world"}}}, + p.Print(&ast.ExprArrayItem{ + Val: &ast.ExprReference{Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("world")}}}, }) expected := `&$world` @@ -1277,18 +1270,18 @@ func TestPrintExprArray(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.Array{ - Items: []node.Node{ - &expr.ArrayItem{ - Key: &scalar.String{Value: "'Hello'"}, - Val: &expr.Variable{VarName: &node.Identifier{Value: "world"}}, + p.Print(&ast.ExprArray{ + Items: []ast.Vertex{ + &ast.ExprArrayItem{ + Key: &ast.ScalarString{Value: []byte("'Hello'")}, + Val: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("world")}}, }, - &expr.ArrayItem{ - Key: &scalar.Lnumber{Value: "2"}, - Val: &expr.Reference{Variable: &expr.Variable{VarName: &node.Identifier{Value: "var"}}}, + &ast.ExprArrayItem{ + Key: &ast.ScalarLnumber{Value: []byte("2")}, + Val: &ast.ExprReference{Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}}, }, - &expr.ArrayItem{ - Val: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + &ast.ExprArrayItem{ + Val: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }, }, }) @@ -1305,8 +1298,8 @@ func TestPrintExprBitwiseNot(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.BitwiseNot{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + p.Print(&ast.ExprBitwiseNot{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }) expected := `~$var` @@ -1321,8 +1314,8 @@ func TestPrintExprBooleanNot(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.BooleanNot{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + p.Print(&ast.ExprBooleanNot{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }) expected := `!$var` @@ -1337,9 +1330,9 @@ func TestPrintExprClassConstFetch(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.ClassConstFetch{ - Class: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, - ConstantName: &node.Identifier{Value: "CONST"}, + p.Print(&ast.ExprClassConstFetch{ + Class: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, + ConstantName: &ast.Identifier{Value: []byte("CONST")}, }) expected := `$var::CONST` @@ -1354,8 +1347,8 @@ func TestPrintExprClone(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.Clone{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + p.Print(&ast.ExprClone{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }) expected := `clone $var` @@ -1370,10 +1363,10 @@ func TestPrintExprClosureUse(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.ClosureUse{ - Uses: []node.Node{ - &expr.Reference{Variable: &expr.Variable{VarName: &node.Identifier{Value: "foo"}}}, - &expr.Variable{VarName: &node.Identifier{Value: "bar"}}, + p.Print(&ast.ExprClosureUse{ + Uses: []ast.Vertex{ + &ast.ExprReference{Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("foo")}}}, + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("bar")}}, }, }) @@ -1389,27 +1382,27 @@ func TestPrintExprClosure(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Namespace{ - Stmts: []node.Node{ - &expr.Closure{ + p.Print(&ast.StmtNamespace{ + Stmts: []ast.Vertex{ + &ast.ExprClosure{ Static: true, ReturnsRef: true, - Params: []node.Node{ - &node.Parameter{ + Params: []ast.Vertex{ + &ast.Parameter{ ByRef: true, Variadic: false, - Variable: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }, }, - ClosureUse: &expr.ClosureUse{ - Uses: []node.Node{ - &expr.Reference{Variable: &expr.Variable{VarName: &node.Identifier{Value: "a"}}}, - &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + ClosureUse: &ast.ExprClosureUse{ + Uses: []ast.Vertex{ + &ast.ExprReference{Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}}, + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }, }, - ReturnType: &name.FullyQualified{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}}, + ReturnType: &ast.NameFullyQualified{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}}, }, }, }, @@ -1431,8 +1424,8 @@ func TestPrintExprConstFetch(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.ConstFetch{ - Constant: &name.Name{Parts: []node.Node{&name.NamePart{Value: "null"}}}, + p.Print(&ast.ExprConstFetch{ + Const: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("null")}}}, }) expected := "null" @@ -1447,7 +1440,7 @@ func TestPrintEmpty(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.Empty{Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}}) + p.Print(&ast.ExprEmpty{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}}) expected := `empty($var)` actual := o.String() @@ -1461,7 +1454,7 @@ func TestPrettyPrinterrorSuppress(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.ErrorSuppress{Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}}) + p.Print(&ast.ExprErrorSuppress{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}}) expected := `@$var` actual := o.String() @@ -1475,7 +1468,7 @@ func TestPrintEval(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.Eval{Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}}) + p.Print(&ast.ExprEval{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}}) expected := `eval($var)` actual := o.String() @@ -1489,7 +1482,7 @@ func TestPrintExit(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.Exit{Die: false, Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}}) + p.Print(&ast.ExprExit{Die: false, Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}}) expected := `exit($var)` actual := o.String() @@ -1503,7 +1496,7 @@ func TestPrintDie(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.Exit{Die: true, Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}}) + p.Print(&ast.ExprExit{Die: true, Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}}) expected := `die($var)` actual := o.String() @@ -1517,20 +1510,20 @@ func TestPrintFunctionCall(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.FunctionCall{ - Function: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, - ArgumentList: &node.ArgumentList{ - Arguments: []node.Node{ - &node.Argument{ + p.Print(&ast.ExprFunctionCall{ + Function: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, + ArgumentList: &ast.ArgumentList{ + Arguments: []ast.Vertex{ + &ast.Argument{ IsReference: true, - Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, }, - &node.Argument{ + &ast.Argument{ Variadic: true, - Expr: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }, - &node.Argument{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "c"}}, + &ast.Argument{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("c")}}, }, }, }, @@ -1548,7 +1541,7 @@ func TestPrintInclude(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.Include{Expr: &scalar.String{Value: "'path'"}}) + p.Print(&ast.ExprInclude{Expr: &ast.ScalarString{Value: []byte("'path'")}}) expected := `include 'path'` actual := o.String() @@ -1562,7 +1555,7 @@ func TestPrintIncludeOnce(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.IncludeOnce{Expr: &scalar.String{Value: "'path'"}}) + p.Print(&ast.ExprIncludeOnce{Expr: &ast.ScalarString{Value: []byte("'path'")}}) expected := `include_once 'path'` actual := o.String() @@ -1576,9 +1569,9 @@ func TestPrintInstanceOf(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.InstanceOf{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, - Class: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, + p.Print(&ast.ExprInstanceOf{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, + Class: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, }) expected := `$var instanceof Foo` @@ -1593,10 +1586,10 @@ func TestPrintIsset(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.Isset{ - Variables: []node.Node{ - &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprIsset{ + Vars: []ast.Vertex{ + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }, }) @@ -1612,19 +1605,19 @@ func TestPrintList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.List{ - Items: []node.Node{ - &expr.ArrayItem{ - Val: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, + p.Print(&ast.ExprList{ + Items: []ast.Vertex{ + &ast.ExprArrayItem{ + Val: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, }, - &expr.ArrayItem{ - Val: &expr.List{ - Items: []node.Node{ - &expr.ArrayItem{ - Val: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + &ast.ExprArrayItem{ + Val: &ast.ExprList{ + Items: []ast.Vertex{ + &ast.ExprArrayItem{ + Val: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }, - &expr.ArrayItem{ - Val: &expr.Variable{VarName: &node.Identifier{Value: "c"}}, + &ast.ExprArrayItem{ + Val: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("c")}}, }, }, }, @@ -1644,16 +1637,16 @@ func TestPrintMethodCall(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.MethodCall{ - Variable: &expr.Variable{VarName: &node.Identifier{Value: "foo"}}, - Method: &node.Identifier{Value: "bar"}, - ArgumentList: &node.ArgumentList{ - Arguments: []node.Node{ - &node.Argument{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, + p.Print(&ast.ExprMethodCall{ + Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("foo")}}, + Method: &ast.Identifier{Value: []byte("bar")}, + ArgumentList: &ast.ArgumentList{ + Arguments: []ast.Vertex{ + &ast.Argument{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, }, - &node.Argument{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + &ast.Argument{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }, }, }, @@ -1671,15 +1664,15 @@ func TestPrintNew(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.New{ - Class: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, - ArgumentList: &node.ArgumentList{ - Arguments: []node.Node{ - &node.Argument{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, + p.Print(&ast.ExprNew{ + Class: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, + ArgumentList: &ast.ArgumentList{ + Arguments: []ast.Vertex{ + &ast.Argument{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, }, - &node.Argument{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + &ast.Argument{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }, }, }, @@ -1697,8 +1690,8 @@ func TestPrintPostDec(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.PostDec{ - Variable: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + p.Print(&ast.ExprPostDec{ + Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }) expected := `$var--` @@ -1713,8 +1706,8 @@ func TestPrintPostInc(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.PostInc{ - Variable: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + p.Print(&ast.ExprPostInc{ + Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }) expected := `$var++` @@ -1729,8 +1722,8 @@ func TestPrintPreDec(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.PreDec{ - Variable: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + p.Print(&ast.ExprPreDec{ + Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }) expected := `--$var` @@ -1745,8 +1738,8 @@ func TestPrintPreInc(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.PreInc{ - Variable: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + p.Print(&ast.ExprPreInc{ + Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }) expected := `++$var` @@ -1761,7 +1754,7 @@ func TestPrintPrint(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.Print{Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}}) + p.Print(&ast.ExprPrint{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}}) expected := `print($var)` actual := o.String() @@ -1775,9 +1768,9 @@ func TestPrintPropertyFetch(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.PropertyFetch{ - Variable: &expr.Variable{VarName: &node.Identifier{Value: "foo"}}, - Property: &node.Identifier{Value: "bar"}, + p.Print(&ast.ExprPropertyFetch{ + Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("foo")}}, + Property: &ast.Identifier{Value: []byte("bar")}, }) expected := `$foo->bar` @@ -1792,8 +1785,8 @@ func TestPrintExprReference(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.Reference{ - Variable: &expr.Variable{VarName: &node.Identifier{Value: "foo"}}, + p.Print(&ast.ExprReference{ + Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("foo")}}, }) expected := `&$foo` @@ -1808,7 +1801,7 @@ func TestPrintRequire(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.Require{Expr: &scalar.String{Value: "'path'"}}) + p.Print(&ast.ExprRequire{Expr: &ast.ScalarString{Value: []byte("'path'")}}) expected := `require 'path'` actual := o.String() @@ -1822,7 +1815,7 @@ func TestPrintRequireOnce(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.RequireOnce{Expr: &scalar.String{Value: "'path'"}}) + p.Print(&ast.ExprRequireOnce{Expr: &ast.ScalarString{Value: []byte("'path'")}}) expected := `require_once 'path'` actual := o.String() @@ -1836,11 +1829,11 @@ func TestPrintShellExec(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.ShellExec{ - Parts: []node.Node{ - &scalar.EncapsedStringPart{Value: "hello "}, - &expr.Variable{VarName: &node.Identifier{Value: "world"}}, - &scalar.EncapsedStringPart{Value: "!"}, + p.Print(&ast.ExprShellExec{ + Parts: []ast.Vertex{ + &ast.ScalarEncapsedStringPart{Value: []byte("hello ")}, + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("world")}}, + &ast.ScalarEncapsedStringPart{Value: []byte("!")}, }, }) @@ -1856,18 +1849,18 @@ func TestPrintExprShortArray(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.ShortArray{ - Items: []node.Node{ - &expr.ArrayItem{ - Key: &scalar.String{Value: "'Hello'"}, - Val: &expr.Variable{VarName: &node.Identifier{Value: "world"}}, + p.Print(&ast.ExprShortArray{ + Items: []ast.Vertex{ + &ast.ExprArrayItem{ + Key: &ast.ScalarString{Value: []byte("'Hello'")}, + Val: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("world")}}, }, - &expr.ArrayItem{ - Key: &scalar.Lnumber{Value: "2"}, - Val: &expr.Reference{Variable: &expr.Variable{VarName: &node.Identifier{Value: "var"}}}, + &ast.ExprArrayItem{ + Key: &ast.ScalarLnumber{Value: []byte("2")}, + Val: &ast.ExprReference{Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}}, }, - &expr.ArrayItem{ - Val: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + &ast.ExprArrayItem{ + Val: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }, }, }) @@ -1884,19 +1877,19 @@ func TestPrintShortList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.ShortList{ - Items: []node.Node{ - &expr.ArrayItem{ - Val: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, + p.Print(&ast.ExprShortList{ + Items: []ast.Vertex{ + &ast.ExprArrayItem{ + Val: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, }, - &expr.ArrayItem{ - Val: &expr.List{ - Items: []node.Node{ - &expr.ArrayItem{ - Val: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + &ast.ExprArrayItem{ + Val: &ast.ExprList{ + Items: []ast.Vertex{ + &ast.ExprArrayItem{ + Val: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }, - &expr.ArrayItem{ - Val: &expr.Variable{VarName: &node.Identifier{Value: "c"}}, + &ast.ExprArrayItem{ + Val: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("c")}}, }, }, }, @@ -1916,16 +1909,16 @@ func TestPrintStaticCall(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.StaticCall{ - Class: &node.Identifier{Value: "Foo"}, - Call: &node.Identifier{Value: "bar"}, - ArgumentList: &node.ArgumentList{ - Arguments: []node.Node{ - &node.Argument{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, + p.Print(&ast.ExprStaticCall{ + Class: &ast.Identifier{Value: []byte("Foo")}, + Call: &ast.Identifier{Value: []byte("bar")}, + ArgumentList: &ast.ArgumentList{ + Arguments: []ast.Vertex{ + &ast.Argument{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, }, - &node.Argument{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + &ast.Argument{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }, }, }, @@ -1943,9 +1936,9 @@ func TestPrintStaticPropertyFetch(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.StaticPropertyFetch{ - Class: &node.Identifier{Value: "Foo"}, - Property: &expr.Variable{VarName: &node.Identifier{Value: "bar"}}, + p.Print(&ast.ExprStaticPropertyFetch{ + Class: &ast.Identifier{Value: []byte("Foo")}, + Property: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("bar")}}, }) expected := `Foo::$bar` @@ -1960,9 +1953,9 @@ func TestPrintTernary(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.Ternary{ - Condition: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - IfFalse: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.ExprTernary{ + Condition: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + IfFalse: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }) expected := `$a ?: $b` @@ -1977,10 +1970,10 @@ func TestPrintTernaryFull(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.Ternary{ - Condition: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - IfTrue: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, - IfFalse: &expr.Variable{VarName: &node.Identifier{Value: "c"}}, + p.Print(&ast.ExprTernary{ + Condition: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + IfTrue: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, + IfFalse: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("c")}}, }) expected := `$a ? $b : $c` @@ -1995,8 +1988,8 @@ func TestPrintUnaryMinus(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.UnaryMinus{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + p.Print(&ast.ExprUnaryMinus{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }) expected := `-$var` @@ -2011,8 +2004,8 @@ func TestPrintUnaryPlus(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.UnaryPlus{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + p.Print(&ast.ExprUnaryPlus{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }) expected := `+$var` @@ -2027,7 +2020,7 @@ func TestPrintVariable(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.Variable{VarName: &expr.Variable{VarName: &node.Identifier{Value: "var"}}}) + p.Print(&ast.ExprVariable{VarName: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}}) expected := `$$var` actual := o.String() @@ -2041,8 +2034,8 @@ func TestPrintYieldFrom(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.YieldFrom{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + p.Print(&ast.ExprYieldFrom{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }) expected := `yield from $var` @@ -2057,8 +2050,8 @@ func TestPrintYield(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.Yield{ - Value: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + p.Print(&ast.ExprYield{ + Value: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }) expected := `yield $var` @@ -2073,9 +2066,9 @@ func TestPrintYieldFull(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&expr.Yield{ - Key: &expr.Variable{VarName: &node.Identifier{Value: "k"}}, - Value: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + p.Print(&ast.ExprYield{ + Key: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("k")}}, + Value: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }) expected := `yield $k => $var` @@ -2092,11 +2085,11 @@ func TestPrintAltElseIf(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.AltElseIf{ - Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "b"}}}, + p.Print(&ast.StmtAltElseIf{ + Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}}, }, }, }) @@ -2114,9 +2107,9 @@ func TestPrintAltElseIfEmpty(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.AltElseIf{ - Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Stmt: &stmt.StmtList{}, + p.Print(&ast.StmtAltElseIf{ + Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Stmt: &ast.StmtStmtList{}, }) expected := `elseif ($a) :` @@ -2131,10 +2124,10 @@ func TestPrintAltElse(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.AltElse{ - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "b"}}}, + p.Print(&ast.StmtAltElse{ + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}}, }, }, }) @@ -2152,8 +2145,8 @@ func TestPrintAltElseEmpty(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.AltElse{ - Stmt: &stmt.StmtList{}, + p.Print(&ast.StmtAltElse{ + Stmt: &ast.StmtStmtList{}, }) expected := `else :` @@ -2168,21 +2161,21 @@ func TestPrintAltFor(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Namespace{ - Stmts: []node.Node{ - &stmt.AltFor{ - Init: []node.Node{ - &expr.Variable{VarName: &node.Identifier{Value: "a"}}, + p.Print(&ast.StmtNamespace{ + Stmts: []ast.Vertex{ + &ast.StmtAltFor{ + Init: []ast.Vertex{ + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, }, - Cond: []node.Node{ - &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + Cond: []ast.Vertex{ + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }, - Loop: []node.Node{ - &expr.Variable{VarName: &node.Identifier{Value: "c"}}, + Loop: []ast.Vertex{ + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("c")}}, }, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "d"}}}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("d")}}}, }, }, }, @@ -2205,15 +2198,15 @@ func TestPrintAltForeach(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Namespace{ - Stmts: []node.Node{ - &stmt.AltForeach{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, - Key: &expr.Variable{VarName: &node.Identifier{Value: "key"}}, - Variable: &expr.Reference{Variable: &expr.Variable{VarName: &node.Identifier{Value: "val"}}}, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "d"}}}, + p.Print(&ast.StmtNamespace{ + Stmts: []ast.Vertex{ + &ast.StmtAltForeach{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, + Key: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("key")}}, + Var: &ast.ExprReference{Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("val")}}}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("d")}}}, }, }, }, @@ -2236,33 +2229,33 @@ func TestPrintAltIf(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Namespace{ - Stmts: []node.Node{ - &stmt.AltIf{ - Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "d"}}}, + p.Print(&ast.StmtNamespace{ + Stmts: []ast.Vertex{ + &ast.StmtAltIf{ + Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("d")}}}, }, }, - ElseIf: []node.Node{ - &stmt.AltElseIf{ - Cond: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "b"}}}, + ElseIf: []ast.Vertex{ + &ast.StmtAltElseIf{ + Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}}, }, }, }, - &stmt.AltElseIf{ - Cond: &expr.Variable{VarName: &node.Identifier{Value: "c"}}, - Stmt: &stmt.StmtList{}, + &ast.StmtAltElseIf{ + Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("c")}}, + Stmt: &ast.StmtStmtList{}, }, }, - Else: &stmt.AltElse{ - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "b"}}}, + Else: &ast.StmtAltElse{ + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}}, }, }, }, @@ -2291,22 +2284,22 @@ func TestPrintStmtAltSwitch(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Namespace{ - Stmts: []node.Node{ - &stmt.AltSwitch{ - Cond: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, - CaseList: &stmt.CaseList{ - Cases: []node.Node{ - &stmt.Case{ - Cond: &scalar.String{Value: "'a'"}, - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}}, + p.Print(&ast.StmtNamespace{ + Stmts: []ast.Vertex{ + &ast.StmtAltSwitch{ + Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, + CaseList: &ast.StmtCaseList{ + Cases: []ast.Vertex{ + &ast.StmtCase{ + Cond: &ast.ScalarString{Value: []byte("'a'")}, + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}}, }, }, - &stmt.Case{ - Cond: &scalar.String{Value: "'b'"}, - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "b"}}}, + &ast.StmtCase{ + Cond: &ast.ScalarString{Value: []byte("'b'")}, + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}}, }, }, }, @@ -2334,13 +2327,13 @@ func TestPrintAltWhile(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Namespace{ - Stmts: []node.Node{ - &stmt.AltWhile{ - Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "b"}}}, + p.Print(&ast.StmtNamespace{ + Stmts: []ast.Vertex{ + &ast.StmtAltWhile{ + Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}}, }, }, }, @@ -2363,8 +2356,8 @@ func TestPrintStmtBreak(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Break{ - Expr: &scalar.Lnumber{Value: "1"}, + p.Print(&ast.StmtBreak{ + Expr: &ast.ScalarLnumber{Value: []byte("1")}, }) expected := "break 1;" @@ -2379,10 +2372,10 @@ func TestPrintStmtCase(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Case{ - Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}}, + p.Print(&ast.StmtCase{ + Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}}, }, }) @@ -2399,9 +2392,9 @@ func TestPrintStmtCaseEmpty(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Case{ - Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Stmts: []node.Node{}, + p.Print(&ast.StmtCase{ + Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Stmts: []ast.Vertex{}, }) expected := "case $a:" @@ -2416,16 +2409,16 @@ func TestPrintStmtCatch(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Namespace{ - Stmts: []node.Node{ - &stmt.Catch{ - Types: []node.Node{ - &name.Name{Parts: []node.Node{&name.NamePart{Value: "Exception"}}}, - &name.FullyQualified{Parts: []node.Node{&name.NamePart{Value: "RuntimeException"}}}, + p.Print(&ast.StmtNamespace{ + Stmts: []ast.Vertex{ + &ast.StmtCatch{ + Types: []ast.Vertex{ + &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Exception")}}}, + &ast.NameFullyQualified{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("RuntimeException")}}}, }, - Variable: &expr.Variable{VarName: &node.Identifier{Value: "e"}}, - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}}, + Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("e")}}, + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}}, }, }, }, @@ -2447,26 +2440,26 @@ func TestPrintStmtClassMethod(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.ClassMethod{ - Modifiers: []node.Node{&node.Identifier{Value: "public"}}, + p.Print(&ast.StmtClassMethod{ + Modifiers: []ast.Vertex{&ast.Identifier{Value: []byte("public")}}, ReturnsRef: true, - MethodName: &node.Identifier{Value: "foo"}, - Params: []node.Node{ - &node.Parameter{ + MethodName: &ast.Identifier{Value: []byte("foo")}, + Params: []ast.Vertex{ + &ast.Parameter{ ByRef: true, - VariableType: &node.Nullable{Expr: &name.Name{Parts: []node.Node{&name.NamePart{Value: "int"}}}}, - Variable: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - DefaultValue: &expr.ConstFetch{Constant: &name.Name{Parts: []node.Node{&name.NamePart{Value: "null"}}}}, + Type: &ast.Nullable{Expr: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("int")}}}}, + Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + DefaultValue: &ast.ExprConstFetch{Const: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("null")}}}}, }, - &node.Parameter{ + &ast.Parameter{ Variadic: true, - Variable: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }, }, - ReturnType: &name.Name{Parts: []node.Node{&name.NamePart{Value: "void"}}}, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}}, + ReturnType: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("void")}}}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}}, }, }, }) @@ -2485,24 +2478,24 @@ func TestPrintStmtAbstractClassMethod(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.ClassMethod{ - Modifiers: []node.Node{&node.Identifier{Value: "public"}}, + p.Print(&ast.StmtClassMethod{ + Modifiers: []ast.Vertex{&ast.Identifier{Value: []byte("public")}}, ReturnsRef: true, - MethodName: &node.Identifier{Value: "foo"}, - Params: []node.Node{ - &node.Parameter{ + MethodName: &ast.Identifier{Value: []byte("foo")}, + Params: []ast.Vertex{ + &ast.Parameter{ ByRef: true, - VariableType: &node.Nullable{Expr: &name.Name{Parts: []node.Node{&name.NamePart{Value: "int"}}}}, - Variable: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - DefaultValue: &expr.ConstFetch{Constant: &name.Name{Parts: []node.Node{&name.NamePart{Value: "null"}}}}, + Type: &ast.Nullable{Expr: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("int")}}}}, + Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + DefaultValue: &ast.ExprConstFetch{Const: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("null")}}}}, }, - &node.Parameter{ + &ast.Parameter{ Variadic: true, - Variable: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }, }, - ReturnType: &name.Name{Parts: []node.Node{&name.NamePart{Value: "void"}}}, - Stmt: &stmt.Nop{}, + ReturnType: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("void")}}}, + Stmt: &ast.StmtNop{}, }) expected := `public function &foo(?int &$a = null, ...$b): void;` @@ -2517,27 +2510,27 @@ func TestPrintStmtClass(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Namespace{ - Stmts: []node.Node{ - &stmt.Class{ - Modifiers: []node.Node{&node.Identifier{Value: "abstract"}}, - ClassName: &node.Identifier{Value: "Foo"}, - Extends: &stmt.ClassExtends{ - ClassName: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}}, + p.Print(&ast.StmtNamespace{ + Stmts: []ast.Vertex{ + &ast.StmtClass{ + Modifiers: []ast.Vertex{&ast.Identifier{Value: []byte("abstract")}}, + ClassName: &ast.Identifier{Value: []byte("Foo")}, + Extends: &ast.StmtClassExtends{ + ClassName: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Bar")}}}, }, - Implements: &stmt.ClassImplements{ - InterfaceNames: []node.Node{ - &name.Name{Parts: []node.Node{&name.NamePart{Value: "Baz"}}}, - &name.Name{Parts: []node.Node{&name.NamePart{Value: "Quuz"}}}, + Implements: &ast.StmtClassImplements{ + InterfaceNames: []ast.Vertex{ + &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Baz")}}}, + &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Quuz")}}}, }, }, - Stmts: []node.Node{ - &stmt.ClassConstList{ - Modifiers: []node.Node{&node.Identifier{Value: "public"}}, - Consts: []node.Node{ - &stmt.Constant{ - ConstantName: &node.Identifier{Value: "FOO"}, - Expr: &scalar.String{Value: "'bar'"}, + Stmts: []ast.Vertex{ + &ast.StmtClassConstList{ + Modifiers: []ast.Vertex{&ast.Identifier{Value: []byte("public")}}, + Consts: []ast.Vertex{ + &ast.StmtConstant{ + ConstantName: &ast.Identifier{Value: []byte("FOO")}, + Expr: &ast.ScalarString{Value: []byte("'bar'")}, }, }, }, @@ -2563,36 +2556,36 @@ func TestPrintStmtAnonymousClass(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Namespace{ - Stmts: []node.Node{ - &stmt.Class{ - Modifiers: []node.Node{&node.Identifier{Value: "abstract"}}, - ArgumentList: &node.ArgumentList{ - Arguments: []node.Node{ - &node.Argument{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, + p.Print(&ast.StmtNamespace{ + Stmts: []ast.Vertex{ + &ast.StmtClass{ + Modifiers: []ast.Vertex{&ast.Identifier{Value: []byte("abstract")}}, + ArgumentList: &ast.ArgumentList{ + Arguments: []ast.Vertex{ + &ast.Argument{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, }, - &node.Argument{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + &ast.Argument{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }, }, }, - Extends: &stmt.ClassExtends{ - ClassName: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}}, + Extends: &ast.StmtClassExtends{ + ClassName: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Bar")}}}, }, - Implements: &stmt.ClassImplements{ - InterfaceNames: []node.Node{ - &name.Name{Parts: []node.Node{&name.NamePart{Value: "Baz"}}}, - &name.Name{Parts: []node.Node{&name.NamePart{Value: "Quuz"}}}, + Implements: &ast.StmtClassImplements{ + InterfaceNames: []ast.Vertex{ + &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Baz")}}}, + &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Quuz")}}}, }, }, - Stmts: []node.Node{ - &stmt.ClassConstList{ - Modifiers: []node.Node{&node.Identifier{Value: "public"}}, - Consts: []node.Node{ - &stmt.Constant{ - ConstantName: &node.Identifier{Value: "FOO"}, - Expr: &scalar.String{Value: "'bar'"}, + Stmts: []ast.Vertex{ + &ast.StmtClassConstList{ + Modifiers: []ast.Vertex{&ast.Identifier{Value: []byte("public")}}, + Consts: []ast.Vertex{ + &ast.StmtConstant{ + ConstantName: &ast.Identifier{Value: []byte("FOO")}, + Expr: &ast.ScalarString{Value: []byte("'bar'")}, }, }, }, @@ -2618,16 +2611,16 @@ func TestPrintStmtClassConstList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.ClassConstList{ - Modifiers: []node.Node{&node.Identifier{Value: "public"}}, - Consts: []node.Node{ - &stmt.Constant{ - ConstantName: &node.Identifier{Value: "FOO"}, - Expr: &scalar.String{Value: "'a'"}, + p.Print(&ast.StmtClassConstList{ + Modifiers: []ast.Vertex{&ast.Identifier{Value: []byte("public")}}, + Consts: []ast.Vertex{ + &ast.StmtConstant{ + ConstantName: &ast.Identifier{Value: []byte("FOO")}, + Expr: &ast.ScalarString{Value: []byte("'a'")}, }, - &stmt.Constant{ - ConstantName: &node.Identifier{Value: "BAR"}, - Expr: &scalar.String{Value: "'b'"}, + &ast.StmtConstant{ + ConstantName: &ast.Identifier{Value: []byte("BAR")}, + Expr: &ast.ScalarString{Value: []byte("'b'")}, }, }, }) @@ -2644,9 +2637,9 @@ func TestPrintStmtConstant(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Constant{ - ConstantName: &node.Identifier{Value: "FOO"}, - Expr: &scalar.String{Value: "'BAR'"}, + p.Print(&ast.StmtConstant{ + ConstantName: &ast.Identifier{Value: []byte("FOO")}, + Expr: &ast.ScalarString{Value: []byte("'BAR'")}, }) expected := "FOO = 'BAR'" @@ -2661,8 +2654,8 @@ func TestPrintStmtContinue(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Continue{ - Expr: &scalar.Lnumber{Value: "1"}, + p.Print(&ast.StmtContinue{ + Expr: &ast.ScalarLnumber{Value: []byte("1")}, }) expected := `continue 1;` @@ -2677,18 +2670,18 @@ func TestPrintStmtDeclareStmts(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Declare{ - Consts: []node.Node{ - &stmt.Constant{ - ConstantName: &node.Identifier{Value: "FOO"}, - Expr: &scalar.String{Value: "'bar'"}, + p.Print(&ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtDeclare{ + Consts: []ast.Vertex{ + &ast.StmtConstant{ + ConstantName: &ast.Identifier{Value: []byte("FOO")}, + Expr: &ast.ScalarString{Value: []byte("'bar'")}, }, }, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Nop{}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtNop{}, }, }, }, @@ -2711,16 +2704,16 @@ func TestPrintStmtDeclareExpr(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Declare{ - Consts: []node.Node{ - &stmt.Constant{ - ConstantName: &node.Identifier{Value: "FOO"}, - Expr: &scalar.String{Value: "'bar'"}, + p.Print(&ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtDeclare{ + Consts: []ast.Vertex{ + &ast.StmtConstant{ + ConstantName: &ast.Identifier{Value: []byte("FOO")}, + Expr: &ast.ScalarString{Value: []byte("'bar'")}, }, }, - Stmt: &stmt.Expression{Expr: &scalar.String{Value: "'bar'"}}, + Stmt: &ast.StmtExpression{Expr: &ast.ScalarString{Value: []byte("'bar'")}}, }, }, }) @@ -2740,14 +2733,14 @@ func TestPrintStmtDeclareNop(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Declare{ - Consts: []node.Node{ - &stmt.Constant{ - ConstantName: &node.Identifier{Value: "FOO"}, - Expr: &scalar.String{Value: "'bar'"}, + p.Print(&ast.StmtDeclare{ + Consts: []ast.Vertex{ + &ast.StmtConstant{ + ConstantName: &ast.Identifier{Value: []byte("FOO")}, + Expr: &ast.ScalarString{Value: []byte("'bar'")}, }, }, - Stmt: &stmt.Nop{}, + Stmt: &ast.StmtNop{}, }) expected := `declare(FOO = 'bar');` @@ -2762,9 +2755,9 @@ func TestPrintStmtDefalut(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Default{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}}, + p.Print(&ast.StmtDefault{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}}, }, }) @@ -2781,8 +2774,8 @@ func TestPrintStmtDefalutEmpty(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Default{ - Stmts: []node.Node{}, + p.Print(&ast.StmtDefault{ + Stmts: []ast.Vertex{}, }) expected := `default:` @@ -2797,12 +2790,12 @@ func TestPrintStmtDo_Expression(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Namespace{ - Stmts: []node.Node{ - &stmt.Do{ - Cond: &scalar.Lnumber{Value: "1"}, - Stmt: &stmt.Expression{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, + p.Print(&ast.StmtNamespace{ + Stmts: []ast.Vertex{ + &ast.StmtDo{ + Cond: &ast.ScalarLnumber{Value: []byte("1")}, + Stmt: &ast.StmtExpression{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, }, }, }, @@ -2824,13 +2817,13 @@ func TestPrintStmtDo_StmtList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Namespace{ - Stmts: []node.Node{ - &stmt.Do{ - Cond: &scalar.Lnumber{Value: "1"}, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}}, + p.Print(&ast.StmtNamespace{ + Stmts: []ast.Vertex{ + &ast.StmtDo{ + Cond: &ast.ScalarLnumber{Value: []byte("1")}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}}, }, }, }, @@ -2853,10 +2846,10 @@ func TestPrintStmtEcho(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Echo{ - Exprs: []node.Node{ - &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.StmtEcho{ + Exprs: []ast.Vertex{ + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }, }) @@ -2872,11 +2865,11 @@ func TestPrintStmtElseIfStmts(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.ElseIf{ - Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Nop{}, + p.Print(&ast.StmtElseIf{ + Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtNop{}, }, }, }) @@ -2895,9 +2888,9 @@ func TestPrintStmtElseIfExpr(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.ElseIf{ - Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Stmt: &stmt.Expression{Expr: &scalar.String{Value: "'bar'"}}, + p.Print(&ast.StmtElseIf{ + Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Stmt: &ast.StmtExpression{Expr: &ast.ScalarString{Value: []byte("'bar'")}}, }) expected := `elseif ($a) @@ -2913,9 +2906,9 @@ func TestPrintStmtElseIfNop(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.ElseIf{ - Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Stmt: &stmt.Nop{}, + p.Print(&ast.StmtElseIf{ + Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Stmt: &ast.StmtNop{}, }) expected := `elseif ($a);` @@ -2930,10 +2923,10 @@ func TestPrintStmtElseStmts(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Else{ - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Nop{}, + p.Print(&ast.StmtElse{ + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtNop{}, }, }, }) @@ -2952,8 +2945,8 @@ func TestPrintStmtElseExpr(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Else{ - Stmt: &stmt.Expression{Expr: &scalar.String{Value: "'bar'"}}, + p.Print(&ast.StmtElse{ + Stmt: &ast.StmtExpression{Expr: &ast.ScalarString{Value: []byte("'bar'")}}, }) expected := `else @@ -2969,8 +2962,8 @@ func TestPrintStmtElseNop(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Else{ - Stmt: &stmt.Nop{}, + p.Print(&ast.StmtElse{ + Stmt: &ast.StmtNop{}, }) expected := `else;` @@ -2985,7 +2978,7 @@ func TestPrintExpression(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Expression{Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}}) + p.Print(&ast.StmtExpression{Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}}) expected := `$a;` actual := o.String() @@ -2999,11 +2992,11 @@ func TestPrintStmtFinally(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Namespace{ - Stmts: []node.Node{ - &stmt.Finally{ - Stmts: []node.Node{ - &stmt.Nop{}, + p.Print(&ast.StmtNamespace{ + Stmts: []ast.Vertex{ + &ast.StmtFinally{ + Stmts: []ast.Vertex{ + &ast.StmtNop{}, }, }, }, @@ -3025,24 +3018,24 @@ func TestPrintStmtForStmts(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Namespace{ - Stmts: []node.Node{ - &stmt.For{ - Init: []node.Node{ - &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.StmtNamespace{ + Stmts: []ast.Vertex{ + &ast.StmtFor{ + Init: []ast.Vertex{ + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }, - Cond: []node.Node{ - &expr.Variable{VarName: &node.Identifier{Value: "c"}}, - &expr.Variable{VarName: &node.Identifier{Value: "d"}}, + Cond: []ast.Vertex{ + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("c")}}, + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("d")}}, }, - Loop: []node.Node{ - &expr.Variable{VarName: &node.Identifier{Value: "e"}}, - &expr.Variable{VarName: &node.Identifier{Value: "f"}}, + Loop: []ast.Vertex{ + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("e")}}, + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("f")}}, }, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Nop{}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtNop{}, }, }, }, @@ -3065,19 +3058,19 @@ func TestPrintStmtForExpr(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Namespace{ - Stmts: []node.Node{ - &stmt.For{ - Init: []node.Node{ - &expr.Variable{VarName: &node.Identifier{Value: "a"}}, + p.Print(&ast.StmtNamespace{ + Stmts: []ast.Vertex{ + &ast.StmtFor{ + Init: []ast.Vertex{ + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, }, - Cond: []node.Node{ - &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + Cond: []ast.Vertex{ + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }, - Loop: []node.Node{ - &expr.Variable{VarName: &node.Identifier{Value: "c"}}, + Loop: []ast.Vertex{ + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("c")}}, }, - Stmt: &stmt.Expression{Expr: &scalar.String{Value: "'bar'"}}, + Stmt: &ast.StmtExpression{Expr: &ast.ScalarString{Value: []byte("'bar'")}}, }, }, }) @@ -3097,17 +3090,17 @@ func TestPrintStmtForNop(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.For{ - Init: []node.Node{ - &expr.Variable{VarName: &node.Identifier{Value: "a"}}, + p.Print(&ast.StmtFor{ + Init: []ast.Vertex{ + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, }, - Cond: []node.Node{ - &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + Cond: []ast.Vertex{ + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }, - Loop: []node.Node{ - &expr.Variable{VarName: &node.Identifier{Value: "c"}}, + Loop: []ast.Vertex{ + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("c")}}, }, - Stmt: &stmt.Nop{}, + Stmt: &ast.StmtNop{}, }) expected := `for ($a; $b; $c);` @@ -3122,14 +3115,14 @@ func TestPrintStmtForeachStmts(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Namespace{ - Stmts: []node.Node{ - &stmt.Foreach{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Variable: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Nop{}, + p.Print(&ast.StmtNamespace{ + Stmts: []ast.Vertex{ + &ast.StmtForeach{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtNop{}, }, }, }, @@ -3152,13 +3145,13 @@ func TestPrintStmtForeachExpr(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Namespace{ - Stmts: []node.Node{ - &stmt.Foreach{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Key: &expr.Variable{VarName: &node.Identifier{Value: "k"}}, - Variable: &expr.Variable{VarName: &node.Identifier{Value: "v"}}, - Stmt: &stmt.Expression{Expr: &scalar.String{Value: "'bar'"}}, + p.Print(&ast.StmtNamespace{ + Stmts: []ast.Vertex{ + &ast.StmtForeach{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Key: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("k")}}, + Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("v")}}, + Stmt: &ast.StmtExpression{Expr: &ast.ScalarString{Value: []byte("'bar'")}}, }, }, }) @@ -3178,11 +3171,11 @@ func TestPrintStmtForeachNop(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Foreach{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Key: &expr.Variable{VarName: &node.Identifier{Value: "k"}}, - Variable: &expr.Reference{Variable: &expr.Variable{VarName: &node.Identifier{Value: "v"}}}, - Stmt: &stmt.Nop{}, + p.Print(&ast.StmtForeach{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Key: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("k")}}, + Var: &ast.ExprReference{Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("v")}}}, + Stmt: &ast.StmtNop{}, }) expected := `foreach ($a as $k => &$v);` @@ -3197,21 +3190,21 @@ func TestPrintStmtFunction(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Namespace{ - Stmts: []node.Node{ - &stmt.Function{ + p.Print(&ast.StmtNamespace{ + Stmts: []ast.Vertex{ + &ast.StmtFunction{ ReturnsRef: true, - FunctionName: &node.Identifier{Value: "foo"}, - Params: []node.Node{ - &node.Parameter{ + FunctionName: &ast.Identifier{Value: []byte("foo")}, + Params: []ast.Vertex{ + &ast.Parameter{ ByRef: true, Variadic: false, - Variable: &expr.Variable{VarName: &node.Identifier{Value: "var"}}, + Var: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("var")}}, }, }, - ReturnType: &name.FullyQualified{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, - Stmts: []node.Node{ - &stmt.Nop{}, + ReturnType: &ast.NameFullyQualified{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, + Stmts: []ast.Vertex{ + &ast.StmtNop{}, }, }, }, @@ -3233,10 +3226,10 @@ func TestPrintStmtGlobal(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Global{ - Vars: []node.Node{ - &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.StmtGlobal{ + Vars: []ast.Vertex{ + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }, }) @@ -3252,8 +3245,8 @@ func TestPrintStmtGoto(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Goto{ - Label: &node.Identifier{Value: "FOO"}, + p.Print(&ast.StmtGoto{ + Label: &ast.Identifier{Value: []byte("FOO")}, }) expected := `goto FOO;` @@ -3268,16 +3261,16 @@ func TestPrintStmtGroupUse(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.GroupUse{ - UseType: &node.Identifier{Value: "function"}, - Prefix: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, - UseList: []node.Node{ - &stmt.Use{ - Use: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}}, - Alias: &node.Identifier{Value: "Baz"}, + p.Print(&ast.StmtGroupUse{ + UseType: &ast.Identifier{Value: []byte("function")}, + Prefix: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, + UseList: []ast.Vertex{ + &ast.StmtUse{ + Use: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Bar")}}}, + Alias: &ast.Identifier{Value: []byte("Baz")}, }, - &stmt.Use{ - Use: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Quuz"}}}, + &ast.StmtUse{ + Use: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Quuz")}}}, }, }, }) @@ -3294,7 +3287,7 @@ func TestPrintHaltCompiler(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.HaltCompiler{}) + p.Print(&ast.StmtHaltCompiler{}) expected := `__halt_compiler();` actual := o.String() @@ -3308,32 +3301,32 @@ func TestPrintIfExpression(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Namespace{ - Stmts: []node.Node{ - &stmt.If{ - Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Stmt: &stmt.Expression{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.StmtNamespace{ + Stmts: []ast.Vertex{ + &ast.StmtIf{ + Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Stmt: &ast.StmtExpression{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }, - ElseIf: []node.Node{ - &stmt.ElseIf{ - Cond: &expr.Variable{VarName: &node.Identifier{Value: "c"}}, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "d"}}, + ElseIf: []ast.Vertex{ + &ast.StmtElseIf{ + Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("c")}}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("d")}}, }, }, }, }, - &stmt.ElseIf{ - Cond: &expr.Variable{VarName: &node.Identifier{Value: "e"}}, - Stmt: &stmt.Nop{}, + &ast.StmtElseIf{ + Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("e")}}, + Stmt: &ast.StmtNop{}, }, }, - Else: &stmt.Else{ - Stmt: &stmt.Expression{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "f"}}, + Else: &ast.StmtElse{ + Stmt: &ast.StmtExpression{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("f")}}, }, }, }, @@ -3361,14 +3354,14 @@ func TestPrintIfStmtList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.Namespace{ - Stmts: []node.Node{ - &stmt.If{ - Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{ - Expr: &expr.Variable{VarName: &node.Identifier{Value: "b"}}, + p.Print(&ast.StmtNamespace{ + Stmts: []ast.Vertex{ + &ast.StmtIf{ + Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{ + Expr: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("b")}}, }, }, }, @@ -3392,9 +3385,9 @@ func TestPrintIfNop(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.If{ - Cond: &expr.Variable{VarName: &node.Identifier{Value: "a"}}, - Stmt: &stmt.Nop{}, + p.Print(&ast.StmtIf{ + Cond: &ast.ExprVariable{VarName: &ast.Identifier{Value: []byte("a")}}, + Stmt: &ast.StmtNop{}, }) expected := `if ($a);` @@ -3409,8 +3402,8 @@ func TestPrintInlineHtml(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrettyPrinter(o, " ") - p.Print(&stmt.InlineHtml{ - Value: "test", + p.Print(&ast.StmtInlineHtml{ + Value: []byte("test"), }) expected := `?>test 0 { + io.WriteString(p.w, glue) + } + + p.Print(n) + } +} + +func (p *Printer) printNodes(nn []ast.Vertex) { + for _, n := range nn { + p.Print(n) + } +} + +func (p *Printer) printFreeFloating(n ast.Vertex, pos token.Position) { + if n == nil { + return + } + + for _, m := range n.GetNode().Tokens[pos] { + io.WriteString(p.w, string(m.Value)) + } +} + +func (p *Printer) printNode(n ast.Vertex) { + switch n.(type) { + + // node + + case *ast.Root: + p.printNodeRoot(n) + case *ast.Identifier: + p.printNodeIdentifier(n) + case *ast.Parameter: + p.printNodeParameter(n) + case *ast.Nullable: + p.printNodeNullable(n) + case *ast.Argument: + p.printNodeArgument(n) + + // name + + case *ast.NameNamePart: + p.printNameNamePart(n) + case *ast.NameName: + p.printNameName(n) + case *ast.NameFullyQualified: + p.printNameFullyQualified(n) + case *ast.NameRelative: + p.printNameRelative(n) + + // scalar + + case *ast.ScalarLnumber: + p.printScalarLNumber(n) + case *ast.ScalarDnumber: + p.printScalarDNumber(n) + case *ast.ScalarString: + p.printScalarString(n) + case *ast.ScalarEncapsedStringPart: + p.printScalarEncapsedStringPart(n) + case *ast.ScalarEncapsed: + p.printScalarEncapsed(n) + case *ast.ScalarHeredoc: + p.printScalarHeredoc(n) + case *ast.ScalarMagicConstant: + p.printScalarMagicConstant(n) + + // assign + + case *ast.ExprAssign: + p.printAssign(n) + case *ast.ExprAssignReference: + p.printAssignReference(n) + case *ast.ExprAssignBitwiseAnd: + p.printAssignBitwiseAnd(n) + case *ast.ExprAssignBitwiseOr: + p.printAssignBitwiseOr(n) + case *ast.ExprAssignBitwiseXor: + p.printAssignBitwiseXor(n) + case *ast.ExprAssignCoalesce: + p.printAssignCoalesce(n) + case *ast.ExprAssignConcat: + p.printAssignConcat(n) + case *ast.ExprAssignDiv: + p.printAssignDiv(n) + case *ast.ExprAssignMinus: + p.printAssignMinus(n) + case *ast.ExprAssignMod: + p.printAssignMod(n) + case *ast.ExprAssignMul: + p.printAssignMul(n) + case *ast.ExprAssignPlus: + p.printAssignPlus(n) + case *ast.ExprAssignPow: + p.printAssignPow(n) + case *ast.ExprAssignShiftLeft: + p.printAssignShiftLeft(n) + case *ast.ExprAssignShiftRight: + p.printAssignShiftRight(n) + + // binary + + case *ast.ExprBinaryBitwiseAnd: + p.printBinaryBitwiseAnd(n) + case *ast.ExprBinaryBitwiseOr: + p.printBinaryBitwiseOr(n) + case *ast.ExprBinaryBitwiseXor: + p.printBinaryBitwiseXor(n) + case *ast.ExprBinaryBooleanAnd: + p.printBinaryBooleanAnd(n) + case *ast.ExprBinaryBooleanOr: + p.printBinaryBooleanOr(n) + case *ast.ExprBinaryCoalesce: + p.printBinaryCoalesce(n) + case *ast.ExprBinaryConcat: + p.printBinaryConcat(n) + case *ast.ExprBinaryDiv: + p.printBinaryDiv(n) + case *ast.ExprBinaryEqual: + p.printBinaryEqual(n) + case *ast.ExprBinaryGreaterOrEqual: + p.printBinaryGreaterOrEqual(n) + case *ast.ExprBinaryGreater: + p.printBinaryGreater(n) + case *ast.ExprBinaryIdentical: + p.printBinaryIdentical(n) + case *ast.ExprBinaryLogicalAnd: + p.printBinaryLogicalAnd(n) + case *ast.ExprBinaryLogicalOr: + p.printBinaryLogicalOr(n) + case *ast.ExprBinaryLogicalXor: + p.printBinaryLogicalXor(n) + case *ast.ExprBinaryMinus: + p.printBinaryMinus(n) + case *ast.ExprBinaryMod: + p.printBinaryMod(n) + case *ast.ExprBinaryMul: + p.printBinaryMul(n) + case *ast.ExprBinaryNotEqual: + p.printBinaryNotEqual(n) + case *ast.ExprBinaryNotIdentical: + p.printBinaryNotIdentical(n) + case *ast.ExprBinaryPlus: + p.printBinaryPlus(n) + case *ast.ExprBinaryPow: + p.printBinaryPow(n) + case *ast.ExprBinaryShiftLeft: + p.printBinaryShiftLeft(n) + case *ast.ExprBinaryShiftRight: + p.printBinaryShiftRight(n) + case *ast.ExprBinarySmallerOrEqual: + p.printBinarySmallerOrEqual(n) + case *ast.ExprBinarySmaller: + p.printBinarySmaller(n) + case *ast.ExprBinarySpaceship: + p.printBinarySpaceship(n) + + // cast + + case *ast.ExprCastArray: + p.printArray(n) + case *ast.ExprCastBool: + p.printBool(n) + case *ast.ExprCastDouble: + p.printDouble(n) + case *ast.ExprCastInt: + p.printInt(n) + case *ast.ExprCastObject: + p.printObject(n) + case *ast.ExprCastString: + p.printString(n) + case *ast.ExprCastUnset: + p.printUnset(n) + + // expr + + case *ast.ExprArrayDimFetch: + p.printExprArrayDimFetch(n) + case *ast.ExprArrayItem: + p.printExprArrayItem(n) + case *ast.ExprArray: + p.printExprArray(n) + case *ast.ExprArrowFunction: + p.printExprArrowFunction(n) + case *ast.ExprBitwiseNot: + p.printExprBitwiseNot(n) + case *ast.ExprBooleanNot: + p.printExprBooleanNot(n) + case *ast.ExprClassConstFetch: + p.printExprClassConstFetch(n) + case *ast.ExprClone: + p.printExprClone(n) + case *ast.ExprClosureUse: + p.printExprClosureUse(n) + case *ast.ExprClosure: + p.printExprClosure(n) + case *ast.ExprConstFetch: + p.printExprConstFetch(n) + case *ast.ExprEmpty: + p.printExprEmpty(n) + case *ast.ExprErrorSuppress: + p.printExprErrorSuppress(n) + case *ast.ExprEval: + p.printExprEval(n) + case *ast.ExprExit: + p.printExprExit(n) + case *ast.ExprFunctionCall: + p.printExprFunctionCall(n) + case *ast.ExprInclude: + p.printExprInclude(n) + case *ast.ExprIncludeOnce: + p.printExprIncludeOnce(n) + case *ast.ExprInstanceOf: + p.printExprInstanceOf(n) + case *ast.ExprIsset: + p.printExprIsset(n) + case *ast.ExprList: + p.printExprList(n) + case *ast.ExprMethodCall: + p.printExprMethodCall(n) + case *ast.ExprNew: + p.printExprNew(n) + case *ast.ExprPostDec: + p.printExprPostDec(n) + case *ast.ExprPostInc: + p.printExprPostInc(n) + case *ast.ExprPreDec: + p.printExprPreDec(n) + case *ast.ExprPreInc: + p.printExprPreInc(n) + case *ast.ExprPrint: + p.printExprPrint(n) + case *ast.ExprPropertyFetch: + p.printExprPropertyFetch(n) + case *ast.ExprReference: + p.printExprReference(n) + case *ast.ExprRequire: + p.printExprRequire(n) + case *ast.ExprRequireOnce: + p.printExprRequireOnce(n) + case *ast.ExprShellExec: + p.printExprShellExec(n) + case *ast.ExprShortArray: + p.printExprShortArray(n) + case *ast.ExprShortList: + p.printExprShortList(n) + case *ast.ExprStaticCall: + p.printExprStaticCall(n) + case *ast.ExprStaticPropertyFetch: + p.printExprStaticPropertyFetch(n) + case *ast.ExprTernary: + p.printExprTernary(n) + case *ast.ExprUnaryMinus: + p.printExprUnaryMinus(n) + case *ast.ExprUnaryPlus: + p.printExprUnaryPlus(n) + case *ast.ExprVariable: + p.printExprVariable(n) + case *ast.ExprYieldFrom: + p.printExprYieldFrom(n) + case *ast.ExprYield: + p.printExprYield(n) + + // stmt + + case *ast.StmtAltElseIf: + p.printStmtAltElseIf(n) + case *ast.StmtAltElse: + p.printStmtAltElse(n) + case *ast.StmtAltFor: + p.printStmtAltFor(n) + case *ast.StmtAltForeach: + p.printStmtAltForeach(n) + case *ast.StmtAltIf: + p.printStmtAltIf(n) + case *ast.StmtAltSwitch: + p.printStmtAltSwitch(n) + case *ast.StmtAltWhile: + p.printStmtAltWhile(n) + case *ast.StmtBreak: + p.printStmtBreak(n) + case *ast.StmtCase: + p.printStmtCase(n) + case *ast.StmtCatch: + p.printStmtCatch(n) + case *ast.StmtClassMethod: + p.printStmtClassMethod(n) + case *ast.StmtClass: + p.printStmtClass(n) + case *ast.StmtClassConstList: + p.printStmtClassConstList(n) + case *ast.StmtConstList: + p.printStmtConstList(n) + case *ast.StmtConstant: + p.printStmtConstant(n) + case *ast.StmtContinue: + p.printStmtContinue(n) + case *ast.StmtDeclare: + p.printStmtDeclare(n) + case *ast.StmtDefault: + p.printStmtDefault(n) + case *ast.StmtDo: + p.printStmtDo(n) + case *ast.StmtEcho: + p.printStmtEcho(n) + case *ast.StmtElseIf: + p.printStmtElseif(n) + case *ast.StmtElse: + p.printStmtElse(n) + case *ast.StmtExpression: + p.printStmtExpression(n) + case *ast.StmtFinally: + p.printStmtFinally(n) + case *ast.StmtFor: + p.printStmtFor(n) + case *ast.StmtForeach: + p.printStmtForeach(n) + case *ast.StmtFunction: + p.printStmtFunction(n) + case *ast.StmtGlobal: + p.printStmtGlobal(n) + case *ast.StmtGoto: + p.printStmtGoto(n) + case *ast.StmtGroupUse: + p.printStmtGroupUse(n) + case *ast.StmtHaltCompiler: + p.printStmtHaltCompiler(n) + case *ast.StmtIf: + p.printStmtIf(n) + case *ast.StmtInlineHtml: + p.printStmtInlineHTML(n) + case *ast.StmtInterface: + p.printStmtInterface(n) + case *ast.StmtLabel: + p.printStmtLabel(n) + case *ast.StmtNamespace: + p.printStmtNamespace(n) + case *ast.StmtNop: + p.printStmtNop(n) + case *ast.StmtPropertyList: + p.printStmtPropertyList(n) + case *ast.StmtProperty: + p.printStmtProperty(n) + case *ast.StmtReturn: + p.printStmtReturn(n) + case *ast.StmtStaticVar: + p.printStmtStaticVar(n) + case *ast.StmtStatic: + p.printStmtStatic(n) + case *ast.StmtStmtList: + p.printStmtStmtList(n) + case *ast.StmtSwitch: + p.printStmtSwitch(n) + case *ast.StmtThrow: + p.printStmtThrow(n) + case *ast.StmtTraitAdaptationList: + p.printStmtTraitAdaptationList(n) + case *ast.StmtTraitMethodRef: + p.printStmtTraitMethodRef(n) + case *ast.StmtTraitUseAlias: + p.printStmtTraitUseAlias(n) + case *ast.StmtTraitUsePrecedence: + p.printStmtTraitUsePrecedence(n) + case *ast.StmtTraitUse: + p.printStmtTraitUse(n) + case *ast.StmtTrait: + p.printStmtTrait(n) + case *ast.StmtTry: + p.printStmtTry(n) + case *ast.StmtUnset: + p.printStmtUnset(n) + case *ast.StmtUseList: + p.printStmtUseList(n) + case *ast.StmtUse: + p.printStmtUse(n) + case *ast.StmtWhile: + p.printStmtWhile(n) + } +} + +// node + +func (p *Printer) printNodeRoot(n ast.Vertex) { + nn := n.(*ast.Root) + p.SetState(HtmlState) + p.printFreeFloating(nn, token.Start) + p.printNodes(nn.Stmts) + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printNodeIdentifier(n ast.Vertex) { + nn := n.(*ast.Identifier) + p.printFreeFloating(nn, token.Start) + io.WriteString(p.w, string(nn.Value)) + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printNodeParameter(n ast.Vertex) { + nn := n.(*ast.Parameter) + p.printFreeFloating(nn, token.Start) + + 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) + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printNodeNullable(n ast.Vertex) { + nn := n.(*ast.Nullable) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "?") + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printNodeArgument(n ast.Vertex) { + nn := n.(*ast.Argument) + p.printFreeFloating(nn, token.Start) + + if nn.IsReference { + io.WriteString(p.w, "&") + } + p.printFreeFloating(nn, token.Ampersand) + + if nn.Variadic { + io.WriteString(p.w, "...") + } + p.printFreeFloating(nn, token.Variadic) + + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +// name + +func (p *Printer) printNameNamePart(n ast.Vertex) { + nn := n.(*ast.NameNamePart) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, string(nn.Value)) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printNameName(n ast.Vertex) { + nn := n.(*ast.NameName) + p.printFreeFloating(nn, token.Start) + + p.joinPrint("\\", nn.Parts) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printNameFullyQualified(n ast.Vertex) { + nn := n.(*ast.NameFullyQualified) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "\\") + p.joinPrint("\\", nn.Parts) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printNameRelative(n ast.Vertex) { + nn := n.(*ast.NameRelative) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "namespace") + p.printFreeFloating(nn, token.Namespace) + + for _, part := range nn.Parts { + io.WriteString(p.w, "\\") + p.Print(part) + } + + p.printFreeFloating(nn, token.End) +} + +// scalar + +func (p *Printer) printScalarLNumber(n ast.Vertex) { + nn := n.(*ast.ScalarLnumber) + p.printFreeFloating(nn, token.Start) + io.WriteString(p.w, string(nn.Value)) + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printScalarDNumber(n ast.Vertex) { + nn := n.(*ast.ScalarDnumber) + p.printFreeFloating(nn, token.Start) + io.WriteString(p.w, string(nn.Value)) + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printScalarString(n ast.Vertex) { + nn := n.(*ast.ScalarString) + p.printFreeFloating(nn, token.Start) + io.WriteString(p.w, string(nn.Value)) + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printScalarEncapsedStringPart(n ast.Vertex) { + nn := n.(*ast.ScalarEncapsedStringPart) + p.printFreeFloating(nn, token.Start) + io.WriteString(p.w, string(nn.Value)) + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printScalarEncapsed(n ast.Vertex) { + nn := n.(*ast.ScalarEncapsed) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "\"") + for _, part := range nn.Parts { + switch part.(type) { + case *ast.ExprArrayDimFetch: + s := part.GetNode().Tokens[token.Start] + if len(s) > 0 && string(s[0].Value) == "${" { + p.printExprArrayDimFetchWithoutLeadingDollar(part) + } else { + p.Print(part) + } + case *ast.ExprVariable: + s := part.GetNode().Tokens[token.Start] + if len(s) > 0 && string(s[0].Value) == "${" { + p.printExprVariableWithoutLeadingDollar(part) + } else { + p.Print(part) + } + default: + p.Print(part) + } + } + io.WriteString(p.w, "\"") + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printScalarHeredoc(n ast.Vertex) { + nn := n.(*ast.ScalarHeredoc) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, string(nn.Label)) + + for _, part := range nn.Parts { + switch part.(type) { + case *ast.ExprArrayDimFetch: + s := part.GetNode().Tokens[token.Start] + if len(s) > 0 && string(s[0].Value) == "${" { + p.printExprArrayDimFetchWithoutLeadingDollar(part) + } else { + p.Print(part) + } + case *ast.ExprVariable: + s := part.GetNode().Tokens[token.Start] + if len(s) > 0 && string(s[0].Value) == "${" { + p.printExprVariableWithoutLeadingDollar(part) + } else { + p.Print(part) + } + default: + p.Print(part) + } + } + + io.WriteString(p.w, strings.Trim(string(nn.Label), "<\"'\n")) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printScalarMagicConstant(n ast.Vertex) { + nn := n.(*ast.ScalarMagicConstant) + p.printFreeFloating(nn, token.Start) + io.WriteString(p.w, string(nn.Value)) + p.printFreeFloating(nn, token.End) +} + +// Assign + +func (p *Printer) printAssign(n ast.Vertex) { + nn := n.(*ast.ExprAssign) + p.printFreeFloating(nn, token.Start) + p.Print(nn.Var) + p.printFreeFloating(nn, token.Var) + io.WriteString(p.w, "=") + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printAssignReference(n ast.Vertex) { + nn := n.(*ast.ExprAssignReference) + p.printFreeFloating(nn, token.Start) + p.Print(nn.Var) + p.printFreeFloating(nn, token.Var) + io.WriteString(p.w, "=") + p.printFreeFloating(nn, token.Equal) + io.WriteString(p.w, "&") + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printAssignBitwiseAnd(n ast.Vertex) { + nn := n.(*ast.ExprAssignBitwiseAnd) + p.printFreeFloating(nn, token.Start) + p.Print(nn.Var) + p.printFreeFloating(nn, token.Var) + io.WriteString(p.w, "&") + io.WriteString(p.w, "=") + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printAssignBitwiseOr(n ast.Vertex) { + nn := n.(*ast.ExprAssignBitwiseOr) + p.printFreeFloating(nn, token.Start) + p.Print(nn.Var) + p.printFreeFloating(nn, token.Var) + io.WriteString(p.w, "|=") + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printAssignBitwiseXor(n ast.Vertex) { + nn := n.(*ast.ExprAssignBitwiseXor) + p.printFreeFloating(nn, token.Start) + p.Print(nn.Var) + p.printFreeFloating(nn, token.Var) + io.WriteString(p.w, "^=") + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printAssignCoalesce(n ast.Vertex) { + nn := n.(*ast.ExprAssignCoalesce) + p.printFreeFloating(nn, token.Start) + p.Print(nn.Var) + p.printFreeFloating(nn, token.Var) + io.WriteString(p.w, "??=") + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printAssignConcat(n ast.Vertex) { + nn := n.(*ast.ExprAssignConcat) + p.printFreeFloating(nn, token.Start) + p.Print(nn.Var) + p.printFreeFloating(nn, token.Var) + io.WriteString(p.w, ".=") + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printAssignDiv(n ast.Vertex) { + nn := n.(*ast.ExprAssignDiv) + p.printFreeFloating(nn, token.Start) + p.Print(nn.Var) + p.printFreeFloating(nn, token.Var) + io.WriteString(p.w, "/=") + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printAssignMinus(n ast.Vertex) { + nn := n.(*ast.ExprAssignMinus) + p.printFreeFloating(nn, token.Start) + p.Print(nn.Var) + p.printFreeFloating(nn, token.Var) + io.WriteString(p.w, "-=") + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printAssignMod(n ast.Vertex) { + nn := n.(*ast.ExprAssignMod) + p.printFreeFloating(nn, token.Start) + p.Print(nn.Var) + p.printFreeFloating(nn, token.Var) + io.WriteString(p.w, "%=") + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printAssignMul(n ast.Vertex) { + nn := n.(*ast.ExprAssignMul) + p.printFreeFloating(nn, token.Start) + p.Print(nn.Var) + p.printFreeFloating(nn, token.Var) + io.WriteString(p.w, "*=") + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printAssignPlus(n ast.Vertex) { + nn := n.(*ast.ExprAssignPlus) + p.printFreeFloating(nn, token.Start) + p.Print(nn.Var) + p.printFreeFloating(nn, token.Var) + io.WriteString(p.w, "+=") + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printAssignPow(n ast.Vertex) { + nn := n.(*ast.ExprAssignPow) + p.printFreeFloating(nn, token.Start) + p.Print(nn.Var) + p.printFreeFloating(nn, token.Var) + io.WriteString(p.w, "**=") + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printAssignShiftLeft(n ast.Vertex) { + nn := n.(*ast.ExprAssignShiftLeft) + p.printFreeFloating(nn, token.Start) + p.Print(nn.Var) + p.printFreeFloating(nn, token.Var) + io.WriteString(p.w, "<<=") + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printAssignShiftRight(n ast.Vertex) { + nn := n.(*ast.ExprAssignShiftRight) + p.printFreeFloating(nn, token.Start) + p.Print(nn.Var) + p.printFreeFloating(nn, token.Var) + io.WriteString(p.w, ">>=") + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +// binary + +func (p *Printer) printBinaryBitwiseAnd(n ast.Vertex) { + nn := n.(*ast.ExprBinaryBitwiseAnd) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, "&") + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinaryBitwiseOr(n ast.Vertex) { + nn := n.(*ast.ExprBinaryBitwiseOr) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, "|") + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinaryBitwiseXor(n ast.Vertex) { + nn := n.(*ast.ExprBinaryBitwiseXor) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, "^") + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinaryBooleanAnd(n ast.Vertex) { + nn := n.(*ast.ExprBinaryBooleanAnd) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, "&&") + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinaryBooleanOr(n ast.Vertex) { + nn := n.(*ast.ExprBinaryBooleanOr) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, "||") + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinaryCoalesce(n ast.Vertex) { + nn := n.(*ast.ExprBinaryCoalesce) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, "??") + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinaryConcat(n ast.Vertex) { + nn := n.(*ast.ExprBinaryConcat) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, ".") + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinaryDiv(n ast.Vertex) { + nn := n.(*ast.ExprBinaryDiv) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, "/") + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinaryEqual(n ast.Vertex) { + nn := n.(*ast.ExprBinaryEqual) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, "==") + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinaryGreaterOrEqual(n ast.Vertex) { + nn := n.(*ast.ExprBinaryGreaterOrEqual) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, ">=") + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinaryGreater(n ast.Vertex) { + nn := n.(*ast.ExprBinaryGreater) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, ">") + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinaryIdentical(n ast.Vertex) { + nn := n.(*ast.ExprBinaryIdentical) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, "===") + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinaryLogicalAnd(n ast.Vertex) { + nn := n.(*ast.ExprBinaryLogicalAnd) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + io.WriteString(p.w, "and") + if nn.Right.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinaryLogicalOr(n ast.Vertex) { + nn := n.(*ast.ExprBinaryLogicalOr) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + io.WriteString(p.w, "or") + if nn.Right.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinaryLogicalXor(n ast.Vertex) { + nn := n.(*ast.ExprBinaryLogicalXor) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + io.WriteString(p.w, "xor") + if nn.Right.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinaryMinus(n ast.Vertex) { + nn := n.(*ast.ExprBinaryMinus) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, "-") + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinaryMod(n ast.Vertex) { + nn := n.(*ast.ExprBinaryMod) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, "%") + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinaryMul(n ast.Vertex) { + nn := n.(*ast.ExprBinaryMul) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, "*") + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinaryNotEqual(n ast.Vertex) { + nn := n.(*ast.ExprBinaryNotEqual) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + p.printFreeFloating(nn, token.Equal) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, "!=") + } + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinaryNotIdentical(n ast.Vertex) { + nn := n.(*ast.ExprBinaryNotIdentical) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, "!==") + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinaryPlus(n ast.Vertex) { + nn := n.(*ast.ExprBinaryPlus) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, "+") + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinaryPow(n ast.Vertex) { + nn := n.(*ast.ExprBinaryPow) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, "**") + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinaryShiftLeft(n ast.Vertex) { + nn := n.(*ast.ExprBinaryShiftLeft) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, "<<") + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinaryShiftRight(n ast.Vertex) { + nn := n.(*ast.ExprBinaryShiftRight) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, ">>") + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinarySmallerOrEqual(n ast.Vertex) { + nn := n.(*ast.ExprBinarySmallerOrEqual) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, "<=") + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinarySmaller(n ast.Vertex) { + nn := n.(*ast.ExprBinarySmaller) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, "<") + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBinarySpaceship(n ast.Vertex) { + nn := n.(*ast.ExprBinarySpaceship) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Left) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, "<=>") + p.Print(nn.Right) + + p.printFreeFloating(nn, token.End) +} + +// cast + +func (p *Printer) printArray(n ast.Vertex) { + nn := n.(*ast.ExprCastArray) + p.printFreeFloating(nn, token.Start) + + p.printFreeFloating(nn, token.Cast) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, "(array)") + } + + p.Print(nn.Expr) + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printBool(n ast.Vertex) { + nn := n.(*ast.ExprCastBool) + p.printFreeFloating(nn, token.Start) + + p.printFreeFloating(nn, token.Cast) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, "(boolean)") + } + + p.Print(nn.Expr) + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printDouble(n ast.Vertex) { + nn := n.(*ast.ExprCastDouble) + p.printFreeFloating(nn, token.Start) + + p.printFreeFloating(nn, token.Cast) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, "(float)") + } + + p.Print(nn.Expr) + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printInt(n ast.Vertex) { + nn := n.(*ast.ExprCastInt) + p.printFreeFloating(nn, token.Start) + + p.printFreeFloating(nn, token.Cast) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, "(integer)") + } + + p.Print(nn.Expr) + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printObject(n ast.Vertex) { + nn := n.(*ast.ExprCastObject) + p.printFreeFloating(nn, token.Start) + + p.printFreeFloating(nn, token.Cast) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, "(object)") + } + + p.Print(nn.Expr) + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printString(n ast.Vertex) { + nn := n.(*ast.ExprCastString) + p.printFreeFloating(nn, token.Start) + + p.printFreeFloating(nn, token.Cast) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, "(string)") + } + + p.Print(nn.Expr) + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printUnset(n ast.Vertex) { + nn := n.(*ast.ExprCastUnset) + p.printFreeFloating(nn, token.Start) + + p.printFreeFloating(nn, token.Cast) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, "(unset)") + } + + p.Print(nn.Expr) + p.printFreeFloating(nn, token.End) +} + +// expr + +func (p *Printer) printExprArrayDimFetch(n ast.Vertex) { + nn := n.(*ast.ExprArrayDimFetch) + p.printFreeFloating(nn, token.Start) + p.Print(nn.Var) + p.printFreeFloating(nn, token.Var) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, "[") + } + p.Print(nn.Dim) + p.printFreeFloating(nn, token.Expr) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, "]") + } + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprArrayDimFetchWithoutLeadingDollar(n ast.Vertex) { + nn := n.(*ast.ExprArrayDimFetch) + p.printFreeFloating(nn, token.Start) + p.printExprVariableWithoutLeadingDollar(nn.Var) + p.printFreeFloating(nn, token.Var) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, "[") + } + p.Print(nn.Dim) + p.printFreeFloating(nn, token.Expr) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, "]") + } + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprArrayItem(n ast.Vertex) { + nn := n.(*ast.ExprArrayItem) + p.printFreeFloating(nn, token.Start) + + if nn.Unpack { + io.WriteString(p.w, "...") + } + + if nn.Key != nil { + p.Print(nn.Key) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, "=>") + } + + p.Print(nn.Val) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprArray(n ast.Vertex) { + nn := n.(*ast.ExprArray) + p.printFreeFloating(nn, token.Start) + io.WriteString(p.w, "array") + p.printFreeFloating(nn, token.Array) + io.WriteString(p.w, "(") + p.joinPrint(",", nn.Items) + p.printFreeFloating(nn, token.ArrayPairList) + io.WriteString(p.w, ")") + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprArrowFunction(n ast.Vertex) { + nn := n.(*ast.ExprArrowFunction) + p.printFreeFloating(nn, token.Start) + + if nn.Static { + io.WriteString(p.w, "static") + } + p.printFreeFloating(nn, token.Static) + if nn.Static && n.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + + io.WriteString(p.w, "fn") + p.printFreeFloating(nn, token.Function) + + if nn.ReturnsRef { + io.WriteString(p.w, "&") + } + p.printFreeFloating(nn, token.Ampersand) + + io.WriteString(p.w, "(") + p.joinPrint(",", nn.Params) + p.printFreeFloating(nn, token.ParameterList) + io.WriteString(p.w, ")") + p.printFreeFloating(nn, token.Params) + + if nn.ReturnType != nil { + io.WriteString(p.w, ":") + p.Print(nn.ReturnType) + } + p.printFreeFloating(nn, token.ReturnType) + + io.WriteString(p.w, "=>") + + p.printNode(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprBitwiseNot(n ast.Vertex) { + nn := n.(*ast.ExprBitwiseNot) + p.printFreeFloating(nn, token.Start) + io.WriteString(p.w, "~") + p.Print(nn.Expr) + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprBooleanNot(n ast.Vertex) { + nn := n.(*ast.ExprBooleanNot) + p.printFreeFloating(nn, token.Start) + io.WriteString(p.w, "!") + p.Print(nn.Expr) + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprClassConstFetch(n ast.Vertex) { + nn := n.(*ast.ExprClassConstFetch) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Class) + p.printFreeFloating(nn, token.Name) + io.WriteString(p.w, "::") + p.Print(nn.ConstantName) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprClone(n ast.Vertex) { + nn := n.(*ast.ExprClone) + p.printFreeFloating(nn, token.Start) + io.WriteString(p.w, "clone") + if nn.Expr.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Expr) + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprClosureUse(n ast.Vertex) { + nn := n.(*ast.ExprClosureUse) + p.printFreeFloating(nn, token.Start) + io.WriteString(p.w, "use") + p.printFreeFloating(nn, token.Use) + io.WriteString(p.w, "(") + p.joinPrint(",", nn.Uses) + p.printFreeFloating(nn, token.LexicalVarList) + io.WriteString(p.w, ")") + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprClosure(n ast.Vertex) { + nn := n.(*ast.ExprClosure) + p.printFreeFloating(nn, token.Start) + + if nn.Static { + io.WriteString(p.w, "static") + } + p.printFreeFloating(nn, token.Static) + if nn.Static && n.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + + io.WriteString(p.w, "function") + p.printFreeFloating(nn, token.Function) + + if nn.ReturnsRef { + io.WriteString(p.w, "&") + } + p.printFreeFloating(nn, token.Ampersand) + + io.WriteString(p.w, "(") + p.joinPrint(",", nn.Params) + p.printFreeFloating(nn, token.ParameterList) + io.WriteString(p.w, ")") + p.printFreeFloating(nn, token.Params) + + if nn.ClosureUse != nil { + p.Print(nn.ClosureUse) + } + p.printFreeFloating(nn, token.LexicalVars) + + if nn.ReturnType != nil { + io.WriteString(p.w, ":") + p.Print(nn.ReturnType) + } + p.printFreeFloating(nn, token.ReturnType) + + io.WriteString(p.w, "{") + p.printNodes(nn.Stmts) + p.printFreeFloating(nn, token.Stmts) + io.WriteString(p.w, "}") + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprConstFetch(n ast.Vertex) { + nn := n.(*ast.ExprConstFetch) + p.printFreeFloating(nn, token.Start) + p.Print(nn.Const) + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprEmpty(n ast.Vertex) { + nn := n.(*ast.ExprEmpty) + p.printFreeFloating(nn, token.Start) + io.WriteString(p.w, "empty") + p.printFreeFloating(nn, token.Empty) + io.WriteString(p.w, "(") + p.Print(nn.Expr) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, ")") + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprErrorSuppress(n ast.Vertex) { + nn := n.(*ast.ExprErrorSuppress) + p.printFreeFloating(nn, token.Start) + io.WriteString(p.w, "@") + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprEval(n ast.Vertex) { + nn := n.(*ast.ExprEval) + p.printFreeFloating(nn, token.Start) + io.WriteString(p.w, "eval") + p.printFreeFloating(nn, token.Eval) + io.WriteString(p.w, "(") + p.Print(nn.Expr) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, ")") + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprExit(n ast.Vertex) { + nn := n.(*ast.ExprExit) + p.printFreeFloating(nn, token.Start) + + if nn.Die { + io.WriteString(p.w, "die") + } else { + io.WriteString(p.w, "exit") + } + p.printFreeFloating(nn, token.Exit) + + if nn.Expr != nil && nn.Expr.GetNode().Tokens.IsEmpty() && nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Expr) + p.printFreeFloating(nn, token.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprFunctionCall(n ast.Vertex) { + nn := n.(*ast.ExprFunctionCall) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Function) + + p.printFreeFloating(nn.ArgumentList, token.Start) + io.WriteString(p.w, "(") + p.joinPrint(",", nn.ArgumentList.Arguments) + p.printFreeFloating(nn.ArgumentList, token.ArgumentList) + io.WriteString(p.w, ")") + p.printFreeFloating(nn.ArgumentList, token.End) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprInclude(n ast.Vertex) { + nn := n.(*ast.ExprInclude) + p.printFreeFloating(nn, token.Start) + io.WriteString(p.w, "include") + if nn.Expr.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Expr) + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprIncludeOnce(n ast.Vertex) { + nn := n.(*ast.ExprIncludeOnce) + p.printFreeFloating(nn, token.Start) + io.WriteString(p.w, "include_once") + if nn.Expr.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Expr) + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprInstanceOf(n ast.Vertex) { + nn := n.(*ast.ExprInstanceOf) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Expr) + p.printFreeFloating(nn, token.Expr) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + + io.WriteString(p.w, "instanceof") + + if nn.Class.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Class) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprIsset(n ast.Vertex) { + nn := n.(*ast.ExprIsset) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "isset") + p.printFreeFloating(nn, token.Isset) + io.WriteString(p.w, "(") + p.joinPrint(",", nn.Vars) + p.printFreeFloating(nn, token.VarList) + io.WriteString(p.w, ")") + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprList(n ast.Vertex) { + nn := n.(*ast.ExprList) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "list") + p.printFreeFloating(nn, token.List) + io.WriteString(p.w, "(") + p.joinPrint(",", nn.Items) + p.printFreeFloating(nn, token.ArrayPairList) + io.WriteString(p.w, ")") + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprMethodCall(n ast.Vertex) { + nn := n.(*ast.ExprMethodCall) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Var) + p.printFreeFloating(nn, token.Var) + io.WriteString(p.w, "->") + p.Print(nn.Method) + + p.printFreeFloating(nn.ArgumentList, token.Start) + io.WriteString(p.w, "(") + p.joinPrint(",", nn.ArgumentList.Arguments) + p.printFreeFloating(nn.ArgumentList, token.ArgumentList) + io.WriteString(p.w, ")") + p.printFreeFloating(nn.ArgumentList, token.End) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprNew(n ast.Vertex) { + nn := n.(*ast.ExprNew) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "new") + if nn.Class.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Class) + + if nn.ArgumentList != nil { + p.printFreeFloating(nn.ArgumentList, token.Start) + io.WriteString(p.w, "(") + p.joinPrint(",", nn.ArgumentList.Arguments) + p.printFreeFloating(nn.ArgumentList, token.ArgumentList) + io.WriteString(p.w, ")") + p.printFreeFloating(nn.ArgumentList, token.End) + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprPostDec(n ast.Vertex) { + nn := n.(*ast.ExprPostDec) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Var) + p.printFreeFloating(nn, token.Var) + io.WriteString(p.w, "--") + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprPostInc(n ast.Vertex) { + nn := n.(*ast.ExprPostInc) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Var) + p.printFreeFloating(nn, token.Var) + io.WriteString(p.w, "++") + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprPreDec(n ast.Vertex) { + nn := n.(*ast.ExprPreDec) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "--") + p.Print(nn.Var) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprPreInc(n ast.Vertex) { + nn := n.(*ast.ExprPreInc) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "++") + p.Print(nn.Var) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprPrint(n ast.Vertex) { + nn := n.(*ast.ExprPrint) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "print") + if nn.Expr.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprPropertyFetch(n ast.Vertex) { + nn := n.(*ast.ExprPropertyFetch) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Var) + p.printFreeFloating(nn, token.Var) + io.WriteString(p.w, "->") + p.Print(nn.Property) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprReference(n ast.Vertex) { + nn := n.(*ast.ExprReference) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "&") + p.Print(nn.Var) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprRequire(n ast.Vertex) { + nn := n.(*ast.ExprRequire) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "require") + if nn.Expr.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprRequireOnce(n ast.Vertex) { + nn := n.(*ast.ExprRequireOnce) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "require_once") + if nn.Expr.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprShellExec(n ast.Vertex) { + nn := n.(*ast.ExprShellExec) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "`") + p.joinPrint("", nn.Parts) + io.WriteString(p.w, "`") + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprShortArray(n ast.Vertex) { + nn := n.(*ast.ExprShortArray) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "[") + p.joinPrint(",", nn.Items) + p.printFreeFloating(nn, token.ArrayPairList) + io.WriteString(p.w, "]") + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprShortList(n ast.Vertex) { + nn := n.(*ast.ExprShortList) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "[") + p.joinPrint(",", nn.Items) + p.printFreeFloating(nn, token.ArrayPairList) + io.WriteString(p.w, "]") + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprStaticCall(n ast.Vertex) { + nn := n.(*ast.ExprStaticCall) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Class) + p.printFreeFloating(nn, token.Name) + io.WriteString(p.w, "::") + p.Print(nn.Call) + + p.printFreeFloating(nn.ArgumentList, token.Start) + io.WriteString(p.w, "(") + p.joinPrint(",", nn.ArgumentList.Arguments) + p.printFreeFloating(nn.ArgumentList, token.ArgumentList) + io.WriteString(p.w, ")") + p.printFreeFloating(nn.ArgumentList, token.End) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprStaticPropertyFetch(n ast.Vertex) { + nn := n.(*ast.ExprStaticPropertyFetch) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Class) + p.printFreeFloating(nn, token.Name) + io.WriteString(p.w, "::") + p.Print(nn.Property) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprTernary(n ast.Vertex) { + nn := n.(*ast.ExprTernary) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Condition) + p.printFreeFloating(nn, token.Cond) + io.WriteString(p.w, "?") + + if nn.IfTrue != nil { + p.Print(nn.IfTrue) + } + p.printFreeFloating(nn, token.True) + + io.WriteString(p.w, ":") + p.Print(nn.IfFalse) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprUnaryMinus(n ast.Vertex) { + nn := n.(*ast.ExprUnaryMinus) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "-") + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprUnaryPlus(n ast.Vertex) { + nn := n.(*ast.ExprUnaryPlus) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "+") + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprVariable(n ast.Vertex) { + nn := n.(*ast.ExprVariable) + p.printFreeFloating(nn, token.Start) + + p.printFreeFloating(nn, token.Dollar) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, "$") + } + + p.Print(nn.VarName) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprVariableWithoutLeadingDollar(n ast.Vertex) { + nn := n.(*ast.ExprVariable) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.VarName) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprYieldFrom(n ast.Vertex) { + nn := n.(*ast.ExprYieldFrom) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "yield from") + if nn.Expr.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printExprYield(n ast.Vertex) { + nn := n.(*ast.ExprYield) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "yield") + + if nn.Key != nil { + if nn.Key.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Key) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, "=>") + } else { + if nn.Value.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + } + + p.Print(nn.Value) + + p.printFreeFloating(nn, token.End) +} + +// smtm + +func (p *Printer) printStmtAltElseIf(n ast.Vertex) { + nn := n.(*ast.StmtAltElseIf) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "elseif") + p.printFreeFloating(nn, token.ElseIf) + io.WriteString(p.w, "(") + p.Print(nn.Cond) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, ")") + p.printFreeFloating(nn, token.Cond) + io.WriteString(p.w, ":") + + if s := nn.Stmt.(*ast.StmtStmtList).Stmts; len(s) > 0 { + p.printNodes(s) + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtAltElse(n ast.Vertex) { + nn := n.(*ast.StmtAltElse) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "else") + p.printFreeFloating(nn, token.Else) + io.WriteString(p.w, ":") + + if s := nn.Stmt.(*ast.StmtStmtList).Stmts; len(s) > 0 { + p.printNodes(s) + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtAltFor(n ast.Vertex) { + nn := n.(*ast.StmtAltFor) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "for") + p.printFreeFloating(nn, token.For) + io.WriteString(p.w, "(") + p.joinPrint(",", nn.Init) + p.printFreeFloating(nn, token.InitExpr) + io.WriteString(p.w, ";") + p.joinPrint(",", nn.Cond) + p.printFreeFloating(nn, token.CondExpr) + io.WriteString(p.w, ";") + p.joinPrint(",", nn.Loop) + p.printFreeFloating(nn, token.IncExpr) + io.WriteString(p.w, ")") + p.printFreeFloating(nn, token.Cond) + io.WriteString(p.w, ":") + + s := nn.Stmt.(*ast.StmtStmtList) + p.printNodes(s.Stmts) + p.printFreeFloating(nn, token.Stmts) + + io.WriteString(p.w, "endfor") + p.printFreeFloating(nn, token.AltEnd) + p.printFreeFloating(nn, token.SemiColon) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtAltForeach(n ast.Vertex) { + nn := n.(*ast.StmtAltForeach) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "foreach") + p.printFreeFloating(nn, token.Foreach) + io.WriteString(p.w, "(") + p.Print(nn.Expr) + p.printFreeFloating(nn, token.Expr) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + io.WriteString(p.w, "as") + + if nn.Key != nil { + if nn.Key.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Key) + p.printFreeFloating(nn, token.Key) + io.WriteString(p.w, "=>") + } else { + if nn.Var.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + } + + p.Print(nn.Var) + p.printFreeFloating(nn, token.Var) + + io.WriteString(p.w, ")") + p.printFreeFloating(nn, token.Cond) + + io.WriteString(p.w, ":") + s := nn.Stmt.(*ast.StmtStmtList) + p.printNodes(s.Stmts) + p.printFreeFloating(nn, token.Stmts) + + io.WriteString(p.w, "endforeach") + p.printFreeFloating(nn, token.AltEnd) + p.printFreeFloating(nn, token.SemiColon) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtAltIf(n ast.Vertex) { + nn := n.(*ast.StmtAltIf) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "if") + p.printFreeFloating(nn, token.If) + io.WriteString(p.w, "(") + p.Print(nn.Cond) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, ")") + p.printFreeFloating(nn, token.Cond) + io.WriteString(p.w, ":") + + s := nn.Stmt.(*ast.StmtStmtList) + p.printNodes(s.Stmts) + + for _, elseif := range nn.ElseIf { + p.Print(elseif) + } + + if nn.Else != nil { + p.Print(nn.Else) + } + + p.printFreeFloating(nn, token.Stmts) + io.WriteString(p.w, "endif") + p.printFreeFloating(nn, token.AltEnd) + p.printFreeFloating(nn, token.SemiColon) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtAltSwitch(n ast.Vertex) { + nn := n.(*ast.StmtAltSwitch) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "switch") + p.printFreeFloating(nn, token.Switch) + io.WriteString(p.w, "(") + p.Print(nn.Cond) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, ")") + p.printFreeFloating(nn, token.Cond) + io.WriteString(p.w, ":") + + p.printFreeFloating(nn.CaseList, token.Start) + p.printFreeFloating(nn.CaseList, token.CaseListStart) + p.printNodes(nn.CaseList.Cases) + p.printFreeFloating(nn.CaseList, token.CaseListEnd) + p.printFreeFloating(nn.CaseList, token.End) + + io.WriteString(p.w, "endswitch") + p.printFreeFloating(nn, token.AltEnd) + p.printFreeFloating(nn, token.SemiColon) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtAltWhile(n ast.Vertex) { + nn := n.(*ast.StmtAltWhile) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "while") + p.printFreeFloating(nn, token.While) + io.WriteString(p.w, "(") + p.Print(nn.Cond) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, ")") + p.printFreeFloating(nn, token.Cond) + io.WriteString(p.w, ":") + + s := nn.Stmt.(*ast.StmtStmtList) + p.printNodes(s.Stmts) + p.printFreeFloating(nn, token.Stmts) + + io.WriteString(p.w, "endwhile") + p.printFreeFloating(nn, token.AltEnd) + p.printFreeFloating(nn, token.SemiColon) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtBreak(n ast.Vertex) { + nn := n.(*ast.StmtBreak) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "break") + if nn.Expr != nil { + if nn.Expr.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Expr) + } + p.printFreeFloating(nn, token.Expr) + + p.printFreeFloating(nn, token.SemiColon) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtCase(n ast.Vertex) { + nn := n.(*ast.StmtCase) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "case") + if nn.Cond.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Cond) + p.printFreeFloating(nn, token.Expr) + p.printFreeFloating(nn, token.CaseSeparator) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ":") + } + + if len(nn.Stmts) > 0 { + p.printNodes(nn.Stmts) + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtCatch(n ast.Vertex) { + nn := n.(*ast.StmtCatch) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "catch") + p.printFreeFloating(nn, token.Catch) + io.WriteString(p.w, "(") + p.joinPrint("|", nn.Types) + p.Print(nn.Var) + p.printFreeFloating(nn, token.Var) + io.WriteString(p.w, ")") + p.printFreeFloating(nn, token.Cond) + io.WriteString(p.w, "{") + p.printNodes(nn.Stmts) + p.printFreeFloating(nn, token.Stmts) + io.WriteString(p.w, "}") + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtClassMethod(n ast.Vertex) { + nn := n.(*ast.StmtClassMethod) + p.printFreeFloating(nn, token.Start) + + if nn.Modifiers != nil { + for k, m := range nn.Modifiers { + if k > 0 && m.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(m) + } + + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + } + p.printFreeFloating(nn, token.ModifierList) + io.WriteString(p.w, "function") + p.printFreeFloating(nn, token.Function) + + if nn.ReturnsRef { + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + io.WriteString(p.w, "&") + p.printFreeFloating(nn, token.Ampersand) + } else { + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + } + + p.Print(nn.MethodName) + p.printFreeFloating(nn, token.Name) + io.WriteString(p.w, "(") + p.joinPrint(",", nn.Params) + p.printFreeFloating(nn, token.ParameterList) + io.WriteString(p.w, ")") + p.printFreeFloating(nn, token.Params) + + if nn.ReturnType != nil { + io.WriteString(p.w, ":") + p.Print(nn.ReturnType) + } + + p.Print(nn.Stmt) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtClass(n ast.Vertex) { + nn := n.(*ast.StmtClass) + p.printFreeFloating(nn, token.Start) + + if nn.Modifiers != nil { + for k, m := range nn.Modifiers { + if k > 0 && m.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(m) + } + + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + } + p.printFreeFloating(nn, token.ModifierList) + io.WriteString(p.w, "class") + p.printFreeFloating(nn, token.Class) + + if nn.ClassName != nil { + if nn.ClassName.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.ClassName) + } + + if nn.ArgumentList != nil { + p.printFreeFloating(nn.ArgumentList, token.Start) + io.WriteString(p.w, "(") + p.joinPrint(",", nn.ArgumentList.Arguments) + p.printFreeFloating(nn.ArgumentList, token.ArgumentList) + io.WriteString(p.w, ")") + p.printFreeFloating(nn.ArgumentList, token.End) + } + + if nn.Extends != nil { + p.printFreeFloating(nn.Extends, token.Start) + if nn.Extends.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + io.WriteString(p.w, "extends") + if nn.Extends.ClassName.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Extends.ClassName) + } + + if nn.Implements != nil { + p.printFreeFloating(nn.Implements, token.Start) + if nn.Implements.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + io.WriteString(p.w, "implements") + if nn.Implements.InterfaceNames[0].GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.joinPrint(",", nn.Implements.InterfaceNames) + } + + p.printFreeFloating(nn, token.Name) + io.WriteString(p.w, "{") + p.printNodes(nn.Stmts) + p.printFreeFloating(nn, token.Stmts) + io.WriteString(p.w, "}") + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtClassConstList(n ast.Vertex) { + nn := n.(*ast.StmtClassConstList) + p.printFreeFloating(nn, token.Start) + + if nn.Modifiers != nil { + for k, m := range nn.Modifiers { + if k > 0 && m.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(m) + } + + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + } + p.printFreeFloating(nn, token.ModifierList) + io.WriteString(p.w, "const") + + if nn.Consts[0].GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.joinPrint(",", nn.Consts) + p.printFreeFloating(nn, token.ConstList) + + p.printFreeFloating(nn, token.SemiColon) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtConstList(n ast.Vertex) { + nn := n.(*ast.StmtConstList) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "const") + + if nn.Consts[0].GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.joinPrint(",", nn.Consts) + p.printFreeFloating(nn, token.Stmts) + + p.printFreeFloating(nn, token.SemiColon) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtConstant(n ast.Vertex) { + nn := n.(*ast.StmtConstant) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.ConstantName) + p.printFreeFloating(nn, token.Name) + io.WriteString(p.w, "=") + p.Print(nn.Expr) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtContinue(n ast.Vertex) { + nn := n.(*ast.StmtContinue) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "continue") + + if nn.Expr != nil { + if nn.Expr.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Expr) + } + p.printFreeFloating(nn, token.Expr) + + p.printFreeFloating(nn, token.SemiColon) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtDeclare(n ast.Vertex) { + nn := n.(*ast.StmtDeclare) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "declare") + p.printFreeFloating(nn, token.Declare) + io.WriteString(p.w, "(") + p.joinPrint(",", nn.Consts) + p.printFreeFloating(nn, token.ConstList) + io.WriteString(p.w, ")") + + if nn.Alt { + p.printFreeFloating(nn, token.Cond) + io.WriteString(p.w, ":") + + s := nn.Stmt.(*ast.StmtStmtList) + p.printNodes(s.Stmts) + p.printFreeFloating(nn, token.Stmts) + + io.WriteString(p.w, "enddeclare") + p.printFreeFloating(nn, token.AltEnd) + + p.printFreeFloating(nn, token.SemiColon) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + } else { + p.Print(nn.Stmt) + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtDefault(n ast.Vertex) { + nn := n.(*ast.StmtDefault) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "default") + p.printFreeFloating(nn, token.Default) + p.printFreeFloating(nn, token.CaseSeparator) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ":") + } + + if len(nn.Stmts) > 0 { + p.printNodes(nn.Stmts) + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtDo(n ast.Vertex) { + nn := n.(*ast.StmtDo) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "do") + + if _, ok := nn.Stmt.(*ast.StmtStmtList); !ok { + if nn.Stmt.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + } + + p.Print(nn.Stmt) + p.printFreeFloating(nn, token.Stmts) + + io.WriteString(p.w, "while") + p.printFreeFloating(nn, token.While) + io.WriteString(p.w, "(") + p.Print(nn.Cond) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, ")") + p.printFreeFloating(nn, token.Cond) + + p.printFreeFloating(nn, token.SemiColon) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtEcho(n ast.Vertex) { + nn := n.(*ast.StmtEcho) + + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, "echo") + } + if nn.Exprs[0].GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + + p.printFreeFloating(nn, token.Start) + p.printFreeFloating(nn, token.Echo) + + p.joinPrint(",", nn.Exprs) + p.printFreeFloating(nn, token.Expr) + + p.printFreeFloating(nn, token.SemiColon) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtElseif(n ast.Vertex) { + nn := n.(*ast.StmtElseIf) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "elseif") + p.printFreeFloating(nn, token.ElseIf) + io.WriteString(p.w, "(") + p.Print(nn.Cond) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, ")") + + p.Print(nn.Stmt) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtElse(n ast.Vertex) { + nn := n.(*ast.StmtElse) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "else") + + if _, ok := nn.Stmt.(*ast.StmtStmtList); !ok { + if nn.Stmt.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + } + + p.Print(nn.Stmt) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtExpression(n ast.Vertex) { + nn := n.(*ast.StmtExpression) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Expr) + p.printFreeFloating(nn, token.Expr) + + p.printFreeFloating(nn, token.SemiColon) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtFinally(n ast.Vertex) { + nn := n.(*ast.StmtFinally) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "finally") + p.printFreeFloating(nn, token.Finally) + io.WriteString(p.w, "{") + p.printNodes(nn.Stmts) + p.printFreeFloating(nn, token.Stmts) + io.WriteString(p.w, "}") + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtFor(n ast.Vertex) { + nn := n.(*ast.StmtFor) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "for") + p.printFreeFloating(nn, token.For) + io.WriteString(p.w, "(") + p.joinPrint(",", nn.Init) + p.printFreeFloating(nn, token.InitExpr) + io.WriteString(p.w, ";") + p.joinPrint(",", nn.Cond) + p.printFreeFloating(nn, token.CondExpr) + io.WriteString(p.w, ";") + p.joinPrint(",", nn.Loop) + p.printFreeFloating(nn, token.IncExpr) + io.WriteString(p.w, ")") + + p.Print(nn.Stmt) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtForeach(n ast.Vertex) { + nn := n.(*ast.StmtForeach) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "foreach") + p.printFreeFloating(nn, token.Foreach) + io.WriteString(p.w, "(") + + p.Print(nn.Expr) + p.printFreeFloating(nn, token.Expr) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + + io.WriteString(p.w, "as") + + if nn.Key != nil { + if nn.Key.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Key) + p.printFreeFloating(nn, token.Key) + io.WriteString(p.w, "=>") + } else { + if nn.Var.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + } + p.Print(nn.Var) + p.printFreeFloating(nn, token.Var) + + io.WriteString(p.w, ")") + + p.Print(nn.Stmt) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtFunction(n ast.Vertex) { + nn := n.(*ast.StmtFunction) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "function") + p.printFreeFloating(nn, token.Function) + + if nn.ReturnsRef { + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + io.WriteString(p.w, "&") + } else { + if nn.FunctionName.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + } + + p.Print(nn.FunctionName) + p.printFreeFloating(nn, token.Name) + + io.WriteString(p.w, "(") + p.joinPrint(",", nn.Params) + p.printFreeFloating(nn, token.ParamList) + io.WriteString(p.w, ")") + p.printFreeFloating(nn, token.Params) + + if nn.ReturnType != nil { + io.WriteString(p.w, ":") + p.Print(nn.ReturnType) + } + p.printFreeFloating(nn, token.ReturnType) + + io.WriteString(p.w, "{") + p.printNodes(nn.Stmts) + p.printFreeFloating(nn, token.Stmts) + io.WriteString(p.w, "}") + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtGlobal(n ast.Vertex) { + nn := n.(*ast.StmtGlobal) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "global") + p.joinPrint(",", nn.Vars) + p.printFreeFloating(nn, token.VarList) + + p.printFreeFloating(nn, token.SemiColon) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtGoto(n ast.Vertex) { + nn := n.(*ast.StmtGoto) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "goto") + if nn.Label.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Label) + p.printFreeFloating(nn, token.Label) + + p.printFreeFloating(nn, token.SemiColon) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtGroupUse(n ast.Vertex) { + nn := n.(*ast.StmtGroupUse) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "use") + p.printFreeFloating(nn, token.Use) + + if nn.UseType != nil { + if nn.UseType.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.UseType) + } + + if nn.Prefix.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Prefix) + io.WriteString(p.w, "\\") + p.printFreeFloating(nn, token.Slash) + + io.WriteString(p.w, "{") + p.joinPrint(",", nn.UseList) + p.printFreeFloating(nn, token.Stmts) + io.WriteString(p.w, "}") + p.printFreeFloating(nn, token.UseDeclarationList) + + p.printFreeFloating(nn, token.SemiColon) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtHaltCompiler(n ast.Vertex) { + nn := n.(*ast.StmtHaltCompiler) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "__halt_compiler") + p.printFreeFloating(nn, token.HaltCompiller) + io.WriteString(p.w, "(") + p.printFreeFloating(nn, token.OpenParenthesisToken) + io.WriteString(p.w, ")") + p.printFreeFloating(nn, token.CloseParenthesisToken) + + p.printFreeFloating(nn, token.SemiColon) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtIf(n ast.Vertex) { + nn := n.(*ast.StmtIf) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "if") + p.printFreeFloating(n, token.If) + io.WriteString(p.w, "(") + p.Print(nn.Cond) + p.printFreeFloating(n, token.Expr) + io.WriteString(p.w, ")") + + p.Print(nn.Stmt) + + if nn.ElseIf != nil { + p.printNodes(nn.ElseIf) + } + + if nn.Else != nil { + p.Print(nn.Else) + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtInlineHTML(n ast.Vertex) { + nn := n.(*ast.StmtInlineHtml) + p.printFreeFloating(nn, token.Start) + + if p.s == PhpState && nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, "?>") + } + p.SetState(HtmlState) + + io.WriteString(p.w, string(nn.Value)) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtInterface(n ast.Vertex) { + nn := n.(*ast.StmtInterface) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "interface") + + if nn.InterfaceName.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + + p.Print(nn.InterfaceName) + + if nn.Extends != nil { + p.printFreeFloating(nn.Extends, token.Start) + if nn.Extends.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + io.WriteString(p.w, "extends") + if nn.Extends.InterfaceNames[0].GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.joinPrint(",", nn.Extends.InterfaceNames) + } + + p.printFreeFloating(nn, token.Name) + io.WriteString(p.w, "{") + p.printNodes(nn.Stmts) + p.printFreeFloating(nn, token.Stmts) + io.WriteString(p.w, "}") + + 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) + + io.WriteString(p.w, ":") + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtNamespace(n ast.Vertex) { + nn := n.(*ast.StmtNamespace) + p.printFreeFloating(nn, token.Start) + io.WriteString(p.w, "namespace") + + if nn.NamespaceName != nil { + if nn.NamespaceName.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.NamespaceName) + } + + if nn.Stmts != nil { + p.printFreeFloating(nn, token.Namespace) + io.WriteString(p.w, "{") + p.printNodes(nn.Stmts) + p.printFreeFloating(nn, token.Stmts) + io.WriteString(p.w, "}") + } else { + p.printFreeFloating(nn, token.SemiColon) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtNop(n ast.Vertex) { + p.printFreeFloating(n, token.Start) + p.printFreeFloating(n, token.SemiColon) + if n.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + p.printFreeFloating(n, token.End) +} + +func (p *Printer) printStmtPropertyList(n ast.Vertex) { + nn := n.(*ast.StmtPropertyList) + p.printFreeFloating(nn, token.Start) + + for k, m := range nn.Modifiers { + if k > 0 && m.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(m) + } + + if nn.Type != nil && nn.Type.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + + p.Print(nn.Type) + + if nn.Properties[0].GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + + p.joinPrint(",", nn.Properties) + p.printFreeFloating(n, token.PropertyList) + + p.printFreeFloating(n, token.SemiColon) + if n.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtProperty(n ast.Vertex) { + nn := n.(*ast.StmtProperty) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Var) + + if nn.Expr != nil { + p.printFreeFloating(nn, token.Var) + io.WriteString(p.w, "=") + p.Print(nn.Expr) + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtReturn(n ast.Vertex) { + nn := n.(*ast.StmtReturn) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "return") + if nn.Expr != nil && nn.Expr.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Expr) + p.printFreeFloating(nn, token.Expr) + + p.printFreeFloating(nn, token.SemiColon) + if n.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtStaticVar(n ast.Vertex) { + nn := n.(*ast.StmtStaticVar) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Var) + + if nn.Expr != nil { + p.printFreeFloating(nn, token.Var) + io.WriteString(p.w, "=") + p.Print(nn.Expr) + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtStatic(n ast.Vertex) { + nn := n.(*ast.StmtStatic) + p.printFreeFloating(nn, token.Start) + io.WriteString(p.w, "static") + + p.joinPrint(",", nn.Vars) + p.printFreeFloating(nn, token.VarList) + + p.printFreeFloating(nn, token.SemiColon) + if n.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtStmtList(n ast.Vertex) { + nn := n.(*ast.StmtStmtList) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "{") + p.printNodes(nn.Stmts) + p.printFreeFloating(nn, token.Stmts) + io.WriteString(p.w, "}") + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtSwitch(n ast.Vertex) { + nn := n.(*ast.StmtSwitch) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "switch") + p.printFreeFloating(nn, token.Switch) + io.WriteString(p.w, "(") + p.Print(nn.Cond) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, ")") + + p.printFreeFloating(nn.CaseList, token.Start) + io.WriteString(p.w, "{") + p.printFreeFloating(nn.CaseList, token.CaseListStart) + p.printNodes(nn.CaseList.Cases) + p.printFreeFloating(nn.CaseList, token.CaseListEnd) + io.WriteString(p.w, "}") + p.printFreeFloating(nn.CaseList, token.End) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtThrow(n ast.Vertex) { + nn := n.(*ast.StmtThrow) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "throw") + if nn.Expr.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Expr) + p.printFreeFloating(nn, token.Expr) + + p.printFreeFloating(nn, token.SemiColon) + if n.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtTraitAdaptationList(n ast.Vertex) { + nn := n.(*ast.StmtTraitAdaptationList) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "{") + p.printNodes(nn.Adaptations) + p.printFreeFloating(nn, token.AdaptationList) + io.WriteString(p.w, "}") + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtTraitMethodRef(n ast.Vertex) { + nn := n.(*ast.StmtTraitMethodRef) + p.printFreeFloating(nn, token.Start) + + if nn.Trait != nil { + p.Print(nn.Trait) + p.printFreeFloating(nn, token.Name) + io.WriteString(p.w, "::") + } + + p.Print(nn.Method) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtTraitUseAlias(n ast.Vertex) { + nn := n.(*ast.StmtTraitUseAlias) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Ref) + p.printFreeFloating(nn, token.Ref) + + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + io.WriteString(p.w, "as") + + if nn.Modifier != nil { + if nn.Modifier.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Modifier) + } + + if nn.Alias != nil { + if nn.Alias.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Alias) + } + p.printFreeFloating(nn, token.Alias) + + p.printFreeFloating(nn, token.SemiColon) + if n.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtTraitUsePrecedence(n ast.Vertex) { + nn := n.(*ast.StmtTraitUsePrecedence) + p.printFreeFloating(nn, token.Start) + + p.Print(nn.Ref) + p.printFreeFloating(nn, token.Ref) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + + io.WriteString(p.w, "insteadof") + if nn.Insteadof[0].GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.joinPrint(",", nn.Insteadof) + p.printFreeFloating(nn, token.NameList) + + p.printFreeFloating(nn, token.SemiColon) + if n.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtTraitUse(n ast.Vertex) { + nn := n.(*ast.StmtTraitUse) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "use") + if nn.Traits[0].GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.joinPrint(",", nn.Traits) + + p.Print(nn.TraitAdaptationList) + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtTrait(n ast.Vertex) { + nn := n.(*ast.StmtTrait) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "trait") + if nn.TraitName.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.TraitName) + + p.printFreeFloating(nn, token.Name) + io.WriteString(p.w, "{") + p.printNodes(nn.Stmts) + p.printFreeFloating(nn, token.Stmts) + io.WriteString(p.w, "}") + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtTry(n ast.Vertex) { + nn := n.(*ast.StmtTry) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "try") + p.printFreeFloating(nn, token.Try) + io.WriteString(p.w, "{") + p.printNodes(nn.Stmts) + p.printFreeFloating(nn, token.Stmts) + io.WriteString(p.w, "}") + + if nn.Catches != nil { + p.printNodes(nn.Catches) + } + + if nn.Finally != nil { + p.Print(nn.Finally) + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtUnset(n ast.Vertex) { + nn := n.(*ast.StmtUnset) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "unset") + p.printFreeFloating(nn, token.Unset) + io.WriteString(p.w, "(") + p.joinPrint(",", nn.Vars) + p.printFreeFloating(nn, token.VarList) + io.WriteString(p.w, ")") + p.printFreeFloating(nn, token.CloseParenthesisToken) + + p.printFreeFloating(nn, token.SemiColon) + if n.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtUseList(n ast.Vertex) { + nn := n.(*ast.StmtUseList) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "use") + + if nn.UseType != nil { + if nn.UseType.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.UseType) + } + + if nn.Uses[0].GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.joinPrint(",", nn.Uses) + p.printFreeFloating(nn, token.UseDeclarationList) + + p.printFreeFloating(nn, token.SemiColon) + if nn.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, ";") + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtUse(n ast.Vertex) { + nn := n.(*ast.StmtUse) + p.printFreeFloating(nn, token.Start) + + if nn.UseType != nil { + p.Print(nn.UseType) + if nn.UseType.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + } + + p.printFreeFloating(nn, token.Slash) + + p.Print(nn.Use) + + if nn.Alias != nil { + if nn.Alias.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + io.WriteString(p.w, "as") + if nn.Alias.GetNode().Tokens.IsEmpty() { + io.WriteString(p.w, " ") + } + p.Print(nn.Alias) + } + + p.printFreeFloating(nn, token.End) +} + +func (p *Printer) printStmtWhile(n ast.Vertex) { + nn := n.(*ast.StmtWhile) + p.printFreeFloating(nn, token.Start) + + io.WriteString(p.w, "while") + p.printFreeFloating(nn, token.While) + io.WriteString(p.w, "(") + p.Print(nn.Cond) + p.printFreeFloating(nn, token.Expr) + io.WriteString(p.w, ")") + + p.Print(nn.Stmt) + + p.printFreeFloating(nn, token.End) +} diff --git a/printer/printer_parsed_php5_test.go b/pkg/printer/printer_parsed_php5_test.go similarity index 99% rename from printer/printer_parsed_php5_test.go rename to pkg/printer/printer_parsed_php5_test.go index 660987a..14868ac 100644 --- a/printer/printer_parsed_php5_test.go +++ b/pkg/printer/printer_parsed_php5_test.go @@ -2,22 +2,22 @@ package printer_test import ( "bytes" + "github.com/z7zmey/php-parser/pkg/ast" "testing" - "github.com/z7zmey/php-parser/node" - "github.com/z7zmey/php-parser/php5" - "github.com/z7zmey/php-parser/printer" + "github.com/z7zmey/php-parser/internal/php5" + "github.com/z7zmey/php-parser/pkg/printer" ) -func parsePhp5(src string) node.Node { +func parsePhp5(src string) ast.Vertex { php5parser := php5.NewParser([]byte(src), "5.6") - php5parser.WithFreeFloating() + php5parser.WithTokens() php5parser.Parse() return php5parser.GetRootNode() } -func printPhp5(n node.Node) string { +func printPhp5(n ast.Vertex) string { o := bytes.NewBufferString("") p := printer.NewPrinter(o) diff --git a/printer/printer_parsed_php7_test.go b/pkg/printer/printer_parsed_php7_test.go similarity index 98% rename from printer/printer_parsed_php7_test.go rename to pkg/printer/printer_parsed_php7_test.go index d50dc59..971219f 100644 --- a/printer/printer_parsed_php7_test.go +++ b/pkg/printer/printer_parsed_php7_test.go @@ -2,14 +2,12 @@ package printer_test import ( "bytes" + "github.com/z7zmey/php-parser/pkg/ast" "os" "testing" - "github.com/z7zmey/php-parser/node" - "github.com/z7zmey/php-parser/node/name" - "github.com/z7zmey/php-parser/node/stmt" - "github.com/z7zmey/php-parser/php7" - "github.com/z7zmey/php-parser/printer" + "github.com/z7zmey/php-parser/internal/php7" + "github.com/z7zmey/php-parser/pkg/printer" ) func ExamplePrinter() { @@ -30,15 +28,15 @@ abstract class Bar extends Baz // parse php7parser := php7.NewParser([]byte(src), "7.4") - php7parser.WithFreeFloating() + php7parser.WithTokens() php7parser.Parse() rootNode := php7parser.GetRootNode() // change namespace - parts := &rootNode.(*node.Root).Stmts[0].(*stmt.Namespace).NamespaceName.(*name.Name).Parts - *parts = append(*parts, &name.NamePart{Value: "Quuz"}) + parts := &rootNode.(*ast.Root).Stmts[0].(*ast.StmtNamespace).NamespaceName.(*ast.NameName).Parts + *parts = append(*parts, &ast.NameNamePart{Value: []byte("Quuz")}) // print @@ -60,15 +58,15 @@ abstract class Bar extends Baz // } } -func parse(src string) node.Node { +func parse(src string) ast.Vertex { php7parser := php7.NewParser([]byte(src), "7.4") - php7parser.WithFreeFloating() + php7parser.WithTokens() php7parser.Parse() return php7parser.GetRootNode() } -func print(n node.Node) string { +func print(n ast.Vertex) string { o := bytes.NewBufferString("") p := printer.NewPrinter(o) diff --git a/printer/printer_test.go b/pkg/printer/printer_test.go similarity index 54% rename from printer/printer_test.go rename to pkg/printer/printer_test.go index 331de66..a2df1a1 100644 --- a/printer/printer_test.go +++ b/pkg/printer/printer_test.go @@ -2,56 +2,49 @@ package printer_test import ( "bytes" + "github.com/z7zmey/php-parser/pkg/ast" + "github.com/z7zmey/php-parser/pkg/token" "testing" - "github.com/z7zmey/php-parser/freefloating" - "github.com/z7zmey/php-parser/node" - "github.com/z7zmey/php-parser/node/expr" - "github.com/z7zmey/php-parser/node/expr/assign" - "github.com/z7zmey/php-parser/node/expr/binary" - "github.com/z7zmey/php-parser/node/expr/cast" - "github.com/z7zmey/php-parser/node/name" - "github.com/z7zmey/php-parser/node/scalar" - "github.com/z7zmey/php-parser/node/stmt" - "github.com/z7zmey/php-parser/printer" + "github.com/z7zmey/php-parser/pkg/printer" ) func TestPrinterPrintFile(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&node.Root{ - Stmts: []node.Node{ - &stmt.Namespace{ - NamespaceName: &name.Name{ - Parts: []node.Node{ - &name.NamePart{Value: "Foo"}, + p.Print(&ast.Root{ + Stmts: []ast.Vertex{ + &ast.StmtNamespace{ + NamespaceName: &ast.NameName{ + Parts: []ast.Vertex{ + &ast.NameNamePart{Value: []byte("Foo")}, }, }, }, - &stmt.Class{ - Modifiers: []node.Node{&node.Identifier{Value: "abstract"}}, - ClassName: &name.Name{ - Parts: []node.Node{ - &name.NamePart{Value: "Bar"}, + &ast.StmtClass{ + Modifiers: []ast.Vertex{&ast.Identifier{Value: []byte("abstract")}}, + ClassName: &ast.NameName{ + Parts: []ast.Vertex{ + &ast.NameNamePart{Value: []byte("Bar")}, }, }, - Extends: &stmt.ClassExtends{ - ClassName: &name.Name{ - Parts: []node.Node{ - &name.NamePart{Value: "Baz"}, + Extends: &ast.StmtClassExtends{ + ClassName: &ast.NameName{ + Parts: []ast.Vertex{ + &ast.NameNamePart{Value: []byte("Baz")}, }, }, }, - Stmts: []node.Node{ - &stmt.ClassMethod{ - Modifiers: []node.Node{&node.Identifier{Value: "public"}}, - MethodName: &node.Identifier{Value: "greet"}, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Echo{ - Exprs: []node.Node{ - &scalar.String{Value: "'Hello world'"}, + Stmts: []ast.Vertex{ + &ast.StmtClassMethod{ + Modifiers: []ast.Vertex{&ast.Identifier{Value: []byte("public")}}, + MethodName: &ast.Identifier{Value: []byte("greet")}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtEcho{ + Exprs: []ast.Vertex{ + &ast.ScalarString{Value: []byte("'Hello world'")}, }, }, }, @@ -74,37 +67,41 @@ func TestPrinterPrintFileInlineHtml(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&node.Root{ - Stmts: []node.Node{ - &stmt.InlineHtml{Value: "
HTML
"}, - &stmt.Expression{ - Expr: &expr.Variable{ - FreeFloating: freefloating.Collection{ - freefloating.Start: []freefloating.String{ - { - StringType: freefloating.TokenType, - Value: "$", + p.Print(&ast.Root{ + Stmts: []ast.Vertex{ + &ast.StmtInlineHtml{Value: []byte("
HTML
")}, + &ast.StmtExpression{ + Expr: &ast.ExprVariable{ + Node: ast.Node{ + Tokens: token.Collection{ + token.Start: []token.Token{ + { + ID: token.ID('$'), + Value: []byte("$"), + }, }, }, }, - VarName: &node.Identifier{ - Value: "a", + VarName: &ast.Identifier{ + Value: []byte("a"), }, }, }, - &stmt.InlineHtml{Value: "
HTML
"}, - &stmt.Expression{ - Expr: &expr.Variable{ - FreeFloating: freefloating.Collection{ - freefloating.Start: []freefloating.String{ - { - StringType: freefloating.TokenType, - Value: "$", + &ast.StmtInlineHtml{Value: []byte("
HTML
")}, + &ast.StmtExpression{ + Expr: &ast.ExprVariable{ + Node: ast.Node{ + Tokens: token.Collection{ + token.Start: []token.Token{ + { + ID: token.ID('$'), + Value: []byte("$"), + }, }, }, }, - VarName: &node.Identifier{ - Value: "a", + VarName: &ast.Identifier{ + Value: []byte("a"), }, }, }, @@ -125,8 +122,8 @@ func TestPrinterPrintIdentifier(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - n := &node.Identifier{ - Value: "test", + n := &ast.Identifier{ + Value: []byte("test"), } p.Print(n) @@ -142,21 +139,21 @@ func TestPrinterPrintParameter(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&node.Parameter{ + p.Print(&ast.Parameter{ ByRef: false, Variadic: true, - VariableType: &name.FullyQualified{ - Parts: []node.Node{ - &name.NamePart{ - Value: "Foo", + Type: &ast.NameFullyQualified{ + Parts: []ast.Vertex{ + &ast.NameNamePart{ + Value: []byte("Foo"), }, }, }, - Variable: &expr.Variable{ - VarName: &node.Identifier{Value: "var"}, + Var: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("var")}, }, - DefaultValue: &scalar.String{ - Value: "'default'", + DefaultValue: &ast.ScalarString{ + Value: []byte("'default'"), }, }) @@ -172,24 +169,24 @@ func TestPrinterPrintNullable(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&node.Nullable{ - Expr: &node.Parameter{ + p.Print(&ast.Nullable{ + Expr: &ast.Parameter{ ByRef: true, Variadic: false, - VariableType: &name.FullyQualified{ - Parts: []node.Node{ - &name.NamePart{ - Value: "Foo", + Type: &ast.NameFullyQualified{ + Parts: []ast.Vertex{ + &ast.NameNamePart{ + Value: []byte("Foo"), }, }, }, - Variable: &expr.Variable{ - VarName: &node.Identifier{ - Value: "var", + Var: &ast.ExprVariable{ + VarName: &ast.Identifier{ + Value: []byte("var"), }, }, - DefaultValue: &scalar.String{ - Value: "'default'", + DefaultValue: &ast.ScalarString{ + Value: []byte("'default'"), }, }, }) @@ -206,12 +203,12 @@ func TestPrinterPrintArgument(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&node.Argument{ + p.Print(&ast.Argument{ IsReference: false, Variadic: true, - Expr: &expr.Variable{ - VarName: &node.Identifier{ - Value: "var", + Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{ + Value: []byte("var"), }, }, }) @@ -227,12 +224,12 @@ func TestPrinterPrintArgumentByRef(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&node.Argument{ + p.Print(&ast.Argument{ IsReference: true, Variadic: false, - Expr: &expr.Variable{ - VarName: &node.Identifier{ - Value: "var", + Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{ + Value: []byte("var"), }, }, }) @@ -251,8 +248,8 @@ func TestPrinterPrintNameNamePart(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&name.NamePart{ - Value: "foo", + p.Print(&ast.NameNamePart{ + Value: []byte("foo"), }) expected := "foo" @@ -267,13 +264,13 @@ func TestPrinterPrintNameName(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&name.Name{ - Parts: []node.Node{ - &name.NamePart{ - Value: "Foo", + p.Print(&ast.NameName{ + Parts: []ast.Vertex{ + &ast.NameNamePart{ + Value: []byte("Foo"), }, - &name.NamePart{ - Value: "Bar", + &ast.NameNamePart{ + Value: []byte("Bar"), }, }, }) @@ -290,13 +287,13 @@ func TestPrinterPrintNameFullyQualified(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&name.FullyQualified{ - Parts: []node.Node{ - &name.NamePart{ - Value: "Foo", + p.Print(&ast.NameFullyQualified{ + Parts: []ast.Vertex{ + &ast.NameNamePart{ + Value: []byte("Foo"), }, - &name.NamePart{ - Value: "Bar", + &ast.NameNamePart{ + Value: []byte("Bar"), }, }, }) @@ -313,13 +310,13 @@ func TestPrinterPrintNameRelative(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&name.Relative{ - Parts: []node.Node{ - &name.NamePart{ - Value: "Foo", + p.Print(&ast.NameRelative{ + Parts: []ast.Vertex{ + &ast.NameNamePart{ + Value: []byte("Foo"), }, - &name.NamePart{ - Value: "Bar", + &ast.NameNamePart{ + Value: []byte("Bar"), }, }, }) @@ -338,8 +335,8 @@ func TestPrinterPrintScalarLNumber(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&scalar.Lnumber{ - Value: "1", + p.Print(&ast.ScalarLnumber{ + Value: []byte("1"), }) expected := "1" @@ -354,8 +351,8 @@ func TestPrinterPrintScalarDNumber(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&scalar.Dnumber{ - Value: ".1", + p.Print(&ast.ScalarDnumber{ + Value: []byte(".1"), }) expected := ".1" @@ -370,8 +367,8 @@ func TestPrinterPrintScalarString(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&scalar.String{ - Value: "'hello world'", + p.Print(&ast.ScalarString{ + Value: []byte("'hello world'"), }) expected := `'hello world'` @@ -386,8 +383,8 @@ func TestPrinterPrintScalarEncapsedStringPart(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&scalar.EncapsedStringPart{ - Value: "hello world", + p.Print(&ast.ScalarEncapsedStringPart{ + Value: []byte("hello world"), }) expected := `hello world` @@ -402,13 +399,13 @@ func TestPrinterPrintScalarEncapsed(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&scalar.Encapsed{ - Parts: []node.Node{ - &scalar.EncapsedStringPart{Value: "hello "}, - &expr.Variable{ - VarName: &node.Identifier{Value: "var"}, + p.Print(&ast.ScalarEncapsed{ + Parts: []ast.Vertex{ + &ast.ScalarEncapsedStringPart{Value: []byte("hello ")}, + &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("var")}, }, - &scalar.EncapsedStringPart{Value: " world"}, + &ast.ScalarEncapsedStringPart{Value: []byte(" world")}, }, }) @@ -424,14 +421,14 @@ func TestPrinterPrintScalarHeredoc(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&scalar.Heredoc{ - Label: "<<bar` @@ -2221,9 +2218,9 @@ func TestPrinterPrintExprReference(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&expr.Reference{ - Variable: &expr.Variable{ - VarName: &node.Identifier{Value: "foo"}, + p.Print(&ast.ExprReference{ + Var: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("foo")}, }, }) @@ -2239,8 +2236,8 @@ func TestPrinterPrintRequire(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&expr.Require{ - Expr: &scalar.String{Value: "'path'"}, + p.Print(&ast.ExprRequire{ + Expr: &ast.ScalarString{Value: []byte("'path'")}, }) expected := `require 'path'` @@ -2255,8 +2252,8 @@ func TestPrinterPrintRequireOnce(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&expr.RequireOnce{ - Expr: &scalar.String{Value: "'path'"}, + p.Print(&ast.ExprRequireOnce{ + Expr: &ast.ScalarString{Value: []byte("'path'")}, }) expected := `require_once 'path'` @@ -2271,13 +2268,13 @@ func TestPrinterPrintShellExec(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&expr.ShellExec{ - Parts: []node.Node{ - &scalar.EncapsedStringPart{Value: "hello "}, - &expr.Variable{ - VarName: &node.Identifier{Value: "world"}, + p.Print(&ast.ExprShellExec{ + Parts: []ast.Vertex{ + &ast.ScalarEncapsedStringPart{Value: []byte("hello ")}, + &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("world")}, }, - &scalar.EncapsedStringPart{Value: "!"}, + &ast.ScalarEncapsedStringPart{Value: []byte("!")}, }, }) @@ -2293,23 +2290,23 @@ func TestPrinterPrintExprShortArray(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&expr.ShortArray{ - Items: []node.Node{ - &expr.ArrayItem{ - Key: &scalar.String{Value: "'Hello'"}, - Val: &expr.Variable{ - VarName: &node.Identifier{Value: "world"}, + p.Print(&ast.ExprShortArray{ + Items: []ast.Vertex{ + &ast.ExprArrayItem{ + Key: &ast.ScalarString{Value: []byte("'Hello'")}, + Val: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("world")}, }, }, - &expr.ArrayItem{ - Key: &scalar.Lnumber{Value: "2"}, - Val: &expr.Reference{Variable: &expr.Variable{ - VarName: &node.Identifier{Value: "var"}, + &ast.ExprArrayItem{ + Key: &ast.ScalarLnumber{Value: []byte("2")}, + Val: &ast.ExprReference{Var: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("var")}, }}, }, - &expr.ArrayItem{ - Val: &expr.Variable{ - VarName: &node.Identifier{Value: "var"}, + &ast.ExprArrayItem{ + Val: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("var")}, }, }, }, @@ -2327,24 +2324,24 @@ func TestPrinterPrintShortList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&expr.ShortList{ - Items: []node.Node{ - &expr.ArrayItem{ - Val: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.ExprShortList{ + Items: []ast.Vertex{ + &ast.ExprArrayItem{ + Val: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, }, - &expr.ArrayItem{ - Val: &expr.List{ - Items: []node.Node{ - &expr.ArrayItem{ - Val: &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + &ast.ExprArrayItem{ + Val: &ast.ExprList{ + Items: []ast.Vertex{ + &ast.ExprArrayItem{ + Val: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }, }, - &expr.ArrayItem{ - Val: &expr.Variable{ - VarName: &node.Identifier{Value: "c"}, + &ast.ExprArrayItem{ + Val: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("c")}, }, }, }, @@ -2365,19 +2362,19 @@ func TestPrinterPrintStaticCall(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&expr.StaticCall{ - Class: &node.Identifier{Value: "Foo"}, - Call: &node.Identifier{Value: "bar"}, - ArgumentList: &node.ArgumentList{ - Arguments: []node.Node{ - &node.Argument{ - Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.ExprStaticCall{ + Class: &ast.Identifier{Value: []byte("Foo")}, + Call: &ast.Identifier{Value: []byte("bar")}, + ArgumentList: &ast.ArgumentList{ + Arguments: []ast.Vertex{ + &ast.Argument{ + Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, }, - &node.Argument{ - Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + &ast.Argument{ + Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }, }, }, @@ -2396,10 +2393,10 @@ func TestPrinterPrintStaticPropertyFetch(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&expr.StaticPropertyFetch{ - Class: &node.Identifier{Value: "Foo"}, - Property: &expr.Variable{ - VarName: &node.Identifier{Value: "bar"}, + p.Print(&ast.ExprStaticPropertyFetch{ + Class: &ast.Identifier{Value: []byte("Foo")}, + Property: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("bar")}, }, }) @@ -2415,12 +2412,12 @@ func TestPrinterPrintTernary(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&expr.Ternary{ - Condition: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.ExprTernary{ + Condition: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, - IfFalse: &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + IfFalse: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }, }) @@ -2436,15 +2433,15 @@ func TestPrinterPrintTernaryFull(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&expr.Ternary{ - Condition: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.ExprTernary{ + Condition: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, - IfTrue: &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + IfTrue: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }, - IfFalse: &expr.Variable{ - VarName: &node.Identifier{Value: "c"}, + IfFalse: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("c")}, }, }) @@ -2460,9 +2457,9 @@ func TestPrinterPrintUnaryMinus(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&expr.UnaryMinus{ - Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "var"}, + p.Print(&ast.ExprUnaryMinus{ + Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("var")}, }, }) @@ -2478,9 +2475,9 @@ func TestPrinterPrintUnaryPlus(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&expr.UnaryPlus{ - Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "var"}, + p.Print(&ast.ExprUnaryPlus{ + Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("var")}, }, }) @@ -2496,9 +2493,9 @@ func TestPrinterPrintVariable(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&expr.Variable{ - VarName: &expr.Variable{ - VarName: &node.Identifier{Value: "var"}, + p.Print(&ast.ExprVariable{ + VarName: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("var")}, }, }) @@ -2514,9 +2511,9 @@ func TestPrinterPrintYieldFrom(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&expr.YieldFrom{ - Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "var"}, + p.Print(&ast.ExprYieldFrom{ + Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("var")}, }, }) @@ -2532,9 +2529,9 @@ func TestPrinterPrintYield(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&expr.Yield{ - Value: &expr.Variable{ - VarName: &node.Identifier{Value: "var"}, + p.Print(&ast.ExprYield{ + Value: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("var")}, }, }) @@ -2550,12 +2547,12 @@ func TestPrinterPrintYieldFull(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&expr.Yield{ - Key: &expr.Variable{ - VarName: &node.Identifier{Value: "k"}, + p.Print(&ast.ExprYield{ + Key: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("k")}, }, - Value: &expr.Variable{ - VarName: &node.Identifier{Value: "var"}, + Value: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("var")}, }, }) @@ -2573,14 +2570,14 @@ func TestPrinterPrintAltElseIf(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.AltElseIf{ - Cond: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtAltElseIf{ + Cond: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }}, }, }, @@ -2598,11 +2595,11 @@ func TestPrinterPrintAltElseIfEmpty(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.AltElseIf{ - Cond: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtAltElseIf{ + Cond: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, - Stmt: &stmt.StmtList{}, + Stmt: &ast.StmtStmtList{}, }) expected := `elseif($a):` @@ -2617,11 +2614,11 @@ func TestPrinterPrintAltElse(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.AltElse{ - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + p.Print(&ast.StmtAltElse{ + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }}, }, }, @@ -2639,8 +2636,8 @@ func TestPrinterPrintAltElseEmpty(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.AltElse{ - Stmt: &stmt.StmtList{}, + p.Print(&ast.StmtAltElse{ + Stmt: &ast.StmtStmtList{}, }) expected := `else:` @@ -2655,26 +2652,26 @@ func TestPrinterPrintAltFor(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.AltFor{ - Init: []node.Node{ - &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtAltFor{ + Init: []ast.Vertex{ + &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, }, - Cond: []node.Node{ - &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + Cond: []ast.Vertex{ + &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }, }, - Loop: []node.Node{ - &expr.Variable{ - VarName: &node.Identifier{Value: "c"}, + Loop: []ast.Vertex{ + &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("c")}, }, }, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "d"}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("d")}, }}, }, }, @@ -2692,20 +2689,20 @@ func TestPrinterPrintAltForeach(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.AltForeach{ - Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "var"}, + p.Print(&ast.StmtAltForeach{ + Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("var")}, }, - Key: &expr.Variable{ - VarName: &node.Identifier{Value: "key"}, + Key: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("key")}, }, - Variable: &expr.Reference{Variable: &expr.Variable{ - VarName: &node.Identifier{Value: "val"}, + Var: &ast.ExprReference{Var: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("val")}, }}, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "d"}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("d")}, }}, }, }, @@ -2723,42 +2720,42 @@ func TestPrinterPrintAltIf(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.AltIf{ - Cond: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtAltIf{ + Cond: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "d"}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("d")}, }}, }, }, - ElseIf: []node.Node{ - &stmt.AltElseIf{ - Cond: &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + ElseIf: []ast.Vertex{ + &ast.StmtAltElseIf{ + Cond: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }}, }, }, }, - &stmt.AltElseIf{ - Cond: &expr.Variable{ - VarName: &node.Identifier{Value: "c"}, + &ast.StmtAltElseIf{ + Cond: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("c")}, }, - Stmt: &stmt.StmtList{}, + Stmt: &ast.StmtStmtList{}, }, }, - Else: &stmt.AltElse{ - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + Else: &ast.StmtAltElse{ + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }}, }, }, @@ -2777,25 +2774,25 @@ func TestPrinterPrintStmtAltSwitch(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.AltSwitch{ - Cond: &expr.Variable{ - VarName: &node.Identifier{Value: "var"}, + p.Print(&ast.StmtAltSwitch{ + Cond: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("var")}, }, - CaseList: &stmt.CaseList{ - Cases: []node.Node{ - &stmt.Case{ - Cond: &scalar.String{Value: "'a'"}, - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + CaseList: &ast.StmtCaseList{ + Cases: []ast.Vertex{ + &ast.StmtCase{ + Cond: &ast.ScalarString{Value: []byte("'a'")}, + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }}, }, }, - &stmt.Case{ - Cond: &scalar.String{Value: "'b'"}, - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + &ast.StmtCase{ + Cond: &ast.ScalarString{Value: []byte("'b'")}, + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }}, }, }, @@ -2815,14 +2812,14 @@ func TestPrinterPrintAltWhile(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.AltWhile{ - Cond: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtAltWhile{ + Cond: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }}, }, }, @@ -2840,9 +2837,9 @@ func TestPrinterPrintStmtBreak(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Break{ - Expr: &scalar.Lnumber{ - Value: "1", + p.Print(&ast.StmtBreak{ + Expr: &ast.ScalarLnumber{ + Value: []byte("1"), }, }) @@ -2858,13 +2855,13 @@ func TestPrinterPrintStmtCase(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Case{ - Cond: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtCase{ + Cond: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }}, }, }) @@ -2881,11 +2878,11 @@ func TestPrinterPrintStmtCaseEmpty(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Case{ - Cond: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtCase{ + Cond: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, - Stmts: []node.Node{}, + Stmts: []ast.Vertex{}, }) expected := "case $a:" @@ -2900,17 +2897,17 @@ func TestPrinterPrintStmtCatch(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Catch{ - Types: []node.Node{ - &name.Name{Parts: []node.Node{&name.NamePart{Value: "Exception"}}}, - &name.FullyQualified{Parts: []node.Node{&name.NamePart{Value: "RuntimeException"}}}, + p.Print(&ast.StmtCatch{ + Types: []ast.Vertex{ + &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Exception")}}}, + &ast.NameFullyQualified{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("RuntimeException")}}}, }, - Variable: &expr.Variable{ - VarName: &node.Identifier{Value: "e"}, + Var: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("e")}, }, - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }}, }, }) @@ -2927,33 +2924,33 @@ func TestPrinterPrintStmtClassMethod(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.ClassMethod{ - Modifiers: []node.Node{&node.Identifier{Value: "public"}}, + p.Print(&ast.StmtClassMethod{ + Modifiers: []ast.Vertex{&ast.Identifier{Value: []byte("public")}}, ReturnsRef: true, - MethodName: &node.Identifier{Value: "foo"}, - Params: []node.Node{ - &node.Parameter{ - ByRef: true, - VariableType: &node.Nullable{Expr: &name.Name{Parts: []node.Node{&name.NamePart{Value: "int"}}}}, - Variable: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + 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")}, }, - DefaultValue: &expr.ConstFetch{Constant: &name.Name{Parts: []node.Node{&name.NamePart{Value: "null"}}}}, + DefaultValue: &ast.ExprConstFetch{Const: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("null")}}}}, }, - &node.Parameter{ + &ast.Parameter{ Variadic: true, - Variable: &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + Var: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }, }, }, - ReturnType: &name.Name{ - Parts: []node.Node{&name.NamePart{Value: "void"}}, + ReturnType: &ast.NameName{ + Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("void")}}, }, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }}, }, }, @@ -2971,33 +2968,33 @@ func TestPrinterPrintStmtAbstractClassMethod(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.ClassMethod{ - Modifiers: []node.Node{ - &node.Identifier{Value: "public"}, - &node.Identifier{Value: "static"}, + p.Print(&ast.StmtClassMethod{ + Modifiers: []ast.Vertex{ + &ast.Identifier{Value: []byte("public")}, + &ast.Identifier{Value: []byte("static")}, }, ReturnsRef: true, - MethodName: &node.Identifier{Value: "foo"}, - Params: []node.Node{ - &node.Parameter{ - ByRef: true, - VariableType: &node.Nullable{Expr: &name.Name{Parts: []node.Node{&name.NamePart{Value: "int"}}}}, - Variable: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + 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")}, }, - DefaultValue: &expr.ConstFetch{Constant: &name.Name{Parts: []node.Node{&name.NamePart{Value: "null"}}}}, + DefaultValue: &ast.ExprConstFetch{Const: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("null")}}}}, }, - &node.Parameter{ + &ast.Parameter{ Variadic: true, - Variable: &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + Var: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }, }, }, - ReturnType: &name.Name{ - Parts: []node.Node{&name.NamePart{Value: "void"}}, + ReturnType: &ast.NameName{ + Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("void")}}, }, - Stmt: &stmt.Nop{}, + Stmt: &ast.StmtNop{}, }) expected := `public static function &foo(?int&$a=null,...$b):void;` @@ -3012,28 +3009,28 @@ func TestPrinterPrintStmtClass(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Class{ - Modifiers: []node.Node{&node.Identifier{Value: "abstract"}}, - ClassName: &node.Identifier{Value: "Foo"}, - Extends: &stmt.ClassExtends{ - ClassName: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}}, + p.Print(&ast.StmtClass{ + Modifiers: []ast.Vertex{&ast.Identifier{Value: []byte("abstract")}}, + ClassName: &ast.Identifier{Value: []byte("Foo")}, + Extends: &ast.StmtClassExtends{ + ClassName: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Bar")}}}, }, - Implements: &stmt.ClassImplements{ - InterfaceNames: []node.Node{ - &name.Name{Parts: []node.Node{&name.NamePart{Value: "Baz"}}}, - &name.Name{Parts: []node.Node{&name.NamePart{Value: "Quuz"}}}, + Implements: &ast.StmtClassImplements{ + InterfaceNames: []ast.Vertex{ + &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Baz")}}}, + &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Quuz")}}}, }, }, - Stmts: []node.Node{ - &stmt.ClassConstList{ - Modifiers: []node.Node{ - &node.Identifier{Value: "public"}, - &node.Identifier{Value: "static"}, + Stmts: []ast.Vertex{ + &ast.StmtClassConstList{ + Modifiers: []ast.Vertex{ + &ast.Identifier{Value: []byte("public")}, + &ast.Identifier{Value: []byte("static")}, }, - Consts: []node.Node{ - &stmt.Constant{ - ConstantName: &node.Identifier{Value: "FOO"}, - Expr: &scalar.String{Value: "'bar'"}, + Consts: []ast.Vertex{ + &ast.StmtConstant{ + ConstantName: &ast.Identifier{Value: []byte("FOO")}, + Expr: &ast.ScalarString{Value: []byte("'bar'")}, }, }, }, @@ -3052,38 +3049,38 @@ func TestPrinterPrintStmtAnonymousClass(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Class{ - Modifiers: []node.Node{&node.Identifier{Value: "abstract"}}, - ArgumentList: &node.ArgumentList{ - Arguments: []node.Node{ - &node.Argument{ - Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtClass{ + Modifiers: []ast.Vertex{&ast.Identifier{Value: []byte("abstract")}}, + ArgumentList: &ast.ArgumentList{ + Arguments: []ast.Vertex{ + &ast.Argument{ + Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, }, - &node.Argument{ - Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + &ast.Argument{ + Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }, }, }, }, - Extends: &stmt.ClassExtends{ - ClassName: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}}, + Extends: &ast.StmtClassExtends{ + ClassName: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Bar")}}}, }, - Implements: &stmt.ClassImplements{ - InterfaceNames: []node.Node{ - &name.Name{Parts: []node.Node{&name.NamePart{Value: "Baz"}}}, - &name.Name{Parts: []node.Node{&name.NamePart{Value: "Quuz"}}}, + Implements: &ast.StmtClassImplements{ + InterfaceNames: []ast.Vertex{ + &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Baz")}}}, + &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Quuz")}}}, }, }, - Stmts: []node.Node{ - &stmt.ClassConstList{ - Modifiers: []node.Node{&node.Identifier{Value: "public"}}, - Consts: []node.Node{ - &stmt.Constant{ - ConstantName: &node.Identifier{Value: "FOO"}, - Expr: &scalar.String{Value: "'bar'"}, + Stmts: []ast.Vertex{ + &ast.StmtClassConstList{ + Modifiers: []ast.Vertex{&ast.Identifier{Value: []byte("public")}}, + Consts: []ast.Vertex{ + &ast.StmtConstant{ + ConstantName: &ast.Identifier{Value: []byte("FOO")}, + Expr: &ast.ScalarString{Value: []byte("'bar'")}, }, }, }, @@ -3102,16 +3099,16 @@ func TestPrinterPrintStmtClassConstList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.ClassConstList{ - Modifiers: []node.Node{&node.Identifier{Value: "public"}}, - Consts: []node.Node{ - &stmt.Constant{ - ConstantName: &node.Identifier{Value: "FOO"}, - Expr: &scalar.String{Value: "'a'"}, + p.Print(&ast.StmtClassConstList{ + Modifiers: []ast.Vertex{&ast.Identifier{Value: []byte("public")}}, + Consts: []ast.Vertex{ + &ast.StmtConstant{ + ConstantName: &ast.Identifier{Value: []byte("FOO")}, + Expr: &ast.ScalarString{Value: []byte("'a'")}, }, - &stmt.Constant{ - ConstantName: &node.Identifier{Value: "BAR"}, - Expr: &scalar.String{Value: "'b'"}, + &ast.StmtConstant{ + ConstantName: &ast.Identifier{Value: []byte("BAR")}, + Expr: &ast.ScalarString{Value: []byte("'b'")}, }, }, }) @@ -3128,15 +3125,15 @@ func TestPrinterPrintStmtConstList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.ConstList{ - Consts: []node.Node{ - &stmt.Constant{ - ConstantName: &node.Identifier{Value: "FOO"}, - Expr: &scalar.String{Value: "'a'"}, + p.Print(&ast.StmtConstList{ + Consts: []ast.Vertex{ + &ast.StmtConstant{ + ConstantName: &ast.Identifier{Value: []byte("FOO")}, + Expr: &ast.ScalarString{Value: []byte("'a'")}, }, - &stmt.Constant{ - ConstantName: &node.Identifier{Value: "BAR"}, - Expr: &scalar.String{Value: "'b'"}, + &ast.StmtConstant{ + ConstantName: &ast.Identifier{Value: []byte("BAR")}, + Expr: &ast.ScalarString{Value: []byte("'b'")}, }, }, }) @@ -3153,9 +3150,9 @@ func TestPrinterPrintStmtConstant(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Constant{ - ConstantName: &node.Identifier{Value: "FOO"}, - Expr: &scalar.String{Value: "'BAR'"}, + p.Print(&ast.StmtConstant{ + ConstantName: &ast.Identifier{Value: []byte("FOO")}, + Expr: &ast.ScalarString{Value: []byte("'BAR'")}, }) expected := "FOO='BAR'" @@ -3170,9 +3167,9 @@ func TestPrinterPrintStmtContinue(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Continue{ - Expr: &scalar.Lnumber{ - Value: "1", + p.Print(&ast.StmtContinue{ + Expr: &ast.ScalarLnumber{ + Value: []byte("1"), }, }) @@ -3188,16 +3185,16 @@ func TestPrinterPrintStmtDeclareStmts(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Declare{ - Consts: []node.Node{ - &stmt.Constant{ - ConstantName: &node.Identifier{Value: "FOO"}, - Expr: &scalar.String{Value: "'bar'"}, + p.Print(&ast.StmtDeclare{ + Consts: []ast.Vertex{ + &ast.StmtConstant{ + ConstantName: &ast.Identifier{Value: []byte("FOO")}, + Expr: &ast.ScalarString{Value: []byte("'bar'")}, }, }, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Nop{}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtNop{}, }, }, }) @@ -3214,14 +3211,14 @@ func TestPrinterPrintStmtDeclareExpr(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Declare{ - Consts: []node.Node{ - &stmt.Constant{ - ConstantName: &node.Identifier{Value: "FOO"}, - Expr: &scalar.String{Value: "'bar'"}, + p.Print(&ast.StmtDeclare{ + Consts: []ast.Vertex{ + &ast.StmtConstant{ + ConstantName: &ast.Identifier{Value: []byte("FOO")}, + Expr: &ast.ScalarString{Value: []byte("'bar'")}, }, }, - Stmt: &stmt.Expression{Expr: &scalar.String{Value: "'bar'"}}, + Stmt: &ast.StmtExpression{Expr: &ast.ScalarString{Value: []byte("'bar'")}}, }) expected := `declare(FOO='bar')'bar';` @@ -3236,14 +3233,14 @@ func TestPrinterPrintStmtDeclareNop(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Declare{ - Consts: []node.Node{ - &stmt.Constant{ - ConstantName: &node.Identifier{Value: "FOO"}, - Expr: &scalar.String{Value: "'bar'"}, + p.Print(&ast.StmtDeclare{ + Consts: []ast.Vertex{ + &ast.StmtConstant{ + ConstantName: &ast.Identifier{Value: []byte("FOO")}, + Expr: &ast.ScalarString{Value: []byte("'bar'")}, }, }, - Stmt: &stmt.Nop{}, + Stmt: &ast.StmtNop{}, }) expected := `declare(FOO='bar');` @@ -3258,10 +3255,10 @@ func TestPrinterPrintStmtDefalut(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Default{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtDefault{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }}, }, }) @@ -3278,8 +3275,8 @@ func TestPrinterPrintStmtDefalutEmpty(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Default{ - Stmts: []node.Node{}, + p.Print(&ast.StmtDefault{ + Stmts: []ast.Vertex{}, }) expected := `default:` @@ -3294,11 +3291,11 @@ func TestPrinterPrintStmtDo_Expression(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Do{ - Cond: &scalar.Lnumber{Value: "1"}, - Stmt: &stmt.Expression{ - Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtDo{ + Cond: &ast.ScalarLnumber{Value: []byte("1")}, + Stmt: &ast.StmtExpression{ + Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, }, }) @@ -3315,12 +3312,12 @@ func TestPrinterPrintStmtDo_StmtList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Do{ - Cond: &scalar.Lnumber{Value: "1"}, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtDo{ + Cond: &ast.ScalarLnumber{Value: []byte("1")}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }}, }, }, @@ -3338,15 +3335,15 @@ func TestPrinterPrintStmtEchoHtmlState(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&node.Root{ - Stmts: []node.Node{ - &stmt.Echo{ - Exprs: []node.Node{ - &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.Root{ + Stmts: []ast.Vertex{ + &ast.StmtEcho{ + Exprs: []ast.Vertex{ + &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, - &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }, }, }, @@ -3365,13 +3362,13 @@ func TestPrinterPrintStmtEchoPhpState(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Echo{ - Exprs: []node.Node{ - &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtEcho{ + Exprs: []ast.Vertex{ + &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, - &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }, }, }) @@ -3388,13 +3385,13 @@ func TestPrinterPrintStmtElseIfStmts(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.ElseIf{ - Cond: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtElseIf{ + Cond: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Nop{}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtNop{}, }, }, }) @@ -3411,11 +3408,11 @@ func TestPrinterPrintStmtElseIfExpr(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.ElseIf{ - Cond: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtElseIf{ + Cond: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, - Stmt: &stmt.Expression{Expr: &scalar.String{Value: "'bar'"}}, + Stmt: &ast.StmtExpression{Expr: &ast.ScalarString{Value: []byte("'bar'")}}, }) expected := `elseif($a)'bar';` @@ -3430,11 +3427,11 @@ func TestPrinterPrintStmtElseIfNop(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.ElseIf{ - Cond: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtElseIf{ + Cond: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, - Stmt: &stmt.Nop{}, + Stmt: &ast.StmtNop{}, }) expected := `elseif($a);` @@ -3449,10 +3446,10 @@ func TestPrinterPrintStmtElseStmts(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Else{ - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Nop{}, + p.Print(&ast.StmtElse{ + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtNop{}, }, }, }) @@ -3469,8 +3466,8 @@ func TestPrinterPrintStmtElseExpr(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Else{ - Stmt: &stmt.Expression{Expr: &scalar.String{Value: "'bar'"}}, + p.Print(&ast.StmtElse{ + Stmt: &ast.StmtExpression{Expr: &ast.ScalarString{Value: []byte("'bar'")}}, }) expected := `else 'bar';` @@ -3485,8 +3482,8 @@ func TestPrinterPrintStmtElseNop(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Else{ - Stmt: &stmt.Nop{}, + p.Print(&ast.StmtElse{ + Stmt: &ast.StmtNop{}, }) expected := `else ;` @@ -3501,9 +3498,9 @@ func TestPrinterPrintExpression(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Expression{ - Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtExpression{ + Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, }) @@ -3519,9 +3516,9 @@ func TestPrinterPrintStmtFinally(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Finally{ - Stmts: []node.Node{ - &stmt.Nop{}, + p.Print(&ast.StmtFinally{ + Stmts: []ast.Vertex{ + &ast.StmtNop{}, }, }) @@ -3537,34 +3534,34 @@ func TestPrinterPrintStmtFor(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.For{ - Init: []node.Node{ - &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtFor{ + Init: []ast.Vertex{ + &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, - &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }, }, - Cond: []node.Node{ - &expr.Variable{ - VarName: &node.Identifier{Value: "c"}, + Cond: []ast.Vertex{ + &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("c")}, }, - &expr.Variable{ - VarName: &node.Identifier{Value: "d"}, + &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("d")}, }, }, - Loop: []node.Node{ - &expr.Variable{ - VarName: &node.Identifier{Value: "e"}, + Loop: []ast.Vertex{ + &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("e")}, }, - &expr.Variable{ - VarName: &node.Identifier{Value: "f"}, + &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("f")}, }, }, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Nop{}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtNop{}, }, }, }) @@ -3581,19 +3578,19 @@ func TestPrinterPrintStmtForeach(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Foreach{ - Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtForeach{ + Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, - Key: &expr.Variable{ - VarName: &node.Identifier{Value: "k"}, + Key: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("k")}, }, - Variable: &expr.Variable{ - VarName: &node.Identifier{Value: "v"}, + Var: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("v")}, }, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Nop{}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtNop{}, }, }, }) @@ -3610,23 +3607,23 @@ func TestPrinterPrintStmtFunction(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Function{ + p.Print(&ast.StmtFunction{ ReturnsRef: true, - FunctionName: &node.Identifier{Value: "foo"}, - Params: []node.Node{ - &node.Parameter{ + FunctionName: &ast.Identifier{Value: []byte("foo")}, + Params: []ast.Vertex{ + &ast.Parameter{ ByRef: true, Variadic: false, - Variable: &expr.Variable{ - VarName: &node.Identifier{Value: "var"}, + Var: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("var")}, }, }, }, - ReturnType: &name.FullyQualified{ - Parts: []node.Node{&name.NamePart{Value: "Foo"}}, + ReturnType: &ast.NameFullyQualified{ + Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}, }, - Stmts: []node.Node{ - &stmt.Nop{}, + Stmts: []ast.Vertex{ + &ast.StmtNop{}, }, }) @@ -3642,13 +3639,13 @@ func TestPrinterPrintStmtGlobal(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Global{ - Vars: []node.Node{ - &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtGlobal{ + Vars: []ast.Vertex{ + &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, - &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }, }, }) @@ -3665,8 +3662,8 @@ func TestPrinterPrintStmtGoto(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Goto{ - Label: &node.Identifier{Value: "FOO"}, + p.Print(&ast.StmtGoto{ + Label: &ast.Identifier{Value: []byte("FOO")}, }) expected := `goto FOO;` @@ -3681,16 +3678,16 @@ func TestPrinterPrintStmtGroupUse(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.GroupUse{ - UseType: &node.Identifier{Value: "function"}, - Prefix: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, - UseList: []node.Node{ - &stmt.Use{ - Use: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}}, - Alias: &node.Identifier{Value: "Baz"}, + p.Print(&ast.StmtGroupUse{ + UseType: &ast.Identifier{Value: []byte("function")}, + Prefix: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, + UseList: []ast.Vertex{ + &ast.StmtUse{ + Use: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Bar")}}}, + Alias: &ast.Identifier{Value: []byte("Baz")}, }, - &stmt.Use{ - Use: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Quuz"}}}, + &ast.StmtUse{ + Use: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Quuz")}}}, }, }, }) @@ -3707,7 +3704,7 @@ func TestPrinterPrintHaltCompiler(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.HaltCompiler{}) + p.Print(&ast.StmtHaltCompiler{}) expected := `__halt_compiler();` actual := o.String() @@ -3721,41 +3718,41 @@ func TestPrinterPrintIfExpression(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.If{ - Cond: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtIf{ + Cond: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, - Stmt: &stmt.Expression{ - Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + Stmt: &ast.StmtExpression{ + Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }, }, - ElseIf: []node.Node{ - &stmt.ElseIf{ - Cond: &expr.Variable{ - VarName: &node.Identifier{Value: "c"}, + ElseIf: []ast.Vertex{ + &ast.StmtElseIf{ + Cond: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("c")}, }, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{ - Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "d"}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{ + Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("d")}, }, }, }, }, }, - &stmt.ElseIf{ - Cond: &expr.Variable{ - VarName: &node.Identifier{Value: "e"}, + &ast.StmtElseIf{ + Cond: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("e")}, }, - Stmt: &stmt.Nop{}, + Stmt: &ast.StmtNop{}, }, }, - Else: &stmt.Else{ - Stmt: &stmt.Expression{ - Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "f"}, + Else: &ast.StmtElse{ + Stmt: &ast.StmtExpression{ + Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("f")}, }, }, }, @@ -3773,15 +3770,15 @@ func TestPrinterPrintIfStmtList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.If{ - Cond: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtIf{ + Cond: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{ - Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{ + Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }, }, }, @@ -3800,11 +3797,11 @@ func TestPrinterPrintIfNop(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.If{ - Cond: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtIf{ + Cond: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, - Stmt: &stmt.Nop{}, + Stmt: &ast.StmtNop{}, }) expected := `if($a);` @@ -3819,10 +3816,10 @@ func TestPrinterPrintInlineHtml(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&node.Root{ - Stmts: []node.Node{ - &stmt.InlineHtml{ - Value: "test", + p.Print(&ast.Root{ + Stmts: []ast.Vertex{ + &ast.StmtInlineHtml{ + Value: []byte("test"), }, }, }) @@ -3839,23 +3836,23 @@ func TestPrinterPrintInterface(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Interface{ - InterfaceName: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, - Extends: &stmt.InterfaceExtends{ - InterfaceNames: []node.Node{ - &name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}}, - &name.Name{Parts: []node.Node{&name.NamePart{Value: "Baz"}}}, + p.Print(&ast.StmtInterface{ + InterfaceName: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, + Extends: &ast.StmtInterfaceExtends{ + InterfaceNames: []ast.Vertex{ + &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Bar")}}}, + &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Baz")}}}, }, }, - Stmts: []node.Node{ - &stmt.ClassMethod{ - Modifiers: []node.Node{&node.Identifier{Value: "public"}}, - MethodName: &node.Identifier{Value: "foo"}, - Params: []node.Node{}, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + Stmts: []ast.Vertex{ + &ast.StmtClassMethod{ + Modifiers: []ast.Vertex{&ast.Identifier{Value: []byte("public")}}, + MethodName: &ast.Identifier{Value: []byte("foo")}, + Params: []ast.Vertex{}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }}, }, }, @@ -3875,8 +3872,8 @@ func TestPrinterPrintLabel(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Label{ - LabelName: &node.Identifier{Value: "FOO"}, + p.Print(&ast.StmtLabel{ + LabelName: &ast.Identifier{Value: []byte("FOO")}, }) expected := `FOO:` @@ -3891,8 +3888,8 @@ func TestPrinterPrintNamespace(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Namespace{ - NamespaceName: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, + p.Print(&ast.StmtNamespace{ + NamespaceName: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, }) expected := `namespace Foo;` @@ -3907,11 +3904,11 @@ func TestPrinterPrintNamespaceWithStmts(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Namespace{ - NamespaceName: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtNamespace{ + NamespaceName: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }}, }, }) @@ -3928,7 +3925,7 @@ func TestPrinterPrintNop(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Nop{}) + p.Print(&ast.StmtNop{}) expected := `;` actual := o.String() @@ -3942,28 +3939,28 @@ func TestPrinterPrintPropertyList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.PropertyList{ - Modifiers: []node.Node{ - &node.Identifier{Value: "public"}, - &node.Identifier{Value: "static"}, + p.Print(&ast.StmtPropertyList{ + Modifiers: []ast.Vertex{ + &ast.Identifier{Value: []byte("public")}, + &ast.Identifier{Value: []byte("static")}, }, - Type: &name.Name{ - Parts: []node.Node{ - &name.NamePart{ - Value: "Foo", + Type: &ast.NameName{ + Parts: []ast.Vertex{ + &ast.NameNamePart{ + Value: []byte("Foo"), }, }, }, - Properties: []node.Node{ - &stmt.Property{ - Variable: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + Properties: []ast.Vertex{ + &ast.StmtProperty{ + Var: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, - Expr: &scalar.String{Value: "'a'"}, + Expr: &ast.ScalarString{Value: []byte("'a'")}, }, - &stmt.Property{ - Variable: &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + &ast.StmtProperty{ + Var: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }, }, }, @@ -3981,19 +3978,21 @@ func TestPrinterPrintProperty(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Property{ - Variable: &expr.Variable{ - FreeFloating: freefloating.Collection{ - freefloating.Start: []freefloating.String{ - { - StringType: freefloating.TokenType, - Value: "$", + p.Print(&ast.StmtProperty{ + Var: &ast.ExprVariable{ + Node: ast.Node{ + Tokens: token.Collection{ + token.Start: []token.Token{ + { + ID: token.ID('$'), + Value: []byte("$"), + }, }, }, }, - VarName: &node.Identifier{Value: "a"}, + VarName: &ast.Identifier{Value: []byte("a")}, }, - Expr: &scalar.Lnumber{Value: "1"}, + Expr: &ast.ScalarLnumber{Value: []byte("1")}, }) expected := `$a=1` @@ -4008,8 +4007,8 @@ func TestPrinterPrintReturn(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Return{ - Expr: &scalar.Lnumber{Value: "1"}, + p.Print(&ast.StmtReturn{ + Expr: &ast.ScalarLnumber{Value: []byte("1")}, }) expected := `return 1;` @@ -4024,11 +4023,11 @@ func TestPrinterPrintStaticVar(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.StaticVar{ - Variable: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtStaticVar{ + Var: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, - Expr: &scalar.Lnumber{Value: "1"}, + Expr: &ast.ScalarLnumber{Value: []byte("1")}, }) expected := `$a=1` @@ -4043,16 +4042,16 @@ func TestPrinterPrintStatic(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Static{ - Vars: []node.Node{ - &stmt.StaticVar{ - Variable: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtStatic{ + Vars: []ast.Vertex{ + &ast.StmtStaticVar{ + Var: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, }, - &stmt.StaticVar{ - Variable: &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + &ast.StmtStaticVar{ + Var: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }, }, }, @@ -4070,13 +4069,13 @@ func TestPrinterPrintStmtList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }}, - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }}, }, }) @@ -4093,20 +4092,20 @@ func TestPrinterPrintStmtListNested(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }}, - &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }}, - &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "c"}, + &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("c")}, }}, }, }, @@ -4127,25 +4126,25 @@ func TestPrinterPrintStmtSwitch(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Switch{ - Cond: &expr.Variable{ - VarName: &node.Identifier{Value: "var"}, + p.Print(&ast.StmtSwitch{ + Cond: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("var")}, }, - CaseList: &stmt.CaseList{ - Cases: []node.Node{ - &stmt.Case{ - Cond: &scalar.String{Value: "'a'"}, - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + CaseList: &ast.StmtCaseList{ + Cases: []ast.Vertex{ + &ast.StmtCase{ + Cond: &ast.ScalarString{Value: []byte("'a'")}, + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }}, }, }, - &stmt.Case{ - Cond: &scalar.String{Value: "'b'"}, - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + &ast.StmtCase{ + Cond: &ast.ScalarString{Value: []byte("'b'")}, + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }}, }, }, @@ -4165,9 +4164,9 @@ func TestPrinterPrintStmtThrow(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Throw{ - Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "var"}, + p.Print(&ast.StmtThrow{ + Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("var")}, }, }) @@ -4183,14 +4182,14 @@ func TestPrinterPrintStmtTraitAdaptationList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.TraitAdaptationList{ - Adaptations: []node.Node{ - &stmt.TraitUseAlias{ - Ref: &stmt.TraitMethodRef{ - Trait: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, - Method: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtTraitAdaptationList{ + Adaptations: []ast.Vertex{ + &ast.StmtTraitUseAlias{ + Ref: &ast.StmtTraitMethodRef{ + Trait: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, + Method: &ast.Identifier{Value: []byte("a")}, }, - Alias: &node.Identifier{Value: "b"}, + Alias: &ast.Identifier{Value: []byte("b")}, }, }, }) @@ -4207,8 +4206,8 @@ func TestPrinterPrintStmtTraitMethodRef(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.TraitMethodRef{ - Method: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtTraitMethodRef{ + Method: &ast.Identifier{Value: []byte("a")}, }) expected := `a` @@ -4223,9 +4222,9 @@ func TestPrinterPrintStmtTraitMethodRefFull(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.TraitMethodRef{ - Trait: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, - Method: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtTraitMethodRef{ + Trait: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, + Method: &ast.Identifier{Value: []byte("a")}, }) expected := `Foo::a` @@ -4240,13 +4239,13 @@ func TestPrinterPrintStmtTraitUseAlias(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.TraitUseAlias{ - Ref: &stmt.TraitMethodRef{ - Trait: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, - Method: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtTraitUseAlias{ + Ref: &ast.StmtTraitMethodRef{ + Trait: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, + Method: &ast.Identifier{Value: []byte("a")}, }, - Modifier: &node.Identifier{Value: "public"}, - Alias: &node.Identifier{Value: "b"}, + Modifier: &ast.Identifier{Value: []byte("public")}, + Alias: &ast.Identifier{Value: []byte("b")}, }) expected := `Foo::a as public b;` @@ -4261,14 +4260,14 @@ func TestPrinterPrintStmtTraitUsePrecedence(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.TraitUsePrecedence{ - Ref: &stmt.TraitMethodRef{ - Trait: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, - Method: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtTraitUsePrecedence{ + Ref: &ast.StmtTraitMethodRef{ + Trait: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, + Method: &ast.Identifier{Value: []byte("a")}, }, - Insteadof: []node.Node{ - &name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}}, - &name.Name{Parts: []node.Node{&name.NamePart{Value: "Baz"}}}, + Insteadof: []ast.Vertex{ + &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Bar")}}}, + &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Baz")}}}, }, }) @@ -4284,12 +4283,12 @@ func TestPrinterPrintStmtTraitUse(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.TraitUse{ - Traits: []node.Node{ - &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, - &name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}}, + p.Print(&ast.StmtTraitUse{ + Traits: []ast.Vertex{ + &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, + &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Bar")}}}, }, - TraitAdaptationList: &stmt.Nop{}, + TraitAdaptationList: &ast.StmtNop{}, }) expected := `use Foo,Bar;` @@ -4304,19 +4303,19 @@ func TestPrinterPrintStmtTraitAdaptations(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.TraitUse{ - Traits: []node.Node{ - &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, - &name.Name{Parts: []node.Node{&name.NamePart{Value: "Bar"}}}, + p.Print(&ast.StmtTraitUse{ + Traits: []ast.Vertex{ + &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, + &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Bar")}}}, }, - TraitAdaptationList: &stmt.TraitAdaptationList{ - Adaptations: []node.Node{ - &stmt.TraitUseAlias{ - Ref: &stmt.TraitMethodRef{ - Trait: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, - Method: &node.Identifier{Value: "a"}, + TraitAdaptationList: &ast.StmtTraitAdaptationList{ + Adaptations: []ast.Vertex{ + &ast.StmtTraitUseAlias{ + Ref: &ast.StmtTraitMethodRef{ + Trait: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, + Method: &ast.Identifier{Value: []byte("a")}, }, - Alias: &node.Identifier{Value: "b"}, + Alias: &ast.Identifier{Value: []byte("b")}, }, }, }, @@ -4334,17 +4333,17 @@ func TestPrinterPrintTrait(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Trait{ - TraitName: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, - Stmts: []node.Node{ - &stmt.ClassMethod{ - Modifiers: []node.Node{&node.Identifier{Value: "public"}}, - MethodName: &node.Identifier{Value: "foo"}, - Params: []node.Node{}, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtTrait{ + TraitName: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, + Stmts: []ast.Vertex{ + &ast.StmtClassMethod{ + Modifiers: []ast.Vertex{&ast.Identifier{Value: []byte("public")}}, + MethodName: &ast.Identifier{Value: []byte("foo")}, + Params: []ast.Vertex{}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }}, }, }, @@ -4364,31 +4363,31 @@ func TestPrinterPrintStmtTry(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Try{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtTry{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }}, }, - Catches: []node.Node{ - &stmt.Catch{ - Types: []node.Node{ - &name.Name{Parts: []node.Node{&name.NamePart{Value: "Exception"}}}, - &name.FullyQualified{Parts: []node.Node{&name.NamePart{Value: "RuntimeException"}}}, + Catches: []ast.Vertex{ + &ast.StmtCatch{ + Types: []ast.Vertex{ + &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Exception")}}}, + &ast.NameFullyQualified{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("RuntimeException")}}}, }, - Variable: &expr.Variable{ - VarName: &node.Identifier{Value: "e"}, + Var: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("e")}, }, - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }}, }, }, }, - Finally: &stmt.Finally{ - Stmts: []node.Node{ - &stmt.Nop{}, + Finally: &ast.StmtFinally{ + Stmts: []ast.Vertex{ + &ast.StmtNop{}, }, }, }) @@ -4405,13 +4404,13 @@ func TestPrinterPrintStmtUnset(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Unset{ - Vars: []node.Node{ - &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtUnset{ + Vars: []ast.Vertex{ + &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, - &expr.Variable{ - VarName: &node.Identifier{Value: "b"}, + &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("b")}, }, }, }) @@ -4428,15 +4427,15 @@ func TestPrinterPrintStmtUseList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.UseList{ - UseType: &node.Identifier{Value: "function"}, - Uses: []node.Node{ - &stmt.Use{ - Use: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, - Alias: &node.Identifier{Value: "Bar"}, + p.Print(&ast.StmtUseList{ + UseType: &ast.Identifier{Value: []byte("function")}, + Uses: []ast.Vertex{ + &ast.StmtUse{ + Use: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, + Alias: &ast.Identifier{Value: []byte("Bar")}, }, - &stmt.Use{ - Use: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Baz"}}}, + &ast.StmtUse{ + Use: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Baz")}}}, }, }, }) @@ -4453,10 +4452,10 @@ func TestPrinterPrintUse(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.Use{ - UseType: &node.Identifier{Value: "function"}, - Use: &name.Name{Parts: []node.Node{&name.NamePart{Value: "Foo"}}}, - Alias: &node.Identifier{Value: "Bar"}, + p.Print(&ast.StmtUse{ + UseType: &ast.Identifier{Value: []byte("function")}, + Use: &ast.NameName{Parts: []ast.Vertex{&ast.NameNamePart{Value: []byte("Foo")}}}, + Alias: &ast.Identifier{Value: []byte("Bar")}, }) expected := `function Foo as Bar` @@ -4471,14 +4470,14 @@ func TestPrinterPrintWhileStmtList(t *testing.T) { o := bytes.NewBufferString("") p := printer.NewPrinter(o) - p.Print(&stmt.While{ - Cond: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + p.Print(&ast.StmtWhile{ + Cond: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }, - Stmt: &stmt.StmtList{ - Stmts: []node.Node{ - &stmt.Expression{Expr: &expr.Variable{ - VarName: &node.Identifier{Value: "a"}, + Stmt: &ast.StmtStmtList{ + Stmts: []ast.Vertex{ + &ast.StmtExpression{Expr: &ast.ExprVariable{ + VarName: &ast.Identifier{Value: []byte("a")}, }}, }, }, diff --git a/pkg/token/position.go b/pkg/token/position.go index 209ed9d..7032e5a 100644 --- a/pkg/token/position.go +++ b/pkg/token/position.go @@ -2,8 +2,6 @@ package token type Position int -type Collection map[Position][]Token - //go:generate stringer -type=Position -output ./position_string.go const ( Start Position = iota @@ -86,3 +84,14 @@ const ( OpenParenthesisToken CloseParenthesisToken ) + +type Collection map[Position][]Token + +func (c Collection) IsEmpty() bool { + for _, v := range c { + if len(v) > 0 { + return false + } + } + return true +} diff --git a/printer/printer.go b/printer/printer.go deleted file mode 100644 index 06ad2ae..0000000 --- a/printer/printer.go +++ /dev/null @@ -1,3267 +0,0 @@ -package printer - -import ( - "io" - "strings" - - "github.com/z7zmey/php-parser/freefloating" - - "github.com/z7zmey/php-parser/node/stmt" - - "github.com/z7zmey/php-parser/node" - "github.com/z7zmey/php-parser/node/expr" - "github.com/z7zmey/php-parser/node/expr/assign" - "github.com/z7zmey/php-parser/node/expr/binary" - "github.com/z7zmey/php-parser/node/expr/cast" - "github.com/z7zmey/php-parser/node/name" - "github.com/z7zmey/php-parser/node/scalar" -) - -type printerState int - -const ( - PhpState printerState = iota - HtmlState -) - -type Printer struct { - w io.Writer - s printerState -} - -// NewPrinter - Constructor for Printer -func NewPrinter(w io.Writer) *Printer { - return &Printer{ - w: w, - } -} - -func (p *Printer) SetState(s printerState) { - p.s = s -} - -func (p *Printer) Print(n node.Node) { - _, isRoot := n.(*node.Root) - _, isInlineHtml := n.(*stmt.InlineHtml) - if p.s == HtmlState && !isInlineHtml && !isRoot { - if n.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " 0 { - io.WriteString(p.w, glue) - } - - p.Print(n) - } -} - -func (p *Printer) printNodes(nn []node.Node) { - for _, n := range nn { - p.Print(n) - } -} - -func (p *Printer) printFreeFloating(n node.Node, pos freefloating.Position) { - if n == nil { - return - } - - for _, m := range (*n.GetFreeFloating())[pos] { - io.WriteString(p.w, m.Value) - } -} - -func (p *Printer) printNode(n node.Node) { - switch n.(type) { - - // node - - case *node.Root: - p.printNodeRoot(n) - case *node.Identifier: - p.printNodeIdentifier(n) - case *node.Parameter: - p.printNodeParameter(n) - case *node.Nullable: - p.printNodeNullable(n) - case *node.Argument: - p.printNodeArgument(n) - - // name - - case *name.NamePart: - p.printNameNamePart(n) - case *name.Name: - p.printNameName(n) - case *name.FullyQualified: - p.printNameFullyQualified(n) - case *name.Relative: - p.printNameRelative(n) - - // scalar - - case *scalar.Lnumber: - p.printScalarLNumber(n) - case *scalar.Dnumber: - p.printScalarDNumber(n) - case *scalar.String: - p.printScalarString(n) - case *scalar.EncapsedStringPart: - p.printScalarEncapsedStringPart(n) - case *scalar.Encapsed: - p.printScalarEncapsed(n) - case *scalar.Heredoc: - p.printScalarHeredoc(n) - case *scalar.MagicConstant: - p.printScalarMagicConstant(n) - - // assign - - case *assign.Assign: - p.printAssign(n) - case *assign.Reference: - p.printAssignReference(n) - case *assign.BitwiseAnd: - p.printAssignBitwiseAnd(n) - case *assign.BitwiseOr: - p.printAssignBitwiseOr(n) - case *assign.BitwiseXor: - p.printAssignBitwiseXor(n) - case *assign.Coalesce: - p.printAssignCoalesce(n) - case *assign.Concat: - p.printAssignConcat(n) - case *assign.Div: - p.printAssignDiv(n) - case *assign.Minus: - p.printAssignMinus(n) - case *assign.Mod: - p.printAssignMod(n) - case *assign.Mul: - p.printAssignMul(n) - case *assign.Plus: - p.printAssignPlus(n) - case *assign.Pow: - p.printAssignPow(n) - case *assign.ShiftLeft: - p.printAssignShiftLeft(n) - case *assign.ShiftRight: - p.printAssignShiftRight(n) - - // binary - - case *binary.BitwiseAnd: - p.printBinaryBitwiseAnd(n) - case *binary.BitwiseOr: - p.printBinaryBitwiseOr(n) - case *binary.BitwiseXor: - p.printBinaryBitwiseXor(n) - case *binary.BooleanAnd: - p.printBinaryBooleanAnd(n) - case *binary.BooleanOr: - p.printBinaryBooleanOr(n) - case *binary.Coalesce: - p.printBinaryCoalesce(n) - case *binary.Concat: - p.printBinaryConcat(n) - case *binary.Div: - p.printBinaryDiv(n) - case *binary.Equal: - p.printBinaryEqual(n) - case *binary.GreaterOrEqual: - p.printBinaryGreaterOrEqual(n) - case *binary.Greater: - p.printBinaryGreater(n) - case *binary.Identical: - p.printBinaryIdentical(n) - case *binary.LogicalAnd: - p.printBinaryLogicalAnd(n) - case *binary.LogicalOr: - p.printBinaryLogicalOr(n) - case *binary.LogicalXor: - p.printBinaryLogicalXor(n) - case *binary.Minus: - p.printBinaryMinus(n) - case *binary.Mod: - p.printBinaryMod(n) - case *binary.Mul: - p.printBinaryMul(n) - case *binary.NotEqual: - p.printBinaryNotEqual(n) - case *binary.NotIdentical: - p.printBinaryNotIdentical(n) - case *binary.Plus: - p.printBinaryPlus(n) - case *binary.Pow: - p.printBinaryPow(n) - case *binary.ShiftLeft: - p.printBinaryShiftLeft(n) - case *binary.ShiftRight: - p.printBinaryShiftRight(n) - case *binary.SmallerOrEqual: - p.printBinarySmallerOrEqual(n) - case *binary.Smaller: - p.printBinarySmaller(n) - case *binary.Spaceship: - p.printBinarySpaceship(n) - - // cast - - case *cast.Array: - p.printArray(n) - case *cast.Bool: - p.printBool(n) - case *cast.Double: - p.printDouble(n) - case *cast.Int: - p.printInt(n) - case *cast.Object: - p.printObject(n) - case *cast.String: - p.printString(n) - case *cast.Unset: - p.printUnset(n) - - // expr - - case *expr.ArrayDimFetch: - p.printExprArrayDimFetch(n) - case *expr.ArrayItem: - p.printExprArrayItem(n) - case *expr.Array: - p.printExprArray(n) - case *expr.ArrowFunction: - p.printExprArrowFunction(n) - case *expr.BitwiseNot: - p.printExprBitwiseNot(n) - case *expr.BooleanNot: - p.printExprBooleanNot(n) - case *expr.ClassConstFetch: - p.printExprClassConstFetch(n) - case *expr.Clone: - p.printExprClone(n) - case *expr.ClosureUse: - p.printExprClosureUse(n) - case *expr.Closure: - p.printExprClosure(n) - case *expr.ConstFetch: - p.printExprConstFetch(n) - case *expr.Empty: - p.printExprEmpty(n) - case *expr.ErrorSuppress: - p.printExprErrorSuppress(n) - case *expr.Eval: - p.printExprEval(n) - case *expr.Exit: - p.printExprExit(n) - case *expr.FunctionCall: - p.printExprFunctionCall(n) - case *expr.Include: - p.printExprInclude(n) - case *expr.IncludeOnce: - p.printExprIncludeOnce(n) - case *expr.InstanceOf: - p.printExprInstanceOf(n) - case *expr.Isset: - p.printExprIsset(n) - case *expr.List: - p.printExprList(n) - case *expr.MethodCall: - p.printExprMethodCall(n) - case *expr.New: - p.printExprNew(n) - case *expr.PostDec: - p.printExprPostDec(n) - case *expr.PostInc: - p.printExprPostInc(n) - case *expr.PreDec: - p.printExprPreDec(n) - case *expr.PreInc: - p.printExprPreInc(n) - case *expr.Print: - p.printExprPrint(n) - case *expr.PropertyFetch: - p.printExprPropertyFetch(n) - case *expr.Reference: - p.printExprReference(n) - case *expr.Require: - p.printExprRequire(n) - case *expr.RequireOnce: - p.printExprRequireOnce(n) - case *expr.ShellExec: - p.printExprShellExec(n) - case *expr.ShortArray: - p.printExprShortArray(n) - case *expr.ShortList: - p.printExprShortList(n) - case *expr.StaticCall: - p.printExprStaticCall(n) - case *expr.StaticPropertyFetch: - p.printExprStaticPropertyFetch(n) - case *expr.Ternary: - p.printExprTernary(n) - case *expr.UnaryMinus: - p.printExprUnaryMinus(n) - case *expr.UnaryPlus: - p.printExprUnaryPlus(n) - case *expr.Variable: - p.printExprVariable(n) - case *expr.YieldFrom: - p.printExprYieldFrom(n) - case *expr.Yield: - p.printExprYield(n) - - // stmt - - case *stmt.AltElseIf: - p.printStmtAltElseIf(n) - case *stmt.AltElse: - p.printStmtAltElse(n) - case *stmt.AltFor: - p.printStmtAltFor(n) - case *stmt.AltForeach: - p.printStmtAltForeach(n) - case *stmt.AltIf: - p.printStmtAltIf(n) - case *stmt.AltSwitch: - p.printStmtAltSwitch(n) - case *stmt.AltWhile: - p.printStmtAltWhile(n) - case *stmt.Break: - p.printStmtBreak(n) - case *stmt.Case: - p.printStmtCase(n) - case *stmt.Catch: - p.printStmtCatch(n) - case *stmt.ClassMethod: - p.printStmtClassMethod(n) - case *stmt.Class: - p.printStmtClass(n) - case *stmt.ClassConstList: - p.printStmtClassConstList(n) - case *stmt.ConstList: - p.printStmtConstList(n) - case *stmt.Constant: - p.printStmtConstant(n) - case *stmt.Continue: - p.printStmtContinue(n) - case *stmt.Declare: - p.printStmtDeclare(n) - case *stmt.Default: - p.printStmtDefault(n) - case *stmt.Do: - p.printStmtDo(n) - case *stmt.Echo: - p.printStmtEcho(n) - case *stmt.ElseIf: - p.printStmtElseif(n) - case *stmt.Else: - p.printStmtElse(n) - case *stmt.Expression: - p.printStmtExpression(n) - case *stmt.Finally: - p.printStmtFinally(n) - case *stmt.For: - p.printStmtFor(n) - case *stmt.Foreach: - p.printStmtForeach(n) - case *stmt.Function: - p.printStmtFunction(n) - case *stmt.Global: - p.printStmtGlobal(n) - case *stmt.Goto: - p.printStmtGoto(n) - case *stmt.GroupUse: - p.printStmtGroupUse(n) - case *stmt.HaltCompiler: - p.printStmtHaltCompiler(n) - case *stmt.If: - p.printStmtIf(n) - case *stmt.InlineHtml: - p.printStmtInlineHTML(n) - case *stmt.Interface: - p.printStmtInterface(n) - case *stmt.Label: - p.printStmtLabel(n) - case *stmt.Namespace: - p.printStmtNamespace(n) - case *stmt.Nop: - p.printStmtNop(n) - case *stmt.PropertyList: - p.printStmtPropertyList(n) - case *stmt.Property: - p.printStmtProperty(n) - case *stmt.Return: - p.printStmtReturn(n) - case *stmt.StaticVar: - p.printStmtStaticVar(n) - case *stmt.Static: - p.printStmtStatic(n) - case *stmt.StmtList: - p.printStmtStmtList(n) - case *stmt.Switch: - p.printStmtSwitch(n) - case *stmt.Throw: - p.printStmtThrow(n) - case *stmt.TraitAdaptationList: - p.printStmtTraitAdaptationList(n) - case *stmt.TraitMethodRef: - p.printStmtTraitMethodRef(n) - case *stmt.TraitUseAlias: - p.printStmtTraitUseAlias(n) - case *stmt.TraitUsePrecedence: - p.printStmtTraitUsePrecedence(n) - case *stmt.TraitUse: - p.printStmtTraitUse(n) - case *stmt.Trait: - p.printStmtTrait(n) - case *stmt.Try: - p.printStmtTry(n) - case *stmt.Unset: - p.printStmtUnset(n) - case *stmt.UseList: - p.printStmtUseList(n) - case *stmt.Use: - p.printStmtUse(n) - case *stmt.While: - p.printStmtWhile(n) - } -} - -// node - -func (p *Printer) printNodeRoot(n node.Node) { - nn := n.(*node.Root) - p.SetState(HtmlState) - p.printFreeFloating(nn, freefloating.Start) - p.printNodes(nn.Stmts) - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printNodeIdentifier(n node.Node) { - nn := n.(*node.Identifier) - p.printFreeFloating(nn, freefloating.Start) - io.WriteString(p.w, nn.Value) - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printNodeParameter(n node.Node) { - nn := n.(*node.Parameter) - p.printFreeFloating(nn, freefloating.Start) - - if nn.VariableType != nil { - p.Print(nn.VariableType) - } - p.printFreeFloating(nn, freefloating.OptionalType) - - if nn.ByRef { - io.WriteString(p.w, "&") - } - p.printFreeFloating(nn, freefloating.Ampersand) - - if nn.Variadic { - io.WriteString(p.w, "...") - } - p.printFreeFloating(nn, freefloating.Variadic) - - p.Print(nn.Variable) - - if nn.DefaultValue != nil { - p.printFreeFloating(nn, freefloating.Var) - io.WriteString(p.w, "=") - p.Print(nn.DefaultValue) - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printNodeNullable(n node.Node) { - nn := n.(*node.Nullable) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "?") - p.Print(nn.Expr) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printNodeArgument(n node.Node) { - nn := n.(*node.Argument) - p.printFreeFloating(nn, freefloating.Start) - - if nn.IsReference { - io.WriteString(p.w, "&") - } - p.printFreeFloating(nn, freefloating.Ampersand) - - if nn.Variadic { - io.WriteString(p.w, "...") - } - p.printFreeFloating(nn, freefloating.Variadic) - - p.Print(nn.Expr) - - p.printFreeFloating(nn, freefloating.End) -} - -// name - -func (p *Printer) printNameNamePart(n node.Node) { - nn := n.(*name.NamePart) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, nn.Value) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printNameName(n node.Node) { - nn := n.(*name.Name) - p.printFreeFloating(nn, freefloating.Start) - - p.joinPrint("\\", nn.Parts) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printNameFullyQualified(n node.Node) { - nn := n.(*name.FullyQualified) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "\\") - p.joinPrint("\\", nn.Parts) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printNameRelative(n node.Node) { - nn := n.(*name.Relative) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "namespace") - p.printFreeFloating(nn, freefloating.Namespace) - - for _, part := range nn.Parts { - io.WriteString(p.w, "\\") - p.Print(part) - } - - p.printFreeFloating(nn, freefloating.End) -} - -// scalar - -func (p *Printer) printScalarLNumber(n node.Node) { - nn := n.(*scalar.Lnumber) - p.printFreeFloating(nn, freefloating.Start) - io.WriteString(p.w, nn.Value) - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printScalarDNumber(n node.Node) { - nn := n.(*scalar.Dnumber) - p.printFreeFloating(nn, freefloating.Start) - io.WriteString(p.w, nn.Value) - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printScalarString(n node.Node) { - nn := n.(*scalar.String) - p.printFreeFloating(nn, freefloating.Start) - io.WriteString(p.w, nn.Value) - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printScalarEncapsedStringPart(n node.Node) { - nn := n.(*scalar.EncapsedStringPart) - p.printFreeFloating(nn, freefloating.Start) - io.WriteString(p.w, nn.Value) - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printScalarEncapsed(n node.Node) { - nn := n.(*scalar.Encapsed) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "\"") - for _, part := range nn.Parts { - switch part.(type) { - case *expr.ArrayDimFetch: - s := (*part.GetFreeFloating())[freefloating.Start] - if len(s) > 0 && s[0].Value == "${" { - p.printExprArrayDimFetchWithoutLeadingDollar(part) - } else { - p.Print(part) - } - case *expr.Variable: - s := (*part.GetFreeFloating())[freefloating.Start] - if len(s) > 0 && s[0].Value == "${" { - p.printExprVariableWithoutLeadingDollar(part) - } else { - p.Print(part) - } - default: - p.Print(part) - } - } - io.WriteString(p.w, "\"") - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printScalarHeredoc(n node.Node) { - nn := n.(*scalar.Heredoc) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, nn.Label) - - for _, part := range nn.Parts { - switch part.(type) { - case *expr.ArrayDimFetch: - s := (*part.GetFreeFloating())[freefloating.Start] - if len(s) > 0 && s[0].Value == "${" { - p.printExprArrayDimFetchWithoutLeadingDollar(part) - } else { - p.Print(part) - } - case *expr.Variable: - s := (*part.GetFreeFloating())[freefloating.Start] - if len(s) > 0 && s[0].Value == "${" { - p.printExprVariableWithoutLeadingDollar(part) - } else { - p.Print(part) - } - default: - p.Print(part) - } - } - - io.WriteString(p.w, strings.Trim(nn.Label, "<\"'\n")) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printScalarMagicConstant(n node.Node) { - nn := n.(*scalar.MagicConstant) - p.printFreeFloating(nn, freefloating.Start) - io.WriteString(p.w, nn.Value) - p.printFreeFloating(nn, freefloating.End) -} - -// Assign - -func (p *Printer) printAssign(n node.Node) { - nn := n.(*assign.Assign) - p.printFreeFloating(nn, freefloating.Start) - p.Print(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - io.WriteString(p.w, "=") - p.Print(nn.Expression) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printAssignReference(n node.Node) { - nn := n.(*assign.Reference) - p.printFreeFloating(nn, freefloating.Start) - p.Print(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - io.WriteString(p.w, "=") - p.printFreeFloating(nn, freefloating.Equal) - io.WriteString(p.w, "&") - p.Print(nn.Expression) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printAssignBitwiseAnd(n node.Node) { - nn := n.(*assign.BitwiseAnd) - p.printFreeFloating(nn, freefloating.Start) - p.Print(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - io.WriteString(p.w, "&") - io.WriteString(p.w, "=") - p.Print(nn.Expression) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printAssignBitwiseOr(n node.Node) { - nn := n.(*assign.BitwiseOr) - p.printFreeFloating(nn, freefloating.Start) - p.Print(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - io.WriteString(p.w, "|=") - p.Print(nn.Expression) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printAssignBitwiseXor(n node.Node) { - nn := n.(*assign.BitwiseXor) - p.printFreeFloating(nn, freefloating.Start) - p.Print(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - io.WriteString(p.w, "^=") - p.Print(nn.Expression) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printAssignCoalesce(n node.Node) { - nn := n.(*assign.Coalesce) - p.printFreeFloating(nn, freefloating.Start) - p.Print(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - io.WriteString(p.w, "??=") - p.Print(nn.Expression) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printAssignConcat(n node.Node) { - nn := n.(*assign.Concat) - p.printFreeFloating(nn, freefloating.Start) - p.Print(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - io.WriteString(p.w, ".=") - p.Print(nn.Expression) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printAssignDiv(n node.Node) { - nn := n.(*assign.Div) - p.printFreeFloating(nn, freefloating.Start) - p.Print(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - io.WriteString(p.w, "/=") - p.Print(nn.Expression) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printAssignMinus(n node.Node) { - nn := n.(*assign.Minus) - p.printFreeFloating(nn, freefloating.Start) - p.Print(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - io.WriteString(p.w, "-=") - p.Print(nn.Expression) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printAssignMod(n node.Node) { - nn := n.(*assign.Mod) - p.printFreeFloating(nn, freefloating.Start) - p.Print(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - io.WriteString(p.w, "%=") - p.Print(nn.Expression) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printAssignMul(n node.Node) { - nn := n.(*assign.Mul) - p.printFreeFloating(nn, freefloating.Start) - p.Print(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - io.WriteString(p.w, "*=") - p.Print(nn.Expression) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printAssignPlus(n node.Node) { - nn := n.(*assign.Plus) - p.printFreeFloating(nn, freefloating.Start) - p.Print(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - io.WriteString(p.w, "+=") - p.Print(nn.Expression) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printAssignPow(n node.Node) { - nn := n.(*assign.Pow) - p.printFreeFloating(nn, freefloating.Start) - p.Print(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - io.WriteString(p.w, "**=") - p.Print(nn.Expression) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printAssignShiftLeft(n node.Node) { - nn := n.(*assign.ShiftLeft) - p.printFreeFloating(nn, freefloating.Start) - p.Print(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - io.WriteString(p.w, "<<=") - p.Print(nn.Expression) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printAssignShiftRight(n node.Node) { - nn := n.(*assign.ShiftRight) - p.printFreeFloating(nn, freefloating.Start) - p.Print(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - io.WriteString(p.w, ">>=") - p.Print(nn.Expression) - - p.printFreeFloating(nn, freefloating.End) -} - -// binary - -func (p *Printer) printBinaryBitwiseAnd(n node.Node) { - nn := n.(*binary.BitwiseAnd) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, "&") - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinaryBitwiseOr(n node.Node) { - nn := n.(*binary.BitwiseOr) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, "|") - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinaryBitwiseXor(n node.Node) { - nn := n.(*binary.BitwiseXor) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, "^") - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinaryBooleanAnd(n node.Node) { - nn := n.(*binary.BooleanAnd) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, "&&") - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinaryBooleanOr(n node.Node) { - nn := n.(*binary.BooleanOr) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, "||") - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinaryCoalesce(n node.Node) { - nn := n.(*binary.Coalesce) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, "??") - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinaryConcat(n node.Node) { - nn := n.(*binary.Concat) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, ".") - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinaryDiv(n node.Node) { - nn := n.(*binary.Div) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, "/") - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinaryEqual(n node.Node) { - nn := n.(*binary.Equal) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, "==") - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinaryGreaterOrEqual(n node.Node) { - nn := n.(*binary.GreaterOrEqual) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, ">=") - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinaryGreater(n node.Node) { - nn := n.(*binary.Greater) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, ">") - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinaryIdentical(n node.Node) { - nn := n.(*binary.Identical) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, "===") - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinaryLogicalAnd(n node.Node) { - nn := n.(*binary.LogicalAnd) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - io.WriteString(p.w, "and") - if nn.Right.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinaryLogicalOr(n node.Node) { - nn := n.(*binary.LogicalOr) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - io.WriteString(p.w, "or") - if nn.Right.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinaryLogicalXor(n node.Node) { - nn := n.(*binary.LogicalXor) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - io.WriteString(p.w, "xor") - if nn.Right.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinaryMinus(n node.Node) { - nn := n.(*binary.Minus) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, "-") - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinaryMod(n node.Node) { - nn := n.(*binary.Mod) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, "%") - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinaryMul(n node.Node) { - nn := n.(*binary.Mul) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, "*") - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinaryNotEqual(n node.Node) { - nn := n.(*binary.NotEqual) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - p.printFreeFloating(nn, freefloating.Equal) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, "!=") - } - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinaryNotIdentical(n node.Node) { - nn := n.(*binary.NotIdentical) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, "!==") - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinaryPlus(n node.Node) { - nn := n.(*binary.Plus) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, "+") - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinaryPow(n node.Node) { - nn := n.(*binary.Pow) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, "**") - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinaryShiftLeft(n node.Node) { - nn := n.(*binary.ShiftLeft) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, "<<") - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinaryShiftRight(n node.Node) { - nn := n.(*binary.ShiftRight) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, ">>") - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinarySmallerOrEqual(n node.Node) { - nn := n.(*binary.SmallerOrEqual) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, "<=") - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinarySmaller(n node.Node) { - nn := n.(*binary.Smaller) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, "<") - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBinarySpaceship(n node.Node) { - nn := n.(*binary.Spaceship) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Left) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, "<=>") - p.Print(nn.Right) - - p.printFreeFloating(nn, freefloating.End) -} - -// cast - -func (p *Printer) printArray(n node.Node) { - nn := n.(*cast.Array) - p.printFreeFloating(nn, freefloating.Start) - - p.printFreeFloating(nn, freefloating.Cast) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, "(array)") - } - - p.Print(nn.Expr) - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printBool(n node.Node) { - nn := n.(*cast.Bool) - p.printFreeFloating(nn, freefloating.Start) - - p.printFreeFloating(nn, freefloating.Cast) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, "(boolean)") - } - - p.Print(nn.Expr) - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printDouble(n node.Node) { - nn := n.(*cast.Double) - p.printFreeFloating(nn, freefloating.Start) - - p.printFreeFloating(nn, freefloating.Cast) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, "(float)") - } - - p.Print(nn.Expr) - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printInt(n node.Node) { - nn := n.(*cast.Int) - p.printFreeFloating(nn, freefloating.Start) - - p.printFreeFloating(nn, freefloating.Cast) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, "(integer)") - } - - p.Print(nn.Expr) - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printObject(n node.Node) { - nn := n.(*cast.Object) - p.printFreeFloating(nn, freefloating.Start) - - p.printFreeFloating(nn, freefloating.Cast) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, "(object)") - } - - p.Print(nn.Expr) - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printString(n node.Node) { - nn := n.(*cast.String) - p.printFreeFloating(nn, freefloating.Start) - - p.printFreeFloating(nn, freefloating.Cast) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, "(string)") - } - - p.Print(nn.Expr) - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printUnset(n node.Node) { - nn := n.(*cast.Unset) - p.printFreeFloating(nn, freefloating.Start) - - p.printFreeFloating(nn, freefloating.Cast) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, "(unset)") - } - - p.Print(nn.Expr) - p.printFreeFloating(nn, freefloating.End) -} - -// expr - -func (p *Printer) printExprArrayDimFetch(n node.Node) { - nn := n.(*expr.ArrayDimFetch) - p.printFreeFloating(nn, freefloating.Start) - p.Print(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, "[") - } - p.Print(nn.Dim) - p.printFreeFloating(nn, freefloating.Expr) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, "]") - } - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprArrayDimFetchWithoutLeadingDollar(n node.Node) { - nn := n.(*expr.ArrayDimFetch) - p.printFreeFloating(nn, freefloating.Start) - p.printExprVariableWithoutLeadingDollar(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, "[") - } - p.Print(nn.Dim) - p.printFreeFloating(nn, freefloating.Expr) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, "]") - } - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprArrayItem(n node.Node) { - nn := n.(*expr.ArrayItem) - p.printFreeFloating(nn, freefloating.Start) - - if nn.Unpack { - io.WriteString(p.w, "...") - } - - if nn.Key != nil { - p.Print(nn.Key) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, "=>") - } - - p.Print(nn.Val) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprArray(n node.Node) { - nn := n.(*expr.Array) - p.printFreeFloating(nn, freefloating.Start) - io.WriteString(p.w, "array") - p.printFreeFloating(nn, freefloating.Array) - io.WriteString(p.w, "(") - p.joinPrint(",", nn.Items) - p.printFreeFloating(nn, freefloating.ArrayPairList) - io.WriteString(p.w, ")") - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprArrowFunction(n node.Node) { - nn := n.(*expr.ArrowFunction) - p.printFreeFloating(nn, freefloating.Start) - - if nn.Static { - io.WriteString(p.w, "static") - } - p.printFreeFloating(nn, freefloating.Static) - if nn.Static && n.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - - io.WriteString(p.w, "fn") - p.printFreeFloating(nn, freefloating.Function) - - if nn.ReturnsRef { - io.WriteString(p.w, "&") - } - p.printFreeFloating(nn, freefloating.Ampersand) - - io.WriteString(p.w, "(") - p.joinPrint(",", nn.Params) - p.printFreeFloating(nn, freefloating.ParameterList) - io.WriteString(p.w, ")") - p.printFreeFloating(nn, freefloating.Params) - - if nn.ReturnType != nil { - io.WriteString(p.w, ":") - p.Print(nn.ReturnType) - } - p.printFreeFloating(nn, freefloating.ReturnType) - - io.WriteString(p.w, "=>") - - p.printNode(nn.Expr) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprBitwiseNot(n node.Node) { - nn := n.(*expr.BitwiseNot) - p.printFreeFloating(nn, freefloating.Start) - io.WriteString(p.w, "~") - p.Print(nn.Expr) - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprBooleanNot(n node.Node) { - nn := n.(*expr.BooleanNot) - p.printFreeFloating(nn, freefloating.Start) - io.WriteString(p.w, "!") - p.Print(nn.Expr) - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprClassConstFetch(n node.Node) { - nn := n.(*expr.ClassConstFetch) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Class) - p.printFreeFloating(nn, freefloating.Name) - io.WriteString(p.w, "::") - p.Print(nn.ConstantName) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprClone(n node.Node) { - nn := n.(*expr.Clone) - p.printFreeFloating(nn, freefloating.Start) - io.WriteString(p.w, "clone") - if nn.Expr.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Expr) - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprClosureUse(n node.Node) { - nn := n.(*expr.ClosureUse) - p.printFreeFloating(nn, freefloating.Start) - io.WriteString(p.w, "use") - p.printFreeFloating(nn, freefloating.Use) - io.WriteString(p.w, "(") - p.joinPrint(",", nn.Uses) - p.printFreeFloating(nn, freefloating.LexicalVarList) - io.WriteString(p.w, ")") - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprClosure(n node.Node) { - nn := n.(*expr.Closure) - p.printFreeFloating(nn, freefloating.Start) - - if nn.Static { - io.WriteString(p.w, "static") - } - p.printFreeFloating(nn, freefloating.Static) - if nn.Static && n.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - - io.WriteString(p.w, "function") - p.printFreeFloating(nn, freefloating.Function) - - if nn.ReturnsRef { - io.WriteString(p.w, "&") - } - p.printFreeFloating(nn, freefloating.Ampersand) - - io.WriteString(p.w, "(") - p.joinPrint(",", nn.Params) - p.printFreeFloating(nn, freefloating.ParameterList) - io.WriteString(p.w, ")") - p.printFreeFloating(nn, freefloating.Params) - - if nn.ClosureUse != nil { - p.Print(nn.ClosureUse) - } - p.printFreeFloating(nn, freefloating.LexicalVars) - - if nn.ReturnType != nil { - io.WriteString(p.w, ":") - p.Print(nn.ReturnType) - } - p.printFreeFloating(nn, freefloating.ReturnType) - - io.WriteString(p.w, "{") - p.printNodes(nn.Stmts) - p.printFreeFloating(nn, freefloating.Stmts) - io.WriteString(p.w, "}") - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprConstFetch(n node.Node) { - nn := n.(*expr.ConstFetch) - p.printFreeFloating(nn, freefloating.Start) - p.Print(nn.Constant) - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprEmpty(n node.Node) { - nn := n.(*expr.Empty) - p.printFreeFloating(nn, freefloating.Start) - io.WriteString(p.w, "empty") - p.printFreeFloating(nn, freefloating.Empty) - io.WriteString(p.w, "(") - p.Print(nn.Expr) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, ")") - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprErrorSuppress(n node.Node) { - nn := n.(*expr.ErrorSuppress) - p.printFreeFloating(nn, freefloating.Start) - io.WriteString(p.w, "@") - p.Print(nn.Expr) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprEval(n node.Node) { - nn := n.(*expr.Eval) - p.printFreeFloating(nn, freefloating.Start) - io.WriteString(p.w, "eval") - p.printFreeFloating(nn, freefloating.Eval) - io.WriteString(p.w, "(") - p.Print(nn.Expr) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, ")") - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprExit(n node.Node) { - nn := n.(*expr.Exit) - p.printFreeFloating(nn, freefloating.Start) - - if nn.Die { - io.WriteString(p.w, "die") - } else { - io.WriteString(p.w, "exit") - } - p.printFreeFloating(nn, freefloating.Exit) - - if nn.Expr != nil && nn.Expr.GetFreeFloating().IsEmpty() && nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Expr) - p.printFreeFloating(nn, freefloating.Expr) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprFunctionCall(n node.Node) { - nn := n.(*expr.FunctionCall) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Function) - - p.printFreeFloating(nn.ArgumentList, freefloating.Start) - io.WriteString(p.w, "(") - p.joinPrint(",", nn.ArgumentList.Arguments) - p.printFreeFloating(nn.ArgumentList, freefloating.ArgumentList) - io.WriteString(p.w, ")") - p.printFreeFloating(nn.ArgumentList, freefloating.End) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprInclude(n node.Node) { - nn := n.(*expr.Include) - p.printFreeFloating(nn, freefloating.Start) - io.WriteString(p.w, "include") - if nn.Expr.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Expr) - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprIncludeOnce(n node.Node) { - nn := n.(*expr.IncludeOnce) - p.printFreeFloating(nn, freefloating.Start) - io.WriteString(p.w, "include_once") - if nn.Expr.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Expr) - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprInstanceOf(n node.Node) { - nn := n.(*expr.InstanceOf) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Expr) - p.printFreeFloating(nn, freefloating.Expr) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - - io.WriteString(p.w, "instanceof") - - if nn.Class.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Class) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprIsset(n node.Node) { - nn := n.(*expr.Isset) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "isset") - p.printFreeFloating(nn, freefloating.Isset) - io.WriteString(p.w, "(") - p.joinPrint(",", nn.Variables) - p.printFreeFloating(nn, freefloating.VarList) - io.WriteString(p.w, ")") - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprList(n node.Node) { - nn := n.(*expr.List) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "list") - p.printFreeFloating(nn, freefloating.List) - io.WriteString(p.w, "(") - p.joinPrint(",", nn.Items) - p.printFreeFloating(nn, freefloating.ArrayPairList) - io.WriteString(p.w, ")") - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprMethodCall(n node.Node) { - nn := n.(*expr.MethodCall) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - io.WriteString(p.w, "->") - p.Print(nn.Method) - - p.printFreeFloating(nn.ArgumentList, freefloating.Start) - io.WriteString(p.w, "(") - p.joinPrint(",", nn.ArgumentList.Arguments) - p.printFreeFloating(nn.ArgumentList, freefloating.ArgumentList) - io.WriteString(p.w, ")") - p.printFreeFloating(nn.ArgumentList, freefloating.End) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprNew(n node.Node) { - nn := n.(*expr.New) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "new") - if nn.Class.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Class) - - if nn.ArgumentList != nil { - p.printFreeFloating(nn.ArgumentList, freefloating.Start) - io.WriteString(p.w, "(") - p.joinPrint(",", nn.ArgumentList.Arguments) - p.printFreeFloating(nn.ArgumentList, freefloating.ArgumentList) - io.WriteString(p.w, ")") - p.printFreeFloating(nn.ArgumentList, freefloating.End) - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprPostDec(n node.Node) { - nn := n.(*expr.PostDec) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - io.WriteString(p.w, "--") - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprPostInc(n node.Node) { - nn := n.(*expr.PostInc) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - io.WriteString(p.w, "++") - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprPreDec(n node.Node) { - nn := n.(*expr.PreDec) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "--") - p.Print(nn.Variable) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprPreInc(n node.Node) { - nn := n.(*expr.PreInc) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "++") - p.Print(nn.Variable) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprPrint(n node.Node) { - nn := n.(*expr.Print) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "print") - if nn.Expr.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Expr) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprPropertyFetch(n node.Node) { - nn := n.(*expr.PropertyFetch) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - io.WriteString(p.w, "->") - p.Print(nn.Property) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprReference(n node.Node) { - nn := n.(*expr.Reference) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "&") - p.Print(nn.Variable) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprRequire(n node.Node) { - nn := n.(*expr.Require) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "require") - if nn.Expr.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Expr) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprRequireOnce(n node.Node) { - nn := n.(*expr.RequireOnce) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "require_once") - if nn.Expr.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Expr) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprShellExec(n node.Node) { - nn := n.(*expr.ShellExec) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "`") - p.joinPrint("", nn.Parts) - io.WriteString(p.w, "`") - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprShortArray(n node.Node) { - nn := n.(*expr.ShortArray) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "[") - p.joinPrint(",", nn.Items) - p.printFreeFloating(nn, freefloating.ArrayPairList) - io.WriteString(p.w, "]") - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprShortList(n node.Node) { - nn := n.(*expr.ShortList) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "[") - p.joinPrint(",", nn.Items) - p.printFreeFloating(nn, freefloating.ArrayPairList) - io.WriteString(p.w, "]") - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprStaticCall(n node.Node) { - nn := n.(*expr.StaticCall) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Class) - p.printFreeFloating(nn, freefloating.Name) - io.WriteString(p.w, "::") - p.Print(nn.Call) - - p.printFreeFloating(nn.ArgumentList, freefloating.Start) - io.WriteString(p.w, "(") - p.joinPrint(",", nn.ArgumentList.Arguments) - p.printFreeFloating(nn.ArgumentList, freefloating.ArgumentList) - io.WriteString(p.w, ")") - p.printFreeFloating(nn.ArgumentList, freefloating.End) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprStaticPropertyFetch(n node.Node) { - nn := n.(*expr.StaticPropertyFetch) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Class) - p.printFreeFloating(nn, freefloating.Name) - io.WriteString(p.w, "::") - p.Print(nn.Property) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprTernary(n node.Node) { - nn := n.(*expr.Ternary) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Condition) - p.printFreeFloating(nn, freefloating.Cond) - io.WriteString(p.w, "?") - - if nn.IfTrue != nil { - p.Print(nn.IfTrue) - } - p.printFreeFloating(nn, freefloating.True) - - io.WriteString(p.w, ":") - p.Print(nn.IfFalse) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprUnaryMinus(n node.Node) { - nn := n.(*expr.UnaryMinus) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "-") - p.Print(nn.Expr) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprUnaryPlus(n node.Node) { - nn := n.(*expr.UnaryPlus) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "+") - p.Print(nn.Expr) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprVariable(n node.Node) { - nn := n.(*expr.Variable) - p.printFreeFloating(nn, freefloating.Start) - - p.printFreeFloating(nn, freefloating.Dollar) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, "$") - } - - p.Print(nn.VarName) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprVariableWithoutLeadingDollar(n node.Node) { - nn := n.(*expr.Variable) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.VarName) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprYieldFrom(n node.Node) { - nn := n.(*expr.YieldFrom) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "yield from") - if nn.Expr.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Expr) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printExprYield(n node.Node) { - nn := n.(*expr.Yield) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "yield") - - if nn.Key != nil { - if nn.Key.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Key) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, "=>") - } else { - if nn.Value.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - } - - p.Print(nn.Value) - - p.printFreeFloating(nn, freefloating.End) -} - -// smtm - -func (p *Printer) printStmtAltElseIf(n node.Node) { - nn := n.(*stmt.AltElseIf) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "elseif") - p.printFreeFloating(nn, freefloating.ElseIf) - io.WriteString(p.w, "(") - p.Print(nn.Cond) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, ")") - p.printFreeFloating(nn, freefloating.Cond) - io.WriteString(p.w, ":") - - if s := nn.Stmt.(*stmt.StmtList).Stmts; len(s) > 0 { - p.printNodes(s) - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtAltElse(n node.Node) { - nn := n.(*stmt.AltElse) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "else") - p.printFreeFloating(nn, freefloating.Else) - io.WriteString(p.w, ":") - - if s := nn.Stmt.(*stmt.StmtList).Stmts; len(s) > 0 { - p.printNodes(s) - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtAltFor(n node.Node) { - nn := n.(*stmt.AltFor) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "for") - p.printFreeFloating(nn, freefloating.For) - io.WriteString(p.w, "(") - p.joinPrint(",", nn.Init) - p.printFreeFloating(nn, freefloating.InitExpr) - io.WriteString(p.w, ";") - p.joinPrint(",", nn.Cond) - p.printFreeFloating(nn, freefloating.CondExpr) - io.WriteString(p.w, ";") - p.joinPrint(",", nn.Loop) - p.printFreeFloating(nn, freefloating.IncExpr) - io.WriteString(p.w, ")") - p.printFreeFloating(nn, freefloating.Cond) - io.WriteString(p.w, ":") - - s := nn.Stmt.(*stmt.StmtList) - p.printNodes(s.Stmts) - p.printFreeFloating(nn, freefloating.Stmts) - - io.WriteString(p.w, "endfor") - p.printFreeFloating(nn, freefloating.AltEnd) - p.printFreeFloating(nn, freefloating.SemiColon) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtAltForeach(n node.Node) { - nn := n.(*stmt.AltForeach) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "foreach") - p.printFreeFloating(nn, freefloating.Foreach) - io.WriteString(p.w, "(") - p.Print(nn.Expr) - p.printFreeFloating(nn, freefloating.Expr) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - io.WriteString(p.w, "as") - - if nn.Key != nil { - if nn.Key.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Key) - p.printFreeFloating(nn, freefloating.Key) - io.WriteString(p.w, "=>") - } else { - if nn.Variable.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - } - - p.Print(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - - io.WriteString(p.w, ")") - p.printFreeFloating(nn, freefloating.Cond) - - io.WriteString(p.w, ":") - s := nn.Stmt.(*stmt.StmtList) - p.printNodes(s.Stmts) - p.printFreeFloating(nn, freefloating.Stmts) - - io.WriteString(p.w, "endforeach") - p.printFreeFloating(nn, freefloating.AltEnd) - p.printFreeFloating(nn, freefloating.SemiColon) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtAltIf(n node.Node) { - nn := n.(*stmt.AltIf) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "if") - p.printFreeFloating(nn, freefloating.If) - io.WriteString(p.w, "(") - p.Print(nn.Cond) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, ")") - p.printFreeFloating(nn, freefloating.Cond) - io.WriteString(p.w, ":") - - s := nn.Stmt.(*stmt.StmtList) - p.printNodes(s.Stmts) - - for _, elseif := range nn.ElseIf { - p.Print(elseif) - } - - if nn.Else != nil { - p.Print(nn.Else) - } - - p.printFreeFloating(nn, freefloating.Stmts) - io.WriteString(p.w, "endif") - p.printFreeFloating(nn, freefloating.AltEnd) - p.printFreeFloating(nn, freefloating.SemiColon) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtAltSwitch(n node.Node) { - nn := n.(*stmt.AltSwitch) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "switch") - p.printFreeFloating(nn, freefloating.Switch) - io.WriteString(p.w, "(") - p.Print(nn.Cond) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, ")") - p.printFreeFloating(nn, freefloating.Cond) - io.WriteString(p.w, ":") - - p.printFreeFloating(nn.CaseList, freefloating.Start) - p.printFreeFloating(nn.CaseList, freefloating.CaseListStart) - p.printNodes(nn.CaseList.Cases) - p.printFreeFloating(nn.CaseList, freefloating.CaseListEnd) - p.printFreeFloating(nn.CaseList, freefloating.End) - - io.WriteString(p.w, "endswitch") - p.printFreeFloating(nn, freefloating.AltEnd) - p.printFreeFloating(nn, freefloating.SemiColon) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtAltWhile(n node.Node) { - nn := n.(*stmt.AltWhile) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "while") - p.printFreeFloating(nn, freefloating.While) - io.WriteString(p.w, "(") - p.Print(nn.Cond) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, ")") - p.printFreeFloating(nn, freefloating.Cond) - io.WriteString(p.w, ":") - - s := nn.Stmt.(*stmt.StmtList) - p.printNodes(s.Stmts) - p.printFreeFloating(nn, freefloating.Stmts) - - io.WriteString(p.w, "endwhile") - p.printFreeFloating(nn, freefloating.AltEnd) - p.printFreeFloating(nn, freefloating.SemiColon) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtBreak(n node.Node) { - nn := n.(*stmt.Break) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "break") - if nn.Expr != nil { - if nn.Expr.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Expr) - } - p.printFreeFloating(nn, freefloating.Expr) - - p.printFreeFloating(nn, freefloating.SemiColon) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtCase(n node.Node) { - nn := n.(*stmt.Case) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "case") - if nn.Cond.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Cond) - p.printFreeFloating(nn, freefloating.Expr) - p.printFreeFloating(nn, freefloating.CaseSeparator) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ":") - } - - if len(nn.Stmts) > 0 { - p.printNodes(nn.Stmts) - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtCatch(n node.Node) { - nn := n.(*stmt.Catch) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "catch") - p.printFreeFloating(nn, freefloating.Catch) - io.WriteString(p.w, "(") - p.joinPrint("|", nn.Types) - p.Print(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - io.WriteString(p.w, ")") - p.printFreeFloating(nn, freefloating.Cond) - io.WriteString(p.w, "{") - p.printNodes(nn.Stmts) - p.printFreeFloating(nn, freefloating.Stmts) - io.WriteString(p.w, "}") - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtClassMethod(n node.Node) { - nn := n.(*stmt.ClassMethod) - p.printFreeFloating(nn, freefloating.Start) - - if nn.Modifiers != nil { - for k, m := range nn.Modifiers { - if k > 0 && m.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(m) - } - - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - } - p.printFreeFloating(nn, freefloating.ModifierList) - io.WriteString(p.w, "function") - p.printFreeFloating(nn, freefloating.Function) - - if nn.ReturnsRef { - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - io.WriteString(p.w, "&") - p.printFreeFloating(nn, freefloating.Ampersand) - } else { - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - } - - p.Print(nn.MethodName) - p.printFreeFloating(nn, freefloating.Name) - io.WriteString(p.w, "(") - p.joinPrint(",", nn.Params) - p.printFreeFloating(nn, freefloating.ParameterList) - io.WriteString(p.w, ")") - p.printFreeFloating(nn, freefloating.Params) - - if nn.ReturnType != nil { - io.WriteString(p.w, ":") - p.Print(nn.ReturnType) - } - - p.Print(nn.Stmt) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtClass(n node.Node) { - nn := n.(*stmt.Class) - p.printFreeFloating(nn, freefloating.Start) - - if nn.Modifiers != nil { - for k, m := range nn.Modifiers { - if k > 0 && m.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(m) - } - - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - } - p.printFreeFloating(nn, freefloating.ModifierList) - io.WriteString(p.w, "class") - p.printFreeFloating(nn, freefloating.Class) - - if nn.ClassName != nil { - if nn.ClassName.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.ClassName) - } - - if nn.ArgumentList != nil { - p.printFreeFloating(nn.ArgumentList, freefloating.Start) - io.WriteString(p.w, "(") - p.joinPrint(",", nn.ArgumentList.Arguments) - p.printFreeFloating(nn.ArgumentList, freefloating.ArgumentList) - io.WriteString(p.w, ")") - p.printFreeFloating(nn.ArgumentList, freefloating.End) - } - - if nn.Extends != nil { - p.printFreeFloating(nn.Extends, freefloating.Start) - if nn.Extends.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - io.WriteString(p.w, "extends") - if nn.Extends.ClassName.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Extends.ClassName) - } - - if nn.Implements != nil { - p.printFreeFloating(nn.Implements, freefloating.Start) - if nn.Implements.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - io.WriteString(p.w, "implements") - if nn.Implements.InterfaceNames[0].GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.joinPrint(",", nn.Implements.InterfaceNames) - } - - p.printFreeFloating(nn, freefloating.Name) - io.WriteString(p.w, "{") - p.printNodes(nn.Stmts) - p.printFreeFloating(nn, freefloating.Stmts) - io.WriteString(p.w, "}") - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtClassConstList(n node.Node) { - nn := n.(*stmt.ClassConstList) - p.printFreeFloating(nn, freefloating.Start) - - if nn.Modifiers != nil { - for k, m := range nn.Modifiers { - if k > 0 && m.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(m) - } - - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - } - p.printFreeFloating(nn, freefloating.ModifierList) - io.WriteString(p.w, "const") - - if nn.Consts[0].GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.joinPrint(",", nn.Consts) - p.printFreeFloating(nn, freefloating.ConstList) - - p.printFreeFloating(nn, freefloating.SemiColon) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtConstList(n node.Node) { - nn := n.(*stmt.ConstList) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "const") - - if nn.Consts[0].GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.joinPrint(",", nn.Consts) - p.printFreeFloating(nn, freefloating.Stmts) - - p.printFreeFloating(nn, freefloating.SemiColon) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtConstant(n node.Node) { - nn := n.(*stmt.Constant) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.ConstantName) - p.printFreeFloating(nn, freefloating.Name) - io.WriteString(p.w, "=") - p.Print(nn.Expr) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtContinue(n node.Node) { - nn := n.(*stmt.Continue) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "continue") - - if nn.Expr != nil { - if nn.Expr.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Expr) - } - p.printFreeFloating(nn, freefloating.Expr) - - p.printFreeFloating(nn, freefloating.SemiColon) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtDeclare(n node.Node) { - nn := n.(*stmt.Declare) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "declare") - p.printFreeFloating(nn, freefloating.Declare) - io.WriteString(p.w, "(") - p.joinPrint(",", nn.Consts) - p.printFreeFloating(nn, freefloating.ConstList) - io.WriteString(p.w, ")") - - if nn.Alt { - p.printFreeFloating(nn, freefloating.Cond) - io.WriteString(p.w, ":") - - s := nn.Stmt.(*stmt.StmtList) - p.printNodes(s.Stmts) - p.printFreeFloating(nn, freefloating.Stmts) - - io.WriteString(p.w, "enddeclare") - p.printFreeFloating(nn, freefloating.AltEnd) - - p.printFreeFloating(nn, freefloating.SemiColon) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - } else { - p.Print(nn.Stmt) - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtDefault(n node.Node) { - nn := n.(*stmt.Default) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "default") - p.printFreeFloating(nn, freefloating.Default) - p.printFreeFloating(nn, freefloating.CaseSeparator) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ":") - } - - if len(nn.Stmts) > 0 { - p.printNodes(nn.Stmts) - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtDo(n node.Node) { - nn := n.(*stmt.Do) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "do") - - if _, ok := nn.Stmt.(*stmt.StmtList); !ok { - if nn.Stmt.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - } - - p.Print(nn.Stmt) - p.printFreeFloating(nn, freefloating.Stmts) - - io.WriteString(p.w, "while") - p.printFreeFloating(nn, freefloating.While) - io.WriteString(p.w, "(") - p.Print(nn.Cond) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, ")") - p.printFreeFloating(nn, freefloating.Cond) - - p.printFreeFloating(nn, freefloating.SemiColon) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtEcho(n node.Node) { - nn := n.(*stmt.Echo) - - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, "echo") - } - if nn.Exprs[0].GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - - p.printFreeFloating(nn, freefloating.Start) - p.printFreeFloating(nn, freefloating.Echo) - - p.joinPrint(",", nn.Exprs) - p.printFreeFloating(nn, freefloating.Expr) - - p.printFreeFloating(nn, freefloating.SemiColon) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtElseif(n node.Node) { - nn := n.(*stmt.ElseIf) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "elseif") - p.printFreeFloating(nn, freefloating.ElseIf) - io.WriteString(p.w, "(") - p.Print(nn.Cond) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, ")") - - p.Print(nn.Stmt) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtElse(n node.Node) { - nn := n.(*stmt.Else) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "else") - - if _, ok := nn.Stmt.(*stmt.StmtList); !ok { - if nn.Stmt.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - } - - p.Print(nn.Stmt) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtExpression(n node.Node) { - nn := n.(*stmt.Expression) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Expr) - p.printFreeFloating(nn, freefloating.Expr) - - p.printFreeFloating(nn, freefloating.SemiColon) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtFinally(n node.Node) { - nn := n.(*stmt.Finally) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "finally") - p.printFreeFloating(nn, freefloating.Finally) - io.WriteString(p.w, "{") - p.printNodes(nn.Stmts) - p.printFreeFloating(nn, freefloating.Stmts) - io.WriteString(p.w, "}") - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtFor(n node.Node) { - nn := n.(*stmt.For) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "for") - p.printFreeFloating(nn, freefloating.For) - io.WriteString(p.w, "(") - p.joinPrint(",", nn.Init) - p.printFreeFloating(nn, freefloating.InitExpr) - io.WriteString(p.w, ";") - p.joinPrint(",", nn.Cond) - p.printFreeFloating(nn, freefloating.CondExpr) - io.WriteString(p.w, ";") - p.joinPrint(",", nn.Loop) - p.printFreeFloating(nn, freefloating.IncExpr) - io.WriteString(p.w, ")") - - p.Print(nn.Stmt) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtForeach(n node.Node) { - nn := n.(*stmt.Foreach) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "foreach") - p.printFreeFloating(nn, freefloating.Foreach) - io.WriteString(p.w, "(") - - p.Print(nn.Expr) - p.printFreeFloating(nn, freefloating.Expr) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - - io.WriteString(p.w, "as") - - if nn.Key != nil { - if nn.Key.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Key) - p.printFreeFloating(nn, freefloating.Key) - io.WriteString(p.w, "=>") - } else { - if nn.Variable.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - } - p.Print(nn.Variable) - p.printFreeFloating(nn, freefloating.Var) - - io.WriteString(p.w, ")") - - p.Print(nn.Stmt) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtFunction(n node.Node) { - nn := n.(*stmt.Function) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "function") - p.printFreeFloating(nn, freefloating.Function) - - if nn.ReturnsRef { - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - io.WriteString(p.w, "&") - } else { - if nn.FunctionName.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - } - - p.Print(nn.FunctionName) - p.printFreeFloating(nn, freefloating.Name) - - io.WriteString(p.w, "(") - p.joinPrint(",", nn.Params) - p.printFreeFloating(nn, freefloating.ParamList) - io.WriteString(p.w, ")") - p.printFreeFloating(nn, freefloating.Params) - - if nn.ReturnType != nil { - io.WriteString(p.w, ":") - p.Print(nn.ReturnType) - } - p.printFreeFloating(nn, freefloating.ReturnType) - - io.WriteString(p.w, "{") - p.printNodes(nn.Stmts) - p.printFreeFloating(nn, freefloating.Stmts) - io.WriteString(p.w, "}") - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtGlobal(n node.Node) { - nn := n.(*stmt.Global) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "global") - p.joinPrint(",", nn.Vars) - p.printFreeFloating(nn, freefloating.VarList) - - p.printFreeFloating(nn, freefloating.SemiColon) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtGoto(n node.Node) { - nn := n.(*stmt.Goto) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "goto") - if nn.Label.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Label) - p.printFreeFloating(nn, freefloating.Label) - - p.printFreeFloating(nn, freefloating.SemiColon) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtGroupUse(n node.Node) { - nn := n.(*stmt.GroupUse) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "use") - p.printFreeFloating(nn, freefloating.Use) - - if nn.UseType != nil { - if nn.UseType.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.UseType) - } - - if nn.Prefix.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Prefix) - io.WriteString(p.w, "\\") - p.printFreeFloating(nn, freefloating.Slash) - - io.WriteString(p.w, "{") - p.joinPrint(",", nn.UseList) - p.printFreeFloating(nn, freefloating.Stmts) - io.WriteString(p.w, "}") - p.printFreeFloating(nn, freefloating.UseDeclarationList) - - p.printFreeFloating(nn, freefloating.SemiColon) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtHaltCompiler(n node.Node) { - nn := n.(*stmt.HaltCompiler) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "__halt_compiler") - p.printFreeFloating(nn, freefloating.HaltCompiller) - io.WriteString(p.w, "(") - p.printFreeFloating(nn, freefloating.OpenParenthesisToken) - io.WriteString(p.w, ")") - p.printFreeFloating(nn, freefloating.CloseParenthesisToken) - - p.printFreeFloating(nn, freefloating.SemiColon) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtIf(n node.Node) { - nn := n.(*stmt.If) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "if") - p.printFreeFloating(n, freefloating.If) - io.WriteString(p.w, "(") - p.Print(nn.Cond) - p.printFreeFloating(n, freefloating.Expr) - io.WriteString(p.w, ")") - - p.Print(nn.Stmt) - - if nn.ElseIf != nil { - p.printNodes(nn.ElseIf) - } - - if nn.Else != nil { - p.Print(nn.Else) - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtInlineHTML(n node.Node) { - nn := n.(*stmt.InlineHtml) - p.printFreeFloating(nn, freefloating.Start) - - if p.s == PhpState && nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, "?>") - } - p.SetState(HtmlState) - - io.WriteString(p.w, nn.Value) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtInterface(n node.Node) { - nn := n.(*stmt.Interface) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "interface") - - if nn.InterfaceName.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - - p.Print(nn.InterfaceName) - - if nn.Extends != nil { - p.printFreeFloating(nn.Extends, freefloating.Start) - if nn.Extends.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - io.WriteString(p.w, "extends") - if nn.Extends.InterfaceNames[0].GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.joinPrint(",", nn.Extends.InterfaceNames) - } - - p.printFreeFloating(nn, freefloating.Name) - io.WriteString(p.w, "{") - p.printNodes(nn.Stmts) - p.printFreeFloating(nn, freefloating.Stmts) - io.WriteString(p.w, "}") - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtLabel(n node.Node) { - nn := n.(*stmt.Label) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.LabelName) - p.printFreeFloating(nn, freefloating.Label) - - io.WriteString(p.w, ":") - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtNamespace(n node.Node) { - nn := n.(*stmt.Namespace) - p.printFreeFloating(nn, freefloating.Start) - io.WriteString(p.w, "namespace") - - if nn.NamespaceName != nil { - if nn.NamespaceName.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.NamespaceName) - } - - if nn.Stmts != nil { - p.printFreeFloating(nn, freefloating.Namespace) - io.WriteString(p.w, "{") - p.printNodes(nn.Stmts) - p.printFreeFloating(nn, freefloating.Stmts) - io.WriteString(p.w, "}") - } else { - p.printFreeFloating(nn, freefloating.SemiColon) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtNop(n node.Node) { - p.printFreeFloating(n, freefloating.Start) - p.printFreeFloating(n, freefloating.SemiColon) - if n.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - p.printFreeFloating(n, freefloating.End) -} - -func (p *Printer) printStmtPropertyList(n node.Node) { - nn := n.(*stmt.PropertyList) - p.printFreeFloating(nn, freefloating.Start) - - for k, m := range nn.Modifiers { - if k > 0 && m.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(m) - } - - if nn.Type != nil && nn.Type.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - - p.Print(nn.Type) - - if nn.Properties[0].GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - - p.joinPrint(",", nn.Properties) - p.printFreeFloating(n, freefloating.PropertyList) - - p.printFreeFloating(n, freefloating.SemiColon) - if n.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtProperty(n node.Node) { - nn := n.(*stmt.Property) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Variable) - - if nn.Expr != nil { - p.printFreeFloating(nn, freefloating.Var) - io.WriteString(p.w, "=") - p.Print(nn.Expr) - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtReturn(n node.Node) { - nn := n.(*stmt.Return) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "return") - if nn.Expr != nil && nn.Expr.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Expr) - p.printFreeFloating(nn, freefloating.Expr) - - p.printFreeFloating(nn, freefloating.SemiColon) - if n.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtStaticVar(n node.Node) { - nn := n.(*stmt.StaticVar) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Variable) - - if nn.Expr != nil { - p.printFreeFloating(nn, freefloating.Var) - io.WriteString(p.w, "=") - p.Print(nn.Expr) - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtStatic(n node.Node) { - nn := n.(*stmt.Static) - p.printFreeFloating(nn, freefloating.Start) - io.WriteString(p.w, "static") - - p.joinPrint(",", nn.Vars) - p.printFreeFloating(nn, freefloating.VarList) - - p.printFreeFloating(nn, freefloating.SemiColon) - if n.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtStmtList(n node.Node) { - nn := n.(*stmt.StmtList) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "{") - p.printNodes(nn.Stmts) - p.printFreeFloating(nn, freefloating.Stmts) - io.WriteString(p.w, "}") - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtSwitch(n node.Node) { - nn := n.(*stmt.Switch) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "switch") - p.printFreeFloating(nn, freefloating.Switch) - io.WriteString(p.w, "(") - p.Print(nn.Cond) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, ")") - - p.printFreeFloating(nn.CaseList, freefloating.Start) - io.WriteString(p.w, "{") - p.printFreeFloating(nn.CaseList, freefloating.CaseListStart) - p.printNodes(nn.CaseList.Cases) - p.printFreeFloating(nn.CaseList, freefloating.CaseListEnd) - io.WriteString(p.w, "}") - p.printFreeFloating(nn.CaseList, freefloating.End) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtThrow(n node.Node) { - nn := n.(*stmt.Throw) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "throw") - if nn.Expr.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Expr) - p.printFreeFloating(nn, freefloating.Expr) - - p.printFreeFloating(nn, freefloating.SemiColon) - if n.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtTraitAdaptationList(n node.Node) { - nn := n.(*stmt.TraitAdaptationList) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "{") - p.printNodes(nn.Adaptations) - p.printFreeFloating(nn, freefloating.AdaptationList) - io.WriteString(p.w, "}") - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtTraitMethodRef(n node.Node) { - nn := n.(*stmt.TraitMethodRef) - p.printFreeFloating(nn, freefloating.Start) - - if nn.Trait != nil { - p.Print(nn.Trait) - p.printFreeFloating(nn, freefloating.Name) - io.WriteString(p.w, "::") - } - - p.Print(nn.Method) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtTraitUseAlias(n node.Node) { - nn := n.(*stmt.TraitUseAlias) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Ref) - p.printFreeFloating(nn, freefloating.Ref) - - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - io.WriteString(p.w, "as") - - if nn.Modifier != nil { - if nn.Modifier.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Modifier) - } - - if nn.Alias != nil { - if nn.Alias.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Alias) - } - p.printFreeFloating(nn, freefloating.Alias) - - p.printFreeFloating(nn, freefloating.SemiColon) - if n.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtTraitUsePrecedence(n node.Node) { - nn := n.(*stmt.TraitUsePrecedence) - p.printFreeFloating(nn, freefloating.Start) - - p.Print(nn.Ref) - p.printFreeFloating(nn, freefloating.Ref) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - - io.WriteString(p.w, "insteadof") - if nn.Insteadof[0].GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.joinPrint(",", nn.Insteadof) - p.printFreeFloating(nn, freefloating.NameList) - - p.printFreeFloating(nn, freefloating.SemiColon) - if n.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtTraitUse(n node.Node) { - nn := n.(*stmt.TraitUse) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "use") - if nn.Traits[0].GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.joinPrint(",", nn.Traits) - - p.Print(nn.TraitAdaptationList) - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtTrait(n node.Node) { - nn := n.(*stmt.Trait) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "trait") - if nn.TraitName.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.TraitName) - - p.printFreeFloating(nn, freefloating.Name) - io.WriteString(p.w, "{") - p.printNodes(nn.Stmts) - p.printFreeFloating(nn, freefloating.Stmts) - io.WriteString(p.w, "}") - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtTry(n node.Node) { - nn := n.(*stmt.Try) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "try") - p.printFreeFloating(nn, freefloating.Try) - io.WriteString(p.w, "{") - p.printNodes(nn.Stmts) - p.printFreeFloating(nn, freefloating.Stmts) - io.WriteString(p.w, "}") - - if nn.Catches != nil { - p.printNodes(nn.Catches) - } - - if nn.Finally != nil { - p.Print(nn.Finally) - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtUnset(n node.Node) { - nn := n.(*stmt.Unset) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "unset") - p.printFreeFloating(nn, freefloating.Unset) - io.WriteString(p.w, "(") - p.joinPrint(",", nn.Vars) - p.printFreeFloating(nn, freefloating.VarList) - io.WriteString(p.w, ")") - p.printFreeFloating(nn, freefloating.CloseParenthesisToken) - - p.printFreeFloating(nn, freefloating.SemiColon) - if n.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtUseList(n node.Node) { - nn := n.(*stmt.UseList) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "use") - - if nn.UseType != nil { - if nn.UseType.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.UseType) - } - - if nn.Uses[0].GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.joinPrint(",", nn.Uses) - p.printFreeFloating(nn, freefloating.UseDeclarationList) - - p.printFreeFloating(nn, freefloating.SemiColon) - if nn.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, ";") - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtUse(n node.Node) { - nn := n.(*stmt.Use) - p.printFreeFloating(nn, freefloating.Start) - - if nn.UseType != nil { - p.Print(nn.UseType) - if nn.UseType.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - } - - p.printFreeFloating(nn, freefloating.Slash) - - p.Print(nn.Use) - - if nn.Alias != nil { - if nn.Alias.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - io.WriteString(p.w, "as") - if nn.Alias.GetFreeFloating().IsEmpty() { - io.WriteString(p.w, " ") - } - p.Print(nn.Alias) - } - - p.printFreeFloating(nn, freefloating.End) -} - -func (p *Printer) printStmtWhile(n node.Node) { - nn := n.(*stmt.While) - p.printFreeFloating(nn, freefloating.Start) - - io.WriteString(p.w, "while") - p.printFreeFloating(nn, freefloating.While) - io.WriteString(p.w, "(") - p.Print(nn.Cond) - p.printFreeFloating(nn, freefloating.Expr) - io.WriteString(p.w, ")") - - p.Print(nn.Stmt) - - p.printFreeFloating(nn, freefloating.End) -}