Remaining will call the next function for each type that has not been generated but should be.
(next func(object types.Object) error)
| 29 | // Remaining will call the next function for each type that has not been generated |
| 30 | // but should be. |
| 31 | func (r *referencedTypes) Remaining(next func(object types.Object) error) error { |
| 32 | // Keep looping over the referenced types until we don't generate anything new |
| 33 | // TODO: This could be optimized with a queue vs a full loop every time. |
| 34 | tried := make(map[string]map[string]struct{}) |
| 35 | for { |
| 36 | generatedSomething := false |
| 37 | for pkg, types := range r.ReferencedTypes { |
| 38 | if _, ok := tried[pkg]; !ok { |
| 39 | tried[pkg] = make(map[string]struct{}) |
| 40 | } |
| 41 | |
| 42 | for ty, generated := range types { |
| 43 | if !generated.Generated { |
| 44 | if _, ok := tried[pkg][ty]; ok { |
| 45 | return fmt.Errorf("circular generation detected for %s.%s, infinite loop will not end", pkg, ty) |
| 46 | } |
| 47 | tried[pkg][ty] = struct{}{} |
| 48 | err := next(generated.Object) |
| 49 | if err != nil { |
| 50 | return err |
| 51 | } |
| 52 | generatedSomething = true |
| 53 | } |
| 54 | } |
| 55 | } |
| 56 | if !generatedSomething { |
| 57 | break |
| 58 | } |
| 59 | } |
| 60 | return nil |
| 61 | } |
| 62 | |
| 63 | func (r *referencedTypes) MarkReferenced(ty types.Object) { |
| 64 | if r.state(ty) == nil { |
no outgoing calls
no test coverage detected