mirror of
https://github.com/protocolbuffers/protobuf-go.git
synced 2025-01-01 11:58:21 +00:00
52 lines
1.4 KiB
Go
52 lines
1.4 KiB
Go
|
// 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
|
||
|
}
|