@@ -102,7 +102,7 @@ function buildRoot(root) {
102102 if ( pkg . length )
103103 out . push ( "" , "package " + pkg . join ( "." ) + ";" ) ;
104104
105- buildOptions ( ptr ) ;
105+ buildOptions ( ptr , [ "edition" , "syntax" ] ) ;
106106 ptr . nestedArray . forEach ( build ) ;
107107}
108108
@@ -184,8 +184,12 @@ function buildType(type) {
184184}
185185
186186function buildField ( field , passExtend ) {
187- if ( field . partOf || field . declaringField || field . extend !== undefined && ! passExtend )
187+ if ( field . partOf && ! field . partOf . isProto3Optional ) {
188188 return ;
189+ }
190+ if ( field . declaringField || field . extend !== undefined && ! passExtend ) {
191+ return ;
192+ }
189193 if ( first ) {
190194 first = false ;
191195 push ( "" ) ;
@@ -199,8 +203,10 @@ function buildField(field, passExtend) {
199203 sb . push ( "map<" + field . keyType + ", " + field . type + ">" ) ;
200204 else if ( field . repeated )
201205 sb . push ( "repeated" , field . type ) ;
202- else if ( syntax === 2 || field . parent . group )
206+ else if ( syntax === 2 )
203207 sb . push ( field . required ? "required" : "optional" , field . type ) ;
208+ else if ( syntax === 3 && field . hasPresence )
209+ sb . push ( "optional" , field . type ) ;
204210 else
205211 sb . push ( field . type ) ;
206212 sb . push ( underScore ( field . name ) , "=" , field . id ) ;
@@ -211,7 +217,7 @@ function buildField(field, passExtend) {
211217}
212218
213219function buildGroup ( field ) {
214- push ( field . rule + " group " + field . resolvedType . name + " = " + field . id + " {" ) ;
220+ push ( ( field . rule || "optional" ) + " group " + field . resolvedType . name + " = " + field . id + " {" ) ;
215221 ++ indent ;
216222 buildOptions ( field . resolvedType ) ;
217223 first = true ;
@@ -223,20 +229,16 @@ function buildGroup(field) {
223229}
224230
225231function 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+ }
229236 var sb = [ ] ;
230237 keys . forEach ( function ( key ) {
238+ if ( key === "proto3_optional" || key === "packed" || key . startsWith ( "features." ) ) return ;
239+
231240 var val = field . options [ key ] ;
232- var wireType = types . packed [ field . resolvedType instanceof Enum ? "int32" : field . type ] ;
233241 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 ;
240242 case "default" :
241243 if ( syntax === 3 )
242244 return ;
@@ -253,6 +255,14 @@ function buildFieldOptions(field) {
253255 }
254256 sb . push ( key + "=" + val ) ;
255257 } ) ;
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+ }
256266 return sb . length
257267 ? "[" + sb . join ( ", " ) + "]"
258268 : null ;
@@ -282,6 +292,10 @@ function consolidateExtends(nested) {
282292}
283293
284294function buildOneOf ( oneof ) {
295+ if ( oneof . isProto3Optional ) {
296+ return ;
297+ }
298+
285299 push ( "" ) ;
286300 push ( "oneof " + underScore ( oneof . name ) + " {" ) ;
287301 ++ indent ; first = true ;
@@ -311,11 +325,12 @@ function buildMethod(method) {
311325 push ( method . type + " " + method . name + " (" + ( method . requestStream ? "stream " : "" ) + method . requestType + ") returns (" + ( method . responseStream ? "stream " : "" ) + method . responseType + ");" ) ;
312326}
313327
314- function buildOptions ( object ) {
328+ function buildOptions ( object , ignore = [ ] ) {
315329 if ( ! object . options )
316330 return ;
317331 first = true ;
318332 Object . keys ( object . options ) . forEach ( function ( key ) {
333+ if ( ignore . includes ( key ) || key . startsWith ( "features." ) ) return ;
319334 if ( first ) {
320335 first = false ;
321336 push ( "" ) ;
0 commit comments