Merge branch 'master' into dev

This commit is contained in:
z7zmey 2018-07-09 22:04:18 +03:00
commit a69e899f04
6 changed files with 63 additions and 25 deletions

View File

@ -1,9 +1 @@
Issue Description
```php
// PHP code trying to parse
```
```
// console output
```

View File

@ -551,10 +551,18 @@ func (p *PrettyPrinter) printScalarEncapsedStringPart(n node.Node) {
} }
func (p *PrettyPrinter) printScalarEncapsed(n node.Node) { func (p *PrettyPrinter) printScalarEncapsed(n node.Node) {
nn := n.(*scalar.Encapsed)
io.WriteString(p.w, "\"") io.WriteString(p.w, "\"")
for _, nn := range n.(*scalar.Encapsed).Parts { for _, part := range nn.Parts {
p.Print(nn) switch part.(type) {
case *scalar.EncapsedStringPart:
p.Print(part)
default:
io.WriteString(p.w, "{")
p.Print(part)
io.WriteString(p.w, "}")
}
} }
io.WriteString(p.w, "\"") io.WriteString(p.w, "\"")
@ -567,8 +575,15 @@ func (p *PrettyPrinter) printScalarHeredoc(n node.Node) {
io.WriteString(p.w, nn.Label) io.WriteString(p.w, nn.Label)
io.WriteString(p.w, "\n") io.WriteString(p.w, "\n")
for _, nn := range nn.Parts { for _, part := range nn.Parts {
p.Print(nn) switch part.(type) {
case *scalar.EncapsedStringPart:
p.Print(part)
default:
io.WriteString(p.w, "{")
p.Print(part)
io.WriteString(p.w, "}")
}
} }
io.WriteString(p.w, strings.Trim(nn.Label, "\"'")) io.WriteString(p.w, strings.Trim(nn.Label, "\"'"))
@ -1232,7 +1247,14 @@ func (p *PrettyPrinter) printExprShellExec(n node.Node) {
io.WriteString(p.w, "`") io.WriteString(p.w, "`")
for _, part := range nn.Parts { for _, part := range nn.Parts {
p.Print(part) switch part.(type) {
case *scalar.EncapsedStringPart:
p.Print(part)
default:
io.WriteString(p.w, "{")
p.Print(part)
io.WriteString(p.w, "}")
}
} }
io.WriteString(p.w, "`") io.WriteString(p.w, "`")
} }

View File

@ -346,7 +346,7 @@ func TestPrintScalarEncapsed(t *testing.T) {
}, },
}) })
if o.String() != `"hello $var world"` { if o.String() != `"hello {$var} world"` {
t.Errorf("TestPrintScalarEncapsed is failed\n") t.Errorf("TestPrintScalarEncapsed is failed\n")
} }
} }
@ -365,7 +365,7 @@ func TestPrintScalarHeredoc(t *testing.T) {
}) })
expected := `<<<LBL expected := `<<<LBL
hello $var world hello {$var} world
LBL` LBL`
actual := o.String() actual := o.String()
@ -1844,7 +1844,7 @@ func TestPrintShellExec(t *testing.T) {
}, },
}) })
expected := "`hello $world!`" expected := "`hello {$world}!`"
actual := o.String() actual := o.String()
if expected != actual { if expected != actual {

View File

@ -629,7 +629,15 @@ func (p *Printer) printScalarEncapsed(n node.Node) {
io.WriteString(p.w, "\"") io.WriteString(p.w, "\"")
for _, part := range nn.Parts { for _, part := range nn.Parts {
p.Print(part) switch part.(type) {
case *scalar.EncapsedStringPart:
p.Print(part)
default:
io.WriteString(p.w, "{")
p.Print(part)
p.printMeta(nn, meta.CloseCurlyBracesToken)
io.WriteString(p.w, "}")
}
} }
io.WriteString(p.w, "\"") io.WriteString(p.w, "\"")
@ -647,8 +655,16 @@ func (p *Printer) printScalarHeredoc(n node.Node) {
io.WriteString(p.w, nn.Label) io.WriteString(p.w, nn.Label)
io.WriteString(p.w, "\n") io.WriteString(p.w, "\n")
for _, nn := range nn.Parts { for _, part := range nn.Parts {
p.Print(nn) switch part.(type) {
case *scalar.EncapsedStringPart:
p.Print(part)
default:
io.WriteString(p.w, "{")
p.Print(part)
p.printMeta(nn, meta.CloseCurlyBracesToken)
io.WriteString(p.w, "}")
}
} }
io.WriteString(p.w, strings.Trim(nn.Label, "\"'")) io.WriteString(p.w, strings.Trim(nn.Label, "\"'"))
@ -1681,7 +1697,15 @@ func (p *Printer) printExprShellExec(n node.Node) {
p.printMeta(nn, meta.BackquoteToken) p.printMeta(nn, meta.BackquoteToken)
io.WriteString(p.w, "`") io.WriteString(p.w, "`")
for _, part := range nn.Parts { for _, part := range nn.Parts {
p.Print(part) switch part.(type) {
case *scalar.EncapsedStringPart:
p.Print(part)
default:
io.WriteString(p.w, "{")
p.Print(part)
p.printMeta(nn, meta.CloseCurlyBracesToken)
io.WriteString(p.w, "}")
}
} }
io.WriteString(p.w, "`") io.WriteString(p.w, "`")

View File

@ -246,7 +246,7 @@ func TestParseAndPrintPropertyFetchPrint(t *testing.T) {
func TestParseAndPrintForeachReferenceShellExec(t *testing.T) { func TestParseAndPrintForeachReferenceShellExec(t *testing.T) {
src := `<?php src := `<?php
foreach ( $a as $k => & $v ) { foreach ( $a as $k => & $v ) {
` + "` $v cmd `" + ` ; ` + "` {$v} cmd `" + ` ;
}` }`
actual := print(parse(src)) actual := print(parse(src))
@ -714,7 +714,7 @@ func TestParseAndPrintScalar(t *testing.T) {
.2 ; .2 ;
0.2 ; 0.2 ;
'Hello' ; 'Hello' ;
"Hello $world"; "Hello {$world}";
` `
actual := print(parse(src)) actual := print(parse(src))

View File

@ -555,7 +555,7 @@ func TestPrinterPrintScalarEncapsed(t *testing.T) {
}, },
}) })
if o.String() != ` "hello $var world"` { if o.String() != ` "hello {$var} world"` {
t.Errorf("TestPrintScalarEncapsed is failed\n") t.Errorf("TestPrintScalarEncapsed is failed\n")
} }
} }
@ -580,7 +580,7 @@ func TestPrinterPrintScalarHeredoc(t *testing.T) {
}) })
expected := ` <<<LBL expected := ` <<<LBL
hello $var world hello {$var} world
LBL` LBL`
actual := o.String() actual := o.String()
@ -2764,7 +2764,7 @@ func TestPrinterPrintShellExec(t *testing.T) {
}, },
}) })
expected := " `hello $world!`" expected := " `hello {$world}!`"
actual := o.String() actual := o.String()
if expected != actual { if expected != actual {