Skip to content

Commit e89ca79

Browse files
committed
support nested extends
1 parent f0cf55b commit e89ca79

File tree

7 files changed

+58
-27
lines changed

7 files changed

+58
-27
lines changed

example/output.proto

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,17 @@ option go_package = 'generated/proto;pb';
55

66
package example.com;
77

8-
message Base {
9-
int64 id = 1;
10-
int64 createdAt = 2;
11-
int64 updatedAt = 3;
12-
}
13-
14-
158
message groups {
169
message Group {
1710

11+
// ↓↓↓↓↓ extends Intermediate
1812
// ↓↓↓↓↓ extends Base
1913
int64 id = 1;
14+
// ↑↑↑↑↑ extends Base
15+
2016
int64 createdAt = 2;
2117
int64 updatedAt = 3;
22-
// ↑↑↑↑↑ extends Base
18+
// ↑↑↑↑↑ extends Intermediate
2319

2420
string name = 11;
2521
repeated users.User users = 12;
@@ -30,11 +26,14 @@ message groups {
3026
message users {
3127
message User {
3228

29+
// ↓↓↓↓↓ extends Intermediate
3330
// ↓↓↓↓↓ extends Base
3431
int64 id = 1;
32+
// ↑↑↑↑↑ extends Base
33+
3534
int64 createdAt = 2;
3635
int64 updatedAt = 3;
37-
// ↑↑↑↑↑ extends Base
36+
// ↑↑↑↑↑ extends Intermediate
3837

3938
string name = 11;
4039
string email = 12;
@@ -44,3 +43,18 @@ message users {
4443

4544
}
4645

46+
message Base {
47+
int64 id = 1;
48+
}
49+
50+
message Intermediate {
51+
52+
// ↓↓↓↓↓ extends Base
53+
int64 id = 1;
54+
// ↑↑↑↑↑ extends Base
55+
56+
int64 createdAt = 2;
57+
int64 updatedAt = 3;
58+
}
59+
60+

example/proto/base.proto

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,4 @@ package example.com;
55

66
message Base {
77
int64 id = 1;
8-
int64 createdAt = 2;
9-
int64 updatedAt = 3;
108
}

example/proto/group.proto

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,10 @@ option go_package = 'generated/proto;pb';
44
package example.com.groups;
55

66
import "proto/user.proto";
7-
import "proto/base.proto";
87
import "oneproto.proto";
98

109
message Group {
11-
option (oneproto.extends) = 'example.com.Base';
10+
option (oneproto.extends) = 'example.com.Intermediate';
1211

1312
string name = 11;
1413
repeated users.User users = 12;

example/proto/intermediate.proto

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
syntax = 'proto3';
2+
option go_package = 'generated/proto;pb';
3+
4+
package example.com;
5+
6+
import "oneproto.proto";
7+
8+
message Intermediate {
9+
option (oneproto.extends) = 'example.com.Base';
10+
11+
int64 createdAt = 2;
12+
int64 updatedAt = 3;
13+
}

example/proto/user.proto

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ package example.com.users;
66
import "proto/group.proto";
77
import "oneproto.proto";
88

9+
910
message User {
10-
option (oneproto.extends) = 'example.com.Base';
11+
option (oneproto.extends) = 'example.com.Intermediate';
1112

1213
string name = 11;
1314
string email = 12;

main.go

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -195,18 +195,7 @@ func generateMessage(buf *Buffer, indentLevel int, message *descriptorpb.Descrip
195195
indent := strings.Repeat(" ", indentLevel*4)
196196
buf.Printf("%smessage %s {", indent, message.GetName())
197197
generateHeadOptions(buf, indent, message.GetOptions().GetUninterpretedOption())
198-
for _, opt := range message.GetOptions().GetUninterpretedOption() {
199-
if isOptionOneProtoExtends(opt) {
200-
name := trimPackageFromName(string(opt.GetStringValue()))
201-
buf.Printf("%s // ↓↓↓↓↓ extends %s", indent, name)
202-
parent := allMessageDescriptors[name]
203-
for _, field := range parent.GetField() {
204-
buf.Printf("%s %s %s = %d%s;", indent, stringifyField(message, field), field.GetName(), field.GetNumber(), stringifyValueOptions(field.GetOptions().GetUninterpretedOption()))
205-
}
206-
buf.Printf("%s // ↑↑↑↑↑ extends %s", indent, name)
207-
buf.Printf("")
208-
}
209-
}
198+
generateExtendedMessage(buf, indentLevel, message)
210199
for _, field := range message.GetField() {
211200
buf.Printf("%s %s %s = %d%s;", indent, stringifyField(message, field), field.GetName(), field.GetNumber(), stringifyValueOptions(field.GetOptions().GetUninterpretedOption()))
212201
}
@@ -226,6 +215,23 @@ func generateMessage(buf *Buffer, indentLevel int, message *descriptorpb.Descrip
226215
buf.Printf("%s}", indent)
227216
}
228217

218+
func generateExtendedMessage(buf *Buffer, indentLevel int, message *descriptorpb.DescriptorProto) {
219+
indent := strings.Repeat(" ", indentLevel*4)
220+
for _, opt := range message.GetOptions().GetUninterpretedOption() {
221+
if isOptionOneProtoExtends(opt) {
222+
name := trimPackageFromName(string(opt.GetStringValue()))
223+
buf.Printf("%s // ↓↓↓↓↓ extends %s", indent, name)
224+
parent := allMessageDescriptors[name]
225+
generateExtendedMessage(buf, indentLevel, parent)
226+
for _, field := range parent.GetField() {
227+
buf.Printf("%s %s %s = %d%s;", indent, stringifyField(message, field), field.GetName(), field.GetNumber(), stringifyValueOptions(field.GetOptions().GetUninterpretedOption()))
228+
}
229+
buf.Printf("%s // ↑↑↑↑↑ extends %s", indent, name)
230+
buf.Printf("")
231+
}
232+
}
233+
}
234+
229235
func generateHeadOptions(buf *Buffer, indent string, options []*descriptorpb.UninterpretedOption) {
230236
if len(options) == 0 {
231237
return

oneproto.proto

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ package oneproto;
66
import 'google/protobuf/descriptor.proto';
77

88
extend google.protobuf.MessageOptions {
9-
string extends = 9099;
9+
string extends = 2099;
1010
}

0 commit comments

Comments
 (0)