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); }
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)); }