1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- // Copyright 2018 Twitch Interactive, Inc. All Rights Reserved.
- //
- // Licensed under the Apache License, Version 2.0 (the "License"). You may not
- // use this file except in compliance with the License. A copy of the License is
- // located at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // or in the "license" file accompanying this file. This file is distributed on
- // an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
- // express or implied. See the License for the specific language governing
- // permissions and limitations under the License.
- package main
- import (
- "path"
- "strings"
- "go-common/app/tool/liverpc/protoc-gen-liverpc/gen/stringutils"
- "github.com/golang/protobuf/protoc-gen-go/descriptor"
- )
- // goPackageOption interprets the file's go_package option.
- // If there is no go_package, it returns ("", "", false).
- // If there's a simple name, it returns ("", pkg, true).
- // If the option implies an import path, it returns (impPath, pkg, true).
- func goPackageOption(f *descriptor.FileDescriptorProto) (impPath, pkg string, ok bool) {
- pkg = f.GetOptions().GetGoPackage()
- if pkg == "" {
- return
- }
- ok = true
- // The presence of a slash implies there's an import path.
- slash := strings.LastIndex(pkg, "/")
- if slash < 0 {
- return
- }
- impPath, pkg = pkg, pkg[slash+1:]
- // A semicolon-delimited suffix overrides the package name.
- sc := strings.IndexByte(impPath, ';')
- if sc < 0 {
- return
- }
- impPath, pkg = impPath[:sc], impPath[sc+1:]
- return
- }
- // goPackageName returns the Go package name to use in the generated Go file.
- // The result explicitly reports whether the name came from an option go_package
- // statement. If explicit is false, the name was derived from the protocol
- // buffer's package statement or the input file name.
- func goPackageName(f *descriptor.FileDescriptorProto) (name string, explicit bool) {
- // Does the file have a "go_package" option?
- if _, pkg, ok := goPackageOption(f); ok {
- return pkg, true
- }
- // Does the file have a package clause?
- if pkg := f.GetPackage(); pkg != "" {
- return pkg, false
- }
- // Use the file base name.
- return stringutils.BaseName(f.GetName()), false
- }
- // goFileName returns the output name for the generated Go file.
- func goFileName(f *descriptor.FileDescriptorProto) string {
- name := *f.Name
- if ext := path.Ext(name); ext == ".proto" || ext == ".protodevel" {
- name = name[:len(name)-len(ext)]
- }
- name += ".liverpc.go"
- // Does the file have a "go_package" option? If it does, it may override the
- // filename.
- if impPath, _, ok := goPackageOption(f); ok && impPath != "" {
- // Replace the existing dirname with the declared import path.
- _, name = path.Split(name)
- name = path.Join(impPath, name)
- return name
- }
- return name
- }
|