public override void VisitAbstractIter(AbstractIterSignature iter)
{
string baseName = iter.Name.Substring(0, iter.Name.Length - 1);
string creatorName = "__itercreate" + iterCount + "_" + baseName;
iter.Arguments.Accept(this);
iter.MoveNextArguments.Accept(this);
iter.ReturnType.Accept(this);
TypeBuilder typeBuilder = currentClass.TypeBuilder;
try {
CheckMethodConfliction(currentClass.TypeData, iter.Name,
iter.ReturnType.NodeType,
iter.Arguments);
}
catch (MethodConflictionException e) {
report.Error(iter.Location, e.Message);
return;
}
iter.TypeBuilder =
typeBuilder.DefineNestedType("__itertype" + iterCount +
"_" + baseName,
TypeAttributes.Interface |
TypeAttributes.Abstract |
TypeAttributes.NestedPublic);
iter.MoveNext =
DefineMethod(iter.TypeBuilder, "MoveNext",
MethodAttributes.Public |
MethodAttributes.Virtual |
MethodAttributes.Abstract |
MethodAttributes.HideBySig,
typeManager.BoolType,
iter.MoveNextArguments);
if (!iter.ReturnType.IsNull) {
iter.GetCurrent =
DefineMethod(iter.TypeBuilder, "GetCurrent",
MethodAttributes.Public |
MethodAttributes.Virtual |
MethodAttributes.Abstract |
MethodAttributes.HideBySig,
iter.ReturnType.NodeType,
new TypedNodeList());
}
iter.Creator =
DefineMethod(typeBuilder, creatorName,
MethodAttributes.Public |
MethodAttributes.Virtual |
MethodAttributes.Abstract |
MethodAttributes.HideBySig,
typeManager.GetTypeData(iter.TypeBuilder),
GetIterCreatorArguments(iter.Arguments));
typeManager.AddIterCreator(iter.Creator);
iter.MethodBuilder =
DefineMethod(typeBuilder, "__iter_" + baseName,
MethodAttributes.Public |
MethodAttributes.Virtual |
MethodAttributes.Abstract |
MethodAttributes.HideBySig,
iter.ReturnType.NodeType,
iter.Arguments);
typeManager.AddBabelName(iter.MethodBuilder, iter.Name);
typeManager.AddIterCreatorName(iter.MethodBuilder, creatorName);
iterCount++;
}