From 9f4bd72f97f15a0ae513b2d51d5651698daa6230 Mon Sep 17 00:00:00 2001 From: Gary Miller Date: Thu, 10 Aug 2017 19:26:17 +1000 Subject: [PATCH 1/4] stop panic if using oneof --- protoc-gen-go/retag/retag.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/protoc-gen-go/retag/retag.go b/protoc-gen-go/retag/retag.go index 31b3b0ac92..d1a585da8d 100644 --- a/protoc-gen-go/retag/retag.go +++ b/protoc-gen-go/retag/retag.go @@ -52,6 +52,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) @@ -74,12 +75,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 From 8f2ccaa2a018f7c6cbbcc2248886dfcd8a22abf4 Mon Sep 17 00:00:00 2001 From: Gary Miller Date: Mon, 14 Aug 2017 16:20:31 +1000 Subject: [PATCH 2/4] change retag parsing to a regexp. Handle fields without spaces around '=', using field name is json:"..." is missing. --- protoc-gen-go/retag/retag.go | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/protoc-gen-go/retag/retag.go b/protoc-gen-go/retag/retag.go index d1a585da8d..3b4c6a5378 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" @@ -118,28 +119,19 @@ func (r *retag) getStructTags(filename string) { } } +var reFnT *regexp.Regexp = regexp.MustCompile(`^\s*[^\s]*\s*([^\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) + } + field = msgName + "." + m[0][2] + if m[0][4] != "" { + tag = m[0][4] + } else { + tag = fmt.Sprintf(`json:"%s"`, m[0][2]) } - - tag = strings.TrimSpace(tag) - tag = strings.Trim(tag, "`") - tag = trimInside(tag) - return } From 95e57a3082f87fe15d510555773369a1bb2d0177 Mon Sep 17 00:00:00 2001 From: Gary Miller Date: Tue, 15 Aug 2017 01:15:18 +1000 Subject: [PATCH 3/4] fixed regexp --- protoc-gen-go/retag/retag.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/protoc-gen-go/retag/retag.go b/protoc-gen-go/retag/retag.go index 3b4c6a5378..da7463d347 100644 --- a/protoc-gen-go/retag/retag.go +++ b/protoc-gen-go/retag/retag.go @@ -119,7 +119,7 @@ func (r *retag) getStructTags(filename string) { } } -var reFnT *regexp.Regexp = regexp.MustCompile(`^\s*[^\s]*\s*([^\s]+)\s*([^\s]+)\s*=\s*\d+\s*;\s*(//.*(json:"[^"]+").*)?`) +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) { m := reFnT.FindAllStringSubmatch(line, 4) @@ -130,8 +130,10 @@ func getFieldTag(line string, msgName string) (field string, tag string) { 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 } From c2049596b36e15bc20280a4c56b82306f21c8d3d Mon Sep 17 00:00:00 2001 From: Gary Miller Date: Thu, 31 Aug 2017 20:17:35 +1000 Subject: [PATCH 4/4] ignore blank lines --- protoc-gen-go/retag/retag.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/protoc-gen-go/retag/retag.go b/protoc-gen-go/retag/retag.go index da7463d347..14aa321ed4 100644 --- a/protoc-gen-go/retag/retag.go +++ b/protoc-gen-go/retag/retag.go @@ -63,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 }