| // 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 |
| } |