From f6cb2bff4d16ec439f8bd9dce56fb058e2bd5cbb Mon Sep 17 00:00:00 2001 From: Vadym Slizov Date: Sun, 6 Sep 2020 12:45:08 +0300 Subject: [PATCH] [refactoring] update ast structure of "Switch", "Case", "Default" nodes; remove "CaseList" node --- internal/php5/parser_test.go | 336 +++++++++++------------- internal/php5/php5.go | Bin 293827 -> 293045 bytes internal/php5/php5.y | 143 +++++----- internal/php5/php5_test.go | 336 +++++++++++------------- internal/php7/parser_test.go | 336 +++++++++++------------- internal/php7/php7.go | Bin 246441 -> 243941 bytes internal/php7/php7.y | 155 +++++------ internal/php7/php7_test.go | 336 +++++++++++------------- pkg/ast/ast.go | 2 - pkg/ast/node.go | 45 ++-- pkg/ast/traverser/dfs.go | 39 +-- pkg/ast/visitor/dump.go | 17 +- pkg/ast/visitor/filter_parser_nodes.go | 20 -- pkg/ast/visitor/filter_tokens.go | 22 ++ pkg/ast/visitor/null.go | 8 - pkg/printer/pretty_printer.go | 39 +-- pkg/printer/pretty_printer_test.go | 47 ++-- pkg/printer/printer.go | 128 +++------ pkg/printer/printer_parsed_php5_test.go | 6 +- pkg/printer/printer_parsed_php7_test.go | 6 +- pkg/printer/printer_test.go | 63 +++-- 21 files changed, 883 insertions(+), 1201 deletions(-) diff --git a/internal/php5/parser_test.go b/internal/php5/parser_test.go index 1af3152..11e39da 100644 --- a/internal/php5/parser_test.go +++ b/internal/php5/parser_test.go @@ -9431,78 +9431,68 @@ func TestStmtSwitch(t *testing.T) { }, Value: []byte("1"), }, - CaseList: &ast.StmtCaseList{ - Node: ast.Node{ - Position: &position.Position{ - StartLine: 2, - EndLine: 5, - StartPos: 17, - EndPos: 58, + CaseList: []ast.Vertex{ + &ast.StmtCase{ + Node: ast.Node{ + Position: &position.Position{ + StartLine: 3, + EndLine: 3, + StartPos: 22, + EndPos: 36, + }, }, - }, - Cases: []ast.Vertex{ - &ast.StmtCase{ + Cond: &ast.ScalarLnumber{ Node: ast.Node{ Position: &position.Position{ StartLine: 3, EndLine: 3, - StartPos: 22, - EndPos: 36, + StartPos: 27, + EndPos: 28, }, }, - Cond: &ast.ScalarLnumber{ + Value: []byte("1"), + }, + Stmts: []ast.Vertex{ + &ast.StmtBreak{ Node: ast.Node{ Position: &position.Position{ StartLine: 3, EndLine: 3, - StartPos: 27, - EndPos: 28, - }, - }, - Value: []byte("1"), - }, - Stmts: []ast.Vertex{ - &ast.StmtBreak{ - Node: ast.Node{ - Position: &position.Position{ - StartLine: 3, - EndLine: 3, - StartPos: 30, - EndPos: 36, - }, + StartPos: 30, + EndPos: 36, }, }, }, }, - &ast.StmtCase{ + }, + &ast.StmtCase{ + Node: ast.Node{ + Position: &position.Position{ + StartLine: 4, + EndLine: 4, + StartPos: 40, + EndPos: 54, + }, + }, + Cond: &ast.ScalarLnumber{ Node: ast.Node{ Position: &position.Position{ StartLine: 4, EndLine: 4, - StartPos: 40, - EndPos: 54, + StartPos: 45, + EndPos: 46, }, }, - Cond: &ast.ScalarLnumber{ + Value: []byte("2"), + }, + Stmts: []ast.Vertex{ + &ast.StmtBreak{ Node: ast.Node{ Position: &position.Position{ StartLine: 4, EndLine: 4, - StartPos: 45, - EndPos: 46, - }, - }, - Value: []byte("2"), - }, - Stmts: []ast.Vertex{ - &ast.StmtBreak{ - Node: ast.Node{ - Position: &position.Position{ - StartLine: 4, - EndLine: 4, - StartPos: 48, - EndPos: 54, - }, + StartPos: 48, + EndPos: 54, }, }, }, @@ -9560,78 +9550,68 @@ func TestStmtSwitch_Semicolon(t *testing.T) { }, Value: []byte("1"), }, - CaseList: &ast.StmtCaseList{ - Node: ast.Node{ - Position: &position.Position{ - StartLine: 2, - EndLine: 5, - StartPos: 17, - EndPos: 59, + CaseList: []ast.Vertex{ + &ast.StmtCase{ + Node: ast.Node{ + Position: &position.Position{ + StartLine: 3, + EndLine: 3, + StartPos: 23, + EndPos: 37, + }, }, - }, - Cases: []ast.Vertex{ - &ast.StmtCase{ + Cond: &ast.ScalarLnumber{ Node: ast.Node{ Position: &position.Position{ StartLine: 3, EndLine: 3, - StartPos: 23, - EndPos: 37, + StartPos: 28, + EndPos: 29, }, }, - Cond: &ast.ScalarLnumber{ + Value: []byte("1"), + }, + Stmts: []ast.Vertex{ + &ast.StmtBreak{ Node: ast.Node{ Position: &position.Position{ StartLine: 3, EndLine: 3, - StartPos: 28, - EndPos: 29, - }, - }, - Value: []byte("1"), - }, - Stmts: []ast.Vertex{ - &ast.StmtBreak{ - Node: ast.Node{ - Position: &position.Position{ - StartLine: 3, - EndLine: 3, - StartPos: 31, - EndPos: 37, - }, + StartPos: 31, + EndPos: 37, }, }, }, }, - &ast.StmtCase{ + }, + &ast.StmtCase{ + Node: ast.Node{ + Position: &position.Position{ + StartLine: 4, + EndLine: 4, + StartPos: 41, + EndPos: 55, + }, + }, + Cond: &ast.ScalarLnumber{ Node: ast.Node{ Position: &position.Position{ StartLine: 4, EndLine: 4, - StartPos: 41, - EndPos: 55, + StartPos: 46, + EndPos: 47, }, }, - Cond: &ast.ScalarLnumber{ + Value: []byte("2"), + }, + Stmts: []ast.Vertex{ + &ast.StmtBreak{ Node: ast.Node{ Position: &position.Position{ StartLine: 4, EndLine: 4, - StartPos: 46, - EndPos: 47, - }, - }, - Value: []byte("2"), - }, - Stmts: []ast.Vertex{ - &ast.StmtBreak{ - Node: ast.Node{ - Position: &position.Position{ - StartLine: 4, - EndLine: 4, - StartPos: 49, - EndPos: 55, - }, + StartPos: 49, + EndPos: 55, }, }, }, @@ -9670,7 +9650,7 @@ func TestStmtSwitch_Alt(t *testing.T) { }, }, Stmts: []ast.Vertex{ - &ast.StmtAltSwitch{ + &ast.StmtSwitch{ Node: ast.Node{ Position: &position.Position{ StartLine: 2, @@ -9679,6 +9659,7 @@ func TestStmtSwitch_Alt(t *testing.T) { EndPos: 65, }, }, + Alt: true, Cond: &ast.ScalarLnumber{ Node: ast.Node{ Position: &position.Position{ @@ -9690,71 +9671,61 @@ func TestStmtSwitch_Alt(t *testing.T) { }, Value: []byte("1"), }, - CaseList: &ast.StmtCaseList{ - Node: ast.Node{ - Position: &position.Position{ - StartLine: 3, - EndLine: -1, - StartPos: 22, - EndPos: -1, + CaseList: []ast.Vertex{ + &ast.StmtCase{ + Node: ast.Node{ + Position: &position.Position{ + StartLine: 3, + EndLine: -1, + StartPos: 22, + EndPos: -1, + }, }, - }, - Cases: []ast.Vertex{ - &ast.StmtCase{ + Cond: &ast.ScalarLnumber{ Node: ast.Node{ Position: &position.Position{ StartLine: 3, - EndLine: -1, - StartPos: 22, - EndPos: -1, + EndLine: 3, + StartPos: 27, + EndPos: 28, }, }, - Cond: &ast.ScalarLnumber{ - Node: ast.Node{ - Position: &position.Position{ - StartLine: 3, - EndLine: 3, - StartPos: 27, - EndPos: 28, - }, - }, - Value: []byte("1"), - }, - Stmts: []ast.Vertex{}, + Value: []byte("1"), }, - &ast.StmtDefault{ - Node: ast.Node{ - Position: &position.Position{ - StartLine: 4, - EndLine: -1, - StartPos: 33, - EndPos: -1, - }, + Stmts: []ast.Vertex{}, + }, + &ast.StmtDefault{ + Node: ast.Node{ + Position: &position.Position{ + StartLine: 4, + EndLine: -1, + StartPos: 33, + EndPos: -1, }, - Stmts: []ast.Vertex{}, }, - &ast.StmtCase{ + Stmts: []ast.Vertex{}, + }, + &ast.StmtCase{ + Node: ast.Node{ + Position: &position.Position{ + StartLine: 5, + EndLine: -1, + StartPos: 45, + EndPos: -1, + }, + }, + Cond: &ast.ScalarLnumber{ Node: ast.Node{ Position: &position.Position{ StartLine: 5, - EndLine: -1, - StartPos: 45, - EndPos: -1, + EndLine: 5, + StartPos: 50, + EndPos: 51, }, }, - Cond: &ast.ScalarLnumber{ - Node: ast.Node{ - Position: &position.Position{ - StartLine: 5, - EndLine: 5, - StartPos: 50, - EndPos: 51, - }, - }, - Value: []byte("2"), - }, - Stmts: []ast.Vertex{}, + Value: []byte("2"), }, + Stmts: []ast.Vertex{}, }, }, }, @@ -9788,7 +9759,7 @@ func TestStmtSwitch_AltSemicolon(t *testing.T) { }, }, Stmts: []ast.Vertex{ - &ast.StmtAltSwitch{ + &ast.StmtSwitch{ Node: ast.Node{ Position: &position.Position{ StartLine: 2, @@ -9797,6 +9768,7 @@ func TestStmtSwitch_AltSemicolon(t *testing.T) { EndPos: 54, }, }, + Alt: true, Cond: &ast.ScalarLnumber{ Node: ast.Node{ Position: &position.Position{ @@ -9808,60 +9780,50 @@ func TestStmtSwitch_AltSemicolon(t *testing.T) { }, Value: []byte("1"), }, - CaseList: &ast.StmtCaseList{ - Node: ast.Node{ - Position: &position.Position{ - StartLine: 3, - EndLine: -1, - StartPos: 23, - EndPos: -1, + CaseList: []ast.Vertex{ + &ast.StmtCase{ + Node: ast.Node{ + Position: &position.Position{ + StartLine: 3, + EndLine: -1, + StartPos: 23, + EndPos: -1, + }, }, - }, - Cases: []ast.Vertex{ - &ast.StmtCase{ + Cond: &ast.ScalarLnumber{ Node: ast.Node{ Position: &position.Position{ StartLine: 3, - EndLine: -1, - StartPos: 23, - EndPos: -1, + EndLine: 3, + StartPos: 28, + EndPos: 29, }, }, - Cond: &ast.ScalarLnumber{ - Node: ast.Node{ - Position: &position.Position{ - StartLine: 3, - EndLine: 3, - StartPos: 28, - EndPos: 29, - }, - }, - Value: []byte("1"), - }, - Stmts: []ast.Vertex{}, + Value: []byte("1"), }, - &ast.StmtCase{ + Stmts: []ast.Vertex{}, + }, + &ast.StmtCase{ + Node: ast.Node{ + Position: &position.Position{ + StartLine: 4, + EndLine: -1, + StartPos: 34, + EndPos: -1, + }, + }, + Cond: &ast.ScalarLnumber{ Node: ast.Node{ Position: &position.Position{ StartLine: 4, - EndLine: -1, - StartPos: 34, - EndPos: -1, + EndLine: 4, + StartPos: 39, + EndPos: 40, }, }, - Cond: &ast.ScalarLnumber{ - Node: ast.Node{ - Position: &position.Position{ - StartLine: 4, - EndLine: 4, - StartPos: 39, - EndPos: 40, - }, - }, - Value: []byte("2"), - }, - Stmts: []ast.Vertex{}, + Value: []byte("2"), }, + Stmts: []ast.Vertex{}, }, }, }, diff --git a/internal/php5/php5.go b/internal/php5/php5.go index 90079efcd239c7b6e05abbbb1cce5f3bc36269c1..86cad0f133cf710774b105fa374b81a072dc3323 100644 GIT binary patch delta 13799 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 beWAjdC*k=0W_uEl9uC)|&yuj_0W0#qQh&uL delta 12373 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 0 { - p.printNodes(nn.Stmts) - } - - p.printFreeFloating(nn, token.End) +func (p *Printer) printStmtCase(n *ast.StmtCase) { + p.printToken(n.CaseTkn, "case") + p.bufStart = " " + p.Print(n.Cond) + p.printToken(n.CaseSeparatorTkn, ":") + p.printNodes(n.Stmts) } func (p *Printer) printStmtCatch(n ast.Vertex) { @@ -2308,22 +2257,10 @@ func (p *Printer) printStmtDeclare(n ast.Vertex) { 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) printStmtDefault(n *ast.StmtDefault) { + p.printToken(n.DefaultTkn, "default") + p.printToken(n.CaseSeparatorTkn, ":") + p.printNodes(n.Stmts) } func (p *Printer) printStmtDo(n *ast.StmtDo) { @@ -2828,31 +2765,32 @@ func (p *Printer) printStmtStmtList(n *ast.StmtStmtList) { p.printToken(n.CloseCurlyBracket, "}") } -func (p *Printer) printStmtSwitch(n ast.Vertex) { - nn := n.(*ast.StmtSwitch) - p.printFreeFloating(nn, token.Start) - - io.WriteString(p.w, "switch") - - if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { - io.WriteString(p.w, "(") +func (p *Printer) printStmtSwitch(n *ast.StmtSwitch) { + if n.Alt { + p.printStmtAltSwitch(n) + return } - p.Print(nn.Cond) + p.printToken(n.SwitchTkn, "switch") + p.printToken(n.OpenParenthesisTkn, "(") + p.Print(n.Cond) + p.printToken(n.CloseParenthesisTkn, ")") + p.printToken(n.OpenCurlyBracketTkn, "{") + p.printToken(n.CaseSeparatorTkn, "") + p.printNodes(n.CaseList) + p.printToken(n.CloseCurlyBracketTkn, "}") +} - if _, ok := nn.Cond.(*ast.ParserBrackets); !ok { - 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) printStmtAltSwitch(n *ast.StmtSwitch) { + p.printToken(n.SwitchTkn, "switch") + p.printToken(n.OpenParenthesisTkn, "(") + p.Print(n.Cond) + p.printToken(n.CloseParenthesisTkn, ")") + p.printToken(n.ColonTkn, ":") + p.printToken(n.CaseSeparatorTkn, "") + p.printNodes(n.CaseList) + p.printToken(n.EndSwitchTkn, "endswitch") + p.printToken(n.SemiColonTkn, ";") } func (p *Printer) printStmtThrow(n ast.Vertex) { diff --git a/pkg/printer/printer_parsed_php5_test.go b/pkg/printer/printer_parsed_php5_test.go index c607b65..2ea9ea4 100644 --- a/pkg/printer/printer_parsed_php5_test.go +++ b/pkg/printer/printer_parsed_php5_test.go @@ -791,7 +791,8 @@ func TestParseAndPrintPhp5AltForeach(t *testing.T) { } func TestParseAndPrintPhp5AltSwitch(t *testing.T) { - src := `