iter.go raw

   1  // Copyright 2024 The Go Authors. All rights reserved.
   2  // Use of this source code is governed by a BSD-style
   3  // license that can be found in the LICENSE file.
   4  
   5  package types
   6  
   7  import "iter"
   8  
   9  // This file defines go1.23 iterator methods for a variety of data
  10  // types. They are not mirrored to cmd/compile/internal/types2, as
  11  // there is no point doing so until the bootstrap compiler it at least
  12  // go1.23; therefore go1.23-style range statements should not be used
  13  // in code common to types and types2, though clients of go/types are
  14  // free to use them.
  15  
  16  // Methods returns a go1.23 iterator over all the methods of an
  17  // interface, ordered by Id.
  18  //
  19  // Example: for m := range t.Methods() { ... }
  20  func (t *Interface) Methods() iter.Seq[*Func] {
  21  	return func(yield func(m *Func) bool) {
  22  		for i := range t.NumMethods() {
  23  			if !yield(t.Method(i)) {
  24  				break
  25  			}
  26  		}
  27  	}
  28  }
  29  
  30  // ExplicitMethods returns a go1.23 iterator over the explicit methods of
  31  // an interface, ordered by Id.
  32  //
  33  // Example: for m := range t.ExplicitMethods() { ... }
  34  func (t *Interface) ExplicitMethods() iter.Seq[*Func] {
  35  	return func(yield func(m *Func) bool) {
  36  		for i := range t.NumExplicitMethods() {
  37  			if !yield(t.ExplicitMethod(i)) {
  38  				break
  39  			}
  40  		}
  41  	}
  42  }
  43  
  44  // EmbeddedTypes returns a go1.23 iterator over the types embedded within an interface.
  45  //
  46  // Example: for e := range t.EmbeddedTypes() { ... }
  47  func (t *Interface) EmbeddedTypes() iter.Seq[Type] {
  48  	return func(yield func(e Type) bool) {
  49  		for i := range t.NumEmbeddeds() {
  50  			if !yield(t.EmbeddedType(i)) {
  51  				break
  52  			}
  53  		}
  54  	}
  55  }
  56  
  57  // Methods returns a go1.23 iterator over the declared methods of a named type.
  58  //
  59  // Example: for m := range t.Methods() { ... }
  60  func (t *Named) Methods() iter.Seq[*Func] {
  61  	return func(yield func(m *Func) bool) {
  62  		for i := range t.NumMethods() {
  63  			if !yield(t.Method(i)) {
  64  				break
  65  			}
  66  		}
  67  	}
  68  }
  69  
  70  // Children returns a go1.23 iterator over the child scopes nested within scope s.
  71  //
  72  // Example: for child := range scope.Children() { ... }
  73  func (s *Scope) Children() iter.Seq[*Scope] {
  74  	return func(yield func(child *Scope) bool) {
  75  		for i := range s.NumChildren() {
  76  			if !yield(s.Child(i)) {
  77  				break
  78  			}
  79  		}
  80  	}
  81  }
  82  
  83  // Fields returns a go1.23 iterator over the fields of a struct type.
  84  //
  85  // Example: for field := range s.Fields() { ... }
  86  func (s *Struct) Fields() iter.Seq[*Var] {
  87  	return func(yield func(field *Var) bool) {
  88  		for i := range s.NumFields() {
  89  			if !yield(s.Field(i)) {
  90  				break
  91  			}
  92  		}
  93  	}
  94  }
  95  
  96  // Variables returns a go1.23 iterator over the variables of a tuple type.
  97  //
  98  // Example: for v := range tuple.Variables() { ... }
  99  func (t *Tuple) Variables() iter.Seq[*Var] {
 100  	return func(yield func(v *Var) bool) {
 101  		for i := range t.Len() {
 102  			if !yield(t.At(i)) {
 103  				break
 104  			}
 105  		}
 106  	}
 107  }
 108  
 109  // Methods returns a go1.23 iterator over the methods of a method set.
 110  //
 111  // Example: for method := range s.Methods() { ... }
 112  func (s *MethodSet) Methods() iter.Seq[*Selection] {
 113  	return func(yield func(method *Selection) bool) {
 114  		for i := range s.Len() {
 115  			if !yield(s.At(i)) {
 116  				break
 117  			}
 118  		}
 119  	}
 120  }
 121  
 122  // Terms returns a go1.23 iterator over the terms of a union.
 123  //
 124  // Example: for term := range union.Terms() { ... }
 125  func (u *Union) Terms() iter.Seq[*Term] {
 126  	return func(yield func(term *Term) bool) {
 127  		for i := range u.Len() {
 128  			if !yield(u.Term(i)) {
 129  				break
 130  			}
 131  		}
 132  	}
 133  }
 134  
 135  // TypeParams returns a go1.23 iterator over a list of type parameters.
 136  //
 137  // Example: for tparam := range l.TypeParams() { ... }
 138  func (l *TypeParamList) TypeParams() iter.Seq[*TypeParam] {
 139  	return func(yield func(tparam *TypeParam) bool) {
 140  		for i := range l.Len() {
 141  			if !yield(l.At(i)) {
 142  				break
 143  			}
 144  		}
 145  	}
 146  }
 147  
 148  // Types returns a go1.23 iterator over the elements of a list of types.
 149  //
 150  // Example: for t := range l.Types() { ... }
 151  func (l *TypeList) Types() iter.Seq[Type] {
 152  	return func(yield func(t Type) bool) {
 153  		for i := range l.Len() {
 154  			if !yield(l.At(i)) {
 155  				break
 156  			}
 157  		}
 158  	}
 159  }
 160