Skip to content

Commit eb7b468

Browse files
committed
all: Release the Opaque API
For golang/protobuf#1657 Change-Id: I7b2b0c30506706015ce278e6054439c9ad9ef727 Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/634815 TryBot-Bypass: Michael Stapelberg <stapelberg@google.com> Reviewed-by: Joseph Tsai <joetsai@digital-static.net> Reviewed-by: Damien Neil <dneil@google.com>
1 parent 5f5de33 commit eb7b468

File tree

101 files changed

+17785
-142
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

101 files changed

+17785
-142
lines changed

cmd/protoc-gen-go/builder_test/builder_test.go

Lines changed: 744 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// Copyright 2024 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
package descriptor_test
6+
7+
import (
8+
"testing"
9+
10+
testopenpb "google.golang.org/protobuf/internal/testprotos/test"
11+
testhybridpb "google.golang.org/protobuf/internal/testprotos/testeditions/testeditions_hybrid"
12+
testopaquepb "google.golang.org/protobuf/internal/testprotos/testeditions/testeditions_opaque"
13+
)
14+
15+
func TestFileModeEnum(t *testing.T) {
16+
var e any = testopenpb.ForeignEnum_FOREIGN_FOO
17+
if _, ok := e.(interface{ EnumDescriptor() ([]byte, []int) }); !ok {
18+
t.Errorf("Open V1 proto did not have deprecated method EnumDescriptor")
19+
}
20+
var oe any = testopaquepb.ForeignEnum_FOREIGN_FOO
21+
if _, ok := oe.(interface{ EnumDescriptor() ([]byte, []int) }); ok {
22+
t.Errorf("Opaque V0 proto did have deprecated method EnumDescriptor")
23+
}
24+
var he any = testhybridpb.ForeignEnum_FOREIGN_FOO
25+
if _, ok := he.(interface{ EnumDescriptor() ([]byte, []int) }); ok {
26+
t.Errorf("Hybrid proto did have deprecated method EnumDescriptor")
27+
}
28+
}
29+
30+
func TestFileModeMessage(t *testing.T) {
31+
var p any = &testopenpb.TestAllTypes{}
32+
if _, ok := p.(interface{ Descriptor() ([]byte, []int) }); !ok {
33+
t.Errorf("Open V1 proto did not have deprecated method Descriptor")
34+
}
35+
var op any = &testopaquepb.TestAllTypes{}
36+
if _, ok := op.(interface{ Descriptor() ([]byte, []int) }); ok {
37+
t.Errorf("Opaque V0 mode proto unexpectedly has deprecated Descriptor() method")
38+
}
39+
var hp any = &testhybridpb.TestAllTypes{}
40+
if _, ok := hp.(interface{ EnumDescriptor() ([]byte, []int) }); ok {
41+
t.Errorf("Hybrid proto did have deprecated method EnumDescriptor")
42+
}
43+
}

cmd/protoc-gen-go/internal_gengo/init.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ func newEnumInfo(f *fileInfo, enum *protogen.Enum) *enumInfo {
114114
e := &enumInfo{Enum: enum}
115115
e.genJSONMethod = true
116116
e.genRawDescMethod = true
117+
opaqueNewEnumInfoHook(f, e)
117118
return e
118119
}
119120

@@ -123,8 +124,9 @@ type messageInfo struct {
123124
genRawDescMethod bool
124125
genExtRangeMethod bool
125126

126-
isTracked bool
127-
hasWeak bool
127+
isTracked bool
128+
noInterface bool
129+
hasWeak bool
128130
}
129131

130132
func newMessageInfo(f *fileInfo, message *protogen.Message) *messageInfo {
@@ -135,6 +137,7 @@ func newMessageInfo(f *fileInfo, message *protogen.Message) *messageInfo {
135137
for _, field := range m.Fields {
136138
m.hasWeak = m.hasWeak || field.Desc.IsWeak()
137139
}
140+
opaqueNewMessageInfoHook(f, m)
138141
return m
139142
}
140143

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright 2024 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
package internal_gengo
6+
7+
import "google.golang.org/protobuf/types/gofeaturespb"
8+
9+
func (m *messageInfo) isOpen() bool {
10+
return m.Message.APILevel == gofeaturespb.GoFeatures_API_OPEN
11+
}
12+
13+
func (m *messageInfo) isHybrid() bool {
14+
return m.Message.APILevel == gofeaturespb.GoFeatures_API_HYBRID
15+
}
16+
17+
func (m *messageInfo) isOpaque() bool {
18+
return m.Message.APILevel == gofeaturespb.GoFeatures_API_OPAQUE
19+
}
20+
21+
func opaqueNewEnumInfoHook(f *fileInfo, e *enumInfo) {
22+
if f.File.APILevel != gofeaturespb.GoFeatures_API_OPEN {
23+
e.genJSONMethod = false
24+
e.genRawDescMethod = false
25+
}
26+
}
27+
28+
func opaqueNewMessageInfoHook(f *fileInfo, m *messageInfo) {
29+
if !m.isOpen() {
30+
m.genRawDescMethod = false
31+
m.genExtRangeMethod = false
32+
}
33+
}

cmd/protoc-gen-go/internal_gengo/main.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,9 @@ func genMessage(g *protogen.GeneratedFile, f *fileInfo, m *messageInfo) {
367367
if m.Desc.IsMapEntry() {
368368
return
369369
}
370+
if opaqueGenMessageHook(g, f, m) {
371+
return
372+
}
370373

371374
// Message type declaration.
372375
g.AnnotateSymbol(m.GoIdent.GoName, protogen.Annotation{Location: m.Location})
@@ -657,7 +660,7 @@ func genMessageSetterMethods(g *protogen.GeneratedFile, f *fileInfo, m *messageI
657660
continue
658661
}
659662

660-
genNoInterfacePragma(g, m.isTracked)
663+
genNoInterfacePragma(g, m.noInterface)
661664

662665
g.AnnotateSymbol(m.GoIdent.GoName+".Set"+field.GoName, protogen.Annotation{
663666
Location: field.Location,

0 commit comments

Comments
 (0)