/// <summary>
        /// Creates a new <see cref="ConstructorLogicBodyCloner"/>.
        /// </summary>
        /// <param name="parent">Cloner that creates the method signature for the logic part of the source constructor.</param>
        /// <param name="source"></param>
        public ConstructorLogicBodyCloner(ConstructorLogicSignatureCloner parent, MultiplexedConstructor source)
            : base(parent.CloningContext, source)
        {
            Contract.Requires(parent != null);
            Contract.Requires(parent.CloningContext != null);
            Contract.Requires(parent.Source != null);
            Contract.Requires(parent.Source.Constructor != null);
            Contract.Requires(parent.Source.Constructor.Body != null);
            Contract.Requires(parent.Source.Constructor.Body.ThisParameter != null);
            Contract.Requires(source != null);
            Contract.Ensures(this.Parent != null);
            Contract.Ensures(this.SourceThisParameter != null);

            this.Parent = parent;
            this.SourceThisParameter = parent.Source.Constructor.Body.ThisParameter;
        }
예제 #2
0
        /// <summary>
        /// Gets cloners for the given source item.
        /// </summary>
        /// <param name="item">Item to get cloners for.</param>
        /// <returns>Cloners for the <paramref name="item"/>.</returns>
        private IReadOnlyCollection <ICloner <object, object> > InvokeForRootTypeConstructor(MethodDefinition item)
        {
            Contract.Requires(item != null);
            Contract.Requires(item.IsConstructor && !item.IsStatic && !item.HasParameters);
            Contract.Ensures(Contract.Result <IReadOnlyCollection <ICloner <object, object> > >() != null);

            var parent        = this.CloningContext.CilGraph.GetParentOf <TypeDefinition>(item);
            var parentCloners = this.ClonersBySource[parent];

            Contract.Assume(parentCloners != null);

            var cloners = new List <ICloner <object, object> >();

            foreach (var parentCloner in parentCloners.Cast <RootTypeCloner>())
            {
                // add one no-op cloner per target constructor
                cloners.AddRange(
                    from constructor in parentCloner.Target.Methods
                    where constructor.IsConstructor && !constructor.IsStatic
                    select NoOpCloner.Create(this.CloningContext, item, constructor));

                // add a single constructor logic signature cloner to generate a new method, if necessary
                var sourceMultiplexedConstructor = MultiplexedConstructor.Get(this.CloningContext, item);

                // only continue if we have construction items
                if (!sourceMultiplexedConstructor.HasConstructionItems)
                {
                    continue;
                }

                // add the constructor logic signature cloner
                var constructorLogicSignatureCloner =
                    new ConstructorLogicSignatureCloner(parentCloner, sourceMultiplexedConstructor);
                cloners.Add(constructorLogicSignatureCloner);
            }

            return(cloners);
        }
        /// <summary>
        /// Creates a new <see cref="ConstructorInitializationCloner"/>.
        /// </summary>
        /// <param name="parent">Cloner for the constructor method definition being cloned.</param>
        /// <param name="logicSignatureCloner">Cloner for the signature of the logic portion of the constructor, if any.</param>
        /// <param name="source">Cloning source.</param>
        /// <param name="target">Cloning target.</param>
        public ConstructorInitializationCloner(
            ICloner <object, MethodDefinition> parent,
            ConstructorLogicSignatureCloner logicSignatureCloner,
            MultiplexedConstructor source,
            MethodBody target)
            : base(parent.CloningContext, source)
        {
            Contract.Requires(parent != null);
            Contract.Requires(parent.CloningContext != null);
            Contract.Requires(parent.Source != null);
            Contract.Requires(source != null);
            Contract.Requires(source.Constructor != null);
            Contract.Requires(source.Constructor.Body != null);
            Contract.Requires(target != null);
            Contract.Ensures(this.Parent != null);
            Contract.Ensures(this.ExistingTarget != null);

            this.Parent = parent;
            this.SourceThisParameter  = source.Constructor.Body.ThisParameter;
            this.LogicSignatureCloner = logicSignatureCloner;
            this.ExistingTarget       = target;
            this.CountOfTargetVariablesBeforeCloning = this.ExistingTarget.Variables == null ? 0 : this.ExistingTarget.Variables.Count;
        }