Ejemplo n.º 1
0
        public System.Collections.Generic.IEnumerable <CodeAction> GetActions(RefactoringContext context)
        {
            var catchClause = context.GetNode <CatchClause>();

            if (catchClause == null)
            {
                yield break;
            }
            if (catchClause.Type.IsNull)
            {
                yield break;
            }
            var exceptionType = context.ResolveType(catchClause.Type);

            if (exceptionType != context.Compilation.FindType(typeof(Exception)))
            {
                yield break;
            }
            var syntaxTree = context.RootNode as SyntaxTree;

            if (syntaxTree == null)
            {
                yield break;
            }
            var exceptionIdentifierRR = context.Resolve(catchClause.VariableNameToken) as LocalResolveResult;

            if (exceptionIdentifierRR != null &&
                IsReferenced(exceptionIdentifierRR.Variable, catchClause.Body, syntaxTree, context))
            {
                yield break;
            }
            yield return(new CodeAction(context.TranslateString("Remove type specifier"), script =>
            {
                script.Replace(catchClause, new CatchClause()
                {
                    Body = catchClause.Body.Clone() as BlockStatement
                });
            }));
        }
        protected override CodeAction GetAction(RefactoringContext context, ParameterDeclaration parameter)
        {
            if (!parameter.NameToken.Contains(context.Location))
            {
                return(null);
            }
            BlockStatement bodyStatement;

            if (parameter.Parent is LambdaExpression)
            {
                bodyStatement = parameter.Parent.GetChildByRole(LambdaExpression.BodyRole) as BlockStatement;
            }
            else
            {
                bodyStatement = parameter.Parent.GetChildByRole(Roles.Body);
            }
            if (bodyStatement == null || bodyStatement.IsNull)
            {
                return(null);
            }
            var type = context.ResolveType(parameter.Type);

            if (type.IsReferenceType == false || HasNullCheck(parameter))
            {
                return(null);
            }

            return(new CodeAction(context.TranslateString("Add null check for parameter"), script => {
                var statement = new IfElseStatement()
                {
                    Condition = new BinaryOperatorExpression(new IdentifierExpression(parameter.Name), BinaryOperatorType.Equality, new NullReferenceExpression()),
                    TrueStatement = new ThrowStatement(new ObjectCreateExpression(context.CreateShortType("System", "ArgumentNullException"), new PrimitiveExpression(parameter.Name)))
                };
                script.AddTo(bodyStatement, statement);
            }, parameter.NameToken));
        }
