public AddField ( string name, IType type ) : Boo.Lang.Compiler.Ast.Field | ||
name | string | |
type | IType | |
return | Boo.Lang.Compiler.Ast.Field |
void CreateAnonymousGeneratorType() { _enumerable = (BooClassBuilder)_generator["GeneratorClassBuilder"]; // Set up some important types _sourceItemType = TypeSystemServices.ObjectType; _sourceEnumeratorType = TypeSystemServices.IEnumeratorType; _sourceEnumerableType = TypeSystemServices.IEnumerableType; _resultItemType = (IType)_generator["GeneratorItemType"]; _resultEnumeratorType = TypeSystemServices.IEnumeratorGenericType.GenericInfo.ConstructType(_resultItemType); _enumerator = _collector.CreateSkeletonClass("Enumerator",_generator.LexicalInfo); // use a generic enumerator for the source type if possible _sourceItemType = TypeSystemServices.GetGenericEnumerableItemType(_generator.Iterator.ExpressionType); if (_sourceItemType != null && _sourceItemType != TypeSystemServices.ObjectType) { _sourceEnumerableType = TypeSystemServices.IEnumerableGenericType.GenericInfo.ConstructType(_sourceItemType); _sourceEnumeratorType = TypeSystemServices.IEnumeratorGenericType.GenericInfo.ConstructType(_sourceItemType); } else { _sourceItemType = TypeSystemServices.ObjectType; } // Add base types _enumerator.AddBaseType(_resultEnumeratorType); _enumerator.AddBaseType(TypeSystemServices.Map(typeof(ICloneable))); _enumerator.AddBaseType(TypeSystemServices.Map(typeof(IDisposable))); // Add fields _enumeratorField = _enumerator.AddField("$$enumerator", _sourceEnumeratorType); _current = _enumerator.AddField("$$current", _resultItemType); // Add methods CreateReset(); CreateCurrent(); CreateMoveNext(); CreateClone(); CreateDispose(); EnumeratorConstructorMustCallReset(); _collector.AdjustReferences(); _collector.DeclareFieldsAndConstructor(_enumerable); CreateGetEnumerator(); _enumerable.ClassDefinition.Members.Add(_enumerator.ClassDefinition); }