+ TypeExpr iterator_type_expr;
+ Field pc_field;
+ Field current_field;
+
+ TypeExpr enumerator_type;
+ TypeExpr enumerable_type;
+ TypeArguments generic_args;
+ TypeExpr generic_enumerator_type;
+ TypeExpr generic_enumerable_type;
+
+ ArrayList hoisted_params_copy;
+ int local_name_idx;
+
+ public IteratorStorey (Iterator iterator)
+ : base (iterator.Container.Toplevel, iterator.Host,
+ iterator.OriginalMethod as MemberBase, iterator.GenericMethod, "Iterator")
+ {
+ this.Iterator = iterator;
+ }
+
+ public Field PC {
+ get { return pc_field; }
+ }
+
+ public Field CurrentField {
+ get { return current_field; }
+ }
+
+ public ArrayList HoistedParameters {
+ get { return hoisted_params; }
+ }
+
+ protected override TypeExpr [] ResolveBaseTypes (out TypeExpr base_class)
+ {
+ iterator_type_expr = new TypeExpression (MutateType (Iterator.OriginalIteratorType), Location);
+ generic_args = new TypeArguments (iterator_type_expr);
+
+ ArrayList list = new ArrayList ();
+ if (Iterator.IsEnumerable) {
+ enumerable_type = new TypeExpression (
+ TypeManager.ienumerable_type, Location);
+ list.Add (enumerable_type);
+
+ if (TypeManager.generic_ienumerable_type != null) {
+ generic_enumerable_type = new GenericTypeExpr (
+ TypeManager.generic_ienumerable_type,
+ generic_args, Location);
+ list.Add (generic_enumerable_type);
+ }