From 9709b3cd5aa11def8c0c16fc593e3999fdd3ab5d Mon Sep 17 00:00:00 2001 From: Travis Cline Date: Tue, 5 Jan 2016 21:06:46 -0800 Subject: [PATCH 1/3] Improve PascalFromSnake behavior --- utilities/name.go | 56 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/utilities/name.go b/utilities/name.go index e99648c3337..15ff3390620 100644 --- a/utilities/name.go +++ b/utilities/name.go @@ -1,14 +1,52 @@ package utilities -import ( - "strings" -) - // PascalFromSnake converts an identifier in snake_case into PascalCase. -func PascalFromSnake(str string) string { - var components []string - for _, c := range strings.Split(str, "_") { - components = append(components, strings.Title(strings.ToLower(c))) +func PascalFromSnake(s string) string { + // adopted from github.com/golang/protobuf/protoc-gen-go/generator/generator.go + if s == "" { + return "" + } + t := make([]byte, 0, 32) + i := 0 + if s[0] == '_' { + // Need a capital letter; drop the '_'. + t = append(t, 'X') + i++ } - return strings.Join(components, "") + // Invariant: if the next letter is lower case, it must be converted + // to upper case. + // That is, we process a word at a time, where words are marked by _ or + // upper case letter. Digits are treated as words. + for ; i < len(s); i++ { + c := s[i] + if c == '_' && i+1 < len(s) && isASCIILower(s[i+1]) { + continue // Skip the underscore in s. + } + if isASCIIDigit(c) { + t = append(t, c) + continue + } + // Assume we have a letter now - if not, it's a bogus identifier. + // The next word is a sequence of characters that must start upper case. + if isASCIILower(c) { + c ^= ' ' // Make it a capital letter. + } + t = append(t, c) // Guaranteed not lower case. + // Accept lower case sequence that follows. + for i+1 < len(s) && isASCIILower(s[i+1]) { + i++ + t = append(t, s[i]) + } + } + return string(t) +} + +// Is c an ASCII lower-case letter? +func isASCIILower(c byte) bool { + return 'a' <= c && c <= 'z' +} + +// Is c an ASCII digit? +func isASCIIDigit(c byte) bool { + return '0' <= c && c <= '9' } From 9ab86263667df29d19e2d7748f60cc198336f091 Mon Sep 17 00:00:00 2001 From: Travis Cline Date: Tue, 5 Jan 2016 22:22:13 -0800 Subject: [PATCH 2/3] include copyright notice --- utilities/name.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/utilities/name.go b/utilities/name.go index 15ff3390620..01fdb6097b2 100644 --- a/utilities/name.go +++ b/utilities/name.go @@ -3,6 +3,36 @@ package utilities // PascalFromSnake converts an identifier in snake_case into PascalCase. func PascalFromSnake(s string) string { // adopted from github.com/golang/protobuf/protoc-gen-go/generator/generator.go + // + // Copyright 2010 The Go Authors. All rights reserved. + // https://github.com/golang/protobuf + // + // Redistribution and use in source and binary forms, with or without + // modification, are permitted provided that the following conditions are + // met: + // + // * Redistributions of source code must retain the above copyright + // notice, this list of conditions and the following disclaimer. + // * Redistributions in binary form must reproduce the above + // copyright notice, this list of conditions and the following disclaimer + // in the documentation and/or other materials provided with the + // distribution. + // * Neither the name of Google Inc. nor the names of its + // contributors may be used to endorse or promote products derived from + // this software without specific prior written permission. + // + // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + if s == "" { return "" } From 6c651ecfc7786e86eac68255ab8ca6c33a297c21 Mon Sep 17 00:00:00 2001 From: Travis Cline Date: Tue, 5 Jan 2016 22:28:32 -0800 Subject: [PATCH 3/3] re-generate files with latest protoc-gen-go --- examples/examplepb/echo_service.pb.go | 4 ++++ examples/sub/message.pb.go | 4 ++++ third_party/googleapis/google/api/annotations.pb.go | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/examples/examplepb/echo_service.pb.go b/examples/examplepb/echo_service.pb.go index e25d61806be..781dd8c3998 100644 --- a/examples/examplepb/echo_service.pb.go +++ b/examples/examplepb/echo_service.pb.go @@ -38,6 +38,10 @@ var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +const _ = proto.ProtoPackageIsVersion1 + type SimpleMessage struct { Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"` } diff --git a/examples/sub/message.pb.go b/examples/sub/message.pb.go index 5df59dd989e..de0b674eba6 100644 --- a/examples/sub/message.pb.go +++ b/examples/sub/message.pb.go @@ -22,6 +22,10 @@ var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +const _ = proto.ProtoPackageIsVersion1 + type StringMessage struct { Value *string `protobuf:"bytes,1,req,name=value" json:"value,omitempty"` XXX_unrecognized []byte `json:"-"` diff --git a/third_party/googleapis/google/api/annotations.pb.go b/third_party/googleapis/google/api/annotations.pb.go index 1629526cd36..b24acb462aa 100644 --- a/third_party/googleapis/google/api/annotations.pb.go +++ b/third_party/googleapis/google/api/annotations.pb.go @@ -25,6 +25,10 @@ var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +const _ = proto.ProtoPackageIsVersion1 + var E_Http = &proto.ExtensionDesc{ ExtendedType: (*google_protobuf.MethodOptions)(nil), ExtensionType: (*HttpRule)(nil),