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