Ejemplo n.º 3
0
        protected override CodeAction GetAction(RefactoringContext context, VariableInitializer node)
        {
            if (node.Initializer.IsNull)
            {
                return(null);
            }

            var variableDecl = node.Parent as VariableDeclarationStatement;

            if (variableDecl == null || !(variableDecl.Parent is BlockStatement))
            {
                return(null);
            }

            var type = context.ResolveType(variableDecl.Type);

            if (!IsIDisposable(type))
            {
                return(null);
            }

            var unit = context.RootNode as SyntaxTree;

            if (unit == null)
            {
                return(null);
            }

            var resolveResult = (LocalResolveResult)context.Resolve(node);

            return(new CodeAction(context.TranslateString("put inside 'using'"),
                                  script =>
            {
                var lastReference = GetLastReference(resolveResult.Variable, context, unit);

                var body = new BlockStatement();
                var variableToMoveOutside = new List <VariableDeclarationStatement> ();

                if (lastReference != node)
                {
                    var statements = CollectStatements(variableDecl.GetNextSibling(n => n is Statement) as Statement,
                                                       lastReference.EndLocation).ToArray();

                    // collect statements to put inside 'using' and variable declaration to move outside 'using'
                    foreach (var statement in statements)
                    {
                        script.Remove(statement);

                        var decl = statement as VariableDeclarationStatement;
                        if (decl == null)
                        {
                            body.Statements.Add(statement.Clone());
                            continue;
                        }

                        var outsideDecl = (VariableDeclarationStatement)decl.Clone();
                        outsideDecl.Variables.Clear();
                        var insideDecl = (VariableDeclarationStatement)outsideDecl.Clone();

                        foreach (var variable in decl.Variables)
                        {
                            var reference = GetLastReference(
                                ((LocalResolveResult)context.Resolve(variable)).Variable, context, unit);
                            if (reference.StartLocation > lastReference.EndLocation)
                            {
                                outsideDecl.Variables.Add((VariableInitializer)variable.Clone());
                            }
                            else
                            {
                                insideDecl.Variables.Add((VariableInitializer)variable.Clone());
                            }
                        }
                        if (outsideDecl.Variables.Count > 0)
                        {
                            variableToMoveOutside.Add(outsideDecl);
                        }
                        if (insideDecl.Variables.Count > 0)
                        {
                            body.Statements.Add(insideDecl);
                        }
                    }
                }

                foreach (var decl in variableToMoveOutside)
                {
                    script.InsertBefore(variableDecl, decl);
                }

                if (body.Statements.Count > 0)
                {
                    var lastStatement = body.Statements.Last();
                    if (IsDisposeInvocation(resolveResult.Variable.Name, lastStatement))
                    {
                        lastStatement.Remove();
                    }
                }
                var usingStatement = new UsingStatement
                {
                    ResourceAcquisition = new VariableDeclarationStatement(variableDecl.Type.Clone(), node.Name,
                                                                           node.Initializer.Clone()),
                    EmbeddedStatement = body
                };
                script.Replace(variableDecl, usingStatement);

                if (variableDecl.Variables.Count == 1)
                {
                    return;
                }
                // other variables in the same declaration statement
                var remainingVariables = (VariableDeclarationStatement)variableDecl.Clone();
                remainingVariables.Variables.Remove(
                    remainingVariables.Variables.FirstOrDefault(v => v.Name == node.Name));
                script.InsertBefore(usingStatement, remainingVariables);
            }, node.NameToken));
        }
        static Expression GetDefaultValueExpression(RefactoringContext context, AstType astType)
        {
            var type = context.ResolveType(astType);

            // array
            if (type.Kind == TypeKind.Array)
            {
                return(new ObjectCreateExpression(astType.Clone()));
            }

            // enum
            if (type.Kind == TypeKind.Enum)
            {
                var members = type.GetMembers().ToArray();
                if (members.Length == 0)
                {
                    return(new DefaultValueExpression(astType.Clone()));
                }
                return(astType.Member(members[0].Name, null).Clone());
            }

            if ((type.IsReferenceType ?? false) || type.Kind == TypeKind.Dynamic)
            {
                return(new NullReferenceExpression());
            }

            var typeDefinition = type.GetDefinition();

            if (typeDefinition != null)
            {
                switch (typeDefinition.KnownTypeCode)
                {
                case KnownTypeCode.Boolean:
                    return(new PrimitiveExpression(false));

                case KnownTypeCode.Char:
                    return(new PrimitiveExpression('\0'));

                case KnownTypeCode.SByte:
                case KnownTypeCode.Byte:
                case KnownTypeCode.Int16:
                case KnownTypeCode.UInt16:
                case KnownTypeCode.Int32:
                case KnownTypeCode.UInt32:
                case KnownTypeCode.Int64:
                case KnownTypeCode.UInt64:
                case KnownTypeCode.Single:
                case KnownTypeCode.Double:
                case KnownTypeCode.Decimal:
                    return(new PrimitiveExpression(0));

                case KnownTypeCode.NullableOfT:
                    return(new NullReferenceExpression());
                }
                if (type.Kind == TypeKind.Struct)
                {
                    return(new ObjectCreateExpression(astType.Clone()));
                }
            }
            return(new DefaultValueExpression(astType.Clone()));
        }