public ArrayCreationExpression(TypeReference type, InitializerExpression initializer, IEnumerable <Instruction> instructions)
     : base(instructions)
 {
     this.ElementType = type;
     this.Initializer = initializer;
     this.Dimensions  = new ExpressionCollection();
 }
		public ArrayCreationExpression(TypeReference type, InitializerExpression initializer, IEnumerable<Instruction> instructions)
            :base(instructions)
		{
            this.ElementType = type;
            this.Initializer = initializer;
            this.Dimensions = new ExpressionCollection();
        }
		public AnonymousObjectCreationExpression(MethodReference constructor, TypeReference type, InitializerExpression initializer, IEnumerable<Instruction> instructions)
            :base(instructions)
		{
            this.Constructor = constructor;
            this.Type = type;
            this.Initializer = initializer;
		}
		public override Expression CloneExpressionOnly()
		{
			InitializerExpression result = new InitializerExpression(
				Expression.Clone() as BlockExpression, this.InitializerType, null);
			result.IsMultiLine = this.IsMultiLine;
			return result;
		}
		public override Expression Clone()
		{
			InitializerExpression result = new InitializerExpression(
				Expression.Clone() as BlockExpression, this.InitializerType, this.instructions);
			result.IsMultiLine = this.IsMultiLine;
			return result;
		}
		public ICodeNode VisitObjectCreationExpression(ObjectCreationExpression node)
		{
            if(node.Type == null || node.Constructor == null || !node.Type.IsGenericInstance)
            {
                return null;
            }

            TypeDefinition typeDef = node.Type.Resolve();
            if (!typeDef.IsAnonymous())
            {
                return null;
            }

            initializerExpressions = new BlockExpression(null);
            ProcessAnonymousType(typeDef, node.Type as GenericInstanceType, node.Constructor.Resolve(), node.Arguments);

            node.Initializer = new InitializerExpression(initializerExpressions, InitializerType.ObjectInitializer);

            List<Instruction> instructions = new List<Instruction>(node.MappedInstructions);
            foreach (Expression argument in node.Arguments)
            {
                instructions.AddRange(argument.UnderlyingSameMethodInstructions);
            }
			InitializerExpression initializer = new InitializerExpression(initializerExpressions, InitializerType.AnonymousInitializer);
			return new AnonymousObjectCreationExpression(node.Constructor, typeDef, initializer, instructions);
		}
        public override Expression CloneExpressionOnly()
        {
            InitializerExpression initializerClone = Initializer != null?Initializer.CloneExpressionOnly() as InitializerExpression : null;

            AnonymousObjectCreationExpression result = new AnonymousObjectCreationExpression(Constructor, Type, initializerClone, null);

            return(result);
        }
        public override Expression CloneExpressionOnly()
        {
            InitializerExpression result = new InitializerExpression(
                Expression.Clone() as BlockExpression, this.InitializerType, null);

            result.IsMultiLine = this.IsMultiLine;
            return(result);
        }
