Пример #1
0
 protected override Void handleYield(YieldStatementNode yield, Set <TypeInfo> dependencies)
 {
     if (yield.Value != null)
     {
         expressionHandler.handleExpression(yield.Value, dependencies, true);
     }
     return(null);
 }
 protected override Boolean handleYield(YieldStatementNode yield, HashSet <StatementNode> visited)
 {
     if (yield.Value != null)
     {
         expressionChecker.handleExpression(yield.Value, null, true);
         return(Boolean.TRUE);
     }
     return(Boolean.FALSE);
 }
        protected override Void handleYield(YieldStatementNode yieldStatement, Void source)
        {
            var returnType = context.CodeValidationContext.CurrentMethod.ReturnType;
            var value      = yieldStatement.Value;

            if (returnType == null)
            {
                if (value != null)
                {
                    this.ExpressionValidator.handleExpression(value, returnType, true);
                }
            }
            else
            {
                var elementType = BytecodeHelper.getIterableOrIteratorElementType(returnType);
                if (elementType == null)
                {
                    throw context.error(CompileErrorId.YieldOutsideIterator, yieldStatement);
                }
                if (value != null)
                {
                    this.ExpressionValidator.handleExpression(value, elementType, true);
                    ValidationHelper.setBoxing(context, elementType, value);
                    if (!ValidationHelper.isAssignable(context, elementType, value))
                    {
                        throw context.error(CompileErrorId.NoImplicitConversion, value,
                                            BytecodeHelper.getDisplayName(ValidationHelper.getType(context, value)),
                                            BytecodeHelper.getDisplayName(elementType));
                    }
                }
            }
            if (context.Iterables[context.CodeValidationContext.CurrentMethod] == null)
            {
                var prefix      = "_" + context.CodeValidationContext.CurrentMethod.Name + "_Iterable";
                int n           = context.CurrentType.NestedTypes.count(p => p.Name.startsWith(prefix));
                var typeBuilder = ((TypeBuilder)context.CurrentType).defineNestedType(prefix + n);
                typeBuilder.setSourceFile(PathHelper.getFileName(yieldStatement.Filename));
                typeBuilder.setSynthetic(true);
                typeBuilder.setSuper(true);
                context.Iterables[context.CodeValidationContext.CurrentMethod] = typeBuilder;
                context.TypeBuilders.add(typeBuilder);
                typeBuilder.setBaseType(context.TypeSystem.ObjectType);
            }
            return(null);
        }