Skip to content

Commit db4f81c

Browse files
committed
feat: support parse short Expr
1 parent 8e638a0 commit db4f81c

File tree

5 files changed

+126
-55
lines changed

5 files changed

+126
-55
lines changed

field.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,18 @@ func NewFieldWithMap(m map[string]interface{}) *Field {
2020
return f
2121
}
2222

23-
func (f *Field) SetName(name string) {
23+
func (f *Field) SetName(name string) {
2424
f.Name = name
2525
}
2626

2727
func (f *Field) GetName() string {
2828
return f.Name
2929
}
3030

31+
func (f *Field) SetValue(v string) {
32+
f.Value = v
33+
}
34+
3135
func (f *Field) Set(k string, v interface{}) {
3236
if k == "" {
3337
return

field_test.go

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,24 +22,24 @@ func TestNewFieldWithMap(t *testing.T) {
2222
},
2323
},
2424
want: &Field{
25-
Name: "Name",
25+
Name: "Name",
2626
},
2727
},
2828
{
2929
name: "TestNewFieldWithMap: #2",
3030
args: args{
3131
m: map[string]interface{}{
32-
"name": "Name",
33-
"value": "default value",
34-
"other": "other",
32+
"name": "Name",
33+
"value": "default value",
34+
"other": "other",
3535
"other2": "other2",
3636
},
3737
},
3838
want: &Field{
3939
Name: "Name",
4040
Value: "default value",
4141
Data: map[string]interface{}{
42-
"other": "other",
42+
"other": "other",
4343
"other2": "other2",
4444
},
4545
},
@@ -60,13 +60,13 @@ func TestField_Set(t *testing.T) {
6060
v interface{}
6161
}
6262
tests := []struct {
63-
name string
64-
args args
63+
name string
64+
args args
6565
want *Field
6666
}{
6767
{
68-
name: "TestField_Set: #1",
69-
args: args{
68+
name: "TestField_Set: #1",
69+
args: args{
7070
k: "name",
7171
v: "hello",
7272
},
@@ -76,8 +76,8 @@ func TestField_Set(t *testing.T) {
7676
},
7777

7878
{
79-
name: "TestField_Set: #2",
80-
args: args{
79+
name: "TestField_Set: #2",
80+
args: args{
8181
k: "value",
8282
v: "hello",
8383
},
@@ -87,8 +87,8 @@ func TestField_Set(t *testing.T) {
8787
},
8888

8989
{
90-
name: "TestField_Set: #3",
91-
args: args{
90+
name: "TestField_Set: #3",
91+
args: args{
9292
k: "other",
9393
v: "other",
9494
},
@@ -122,31 +122,31 @@ func TestField_ToMap(t *testing.T) {
122122
want map[string]interface{}
123123
}{
124124
{
125-
name: "TestField_ToMap: #1",
125+
name: "TestField_ToMap: #1",
126126
fields: fields{
127127
Name: "name1",
128128
Value: "value1",
129129
Data: nil,
130130
},
131131
want: map[string]interface{}{
132-
"name": "name1",
132+
"name": "name1",
133133
"value": "value1",
134134
},
135135
},
136136
{
137-
name: "TestField_ToMap: #2",
137+
name: "TestField_ToMap: #2",
138138
fields: fields{
139139
Name: "name2",
140140
Value: "value2",
141141
Data: map[string]interface{}{
142-
"type": "type2",
142+
"type": "type2",
143143
"label": "label2",
144144
},
145145
},
146146
want: map[string]interface{}{
147-
"name": "name2",
147+
"name": "name2",
148148
"value": "value2",
149-
"type": "type2",
149+
"type": "type2",
150150
"label": "label2",
151151
},
152152
},
@@ -163,4 +163,4 @@ func TestField_ToMap(t *testing.T) {
163163
}
164164
})
165165
}
166-
}
166+
}

form.go

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,16 @@ func (f *Form) SetPrefix(prefix string) {
2424
f.prefix = prefix
2525
}
2626

27-
func (f *Form) SetCode(code string) {
27+
func (f *Form) SetCode(code string) {
2828
f.code = code
2929
f.root = nil
3030
}
3131

32+
func (f *Form) IsSnippetCode() bool {
33+
code := strings.TrimSpace(f.code)
34+
return !(strings.HasPrefix(code, "<?") || strings.HasPrefix(code, "<?php"))
35+
}
36+
3237
func (f *Form) Prefix() string {
3338
if strings.HasPrefix(f.prefix, "$") {
3439
return f.prefix
@@ -42,13 +47,18 @@ func (f *Form) Root() (*ast.Root, error) {
4247
return f.root, nil
4348
}
4449

45-
root, err := Parse([]byte(f.code))
50+
code := f.code
51+
// 如果是代码片段
52+
if f.IsSnippetCode() {
53+
code = fmt.Sprintf("<?php %s", f.code)
54+
}
55+
56+
root, err := ParseCode([]byte(code))
4657
if err != nil {
4758
return nil, err
4859
}
4960

50-
f.root = root.(*ast.Root)
51-
61+
f.root = root
5262
return f.root, nil
5363
}
5464

@@ -77,25 +87,34 @@ func (f *Form) Stringify(fields []Field) (string, error) {
7787
pr := printer.NewPrinter(buf)
7888
root.Accept(pr)
7989

80-
return buf.String(), nil
90+
res := buf.String()
91+
if f.IsSnippetCode() {
92+
res = strings.Replace(res, "<?php ", "", 1)
93+
}
94+
95+
return res, nil
8196
}
8297

8398
// 根据 fields 更新 ExprAssign
8499
func (f *Form) UpdateExprAssign(expr *ast.ExprAssign, fields []Field) {
85100
for _, field := range fields {
86101
// 变量名匹配
87-
isSameVar := field.Name == f.GetExprValue(expr.Var)
88-
89-
if expr, ok := expr.Expr.(*ast.ExprArray); ok && isSameVar{
90-
for _, item := range expr.Items {
91-
key, val := f.GetItemExpr(item)
92-
if f.GetExprValue(key) == "value" {
93-
f.SetExprValue(val, field.Value)
94-
95-
return
102+
if field.Name == f.GetExprValue(expr.Var) {
103+
switch e := expr.Expr.(type) {
104+
case *ast.ExprArray:
105+
for _, item := range e.Items {
106+
key, val := f.GetItemExpr(item)
107+
if f.GetExprValue(key) == "value" {
108+
f.SetExprValue(val, field.Value)
109+
110+
return
111+
}
96112
}
113+
default:
114+
f.SetExprValue(e, field.Value)
97115
}
98116
}
117+
99118
}
100119
}
101120

@@ -108,12 +127,15 @@ func (f *Form) IsExprAssignMatched(expr *ast.ExprAssign) bool {
108127
func (f *Form) ParseExprAssign(expr *ast.ExprAssign) *Field {
109128
field := NewField()
110129

111-
if exprArray, ok := expr.Expr.(*ast.ExprArray); ok {
112-
field.SetName(f.GetExprValue(expr.Var))
130+
field.SetName(f.GetExprValue(expr.Var))
113131

114-
for _, item := range exprArray.Items {
132+
switch e := expr.Expr.(type) {
133+
case *ast.ExprArray:
134+
for _, item := range e.Items {
115135
field.Set(f.GetItemValues(item))
116136
}
137+
case *ast.ScalarString, *ast.ScalarLnumber, *ast.ScalarDnumber, *ast.ExprConstFetch:
138+
field.SetValue(f.GetExprValue(e))
117139
}
118140

119141
return field

form_test.go

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package main
22

33
import (
44
"reflect"
5-
"strings"
65
"testing"
76
)
87

@@ -69,6 +68,33 @@ $_age = [
6968
wantErr: false,
7069
},
7170

71+
{
72+
name: "TestForm_Parse: short",
73+
fields: fields{
74+
prefix: "_",
75+
code: `
76+
$_name = 'billyct';
77+
$_isAdmin = true;
78+
$_age = 20;
79+
`,
80+
},
81+
want: []Field{
82+
{
83+
Name: "$_name",
84+
Value: "billyct",
85+
},
86+
{
87+
Name: "$_isAdmin",
88+
Value: "true",
89+
},
90+
{
91+
Value: "20",
92+
Name: "$_age",
93+
},
94+
},
95+
wantErr: false,
96+
},
97+
7298
{
7399
name: "TestForm_Parse: should match with the prefix",
74100
fields: fields{
@@ -363,7 +389,8 @@ $_age = [
363389
},
364390
},
365391
},
366-
want: `$_name = [
392+
want: `
393+
$_name = [
367394
'label' => 'Name',
368395
'value' => 'hello',
369396
];
@@ -377,6 +404,38 @@ $_age = [
377404
];`,
378405
wantErr: false,
379406
},
407+
{
408+
name: "TestForm_Stringify: short",
409+
fields: fields{
410+
prefix: "_",
411+
code: `
412+
$_name = 'billyct';
413+
$_isAdmin = true;
414+
$_age = 20;
415+
`,
416+
},
417+
args: args{
418+
fields: []Field{
419+
{
420+
Name: "$_name",
421+
Value: "magic",
422+
},
423+
{
424+
Name: "$_isAdmin",
425+
Value: "false",
426+
},
427+
{
428+
Value: "30",
429+
Name: "$_age",
430+
},
431+
},
432+
},
433+
want: `
434+
$_name = 'magic';
435+
$_isAdmin = false;
436+
$_age = 30;`,
437+
wantErr: false,
438+
},
380439
}
381440
for _, tt := range tests {
382441
t.Run(tt.name, func(t *testing.T) {
@@ -389,7 +448,7 @@ $_age = [
389448
t.Errorf("Stringify() error = %v, wantErr %v", err, tt.wantErr)
390449
return
391450
}
392-
if !strings.Contains(got, tt.want) {
451+
if got != tt.want {
393452
t.Errorf("Stringify() got = %v, want %v", got, tt.want)
394453
}
395454
})

parse.go

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package main
22

33
import (
4-
"bytes"
54
"errors"
65
"github.com/z7zmey/php-parser/pkg/ast"
76
"github.com/z7zmey/php-parser/pkg/conf"
@@ -10,14 +9,6 @@ import (
109
"github.com/z7zmey/php-parser/pkg/version"
1110
)
1211

13-
func Parse(code []byte) (ast.Vertex, error) {
14-
code = bytes.TrimSpace(code)
15-
if bytes.HasPrefix(code, []byte("<?")) || bytes.HasPrefix(code, []byte("<?php")) {
16-
return ParseCode(code)
17-
}
18-
return ParseStmtList(code)
19-
}
20-
2112
func ParseCode(code []byte) (*ast.Root, error) {
2213
phpVersion, err := version.New("7.4")
2314
if err != nil {
@@ -50,8 +41,3 @@ func ParseCode(code []byte) (*ast.Root, error) {
5041

5142
return res, nil
5243
}
53-
54-
func ParseStmtList(code []byte) (*ast.Root, error) {
55-
code = append([]byte("<?php "), code...)
56-
return ParseCode(code)
57-
}

0 commit comments

Comments
 (0)