public override void VisitReturnStatement(ReturnStatement returnStatement) { base.VisitReturnStatement(returnStatement); if (ctx.GetExpectedType(returnStatement.Expression).Kind == TypeKind.Void) { var actions = new List <CodeAction>(); actions.Add(new CodeAction(ctx.TranslateString("Remove returned expression"), script => { script.Replace(returnStatement, new ReturnStatement()); }, returnStatement)); var method = returnStatement.GetParent <MethodDeclaration>(); if (method != null) { var rr = ctx.Resolve(returnStatement.Expression); if (rr != null && !rr.IsError) { actions.Add(new CodeAction(ctx.TranslateString("Change return type of method."), script => { script.Replace(method.ReturnType, ctx.CreateTypeSystemAstBuilder(method).ConvertType(rr.Type)); }, returnStatement)); } } AddIssue(new CodeIssue( returnStatement, ctx.TranslateString("Return type is 'void'"), actions )); } }
public override void VisitReturnStatement(ReturnStatement returnStatement) { base.VisitReturnStatement(returnStatement); if (skip) { return; } if (returnStatement.Expression.IsNull) { var entity = returnStatement.GetParent <EntityDeclaration>(); if (entity is Accessor) { entity = entity.GetParent <EntityDeclaration>(); } if (entity == null) { return; } AstNode entityNode; var rr = GetRequestedReturnType(ctx, returnStatement, out entityNode); var actions = new List <CodeAction>(); if (rr != null) { actions.Add(new CodeAction(ctx.TranslateString("Return default value"), script => { Expression p; if (rr.IsKnownType(KnownTypeCode.Boolean)) { p = new PrimitiveExpression(false); } else if (rr.IsKnownType(KnownTypeCode.String)) { p = new PrimitiveExpression(""); } else if (rr.IsKnownType(KnownTypeCode.Char)) { p = new PrimitiveExpression(' '); } else if (rr.IsReferenceType == true) { p = new NullReferenceExpression(); } else if (rr.GetDefinition() != null && rr.GetDefinition().KnownTypeCode < KnownTypeCode.DateTime) { p = new PrimitiveExpression(0x0); } else { p = new DefaultValueExpression(ctx.CreateTypeSystemAstBuilder(returnStatement).ConvertType(rr)); } script.Replace(returnStatement, new ReturnStatement(p)); }, returnStatement)); } var method = returnStatement.GetParent <MethodDeclaration>(); if (method != null) { actions.Add(new CodeAction(ctx.TranslateString("Change method return type to 'void'"), script => { script.Replace(method.ReturnType, new PrimitiveType("void")); }, returnStatement)); } AddIssue( returnStatement, string.Format(ctx.TranslateString("`{0}': A return keyword must be followed by any expression when method returns a value"), currentMethodName), actions ); } }
protected void VisitReturnStatement() { ReturnStatement returnStatement = this.ReturnStatement; if (this.Emitter.IsAsync) { var finallyNode = this.GetParentFinallyBlock(returnStatement, false); if (this.Emitter.AsyncBlock != null && this.Emitter.AsyncBlock.IsTaskReturn) { this.WriteAwaiters(returnStatement.Expression); if (finallyNode != null) { this.Write("$returnValue = "); } else { this.Write("$returnTask.setResult("); } if (!returnStatement.Expression.IsNull) { var oldValue = this.Emitter.ReplaceAwaiterByVar; this.Emitter.ReplaceAwaiterByVar = true; returnStatement.Expression.AcceptVisitor(this.Emitter); this.Emitter.ReplaceAwaiterByVar = oldValue; } else { this.Write("null"); } if (finallyNode != null) { this.Write(";"); } else { this.Write(");"); } this.WriteNewLine(); } if (finallyNode != null) { var hashcode = finallyNode.GetHashCode(); this.Emitter.AsyncBlock.JumpLabels.Add(new AsyncJumpLabel { Node = finallyNode, Output = this.Emitter.Output }); this.Write("$step = ${" + hashcode + "};"); this.WriteNewLine(); this.Write("continue;"); } else { this.WriteReturn(false); this.WriteSemiColon(); this.WriteNewLine(); } } else { this.WriteReturn(false); if (this.Emitter.ReplaceJump && this.Emitter.JumpStatements == null) { this.WriteSpace(); this.Write("{jump: 3"); if (!returnStatement.Expression.IsNull) { this.Write(", v: "); returnStatement.Expression.AcceptVisitor(this.Emitter); } this.Write("}"); } else if (!returnStatement.Expression.IsNull) { this.WriteSpace(); returnStatement.Expression.AcceptVisitor(this.Emitter); } var methodDeclaration = returnStatement.GetParent(i => i is MethodDeclaration || i is LambdaExpression) as MethodDeclaration; if (methodDeclaration != null) { string refArgsString = VisitorMethodBlock.GetRefArgsString(this.Emitter, methodDeclaration); if (refArgsString != null) { if (!returnStatement.Expression.IsNull) { this.Write(","); } this.WriteSpace(); this.Write(refArgsString); } } this.WriteSemiColon(); this.WriteNewLine(); } }