Inheritance: AbstractRoutineSignature
Exemple #1
0
 public override void VisitAbstractIter(AbstractIterSignature iter)
 {
     nestedTypes.Add(iter.TypeBuilder);
 }
Exemple #2
0
        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++;
        }
Exemple #3
0
 public virtual void VisitAbstractIter(AbstractIterSignature iter)
 {
 }