diff --git a/protoc-gen-go/retag/retag.go b/protoc-gen-go/retag/retag.go index 31b3b0ac92..14aa321ed4 100644 --- a/protoc-gen-go/retag/retag.go +++ b/protoc-gen-go/retag/retag.go @@ -5,6 +5,7 @@ import ( "bytes" "fmt" "os" + "regexp" "strconv" "strings" @@ -52,6 +53,7 @@ func (r *retag) getStructTags(filename string) { r.tags = make(map[string]string) var begin bool + var oneof bool var comment bool var msgName string reader := bufio.NewReader(file) @@ -61,6 +63,10 @@ func (r *retag) getStructTags(filename string) { break } + if len(strings.TrimSpace(string(line))) == 0 { + continue + } + if strings.HasPrefix(strings.TrimSpace(string(line)), "/*") { comment = true } @@ -74,12 +80,22 @@ func (r *retag) getStructTags(filename string) { continue } + if strings.HasPrefix(strings.TrimSpace(string(line)), "oneof") { + oneof = true + continue + } + if strings.HasPrefix(strings.TrimSpace(string(line)), "message") { begin = true msgName = strings.Fields(string(line))[1] continue } + if oneof == true && strings.TrimSpace(string(line))[0] == '}' { + oneof = false + continue + } + if begin == true && line[0] == '}' { begin = false continue @@ -107,28 +123,21 @@ func (r *retag) getStructTags(filename string) { } } +var reFnT *regexp.Regexp = regexp.MustCompile(`^\s*(?:repeated)?\s*(map<[^>]+>|[^\s]+)\s*([^\s]+)\s*=\s*\d+\s*;\s*(//.*(json:"[^"]+").*)?`) + func getFieldTag(line string, msgName string) (field string, tag string) { - fts := strings.Split(line, "//") - tag = fts[1] - fs := strings.Fields(fts[0]) - fsl := len(fs) - field = msgName + "." - for i := 0; i < fsl; i++ { - if i == fsl-1 { - field += fs[i] - break - } else { - if fs[i+1] == "=" { - field += fs[i] - break - } - } + m := reFnT.FindAllStringSubmatch(line, 4) + if len(m) < 1 { + fmt.Fprintf(os.Stderr, "******\n\n\n%s\n\n\n****\n", line) } - - tag = strings.TrimSpace(tag) - tag = strings.Trim(tag, "`") - tag = trimInside(tag) - + field = msgName + "." + m[0][2] + if m[0][4] != "" { + tag = m[0][4] + } else { + // fmt.Fprintf(os.Stderr, "no match %v %v\n", m, line) + tag = fmt.Sprintf(`json:"%s"`, m[0][2]) + } + // fmt.Fprintf(os.Stderr, "2. field %v tag %v\n", field, tag) return }