@@ -102,7 +102,7 @@ function buildRoot(root) {
102
102
if ( pkg . length )
103
103
out . push ( "" , "package " + pkg . join ( "." ) + ";" ) ;
104
104
105
- buildOptions ( ptr ) ;
105
+ buildOptions ( ptr , [ "edition" , "syntax" ] ) ;
106
106
ptr . nestedArray . forEach ( build ) ;
107
107
}
108
108
@@ -184,8 +184,12 @@ function buildType(type) {
184
184
}
185
185
186
186
function buildField ( field , passExtend ) {
187
- if ( field . partOf || field . declaringField || field . extend !== undefined && ! passExtend )
187
+ if ( field . partOf && ! field . partOf . isProto3Optional ) {
188
188
return ;
189
+ }
190
+ if ( field . declaringField || field . extend !== undefined && ! passExtend ) {
191
+ return ;
192
+ }
189
193
if ( first ) {
190
194
first = false ;
191
195
push ( "" ) ;
@@ -199,8 +203,10 @@ function buildField(field, passExtend) {
199
203
sb . push ( "map<" + field . keyType + ", " + field . type + ">" ) ;
200
204
else if ( field . repeated )
201
205
sb . push ( "repeated" , field . type ) ;
202
- else if ( syntax === 2 || field . parent . group )
206
+ else if ( syntax === 2 )
203
207
sb . push ( field . required ? "required" : "optional" , field . type ) ;
208
+ else if ( syntax === 3 && field . hasPresence )
209
+ sb . push ( "optional" , field . type ) ;
204
210
else
205
211
sb . push ( field . type ) ;
206
212
sb . push ( underScore ( field . name ) , "=" , field . id ) ;
@@ -211,7 +217,7 @@ function buildField(field, passExtend) {
211
217
}
212
218
213
219
function buildGroup ( field ) {
214
- push ( field . rule + " group " + field . resolvedType . name + " = " + field . id + " {" ) ;
220
+ push ( ( field . rule || "optional" ) + " group " + field . resolvedType . name + " = " + field . id + " {" ) ;
215
221
++ indent ;
216
222
buildOptions ( field . resolvedType ) ;
217
223
first = true ;
@@ -223,20 +229,16 @@ function buildGroup(field) {
223
229
}
224
230
225
231
function buildFieldOptions ( field ) {
226
- var keys ;
227
- if ( ! field . options || ! ( keys = Object . keys ( field . options ) ) . length )
228
- return null ;
232
+ var keys = [ ] ;
233
+ if ( field . options ) {
234
+ keys = Object . keys ( field . options ) ;
235
+ }
229
236
var sb = [ ] ;
230
237
keys . forEach ( function ( key ) {
238
+ if ( key === "proto3_optional" || key === "packed" || key . startsWith ( "features." ) ) return ;
239
+
231
240
var val = field . options [ key ] ;
232
- var wireType = types . packed [ field . resolvedType instanceof Enum ? "int32" : field . type ] ;
233
241
switch ( key ) {
234
- case "packed" :
235
- val = Boolean ( val ) ;
236
- // skip when not packable or syntax default
237
- if ( wireType === undefined || syntax === 3 === val )
238
- return ;
239
- break ;
240
242
case "default" :
241
243
if ( syntax === 3 )
242
244
return ;
@@ -253,6 +255,14 @@ function buildFieldOptions(field) {
253
255
}
254
256
sb . push ( key + "=" + val ) ;
255
257
} ) ;
258
+ var packable = types . packed [ field . resolvedType instanceof Enum ? "int32" : field . type ] ;
259
+ if ( packable !== undefined ) {
260
+ if ( field . packed && syntax == 2 ) {
261
+ sb . push ( "packed=true" ) ;
262
+ } else if ( ! field . packed && syntax == 3 ) {
263
+ sb . push ( "packed=false" ) ;
264
+ }
265
+ }
256
266
return sb . length
257
267
? "[" + sb . join ( ", " ) + "]"
258
268
: null ;
@@ -282,6 +292,10 @@ function consolidateExtends(nested) {
282
292
}
283
293
284
294
function buildOneOf ( oneof ) {
295
+ if ( oneof . isProto3Optional ) {
296
+ return ;
297
+ }
298
+
285
299
push ( "" ) ;
286
300
push ( "oneof " + underScore ( oneof . name ) + " {" ) ;
287
301
++ indent ; first = true ;
@@ -311,11 +325,12 @@ function buildMethod(method) {
311
325
push ( method . type + " " + method . name + " (" + ( method . requestStream ? "stream " : "" ) + method . requestType + ") returns (" + ( method . responseStream ? "stream " : "" ) + method . responseType + ");" ) ;
312
326
}
313
327
314
- function buildOptions ( object ) {
328
+ function buildOptions ( object , ignore = [ ] ) {
315
329
if ( ! object . options )
316
330
return ;
317
331
first = true ;
318
332
Object . keys ( object . options ) . forEach ( function ( key ) {
333
+ if ( ignore . includes ( key ) || key . startsWith ( "features." ) ) return ;
319
334
if ( first ) {
320
335
first = false ;
321
336
push ( "" ) ;
0 commit comments