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