@@ -181,13 +181,19 @@ type generator struct {
181181 serviceConfig * serviceConfig
182182
183183 grpcConf * conf.ServiceConfig
184+
185+ // Auxiliary types to be generated in the package
186+ aux * auxTypes
184187}
185188
186189func (g * generator ) init (files []* descriptor.FileDescriptorProto ) {
187190 g .descInfo = pbinfo .Of (files )
188191
189192 g .comments = map [proto.Message ]string {}
190193 g .imports = map [pbinfo.ImportSpec ]bool {}
194+ g .aux = & auxTypes {
195+ iters : map [string ]* iterType {},
196+ }
191197
192198 for _ , f := range files {
193199 for _ , loc := range f .GetSourceCodeInfo ().GetLocation () {
@@ -299,27 +305,36 @@ func (g *generator) gen(serv *descriptor.ServiceDescriptorProto, pkgName string)
299305 return err
300306 }
301307
302- aux := auxTypes {
303- iters : map [ string ] iterType {},
304- }
308+ // clear LRO types between services
309+ g . aux . lros = [] * descriptor. MethodDescriptorProto {}
310+
305311 for _ , m := range serv .Method {
306312 g .methodDoc (m )
307- if err := g .genMethod (servName , serv , m , & aux ); err != nil {
313+ if err := g .genMethod (servName , serv , m ); err != nil {
308314 return errors .E (err , "method: %s" , m .GetName ())
309315 }
310316 }
311317
312- sort .Slice (aux .lros , func (i , j int ) bool {
313- return aux .lros [i ].GetName () < aux .lros [j ].GetName ()
318+ sort .Slice (g . aux .lros , func (i , j int ) bool {
319+ return g . aux .lros [i ].GetName () < g . aux .lros [j ].GetName ()
314320 })
315- for _ , m := range aux .lros {
321+ for _ , m := range g . aux .lros {
316322 if err := g .lroType (servName , serv , m ); err != nil {
317323 return err
318324 }
319325 }
320326
321- var iters []iterType
322- for _ , iter := range aux .iters {
327+ var iters []* iterType
328+ for _ , iter := range g .aux .iters {
329+ // skip iterators that have already been generated in this package
330+ //
331+ // TODO(ndietz): investigate generating auxiliary types in a
332+ // separate file in the same package to avoid keeping this state
333+ if iter .generated {
334+ continue
335+ }
336+
337+ iter .generated = true
323338 iters = append (iters , iter )
324339 }
325340 sort .Slice (iters , func (i , j int ) bool {
@@ -340,14 +355,14 @@ type auxTypes struct {
340355 // "List" of iterator types. We use these to generate FooIterator returned by paging methods.
341356 // Since multiple methods can page over the same type, we dedupe by the name of the iterator,
342357 // which is in turn determined by the element type name.
343- iters map [string ]iterType
358+ iters map [string ]* iterType
344359}
345360
346361// genMethod generates a single method from a client. m must be a method declared in serv.
347362// If the generated method requires an auxillary type, it is added to aux.
348- func (g * generator ) genMethod (servName string , serv * descriptor.ServiceDescriptorProto , m * descriptor.MethodDescriptorProto , aux * auxTypes ) error {
363+ func (g * generator ) genMethod (servName string , serv * descriptor.ServiceDescriptorProto , m * descriptor.MethodDescriptorProto ) error {
349364 if m .GetOutputType () == lroType {
350- aux .lros = append (aux .lros , m )
365+ g . aux .lros = append (g . aux .lros , m )
351366 return g .lroCall (servName , m )
352367 }
353368
@@ -362,7 +377,7 @@ func (g *generator) genMethod(servName string, serv *descriptor.ServiceDescripto
362377 if err != nil {
363378 return err
364379 }
365- aux . iters [ iter . iterTypeName ] = iter
380+
366381 return g .pagingCall (servName , m , pf , iter )
367382 }
368383
0 commit comments