Ejemplo n.º 9
0
 public ArrayCreationExpression(TypeReference type, InitializerExpression initializer, IEnumerable <Instruction> instructions)
 {
     base(instructions);
     this.set_ElementType(type);
     this.set_Initializer(initializer);
     this.set_Dimensions(new ExpressionCollection());
     return;
 }
		public ObjectCreationExpression(MethodReference constructor, TypeReference type, InitializerExpression initializer, IEnumerable<Instruction> instructions)
            :base(instructions)
		{
            this.Constructor = constructor;
            this.Type = type;
            this.Initializer = initializer;
			this.Arguments = new ExpressionCollection();
		}
        public override bool Equals(Expression other)
        {
            InitializerExpression initializer = other as InitializerExpression;
            bool result = initializer != null && this.Expression.Equals(initializer.Expression) &&
                          this.InitializerType == initializer.InitializerType;

            //this.IsMultiLine == initializer.IsMultiLine;
            return(result);
        }
        public override Expression Clone()
        {
            InitializerExpression initializerClone = Initializer != null ? (InitializerExpression)Initializer.Clone() : null;

            return(new ArrayCreationExpression(ElementType, initializerClone, instructions)
            {
                Dimensions = Dimensions.Clone()
            });
        }
        public override Expression Clone()
        {
            InitializerExpression initializerClone = Initializer != null?Initializer.Clone() as InitializerExpression : null;

            ObjectCreationExpression result = new ObjectCreationExpression(Constructor, Type, initializerClone, this.instructions);

            result.Arguments = this.Arguments.Clone();
            return(result);
        }
        private Expression GetMethodHandleExpression(MethodReference methodReference, IEnumerable<Instruction> instructions)
        {
            TypeDefinition corlibTypeTypeDefinition = GetSystemTypeTypeDefinition();

            string[] parametersNames = methodReference.HasParameters ? new string[] { "System.String", "System.Type[]" } : new string[] { "System.String" };
            MethodReference getMethodReference = GetSystemTypeMethodReference(corlibTypeTypeDefinition, "GetMethod", parametersNames);

            MethodReference getMethodHandleReference = GetHandlePropertyGetterReference(typeof(System.Reflection.MethodBase), "get_MethodHandle");

            TypeOfExpression typeOfExpression = new TypeOfExpression(methodReference.DeclaringType, null);
            MethodReferenceExpression getMethodMethodReferenceExpression = new MethodReferenceExpression(typeOfExpression, getMethodReference, null);
            MethodInvocationExpression getMethodMethodInvocationExpression = new MethodInvocationExpression(getMethodMethodReferenceExpression, null);
            LiteralExpression argument = new LiteralExpression(methodReference.Name, this.typeSystem, null);
            getMethodMethodInvocationExpression.Arguments.Add(argument);

            if (methodReference.HasParameters)
            {
                BlockExpression blockExpression = new BlockExpression(null);
                foreach (ParameterDefinition parameter in methodReference.Parameters)
                {
                    blockExpression.Expressions.Add(new TypeOfExpression(parameter.ParameterType, null));
                }

				InitializerExpression initializer = new InitializerExpression(blockExpression, InitializerType.ArrayInitializer);
				ArrayCreationExpression getMethodTypeParametersArray = new ArrayCreationExpression(corlibTypeTypeDefinition, initializer, null);
                getMethodTypeParametersArray.Dimensions.Add(new LiteralExpression(blockExpression.Expressions.Count, this.typeSystem, null));

                getMethodMethodInvocationExpression.Arguments.Add(getMethodTypeParametersArray);
            }

            MethodReferenceExpression getMethodHandleMethodReferenceExpression = new MethodReferenceExpression(getMethodMethodInvocationExpression, getMethodHandleReference, null);
            MethodInvocationExpression getMethodHandleMethodInvocationExpression = new MethodInvocationExpression(getMethodHandleMethodReferenceExpression, instructions);
            PropertyReferenceExpression methodHandlePropertyReferenceExpression = new PropertyReferenceExpression(getMethodHandleMethodInvocationExpression, null);

            return methodHandlePropertyReferenceExpression;
        }
			public override void VisitInitializerExpression(InitializerExpression node)
			{
				count--;
				Visit(node.Expression);
			}
		public override void VisitInitializerExpression(InitializerExpression node)
		{
			WriteToken("{");

			if (node.IsMultiLine)
			{
				Indent();
				WriteLine();

				VisitMultilineList(node.Expressions);

				WriteLine();
				Outdent();
			}
			else
			{
				WriteSpace();
				VisitList(node.Expressions);
				WriteSpace(); 
			}

			WriteToken("}");
		}
		protected void StartInitializer(InitializerExpression node)
		{
			if (node.IsMultiLine)
			{
				WriteLine();
			}
			else
			{
				WriteSpace();
			}
		}
Ejemplo n.º 18
0
 public AnonymousObjectCreationExpression(MethodReference constructor, TypeReference type, InitializerExpression initializer, IEnumerable <Instruction> instructions)
 {
     base(instructions);
     this.set_Constructor(constructor);
     this.set_Type(type);
     this.set_Initializer(initializer);
     return;
 }
