public override void LeaveReturnStatement(ReturnStatement node) { if (null == node.Expression) return; // forces anonymous types to be correctly // instantiated IType expressionType = GetConcreteExpressionType(node.Expression); if (TypeSystemServices.VoidType == expressionType && node.ContainsAnnotation(OptionalReturnStatementAnnotation)) { node.ParentNode.Replace( node, new ExpressionStatement(node.Expression)); return; } IType returnType = _currentMethod.ReturnType; if (TypeSystemServices.IsUnknown(returnType)) _currentMethod.AddReturnExpression(node.Expression); else AssertTypeCompatibility(node.Expression, returnType, expressionType); //bind to nullable Value if needed if (TypeSystemServices.IsNullable(expressionType) && !TypeSystemServices.IsNullable(returnType)) { // TODO: move to later steps or introduce an implicit conversion operator var mre = new MemberReferenceExpression(node.Expression.LexicalInfo, node.Expression, "Value"); Visit(mre); node.Replace(node.Expression, mre); } }
public override void LeaveReturnStatement(ReturnStatement node) { if (null == node.Expression) return; // forces anonymous types to be correctly // instantiated IType expressionType = GetConcreteExpressionType(node.Expression); if (TypeSystemServices.VoidType == expressionType && node.ContainsAnnotation(OptionalReturnStatementAnnotation)) { node.ParentNode.Replace( node, new ExpressionStatement(node.Expression)); return; } IType returnType = _currentMethod.ReturnType; if (TypeSystemServices.IsUnknown(returnType)) { _currentMethod.AddReturnExpression(node.Expression); } else { AssertTypeCompatibility(node.Expression, returnType, expressionType); } }