Exemple #1
0
 public void CountArgumentsInMemberInfo()
 {
     Assert.Equal(0, NRefactoryExtensions.GetArgumentCount("Method: void Console.WriteLine()"));
     Assert.Equal(1, NRefactoryExtensions.GetArgumentCount("Method: void Console.WriteLine(bool value)"));
     Assert.Equal(2, NRefactoryExtensions.GetArgumentCount("Method: void Console.WriteLine(bool value, object arg0)"));
     Assert.Equal(2, NRefactoryExtensions.GetArgumentCount("Method: void Class.Method(string text, Dictionary<int, string> map)"));
     Assert.Equal(3, NRefactoryExtensions.GetArgumentCount("Method: void Class.Method(string text, Dictionary<int, string> map, int count)"));
 }
        public override object VisitConstructorDeclaration(ConstructorDeclaration constructorDeclaration, object data)
        {
            ExpressionStatement stmt = constructorDeclaration.Body.Statements.FirstOrDefault() as ExpressionStatement;

            if (stmt == null)
            {
                return(null);
            }
            InvocationExpression invocation = stmt.Expression as InvocationExpression;

            if (invocation == null)
            {
                return(null);
            }
            MemberReferenceExpression mre = invocation.Target as MemberReferenceExpression;

            if (mre != null && mre.MemberName == ".ctor")
            {
                ConstructorInitializer ci = new ConstructorInitializer();
                if (mre.Target is ThisReferenceExpression)
                {
                    ci.ConstructorInitializerType = ConstructorInitializerType.This;
                }
                else if (mre.Target is BaseReferenceExpression)
                {
                    ci.ConstructorInitializerType = ConstructorInitializerType.Base;
                }
                else
                {
                    return(null);
                }
                // Move arguments from invocation to initializer:
                invocation.Arguments.MoveTo(ci.Arguments);
                var ilRanges = stmt.GetAllRecursiveILRanges();
                // Add the initializer: (unless it is the default 'base()')
                if (!(ci.ConstructorInitializerType == ConstructorInitializerType.Base && ci.Arguments.Count == 0))
                {
                    constructorDeclaration.Initializer = ci.WithAnnotation(invocation.Annotation <IMethod>());
                    ci.AddAnnotation(ilRanges);
                }
                else
                {
                    constructorDeclaration.Body.HiddenStart = NRefactoryExtensions.CreateHidden(ilRanges, constructorDeclaration.Body.HiddenStart);
                }
                // Remove the statement:
                stmt.Remove();
            }
            return(null);
        }