blob: e89f4d4ec83b88a95812f85c67f5a9079357ff43 [file] [log] [blame]
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package internal_gengo
import (
"google.golang.org/protobuf/compiler/protogen"
"google.golang.org/protobuf/internal/encoding/wire"
"google.golang.org/protobuf/types/descriptorpb"
)
// messageFlags provides flags that control the generated API.
type messageFlags struct {
IsTracked bool
HasWeak bool
}
func loadMessageFlags(message *protogen.Message) messageFlags {
var flags messageFlags
flags.IsTracked = isTrackedMessage(message)
for _, field := range message.Fields {
if field.Desc.IsWeak() {
flags.HasWeak = true
break
}
}
return flags
}
// isTrackedMessage reports whether field tracking is enabled on the message.
// It is a variable so that the behavior is easily overridden in another file.
var isTrackedMessage = func(message *protogen.Message) (tracked bool) {
const trackFieldUse_fieldNumber = 37383685
// Decode the option from unknown fields to avoid a dependency on the
// annotation proto from protoc-gen-go.
b := message.Desc.Options().(*descriptorpb.MessageOptions).ProtoReflect().GetUnknown()
for len(b) > 0 {
num, typ, n := wire.ConsumeTag(b)
b = b[n:]
if num == trackFieldUse_fieldNumber && typ == wire.VarintType {
v, _ := wire.ConsumeVarint(b)
tracked = wire.DecodeBool(v)
}
m := wire.ConsumeFieldValue(num, typ, b)
b = b[m:]
}
return tracked
}