MCPcopy Create free account
hub / github.com/coder/guts / Remaining

Method Remaining

references.go:31–61  ·  view source on GitHub ↗

Remaining will call the next function for each type that has not been generated but should be.

(next func(object types.Object) error)

Source from the content-addressed store, hash-verified

29// Remaining will call the next function for each type that has not been generated
30// but should be.
31func (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
63func (r *referencedTypes) MarkReferenced(ty types.Object) {
64 if r.state(ty) == nil {

Callers 1

Calls

no outgoing calls

Tested by

no test coverage detected