Ejemplo n.º 19
0
 public virtual void VisitInitializerExpression(InitializerExpression node)
 {
     Visit(node.Expression);
 }
		// Person person = new Person { Name = "John", Age = 20 };
		// 
		// ==
		// 
		// Person person = new Person();
		// person.Name = "John";
		// person.Age = 20;

		protected override bool TryMatchInternal(StatementCollection statements, int startIndex, out Statement result, out int replacedStatementsCount)
		{
			result = null;
			replacedStatementsCount = 0;

			ObjectCreationExpression objectCreation;
			Expression assignee;
			if (!TryGetObjectCreation(statements, startIndex, out objectCreation, out assignee))
			{
				return false;
			}

			ExpressionCollection inlinedExpressions = new ExpressionCollection();
			HashSet<string> visitedPropertyNames = new HashSet<string>();

			if (objectCreation.Initializer != null)
			{
				if (objectCreation.Initializer.InitializerType != InitializerType.ObjectInitializer)
				{
					return false;
				}

				foreach (var item in objectCreation.Initializer.Expressions)
				{
					string name = GetName((item as BinaryExpression).Left);
					visitedPropertyNames.Add(name);
				}
			}

			for (int i = startIndex + 1; i < statements.Count; i++)
			{
				Expression expression;
				if (!TryGetNextExpression(statements[i], out expression))
				{
					break;
				}

				BinaryExpression assignment = expression as BinaryExpression;
				if (!IsObjectPropertyOrFieldAssignment(assignment, assignee))
				{
					break;
				}

				Expression initializer = null;

				if (assignment.Left.CodeNodeType == CodeNodeType.PropertyReferenceExpression)
				{
					PropertyDefinition property = (assignment.Left as PropertyReferenceExpression).Property;
					if (!Visit(property.Name, visitedPropertyNames))
					{
						break;
					}
					initializer = new PropertyInitializerExpression(property, property.PropertyType,
						assignment.Right.UnderlyingSameMethodInstructions);
				}
				else if (assignment.Left.CodeNodeType == CodeNodeType.FieldReferenceExpression)
				{
					FieldDefinition field = (assignment.Left as FieldReferenceExpression).Field.Resolve();
					if (!Visit(field.Name, visitedPropertyNames))
					{
						break;
					}
					initializer = new FieldInitializerExpression(field, field.FieldType,
						assignment.Right.UnderlyingSameMethodInstructions);
				}

				var inlinedAssignment = new BinaryExpression(BinaryOperator.Assign,
					initializer, assignment.Right.Clone(), this.typeSystem, null);
				inlinedExpressions.Add(inlinedAssignment);
			}

			if (inlinedExpressions.Count == 0)
			{
				return false;
			}

			if (objectCreation.Initializer == null)
			{
				var initializer = new InitializerExpression(inlinedExpressions, InitializerType.ObjectInitializer);
				initializer.IsMultiLine = true;
				objectCreation.Initializer = initializer;
			}
			else
			{
				foreach (var item in inlinedExpressions)
				{
					objectCreation.Initializer.Expressions.Add(item);
				}
			}

			result = statements[startIndex];
			replacedStatementsCount = inlinedExpressions.Count + 1;
			return true;
		}
 public ObjectCreationExpression(MethodReference constructor, TypeReference type, InitializerExpression initializer, IEnumerable <Instruction> instructions)
     : base(instructions)
 {
     this.Constructor = constructor;
     this.Type        = type;
     this.Initializer = initializer;
     this.Arguments   = new ExpressionCollection();
 }
		// MyCollection list = new MyCollection() { 1, { 2, 2 } , 3 };
		// 
		// ==
		// 
		// MyCollection temp = new MyCollection();
		// temp.Add(1);
		// temp.Add(2, 2);
		// temp.Add(3);
		// MyCollection list = temp;

		protected override bool TryMatchInternal(StatementCollection statements, int startIndex, out Statement result, out int replacedStatementsCount)
		{
			result = null;
			replacedStatementsCount = 0;

			ObjectCreationExpression objectCreation;
			Expression assignee;
			if (!TryGetObjectCreation(statements, startIndex, out objectCreation, out assignee))
			{
				return false;
			}

			if (objectCreation.Initializer != null && objectCreation.Initializer.InitializerType != InitializerType.CollectionInitializer)
			{
				return false;
			}

			if (!ImplementsInterface(objectCreation.Type, "System.Collections.IEnumerable"))
			{
				return false;
			}

			ExpressionCollection addedExpressions = new ExpressionCollection();

			for (int i = startIndex + 1; i < statements.Count; i++)
			{
				Expression expression;
				if (!TryGetNextExpression(statements[i], out expression))
				{
					break;
				}

				if (expression.CodeNodeType != CodeNodeType.MethodInvocationExpression)
				{
					break;
				}
				MethodInvocationExpression methodInvocation = (expression as MethodInvocationExpression);
				MethodDefinition methodDefinition = methodInvocation.MethodExpression.MethodDefinition;

				if (!CompareTargets(assignee, methodInvocation.MethodExpression.Target))
				{
					break;
				}

				if (methodDefinition.Name != "Add")
				{
					break;
				}

				if (methodInvocation.Arguments.Count == 0)
				{
					break;
				}
				else if (methodInvocation.Arguments.Count == 1)
				{
					addedExpressions.Add(methodInvocation.Arguments[0].Clone());
				}
				else
				{
					ExpressionCollection currentArguments = new ExpressionCollection(
						methodInvocation.Arguments.Select(x => x.Clone()));

					BlockExpression blockExpression = new BlockExpression(currentArguments, null);
					addedExpressions.Add(blockExpression);
				}
			}

			if (addedExpressions.Count == 0)
			{
				return false;
			}

			if (objectCreation.Initializer == null)
			{
				var initializer = new InitializerExpression(addedExpressions, InitializerType.CollectionInitializer);
				initializer.IsMultiLine = true;
				objectCreation.Initializer = initializer;
			}
			else
			{
				foreach (var item in addedExpressions)
				{
					objectCreation.Initializer.Expressions.Add(item);
				}
			}

			result = statements[startIndex];
			replacedStatementsCount = addedExpressions.Count + 1;
			return true;
		}
 public AnonymousObjectCreationExpression(MethodReference constructor, TypeReference type, InitializerExpression initializer, IEnumerable <Instruction> instructions)
     : base(instructions)
 {
     this.Constructor = constructor;
     this.Type        = type;
     this.Initializer = initializer;
 }
 public override Telerik.JustDecompiler.Ast.Expressions.Expression Clone()
 {
     stackVariable8 = new InitializerExpression(this.get_Expression().Clone() as BlockExpression, this.get_InitializerType(), this.instructions);
     stackVariable8.set_IsMultiLine(this.get_IsMultiLine());
     return(stackVariable8);
 }
 public override Telerik.JustDecompiler.Ast.Expressions.Expression CloneExpressionOnly()
 {
     stackVariable7 = new InitializerExpression(this.get_Expression().Clone() as BlockExpression, this.get_InitializerType(), null);
     stackVariable7.set_IsMultiLine(this.get_IsMultiLine());
     return(stackVariable7);
 }