mirror of
https://github.com/protocolbuffers/protobuf-go.git
synced 2025-03-09 22:13:27 +00:00
all: enable editions support
Change-Id: I30e08a1610e11187a7632a409bd001f3bff1ba4a Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/573355 Auto-Submit: Lasse Folger <lassefolger@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Michael Stapelberg <stapelberg@google.com>
This commit is contained in:
parent
59034d830f
commit
dea00b5e2a
@ -17,6 +17,7 @@ import (
|
|||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
|
|
||||||
"google.golang.org/protobuf/compiler/protogen"
|
"google.golang.org/protobuf/compiler/protogen"
|
||||||
|
"google.golang.org/protobuf/internal/editionssupport"
|
||||||
"google.golang.org/protobuf/internal/encoding/tag"
|
"google.golang.org/protobuf/internal/encoding/tag"
|
||||||
"google.golang.org/protobuf/internal/filedesc"
|
"google.golang.org/protobuf/internal/filedesc"
|
||||||
"google.golang.org/protobuf/internal/genid"
|
"google.golang.org/protobuf/internal/genid"
|
||||||
@ -29,7 +30,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// SupportedFeatures reports the set of supported protobuf language features.
|
// SupportedFeatures reports the set of supported protobuf language features.
|
||||||
var SupportedFeatures = uint64(pluginpb.CodeGeneratorResponse_FEATURE_PROTO3_OPTIONAL)
|
var SupportedFeatures = uint64(pluginpb.CodeGeneratorResponse_FEATURE_PROTO3_OPTIONAL | pluginpb.CodeGeneratorResponse_FEATURE_SUPPORTS_EDITIONS)
|
||||||
|
|
||||||
|
var SupportedEditionsMinimum = editionssupport.Minimum
|
||||||
|
var SupportedEditionsMaximum = editionssupport.Maximum
|
||||||
|
|
||||||
// GenerateVersionMarkers specifies whether to generate version markers.
|
// GenerateVersionMarkers specifies whether to generate version markers.
|
||||||
var GenerateVersionMarkers = true
|
var GenerateVersionMarkers = true
|
||||||
|
@ -108,6 +108,9 @@ type Plugin struct {
|
|||||||
// google.protobuf.CodeGeneratorResponse.supported_features for details.
|
// google.protobuf.CodeGeneratorResponse.supported_features for details.
|
||||||
SupportedFeatures uint64
|
SupportedFeatures uint64
|
||||||
|
|
||||||
|
SupportedEditionsMinimum descriptorpb.Edition
|
||||||
|
SupportedEditionsMaximum descriptorpb.Edition
|
||||||
|
|
||||||
fileReg *protoregistry.Files
|
fileReg *protoregistry.Files
|
||||||
enumsByName map[protoreflect.FullName]*Enum
|
enumsByName map[protoreflect.FullName]*Enum
|
||||||
messagesByName map[protoreflect.FullName]*Message
|
messagesByName map[protoreflect.FullName]*Message
|
||||||
@ -396,6 +399,10 @@ func (gen *Plugin) Response() *pluginpb.CodeGeneratorResponse {
|
|||||||
if gen.SupportedFeatures > 0 {
|
if gen.SupportedFeatures > 0 {
|
||||||
resp.SupportedFeatures = proto.Uint64(gen.SupportedFeatures)
|
resp.SupportedFeatures = proto.Uint64(gen.SupportedFeatures)
|
||||||
}
|
}
|
||||||
|
if gen.SupportedEditionsMinimum != descriptorpb.Edition_EDITION_UNKNOWN && gen.SupportedEditionsMaximum != descriptorpb.Edition_EDITION_UNKNOWN {
|
||||||
|
resp.MinimumEdition = proto.Int32(int32(gen.SupportedEditionsMinimum))
|
||||||
|
resp.MaximumEdition = proto.Int32(int32(gen.SupportedEditionsMaximum))
|
||||||
|
}
|
||||||
return resp
|
return resp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ import (
|
|||||||
gengo "google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo"
|
gengo "google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo"
|
||||||
"google.golang.org/protobuf/compiler/protogen"
|
"google.golang.org/protobuf/compiler/protogen"
|
||||||
"google.golang.org/protobuf/internal/detrand"
|
"google.golang.org/protobuf/internal/detrand"
|
||||||
"google.golang.org/protobuf/reflect/protodesc"
|
"google.golang.org/protobuf/internal/editionssupport"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@ -108,8 +108,8 @@ func generateEditionsDefaults() {
|
|||||||
// The enum in Go string formats to "EDITION_${EDITION}" but protoc expects
|
// The enum in Go string formats to "EDITION_${EDITION}" but protoc expects
|
||||||
// the flag in the form "${EDITION}". To work around this, we trim the
|
// the flag in the form "${EDITION}". To work around this, we trim the
|
||||||
// "EDITION_" prefix.
|
// "EDITION_" prefix.
|
||||||
minEdition := strings.TrimPrefix(fmt.Sprint(protodesc.SupportedEditionsMinimum), "EDITION_")
|
minEdition := strings.TrimPrefix(fmt.Sprint(editionssupport.Minimum), "EDITION_")
|
||||||
maxEdition := strings.TrimPrefix(fmt.Sprint(protodesc.SupportedEditionsMaximum), "EDITION_")
|
maxEdition := strings.TrimPrefix(fmt.Sprint(editionssupport.Maximum), "EDITION_")
|
||||||
cmd := exec.Command(
|
cmd := exec.Command(
|
||||||
"protoc",
|
"protoc",
|
||||||
"--experimental_edition_defaults_out", dest,
|
"--experimental_edition_defaults_out", dest,
|
||||||
|
13
internal/editionssupport/editions.go
Normal file
13
internal/editionssupport/editions.go
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// Copyright 2024 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 editionssupport defines constants for editions that are supported.
|
||||||
|
package editionssupport
|
||||||
|
|
||||||
|
import descriptorpb "google.golang.org/protobuf/types/descriptorpb"
|
||||||
|
|
||||||
|
const (
|
||||||
|
Minimum = descriptorpb.Edition_EDITION_PROTO2
|
||||||
|
Maximum = descriptorpb.Edition_EDITION_2023
|
||||||
|
)
|
@ -333,8 +333,7 @@ func (fd *Field) HasPresence() bool {
|
|||||||
if fd.L1.Cardinality == protoreflect.Repeated {
|
if fd.L1.Cardinality == protoreflect.Repeated {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
explicitFieldPresence := fd.Syntax() == protoreflect.Editions && fd.L1.EditionFeatures.IsFieldPresence
|
return fd.L1.EditionFeatures.IsFieldPresence || fd.L1.Message != nil || fd.L1.ContainingOneof != nil
|
||||||
return fd.Syntax() == protoreflect.Proto2 || explicitFieldPresence || fd.L1.Message != nil || fd.L1.ContainingOneof != nil
|
|
||||||
}
|
}
|
||||||
func (fd *Field) HasOptionalKeyword() bool {
|
func (fd *Field) HasOptionalKeyword() bool {
|
||||||
return (fd.L0.ParentFile.L1.Syntax == protoreflect.Proto2 && fd.L1.Cardinality == protoreflect.Optional && fd.L1.ContainingOneof == nil) || fd.L1.IsProto3Optional
|
return (fd.L0.ParentFile.L1.Syntax == protoreflect.Proto2 && fd.L1.Cardinality == protoreflect.Optional && fd.L1.ContainingOneof == nil) || fd.L1.IsProto3Optional
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
package protodesc
|
package protodesc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"google.golang.org/protobuf/internal/editionssupport"
|
||||||
"google.golang.org/protobuf/internal/errors"
|
"google.golang.org/protobuf/internal/errors"
|
||||||
"google.golang.org/protobuf/internal/filedesc"
|
"google.golang.org/protobuf/internal/filedesc"
|
||||||
"google.golang.org/protobuf/internal/pragma"
|
"google.golang.org/protobuf/internal/pragma"
|
||||||
@ -101,7 +102,7 @@ func (o FileOptions) New(fd *descriptorpb.FileDescriptorProto, r Resolver) (prot
|
|||||||
default:
|
default:
|
||||||
return nil, errors.New("invalid syntax: %q", fd.GetSyntax())
|
return nil, errors.New("invalid syntax: %q", fd.GetSyntax())
|
||||||
}
|
}
|
||||||
if f.L1.Syntax == protoreflect.Editions && (fd.GetEdition() < SupportedEditionsMinimum || fd.GetEdition() > SupportedEditionsMaximum) {
|
if f.L1.Syntax == protoreflect.Editions && (fd.GetEdition() < editionssupport.Minimum || fd.GetEdition() > editionssupport.Maximum) {
|
||||||
return nil, errors.New("use of edition %v not yet supported by the Go Protobuf runtime", fd.GetEdition())
|
return nil, errors.New("use of edition %v not yet supported by the Go Protobuf runtime", fd.GetEdition())
|
||||||
}
|
}
|
||||||
f.L1.Path = fd.GetName()
|
f.L1.Path = fd.GetName()
|
||||||
|
@ -17,11 +17,6 @@ import (
|
|||||||
gofeaturespb "google.golang.org/protobuf/types/gofeaturespb"
|
gofeaturespb "google.golang.org/protobuf/types/gofeaturespb"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
|
||||||
SupportedEditionsMinimum = descriptorpb.Edition_EDITION_PROTO2
|
|
||||||
SupportedEditionsMaximum = descriptorpb.Edition_EDITION_2023
|
|
||||||
)
|
|
||||||
|
|
||||||
var defaults = &descriptorpb.FeatureSetDefaults{}
|
var defaults = &descriptorpb.FeatureSetDefaults{}
|
||||||
var defaultsCacheMu sync.Mutex
|
var defaultsCacheMu sync.Mutex
|
||||||
var defaultsCache = make(map[filedesc.Edition]*descriptorpb.FeatureSet)
|
var defaultsCache = make(map[filedesc.Edition]*descriptorpb.FeatureSet)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user