Skip to content

Commit 7d572be

Browse files
committed
fix: cache syntax error
Change-Id: I6b918dc1f08c762d8db046900e9520147dd56842
1 parent 3c3e845 commit 7d572be

File tree

4 files changed

+25
-7
lines changed

4 files changed

+25
-7
lines changed

expr.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func parseExpr(expr string) (*Expr, error) {
3333
s := expr
3434
_, err := p.parseExprNode(&s, e)
3535
if err != nil {
36-
return nil, fmt.Errorf("%q (syntax error): %s", expr, err.Error())
36+
return nil, err
3737
}
3838
sortPriority(e.RightOperand())
3939
err = p.checkSyntax()
@@ -146,9 +146,8 @@ func (p *Expr) parseExprNode(expr *string, e ExprNode) (ExprNode, error) {
146146
}
147147
}
148148
if operand == nil {
149-
return nil, fmt.Errorf("parsing pos: %q", *expr)
149+
return nil, fmt.Errorf("syntax error: %q", *expr)
150150
}
151-
152151
trimLeftSpace(expr)
153152
operator := p.parseOperator(expr)
154153
if operator == nil {

tagexpr.go

+11-1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ type structVM struct {
5252
exprs map[string]*Expr
5353
exprSelectorList []string
5454
ifaceTagExprGetters []func(unsafe.Pointer, string, func(*TagExpr, error) error) error
55+
err error
5556
}
5657

5758
// fieldVM tag expression set of struct field
@@ -141,6 +142,9 @@ func (vm *VM) Run(structPtrOrReflectValue interface{}) (*TagExpr, error) {
141142
}
142143
vm.rw.Unlock()
143144
}
145+
if s.err != nil {
146+
return nil, s.err
147+
}
144148
return s.newTagExpr(ptr, ""), nil
145149
}
146150

@@ -258,6 +262,9 @@ func (vm *VM) subRun(path string, t reflect.Type, tid uintptr, ptr unsafe.Pointe
258262
}
259263
vm.rw.Unlock()
260264
}
265+
if s.err != nil {
266+
return nil, s.err
267+
}
261268
return s.newTagExpr(ptr, path), nil
262269
}
263270

@@ -269,7 +276,7 @@ func (vm *VM) registerStructLocked(structType reflect.Type) (*structVM, error) {
269276
tid := ameda.RuntimeTypeID(structType)
270277
s, had := vm.structJar[tid]
271278
if had {
272-
return s, nil
279+
return s, s.err
273280
}
274281
s = vm.newStructVM()
275282
s.name = structType.String()
@@ -281,6 +288,7 @@ func (vm *VM) registerStructLocked(structType reflect.Type) (*structVM, error) {
281288
structField = structType.Field(i)
282289
field, err := s.newFieldVM(structField)
283290
if err != nil {
291+
s.err = err
284292
return nil, err
285293
}
286294
switch field.elemKind {
@@ -290,6 +298,7 @@ func (vm *VM) registerStructLocked(structType reflect.Type) (*structVM, error) {
290298
case reflect.Struct:
291299
sub, err = vm.registerStructLocked(field.structField.Type)
292300
if err != nil {
301+
s.err = err
293302
return nil, err
294303
}
295304
s.mergeSubStructVM(field, sub)
@@ -307,6 +316,7 @@ func (vm *VM) registerStructLocked(structType reflect.Type) (*structVM, error) {
307316
case reflect.Array, reflect.Slice, reflect.Map:
308317
err = vm.registerIndirectStructLocked(field)
309318
if err != nil {
319+
s.err = err
310320
return nil, err
311321
}
312322
}

tagparser.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,10 @@ func parseTag(tag string) (map[string]string, error) {
6060
}
6161
key, val := splitExpr(one)
6262
if val == "" {
63-
return nil, fmt.Errorf("%q (syntax error): expression string can not be empty", tag)
63+
return nil, fmt.Errorf("syntax error: %q expression string can not be empty", tag)
6464
}
6565
if _, ok := kvs[key]; ok {
66-
return nil, fmt.Errorf("%q (syntax error): duplicate expression name %q", tag, key)
66+
return nil, fmt.Errorf("syntax error: %q duplicate expression name %q", tag, key)
6767
}
6868
kvs[key] = val
6969
}
@@ -121,7 +121,7 @@ func readOneExpr(tag *string) (string, error) {
121121
patch++
122122
}
123123
}
124-
return "", fmt.Errorf("%q (syntax error): unclosed single quote \"'\"", s)
124+
return "", fmt.Errorf("syntax error: %q unclosed single quote \"'\"", s)
125125
}
126126

127127
func trimLeftSpace(p *string) *string {

validator/validator_test.go

+9
Original file line numberDiff line numberDiff line change
@@ -290,3 +290,12 @@ func TestIssue30(t *testing.T) {
290290
assert.EqualError(t, vd.Validate(&TStruct{TOk: "1"}), "invalid parameter: TOk")
291291
// assert.NoError(t, vd.Validate(&TStruct{TOk: "1", TFail: "1"}))
292292
}
293+
294+
func TestIssue31(t *testing.T) {
295+
type TStruct struct {
296+
A []int32 `vd:"$ == nil || ($ != nil && range($, in(#v, 1, 2, 3))"`
297+
}
298+
assert.EqualError(t, vd.Validate(&TStruct{A: []int32{1}}), "syntax error: \"($ != nil && range($, in(#v, 1, 2, 3))\"")
299+
assert.EqualError(t, vd.Validate(&TStruct{A: []int32{1}}), "syntax error: \"($ != nil && range($, in(#v, 1, 2, 3))\"")
300+
assert.EqualError(t, vd.Validate(&TStruct{A: []int32{1}}), "syntax error: \"($ != nil && range($, in(#v, 1, 2, 3))\"")
301+
}

0 commit comments

Comments
 (0)