Skip to content

Commit c6d971f

Browse files
committed
style: Optimize code
Change-Id: I64da64b933d31a4dda4c26a114932471258a09c4
1 parent eb198f4 commit c6d971f

File tree

3 files changed

+116
-116
lines changed

3 files changed

+116
-116
lines changed

spec_operand.go

-52
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import (
1818
"regexp"
1919
"strconv"
2020
"strings"
21-
"unicode"
2221
)
2322

2423
// --------------------------- Operand ---------------------------
@@ -136,57 +135,6 @@ func readNilExprNode(expr *string) ExprNode {
136135

137136
func (ne *nilExprNode) Run(currField string, tagExpr *TagExpr) interface{} { return ne.val }
138137

139-
func trimLeftSpace(p *string) *string {
140-
*p = strings.TrimLeftFunc(*p, unicode.IsSpace)
141-
return p
142-
}
143-
144-
func readPairedSymbol(p *string, left, right rune) *string {
145-
s := *p
146-
if len(s) == 0 || rune(s[0]) != left {
147-
return nil
148-
}
149-
s = s[1:]
150-
var last1 = left
151-
var last2 rune
152-
var leftLevel, rightLevel int
153-
var escapeIndexes = make(map[int]bool)
154-
var realEqual, escapeEqual bool
155-
for i, r := range s {
156-
if realEqual, escapeEqual = equalRune(right, r, last1, last2); realEqual {
157-
if leftLevel == rightLevel {
158-
*p = s[i+1:]
159-
var sub = make([]rune, 0, i)
160-
for k, v := range s[:i] {
161-
if !escapeIndexes[k] {
162-
sub = append(sub, v)
163-
}
164-
}
165-
s = string(sub)
166-
return &s
167-
}
168-
rightLevel++
169-
} else if escapeEqual {
170-
escapeIndexes[i-1] = true
171-
} else if realEqual, escapeEqual = equalRune(left, r, last1, last2); realEqual {
172-
leftLevel++
173-
} else if escapeEqual {
174-
escapeIndexes[i-1] = true
175-
}
176-
last2 = last1
177-
last1 = r
178-
}
179-
return nil
180-
}
181-
182-
func equalRune(a, b, last1, last2 rune) (real, escape bool) {
183-
if a == b {
184-
real = last1 != '\\' || last2 == '\\'
185-
escape = last1 == '\\' && last2 != '\\'
186-
}
187-
return
188-
}
189-
190138
func getBoolOpposite(expr *string) (string, *bool) {
191139
last := strings.TrimLeft(*expr, "!")
192140
n := len(*expr) - len(last)

tagexpr.go

-64
Original file line numberDiff line numberDiff line change
@@ -350,70 +350,6 @@ func (s *structVM) copySubFields(field *fieldVM, sub *structVM) {
350350
s.fields[fieldSelector] = f
351351
s.fieldSelectorList = append(s.fieldSelectorList, fieldSelector)
352352
}
353-
// var selector string
354-
// for k, v := range sub.exprs {
355-
// selector = nameSpace + FieldSeparator + k
356-
// s.exprs[selector] = v
357-
// s.exprSelectorList = append(s.exprSelectorList, selector)
358-
// }
359-
}
360-
361-
func (f *fieldVM) parseExprs(tag string) error {
362-
raw := tag
363-
tag = strings.TrimSpace(tag)
364-
if tag == "" {
365-
return nil
366-
}
367-
if tag[0] != '{' {
368-
expr, err := parseExpr(tag)
369-
if err != nil {
370-
return err
371-
}
372-
exprSelector := f.structField.Name
373-
f.exprs[exprSelector] = expr
374-
f.origin.exprs[exprSelector] = expr
375-
f.origin.exprSelectorList = append(f.origin.exprSelectorList, exprSelector)
376-
return nil
377-
}
378-
var subtag *string
379-
var idx int
380-
var exprSelector, exprStr string
381-
for {
382-
subtag = readPairedSymbol(&tag, '{', '}')
383-
if subtag != nil {
384-
idx = strings.Index(*subtag, ":")
385-
if idx > 0 {
386-
exprSelector = strings.TrimSpace((*subtag)[:idx])
387-
switch exprSelector {
388-
case "":
389-
continue
390-
case ExprNameSeparator:
391-
exprSelector = f.structField.Name
392-
default:
393-
exprSelector = f.structField.Name + ExprNameSeparator + exprSelector
394-
}
395-
if _, had := f.origin.exprs[exprSelector]; had {
396-
return fmt.Errorf("duplicate expression name: %s", exprSelector)
397-
}
398-
exprStr = strings.TrimSpace((*subtag)[idx+1:])
399-
if exprStr != "" {
400-
if expr, err := parseExpr(exprStr); err == nil {
401-
f.exprs[exprSelector] = expr
402-
f.origin.exprs[exprSelector] = expr
403-
f.origin.exprSelectorList = append(f.origin.exprSelectorList, exprSelector)
404-
} else {
405-
return err
406-
}
407-
trimLeftSpace(&tag)
408-
if tag == "" {
409-
return nil
410-
}
411-
continue
412-
}
413-
}
414-
}
415-
return fmt.Errorf("syntax incorrect: %q", raw)
416-
}
417353
}
418354

419355
func (f *fieldVM) elemPtr(ptr uintptr) uintptr {

tagparser.go

+116
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package tagexpr
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
"unicode"
7+
)
8+
9+
func (f *fieldVM) parseExprs(tag string) error {
10+
raw := tag
11+
tag = strings.TrimSpace(tag)
12+
if tag == "" {
13+
return nil
14+
}
15+
if tag[0] != '{' {
16+
expr, err := parseExpr(tag)
17+
if err != nil {
18+
return err
19+
}
20+
exprSelector := f.structField.Name
21+
f.exprs[exprSelector] = expr
22+
f.origin.exprs[exprSelector] = expr
23+
f.origin.exprSelectorList = append(f.origin.exprSelectorList, exprSelector)
24+
return nil
25+
}
26+
var subtag *string
27+
var idx int
28+
var exprSelector, exprStr string
29+
for {
30+
subtag = readPairedSymbol(&tag, '{', '}')
31+
if subtag != nil {
32+
idx = strings.Index(*subtag, ":")
33+
if idx > 0 {
34+
exprSelector = strings.TrimSpace((*subtag)[:idx])
35+
switch exprSelector {
36+
case "":
37+
continue
38+
case ExprNameSeparator:
39+
exprSelector = f.structField.Name
40+
default:
41+
exprSelector = f.structField.Name + ExprNameSeparator + exprSelector
42+
}
43+
if _, had := f.origin.exprs[exprSelector]; had {
44+
return fmt.Errorf("duplicate expression name: %s", exprSelector)
45+
}
46+
exprStr = strings.TrimSpace((*subtag)[idx+1:])
47+
if exprStr != "" {
48+
if expr, err := parseExpr(exprStr); err == nil {
49+
f.exprs[exprSelector] = expr
50+
f.origin.exprs[exprSelector] = expr
51+
f.origin.exprSelectorList = append(f.origin.exprSelectorList, exprSelector)
52+
} else {
53+
return err
54+
}
55+
trimLeftSpace(&tag)
56+
if tag == "" {
57+
return nil
58+
}
59+
continue
60+
}
61+
}
62+
}
63+
return fmt.Errorf("syntax incorrect: %q", raw)
64+
}
65+
}
66+
67+
func trimLeftSpace(p *string) *string {
68+
*p = strings.TrimLeftFunc(*p, unicode.IsSpace)
69+
return p
70+
}
71+
72+
func readPairedSymbol(p *string, left, right rune) *string {
73+
s := *p
74+
if len(s) == 0 || rune(s[0]) != left {
75+
return nil
76+
}
77+
s = s[1:]
78+
var last1 = left
79+
var last2 rune
80+
var leftLevel, rightLevel int
81+
var escapeIndexes = make(map[int]bool)
82+
var realEqual, escapeEqual bool
83+
for i, r := range s {
84+
if realEqual, escapeEqual = equalRune(right, r, last1, last2); realEqual {
85+
if leftLevel == rightLevel {
86+
*p = s[i+1:]
87+
var sub = make([]rune, 0, i)
88+
for k, v := range s[:i] {
89+
if !escapeIndexes[k] {
90+
sub = append(sub, v)
91+
}
92+
}
93+
s = string(sub)
94+
return &s
95+
}
96+
rightLevel++
97+
} else if escapeEqual {
98+
escapeIndexes[i-1] = true
99+
} else if realEqual, escapeEqual = equalRune(left, r, last1, last2); realEqual {
100+
leftLevel++
101+
} else if escapeEqual {
102+
escapeIndexes[i-1] = true
103+
}
104+
last2 = last1
105+
last1 = r
106+
}
107+
return nil
108+
}
109+
110+
func equalRune(a, b, last1, last2 rune) (real, escape bool) {
111+
if a == b {
112+
real = last1 != '\\' || last2 == '\\'
113+
escape = last1 == '\\' && last2 != '\\'
114+
}
115+
return
116+
}

0 commit comments

Comments
 (0)