Exemple #1
0
        public static ReturnNode Create(CodeBlockNode context, ExpressionNode expression, SequencePoint point)
        {
            var instance = new ReturnNode(point);

            instance.expression = expression;
            var returnType = context.GetMethod().MethodReturnType;

            if (expression != null)
            {
                if (returnType.TypeEquals(context.Parser.Void))
                {
                    ErrorCode.TypeMismatch.ReportAndThrow(instance.SequencePoint, "Cannot return a value in a void method");
                }

                if (!expression.ExpressionReturnType.IsAssignableTo(returnType))
                {
                    ErrorCode.TypeMismatch.ReportAndThrow(instance.SequencePoint, "Method returns {0}, cannot return {1}", returnType, expression.ExpressionReturnType);
                }

                if (!expression.IsGettable)
                {
                    ErrorCode.NotAnRValue.ReportAndThrow(point, "Returned expression must be gettable");
                }
            }
            else
            {
                if (!returnType.TypeEquals(context.Parser.Void))
                {
                    ErrorCode.TypeMismatch.ReportAndThrow(instance.SequencePoint, "Method returns {0}, must return a value", returnType);
                }
            }

            return(instance);
        }
Exemple #2
0
        public static ReturnNode Parse(CodeBlockNode context, IAbstractSyntaxTree lexerNode)
        {
            Contract.Requires(lexerNode.Type == Lexer.TokenType.ReturnNode);
            var            point      = context.Parser.GetSequencePoint(lexerNode);
            var            returnType = context.GetMethod().MethodReturnType;
            ExpressionNode expression = null;

            if (lexerNode.Children.Count == 2)
            {
                expression = ExpressionNode.Parse(context, lexerNode.Children[1], returnType);
            }
            return(Create(context, expression, point));
        }