예제 #1
0
 protected override CodeAction GetAction(RefactoringContext context, AsExpression node)
 {
     if (!node.AsToken.Contains(context.Location))
     {
         return(null);
     }
     return(new CodeAction(context.TranslateString("Convert 'as' to cast"), script => {
         var castExpr = new CastExpression(node.Type.Clone(), node.Expression.Clone());
         var parenthesizedExpr = node.Parent as ParenthesizedExpression;
         if (parenthesizedExpr != null && parenthesizedExpr.Parent is Expression)
         {
             // clone parent expression and replace the ParenthesizedExpression with castExpr to remove
             // parentheses, then insert parentheses if necessary
             var parentExpr = (Expression)parenthesizedExpr.Parent.Clone();
             parentExpr.GetNodeContaining(parenthesizedExpr.StartLocation, parenthesizedExpr.EndLocation)
             .ReplaceWith(castExpr);
             parentExpr.AcceptVisitor(insertParentheses);
             script.Replace(parenthesizedExpr.Parent, parentExpr);
         }
         else
         {
             castExpr.AcceptVisitor(insertParentheses);
             script.Replace(node, castExpr);
         }
     }));
 }
        public override object VisitLambdaExpression(LambdaExpression lambdaExpression, object data)
        {
            var invocationExpression = lambdaExpression.Parent as InvocationExpression;

            if (invocationExpression == null)
            {
                return(base.VisitLambdaExpression(lambdaExpression, data));
            }

            var target = invocationExpression.Target as MemberReferenceExpression;

            if (target == null)
            {
                return(base.VisitLambdaExpression(lambdaExpression, data));
            }

            AstNode node = lambdaExpression;
            var     parenthesizedlambdaExpression = new ParenthesizedExpression(lambdaExpression.Clone());

            switch (target.MemberName)
            {
            case "Sum":
            case "Average":
                node = ModifyLambdaForNumerics(lambdaExpression, parenthesizedlambdaExpression);
                break;

            case "Max":
            case "Min":
                node = ModifyLambdaForMinMax(lambdaExpression, parenthesizedlambdaExpression);
                break;

            case "OrderBy":
            case "OrderByDescending":
            case "GroupBy":
            case "Recurse":
            case "Select":
                node = ModifyLambdaForSelect(parenthesizedlambdaExpression, target);
                break;

            case "SelectMany":
                node = ModifyLambdaForSelectMany(lambdaExpression, parenthesizedlambdaExpression, invocationExpression);
                break;

            case "Any":
            case "all":
            case "First":
            case "FirstOrDefault":
            case "Last":
            case "LastOfDefault":
            case "Single":
            case "Where":
            case "Count":
            case "SingleOrDefault":
                node = new CastExpression(new SimpleType("Func<dynamic, bool>"), parenthesizedlambdaExpression.Clone());
                break;
            }
            lambdaExpression.ReplaceWith(node);

            if (node != lambdaExpression)
            {
                return(node.AcceptVisitor(this, null));
            }
            return(base.VisitLambdaExpression(lambdaExpression, null));
        }