Ejemplo n.º 1
0
            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
                                 ));
                }
            }
Ejemplo n.º 2
0
            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
                        );
                }
            }
Ejemplo n.º 3
0
        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();
            }
        }